google内购(补充)

Jingxc大约 5 分钟payjava后端payjavagoogle后端

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/tokenopen in new window 发送 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/tokenopen in new window 发送 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-cnopen in new window

access_token也可以放在url上,最好是放在请求头里

路径参数:

参数类型描述
packageNamestring销售应用内商品的应用的软件包名称(例如“com.some.thing”)。
productIdstring应用内商品 SKU(例如“com.some.thing.inapp1”)。
tokenstring购买应用内商品时向用户设备提供的令牌。

当用户在 APP 中完成支付后,前端可以从谷歌手上拿到一个token ,该 token 上报给后端服务可以用来查询订单状态,并进行订单消费处理。 具体的请求说明可以参考文档,这里给出一个完整的例子:

GET https://androidpublisher.googleapis.com/androidpublisher/v3/applications/{packageName}/purchases/products/{productId}/tokens/{token}open in new window

相关信息

请求成功后,在 json respond 中,获取到订单信息,具体内容说明可以查看文档: https://developers.google.com/android-publisher/api-ref/purchases/products#resource-representationsopen in new window 其中有以下几个比较重要:

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/acknowledgeopen in new window

access_token也可以放在url上,最好是放在请求头里

HTTP POST

https://androidpublisher.googleapis.com/androidpublisher/v3/applications/{packageName}/purchases/products/{productId}/tokens/{token}:acknowledgeopen in new window

路径参数:

参数类型描述
packageNamestring销售应用内商品的应用的软件包名称(例如“com.some.thing”)。
productIdstring应用内商品 SKU(例如“com.some.thing.inapp1”)。
tokenstring购买应用内商品时向用户设备提供的令牌。

请求正文 请求正文中包含结构如下的数据:

{
  "developerPayload": string//附加到购买交易的载荷,上一步中拿到的developerPayload
}

响应正文 如果成功,则响应正文为空。

7. 订单退款

通过配置webhook接收退款信息,详情请参阅webhook配置

查看详情

上次编辑于:
贡献者: Jingxc,jingxc