iOS 解决内购漏单-最靠谱的方案

内购流程.png

你是否为苹果内购漏单苦恼过?经过网上一些文章描述仍存在一些漏单的问题?

漏单常见原因

  • 1.票据未成功上传给自己服务器,(网络等原因)就已经结束交易;
  • 2.未启动APP时实时监听是否有交易未完成,付款后因用户主动杀死APP时再次启动未监听到状态导致漏单;
  • 3.用户绑定支付宝,银联等其他情况,第一次充值时.苹果检测用户没钱,状态变为交易失败,然后去支付宝等页面绑定,绑定成功后交易重新走交易完成,状态变成交易成功,处理交易失败时你是否删除了预订单并结束交易.导致服务端验证的参数缺少.验证失败.导致漏单.

我司APP的内购处理流程

  • 1.点击充值,发起预订单:用户点击立即充值,发起充值流程,请求自己服务器,生成预订单(为了服务端验证防止刷单,本地绑定预订单处理漏单需要)
  • 2.生成的预订单给客户端保存本地.
  • 3.调起内购,绑定预订单:(存储模型:产品id,预订单,交易状态,充值状态,时间戳+产品id)
  • 4.用户输入完appid后,交易进行中状态回调

    1).如果交易正在进行,需要判断上一笔订单是已经漏单,如果已经漏单,提示用户正在为您完成上一笔订单充值,走check流程,发起自己服务端验证.如果没有漏单,提示正在购买中
    2).如果交易完成.取本地绑定的预订单和交易id和票据去服务端验证.验证通过则finishTransaction交易队列,更新订单状态(交易成功,充值成功),刷新金额.验证失败不结束交易队列(充值失败),均埋点此时订单状态和原因
    3),如果交易取消,失败,拒绝等,结束交易队列(用户自身原因主动取消等),此时并不删除本地预订单,只是更新订单状态.

  • 5.发起自己服务器验证流程.(此时因为网络,或用户杀死APP容易漏单.)

1).启动APP时监听苹果交易状态,如果用户已经购买成功,票据没有上传,自己服务器没有票据验证,客户端不会结束交易队列,此时会重新走服务验证流程,避免漏单;
2).网络状态变更,会走check本地订单状态和交易队列,如果有漏单会重新发起验证,避免漏单;
3).进入充值页面,会走check本地订单状态和交易队列,如果有漏单会重新发起验证,避免漏单,并且在此时删除本地垃圾预订单.
4).给自己服务器发起验证时,对参数进行保护(必须有值,这样防止意外其他不可预料的漏单情况);

    1. 我们服务端与苹果服务端验证票据合法性(防止刷单等情况),服务端会通过预订单号和存储交易ID,比对.
    1. 票据合法后自己服务端回传状态和金额数据
    1. 客户端检测结果成功,结束交易,更新金额,埋点数据. 结果失败,如果是已充过的订单失败则结束交易,如果是其他情况则更新并埋点订单状态.(埋点监听用户充值行为流程,回传交易状态和充值状态)

优化上线后效果

目前没发现有漏单.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 参考借鉴了一下几篇文章(在这里很感谢各位作者大大做出的总结和方案): http://blog.csdn.net/a...
    辉546阅读 14,083评论 3 12
  • 更新:经过这几天的用户反馈及自己的查找,发现了一些问题。首先,在添加观察者之前是获取不到未完成订单的,只有在观察者...
    皮乐皮儿阅读 8,777评论 15 24
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,258评论 19 139