iOS内购提供了两种模式,一种是单机(本地验证)模式,另一种是服务器端验证模式。
单机验证模式:适用于单机应用,安全性低,数据易被篡改。
服务器验证模式:应用服务器提交支付票据到苹果服务器验证,安全性较高。
这里我画了一下我们iOS内购支付的时序图
什么是掉单?
用户选定商品支付完成后,服务器不能正确及时的获取支付状态,导致这笔已支付的订单未能发货。
为什么会产生掉单?
1. 手机网络情况复杂多变。
2. 苹果服务器在境外连通性不确定。
以上两个客观原因,我们无法改变,会导致如下情况:
1. 用户支付完成之后,苹果服务器将支付票据返回给客户端,客户端发送票据到游戏服务器。(可能会断网,未能提交到游戏服务器)
2. 游戏服务器拿到支付票据,请求苹果服务器票据验证。(游戏服务器连接苹果服务器超时,未能验证票据)。
优化方案
掉单的原因目前已经找到了,那么需要从客户端和服务器两个方面做优化,彻底解决掉iOS支付掉单问题。
客户端需要做什么优化?
客户端在拿到苹果支付票据后,一定要先将支付票据和用户账号做映射,标记为未验证,保存到本地数据库中,然后把票据提交到游戏服务器,在确保得到游戏服务器的反馈,在将本地数据库中该条记录删除,确保游戏服务器收到该票据。
服务器端做什么优化?
服务器接收到客户端的票据以及验证信息时,先将票据存储到数据库中,然后请求苹果服务器验证票据,如果因为连接苹果服务器超时或者其他网络情况,标记该票据为验证证状态,后续交给定时任务处理,确保能够正确验证票据结果。
参考链接