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
,您必须知道packageName
, productId
, purchaseToken
所有这些都可以在购买时收到的有效负载中find。 您还需要创build一个可通过创buildGoogle API服务帐户获得的access_token
。
要开始使用服务帐户,请先进入Google Play开发者控制台API访问设置页面 ,然后点击创build新项目button:
您现在应该看到一个新的链接项目和一些新的部分,在服务帐户部分,点击创build服务帐户button。
您将看到一个信息框,提供创build服务帐户的说明。 点击Google Developers Console的链接,新选项卡将生成。
现在点击创build新的客户端ID,从选项中select服务帐户,然后点击创build客户端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_token
: https://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 ,并注意startTimeMillis
和expiryTimeMillis
将根据订阅的持续时间进行更改。
快乐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(); ...