对接苹果内购时,本地沙盒验证,报错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];
}
}