在接入 Google 支付的过程中,最大的难点在于订单校验和重试流程,包括 Google 的官方文档在内,没有一篇资料能提供清晰的思路,所以有了此篇文章。本文不会手把手交你如何接入,只是给出大致的完整流程以供参考,如果你遵循这个流程开发,则接入及维护的阻力会小很多。
充值档位的展示
充值档位在 Google Play 称之为一次性内购商品
- 调用我们自己服务端提供的 Api,获取需要展示的档位列表
skuList
- 调用 Google Api, 使用
skuList
作为参数, 获得 sku 的价格和币种(价格和币种都是由 Google 提供) - 展示包含价格和币种的
skuList
用户点击充值档位,发起充值
完整流程
👉 流程 11
处的失败,不代表用户支付失败,只代表查询操作是失败的。因为订单的校验在服务端,是异步的,只要服务端对订单校验成功,用户账户就会获得订单所对应的钻石。
关于消费
Google 相比国内及苹果的支付,多了个消费的步骤。
在 流程 3
用户支付成功之后,app 必须在三天内(许可测试是 5 分钟)主动消费支付完成的订单,否则 Google 会按退款处理。多了此步骤,是因为 Google 有线下支付的功能,支付是在应用外部完成的。
同一个商品(充值档位),若处于未消费完成的状态,则无法进行第二次购买。
为了保证我们的利益,采用的顺序是:先消费订单,再进行相应档位钻石的发放。
重试机制
重试线路
查询订单缓存,即未消费完成的订单。有以下两个来源,进行合并去重,从
流程 5
开始向下执行- Google Play,可跨设备。Google 在
流程 2
支付成功时缓存,在流程 6
消费成功时删除 - 应用本地,对应
流程 4
若只依赖 Google Play 的缓存,可能会在
流程 6
时,因网络或者应用进程被杀,使得这笔消费成功的订单未能上传给服务器校验,从而导致丢单- Google Play,可跨设备。Google 在
查询消费缓存,即消费了的,但是未向 app 服务器校验成功的订单
从流程 9
开始向下执行
重试时机
- App 启动
- 回到 App 首页
- 进入房间游戏
订单丢失
按照设想,是不会出现用户丢单的情况,除非下面这种极端情况
执行到 流程 6
,用户网络不佳,或者 App 进程被杀,然后用户卸载了 App。
(App 收到了付款,但是用户永远无法获得相应档位的钻石)