google内购(补充)
google内购(补充)
这篇是作为google支付的补充篇,主要是倾向纯curl请求完成订单校验
1. 获取授权
首先,构建url,直接在浏览器访问,然后登陆Google账号并授权允许。 之后就会携带参数跳转到指定的重定向URI
/**
* client_id:OAuth2 客户端凭证中client_id
* redirect_uri:OAuth2 客户端凭证配置中的已获授权的重定向uri
* scope:授权范围,我们要获取内购需要的授权,所以请求范围为 https://www.googleapis.com/auth/androidpublisher
* 注意,access_type=offline 是必须的,如果不带这个,将不会生成出 refresh_token
*/
https://accounts.google.com/o/oauth2/auth?client_id={你的OAuth client id}&scope={授权范围}&response_type=code&redirect_uri={重定向URI}&access_type=offline
//例(部分参数做了修改):
https://accounts.google.com/o/oauth2/auth?client_id=123428073232-6tpvle71q5hp5j76bqeepb9b9fsfao4g.apps.googleusercontent.com&redirect_uri=http://localhost:8092/jingxc/google/google-callback&response_type=code&scope=https://www.googleapis.com/auth/androidpublisher&access_type=offline
2. 获取refresh_token
授权完成后,谷歌会携带参数跳转到你的重定向URI中。其中包含了最重要 code 字段,拿这个 code 去进行下一步操作,获取refresh_token
4/0AbUR2VPc5QvEdi30R7WYMVbepuyQT8PrFKHU5UH6Y1yYtxc1cL5XLEuJD8N1eE2brK58eg
将该代码替换为访问权限和刷新令牌组合,为此,您需要向 https://accounts.google.com/o/oauth2/token 发送 POST 请求,并设置以下字段:
grant_type=authorization_code
code=<the code from the previous step>
client_id=<the client ID token created in the APIs Console>
client_secret=<the client secret corresponding to the client ID>
redirect_uri=<the URI registered with the client ID>
注意
注意请求为form-data请求
成功的响应将包含您的 JSON 格式的令牌:
{
"access_token":"ya29.a0AWY7Cknto5y2nSrPU8bMD4H1JPDJ6r2-6toRvYQLHF9JKKvxNb1VCZDQSM6t6DwMt51S2yVhtaiMQiFliA5aR6HymRvdhnXEmIQIcWs1QyO5Pe0gJQY4VYAsrnHnbavF1qXxRpG40EsfBoaluxmB3tKhJphdaCgYKASYSARASFQG1tDrpcDPi8xnDn5bI6xx_C1EWSw0163",
"refresh_token":"1//06kdNYvxl0G9mCgYIARAAGAYSNwF-L9Ir9HcJyLgstKln0_SNwt2eGuYoggey3NfDdbRvpeKpF2GCqFbuidysU9bPOe80_gztBeU",
"scope":"https://www.googleapis.com/auth/androidpublisher",
"token_type":"Bearer",
"expires_in":3599
}
3. 使用刷新令牌
每个访问令牌仅在短时间内有效。当前访问令牌过期后,服务器需要使用刷新令牌来获取新的访问令牌。为此,请向 https://accounts.google.com/o/oauth2/token 发送 POST 请求,并设置以下字段:
grant_type=refresh_token
client_id=<the client ID token created in the APIs Console>
client_secret=<the client secret corresponding to the client ID>
refresh_token=<the refresh token from the previous step>
成功的响应将包含另一个访问令牌:
{
"access_token" : "ya29.AHES3ZQ_MbZCwac9TBWIbjW5ilJkXvLTeSl530Na2",
"token_type" : "Bearer",
"expires_in" : 3600,
}
因此,刷新令牌可允许网络服务器继续访问该 API,而无需有效登录 Google 帐号。
4. 使用访问令牌
服务器可以通过在请求的 Authorization 标头中传递访问令牌来调用该 API:
Authorization: Bearer oauth2-token
5. 获取用户支付订单信息
提示
参考文档:https://developers.google.com/android-publisher/api-ref/rest/v3/purchases.products/get?hl=zh-cn
access_token也可以放在url上,最好是放在请求头里
路径参数:
参数 | 类型 | 描述 |
---|---|---|
packageName | string | 销售应用内商品的应用的软件包名称(例如“com.some.thing”)。 |
productId | string | 应用内商品 SKU(例如“com.some.thing.inapp1”)。 |
token | string | 购买应用内商品时向用户设备提供的令牌。 |
当用户在 APP 中完成支付后,前端可以从谷歌手上拿到一个token ,该 token 上报给后端服务可以用来查询订单状态,并进行订单消费处理。 具体的请求说明可以参考文档,这里给出一个完整的例子:
相关信息
请求成功后,在 json respond 中,获取到订单信息,具体内容说明可以查看文档: https://developers.google.com/android-publisher/api-ref/purchases/products#resource-representations 其中有以下几个比较重要:
purchaseState : 仅为 0 时,为已支付状态 acknowledgementState : 是否已确认。 确认操作可以由后端接口处理,下一步会介绍到
consumptionState : 是否已核销,商品核销只能由安卓处理,务必与安卓沟通好,确认 acknowledgementState 为 1 的时候才进行核销处理。 如果一次性商品不及时进行核销,用户无法操作第二次购买。
developerPayload : 载荷用于下一步的确认操作,请妥善保管。
purchaseType : 该字段有三个值,非必传字段,具体可以看文档。 比较重要的是为0时是沙箱(超级账号)支付,用户实际上是没有付款的。
orderId : 谷歌订单号,必须妥善保管
6. 确认订单
上一步中拿到的 developerPayload , 可以用于确认订单。一个订单只能确认一次,确认之后无法再次操作。 可以作为服务端确认凭证。
例如,我们有一个游戏装备商品,用户支付后,安卓上报token ,后端确认token ,记录好订单信息、做完业务处理之后处理确认订单,安卓再次跟谷歌确认订单是否为已确认(即acknowledgementState=1),然后安卓做装备发放处理并核销订单(即consumptionState=1),完成一次消费。
提示
接口文档 : https://developers.google.com/android-publisher/api-ref/purchases/products/acknowledge
access_token也可以放在url上,最好是放在请求头里
HTTP POST
路径参数:
参数 | 类型 | 描述 |
---|---|---|
packageName | string | 销售应用内商品的应用的软件包名称(例如“com.some.thing”)。 |
productId | string | 应用内商品 SKU(例如“com.some.thing.inapp1”)。 |
token | string | 购买应用内商品时向用户设备提供的令牌。 |
请求正文 请求正文中包含结构如下的数据:
{
"developerPayload": string//附加到购买交易的载荷,上一步中拿到的developerPayload
}
响应正文 如果成功,则响应正文为空。
7. 订单退款
通过配置webhook接收退款信息,详情请参阅webhook配置
- 本文作者: 景兴春
- 本文链接: https://www.jingxc.top/back/payment/java-google_rep.html
- 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!