Android:inApp购买收据validation谷歌播放

我正在使用谷歌钱包为我的支付网关,在购买谷歌产品后给我一个下面的答复

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

我正在尝试使用Google Play最近推出的收据validationfunction。在Google Developer Console中,我通过授权中的服务帐户创build了证书密钥 。 但从Google Play商店购买产品后,我很困惑如何使用收据validationfunction。

那么任何人都可以请帮助我如何做InApp购买的收据validation

Google通过Google Play开发者API提供收据validation,在API中有两个您最感兴趣的端点: Purchases.products:get和Purchases.subscriptions:get 。

Purchases.products: get可用于validation非自动续订产品购买,其中Purchases.subscriptions: get用于validation和重新validation自动续订产品订阅。

要使用任packageName ,您必须知道packageNameproductIdpurchaseToken所有这些都可以在购买时收到的有效负载中find。 您还需要创build一个可通过创buildGoogle API服务帐户获得的access_token

要开始使用服务帐户,请先进入Google Play开发者控制台API访问设置页面 ,然后点击创build新项目button:

创建一个新的Google API项目

您现在应该看到一个新的链接项目和一些新的部分,在服务帐户部分,点击创build服务帐户button。

创建一个新的服务帐户

您将看到一个信息框,提供创build服务帐户的说明。 点击Google Developers Console的链接,新选项卡将生成。

打开Goog​​le Developers Console

现在点击创build新的客户端ID,从选项中select服务帐户,然后点击创build客户端ID。

创建一个新的客户端ID

一个JSON文件将会下载,这是你用来交换access_token JSON Web Token,所以要保证它的安全。

接下来,将选项卡切换回Google Play Developer Console,然后在信息框中单击完成。 您应该在列表中看到您的新服务帐户。 点击服务帐户电子邮件旁边的授予访问权限。

授予访问权限

接下来,在为此用户select一个angular色下,select财务,然后点击添加用户。

将角色设置为财务

您现在已经设置了您的服务帐户,并拥有执行收据validation的所有必要权限。 接下来是交换您的JWT的access_token。

access_token在交换1小时后过期,所以需要一些服务器代码来处理这个问题,Google提供了多种语言的库来处理这个问题(列表不是详尽的):

  • Ruby: https : //github.com/google/google-api-ruby-client
  • Node.js: https : //github.com/google/google-api-nodejs-client
  • Java: https : //github.com/google/google-api-java-client
  • Python: https : //github.com/google/google-api-python-client

我不会详细讨论,因为有大量关于如何使用这些库的文档,但是我会提及您希望使用https://www.googleapis.com/auth/androidpublisher作为OAuth2作用域, client_email来自作为issuer的JWT以及您可以从private_key和密码notasecret获得的notasecret将用于signing_key

一旦你有了access_token你就可以走了(至less在下一个小时之后,你会希望按照上述段落中的相同过程要求一个新的)。

要检查消费品(非自动续订)购买的状态,请将http请求发送到: https://www.googleapis.com/androidpublisher/v2/applications/com.example.app/purchases/products/exampleSku/tokens/rojeslcdyyiapnqcynkjyyjh?access_token=your_access_tokenhttps://www.googleapis.com/androidpublisher/v2/applications/com.example.app/purchases/products/exampleSku/tokens/rojeslcdyyiapnqcynkjyyjh?access_token=your_access_token

如果你得到一个200的http响应代码,一切都按计划进行,你的购买是有效的。 404将意味着你的代币是无效的,所以购买很可能是一个欺诈尝试。 401表示您的访问令牌无效,403表示您的服务帐号访问权限不足,请检查您是否已在Google Play开发者控制台中为访问帐号启用了金融function。

200的响应看起来类似于这个:

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

有关每个媒体资源的说明,请参阅https://developers.google.com/android-publisher/api-ref/purchases/products

订阅是相似的,但是端点看起来像这样:

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

答案应该包含这些属性:

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

有关房产描述,请参阅https://developers.google.com/android-publisher/api-ref/purchases/subscriptions ,并注意startTimeMillisexpiryTimeMillis将根据订阅的持续时间进行更改。

快乐validation!

马克的回答非常好。 我只补充说,从您的服务器连接到Google Play服务器时, 用于Java的Google Play开发人员API客户端库使其更加简单。 库自动处理刷新authentication令牌,并提供一个types安全的API,所以你不必乱七八糟的URL。

以下是您如何设置Publisher单身人士:

 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(); 

以下代码查询产品购买:

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

您可以同样查询订阅:

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