说明
在后端验证 google play 的订单真实性的时候,刚开始接触到 google play console的相关配置时,总是会报一些类似401
与403
的错误,在代码层面没有找到问题时,及有可能是相关配置出现了问题,尤其是403
的错误,接下来就说说我调试 google play 时遇到的问题及解决办法
1. 创建与设置相关项目
- 绑定项目(项目不能绑定错,项目不能绑定错,项目不能绑定错)
- Play Console > 设置 > API 权限 > 检查“关联的项目”是否有开启
- "APIs & auth" subcategory "Credentials" > service account ID (客户端ID)
设置 server accounts 时 会提示下载 json
或 p12
文件,选择json
就好
当前JSON文件非常重要,这是免登入直接获得google play授权的凭证
尤于我不是通过OAuth2去验证,是通过的免登录获得授权,所以其他博客要创建的一些东西,我是可以不创建的(当然创建了也没关系)
- 创建凭据
- 设置OAuth授权
设置时应用的名称请找android人员索要,授权域名如果要用web
的key
就很重要,否则可以直接写公司官网
项目名称,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
补充一下
在我进行验证时常遇到的错误 就是 401
和403
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的问题没有在出现
最后就你好运...