1 简介
本篇将对苹果内购中出现的一些细节问题进行归纳总结,各位开发者在使用苹果内购过程中可以参考。
其他章节:苹果内购那些事儿(一)
2 丢单
这里说到的丢单,其实就是玩家付了钱,没有收到道具的一种现象。(PS:没付钱的单子,就不要来捣乱了,哈哈。)
上一篇(苹果内购那些事儿(一)已经对丢单做了简单说明。
2.1 什么情况会丢单
那么什么情况会导致丢单呢?以下我来列举几种情况:
- 网络极差的情况,用户付了钱,游戏客户端将要把这个消息同步到服务器时,发生了超时。
- 服务器出现了问题,用户付了钱,游戏客户端请求游戏服务器发货,一直返回错误
等等…诸如此类情况,都会产生丢单,而且是不可避免的。
产生丢单并不可怕,关键是要进行自动补单操作。那么该如何补单呢?
3 补单
补单其实就是针对那些出现问题的订单,进行查询,修改,使其变成正常订单。
3.1 订单查询
IAP支付本身并不提供直接查询订单的接口,我们可以间接进行查询订单。
- 游戏启动以后,第一次调用
[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
时,苹果内购系统自身会进行检查,如果有未完成订单,- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transaction
会自动执行,利用这一机制可以实现查询,然而只是在第一次调用时有效,后续无效 - 游戏内多次查询订单,既然第一种方法无法做到多次查询,我们可以考虑一下的方法
NSArray *arr = [[SKPaymentQueue defaultQueue] transactions]; [self paymentQueue:(SKPaymentQueue *)queue updatedTransactions:arr]
使用以上两种方法已经可以实现订单的查询操作,但是需要注意这两种方法是有依赖关系的,第一次查询必须使用第一种方法,后续使用第二种方法查询;如果只是使用第二种方法,查询订单一直为空。
3.2 查询时机
有了以上的查询方法,接下来的问题就变成了什么时候查询,这里我给出两种查询时机:
- 轮询查询。每隔5s 或者 5min等,可以根据自己的需求,去定时查询是否有丢单现象
- 机动查询。根据项目需求,在某些事件发生时进行查询,比如用户登录成功。
4 IAP内购中坏账怎么来
坏账嘛,其实就是苹果结算的时候打款给开发者,跟自己平台统计的金额不一样,当然,大部分情况下都是钱少了。那么为什么会出现这种情况呢,难道真的是苹果爸爸多扣了吗?下面我们一一来进行对照,看看你们有没有中招。
4.1 36技术
如果你还不知道什么是36技术,那我可以简单的说下,苹果为了用户体验,规定30元以下的产品,用户购买成功以后,会立即返回支付成功,支付金额会延迟扣除。好了问题来了,既然是延迟扣除,很多人就钻了这个空子,导致扣款无法成功。这一问题开发者并不会知晓,也无从知晓,所以道具卖出去了,钱没收到。
也许,你会说苹果难道就不处理这种情况吗?苹果处理的,在扣款不能成功以后,该appid会被加入内购黑名单;然而强大的人类可以分分钟钟伪造出多个appid,多个虚拟银行卡。
4.2 汇率问题
这里先说一个事情,苹果内购商品的价格和货币类型,是根据购买者账号所在国家地区决定的,如你的是美国appid账号,那么你购买的时候需要支付美元。
现在的问题是,不同国家地区之间的汇率是经常变化的,甚至会出现大范围的波动;然而苹果内部也要一套汇率转换机制,该机制并不因为国家地区之间的货币汇率波动而改变,好了这个漏洞你明白了吧。。。
4.3 黑客进攻
黑客进行网络进攻,拦截服务器和客户端之间协议,伪造数据,多次请求服务器发货。这一过程根本就没有付款,黑客拦截协议以后,完成下单过程,然后利用之前付过款的凭证,要求发货。这一过程中,客户端和服务器应该协商好加密协议,另外服务器应该逐步进行校验,确保该条数据有效。
4.4 伪造凭证
好了,上面三种看起来好像还比较花时间,才能完成这个坏账。下面这种可以说是一劳永逸,伪造凭证。技术人员研究苹果相关的算法,自己可以产生苹果支付的凭证,而且可以通过苹果的验证。头大了吧。。。怎么搞。。。哈哈 。。
其实,也是有办法的。多重加密认证验证,以下有几种建议的校验方法:
- 利用applicationUserName绑定自己的订单信息
- 验证凭证会返回应用相关信息,商品相关信息,逐一进行验证
- 客户端服务器协定加密方法
好了,你中招了吗??