本篇文章主要介绍了" iOS内购-防越狱破解刷单",主要涉及到方面的内容,对于IOS开发感兴趣的同学可以参考一下:
---------------------------2018.10.16更新---------------------------最近我们公司丢单率上涨,尤其...
---------------------------2018.10.16更新---------------------------
最近我们公司丢单率上涨,尤其是10月份比9月份来说丢单率翻了3倍,和一些同行交流了一下,发现他们也是丢单量增加,初步推断可能是苹果iOS12的原因,某些情况下会有用户内购成功后,却返回的是订单失败,错误类型为SKErrorUnknown。目前客户端好像没办法去解决。如果有小伙伴和我一样也遇到过相同的问题话,请私信我下,我们都多互相交流一下。
---------------------------2018.10.16更新---------------------------
---------------------------以下为正文---------------------------
iOS内购开发大家一定不陌生,网上类似的文章能搜出千八百篇。大部分都是围绕着如何实现?如何防止漏单丢单说明的。很少有提及到越狱的,即使偶尔有一两篇说越狱,也是简单的三言两语说 为了安全,我们直接屏蔽了越狱手机的内购功能。巴拉巴拉... 以前我也是这么想的,直到上个周末发现我们的内购被破解了...才有了这篇文章。本篇文章就是来讲述越狱下的内购如何防止被破解。
首先我们先简单理一下整个内购的核心流程:
客户端发起支付订单
客户端监听购买结果
苹果回调订单购买成功时,客户端把苹果给的receipt_data和一些订单信息上报给服务器
后台服务器拿receipt_data向苹果服务器校验
苹果服务器向返回status结果,含义如下,其中为0时表示成功。
21000 App Store无法读取你提供的JSON数据
21002 收据数据不符合格式
21003 收据无法被验证
21004 你提供的共享密钥和账户的共享密钥不一致
21005 收据服务器当前不可用
21006 收据是有效的,但订阅服务已经过期。当收到这个信息时,解码后的收据信息也包含在返回内容中
21007 收据信息是测试用(sandbox),但却被发送到产品环境中验证
21008 收据信息是产品环境中使用,但却被发送到测试环境中验证
6.服务器发现订单校验成功后,会把这笔订单存起来,receipt_data用MD5值映射下,保存到数据库,防止同一笔订单,多次发放内购商品。
以上应该是主流的校验流程。当然客户端其中会插一些丢单漏单的逻辑校验,因为那些跟本篇文章无关,所以不在此展开。
从上面的流程可以看出,整个内购的核心其实就是receipt_data。苹果回调给客户端,客户端上报给服务器,服务器拿到后去向苹果服务器校验,苹果服务器再返回给我们服务器订单结果。其实严格来说,整个流程是没问题的。整个的漏洞是在最后一步上,【苹果服务器再返回给我们服务器订单结果】。receipt_data在越狱环境下是可以被插件伪造的,后台向苹果验证时,居然还能验证通过。是的,你没看错,苹果这里有个贼鸡儿坑的地方。这是最坑最坑的地方,伪造的receipt_data苹果校验也返回支付成功
如何解决?我们先来看下越狱订单和正常订单对比
越狱订单receipt_data向苹果服务器校验后如下: