Android:inApp购买收据验证Google Play


92

购买产品google后,我将Google钱包用于我的付款网关,因此得到以下答复

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

我正在尝试利用Google刚推出的收据验证。在Google Developer Console中,我通过许可中的服务帐户制作了证书密钥。但是,我很困惑从Google Play商店购买产品后如何利用收据验证。

所以,任何人都可以请帮我该怎么办收货验证InApp采购。


您好Binil,您完成订购订阅了吗?
Anshul Tyagi

其管理产品@Anshul Tyag
Binil Surendran,

@BinilSurendran ..我的问题与您的问题不同,但我需要知道用于应用内购买的电子邮件ID。您能帮我获取该电子邮件吗,因为我需要在我的应用程序中提供它作为进一步参考
Pallavi 16-10-19

@Pallavi。抱歉,我不知道要获取买家的电子邮件ID。由于购买后Google给出的回复没有email_id
Binil Surendran

Answers:


216

Google通过Google Play开发者API提供收据验证,该API中有两个您最感兴趣的端点:Purchases.products:getPurchases.subscriptions:get

Purchases.products: get可用于验证非自动更新产品的购买,Purchases.subscriptions: get用于验证和重新验证自动更新产品的订阅。

要使用任意端点必须知道packageNameproductIdpurchaseToken所有的这些都可以在你购买收到的有效载荷中。您还需要一个access_token可通过创建Google API服务帐户获得的。

要开始使用服务帐户,请首先转到Google Play开发者控制台API访问设置页面,然后点击创建新项目按钮:

创建一个新的Google API项目

现在,您应该看到一个新的链接项目和几个新的部分,在“服务帐户”部分中,单击“创建服务帐户”按钮。

创建一个新的服务帐户

系统将显示一个信息框,其中包含创建服务帐户的说明。点击指向Google Developers Console的链接,将产生一个新标签。

打开Goog​​le Developers Console

现在,单击“创建新的客户端ID”,从选项中选择“服务帐户”,然后单击“创建客户端ID”。

创建一个新的客户端ID

将会下载一个JSON文件,这是您用来交换JSON Web令牌的信息,access_token因此请确保其安全。

接下来,将标签页切换回Google Play开发者控制台,然后在信息框中单击“完成”。您应该在列表中看到您的新服务帐户。单击服务帐户电子邮件旁边的授予访问权限。

授予访问权限

接下来,在“为此用户选择角色”下,选择“财务”,然后单击“添加用户”。

设置角色为财务

现在,您已经设置了服务帐户,并且该帐户具有执行收据验证所需的所有必要权限。下一步是将您的JWT交换为access_token。

access_token期满后,交换一小时,你因此需要一些服务器代码来处理这和谷歌已经提供了一些图书馆在许多语言来处理这个(名单并不详尽):

我不会详细介绍,因为有很多有关如何使用这些库的文档,但是我会提到您想https://www.googleapis.com/auth/androidpublisher将OAuth2范围用作OAuth2范围,client_email将JWT中的用作issuerand以及从private_keyand可以获取的公钥。密码notasecret将用于signing_key

一旦有了,access_token您就可以开始工作了(至少在接下来的一个小时内,您需要按照上一段中的相同过程来请求一个新的)。

要检查耗材(非自动更新)购买的状态,请发出httpget请求以: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开发者控制台中为访问帐户启用了财务功能。

来自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会受到取决于订阅的持续时间而改变。

验证愉快!


我在开发人员控制台中添加了一个新用户,并从控制台获得了JSON证书。能否请您帮助我如何使用下载的文件@Marc Greenstock进行收据验证
Binil Surendran

@BinilS您将需要更加具体,要使用哪种服务器端语言编写代码?
Marc Greenstock

我在服务器端@Marc Greenstock中使用Java
Binil Surendran

3
这是我第一次在搜索的两天内看到详细的指南来实施服务器付款验证。竖起大拇指。是否可以随时使用服务器代码?我发现在任何地方都找不到这样的东西很奇怪
匿名

2
@MarcGreenstock感谢您的详细回答。
Lavakush

28

马克的答案很好。我只会补充说,当您的服务器连接到Google Play服务器时,适用于JavaGoogle Play开发者API客户端库使它变得更加简单。该库会自动处理auth令牌的刷新,并且还提供了类型安全的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();
...

这是Java服务器上的代码,还是在调用任意服务器之前在Android上执行的代码?
用户

2
@jeshurun感谢您的代码。给其他读者APP_NAME = APP_PACKAGE_NAME
暴雪

1
那Python呢?
Babken Vardanyan

1
谢谢!对我而言,我不再getClass().getResourceAsStream(...使用new FileInputStream(...
安东尼奥·阿尔梅达

谢谢。很有用。但是,我还需要添加: credential.refreshToken();在获取证书和发布者之间。
grooble

5

@ marc-greenstock提供了一个很好的答案,但是,使用Google Play Android Developer API进行收据验证非常重要。

如果您在使用此API时遇到任何问题,并且授予权限或链接到服务帐户之前添加了应用内产品,则需要打开“应用内产品”并执行一些更新。例如,您可以编辑产品说明并保存。您应该立即获得许可。

我花了几个小时思考我做错了什么...


2

这个答案很好。遵循指示时,我们遇到的另一个问题是该服务帐户未显示在Google Play控制台中。我们最终找到了该解决方案来提供帮助:创建后,服务帐户未显示在Google控制台中

基本上,请在Google API控制台上转到IAM并添加新的服务帐户,然后该帐户将显示在Google Play控制台上。 屏幕截图


您可以在此处添加说明吗?还有一次,如果链接被撤消,您的答案将无效
Mathews Sunny Sunny

1
添加的帐户应该扮演什么角色?
阿迪
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.