PHP 验证google play遇坑小记

说明

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

1. 创建与设置相关项目

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

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

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

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

  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的问题没有在出现

最后就你好运...

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容