iOS 內購遇到的坑

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

您以購買過此APP內購項目,此項目將免費恢復.PNG
原因:

當使用內購購買過商品后沒有把這個交易事件關,所以當我們再次去購買商品后就會調用以前已經購買成功的交易事件去購買因為已經購買過,才會有這個提示

解決方法:

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下都能使用。
消耗型比如一些直播平臺的貨幣 使用完以后可以在充值。
我有這個問題是 最開始我們的項目是購買完產品以后可以永久使用,后來修改成充值余額購買,但是我沒有去修改類型才導致的這個錯誤,

四.測試時記得把App Store上的賬號注銷,不然會出現購買失敗,注銷賬號后,在進行內購時登錄沙盒測試賬號。

五.In-App Purchase二次驗證

IOS在沙箱環境下購買成功之后,向蘋果進行二次驗證,確認用戶是否購買成功。
當應用向Apple服務器請求購買,成功之后,Apple會返回以下四個數據給應用

  1. 產品標識符: product Identifier[在itunes store應用內定義的產品ID,例如com.公司名.產品名.道具名(com.xxxx.317hu.66)]
  2. 交易狀態: state
  3. Receipt:很長的一段字符串,大概49行,作為二次驗證的重要依據
  4. 交易標識符: transaction Identifier 我們需要把Receipt發送給蘋果的蘋果的服務器驗證,用戶的購買信息是否真實
交易狀態 解釋
Purchased 購買成功
Restored 恢復購買
Failed 失敗
Deferred 等待確認,兒童模式需要詢問家長同意

蘋果返回狀態碼 狀態碼

狀態 描述
21000 App Store不能讀取你提供的JSON對象
21002 receipt-data域的數據有問題
21003 receipt無法通過驗證
21004 提供的shared secret不匹配你賬號中的shared secret
21005 receipt服務器當前不可用
21006 receipt合法,但是訂閱已過期。服務器接收到這個狀態碼時,receipt數據仍然會解碼并一起發送
21007 receipt是Sandbox receipt,但卻發送至生產系統的驗證服務
21008 receipt是生產receipt,但卻發送至Sandbox環境的驗證服務
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,739評論 6 534
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,634評論 3 419
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,653評論 0 377
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,063評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,835評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,235評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,315評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,459評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,000評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,819評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,004評論 1 370
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,560評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,257評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,676評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,937評論 1 288
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,717評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,003評論 2 374

推薦閱讀更多精彩內容

  • iOS應用如果涉及到支付功能,分為兩類:第三方支付和蘋果內購。那么什么情況下選擇使用第三方支付,又在什么情況下選擇...
    ZfRee閱讀 38,962評論 36 66
  • - 消耗型項目 就像你玩游戲需要買金幣,買鉆石等,只要花錢就可以無限次的購買 - 非消耗型項目 就像你在App S...
    tiger2016閱讀 665評論 0 1
  • 自己開發的視頻直播項目,牽涉到充值金幣,用到了蘋果公司的內購,趴坑了兩天,這里總結下實現蘋果內購。 一. 創建測試...
    Leo丶Dicaprio閱讀 3,418評論 8 7
  • 當購物車是空的時候 沒有欲望 沒有幻想 只有一絲的閑暇 心是甜甜的喜悅 再也不要為虛榮 奮斗 為華麗的軀殼 發愁 ...
    逗霸君閱讀 282評論 0 5
  • 這里的天氣總是陰晴不定,還是炎熱的早上,午休后便開始有了烏云,還是帶著傘繼續來到原定計劃的古子城 雨中的老街,老店...
    喵小蛙閱讀 299評論 0 2