收据验证不正确

Receipt validation is incorrect

我已经在沙盒环境下的可消费类型的 IAP 上进行了测试。我想确定我购买的商品是否有效。但结果始终是 return,状态为“21004”。我对共享秘密不做任何事情。所以你可以看看我在成功购买商品时跟随苹果的示例代码:

- (void)verifyStatus:(SKPaymentTransaction *)transaction {

     NSData *receiptData = [NSData dataWithContentsOfURL:[[NSBundle mainBundle] appStoreReceiptURL]];
     NSError *receiptError;
     BOOL isPresent = [[[NSBundle mainBundle] appStoreReceiptURL] checkResourceIsReachableAndReturnError:&receiptError];
     if (!isPresent) {
         NSLog(@"Validation failed");
     } 
     NSString *receiptStr = [receiptData base64EncodedStringWithOptions:0];
     NSDictionary *requestContents = @{@"receipt-data":receiptStr};
     NSData *requestData = [NSJSONSerialization dataWithJSONObject:requestContents
                                                      options:0
                                                        error:nil];

     if (!requestData) { /* ... Handle error ... */ }

     NSURL *storeURL = [NSURL URLWithString:@"https://sandbox.itunes.apple.com/verifyReceipt"];
     NSMutableURLRequest *storeRequest = [NSMutableURLRequest requestWithURL:storeURL];
     [storeRequest setHTTPMethod:@"POST"];
     [storeRequest setHTTPBody:requestData];

     NSOperationQueue *queue = [[NSOperationQueue alloc] init];
     [NSURLConnection sendAsynchronousRequest:storeRequest queue:queue
                       completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
                           if (connectionError) {
                               /* ... Handle error ... */
                           } else {
                               NSError *error;
                               NSDictionary *jsonResponse = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];
                               NSLog(@"Respond : %@",jsonResponse);
                               if (!jsonResponse) { /* ... Handle error ...*/ }
                               /* ... Send a response back to the device ... */
                           }
}];

}

我遇到了什么问题?请分享您的经验。谢谢

请尝试以下 SECRECT KEY 的代码和步骤。

 #define SHARED_SECRET @"SECRECT KEY"

-(void)checkReceipt {
    // verifies receipt with Apple
    NSError *jsonError = nil;

    NSString *receiptBase64 = [receiptData base64EncodedStringWithOptions:0];//receiptData NSData for validate Receipt
    NSLog(@"Receipt Base64: %@",receiptBase64);

    NSData *jsonData = [NSJSONSerialization dataWithJSONObject:[NSDictionary dictionaryWithObjectsAndKeys:
                                                                receiptBase64,@"receipt-data",
                                                                SHARED_SECRET,@"password",
                                                                nil]
                                                       options:NSJSONWritingPrettyPrinted
                                                         error:&jsonError
                        ];
    NSLog(@"%@",jsonData);
    NSError * error=nil;
    NSDictionary * parsedData = [NSJSONSerialization JSONObjectWithData:jsonData options:kNilOptions error:&error];
    NSLog(@"%@",parsedData);
    NSLog(@"JSON: %@",[[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]);
    // URL for sandbox receipt validation; replace "sandbox" with "buy" in production or you will receive
    // error codes 21006 or 21007
    NSURL *requestURL = [NSURL URLWithString:@"https://sandbox.itunes.apple.com/verifyReceipt"];

    NSMutableURLRequest *req = [[NSMutableURLRequest alloc] initWithURL:requestURL];
    [req setHTTPMethod:@"POST"];
    [req setHTTPBody:jsonData];


    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    [NSURLConnection sendAsynchronousRequest:req queue:queue
                           completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
                               if (connectionError) {
                                   /* ... Handle error ... */
                               } else {
                                   NSError *error;
                                   NSDictionary *jsonResponse = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];
                                   NSLog(@"Respond : %@",jsonResponse);
                                   if (!jsonResponse) { /* ... Handle error ...*/ }
                                   /* ... Send a response back to the device ... */
                               }
                           }];

}

您需要使用从 iTunes Connect.sample 获得的密钥更改 "SECRECT KEY" 看起来像 39fkjc38jd02mg72k9cn29dfkm39fk00

下面是create/view Secreate Key的步骤。

Login into iTunes Connect -> My Apps > Select your app > In-App Purchases > View or generate a shared secret.