使用服务账号请求Google Play Developer API
Google Play 虽然提供了纯客户端的对接方案,但是官方也更推荐将敏感逻辑移至后端
Google Play Developer API 是一种服务器到服务器 API,与 Android 平台上的 Google Play 结算库相辅相成。此 API 提供了 Google Play 结算库中未提供的功能,如安全地验证购买交易以及为用户办理退款。
配置 Google Play Developer API
若要使用 Google Play Developer API,您需有一个 Google Cloud 项目。
关联Google Cloud项目
如上图,你可以选择关联现有项目,也可以选择创建新项目
关联现有项目
选择现有项目前,需确认该项目开启了Google Play Android Developer API
创建新项目
创建新项目就方便了,系统会自动开启Google Play Android Developer API
在已关联Google Cloud项目中创建服务账号
要访问Google Play Developer API
,你可以选择OAuth 客户端ID或服务帐号,这里推荐使用 服务帐号
创建一个服务帐户:
点击add创建服务帐户。
在服务帐户的详细信息,键入一个名称,ID和服务帐户的描述,然后单击创建并继续。
可选:在授予此服务帐户访问到项目中,选择IAM角色授予服务帐户。(我理解应该是必选)
点击继续。
可选:在授予用户访问该服务帐户,添加允许使用和管理服务帐户的用户或组。(我理解也是可选,我没选)
点击完成。
点击add创建键,然后单击创建。
在创建帐号的过程中,您需要向自己的服务帐号授予对 Google Cloud 项目的访问权限,这样它才能显示在 Google Play 管理中心内。
如需使用 Google Play 结算服务 API,您必须授予以下权限:
- 查看财务数据、订单和用户取消订阅时对调查问卷的书面回复
- 管理订单和订阅
为服务账号创建密钥
密钥创建成功,会提示你保存到本地,一个pc-api-***-797-ac21a2656c65.json
文件,保存好,后面PHP要用
此时,您应该能够通过服务帐号访问 Google Play Developer API。
PHP出场,这里应该有尖叫声~
Google为PHP提供了库,安装
composer require google/apiclient
以请求purchases.products.get
接口为例
$configLocation = $this->app->path.'/config/pc-api-***-797-ac21a2656c65.json';
// echo file_get_contents($configLocation);exit;
// 将 JSON 设置 环境变量
putenv('GOOGLE_APPLICATION_CREDENTIALS='.$configLocation);
//包名
$package_name='net.cuiwei.voice';
//商品ID
$product_id='voice_0';
//客户端传过来的 purchaseToken
$purchase_token='facbncnplohikbjmf。。。';
try {
$google_client = new \Google_Client();
$google_client->useApplicationDefaultCredentials();
$google_client->addScope(\Google_Service_AndroidPublisher::ANDROIDPUBLISHER);
$androidPublishService = new \Google_Service_AndroidPublisher($google_client);
$result = $androidPublishService->purchases_products->get(
$package_name,
$product_id,
$purchase_token
);
echo json_encode($result, JSON_UNESCAPED_UNICODE);exit;
//更详细的代码请参考 http://www.cuiwei.net/p/1613838190/
}catch (Exception $exception){
return show(0, $exception->getMessage());
}
注意:上述权限设置完不是立马生效的。我就是刚设置完,就使用PHP请求,结果提示401,然后各种找原因,未果;刚好到饭点,我就去吃饭了,等回来继续试,竟奇迹般的成功了。中间大概隔了1~2个小时