应用内购买验证收据错误

Posted

技术标签:

【中文标题】应用内购买验证收据错误【英文标题】:in-app purchase verify receipt error 【发布时间】:2012-02-25 11:58:07 【问题描述】:

我创建了一个使用应用内购买的应用。使用我的测试用户帐户进行测试时交易已成功完成,但在沙箱中验证收据时出现错误:url:https://sandbox.itunes.apple.com/verifyReceipt

- (void)recordTransaction:(SKPaymentTransaction *)transaction

    [[SKPaymentQueue defaultQueue] restoreCompletedTransactions];

    if ([transaction.payment.productIdentifier isEqualToString:@"com.udayKalangi.hansiMazak.hindijokes1"])
    
        [[NSUserDefaults standardUserDefaults] setValue:transaction.transactionReceipt forKey:@"proUpgradeTransactionReceipt" ];
        [[NSUserDefaults standardUserDefaults] synchronize];
        NSData *receiptData = [NSData dataWithData:transaction.transactionReceipt];
        NSString *recieptString = [self  base64forData:receiptData];
        NSLog(@"JSON Created");
        urlData = [[NSMutableData data] retain];
        NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"https://sandbox.itunes.apple.com/verifyReceipt"]];
        [request setHTTPMethod:@"POST"];
        [request setHTTPBody:[recieptString dataUsingEncoding:NSUTF8StringEncoding]];
        NSLog(@"will create connection");
        [[NSURLConnection alloc] initWithRequest:request delegate:self];    
    

我收到了回复:

url 数据:"status":21002, "exception":"java.lang.NullPointerException"

【问题讨论】:

【参考方案1】:

对不起,你做错了。

首先,根据http://developer.apple.com/library/ios/#documentation/NetworkingInternet/Conceptual/StoreKitGuide/VerifyingStoreReceipts/VerifyingStoreReceipts.html,您需要将base64收据数据设置为'receipt-data',然后以JSON格式发布以进行验证。你似乎没有这样做。

但最重要的是,您并不是要在设备上验证收据,这样做毫无意义。您的目的是将数据发送到您的服务器,并让它与 Apple 为您验证数据。在设备上进行验证实际上并不提供任何验证。验证收据的目的是确保它没有被篡改,即,如果有人破坏了您的应用并能够提供篡改的收据,他们就能够绕过对同一张收据的验证。

【讨论】:

设备上的验证如何没有帮助?用苹果服务器验证还是用你自己的服务器用苹果验证有什么区别?它仍在应用中完成。 正是因为这个原因:tuaw.com/2012/07/13/… 在这种情况下,黑客已将来自 Apple 服务器的请求从设备重定向到他们自己的服务器。所以他们也可以提供假收据。但是,如果您在自己的服务器上验证收据,黑客就无法重定向或更改您服务器的配置,因此您知道您(很可能)确实获得了 Apple 的服务器并且可以信任收据验证。 确保您也将加密签名的“是”或“否”发送回您的应用程序,否则黑客也可以将设备重定向到您的服务器之外。

以上是关于应用内购买验证收据错误的主要内容,如果未能解决你的问题,请参考以下文章

Firebase Firestore +云功能服务器端验证应用内购买收据(Swift + NodeJS)

Firebase Firestore + Cloud Function 服务器端验证应用内购买收据(Swift + NodeJS)

iOS:React Native:应用内购买:收据验证

iTunes 应用内购买收据验证 - 模糊 JSON

Apple 应用内购买验证收据返回 xml

iOS 7 本地(设备上)收据验证和应用内购买检查