谷歌支付 Google Play In-app Billing 服务端验证的2种方法

谷歌支付文档

以上是谷歌支付 Google Play In-app Billing 的服务器验证说明文档。

支付的时候,Android 客户端 通过调用 getBuyIntent() 方法获得以下 3个 参数:

  1. RESPONSE_CODE
  2. INAPP_PURCHASE_DATA
  3. INAPP_DATA_SIGNATURE

1.png

其中,INAPP_PURCHASE_DATA 是一段 json 字符串,包含订单的信息,具体内容如下:
2.png

有几个字段我们必须关注的:

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 验证订单接口的文档:

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

1.jpg

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

2.jpg

您将看到一个信息框,其中包含创建您的服务帐户的说明。 点击指向Google Developers Console的链接,并且会生成一个新的标签。
3.jpg

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

4.jpg

将下载一个JSON文件,这是您将用于交换access_token的JSON Web令牌,以便保持安全。

接下来,将tab切换回Google Play Developer控制台,然后在信息框中单击完成。 您应该在列表中看到您的新服务帐户。 点击服务帐户电子邮件旁边的授权访问。
5.jpg

接下来在该用户的“选择角色”下,选择“财务”,然后单击“添加用户”。
6.jpg

您现在已经设置了您的服务帐户,并具有执行收据验证的所有必要访问权限。 下一步是交换你的JWT一个access_token。

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

我不会详细介绍,因为有很多关于如何使用这些库的文档,
下面是调用接口
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开发者控制台中为访问帐户启用了财务报告权限,详见最后一张图。

添加新评论