內(nèi)購(gòu)IAP

一,引入 storekit.framework 和 #import并且實(shí)現(xiàn)代理SKProductsRequestDelegate,SKPaymentTransactionObserver

二,在自己服務(wù)器上面獲得商品信息,也可以向appStore發(fā)送請(qǐng)求詢問(wèn)產(chǎn)品信息。

在向appStore后臺(tái)發(fā)送請(qǐng)求之前需要判斷當(dāng)前設(shè)備是否支持購(gòu)買:(此段代碼一般寫在ViewDidLoad)

{

? ? ? ? ? ? ?if ([self isAllowPayMent]) {

? ? ? ? ? ? ? ? ? ? ? NSLog(@"app 用戶允許支付");

? ? ? ? ? ? ? ? ? ? ? [self getProductInfo];

? ? ? ? ? ? ? }else{

? ? ? ? ? ? ? NSLog(@"app 用戶不允許支付");

}

// 監(jiān)聽(tīng)購(gòu)買結(jié)果

[[SKPaymentQueue defaultQueue] addTransactionObserver:self];

}

//判斷是否支持支付的方法

- (BOOL)isAllowPayMent

{

return [SKPaymentQueue canMakePayments];

}

//請(qǐng)求appStore產(chǎn)品信息

- (void)getProductInfo

{

NSSet * set = [NSSet ?setWithObjects:@"XXXX",@"XXXX",@"XXXX",nil];(set集里面為開發(fā)中中心后臺(tái)審核通過(guò)的產(chǎn)品名稱)

SKProductsRequest * request = [[SKProductsRequest alloc] ?initWithProductIdentifiers:set];

? ? ? request.delegate = self;

? ? ? [request start];

}

//SKProductsRequest的返回代理方法

-(void)productsRequest:(SKProductsRequest*)request didReceiveResponse:(SKProductsResponse *)response {

? ?NSArray *myProduct = response.products;

? ? ? ? ?if (myProduct.count == 0) {

? ? ? ? ? ? ? ? NSLog(@"無(wú)法獲取產(chǎn)品信息,購(gòu)買失敗。");

? ? ? ? ? ? ? ?return;

? ? ? ? ? }

//SKProduct *product in response.products

? ? for (int i = 0; i < response.products.count; i ++) {

// 激活了對(duì)應(yīng)的銷售操作按鈕,相當(dāng)于商店的商品上架允許銷售

? SKProduct *product = [response.products objectAtIndex:i];

?NSLog(@"%@", product.productIdentifier);

UIButton * btn = [btnArr objectAtIndex:i];(btnArr為存放產(chǎn)品按鈕的數(shù)組)

?btn.userInteractionEnabled = YES;(只有當(dāng)請(qǐng)求得到數(shù)據(jù)之后才放開產(chǎn)品按鈕的交互性)

// 填充商品數(shù)組

[productArr_app addObject:product];(productArr_app為自己生成的用于存放產(chǎn)品的數(shù)組)

? ? ? ? }

}

三,用戶決定購(gòu)買商品,在商品按鈕的點(diǎn)擊方法中調(diào)用此方法

- (void)buyProduct:(SKProduct *)product

{

SKPayment *payment = [SKPayment paymentWithProduct:product];

// 準(zhǔn)備購(gòu)買(異步) ?

[[SKPaymentQueue defaultQueue] addPayment:payment];

}

四,監(jiān)聽(tīng)購(gòu)買結(jié)果,當(dāng)交易完成的時(shí)候進(jìn)行下一步操作,即驗(yàn)證購(gòu)買合法化

- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions {

? ? ?for (SKPaymentTransaction *transaction in transactions){

? ? ? ?switch (transaction.transactionState){

?case SKPaymentTransactionStatePurchased://交易完成

? ? ?NSLog(@"交易完成transactionIdentifier = %@", t ? ? ? ?ransaction.transactionIdentifier);

? ? ? ? [self completeTransaction:transaction];

? ? ? ? ?break;

? ? ? ? ?case SKPaymentTransactionStateFailed://交易失敗

? ? ? ? ?[self failedTransaction:transaction];

? ? ? ? ?break;

? ? ? ? ?case SKPaymentTransactionStateRestored://已經(jīng)購(gòu)買過(guò)該商品

? ? ? ? ?[self restoreTransaction:transaction];

? ? ? ? ?break;

? ? ? ? ?case SKPaymentTransactionStatePurchasing: ? ? ?//商品添加進(jìn)列表

? ? ? ? ?NSLog(@"商品添加進(jìn)列表");

? ? ? ? ?break;

? ? ? ? ?default:

? ? ? ? ?break;

? ? ? ? ? ? ? ?}

? ? ? ? ?}

}

五,完成交易,向自己的服務(wù)器驗(yàn)證交易合法化

-(void)completeTransaction:(SKPaymentTransaction *)transaction {

NSString * productIdentifier = transaction.payment.productIdentifier;

? ? ? ?if ([productIdentifier length] > 0) {

? ? ? ? ? // 向自己的服務(wù)器驗(yàn)證購(gòu)買憑證

? ? ? ? ? //appStoreReceiptURL iOS7.0增加的,購(gòu)買交易完成后,會(huì)將憑據(jù)存放在該地址

? NSURL *receiptURL = [[NSBundle mainBundle] appStoreReceiptURL];

? ? ? ? ? // 從沙盒中獲取到購(gòu)買憑據(jù)

?NSData *receiptData = [NSData dataWithContentsOfURL:receiptURL];

? ? ? ? ?// 傳輸?shù)氖荁ASE64編碼的字符串

? ?NSString *encodeStr = [receiptData base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed];

? ? ? ? }

? ? ? ? //接下來(lái)就是向自己的服務(wù)器發(fā)送數(shù)據(jù)驗(yàn)證合法化的步驟了

[[SKPaymentQueue defaultQueue] finishTransaction: transaction];

}

在公司的測(cè)試服務(wù)器中,連接蘋果的測(cè)試服務(wù)器(https://sandbox.itunes.apple.com/verifyReceipt)驗(yàn)證。部署在線上的正式服務(wù)器中,就要連接蘋果的正式服務(wù)器(https://buy.itunes.apple.com/verifyReceipt )驗(yàn)證了。

六,下面是交易失敗時(shí)候的方法

-(void)failedTransaction:(SKPaymentTransaction *)transaction {

? if(transaction.error.code!= SKErrorPaymentCancelled) {

? ? ? ? ? ? ? ? if (!fault_alert) {

? ? ? ? ? ? ? ? ? ? ?fault_alert = [[UIAlertView alloc]initWithTitle:@"提示:" message:@"購(gòu)買失敗,請(qǐng)確定您的apple id余額足夠或綁定了銀聯(lián)卡消費(fèi)" delegate:self cancelButtonTitle:@"確定"otherButtonTitles:nil, nil];

? ? ? ? ? ? ? ? ? ? [fault_alert show];

? ? ? ? ? ? ? ? }else{

? ? ? ? ? ? ? ? }

? ? ? ? ? } else {

? ? ? ? ? NSLog(@"用戶取消交易");

? ? ? ? ? }

?[[SKPaymentQueue defaultQueue] finishTransaction: transaction];

}

-(void)restoreTransaction:(SKPaymentTransaction *)transaction {

? ? ? ? ?// 對(duì)于已購(gòu)商品,處理恢復(fù)購(gòu)買的邏輯

[[SKPaymentQueue defaultQueue] finishTransaction: transaction];

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容