iOS内购掉单问题处理方法

2019-03-291017次阅读支付apple

iOS内购提供了两种模式,一种是单机(本地验证)模式,另一种是服务器端验证模式。

单机验证模式:适用于单机应用,安全性低,数据易被篡改。

服务器验证模式:应用服务器提交支付票据到苹果服务器验证,安全性较高。

这里我画了一下我们iOS内购支付的时序图

什么是掉单?

用户选定商品支付完成后,服务器不能正确及时的获取支付状态,导致这笔已支付的订单未能发货。

为什么会产生掉单?

1. 手机网络情况复杂多变。

2. 苹果服务器在境外连通性不确定。

以上两个客观原因,我们无法改变,会导致如下情况:

1. 用户支付完成之后,苹果服务器将支付票据返回给客户端,客户端发送票据到游戏服务器。(可能会断网,未能提交到游戏服务器)

2. 游戏服务器拿到支付票据,请求苹果服务器票据验证。(游戏服务器连接苹果服务器超时,未能验证票据)。

 

优化方案

掉单的原因目前已经找到了,那么需要从客户端和服务器两个方面做优化,彻底解决掉iOS支付掉单问题。

 

客户端需要做什么优化?

客户端在拿到苹果支付票据后,一定要先将支付票据和用户账号做映射,标记为未验证,保存到本地数据库中,然后把票据提交到游戏服务器,在确保得到游戏服务器的反馈,在将本地数据库中该条记录删除,确保游戏服务器收到该票据。

 

服务器端做什么优化?

服务器接收到客户端的票据以及验证信息时,先将票据存储到数据库中,然后请求苹果服务器验证票据,如果因为连接苹果服务器超时或者其他网络情况,标记该票据为验证证状态,后续交给定时任务处理,确保能够正确验证票据结果。

 

参考链接

iOS In App Purchase(内购)验证

苹果IAP安全支付与防范 receipt收据验证

苹果应用内支付(iOS IAP)的流程与常用攻击方式

上一篇: AS2.0中flash调用页面中的js方法及注意事项  下一篇: 在微服务架构中Redis为什么不能取代Etcd?  

iOS内购掉单问题处理方法相关文章