iOS 内购漏单问题解决参考方案

问题:iOS内购漏单的问题

事由:

不久前,有用户反映,大概意思是这样:苹果扣款成功了,但是没有发放应得的内购产品,这钱花哪去了?

这是一个严重的漏单问题,已经得到了及时解决,现写篇文章总结一下。

原理概念:

IAP:是指In-App Purchase,顾名思义,一种应用内的支付(内购)。但IAP不是特指苹果的内购支付方式,应用也可以有其自己的内购支付方式。

这里来说一下Apple的IAP。下图是苹果内购的支付流程图。

支付流程解释

1.客户端向Appstore请求购买产品,Appstore验证产品成功后,从客户端的Apple账户中扣费。

2.Appstore向客户端返回一段receipt-data(票据),里面记录了本次交易的证书和签名信息。

3.客户端向我们可以信任的服务器(后台)提供receipt-data

4.服务器对receipt-data进行一次base64编码

5.把编码后的receipt-data发往itunes.appstore进行验证

6.itunes.appstore返回验证结果给服务器

7.服务器对商品购买状态以及商品类型,向客户端发放相应的道具与推送数据更新通知

问题:

以上七个步骤实际上是一个很安全的支付流程了。那问题会出在哪里呢?

出现的两种验证方式:

IAP built-in Model(本地验证):此种方式跳过来3-7步,在第2步中拿到票据直接向itunes.appstore请求验证票据,根据票据的结果来修改数据。有一些单机游戏因为不涉及后台服务器会采取此种方式,但由此单来的不安全也很明显,比如一些越狱的手机会很容易对此进行一些数据操作。这里暂不做讨论。

IAP Server Model(服务器验证):如果把数据放在服务器做校验(如实走完1-7的流程),就不用担心客户端出现伪造票据等问题。但是这样还会出现问题。

想象一下,如果得到票据说明苹果已经扣款成功,就在这时向服务器发送票据验证的时候出现来异常,这个时候可能网络突然断了,未把票据发送的服务器验证,导致明明已经扣了款,却没有收到相应的内购产品,出现了漏单问题。

所以如何解决此问题?解决流程如下

一:得到票据,立即保存本地,并向服务器验证

二:验证成功,删除本地保存数据。若未成功,再次验证重试。

三:APP重启时,如有本地票据则与服务器进行认证,若认证成功则删除票据。

四:若以上流程还未能解决漏单问题,则可在APP增加类似找回按钮,依据本地保存票据进行找回(流程三)。

注:服务器需建立表单记录票据数据,避免多次增加内购产品。

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

推荐阅读更多精彩内容

  • 一.总说内购的内容 协议、税务和银行业务 信息填写 内购商品的添加 添加沙盒测试账号 内购代码的具体实现 内购的注...
    默默_David阅读 3,719评论 0 6
  • 一.总说内购的内容 协议、税务和银行业务 信息填写 内购商品的添加 添加沙盒测试账号 内购代码的具体实现 内购的注...
    九洲仙人阅读 2,993评论 2 3
  • 在现实与虚构之间 跳跃着不安之书 所有的灵魂全凭虚构 所有的躯壳都是行尸走肉 天空是虚构的 都去冒险吧 不用绳索去...
    租了五颗星阅读 329评论 1 4
  • 《青石瓦》 ---無念 大雪迎面簌簌飘, 漫天飞扬静静享。 若问此刻天尚好, 青石瓦间尽知凉。
    無念儿阅读 323评论 0 0
  • 有一副漫画颇有意思,是一个讲述关于计划和过程的话题。图中有两个场景,第一场景中有一个我们暂且叫他小光的人,骑着单车...
    补拙莫如勤LV阅读 454评论 0 1