整个开发背景是前端在调用完google play支付流程后,需要后台验证支付结果以及在自己的服务生成订单相关信息。由此着手对google后台验证的调研,首先官方流程:
https://developers.google.com/android-publisher/authorization
下面我将已网上原有贴复制+自己手动截图的形式详细描述下整个操作流程:
实现步骤
1.管理者用项目最高权限的GP账号登录,访问https://accounts.google.com/o/oauth2/auth?scope=https://www.googleapis.com/auth/androidpublisher&response_type=code&access_type=offline&redirect_uri=https://www.example.com/oauth2callback&client_id=123456789 获得code,保存此code(4/SIIu58MuX3Ixuea-FJPo3rgg3x5LIDyadb8MzztPV7c#)
2.迅速访问,请注意是在步骤1后迅速访问。POST请求,https://accounts.google.com/o/oauth2/token?grant_type=authorization_code&code=4/SIIu58MuX3Ixuea-FJPo3rgg3x5LIDyadb8MzztPV7c#&client_id=123456789&client_secret=123456789&redirect_uri=https://www.example.com/oauth2callback。获得返回的refresh_token,妥善保存此token。以后的请求中都不会再出现,对于当前创建的账号的唯一且永久有效的
3.携带refresh_token可获取access_token,POST请求访问https://accounts.google.com/o/oauth2/token,参数grant_type=refresh_token为固定值,client_id,client_secret,refresh_token
PS:值得注意的是,2与3的POST请求在摸索初期我都用postman去模拟,参数不是一个JSON,是已表单的形式传参的,这点在后续也会截图表述。
4.验证:Get请求,请求接口:https://www.googleapis.com/androidpublisher/v2/applications/packageName/purchases/products/productId/tokens/purchaseToken?access_token=access_token
操作截图
在Google APIs选择Credentials,Create New Project,点击创建一个auth2.0的web应用
https://console.developers.google.com/apis/dashboard
我用的是Java后台的http验证,创建了Web application,红框处完全可以填示例的url,至少单在验证支付状态的需求里这个redirect_uri是没有用到的
Anyway,请求需要的clien_id client_secret,redirect_uri都已经创建好了。操作步骤1,得到下图,保存code
同时,此时要开启一个google应用,才能在后台执行查询的api。
拿到code后,执行步骤2,我用的是Postman。Post请求,请求头Content-Type = application/x-www-form-urlencoded
拿到refresh_token后,就可以执行步骤3,请求获得access_token,步骤3.4很流畅 不截图了。
以上是整个请求流程的Postman访问。
正常情况下,按此流程操作请求到步骤4后,并不能得到想要的结果。会报一系列的错误code,下面来讲述这些错误的解决。
先推一个链接,尾部有两个错误的解决http://blog.csdn.net/lemonzone2010/article/details/44983659。创建Link的截图因为我没有主权限账号,所以没有截图。
这里写一下自己遇到的401code ,报错message如下:
The current user has insufficient permissions to perform the requested operation
困惑我的是整个google console 配置的是全局的Link 。在测试的客户端项目跑通整个流程后,新建的正式项目用同样的代码去测试就报了没有权限的code。反复查询无果,包裹google上搜索的设置一个XXXemail等等的操作都无济于事,万念俱灰之际,重新创建一个Web application,Link配置后。401code没了
{
"kind": "androidpublisher#productPurchase",
"purchaseTimeMillis": "1516155154486",
"purchaseState": 0,
"consumptionState": 1,
"developerPayload": "",
"orderId": "GPA.3322-0256-8697-13965",
"purchaseType": 0
}
成功。