被拒原因:在我们公司的测试服务器中,我们会连接苹果的测试服务器(https://sandbox.itunes.apple.com/verifyReceipt)验证。
在我们部署在线上的正式服务器中,我们会连接苹果的正式服务器(https://buy.itunes.apple.com/verifyReceipt )验证。
我们提交给苹果审核的是正式版,我们以为苹果审核时,我们应该连接苹果的线上验证服务器来验证购买凭证。苹果在审核App时,只会在sandbox环境购买,其产生的购买凭证,也只能连接苹果的测试验证服务器。但是审核的app又是连接的我们的线上服务器。所以我们这边的服务器无法验证通过IAP购买,造成我们app的又一次审核被拒。
苹果反馈的状态码:
接手的项目是外包项目,后端否认在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(@"验证成功");
}
}];
}