IAP Receipt Validation on iOS 学习总结

之前看 http://developer.apple.com/library/ios/#releasenotes/StoreKit/IAP_ReceiptValidation/_index.html   进行的归纳总结,还不是很透彻,需要再次深入学习。

一、IAP特点

1.IAP使得用户无需离开软件,便可无缝升级软件功能或扩充内容。 
2. IAP支持付费后下载,所以可以有效的防止盗版。 
3. 开发者无需额外推出试玩版本游戏,直接在免费版本中加入IAP,允许用户付费升级即可,节约开发成本。 
4. 开发者可以无限推出某个App的内容扩展,同时保证持续的收入。 
5. IAP的出现形式多种多样,多见于:打开某功能(如Push);下载新游戏地图;解锁软件中的新内容等等。 
6. IAP购买符合AppStore基本付费策略,玩家一次付款后,可以无限制多次下载IAP内容,不会重复扣费。 
7. 购买IAP内容所使用的账户必须和下载软件本体的账户一致。

8. 和 App Store 中同样的商业条款。您将收到您的程序中付款项价格的 70%,按月付款 — 没有额外的信用卡费用。


二、IAP漏洞(iOS5及以下)

使用者可以透过 In-App Proxy 绕过App 的 IAP机制,让App 误以为已经进行付費进而免费享受付費內容,由此给开发者造成损失。


三、漏洞修复方案(iOS6)

通过苹果的收据验证系统建立保护机制。
1、   App通过连接个人服务器进行验证的影响
   当连接服务时,可能会遭到相思的攻击。
 使用“加密技术”来确保App是连接到个人服务器,并且个人服务器是与App Store服务器相连。
(可利用“缓解策略”作为起点)
2、   App通过连接到App Store服务器执行验证的影响
  若App从设备直接连接到App Store服务器,那么App会受到这个漏洞的影响。解决方案就是检查如下的信息:
1) 用于连接到App Store服务器的SSL证书是一个EV证书。
2) 从验证返回的信息和SKPayment对象的信息相符合。
3) 收据具有一个有效的签名。
4) 新的事务有一个独一无二的事务ID。
3、如何验证已完成的事务
1)消耗:
若以保存了收据(无论是在设备还是在服务器中),执行你的“缓解策略”之后再次验证收据。若你未保存收据,则无法验证以前的事务,无法采取任何行动。
2)非自耗:
抛开当前的收据,执行恢复操作并验证新的收据。避免在此过程中,重新下载的内容已经在设备上。

4、代码清单(缓解策略)

注意:此清单中使用的如下符号——

kSecTrustInfoExtendedValidationKey 
SecTrustCopyInfo
并非公共API。App仅在此目的时被允许使用它们。

将代码加入到你的项目中:

1)下载压缩文件。
2) 项目中加入以下文件——
 VerificationController.h   VerificationController.m 
3)连接 Securityframework
4)提供了一个Base64的编码和解码器,当验证成功时执行。


四、产品防护

https://developer.apple.com/library/ios/#documentation/NetworkingInternet/Conceptual/StoreKitGuide/VerifyingStoreReceipts/VerifyingStoreReceipts.html
http://www.himigame.com/iphone-cocos2d/673.html
1、IAP Cracker插件
 App Store的付流程其方式是当用费产购买IAP Cracker返回一个购买成功的消息无需白了post数据App Store都没有!),然后我们App收到假的交易成功的消息直接加装加各种….
 
2、IAP Cracker(下载 json_base.rar
在付费代码中加入进一步的验证判断:

 
- (void) paymentQueue:(SKPaymentQueue*) queueupdatedTransactions: (NSArray *)transactions//交易结果
{
    for (SKPaymentTransaction *transaction in transactions)
    {
        switch (transaction.transactionState)
        {
            case SKPaymentTransactionStatePurchased://交易完成
                 if([self putStringToItunes:transaction.transactionReceipt]){
                     //这里给用户添加钱阿,装备阿什么的
                 }
                   break;
             ......代码省略
         }
     }
}

putStringToItunes函数

1)首先我们将传入的收据data类型变量进行base64转换成string类型

2)然后将此收据以json的形式发送给appstore进行验证!这里注意!一定要以json形式发送,否则appstore server端不识别!

3)最后再次利用jsonappstore server返回的字段json数据行解析只需要解析出 status keyvalue即可

appstore验证收据正确解析出来的 statuskeyvalue0()


其他文章参考:

http://www.himigame.com/iphone-cocos2d/673.html






你可能感兴趣的:(iap)