iOS 内购沙盒本地验证报错 21003

对接苹果内购时,本地沙盒验证,报错21003,怎么办???


截屏2024-09-25 18.07.46.png

别急~~~

打开苹果开发者后台,https://appstoreconnect.apple.com/

进入APP信息,滚动到最下边,找到App专用共享密钥,添加共享密钥


61727259053_.pic.jpg

复制共享密钥

撸代码


#pragma mark 验证购买凭据
/**
 *  验证购买凭据
 *
 *  @param ProductID 商品ID
 */
- (void)verifyPruchaseWithID:(NSString *)ProductID
{
    // 验证凭据,获取到苹果返回的交易凭据
    // appStoreReceiptURL iOS7.0增加的,购买交易完成后,会将凭据存放在该地址
    NSURL *receiptURL = [[NSBundle mainBundle] appStoreReceiptURL];
    // 从沙盒中获取到购买凭据
    NSData *receiptData = [NSData dataWithContentsOfURL:receiptURL];
    
    // 发送网络POST请求,对购买凭据进行验证
    //In the test environment, use https://sandbox.itunes.apple.com/verifyReceipt
    //In the real environment, use https://buy.itunes.apple.com/verifyReceipt
    // Create a POST request with the receipt data.
    NSURL *url = [NSURL URLWithString:checkURL];
    
    NSLog(@"checkURL:%@",checkURL);
    
    // 国内访问苹果服务器比较慢,timeoutInterval需要长一点
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:20.0f];
    
    request.HTTPMethod = @"POST";
    
    // 在网络中传输数据,大多情况下是传输的字符串而不是二进制数据
    // 传输的是BASE64编码的字符串
    /**
     BASE64 常用的编码方案,通常用于数据传输,以及加密算法的基础算法,传输过程中能够保证数据传输的稳定性
     BASE64是可以编码和解码的
     */
    NSString *encodeStr = [receiptData base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed];
    
    NSString *payload = [NSString stringWithFormat:@"{\"receipt-data\" : \"%@\", \"password\" : \"这里是你的共享密钥\"}", encodeStr];
    NSData *payloadData = [payload dataUsingEncoding:NSUTF8StringEncoding];
    
    request.HTTPBody = payloadData;
    
    // 提交验证请求,并获得官方的验证JSON结果
    NSData *result = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
    
    // 官方验证结果为空
    if (result == nil) {
        NSLog(@"11-------验证失败");
        dispatch_async(dispatch_get_main_queue(), ^{
            [DZTools showNOHud:LocalizedString(@"验证失败") delay:1.5];
        });
        //验证失败,通知代理
//        [SVProgressHUD dismiss];
//        
//        [SVProgressHUD showErrorWithStatus:@"验证失败"];
//        [SVProgressHUD dismissWithDelay:1.5f];
        
        
    }
    
    NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:result
                                                         options:NSJSONReadingAllowFragments error:nil];
    
    //NSLog(@"RecivedVerifyPruchaseDict:%@", dict);
    
    if (dict != nil) {
        NSLog(@"11-------验证成功");
        // bundle_id&application_version&product_id&transaction_id
        [self.delegate IAPToolBoughtProductSuccessedWithProductID:ProductID
                                                            andInfo:dict];
        
        [DZTools hideHud];
//        [SVProgressHUD dismiss];
                
    }else{
        
        NSLog(@"11-------验证失败");
        dispatch_async(dispatch_get_main_queue(), ^{
            [DZTools showNOHud:LocalizedString(@"验证失败") delay:1.5];
        });
        
        //验证失败,通知代理
//        [SVProgressHUD dismiss];
//
//        [SVProgressHUD showErrorWithStatus:@"验证失败"];
//        [SVProgressHUD dismissWithDelay:1.5f];
 
    }
}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容