如网友的提问:
亲,我想问一下为什么我在沙盒下真机测试可以调起内购,为什么app上线了调不起来内购了?
操作前提:
1.使用沙河测试账号 进行支付
如何申请沙河测试账号 这里就不啰嗦了 自己百度一下 网上太多了
2.使用正式的环境进行验证 如图
确保这两点操作之后就可以调起支付
重点:
在验证返回的结果中 捕捉结果字典如出现以下 结果就表示 你的内购在上线之后可以正常使用了
最后附上验证的代码
//沙盒测试环境验证
#define SANDBOX @"https://sandbox.itunes.apple.com/verifyReceipt"
//正式环境验证
#define AppStore @"https://buy.itunes.apple.com/verifyReceipt"
// 验证购买 -- 虽然苹果在iOS7提升了购买凭据的安全性,但是处于金钱考虑,购买完成后,一定要做凭据的验证工作
- (void)completeTransaction:(SKPaymentTransaction *)transaction {
[FSXBobble showRoundProgressWithTitle:@"正在确认订单,请稍等"];
// 验证凭据,获取到苹果返回的交易凭据
// appStoreReceiptURL iOS7.0增加的,购买交易完成后,会将凭据存放在该地址
NSURL *receiptURL = [[NSBundle mainBundle] appStoreReceiptURL];
// 从沙盒中获取到购买凭据
NSData *receiptData = [NSData dataWithContentsOfURL:receiptURL];
// 发送网络POST请求,对购买凭据进行验证
//测试验证地址:https://sandbox.itunes.apple.com/verifyReceipt
//正式验证地址:https://buy.itunes.apple.com/verifyReceipt
NSURL *url = [NSURL URLWithString:AppStore];
NSMutableURLRequest *urlRequest =
[NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10.0f];
urlRequest.HTTPMethod = @"POST";
NSString *encodeStr = [receiptData base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed];
NSString *payload = [NSString stringWithFormat:@"{\"receipt-data\" : \"%@\"}", encodeStr];
NSData *payloadData = [payload dataUsingEncoding:NSUTF8StringEncoding];
urlRequest.HTTPBody = payloadData;
// 提交验证请求,并获得官方的验证JSON结果 iOS9后更改了另外的一个方法
NSData *result = [NSURLConnection sendSynchronousRequest:urlRequest returningResponse:nil error:nil];
// 官方验证结果为空
if (result == nil) {
FSXLog(@"验证失败");
[FSXBobble showErrorWithTitle:@"..苹果验证失败.."];
_instance = nil;
return;
}
// 启用正式地址时__采用沙河账号进行购买 status = 21007 表示内购在app上线后也可以使用
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:result options:NSJSONReadingAllowFragments error:nil];
if (dict != nil) {
// 比对字典中以下信息基本上可以保证数据安全
// bundle_id , application_version , product_id , transaction_id
FSXLog(@"验证成功!购买的商品是:%@", @"_productName");
[FSXBobble showSuccessWithTitle:@"支付成功"];
_instance = nil;
}
}