苹果支付IAP接入的那些隐藏坑

1,046 阅读3分钟

本文不讨论代码层面的接入方法,仅就一些容易被黑产等利用的方法,进行总结。

目前苹果已经开放了退款通知接口,开发者可以接入,针对退款的交易进行扣除金额或封号处理,那我就告诉你,这个东西如果做不好,那么可能被退款黑产或恶意玩家利用,然后免于惩罚。

不先创建订单,直接依据票据为准是否可行?

绝对不可行(特指贝聊的方案),此设计未考虑任何安全性,会让你在被黑产攻击时毫无办法,造成巨大损失。

那为啥很多人都说贝聊的方案?因为他发的文章多,转载多,内容多,实际看来是严重过度设计,想太多把自己绕进去了。

使用ApplicationUsername关联订单是否靠谱?

可能听很多人说了ApplicationUsername不靠谱,会返回(null),但是又不知道具体是什么情况。

简单来说,只要App在支付结果收到前退出,就会是(null),比如你这单因为客户连接苹果有问题,票据一直不发回,直到下次启动App注册了通知才收到,这时就一定是个(null),同理支付过程中App后台被杀、崩溃也会导致这个值一定是(null),所以说用ApplicationUsername和自己进程内关联没啥区别。

是否可以拒绝外币?

外币存在非常大的退款及坏账风险,但是就是不能拒绝,因为支付票据会被黑产在越狱环境下随意替换,这就是在App上检查了currencyCode并限制后,后台还是可以看到什么不知名小国家的地区付款的原因。

退款通知为啥先于订单校验?

我们正常理解的IAP流程:

创建订单(自身)->客户端发起支付->支付成功->自身服务器->苹果服务器验证->自身服务器->客户端

如发生退款后,处理对应的订单号关联的账户即可。

但是实际上是,订单验证请求可能在退款消息后到达,如果你没有保存所有退款的记录,仅处理了核销过的订单,此时就已经掉进坑里,因为退款成功后,苹果给的接口依然可以验证这个订单并且告诉你有效。这样账号退款也不会有任何惩罚。

核销晚于订单退款是甄别黑产库存系统的方法之一。

解决方法:记录所有退款,验证订单时先去查退款。

怎样减少坏账?

不管是用户申请退款,还是订单非法被取消,在开发者这边,都会体现为订单被退款,即为坏账。

说到这里,你需要知道啥是库存系统,即非法支付票据仓库,非法票据由黑卡、盗刷等方法生成,并被拦截存储下来(需越狱),在有买家需要代充时,代充会从库里取出来一个票据来替换票据来实现支付(需越狱),苹果会对这种Appstore账户进行风控禁止,但票据他们不会封,所以这个票据你验证是通过的,verifyReceipt接口任何字段都不会表示该订单无效,只能使用你App自身创建订单的时间来对比,通常库存系统的InApp支付时间会早于你订单创建的时间。

啥?你用的贝聊的方案直接收票据不先创订单?勇士请走好。

能否彻底解决掉单

如果要有较为严格的黑产限制,那么掉单是一定的,但不会有很多,完全可接受的范围内,正常用户可提供OrderId来进行补单。


如果你的App在商店的畅销榜排名较高,那么黑产基本一定会找上你,请务必做好防范,尽量多记录数据,做好预警封号等各种措施。

最后说一句:SBIAP,狗都不用