我正在使用谷歌钱包作为我的支付网关,购买产品谷歌后给我一个以下的回复
{
"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
购买的收据验证。
答案 0 :(得分:158)
Google通过Google Play Developer API提供收据验证,API中有两个您最感兴趣的端点:Purchases.products: get和Purchases.subscriptions: get。
Purchases.products: get
可用于验证非自动续订产品购买,其中Purchases.subscriptions: get
用于验证和重新验证自动续订产品订阅。
要使用任一端点,您必须知道packageName
,productId
,purchaseToken
所有这些都可以在您购买时收到的有效负载中找到。您还需要access_token
来创建Google API服务帐户。
要开始使用服务帐户,请先转到Google Play开发者控制台API access settings page,然后点击创建新项目按钮:
您现在应该会看到一个新的链接项目和一些新的部分,在“服务帐户”部分中,单击“创建服务帐户”按钮。
您将看到一个信息框,其中包含创建服务帐户的说明。单击指向Google Developers Console的链接,将生成一个新选项卡。
现在单击“创建新客户端ID”,从选项中选择“服务帐户”,然后单击“创建客户端ID”。
将下载一个JSON文件,这是您将用于交换access_token
的JSON Web令牌,以确保安全。
接下来,将标签切换回Google Play开发者控制台,然后在信息框中点击完成。您应该在列表中看到新的服务帐户。单击服务帐户电子邮件旁边的授予访问权限。
在“为此用户选择角色”下,选择“财务”,然后单击“添加用户”。
您现在已经设置了服务帐户,并且具有执行收据验证的所有必要访问权限。接下来是将您的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
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
可能会有所变化,具体取决于订阅的持续时间。
快乐验证!
答案 1 :(得分:18)
以下是设置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访问权限
1b。选择链接将您的Play帐户连接到Google Developer Project
1c。同意条款和条件
2。创建服务帐户 接下来,我们需要创建一个服务帐户。这是通过Google API控制台完成的。
2a。选择创建服务帐户
2b。创建服务帐户密钥凭据
2c。输入服务帐户的详细信息
3。授予访问权限
3a。在Play控制台中,选择新创建的服务帐户上的“授予访问权限”
3b。授予以下权限:
此后等待48小时,以使Google传播API的所有访问权限。
答案 4 :(得分:-1)
这个答案很好。遵循指示时,我们遇到的另一个问题是该服务帐户未显示在Google Play控制台中。我们最终找到了该解决方案来提供帮助:Service account doesn't show up in Google Console after creation
基本上,转到Google API控制台上的IAM并添加新的服务帐户,该帐户将显示在Google Play控制台上。 screenshot