【问题标题】:StoreKit verification error 21002: The data in the receipt-data property was malformedStoreKit 验证错误 21002:receipt-data 属性中的数据格式错误
【发布时间】:2012-12-05 05:52:34
【问题描述】:

在 iPhone 4/iOS 4 设备上,沙盒 App Store 在验证期间报告此错误:

21002:receipt-data 属性中的数据格式错误。

在 iPhone 5/iOS 6 设备上,相同的代码可以正常工作(状态 == 0,收据返回)没有任何问题。

我重新启动了设备,确保 Apple ID 已注销,甚至创建了一个新的测试用户帐户。结果相同。有什么想法吗?

【问题讨论】:

    标签: ios testing app-store storekit


    【解决方案1】:

    此错误表示您创建用于发送验证的 JSON 对象格式不正确。

    {
        "receipt-data" : "(receipt bytes here)"
    }
    

    所以我的建议是在 iPhone 4/iOS 4 上进行相同的调试。如果您使用 Json 框架创建 JSON 对象(用于收据验证),它将仅适用于 iOS 5.0 及更高版本。

    添加我已经实现了几个月的代码我使用 SBJson 编写了 N 解析。

    NSString *base64TxReceiptStr=[NSData Base64Encode:transaction.transactionReceipt];
    
    SBJsonWriter *writer = [[SBJsonWriter alloc] init];
    NSDictionary *command = [NSDictionary dictionaryWithObjectsAndKeys:
                             base64TxReceiptStr, @"receipt-data",
                             nil];
    NSString *jsonString = [writer stringWithObject:command];
    NSData *requestBody=[jsonString dataUsingEncoding:NSUTF8StringEncoding];
    NSMutableURLRequest *txReceiptVerificationRequest=[[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:@"https://sandbox.itunes.apple.com/verifyReceipt"]];
    [txReceiptVerificationRequest setHTTPBody:requestBody];
    [txReceiptVerificationRequest setHTTPMethod:@"POST"];
    
    NSURLResponse *response=nil;
    NSError *error=nil;
    NSData *responseData=[NSURLConnection sendSynchronousRequest:txReceiptVerificationRequest returningResponse:&response error:&error];
    NSString * receivedString=[[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
    
    
    SBJsonParser *parser = [[SBJsonParser alloc] init];
    NSDictionary *aobject =[parser objectWithString:receivedString];`
    

    【讨论】:

    • 谢谢。我没有意识到 NSJSONSerialization 是 iOS5+; dataWithJsonObject: 方法返回 nil!没有例外,没有崩溃。
    • 这也发生在具有完美 JSON 格式的新 iOS6 越狱设备上。出现“格式错误”的情况是因为越狱收据没有由 Apple 签名(取而代之的是收据有一个假签名,它是某个时间戳的 base64 哈希)。
    • 顺便说一句,如果你曾经使用 ' 而不是 " 它将失败并显示相同的状态代码
    【解决方案2】:

    对于您的沙盒环境,请使用:https://sandbox.itunes.apple.com/verifyReceipt

    实际验证使用:https://buy.itunes.apple.com/verifyReceipt

    您可以在 Apple 的官方页面上查看。

    【讨论】:

      猜你喜欢
      • 2015-12-26
      • 1970-01-01
      • 2019-12-18
      • 1970-01-01
      • 2011-02-11
      • 1970-01-01
      • 2015-11-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多