蘋果內(nèi)購筆記

1. 內(nèi)購準(zhǔn)備:

1.登陸開發(fā)者賬號, 導(dǎo)入profile文件
2.去Itunes Connect 添加應(yīng)用信息, 內(nèi)購信息, 后臺數(shù)據(jù)庫也錄入信息
3.添加銀行的稅務(wù)信息, 可以是借記卡
4.為了測試內(nèi)購, 需要添加沙盒測試賬號

2. 注意點(diǎn) :

1.必須設(shè)置項(xiàng)目的bundle ID
2.內(nèi)購SDK就是蘋果自帶框架StoreKit動態(tài)庫
3.在BuildPhase 開啟內(nèi)購功能

3. 原理圖
3.jpg
1. 請求商品列表
    // 1. 請求商品列表(首先創(chuàng)建一個產(chǎn)品請求向蘋果后臺( 如果是恢復(fù)購買的項(xiàng)目 則restore之前已經(jīng)購買的物品如月卡, 如果買過之后緊接著又買, 就會提示重復(fù)購買))
    // 1.1 創(chuàng)建產(chǎn)品ID列表
    NSSet *set = [NSSet setWithObjects:@“商品A",@“商品B",@“商品C",@“商品D", nil];
    // 1.2 創(chuàng)建產(chǎn)品請求列表
    self.request = [[SKProductsRequest alloc] initWithProductIdentifiers:set];
    // 1.3 設(shè)置請求代理
    self.request.delegate = self;
    
    // 1.4 注意開啟請求
    [self.request start];
    
    // 2. 添加交易監(jiān)視者到支付隊(duì)列中
    [[SKPaymentQueue defaultQueue] addTransactionObserver:self];
2. 添加支付交易監(jiān)視者 -> 支付狀態(tài)的更新
    // 2. 添加交易監(jiān)視者到支付隊(duì)列中
    [[SKPaymentQueue defaultQueue] addTransactionObserver:self];

    // 在dealloc中移除
    - (void)dealloc
    {
        [[SKPaymentQueue defaultQueue] removeTransactionObserver:self];
    }
3. 從商品創(chuàng)建支付對象, 并將支付對象添加到支付隊(duì)列中
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {   
    SKProduct *product = self.products[indexPath.row];
    // 3. 創(chuàng)建支付對象
    SKPayment *payment = [SKPayment paymentWithProduct:product];

    // 4. 添加支付對象到支付隊(duì)列中
    [[SKPaymentQueue defaultQueue] addPayment:payment];
}
4. 交易更新調(diào)用, 自己的服務(wù)器向蘋果后臺驗(yàn)證憑證
// 交易被更新的時候回調(diào)(當(dāng)交易被更新時回調(diào), 通過交易回調(diào)獲得的狀態(tài)來執(zhí)行下一步操作(如支付中, 支付成功, 支付失敗))
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray<SKPaymentTransaction *> *)transactions {
    // SKPaymentTransaction 交易對象
    for (SKPaymentTransaction *paymentTansaction in transactions) {
        switch (paymentTansaction.transactionState) {
            case SKPaymentTransactionStatePurchasing:
                NSLog(@"支付中");
                break;
            case SKPaymentTransactionStatePurchased:
            {
                NSLog(@"完成支付");
                // 必須添加完成支付交易
                [[SKPaymentQueue defaultQueue] finishTransaction:paymentTansaction];
                
                // 需要獲取支付憑證
//                NSData *transactionReceipt = paymentTansaction.transactionReceipt;
                
                
                (整個支付的流程對象,如果交易完成 支付交易對象內(nèi)部有一個支付憑證,有了支付憑證可以讓我們后臺進(jìn)行校驗(yàn),從而判定是否錢是否交易成功)
                // 拿到憑證 transction.transactionReceipt 提交給我們服務(wù)器
                // 我們服務(wù)器 提交給蘋果服務(wù)器進(jìn)行驗(yàn)證
                // 蘋果服務(wù)器告訴我們服務(wù)器成功
                // 我們服務(wù)器告訴我們客戶端支付成功,才算成功
            
                }
                break;
            case SKPaymentTransactionStateFailed:
                NSLog(@"支付失敗");
                // 必須添加完成支付交易
                [[SKPaymentQueue defaultQueue] finishTransaction:paymentTansaction];
                break;
            case SKPaymentTransactionStateDeferred:
                NSLog(@"支付過期");
                // 必須添加完成支付交易
                [[SKPaymentQueue defaultQueue] finishTransaction:paymentTansaction];
                break;
            case SKPaymentTransactionStateRestored:
                NSLog(@"恢復(fù)成功");
                // 必須添加完成支付交易
                [[SKPaymentQueue defaultQueue] finishTransaction:paymentTansaction];
                break;
                
            default:
                break;
        }
    }
}

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

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

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