Android:inApp购买收据验证google play

时间:2016-02-01 09:35:06

标签: android in-app-purchase android-pay

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

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

我正在尝试使用新推出的google play 收据验证。在Google Developer控制台中,我在权限中通过服务帐户制作了证书密钥。但我很困惑如何在从Google Play商店购买产品后使用收据验证。

任何人都可以帮助我如何进行InApp购买的收据验证

5 个答案:

答案 0 :(得分:158)

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

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

要使用任一端点,您必须知道packageNameproductIdpurchaseToken所有这些都可以在您购买时收到的有效负载中找到。您还需要access_token来创建Google API服务帐户。

要开始使用服务帐户,请先转到Google Play开发者控制台API access settings page,然后点击创建新项目按钮:

Create a new Google API Project

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

Create a new Service Account

您将看到一个信息框,其中包含创建服务帐户的说明。单击指向Google Developers Console的链接,将生成一个新选项卡。

Open the Google Developers Console

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

Create a new Client ID

将下载一个JSON文件,这是您将用于交换access_token的JSON Web令牌,以确保安全。

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

Grant access

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

Set the role to Finance

您现在已经设置了服务帐户,并且具有执行收据验证的所有必要访问权限。接下来是将您的JWT换成access_token。

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

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

一旦你有了access_token你就好了(至少在接下来的一个小时,你会想要按照上一段中的相同过程申请一个新的。)

要查看耗材(非自动续订)购买的状态,请向get

发送http 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,并注意startTimeMillisexpiryTimeMillis可能会有所变化,具体取决于订阅的持续时间。

快乐验证!

答案 1 :(得分:18)

马克的答案非常好。我只会补充说,Google Play Developer API Client Library for Java使您从服务器连接到Google Play服务器时更加简单。 该库自动处理刷新身份验证令牌,并提供类型安全的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();
...

答案 2 :(得分:5)

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

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

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

答案 3 :(得分:1)

我遇到了类似的问题,问题出在我们在Google Developer项目中所做的设置中。

请参阅create-play-service-credentials进行设置。使用创建应用内商品时使用的主要帐户。

确保删除上一个。

链接到Google Developer Project 您的Play开发者帐户需要链接到Google Developer Project。

1a。打开设置>开发者帐户菜单,然后选择API访问权限

API-access

1b。选择链接将您的Play帐户连接到Google Developer Project

choose-project-link

1c。同意条款和条件

agree-terms-conditions

2。创建服务帐户 接下来,我们需要创建一个服务帐户。这是通过Google API控制台完成的。

2a。选择创建服务帐户

create-service-account

2b。创建服务帐户密钥凭据

service-account

2c。输入服务帐户的详细信息

enter-service-account-details

2d。下载您的JSON凭证: json-credentials

3。授予访问权限

3a。在Play控制台中,选择新创建的服务帐户上的“授予访问权限”

grant-access

3b。授予以下权限:

apply-permissions

此后等待48小时,以使Google传播API的所有访问权限。

答案 4 :(得分:-1)

这个答案很好。遵循指示时,我们遇到的另一个问题是该服务帐户未显示在Google Play控制台中。我们最终找到了该解决方案来提供帮助:Service account doesn't show up in Google Console after creation

基本上,转到Google API控制台上的IAM并添加新的服务帐户,该帐户将显示在Google Play控制台上。 screenshot