Android:inApp购买收据验证Google Play

qfe3c7zg  于 2022-12-09  发布在  Android
关注(0)|答案(5)|浏览(310)

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

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

我正在尝试使用Google Play新引入的收据验证。在Google开发者控制台中,我在权限中按服务帐户制作了证书密钥。但我对如何在从Google Play商店购买产品后使用收据验证感到困惑。
因此,有人能帮助我如何进行InApp采购的收据验证吗?

n9vozmp4

n9vozmp41#

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访问设置页面,然后单击创建新项目按钮:

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

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

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

将下载一个JSON文件,这是您的JSON Web令牌,您将使用它来交换access_token,因此请确保其安全。
接下来,切换标签回到Google Play开发者控制台,点击信息框中的完成。你应该会在列表中看到你的新服务帐户。点击服务帐户电子邮件旁边的授予访问权限。
x1c4d 1x指令集
接下来,在“Choose a role for this user(为此用户选择角色)”下,选择“Finance(财务)”,然后单击“Add user(添加用户)”。

现在,您已经设置了服务帐户,它具有执行接收验证所需的所有访问权限。
access_token在交换一小时后过期,因此需要一些服务器代码来处理此问题,Google提供了多种语言的库来处理此问题(列表不详尽):

我不会详细介绍,因为有大量文档介绍如何使用这些库,但我会提到您希望使用https://www.googleapis.com/auth/androidpublisher作为OAuth2作用域,使用JWT中的client_email作为issuer,并使用可以从private_key获得的公钥和密码短语notasecret作为signing_key
一旦你有了access_token,你就可以开始了(至少在接下来的一个小时里,你会想按照上面段落中的相同过程请求一个新的)。
要检查耗材(非自动续订)购买的状态,请向以下地址发出http 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以了解属性说明,请注意,startTimeMillisexpiryTimeMillis可能会根据订阅的持续时间进行更改。
验证愉快!

vyu0f0g1

vyu0f0g12#

Marc的回答非常好。我只想补充一点,Google Play Developer API Client Library for Java使得从你的服务器连接到Google Play服务器变得更加简单。这个库会自动处理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();
...
ckx4rj1h

ckx4rj1h3#

我遇到了一个类似的问题,问题是在设置我们做的谷歌开发者项目。
请参阅create-play-service-credentials了解设置。使用您创建应用内产品时使用的同一主帐户。
确保删除前一个。
链接到Google开发者项目您的Play开发者帐户需要链接到Google开发者项目。

1a.打开“设置”〉“开发者帐户”菜单并选择“API访问”

1b.选择“链接”将您的Play帐户连接到Google开发者项目

1c.同意条款和条件

2.创建服务帐户接下来,我们需要创建一个服务帐户。这是从Google API控制台完成的。
2a.选择“创建服务帐户”

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

x1c4d 1x指令集

2c.输入服务帐户的详细信息-授予角色访问权限有一个“可选”步骤。请确保将访问权限授予当前用户角色。

2d.下载JSON凭证:

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

3b.授予下列权限:


指令集
在此之后,等待48小时,以允许谷歌传播API的所有访问权限。

jm81lzqq

jm81lzqq4#

@marc-greenstock提供了一个很好的答案,但是,使用Google Play Android Developer API进行收据验证有一个非常重要的问题。
如果您在使用此API时遇到任何问题,并且您在授予权限或链接到服务帐户之前添加了应用内产品,您需要打开“应用内产品”并执行一些更新。例如,您可以编辑产品描述并保存。您应该立即获得权限。
我花了几个小时想我做错了什么...

eit6fx6z

eit6fx6z5#

这个答案非常好。我们在按照指示操作时遇到的另一个问题是服务帐户没有显示在Google Play控制台中。我们最终找到了以下解决方案:Service account doesn't show up in Google Console after creation
基本上,转到Google API控制台上的IAM并添加新的服务帐户,然后它将显示在Google Play控制台上。screenshot

相关问题