内购的前提:
有个人开发者账号;开通了银行业务;在开发者后台添加了内购产品;创建了相应的Bundle id 和证书;
第一,添加StoreKit.framework 框架;图1

第二,配置相应的Bundile Indentfier 和证书;图2

第三,#import <StoreKit/StoreKit.h>,添加协议SKPaymentTransactionObserver,SKProductsRequestDelegate
根据内购产品的id查询可以购买的产品:
NSSet * nsset = [NSSet setWithArray:arrProduct];
SKProductsRequest * request = [[SKProductsRequest alloc]initWithProductIdentifiers:nsset];
request.delegate = self;
[request start];
协议回调:
#pragma mark -- SKProductsRequestDelegate delegate
-(void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response{
NSArray * product = response.products;
if (product.count == 0) {//没有购买内购产品
[self.payDelegate onGetFail:non_Products];
}else{//返回内购产品
[self.payDelegate onGetSuccess:product];
}
}
-(void)request:(SKRequest *)request didFailWithError:(NSError *)error{
[self.payDelegate onGetFail:fail_Products];//获取有错
}
-(void)requestDidFinish:(SKRequest *)request{
//请求完成
}
第四,购买产品,product是 SKProduct 类型
-(void)getAppStorePay:(id)product{
[[SKPaymentQueue defaultQueue] removeTransactionObserver:self];
[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
SKPayment * payment = [SKPayment paymentWithProduct:product];
[[SKPaymentQueue defaultQueue] addPayment:payment];
}
购买成功或者失败的回调:
#pragma mark -- SKPaymentTransactionObserver delegate//监听购买结果-(void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray*)transactions{
for(SKPaymentTransaction * tran in transactions){
// NSLog(@"购买状态%ld",(long)tran.transactionState);
if (tran.transactionState == SKPaymentTransactionStatePurchased) {
// NSLog(@"购买成功");
NSURL * receiptURL = [[NSBundle mainBundle] appStoreReceiptURL];
// 从沙盒中获取到购买凭据
NSData * receiptData = [NSData dataWithContentsOfURL:receiptURL];
NSString * encodeStr = [receiptData base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed];
[self.payDelegate onAppStorePaySuccess:encodeStr];
[[SKPaymentQueue defaultQueue] finishTransaction:tran];
}else if (tran.transactionState == SKPaymentTransactionStateRestored){
// NSLog(@"重新购买");
[[SKPaymentQueue defaultQueue] finishTransaction:tran];
}else if (tran.transactionState == SKPaymentTransactionStateFailed){
// NSLog(@"购买失败");
[self.payDelegate onAppStorePayFail];
[[SKPaymentQueue defaultQueue] finishTransaction:tran];
}
else if (tran.transactionState == SKPaymentTransactionStatePurchasing){
// NSLog(@"正在购买");
}else{
// NSLog(@"排队中");
}
}
}
//交易结束
- (void)completeTransaction:(SKPaymentTransaction *)transaction{
// NSLog(@"交易完成");
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
}
- (void)dealloc{
[[SKPaymentQueue defaultQueue] removeTransactionObserver:self];
}
获取到的购买凭证一般是放在后台进行验证:
#define ITMS_PROD_VERIFY_RECEIPT_URL @"https://buy.itunes.apple.com/verifyReceipt"//验证上架的
#define ITMS_SANDBOX_VERIFY_RECEIPT_URL @"https://sandbox.itunes.apple.com/verifyReceipt"//验证沙盒测试的
前端实例:
/*
验证购买凭证一般都是在服务端进行验证
*/
// 发送网络POST请求,对购买凭据进行验证
NSURL *url = [NSURL URLWithString:ITMS_SANDBOX_VERIFY_RECEIPT_URL];
// 国内访问苹果服务器比较慢,timeoutInterval需要长一点
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10.0f];
request.HTTPMethod = @"POST";
NSString *payload = [NSString stringWithFormat:@"{\"receipt-data\" : \"%@\"}", receiptData];
NSData *payloadData = [payload dataUsingEncoding:NSUTF8StringEncoding];
request.HTTPBody = payloadData;
// 提交验证请求,并获得官方的验证JSON结果
NSData *result = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
// 官方验证结果为空
if (result == nil) {
NSLog(@"验证失败");
}
NSDictionary * dict = [NSJSONSerialization JSONObjectWithData:result options:NSJSONReadingAllowFragments error:nil];
if (dict != nil) {
NSLog(@"验证成功");
}
网友评论