iOS應(yīng)用內(nèi)購(gòu)買(mǎi)IAP的支付憑證驗(yàn)證失敗后的重試機(jī)制

iOS應(yīng)用內(nèi)購(gòu)買(mǎi)IAP的支付憑證驗(yàn)證失敗后的重試機(jī)制

當(dāng)用戶在使用應(yīng)用內(nèi)購(gòu)買(mǎi)功能的時(shí)候达吞,如果用戶支付成功了鸵隧,由于網(wǎng)絡(luò)或者其它不可預(yù)計(jì)的因素绸罗,導(dǎo)致APP應(yīng)用沒(méi)有將相應(yīng)的商品或服務(wù)提供給用戶。無(wú)論APP還是用戶豆瘫,都不想看到珊蟀,因此,這是不允許發(fā)生的情況外驱,要由程序去控制穩(wěn)定性育灸。

由此,便引出了此次討論的話題昵宇,iOS應(yīng)用內(nèi)購(gòu)買(mǎi)IAP的支付憑證驗(yàn)證磅崭,失敗后的重試機(jī)制。

整個(gè)流程主要分為以下兩步瓦哎。

1 首次驗(yàn)證失敗后的立即重試

首次驗(yàn)證失敗后砸喻,根據(jù)設(shè)定的重試次數(shù),立即重試指定次數(shù)蒋譬。

如果立即重試指定次數(shù)還是失敗割岛,則進(jìn)入第二步。

2 立即重試后還是失敗的情況處理

2.1 本地文件保存訂單等相關(guān)支付信息

立即重試后還是失敗犯助,則使用本地文件的方式癣漆,保存訂單等相關(guān)支付信息。

具體方式是剂买,將必要的信息存入NSDictionary惠爽,然后保存為plist文件。plist文件的命名瞬哼,最好包含用戶ID婚肆、訂單ID,和其它具有唯一性的字符倒槐,以區(qū)分不同用戶,不同的訂單等附井。

2.1步的保存文件的代碼

/**
 存儲(chǔ)用戶購(gòu)買(mǎi)憑證
 
 @param receipt 購(gòu)買(mǎi)憑證
 @param sID 唯一標(biāo)識(shí)(比如UserId)
 @param orderNum 訂單號(hào)
 */
+ (void)saveReceiptValidation:(NSString *_Nonnull)receipt
                       withID:(NSString *_Nonnull)sID
                     orderNum:(NSString *_Nonnull)orderNum
{
    NSDate *dateSaved = [NSDate date];
    NSString *fileName = [NSString stringWithFormat:@"IAPInfo-%@-%@", sID, orderNum];
    NSString *fileDir = [[self class] getIAPInfoLocalFilePath:sID];
    NSString *savedPath = [NSString stringWithFormat:@"%@%@.plist", fileDir, fileName];
    
    NSDictionary *dic =[NSDictionary dictionaryWithObjectsAndKeys:
                        receipt, kReceipStringKey,
                        dateSaved, kReceipDateKey,
                        sID, kReceipIdKey,
                        orderNum, kOrderNumKey,
                        nil];
    
    NSFileManager *fileManager = [NSFileManager defaultManager];
    
    BOOL isDir = FALSE;
    BOOL isDirExist = [fileManager fileExistsAtPath:fileDir isDirectory:&isDir];
    
    if(!(isDirExist && isDir)) {//目錄不存在
        BOOL bCreateDir = [fileManager createDirectoryAtPath:fileDir withIntermediateDirectories:YES attributes:nil error:nil];
        
        if(!bCreateDir){
            NSLog(@"Create Directory Failed.");
        } else {
            [[self class] saveFile:savedPath withDictionary:dic];
        }
        
    } else {//目錄存在讨越,直接保存
        [[self class] saveFile:savedPath withDictionary:dic];
    }
}

+ (BOOL)saveFile:(NSString *)savedPath withDictionary:(NSDictionary *)dic
{
    BOOL isWrited = [dic writeToFile:savedPath atomically:YES];
    NSLog(@"saveReceiptValidation is success ? %@,  at savedPath:%@", @(isWrited), savedPath);
    return isWrited;
}

+ (NSString *)getIAPInfoLocalFilePath:(NSString *)sID
{
    return [NSString stringWithFormat:@"%@/IAPReceipt-%@/", [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject], sID];
}

2.2 間隔指定時(shí)間不斷重試

保存信息完成后,則間隔指定時(shí)間不斷重試永毅,直到驗(yàn)證成功把跨,或者APP進(jìn)程結(jié)束。

間隔時(shí)間沼死,可自定義着逐,個(gè)人覺(jué)得,5分鐘以上的間隔,會(huì)比較合適耸别。

1步和2步的重試邏輯的部分代碼

         if (retried < kRetryMax) {
             //重試
             [[self class] validateReceipt:receipt orderNum:orderNum retriedTimes:retried+1 success:success failure:failure];
         } else {
             //重試了kRetryMax次后健芭,還失敗,則創(chuàng)建延時(shí)任務(wù)秀姐,5分鐘后重試
             int afterTime = 5 * 60;
             dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(afterTime * NSEC_PER_SEC)), dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
                 [[self class] validateReceipt:receipt orderNum:orderNum retriedTimes:0 success:nil failure:nil];
             });
             
             //保存憑證
             NSString *userId = [TTVUserInfo sharedTTVUserInfo].currentUser.userId;
             if (userId && userId.length > 0) {
                 [[self class] saveReceiptValidation:receipt withID:userId orderNum:orderNum];
             }
             //錯(cuò)誤回調(diào)
             if (failure) {
                 failure(errCode, errMessage);
             }
         }

3 在APP進(jìn)程結(jié)束前慈迈,都未驗(yàn)證成功的情況處理

3.1 在啟動(dòng)或登錄成功時(shí)重新發(fā)起驗(yàn)證

在啟動(dòng)APP時(shí),如果用戶已經(jīng)登錄省有,則將所有驗(yàn)證失敗的支付憑證重新進(jìn)行驗(yàn)證痒留。如果用戶未登錄,則訂閱通知蠢沿,在用戶登錄首次登錄成功后伸头,重新發(fā)起驗(yàn)證流程。

3步的重新發(fā)起驗(yàn)證流程的部分代碼


/**
 驗(yàn)證receipt失敗舷蟀,再次驗(yàn)證

 @param sID 唯一標(biāo)識(shí)(比如UserId)
 */
+ (void)resendFailedReceiptValidation:(NSString *)sID
{
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSError *error = nil;
    
    NSString *filePath = [[self class] getIAPInfoLocalFilePath:sID];
    
    //搜索該目錄下的所有文件和目錄
    NSArray *cacheFileNameArray = [fileManager contentsOfDirectoryAtPath:filePath error:&error];
    NSLog(@"resendFailedReceiptValidation has files : %@", cacheFileNameArray);
    
    if (error == nil)
    {
        for (NSString *name in cacheFileNameArray)
        {
            if ([name hasSuffix:@".plist"])//如果有plist后綴的文件恤磷,說(shuō)明就是存儲(chǔ)的購(gòu)買(mǎi)憑證
            {
                NSString *plistPath = [NSString stringWithFormat:@"%@/%@", filePath, name];
                [[self class] resendValidationRequest:plistPath];
                
            }
        }
    }
    else
    {
        NSLog(@"getIAPInfoLocalFilePath error:%@", [error domain]);
    }
}

注意事項(xiàng)

在每次重試時(shí),驗(yàn)證成功后雪侥,需要將本地存儲(chǔ)的文件移除碗殷,防止重復(fù)驗(yàn)證。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末速缨,一起剝皮案震驚了整個(gè)濱河市锌妻,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌旬牲,老刑警劉巖仿粹,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異原茅,居然都是意外死亡吭历,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)擂橘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)晌区,“玉大人,你說(shuō)我怎么就攤上這事通贞±嗜簦” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵昌罩,是天一觀的道長(zhǎng)哭懈。 經(jīng)常有香客問(wèn)我,道長(zhǎng)茎用,這世上最難降的妖魔是什么遣总? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任睬罗,我火速辦了婚禮,結(jié)果婚禮上旭斥,老公的妹妹穿的比我還像新娘容达。我一直安慰自己,他們只是感情好琉预,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布董饰。 她就那樣靜靜地躺著,像睡著了一般圆米。 火紅的嫁衣襯著肌膚如雪卒暂。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,036評(píng)論 1 285
  • 那天娄帖,我揣著相機(jī)與錄音也祠,去河邊找鬼。 笑死近速,一個(gè)胖子當(dāng)著我的面吹牛诈嘿,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播削葱,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼奖亚,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了析砸?” 一聲冷哼從身側(cè)響起昔字,我...
    開(kāi)封第一講書(shū)人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎首繁,沒(méi)想到半個(gè)月后作郭,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡弦疮,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年夹攒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片胁塞。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡咏尝,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出啸罢,到底是詐尸還是另有隱情编检,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布伺糠,位于F島的核電站蒙谓,受9級(jí)特大地震影響斥季,放射性物質(zhì)發(fā)生泄漏训桶。R本人自食惡果不足惜累驮,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望舵揭。 院中可真熱鬧谤专,春花似錦、人聲如沸午绳。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)拦焚。三九已至蜡坊,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間赎败,已是汗流浹背秕衙。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留僵刮,地道東北人据忘。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像搞糕,于是被迫代替她去往敵國(guó)和親勇吊。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

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

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理窍仰,服務(wù)發(fā)現(xiàn)汉规,斷路器,智...
    卡卡羅2017閱讀 134,599評(píng)論 18 139
  • 支付寶簡(jiǎn)介文檔 (適用于ydm-java接口與后臺(tái),如有誤入钥屈,但愿也能給您帶來(lái)幫助) 此文檔寫(xiě)于2017年3月悟民,只...
    隔壁付叔叔閱讀 17,046評(píng)論 3 19
  • linux資料總章2.1 1.0寫(xiě)的不好抱歉 但是2.0已經(jīng)改了很多 但是錯(cuò)誤還是無(wú)法避免 以后資料會(huì)慢慢更新 大...
    數(shù)據(jù)革命閱讀 12,135評(píng)論 2 34
  • 國(guó)家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報(bào)批稿:20170802 前言: 排版 ...
    庭說(shuō)閱讀 10,869評(píng)論 6 13
  • 本文參加#未完待續(xù),就要表白#活動(dòng)篷就,本人承諾射亏,文章內(nèi)容為原創(chuàng),且未在其它平臺(tái)發(fā)表過(guò)竭业。 最美不過(guò)青春年華 工大總會(huì)讓...
    片寄涼太夫人閱讀 162評(píng)論 0 0