Android : inApp 购买收据验证 google 播放

Android : inApp purchase receipt validation google play

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

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

我正在尝试使用 Receipt Validation google 新玩的 introduced.In Google 我制作的开发者控制台 certificate key by Service Account in the Permission.但是我很困惑如何在从 Google Play 商店购买产品后使用收据验证。

所以谁能帮我如何进行InApp购买的收据验证

Google 通过 Google Play Developer API, within the API are two endpoints you will be most interested in: Purchases.products: get and Purchases.subscriptions: get.

提供收据验证

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

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

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

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

您将看到一个信息框,其中包含创建服务帐户的说明。单击 link 到 Google 开发人员控制台,将生成一个新选项卡。

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

将下载一个 JSON 文件,这是您的 JSON Web 令牌,您将使用它来交换 access_token,因此请妥善保管。

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

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

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

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

我不会详细介绍,因为有很多关于如何使用这些库的文档,但我会提到您想使用 https://www.googleapis.com/auth/androidpublisher 作为 OAuth2 范围, client_email从 JWT 作为 issuer 和 public 密钥,您可以从 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 Developer 中为访问帐户启用 Finance控制台。

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 将根据订阅的持续时间进行更改。

验证愉快!

Marc 的回答非常好。我只会补充一点,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();
...

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

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

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

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

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

我遇到了类似的问题,问题出在我们在 google 开发者项目中所做的设置中。

参考create-play-service-credentials设置。使用与您创建应用内商品相同的主帐户。

确保删除上一个。

Link 到 Google 开发者项目 您的 Play 开发者帐户需要链接到 Google 开发者项目。

1a。打开设置 > 开发者帐户菜单和 select API 访问

1b。 Select Link 将您的 Play 帐户连接到 Google 开发者项目

1c。同意条款和条件

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

2a。 Select 创建服务帐户

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

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

2d。下载您的 JSON 凭证:

3。授予访问权限

3a。在 Play 管理中心,select 授予对新创建的服务帐户的访问权限

3b。授予以下权限:

在此之后等待 48 小时,让 Google 传播 API 秒的所有访问权限。