iOS 內購遇到的坑


一.內購沙盒測試賬號在支付成功后,再次購買相同 ID 的物品,會提示如下內容的彈窗。您以購買過此APP內購項目,此項目將免費恢復

原因:
當使用內購購買過商品后沒有把這個交易事件關,所以當我們再次去購買商品后就會調用以前已經購買成功的交易事件去購買因為已經購買過,才會有這個提示
解決方法:
1.當我們使用[[SKPaymentQueue defaultQueue] addPayment:payment];這個方法進行支付請求后,因為我們已經把支付所需要的信息都添加到蘋果的支付隊列,蘋果會自動完成后續的購買請求。
在用戶購買成功或者點擊取消購買的后會回調- (void)paymentQueue:(SKPaymentQueue )queue updatedTransactions:(NSArray )transaction;方法返回響應的結果信息,在該方法內除了得到響應的支付信息編寫自身的業務的代碼外還要記得調用[[SKPaymentQueue defaultQueue] finishTransaction:transaction];方法通知蘋果的支付隊列該交易已經完成,否者就會調用已經購買成功的支付隊列,就會出現您以購買過此APP內購項目,此項目將免費恢復這句提示。
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray<SKPaymentTransaction *> *)transactions{
    NSLog(@"調用了幾次這個方法?");
    SKPaymentTransaction *transaction = transactions.lastObject;
    switch (transaction.transactionState) {
        case SKPaymentTransactionStatePurchased: {
            [[SKPaymentQueue defaultQueue] finishTransaction:transaction];//記得關閉交易事件

            NSLog(@"購買完成,向自己的服務器驗證 ---- %@", transaction.payment.applicationUsername);
            NSData *data = [NSData dataWithContentsOfFile:[[[NSBundle mainBundle] appStoreReceiptURL] path]];
            NSString *receipt = [data base64EncodedStringWithOptions:0];
//            [self buySuccessWithReceipt:receipt transaction:transaction];
        }
            break;
        case SKPaymentTransactionStateFailed: {
            NSLog(@"交易失敗");
            [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
        }
            break;
        case SKPaymentTransactionStateRestored: {
            NSLog(@"已經購買過該商品");
            [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
        }
            break;
        case SKPaymentTransactionStatePurchasing: {
            NSLog(@"商品添加進列表");
        }
            break;
        default: {
            NSLog(@"這是什么情況啊?");
        }
            break;
    }
}
2.在買次購買之前檢測是否有未完成的交易如果有就關閉。
NSArray* transactions = [SKPaymentQueue defaultQueue].transactions;
    if (transactions.count > 0) {
        //檢測是否有未完成的交易
        SKPaymentTransaction* transaction = [transactions firstObject];
        if (transaction.transactionState == SKPaymentTransactionStatePurchased) {
            [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
            return;
        }  
    }

三.iOS 內購 您已經購買了此項目,您想免費再獲取一次嗎
這個是內購選擇類型不匹配原因導致。
非消耗型就是消耗一次后在該appid下都能使用。
消耗型比如一些直播平台的貨幣 使用完以后可以在充值。
我有這個問題是 最開始我們的項目是購買完產品以后可以永久使用,后來修改成充值余額購買,但是我沒有去修改類型才導致的這個錯誤。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM