一,引入 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];
}