PHP 验证google play遇坑小记

说明

在后端验证 google play 的订单真实性的时候,刚开始接触到 google play console的相关配置时,总是会报一些类似401403的错误,在代码层面没有找到问题时,及有可能是相关配置出现了问题,尤其是403的错误,接下来就说说我调试 google play 时遇到的问题及解决办法

1. 创建与设置相关项目

  • 通过 google play console 设置相关联的项目(点击跳转)
  1. 绑定项目(项目不能绑定错,项目不能绑定错,项目不能绑定错)
  2. Play Console > 设置 > API 权限 > 检查“关联的项目”是否有开启
  3. "APIs & auth" subcategory "Credentials" > service account ID (客户端ID)

设置 server accounts 时 会提示下载 jsonp12文件,选择json就好

当前JSON文件非常重要,这是免登入直接获得google play授权的凭证

尤于我不是通过OAuth2去验证,是通过的免登录获得授权,所以其他博客要创建的一些东西,我是可以不创建的(当然创建了也没关系)

  • 通过 google api console 设置关联的项目(点击跳转)
  1. 创建凭据
  2. 设置OAuth授权

设置时应用的名称请找android人员索要,授权域名如果要用webkey就很重要,否则可以直接写公司官网

项目名称,ID一定要设置成同一个否则......

要创建的东西差不多够了,具体的图文教程,可以参考这篇文章

2. 用到的扩展

google 基础框架

google-api-php-client : https://github.com/googleapis/google-api-php-client#
文档示例:https://developers.google.com/api-client-library/php/

直接使用 google 的框架就好

3. 用法


       // 引用类
        require_once EXTEND_PATH.'google-api-php-client/vendor/autoload.php';
        // google play 验证 json
         $configLocation = EXTEND_PATH.'google-api/src/Google/googleplay.json';
        // 将 JSON 设置 环境变量
        putenv('GOOGLE_APPLICATION_CREDENTIALS='.$configLocation);
        // 实例化 google
        $client = new \Google_Client();
        // 设置要访问的URL (不设置 可能会报 401,没有权限访问)
        $client->setScopes([\Google_Service_AndroidPublisher::ANDROIDPUBLISHER]);
        // 设置 当前项目名称
        $client->setApplicationName('当前项目名称');
        // google 服务端默认获得受权
        $client->useApplicationDefaultCredentials();
       // $client->setScopes(['https://www.googleapis.com/auth/androidpublisher']);
        // 设置 google  client_email
       $client->setSubject("client_email");

       // 实例化 google 支付验证类
        $validator =new \Google_Service_AndroidPublisher($client);
        // 变量  包名
        $packageName='包名';
        // 变量  设置的商品ID
        $productId='设置的商品ID';
        // 变量  客户端传过来的 支付凭证
        $token = '客户端传过来的 支付凭证';
        $optps=array();

        $resp = '';
        // 去验证
        try {
            $resp = $validator->purchases_products->get( $packageName, $productId, $token, $optps );
            // 对象转数组
            $resp = get_object_vars($resp);
        } catch (Exception $e) {
            echo 'got error = ' . $e->getMessage() . PHP_EOL;
        }

4. error

初次测试总会遇到一些未知错误,不要耸...

在调用时 发生一些错误可以查看 : https://blog.csdn.net/lemonzone2010/article/details/44983659

更多 error 请看 附

附:

正确返回信息

/**
 *
 *成功会返回
 * 返回字段解释   https://developers.google.com/android-publisher/api-ref/purchases/products
 *
 *  返回字段解释 中文翻译
 * consumptionState  int  消费类产品的消费状态  0有待消费1已消耗
 * developerPayload  string onyx系统生成的唯一ID
 * kind sgring 购买的对象
 * orderId sgring 客户支付订单ID(google play 订单ID)
 * purchaseState  int  订单的采购状态 0购买1取消
 * purchaseTimeMillis int 时间戳
 * purchaseType int 扩展字段 0 测试 1促销
 Array
(
[consumptionState] => 1
[developerPayload] => 你的订单号
[kind] => androidpublisher#productPurchase
[orderId] => google play 订单号
[purchaseState] => 0
[purchaseTimeMillis] => 1542187625018
[purchaseType] =>
)
 */

更多错误

401-403 报错参考:
https://www.cnblogs.com/android-blogs/p/6380725.html?utm_source=itdadao&utm_medium=referral
https://blog.csdn.net/alex_my/article/details/82984706#3__67

其他错误:
http://docs.guzzlephp.org/en/stable/request-options.html#verify-option

补充一下

在我进行验证时常遇到的错误 就是 401403

401

报的错是说没有访问相应API的权限,新版本通过

 // 设置要访问的URL (不设置 可能会报 401,没有权限访问)
 $client->setScopes([\Google_Service_AndroidPublisher::ANDROIDPUBLISHER]);
 //  $client->setScopes('你需要访问的API接口');

在google play中,你要访问的API接口要先定义,才能访问,否则不可以访问

403

{
    "error": {
        "errors": [{
            "domain": "androidpublisher",
            "reason": "projectNotLinked",
            "message": "The project id used to call the Google Play Developer API has not been linked in the Google Play Developer Console."
        }],
        "code": 403,
        "message": "The project id used to call the Google Play Developer API has not been linked in the Google Play Developer Console."
    }
}

这是最头疼的报错,在这里卡了很久,如果你也是,一定要注意了

  • 产生的原因1:项目没有关联,或者关联到错误的API项目上了,也就是在 https://play.google.com/apps/publish,登录之后点击设置按钮 里关联的项目ID是否正确

  • 产生的原因2:谷歌服务的BUG,这时候只要在该应用的商店内,随意增加一个内购或者订阅,再看看是不是这个问题就消失了。新增的内购或者订阅可以删除的。

原因1和2 最好是一起操作,我就是检测了原因1,然后操作了原因2 ,403的问题没有在出现

最后就你好运...

你可能感兴趣的:(PHP 验证google play遇坑小记)