Google支付 创建OAuth 2.0,并获得code
创建OAuth 2.0
1.创建api项目这个和登录用的项目不是同一个
2.开启Google Play Android Developer API
3.设置oauth同意屏幕(就是拉起开发者授权账号登录时的登录页面)
4.创建web应用的oauth客户端ID
5.google play开发者后台,API权限菜单中关联刚刚创建的项目,一个google play账号只需要也只能关联一个api项目就行了,这个项目可以查询关联账号中的所有应用的订单
6.拉起授权页面,使用google开发者账号给项目授权,得到code
7.通过code,拿到refreshToken,这个token只有第一次才会返回需要永久储存(这个refreshtoken很重要,需要保存下来),如果弄丢,只有重新创建一个oauth客户端ID,然后重复步骤6,7,拿到新的refreshtoken
8.刷新refreshToken, 得到accessToken,通过accesstoken就可以去查询订单状态了,这里的accessToken一般只有5分钟左右,5分钟后需要重新用refreshToken换取新的accessToken
下面咋们上操作截图
setp1
创建api项目google api console
setp2
开启Google Play Android Developer API
搜索“Google Play Android Developer API”
setp3
开启同意屏幕
这里填上必填项就行了,这个授权同意屏幕,请求code时拉起来给咋们开发人员开的,填啥都无所谓
setp4
创建oauth2客户端id
创建页面和创建成功后的修改页面可以获取到clientId和clientSecret
到这里api项目就已经创建好了
setp5
google play后台关联api项目
获取code
地址:https://accounts.google.com/o/oauth2/auth?scope=https://www.googleapis.com/auth/androidpublisher&response_type=code&access_type=offline&redirect_uri={填写的重定向地址}&client_id={创建的clientId}
将上面的{XX}替换成创建api项目时填写的重定向地址,和clientId,然后将连接放到浏览器中打开,就会吊起授权界面,使用你的开发者账号授权登录
请求方式:浏览器中打开
获得code
返回页面的地址:
这里可以看到,重定向地址上有两个参数code和scope,我们只需要code就行了,这里的code是urlencode后的,使用时需要decode
setp7使用code换取refreshToken
地址:https://accounts.google.com/o/oauth2/token
请求方式:post
参数:grant_type=authorization_code
code=获取到的code(需要看看code中是否有%号,如果有需要urldecode)
client_id=创建api项目是的clientId(客户端ID)
client_secret=创建api项目时的clientSecret(客户端密钥)
redirect_uri=创建api项目时的重定向地址 这里就获取到refreshToken了,重点重点重点,refreshToken保存下来,它只会在第一次请求中返回,后续用在发一样的请求不会返回refreshtoken,如果不慎弄丢了,需要去重新创建一个WebClientId
setp8
使用refreshToken获取accessToken
地址:https://accounts.google.com/o/oauth2/token
请求方式:post
参数:grant_type=refresh_token
refresh_token=刚刚获取到的refreshToken
client_id=创建api项目是的clientId(客户端ID)
client_secret=创建api项目时的clientSecret(客户端密钥) setp9
查询订单状态
https://androidpublisher.googleapis.com/androidpublisher/v3/applications/{packageName}/purchases/products/{productId}/tokens/{token}?access_token={access_token}
packageName:app包名,必须是创建登录api项目时,创建android客户端Id使用包名
productId:对应购买商品的商品ID
token:购买成功后Purchase对象的getPurchaseToken()
access_token:上面咋们获取到的accessToken
请求方式:get
返回值:
到这里整个支付验证流程就已经走完了,这里总结哈笔者这次试用过程中走过的一些坑:
- google应用必须要在封闭测试状态下,并审核通过的应用才能支付,文档说的是内部测试就可以了,笔者每次都弄到封闭测试状态下才可以支付。
- 在firebase中创建了项目,会自动同步到google api后台,不用再去单独创建登录使用的项目
- 登录使用的api项目和查询支付使用的api项目是两个不同的项目相互不干扰,查询支付的api项目一个google play账号对应一个项目,这个google play账号中所有的应用,都可以通过这个查询支付的api项目去查询
- 获取code授权api项目时,要使用google play后台的开发者账号授权
- 获取code授权api项目时,如果出现redirect_uri_mismatch错误,则返回Google Cloud Platform中的API和服务,进入OAuth consert screen,把发布状态改成生产中
关于RefreshToken过期问题
- api项目-同意屏幕,发布状态为测试(有效期7天)
- RefreshToken 6个月都未使用,这个要维护accessToken的有效性,应该可以不必考虑
- 授权账号改密码了(笔者未测试,修改开发者账号密码是否会导致过期)
- 授权超过50个刷新令牌,最先的刷新令牌就会失效(这里50个应该够用了,除了测试时,可能会授权多个)
- 取消了授权
- 属于具有有效会话控制策略的 Google Cloud Platform 组织