以上是谷歌支付 Google Play In-app Billing 的服务器验证说明文档。
支付的时候,Android 客户端 通过调用 getBuyIntent() 方法获得以下 3个 参数:
- RESPONSE_CODE
- INAPP_PURCHASE_DATA
- INAPP_DATA_SIGNATURE
其中,INAPP_PURCHASE_DATA 是一段 json 字符串,包含订单的信息,具体内容如下:
有几个字段我们必须关注的:
developerPayload : 这个是客户端的透传参数,建议放置自身的交易流水号(自有服务器的订单号)
purchaseState :支付的结果, 0 (支付了), 1 (取消), 2 (退款)
productId :商品ID
orderId : 谷歌的订单ID (当处于沙箱环境的时候,没有这个字段)
以下是 PHP 服务端的实例:
<?php
function checkGooglePlayBilling() {
$inappPurchaseData = isset($_REQUEST['INAPP_PURCHASE_DATA']) ? $_REQUEST['INAPP_PURCHASE_DATA'] : null ;
$inappDataSignature =isset($_REQUEST['INAPP_DATA_SIGNATURE']) ? $_REQUEST['INAPP_DATA_SIGNATURE'] : null ;
$googlePublicKey = 'Google Play Developer Console 中此应用的许可密钥';
$publicKey = "-----BEGIN PUBLIC KEY-----". PHP_EOL .
chunk_split($google_public_key, 64, PHP_EOL) .
"-----END PUBLIC KEY-----";
$publicKeyHandle = openssl_get_publickey($publicKey);
$result = openssl_verify($inappPurchaseData, base64_decode($inappDataSignature), $publicKeyHandle, OPENSSL_ALGO_SHA1);
if (1 !== $result) {
retuan false;
}
$data = json_decode(inappPurchaseData, true);
if (json_last_error() !== JSON_ERROR_NONE) {
return false;
}
//判断订单号,订单情况,自行解决
if ($data['developerPayload'] != 'xxxx') {
return false;
}
//判断订单完成情况
if ($data['purchaseState'] != 0) {
return false;
}
return true;
}
进阶
当然,如果需要进一步的验证的话,可以通过 Google Play Developer API 来验证订单的真实情况。
以下是 Google Play Developer API 验证订单接口的文档:
Google通过Google Play Developer APIGoogle Play开发人员API提供收据验证,在API中这两个是需要注意的:Purchases.products:get和Purchases.subscriptions:get
Purchases.products:get:获取可用于验证非自动更新产品购买,其中Purchases.subscriptions:get用于验证和重新验证自动续订产品订阅。
要使用这些接口,您必须知道packageName,productId,purchaseToken,所有这些都可以在您购买时需要客户端传过来的。 您还需要一个access_token,您可以通过创建Google API服务帐户获得。
要开始使用服务帐户,请先访问Google Play Developer Console API访问设置页面,然后单击创建新项目按钮:
您现在应该看到一个新的链接项目和几个新的部分,在服务帐户部分,单击创建服务帐户按钮。
您将看到一个信息框,其中包含创建您的服务帐户的说明。 点击指向Google Developers Console的链接,并且会生成一个新的标签。
现在单击创建新客户端ID,从选项中选择服务帐户,然后单击创建客户端ID。
将下载一个JSON文件,这是您将用于交换access_token的JSON Web令牌,以便保持安全。
接下来,将tab切换回Google Play Developer控制台,然后在信息框中单击完成。 您应该在列表中看到您的新服务帐户。 点击服务帐户电子邮件旁边的授权访问。
接下来在该用户的“选择角色”下,选择“财务”,然后单击“添加用户”。
您现在已经设置了您的服务帐户,并具有执行收据验证的所有必要访问权限。 下一步是交换你的JWT一个access_token。
access_token在一个小时的交换后过期,因此需要一些服务器代码来处理这个问题,Google已经提供了许多语言的多个库来处理这个(列举并不详尽):
- Ruby: https://github.com/google/google-api-ruby-client
- Node.js: https://github.com/google/google-api-nodejs-client
- Java: https://github.com/google/google-api-java-client
- Python: https://github.com/google/google-api-python-client
我不会详细介绍,因为有很多关于如何使用这些库的文档,
下面是调用接口
https://www.googleapis.com/auth/androidpublisher 作为OAuth2,client_email从作为发行人的JWT和您可以从private_key获取的公钥和密码不存在将用于签名_key。
一旦你有access_token,你至少在下一个小时前,要按照上述段落中的相同过程请求一个新,上面的谷歌提供的client可以帮你自动完成。
要检查消耗品(非自动续订)购买的状态,请将http获取请求发送到:https://www.googleapis.com/androidpublisher/v2/applications/packageName(填包名)/purchases/products/productId(填谷歌商品id)/purchaseToken/purchaseTokenString(填客户端返回的那段json里的purchaseToken)?access_token=你的access_token
如果您获得了200个HTTP响应代码,则所有内容购买有效。 404将意味着您的令牌无效,因此购买最有可能是欺诈尝试。 401将意味着您的访问令牌无效,403将意味着您的服务帐户访问不足,请检查您是否已在Google Play开发者控制台中为访问帐户启用了财务报告权限,详见最后一张图。