iOS内购审核被拒 错误状态码21007

被拒原因:在我们公司的测试服务器中,我们会连接苹果的测试服务器(https://sandbox.itunes.apple.com/verifyReceipt)验证。

在我们部署在线上的正式服务器中,我们会连接苹果的正式服务器(https://buy.itunes.apple.com/verifyReceipt )验证。

我们提交给苹果审核的是正式版,我们以为苹果审核时,我们应该连接苹果的线上验证服务器来验证购买凭证。苹果在审核App时,只会在sandbox环境购买,其产生的购买凭证,也只能连接苹果的测试验证服务器。但是审核的app又是连接的我们的线上服务器。所以我们这边的服务器无法验证通过IAP购买,造成我们app的又一次审核被拒。

苹果反馈的状态码:

  1. 21000 App Store无法读取你提供的JSON数据  
  2. 21002 收据数据不符合格式  
  3. 21003 收据无法被验证  
  4. 21004 你提供的共享密钥和账户的共享密钥不一致  
  5. 21005 收据服务器当前不可用  
  6. 21006 收据是有效的,但订阅服务已经过期。当收到这个信息时,解码后的收据信息也包含在返回内容中  
  7. 21007 收据信息是测试用(sandbox),但却被发送到产品环境中验证  
  8. 21008 收据信息是产品环境中使用,但却被发送到测试环境中验证 


接手的项目是外包项目,后端否认在sandbox环境下没有调用https://sandbox.itunes.apple.com/verifyReceipt


交涉无果只能在前端验证:


#pragma mark 客户端验证购买凭据

- (void)verifyTransactionResult

{

    // 验证凭据,获取到苹果返回的交易凭据

    // appStoreReceiptURL iOS7.0增加的,购买交易完成后,会将凭据存放在该地址

    NSURL *receiptURL = [[NSBundlemainBundle] appStoreReceiptURL];

    // 从沙盒中获取到购买凭据

    NSData *receipt = [NSDatadataWithContentsOfURL:receiptURL];

    // 传输的是BASE64编码的字符串

    /**

     BASE64 常用的编码方案,通常用于数据传输,以及加密算法的基础算法,传输过程中能够保证数据传输的稳定性

     BASE64是可以编码和解码的

     */

    NSDictionary *requestContents =@{

                                      @"receipt-data": [receiptbase64EncodedStringWithOptions:0]

                                      };

    NSError *error;

    // 转换为 JSON格式

    NSData *requestData = [NSJSONSerializationdataWithJSONObject:requestContents

                                                          options:0

                                                            error:&error];

    // 不存在

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

    

    // 发送网络POST请求,对购买凭据进行验证

    NSString *verifyUrlString;

#if (defined(APPSTORE_ASK_TO_BUY_IN_SANDBOX) && defined(DEBUG))

    verifyUrlString = @"https://sandbox.itunes.apple.com/verifyReceipt";

#else

    verifyUrlString = @"https://buy.itunes.apple.com/verifyReceipt";

#endif

    // 国内访问苹果服务器比较慢,timeoutInterval需要长一点

    NSMutableURLRequest *storeRequest = [NSMutableURLRequestrequestWithURL:[[NSURLalloc] initWithString:verifyUrlString]cachePolicy:NSURLRequestUseProtocolCachePolicytimeoutInterval:10.0f];

    

    [storeRequest setHTTPMethod:@"POST"];

    [storeRequest setHTTPBody:requestData];

    

    // 在后台对列中提交验证请求,并获得官方的验证JSON结果

    NSOperationQueue *queue = [[NSOperationQueuealloc] init];

    [NSURLConnectionsendAsynchronousRequest:storeRequestqueue:queue

                           completionHandler:^(NSURLResponse *response,NSData *data, NSError *connectionError) {

                               if (connectionError) {

                                   NSLog(@"链接失败");

                               } else {

                                   NSError *error;

                                   NSDictionary *jsonResponse = [NSJSONSerializationJSONObjectWithData:data options:0error:&error];

                                   if (!jsonResponse) {

                                       NSLog(@"验证失败");

                                   }

                                   

                                   //比对 jsonResponse中以下信息基本上可以保证数据安全

                                   /*

                                    bundle_id

                                    application_version

                                    product_id

                                    transaction_id

                                    */

                                   

                                   NSLog(@"验证成功");

                               }

                           }];

    

}




你可能感兴趣的:(iOS)