內購的前提:
有個人開發者賬號;開通了銀行業務;在開發者后臺添加了內購產品;創建了相應的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"http://驗證上架的
#define ITMS_SANDBOX_VERIFY_RECEIPT_URL? ? @"https://sandbox.itunes.apple.com/verifyReceipt"http://驗證沙盒測試的
前端實例:
/*
驗證購買憑證一般都是在服務端進行驗證
*/
// 發送網絡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(@"驗證成功");
}