AppStore充值至关重要,开发流程别人总结很多,比如这篇iOS Apple内购及掉单问题,我就不多说了,就总结一下我们AppStore充值设计流程:
充值流程图.png
补单流程.png
作为补单的主要依据信息,以数组形式,数组的每个item为一个键值串的方式,存入到本地Keychains中。
表1.1补单依据表
token(身份串) | uid(账号唯一ID) | item(商品ID) | itemnum(商品数量) | appsid(服务器ID) | vtime(当前时间戳) | country(国家码) | ext(角色ID) | transactionId(苹果返回订单号) | receipt(苹果返回收据信息) | finishTransaction (是否已结单) |
---|---|---|---|---|---|---|---|---|---|---|
空 | 空 | 空 | 空 | 空 | 空 | 空 | 空 | 空 | 空 | 空 |
表1.2
token(身份串) | uid(账号唯一ID) | item(商品ID) | itemnum(商品数量) | appsid(服务器ID) | vtime(当前时间戳) | country(国家码) | ext(角色ID) | transactionId(苹果返回订单号) | receipt(苹果返回收据信息) | finishTransaction (是否已结单) |
---|---|---|---|---|---|---|---|---|---|---|
存入 | 存入 | 存入 | 存入 | 存入 | 存入 | 空 | 存入 | 空 | 空 | 空 |
表1.3
token(身份串) | uid(账号唯一ID) | item(商品ID) | itemnum(商品数量) | appsid(服务器ID) | vtime(当前时间戳) | country(国家码) | ext(角色ID) | transactionId(苹果返回订单号) | receipt(苹果返回收据信息) | finishTransaction (是否已结单) |
---|---|---|---|---|---|---|---|---|---|---|
存入 | 存入 | 存入 | 存入 | 存入 | 存入 | 存入 | 存入 | 空 | 空 | 空 |
表1.4
token(身份串) | uid(账号唯一ID) | item(商品ID) | itemnum(商品数量) | appsid(服务器ID) | vtime(当前时间戳) | country(国家码) | ext(角色ID) | transactionId(苹果返回订单号) | receipt(苹果返回收据信息) | finishTransaction (是否已结单) |
---|---|---|---|---|---|---|---|---|---|---|
存入 | 存入 | 存入 | 存入 | 存入 | 存入 | 存入 | 存入 | 存入 | 存入 | 空 |
表1.5
token(身份串) | uid(账号唯一ID) | item(商品ID) | itemnum(商品数量) | appsid(服务器ID) | vtime(当前时间戳) | country(国家码) | ext(角色ID) | transactionId(苹果返回订单号) | receipt(苹果返回收据信息) | finishTransaction (是否已结单) |
---|---|---|---|---|---|---|---|---|---|---|
存入 | 存入 | 存入 | 存入 | 存入 | 存入 | 存入 | 存入 | 存入 | 存入 | 存入 |
表2.订单发货失败次数汇总表
订单号 | 失败次数 |
---|---|
1232321321 | 1 |
1232321321 | 3 |
说明:作为订单是否关单的依据表,以键值传形式存入本地keychain中,键为订单号,值为失败次数,某笔订单号如果结单则从表中删除对应的键,否则根据键找到对应的值并失败次数+1,最多为3。
【程序BUG方面】
针对充值失败的判断处理;具体情况:玩家支付成功,苹果未及反馈充值成功之前,网络突然中断,苹果客户端会通知失败的消息,因为此失败消息没有明细,SDK客户端认为玩家放弃充值,从而删除本地的订单信息,网络恢复后,苹果送达成功支付的订单信息,此时客户端找不到本地的相关订单信息,给服务端发送的订单信息不完整,导致了掉单。
现在的解决方案:
本地记录玩家最后一次充值的记录,如果出现上述异常,把苹果充值成功的订单信息和最后一次充值的记录合并后发给服务端,通知服务端发货。
在任何情况下(即使本地没有找到对应的订单信息),苹果发给客户端充值成功的信息, 都要通知给服务端;这样即使掉单,也可以人工补单。
【可能的风险预防】
充值过程中,如果苹果返回的成功信息缺少“订单信息”,需要重新跟苹果获取订单信息,尝试3次都失败的情况下,才可以关闭订单。这样处理既可以减少掉单,也能够避免当前充值档位被死锁的情况发生。
【异常收集】
采集充值过程中出现的所有异常,为后续版本持续优化提供参考依据