蘋果內(nèi)購上線總結(jié)

一坡疼, 如何定義內(nèi)購商品彬呻?

線上購買線上使用,不涉及到線下實物的交易都需要用蘋果內(nèi)購柄瑰。簡言之闸氮,就是虛擬商品,比如線上音樂教沾,電子圖書蒲跨,設(shè)計作品,游戲幣等授翻。

二或悲,Appstore Connect線上配置
1.協(xié)議孙咪、稅務(wù)和銀行業(yè)務(wù)填寫;
協(xié)議巡语、稅務(wù)和銀行業(yè)務(wù)
2.創(chuàng)建內(nèi)購項目翎蹈;
創(chuàng)建內(nèi)購項目!
選擇內(nèi)購項目類型
3.設(shè)置沙箱測試賬號;
沙箱測試賬號

由于回頭總結(jié)捌臊,截圖未能一一提供杨蛋,在此只提示設(shè)置入口而后按引導(dǎo)一步步去做就行了。

三理澎,代碼集成
1.添加和移除監(jiān)聽設(shè)置
// 添加觀察者
    [[SKPaymentQueue defaultQueue] addTransactionObserver:self];
// 移除觀察者
    [[SKPaymentQueue defaultQueue] removeTransactionObserver:self];
2.通過產(chǎn)品ID獲取產(chǎn)品信息列表
- (void)getProductInfo:(NSString *)productIdentifier{
    self.selectProductId = productIdentifier;
    if (![SKPaymentQueue canMakePayments]){
        if (self.failurePurchaseBlock) {
            self.failurePurchaseBlock(@"不允許付費購買商品");
        }
        return;
    }

    if (productIdentifier.length > 0){
        NSArray * product = [[NSArray alloc] initWithObjects:productIdentifier, nil];
        NSSet *set = [NSSet setWithArray:product];
        SKProductsRequest * request = [[SKProductsRequest alloc] initWithProductIdentifiers:set];
        request.delegate = self;
        [request start];//開始請求
    }
}
/*
查詢成功后的回調(diào)(經(jīng)由getProductInfo函數(shù)發(fā)起的產(chǎn)品信息查詢逞力,成功后返回執(zhí)行的回調(diào))。
*/
- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response
{
  NSArray *myProduct = response.products;
  if (myProduct.count == 0){
      if (self.failurePurchaseBlock) {
          self.failurePurchaseBlock(@"無法獲取商品信息");
      }
      return;
  }
  //選擇用戶選擇的檔位發(fā)起購買請求
  for (SKProduct *sKProduct in myProduct) {
      
      NSLog(@"pro info");
      NSLog(@"SKProduct 描述信息:%@", sKProduct.description);
      NSLog(@"localizedTitle 產(chǎn)品標題:%@", sKProduct.localizedTitle);
      NSLog(@"localizedDescription 產(chǎn)品描述信息:%@",sKProduct.localizedDescription);
      NSLog(@"price 價格:%@",sKProduct.price);
      NSLog(@"productIdentifier Product id:%@",sKProduct.productIdentifier);
      
      if([sKProduct.productIdentifier isEqualToString: self.selectProductId]){
          [self buyProduct:sKProduct];
          break;
      }
  }
}
3.發(fā)起購買請求
/*解決掉單的問題:
 1.將需要傳給后臺服務(wù)器的參數(shù)(比如訂單id糠爬,用戶id)放到SKMutablePayment的applicationUsername字段里面寇荧;
 */
-(void)buyProduct:(SKProduct *)product{
    // 1.創(chuàng)建票據(jù)
    NSString *orderId = @"123";
    NSString *userId = @"abc";
    NSString *userName = [NSString stringWithFormat:@"%@-%@",userId,orderId];
    SKMutablePayment *skpayment = [SKMutablePayment paymentWithProduct:product];
    skpayment.applicationUsername = userName;
    
    // 2.將票據(jù)加入到交易隊列
    [[SKPaymentQueue defaultQueue] addPayment:skpayment];
}
4.實現(xiàn)觀察者監(jiān)聽付錢的代理方法,只要交易發(fā)生變化就會走下面的方法
-(void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions{
    /*
     SKPaymentTransactionStatePurchasing,    正在購買
     SKPaymentTransactionStatePurchased,     已經(jīng)購買
     SKPaymentTransactionStateFailed,        購買失敗
     SKPaymentTransactionStateRestored,      回復(fù)購買中
     SKPaymentTransactionStateDeferred       交易還在隊列里面,但最終狀態(tài)還沒有決定
     */
    self.sKPaymentQueue = queue;
    for (SKPaymentTransaction *transaction in transactions) {
        switch (transaction.transactionState) {
            case SKPaymentTransactionStatePurchasing:{
                NSLog(@"正在購買");
            }break;
            case SKPaymentTransactionStatePurchased:{
                NSLog(@"購買成功");
               //這里可以做一個是否同一用戶的判斷执隧,因為如果是更新數(shù)據(jù)時產(chǎn)生的訂單揩抡,跟下單時的用戶未必是同一個用戶
               //isLogin:是否登錄狀態(tài); userId:該訂單的用戶id镀琉;currentUserId:當前登錄用戶的id峦嗤;
NSArray *arr = [transaction.payment.applicationUsername componentsSeparatedByString:@"-"];
                NSString *userId = @"";
                if (arr.count>0) {
                    userId = arr[0];
                }
                if (isLogin && [currentUserId isEqualToString: userId]) {
                //取出憑證
                 [self buyAppleStoreProductSucceedWithPaymentTransactionp:transaction];
                }
            }
                break;
            case SKPaymentTransactionStateFailed:{
                NSLog(@"購買失敗");
                if (self.failurePurchaseBlock) {
                    self.failurePurchaseBlock(@"購買失敗");
                }
                // 購買失敗也要把這個交易移除掉
                [queue finishTransaction:transaction];
            }break;
            case SKPaymentTransactionStateRestored:{
                NSLog(@"回復(fù)購買中,也叫做已經(jīng)購買");
                // 回復(fù)購買中也要把這個交易移除掉
                [queue finishTransaction:transaction];
            }break;
            case SKPaymentTransactionStateDeferred:{
                NSLog(@"交易還在隊列里面,但最終狀態(tài)還沒有決定");
            }break;
            default:
                break;
        }
    }
}
5.獲取憑證屋摔,并且將憑證發(fā)送給后臺校驗
-(void)buyAppleStoreProductSucceedWithPaymentTransactionp:(SKPaymentTransaction *)paymentTransactionp {
    NSURL *receiptURL = [[NSBundle mainBundle] appStoreReceiptURL];
    NSData *receipt = [NSData dataWithContentsOfURL:receiptURL];
    NSString *encodedReceipt = @"";
    if (!receipt) {
        NSLog(@"no receipt");
        /* No local receipt -- handle the error. */
    } else {
        /* Get the receipt in encoded format */
        encodedReceipt = [receipt base64EncodedStringWithOptions:0];
    }
  //調(diào)接口服務(wù)器校驗,該方法自行實現(xiàn)
  // [self varifyPurchaseData:paymentTransactionp andReceipt:encodedReceipt];
}

注意:后臺校驗成功后烁设,需要把這個成功的交易移除掉

[self.sKPaymentQueue finishTransaction:transaction];
四,踩過的坑匯總
1.創(chuàng)建沙盒測試賬號的時候報錯:Unknown Errors while creating Sandbox Tester, Please check Error Log, email=***

解決:密碼設(shè)置復(fù)雜一些钓试。

2.購買成功后的校驗處理方案
  • 為了保證安全装黑,購買成功后,需要通過綁定產(chǎn)品id弓熏,訂單號恋谭,憑證提供給后臺,讓后臺調(diào)蘋果接口解析憑證進行校驗挽鞠;
  • 由于測試和審核的時候用的是沙盒測試疚颊,上線后才用正式環(huán)境,所以后臺需要做二次校驗信认。
  1. 即是先校驗正式環(huán)境串稀,如果成功則是上線后購買成功;
  2. 如果校驗失敗狮杨,再校驗測試環(huán)境母截,成功的話則是沙盒測試下購買成功,失敗則是沙盒測試下購買失旈辖獭清寇;
3.審核遇到的問題

(1)Guideline 3.1.1 - Business - Payments - In-App Purchase
We noticed that your app uses in-app purchase products to purchase credits or currencies that are not consumed within the app, which is not appropriate for the App Store.

通過跟蘋果審核的客服電話溝通喘漏, 蘋果內(nèi)購不能包含“提現(xiàn)”等有套現(xiàn)或洗錢嫌疑的功能——去掉“提現(xiàn)”的功能即可;

(2)一個 App 內(nèi)購買項目被退回华烟,并在以下列表中以高亮顯示

點擊高亮的內(nèi)購項目翩迈,編輯一下描述的文字,寫得更加符合項目并且詳細一些盔夜,點擊保存负饲。

4.掉單問題處理

網(wǎng)上有說把創(chuàng)建的訂單信息存儲在本地,但是思量后發(fā)現(xiàn)有不少的問題喂链,如果app被刪掉了返十,存儲的訂單信息一樣會被同步刪除,除非存儲在鑰匙串里面椭微,否則還是有概率調(diào)單洞坑。
后來參考了另一篇文章提到的applicationUsername字段,于是解決了這個問題蝇率,而且不需要做各種存取操作迟杂。

下面看看如何去獲取未完成憑證校驗的訂單(哪些情況會產(chǎn)生掉單):
1.蘋果內(nèi)購過程中,蘋果服務(wù)器響應(yīng)慢本慕,用戶殺掉進程的情況排拷;
2.拿到憑證,傳給公司后臺服務(wù)器過程中锅尘,網(wǎng)絡(luò)問題導(dǎo)致接口訪問失敗等情況监氢。

解決步驟:

  1. 創(chuàng)建訂單的時候,將orderId和userId存儲在applicationUsername里面(可以將更多的字段轉(zhuǎn)為json字符串鉴象,取出的時候再轉(zhuǎn)為字典);
  2. 在需要更新蘋果未完成訂單的頁面添加監(jiān)聽方式(即是代碼集成第一步)何鸡,可以在是啟動app頁面纺弊,或刷新金額的頁面;
  3. 在購買成功的代理中骡男,判斷訂單中的用戶id和當前登錄的用戶id是否一致淆游,如果一致,則取出訂單id和憑證一起傳給后臺服務(wù)器隔盛;(注:該頁面如果沒有登錄Apple ID的話犹菱,會彈出彈框提示用戶登錄)
  4. 當后臺服務(wù)器接收到憑證等數(shù)據(jù)成功時,通過finishTransaction結(jié)束該交易吮炕。

這樣下來腊脱,幾乎是不會再有掉單的問題了。

參考資料:
iOS內(nèi)購最新講解
真·iOS內(nèi)購的完整流程

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末龙亲,一起剝皮案震驚了整個濱河市陕凹,隨后出現(xiàn)的幾起案子悍抑,更是在濱河造成了極大的恐慌,老刑警劉巖杜耙,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件搜骡,死亡現(xiàn)場離奇詭異,居然都是意外死亡佑女,警方通過查閱死者的電腦和手機记靡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來团驱,“玉大人摸吠,你說我怎么就攤上這事〉瓴瑁” “怎么了蜕便?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長贩幻。 經(jīng)常有香客問我轿腺,道長,這世上最難降的妖魔是什么丛楚? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任族壳,我火速辦了婚禮,結(jié)果婚禮上趣些,老公的妹妹穿的比我還像新娘仿荆。我一直安慰自己,他們只是感情好坏平,可當我...
    茶點故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布拢操。 她就那樣靜靜地躺著,像睡著了一般舶替。 火紅的嫁衣襯著肌膚如雪令境。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天顾瞪,我揣著相機與錄音舔庶,去河邊找鬼。 笑死陈醒,一個胖子當著我的面吹牛惕橙,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播钉跷,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼弥鹦,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了爷辙?” 一聲冷哼從身側(cè)響起惶凝,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤吼虎,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后苍鲜,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體思灰,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年混滔,在試婚紗的時候發(fā)現(xiàn)自己被綠了洒疚。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡坯屿,死狀恐怖油湖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情领跛,我是刑警寧澤乏德,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布,位于F島的核電站吠昭,受9級特大地震影響喊括,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜矢棚,卻給世界環(huán)境...
    茶點故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一郑什、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蒲肋,春花似錦蘑拯、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至孔轴,卻和暖如春剃法,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背距糖。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工玄窝, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留牵寺,地道東北人悍引。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像帽氓,于是被迫代替她去往敵國和親趣斤。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,728評論 2 351

推薦閱讀更多精彩內(nèi)容

  • 2020年8月12日更新 關(guān)于文中黎休,蘋果用戶退款了也不知道是誰退的那塊表述浓领,現(xiàn)在來看 是有誤的玉凯。實際上從今年WWD...
    灰_太_狼閱讀 61,735評論 101 187
  • 1.簡介 蘋果內(nèi)購是指Apple Store的應(yīng)用內(nèi)購買,是蘋果為App內(nèi)購買虛擬商品或服務(wù)提供的一套交易系統(tǒng)联贩。 ...
    Hale王閱讀 6,699評論 0 9
  • 最近有個項目客戶總是反應(yīng)掉單漫仆,于是乎就看了看內(nèi)購相關(guān)的東西,發(fā)現(xiàn)坑還真是不少泪幌,這里做個總結(jié)盲厌。 IAP,即in-Ap...
    糖炒0栗子閱讀 17,965評論 0 22
  • 淅瀝瀝的雨祸泪,接連不斷的下了二天了吗浩,好比兩天前,我哭泣的心情没隘,沒有方向感懂扼,迷失在自責的痛苦里,沒辦法右蒲,是自己造成的失...
    綠蘿的詩閱讀 251評論 0 3
  • 我渴望離去,同時害怕離去;請在我害怕離去的時候,給我勇氣,讓我不再哭泣. 不再為你落淚,不再為你傷悲,不再后悔,不...
    安城煙柳舊人殤閱讀 455評論 0 0