你是否为苹果内购漏单苦恼过?经过网上一些文章描述仍存在一些漏单的问题?
漏单常见原因
- 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).给自己服务器发起验证时,对参数进行保护(必须有值,这样防止意外其他不可预料的漏单情况);
- 我们服务端与苹果服务端验证票据合法性(防止刷单等情况),服务端会通过预订单号和存储交易ID,比对.
- 票据合法后自己服务端回传状态和金额数据
- 客户端检测结果成功,结束交易,更新金额,埋点数据. 结果失败,如果是已充过的订单失败则结束交易,如果是其他情况则更新并埋点订单状态.(埋点监听用户充值行为流程,回传交易状态和充值状态)
优化上线后效果
目前没发现有漏单.