iOS游戏使用苹果的IAP支付,客户端回调服务器之后,服务器收到之后如何做校验? 举报 理由 举报 取消 游戏做到支付这一步了,看了下iOS的支付,发现支付的回调是由游戏客户端发起的,这样服务器接到一个由客户端发过来的请求,如何校验啊,服务器也不能保证百分百处理成功,见过的做法都是由游戏服务器提供一个接口,由支付方回调的,这样比较合理。求指教 2017年12月25日 6 条回复 1164 次浏览 iOS,支付,游戏开发
回复 ( 6 )
IAP支付后的支付结果有效性验证主要涉及如下几方面:
1、防止IAP Tracker和IAP Free这样的越狱插件伪造交易凭证
要防止此类插件,一定要避免采用客户端自己验证交易凭证方式,只采用服务器验证方式。
2、服务器未收到客户端回调请求
由于客户端往服务器提交交易凭证时候,服务器有可能因网络等原因未接收到客户端请求,因此客户端对服务器端的回调最好用消息队列或sqlite之类进行本地持久化,建立对应的重试机制(例如应用启动时、请求失败后、定时检测),在请求成功后才删除。
3、客户端与服务器的请求响应报文被拦截篡改
由于通过修改WIFI DNS、Proxy等方式,很容易拦截并篡改客户端与服务器端的请求及验证结果,因此客户端与服务器间的通信一定要采用防篡改机制,例如对关键域采用MD5/SHA之类算法验签或数字签名等方式。
通信报文防篡改不要以为直接使用https就保证了数据的安全,一定要注意中间人攻击,要对服务器证书的合法性进行验证。
4、服务器验证
a、服务器在接收到客户端请求,验证自定义的签名有效性后,将请求数据存入数据库。
b、然后由服务器往app store服务器发送验证请求,接收到验证结果后,更新数据库状态。
c、服务器将验证结果按照自定义的格式签名,返回给客户端。
d、客户端收到结果后,一方面对返回结果验证签名,一方面主要对关键数据域要与本地数据逐项进行比对,例如user_id、product_id、purchase_date、transaction_id等,不要只比对state,避免验证漏洞。
自问自答了,客户端回调会带来一个凭证,游戏服务器拿到凭证之后,能做的也就是只能去苹果服务器验证一下这个凭证是否是有有效的,一条https的post请求,仅仅是验证是否有效,同时服务器处理完之后最好自己还要记一条数据,记录这个凭证已经处理过了,如果不这样处理被人破解就会被刷单
客户端在告诉服务器凭证的时候是不是也得告诉服务器订单号?然后服务器验证凭证后更新对应的订单。
但问题是我怎么能信任客户端传过来的订单呢?如果有人伪造订单号,虽然凭证是真是的,但是却更新了其它订单怎么办?
有没有比较好的解决方案?
支付完成后,- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions这个代理方法没有回调,但是用户已经扣费啦,这种情况你们遇到了没?
请请问如果服务器在请求苹果的那段时间抽风了 掉单了 有没有什么好的解决方法?
服务器验证完apple之后, 还要做一些验证比如