iOS-內(nèi)購(gòu)注意

1、發(fā)送請(qǐng)求,注意請(qǐng)求ID

NSString *productID = @"這是創(chuàng)建內(nèi)購(gòu)項(xiàng)目填寫(xiě)的ID";
NSArray *product = [[NSArray alloc] initWithObjects: productID,nil];
NSSet *nsset = [NSSet setWithArray:product];
SKProductsRequest *request = [[SKProductsRequest alloc] initWithProductIdentifiers:nsset];
request.delegate = self;

2币叹、 在監(jiān)聽(tīng)購(gòu)買(mǎi)結(jié)果后,一定要調(diào)用[[SKPaymentQueue defaultQueue] finishTransaction:tran];來(lái)允許你從支付隊(duì)列中移除交易模狭。

//監(jiān)聽(tīng)購(gòu)買(mǎi)結(jié)果
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transaction{
    for(SKPaymentTransaction *tran in transaction){
        switch (tran.transactionState) {
            case SKPaymentTransactionStatePurchased:{
                NSLog(@"交易完成");
                // 發(fā)送到蘋(píng)果服務(wù)器驗(yàn)證憑證,進(jìn)行二次驗(yàn)證
                [self verifyPurchaseWithProductionEnvironment];
                [[SKPaymentQueue defaultQueue] finishTransaction:tran];

            }
                break;
            case SKPaymentTransactionStatePurchasing:
                NSLog(@"商品添加進(jìn)列表");

                break;
            case SKPaymentTransactionStateRestored:{
                NSLog(@"已經(jīng)購(gòu)買(mǎi)過(guò)商品");

                [[SKPaymentQueue defaultQueue] finishTransaction:tran];
            }
                break;
            case SKPaymentTransactionStateFailed:{
                NSLog(@"交易失敗");
                [[SKPaymentQueue defaultQueue] finishTransaction:tran];
                [SVProgressHUD showErrorWithStatus:@"購(gòu)買(mǎi)失敗"];
            }
                break;
            default:
                break;
        }
    }
}

3颈抚、 沙盒環(huán)境測(cè)試appStore內(nèi)購(gòu)流程的時(shí)候,請(qǐng)使用沒(méi)越獄的設(shè)備嚼鹉。
請(qǐng)務(wù)必使用真機(jī)來(lái)測(cè)試贩汉,一切以真機(jī)為準(zhǔn)。
4锚赤、 項(xiàng)目的Bundle identifier需要與您申請(qǐng)AppID時(shí)填寫(xiě)的bundleID一致匹舞,不然會(huì)無(wú)法請(qǐng)求到商品信息。
5线脚、真機(jī)測(cè)試的時(shí)候赐稽,一定要退出原來(lái)的賬號(hào),才能用沙盒測(cè)試賬號(hào)
6浑侥、二次驗(yàn)證姊舵,請(qǐng)注意區(qū)分宏, 測(cè)試用沙盒驗(yàn)證锭吨,App Store審核的時(shí)候也使用的是沙盒購(gòu)買(mǎi)蠢莺,所以驗(yàn)證購(gòu)買(mǎi)憑證的時(shí)候需要判斷返回Status Code決定是否去沙盒進(jìn)行二次驗(yàn)證,為了線上用戶(hù)的使用零如,驗(yàn)證的順序肯定是先驗(yàn)證正式環(huán)境躏将,此時(shí)若返回值為21007,就需要去沙盒二次驗(yàn)證考蕾,因?yàn)榇速?gòu)買(mǎi)的是在沙盒進(jìn)行的祸憋。

//沙盒測(cè)試環(huán)境驗(yàn)證
#define SANDBOX @"https://sandbox.itunes.apple.com/verifyReceipt"
//正式環(huán)境驗(yàn)證
#define AppStore @"https://buy.itunes.apple.com/verifyReceipt"
/**
 *  驗(yàn)證購(gòu)買(mǎi),避免越獄軟件模擬蘋(píng)果請(qǐng)求達(dá)到非法購(gòu)買(mǎi)問(wèn)題
 *
 */
-(void)verifyPurchaseWithProductionEnvironment{
    //從沙盒中獲取交易憑證并且拼接成請(qǐng)求體數(shù)據(jù)
    NSURL *receiptUrl=[[NSBundle mainBundle] appStoreReceiptURL];
    NSData *receiptData=[NSData dataWithContentsOfURL:receiptUrl];

    NSString *receiptString=[receiptData base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed];//轉(zhuǎn)化為base64字符串

    NSString *bodyString = [NSString stringWithFormat:@"{\"receipt-data\" : \"%@\"}", receiptString];//拼接請(qǐng)求數(shù)據(jù)
    NSData *bodyData = [bodyString dataUsingEncoding:NSUTF8StringEncoding];

/*
注意:
自己測(cè)試的時(shí)候使用的是沙盒購(gòu)買(mǎi)(測(cè)試環(huán)境)
App Store審核的時(shí)候也使用的是沙盒購(gòu)買(mǎi)(測(cè)試環(huán)境)
上線以后就不是用的沙盒購(gòu)買(mǎi)了(正式環(huán)境)

所以此時(shí)應(yīng)該先驗(yàn)證正式環(huán)境肖卧,在驗(yàn)證測(cè)試環(huán)境

正式環(huán)境驗(yàn)證成功蚯窥,說(shuō)明是線上用戶(hù)在使用
正式環(huán)境驗(yàn)證不成功返回21007,說(shuō)明是自己測(cè)試或者審核人員在測(cè)試
*/

//第一步塞帐,驗(yàn)證正式環(huán)境
 //創(chuàng)建請(qǐng)求到蘋(píng)果官方進(jìn)行購(gòu)買(mǎi)驗(yàn)證(正式環(huán)境)
    NSURL *url=[NSURL URLWithString: AppStore];
    NSMutableURLRequest *requestM=[NSMutableURLRequest requestWithURL:url];
    requestM.HTTPBody=bodyData;
    requestM.HTTPMethod=@"POST";
    //創(chuàng)建連接并發(fā)送同步請(qǐng)求
    NSError *error=nil;
    NSData *responseData=[NSURLConnection sendSynchronousRequest:requestM returningResponse:nil error:&error];
    if (error) {
        NSLog(@"驗(yàn)證購(gòu)買(mǎi)過(guò)程中發(fā)生錯(cuò)誤拦赠,錯(cuò)誤信息:%@",error.localizedDescription);
        return;
    }
    NSDictionary *dic=[NSJSONSerialization JSONObjectWithData:responseData options:NSJSONReadingAllowFragments error:nil];
    NSLog(@"%@",dic);
    if([dic[@"status"] intValue]==0){
        //正式環(huán)境驗(yàn)證通過(guò)(說(shuō)明是上線以后的用戶(hù)購(gòu)買(mǎi))
        NSLog(@"購(gòu)買(mǎi)成功!");
        //在此處對(duì)購(gòu)買(mǎi)記錄進(jìn)行存儲(chǔ)葵姥,可以存儲(chǔ)到開(kāi)發(fā)商的服務(wù)器端
    }else if([dic[@"status"] intValue]== 21007){
        //This receipt is from the test environment, but it was sent to the production environment for verification. Send it to the test environment instead.
        //購(gòu)買(mǎi)憑證來(lái)自于測(cè)試環(huán)境荷鼠,但是卻發(fā)送到了正式環(huán)境,請(qǐng)改成測(cè)試環(huán)境(這種情況下可能是自己測(cè)試的榔幸,也可能是審核人員測(cè)試的)

        //第二步允乐,驗(yàn)證測(cè)試環(huán)境
        [self verifyPurchaseWithTestEnvironment];

    }
}

 //創(chuàng)建請(qǐng)求到蘋(píng)果官方進(jìn)行購(gòu)買(mǎi)驗(yàn)證(測(cè)試環(huán)境)
- (void)verifyPurchaseWithTestEnvironment {
    NSURL *url=[NSURL URLWithString:SANDBOX];
    NSMutableURLRequest *requestM=[NSMutableURLRequest requestWithURL:url];
    requestM.HTTPBody=bodyData;
    requestM.HTTPMethod=@"POST";
    //創(chuàng)建連接并發(fā)送同步請(qǐng)求
    NSError *error=nil;
    NSData *responseData=[NSURLConnection sendSynchronousRequest:requestM returningResponse:nil error:&error];
    if (error) {
        NSLog(@"驗(yàn)證購(gòu)買(mǎi)過(guò)程中發(fā)生錯(cuò)誤矮嫉,錯(cuò)誤信息:%@",error.localizedDescription);
        return;
    }
    NSDictionary *dic=[NSJSONSerialization JSONObjectWithData:responseData options:NSJSONReadingAllowFragments error:nil];
    NSLog(@"%@",dic);
    if([dic[@"status"] intValue]==0){
        NSLog(@"購(gòu)買(mǎi)成功!");
        //在此處對(duì)購(gòu)買(mǎi)記錄進(jìn)行存儲(chǔ)牍疏,可以存儲(chǔ)到開(kāi)發(fā)商的服務(wù)器端
    }else{
        NSLog(@"購(gòu)買(mǎi)失敗蠢笋,未通過(guò)驗(yàn)證!");
    }
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末鳞陨,一起剝皮案震驚了整個(gè)濱河市昨寞,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌炊邦,老刑警劉巖编矾,帶你破解...
    沈念sama閱讀 222,865評(píng)論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異馁害,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)蹂匹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,296評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)碘菜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人限寞,你說(shuō)我怎么就攤上這事忍啸。” “怎么了履植?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,631評(píng)論 0 364
  • 文/不壞的土叔 我叫張陵计雌,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我玫霎,道長(zhǎng)凿滤,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,199評(píng)論 1 300
  • 正文 為了忘掉前任庶近,我火速辦了婚禮翁脆,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘鼻种。我一直安慰自己反番,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,196評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布叉钥。 她就那樣靜靜地躺著罢缸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪投队。 梳的紋絲不亂的頭發(fā)上枫疆,一...
    開(kāi)封第一講書(shū)人閱讀 52,793評(píng)論 1 314
  • 那天,我揣著相機(jī)與錄音蛾洛,去河邊找鬼养铸。 笑死雁芙,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的钞螟。 我是一名探鬼主播兔甘,決...
    沈念sama閱讀 41,221評(píng)論 3 423
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼鳞滨!你這毒婦竟也來(lái)了洞焙?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 40,174評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤拯啦,失蹤者是張志新(化名)和其女友劉穎澡匪,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體褒链,經(jīng)...
    沈念sama閱讀 46,699評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡唁情,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,770評(píng)論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了甫匹。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片甸鸟。...
    茶點(diǎn)故事閱讀 40,918評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖兵迅,靈堂內(nèi)的尸體忽然破棺而出抢韭,到底是詐尸還是另有隱情,我是刑警寧澤恍箭,帶...
    沈念sama閱讀 36,573評(píng)論 5 351
  • 正文 年R本政府宣布刻恭,位于F島的核電站,受9級(jí)特大地震影響扯夭,放射性物質(zhì)發(fā)生泄漏鳍贾。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,255評(píng)論 3 336
  • 文/蒙蒙 一勉抓、第九天 我趴在偏房一處隱蔽的房頂上張望贾漏。 院中可真熱鬧,春花似錦藕筋、人聲如沸纵散。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,749評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)伍掀。三九已至,卻和暖如春暇藏,著一層夾襖步出監(jiān)牢的瞬間蜜笤,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,862評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工盐碱, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留把兔,地道東北人沪伙。 一個(gè)月前我還...
    沈念sama閱讀 49,364評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像县好,于是被迫代替她去往敵國(guó)和親围橡。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,926評(píng)論 2 361

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

  • 公司的項(xiàng)目最近集成了iOS內(nèi)購(gòu), 盡管網(wǎng)上有很多相當(dāng)詳細(xì)的內(nèi)購(gòu)集成教程, 但可能由于集成內(nèi)購(gòu)的應(yīng)用比較少, 市場(chǎng)需...
    偉哥最好閱讀 6,706評(píng)論 25 21
  • 自己開(kāi)發(fā)的視頻直播項(xiàng)目缕贡,牽涉到充值金幣翁授,用到了蘋(píng)果公司的內(nèi)購(gòu),趴坑了兩天晾咪,這里總結(jié)下實(shí)現(xiàn)蘋(píng)果內(nèi)購(gòu)收擦。 一. 創(chuàng)建測(cè)試...
    Leo丶Dicaprio閱讀 3,402評(píng)論 8 7
  • - 消耗型項(xiàng)目 就像你玩游戲需要買(mǎi)金幣,買(mǎi)鉆石等谍倦,只要花錢(qián)就可以無(wú)限次的購(gòu)買(mǎi) - 非消耗型項(xiàng)目 就像你在App S...
    tiger2016閱讀 655評(píng)論 0 1
  • iOS應(yīng)用如果涉及到支付功能塞赂,分為兩類(lèi):第三方支付和蘋(píng)果內(nèi)購(gòu)。那么什么情況下選擇使用第三方支付昼蛀,又在什么情況下選擇...
    ZfRee閱讀 38,931評(píng)論 36 66