在接入 Google 支付的过程中,最大的难点在于订单校验和重试流程,包括 Google 的官方文档在内,没有一篇资料能提供清晰的思路,所以有了此篇文章。本文不会手把手交你如何接入,只是给出大致的完整流程以供参考,如果你遵循这个流程开发,则接入及维护的阻力会小很多。

充值档位的展示

充值档位在 Google Play 称之为一次性内购商品

  1. 调用我们自己服务端提供的 Api,获取需要展示的档位列表 skuList
  2. 调用 Google Api, 使用 skuList 作为参数, 获得 sku 的价格币种(价格和币种都是由 Google 提供)
  3. 展示包含价格和币种的 skuList

用户点击充值档位,发起充值

完整流程

👉 流程 11 处的失败,不代表用户支付失败,只代表查询操作是失败的。因为订单的校验在服务端,是异步的,只要服务端对订单校验成功,用户账户就会获得订单所对应的钻石。

关于消费

Google 相比国内及苹果的支付,多了个消费的步骤。

流程 3 用户支付成功之后,app 必须在三天内(许可测试是 5 分钟)主动消费支付完成的订单,否则 Google 会按退款处理。多了此步骤,是因为 Google 有线下支付的功能,支付是在应用外部完成的。

同一个商品(充值档位),若处于未消费完成的状态,则无法进行第二次购买。

为了保证我们的利益,采用的顺序是:先消费订单,再进行相应档位钻石的发放。

重试机制

重试线路

  1. 查询订单缓存,即未消费完成的订单。有以下两个来源,进行合并去重,从 流程 5 开始向下执行

    1. Google Play,可跨设备。Google 在 流程 2 支付成功时缓存,在 流程 6 消费成功时删除
    2. 应用本地,对应 流程 4

    若只依赖 Google Play 的缓存,可能会在 流程 6 时,因网络或者应用进程被杀,使得这笔消费成功的订单未能上传给服务器校验,从而导致丢单

  2. 查询消费缓存,即消费了的,但是未向 app 服务器校验成功的订单
    流程 9 开始向下执行

重试时机

  1. App 启动
  2. 回到 App 首页
  3. 进入房间游戏

订单丢失

按照设想,是不会出现用户丢单的情况,除非下面这种极端情况

执行到 流程 6,用户网络不佳,或者 App 进程被杀,然后用户卸载了 App。

(App 收到了付款,但是用户永远无法获得相应档位的钻石)