Google通过Google Play开发者API提供收据验证,该API中有两个您最感兴趣的端点:Purchases.products:get和Purchases.subscriptions:get。
Purchases.products: get
可用于验证非自动更新产品的购买,Purchases.subscriptions: get
用于验证和重新验证自动更新产品的订阅。
要使用任意端点必须知道packageName
,productId
,purchaseToken
所有的这些都可以在你购买收到的有效载荷中。您还需要一个access_token
可通过创建Google API服务帐户获得的。
要开始使用服务帐户,请首先转到Google Play开发者控制台API访问设置页面,然后点击创建新项目按钮:
现在,您应该看到一个新的链接项目和几个新的部分,在“服务帐户”部分中,单击“创建服务帐户”按钮。
系统将显示一个信息框,其中包含创建服务帐户的说明。点击指向Google Developers Console的链接,将产生一个新标签。
现在,单击“创建新的客户端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中的用作issuer
and以及从private_key
and可以获取的公钥。密码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
会受到取决于订阅的持续时间而改变。
验证愉快!