Android: xác thực biên nhận mua hàng trong ứng dụng google play


92

Tôi đang sử dụng ví google cho cổng thanh toán của mình, sau khi mua sản phẩm, google cho tôi một phản hồi bên dưới rằng

{ 
 "orderId":"12999763169054705758.1371079406387615", 
 "packageName":"com.example.app",
 "productId":"exampleSku",
 "purchaseTime":1345678900000,
 "purchaseState":0,
 "developerPayload":"bGoa+V7g/yqDXvKRqq+JTFn4uQZbPiQJo4pf9RzJ",
 "purchaseToken":"rojeslcdyyiapnqcynkjyyjh"
 }

Tôi đang cố gắng sử dụng Xác thực biên nhận mà google play mới được giới thiệu. Trong Bảng điều khiển dành cho nhà phát triển của Google, tôi đã tạo khóa chứng chỉ bằng Tài khoản dịch vụ trong Quyền. Nhưng tôi bối rối về cách sử dụng Xác thực biên nhận sau khi mua Sản phẩm từ Cửa hàng Google Play.

Vì vậy, bất cứ ai can xin vui lòng giúp tôi làm thế nào để thực hiện xác nhận hóa đơn của InAppmua hàng.


Xin chào Binil, bạn đã hoàn tất việc mua đăng ký chưa?
Anshul Tyagi

sản phẩm của mình quản lý @Anshul Tyag
Binil Surendran

@BinilSurendran .. Câu hỏi của tôi khác với câu hỏi của bạn, nhưng tôi cần biết id email đã được sử dụng để mua hàng trong ứng dụng. bạn có thể xin vui lòng giúp đỡ làm thế nào tôi có thể nhận được email đó, khi tôi cần nó để tham khảo thêm trong ứng dụng của tôi
Pallavi

@Pallavi. xin lỗi, tôi không có ý tưởng để lấy id email của người mua. như các phản ứng do google sau khi mua không có EMAIL_ID
Binil Surendran

Câu trả lời:


216

Google cung cấp xác thực biên nhận thông qua API nhà phát triển trên Google Play , trong API là hai điểm cuối mà bạn sẽ quan tâm nhất: Purchases.products: getPurchases.subscriptions: lấy .

Purchases.products: getcó thể được sử dụng để xác minh giao dịch mua sản phẩm không tự động gia hạn, nơi Purchases.subscriptions: getdành cho xác minh và xác minh lại đăng ký sản phẩm tự động gia hạn.

Để sử dụng một trong hai thiết bị đầu cuối bạn phải biết packageName, productId, purchaseTokentất cả trong số này có thể được tìm thấy trong payload bạn nhận được trên mua. Bạn cũng cần một access_tokentài khoản mà bạn có thể nhận được bằng cách tạo tài khoản dịch vụ API của Google.

Để bắt đầu với tài khoản dịch vụ, trước tiên hãy truy cập trang cài đặt quyền truy cập API Bảng điều khiển dành cho nhà phát triển trên Google play và nhấp vào nút Tạo dự án mới:

Tạo một Dự án API Google mới

Bây giờ bạn sẽ thấy một Dự án được liên kết mới và một vài phần mới, trong phần Tài khoản dịch vụ, hãy nhấp vào nút Tạo tài khoản dịch vụ.

Tạo tài khoản dịch vụ mới

Bạn sẽ thấy một hộp thông tin với hướng dẫn để tạo tài khoản dịch vụ của bạn. Nhấp vào liên kết đến Bảng điều khiển dành cho nhà phát triển của Google và một tab mới sẽ xuất hiện.

Mở Bảng điều khiển dành cho nhà phát triển của Google

Bây giờ hãy nhấp vào Tạo ID khách hàng mới, chọn Tài khoản dịch vụ từ các tùy chọn và nhấp vào Tạo ID khách hàng.

Tạo ID khách hàng mới

Một tệp JSON sẽ tải xuống, đây là Mã thông báo web JSON của bạn mà bạn sẽ sử dụng để đổi lấy access_tokenvì vậy hãy giữ an toàn.

Tiếp theo, chuyển các tab trở lại Bảng điều khiển dành cho nhà phát triển trên Google play và nhấp vào Xong trong hộp thông tin. Bạn sẽ thấy tài khoản dịch vụ mới của mình trong danh sách. Nhấp vào Cấp quyền truy cập bên cạnh email tài khoản dịch vụ.

Cấp quyền truy cập

Tiếp theo trong phần Chọn vai trò cho người dùng này, chọn Tài chính và nhấp vào Thêm người dùng.

Đặt vai trò thành Tài chính

Bây giờ bạn đã thiết lập tài khoản dịch vụ của mình và nó có tất cả các quyền truy cập cần thiết để thực hiện xác nhận biên nhận. Tiếp theo là trao đổi JWT của bạn để lấy access_token.

Các access_tokenhết hạn sau một giờ trao đổi bạn rất cần một số mã máy chủ để xử lý này và Google đã cung cấp một số thư viện trong nhiều ngôn ngữ để xử lý này (danh sách không đầy đủ):

Tôi sẽ không đi vào chi tiết vì có rất nhiều tài liệu về cách sử dụng các thư viện này, nhưng tôi sẽ đề cập đến việc bạn muốn sử dụng https://www.googleapis.com/auth/androidpublisherlàm phạm vi OAuth2, client_emailtừ JWT làm khóa issuervà khóa công khai bạn có thể lấy từ private_keyvà cụm mật khẩu notasecretsẽ được sử dụng cho signing_key.

Một khi bạn đã sẵn access_tokensàng để đi (ít nhất là trong giờ tới, lúc đó bạn sẽ muốn yêu cầu một cái mới theo quy trình tương tự trong đoạn trên).

Để kiểm tra trạng thái của giao dịch mua có thể tiêu thụ được (không tự động gia hạn), hãy thực hiện getyêu cầu http tới:https://www.googleapis.com/androidpublisher/v2/applications/com.example.app/purchases/products/exampleSku/tokens/rojeslcdyyiapnqcynkjyyjh?access_token=your_access_token

Nếu bạn nhận được mã phản hồi 200 http, mọi thứ đã diễn ra như kế hoạch và giao dịch mua của bạn hợp lệ. 404 có nghĩa là mã thông báo của bạn không hợp lệ, vì vậy giao dịch mua rất có thể là một nỗ lực gian lận. 401 có nghĩa là mã thông báo truy cập của bạn không hợp lệ và 403 có nghĩa là tài khoản dịch vụ của bạn không có đủ quyền truy cập, hãy kiểm tra xem bạn đã bật Tài chính cho tài khoản truy cập trong Bảng điều khiển dành cho nhà phát triển trên Google Play chưa.

Phản hồi từ 200 sẽ giống như sau:

{
  "kind": "androidpublisher#productPurchase",
  "purchaseTimeMillis": long,
  "purchaseState": integer,
  "consumptionState": integer,
  "developerPayload": string
}

Để biết giải thích về từng thuộc tính, hãy xem https://developers.google.com/android-publisher/api-ref/purchases/products .

Các đăng ký tương tự nhau tuy nhiên điểm cuối trông như thế này:

https://www.googleapis.com/androidpublisher/v2/applications/packageName/purchases/subscriptions/subscriptionId/tokens/token?access_token=you_access_token

Và phản hồi phải chứa các thuộc tính sau:

{
  "kind": "androidpublisher#subscriptionPurchase",
  "startTimeMillis": long,
  "expiryTimeMillis": long,
  "autoRenewing": boolean
}

Xem https://developers.google.com/android-publisher/api-ref/purchases/subscriptions để biết mô tả sản phẩm và lưu ý rằng điều đó startTimeMillisexpiryTimeMillissẽ có thể thay đổi tùy thuộc vào thời gian đăng ký.

Chúc bạn xác thực vui vẻ!


Tôi thêm một người dùng mới trong bảng điều khiển dành cho nhà phát triển và tôi đã nhận được chứng chỉ JSON nhận được từ bảng điều khiển. Bạn có thể vui lòng giúp tôi cách xác thực biên nhận với tệp đã tải xuống @Marc Greenstock
Binil Surendran

@BinilS Bạn sẽ cần phải cụ thể hơn, bạn sẽ viết mã của mình bằng ngôn ngữ phía máy chủ nào?
Marc Greenstock

đang sử dụng java trong máy chủ bên @Marc Greenstock
Binil Surendran

3
Đây là lần đầu tiên tôi thấy hướng dẫn chi tiết để triển khai xác thực thanh toán máy chủ trong 2 ngày tìm kiếm. Thích. Có mã máy chủ sẵn sàng sử dụng ở đâu đó không? Tôi thấy nó rất lạ mà tôi không thể tìm thấy một cái gì đó giống như bất cứ nơi nào
Anonymous

2
@MarcGreenstock Cảm ơn câu trả lời chi tiết.
Lavakush

28

Câu trả lời của Marc là tuyệt vời. Tôi sẽ chỉ nói thêm rằng Thư viện ứng dụng khách API dành cho nhà phát triển Google Play dành cho Java giúp việc kết nối từ máy chủ của bạn với máy chủ Google Play trở nên đơn giản hơn nhiều. Thư viện tự động xử lý làm mới mã thông báo xác thực và cũng cung cấp một API an toàn kiểu chữ để bạn không phải loay hoay với các URL.

Đây là cách bạn thiết lập Publishersingleton:

httpTransport = GoogleNetHttpTransport.newTrustedTransport();
jsonFactory = JacksonFactory.getDefaultInstance();      
credential = GoogleCredential.fromStream(getClass().getResourceAsStream("/path/to/your/key.json")).createScoped(Collections.singleton(AndroidPublisherScopes.ANDROIDPUBLISHER));
publisher = new AndroidPublisher.Builder(httpTransport, jsonFactory, credential).setApplicationName(APP_NAME).build();

Đoạn mã sau truy vấn mua sản phẩm:

ProductPurchase product = publisher.purchases().products().get(PACKAGE_NAME, sku, token).execute();
Integer purchaseState = product.getPurchaseState();
product.getPurchaseTimeMillis();
product.getConsumptionState();
product.getDeveloperPayload();

Tương tự, bạn có thể truy vấn các đăng ký:

SubscriptionPurchase sub = publisher.purchases().subscriptions().get(PACKAGE_NAME, sku, token).execute();
sub.getAutoRenewing();
sub.getCancelReason();
...

Đây là mã trên máy chủ Java hay được thực thi trên Android trước khi gọi đến một máy chủ tùy ý?
người dùng

2
@jeshurun ​​Cảm ơn vì mã. Gửi các độc giả khác APP_NAME = APP_PACKAGE_NAME.
bão tuyết

1
Còn Python thì sao?
Babken Vardanyan,

1
Cảm ơn bạn! Đối với tôi thay vì getClass().getResourceAsStream(...tôi đã sử dụng new FileInputStream(....
António Almeida

Cảm ơn. Rất hữu dụng. Tuy nhiên, tôi cũng cần phải nói thêm: credential.refreshToken();giữa việc lấy thông tin xác thực và nhà xuất bản.
Grooble

5

@ marc-greenstock đã cung cấp một câu trả lời tuyệt vời, tuy nhiên, có một điều rất quan trọng về xác thực biên nhận bằng API nhà phát triển Android trên Google Play.

Nếu bạn gặp bất kỳ sự cố nào với việc sử dụng API này và bạn đã thêm sản phẩm trong ứng dụng của mình TRƯỚC KHI cấp quyền hoặc liên kết với tài khoản dịch vụ của mình, bạn cần mở "Sản phẩm trong ứng dụng" và thực hiện một số cập nhật. Ví dụ, bạn có thể chỉnh sửa mô tả sản phẩm của mình và lưu lại. Bạn sẽ ngay lập tức nhận được sự cho phép.

Tôi đã dành vài giờ để nghĩ xem mình đã làm gì sai ...


2

Câu trả lời này là tuyệt vời. Một vấn đề nữa mà chúng tôi gặp phải khi làm theo hướng dẫn là tài khoản dịch vụ không hiển thị trong Google Play Console. Chúng tôi đã tìm ra giải pháp này để trợ giúp: Tài khoản dịch vụ không hiển thị trong Google Console sau khi tạo

Về cơ bản, hãy truy cập IAM trên Google API Console và thêm tài khoản dịch vụ mới, sau đó nó sẽ hiển thị trên Google Play Console. ảnh chụp màn hình


Bạn có thể thêm mô tả ở đây. Khác một lần nếu liên kết bị thu hồi, câu trả lời của bạn sẽ không hợp lệ
Mathews Sunny

1
Vai trò của tài khoản được thêm vào là gì?
Adi
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.