iOS游戏使用苹果的IAP支付,客户端回调服务器之后,服务器收到之后如何做校验?

理由
举报 取消

游戏做到支付这一步了,看了下iOS的支付,发现支付的回调是由游戏客户端发起的,这样服务器接到一个由客户端发过来的请求,如何校验啊,服务器也不能保证百分百处理成功,见过的做法都是由游戏服务器提供一个接口,由支付方回调的,这样比较合理。求指教

2017年12月25日 6 条回复 1164 次浏览

发起人:汪周洋 初入职场

我从来都没说过自己颜值高,都是大家说的

回复 ( 6 )

  1. 梁川
    理由
    举报 取消

    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,避免验证漏洞。

  2. 汪周洋
    理由
    举报 取消

    自问自答了,客户端回调会带来一个凭证,游戏服务器拿到凭证之后,能做的也就是只能去苹果服务器验证一下这个凭证是否是有有效的,一条https的post请求,仅仅是验证是否有效,同时服务器处理完之后最好自己还要记一条数据,记录这个凭证已经处理过了,如果不这样处理被人破解就会被刷单

  3. argb
    理由
    举报 取消

    客户端在告诉服务器凭证的时候是不是也得告诉服务器订单号?然后服务器验证凭证后更新对应的订单。

    但问题是我怎么能信任客户端传过来的订单呢?如果有人伪造订单号,虽然凭证是真是的,但是却更新了其它订单怎么办?

    有没有比较好的解决方案?

  4. 贾自杰
    理由
    举报 取消

    支付完成后,- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions这个代理方法没有回调,但是用户已经扣费啦,这种情况你们遇到了没?

  5. 行舟
    理由
    举报 取消

    请请问如果服务器在请求苹果的那段时间抽风了 掉单了 有没有什么好的解决方法?

  6. Climber Da
    理由
    举报 取消

    服务器验证完apple之后, 还要做一些验证比如

    • 可以验证bid, product_id 字段
    • 验证时间,凭证的时间以及创建订单的时间
    • 验证receipt是否已经处理过了

我来回答

Captcha 点击图片更换验证码