iOS-蘋(píng)果內(nèi)購(gòu)

網(wǎng)上關(guān)于蘋(píng)果內(nèi)購(gòu)已經(jīng)有無(wú)數(shù)的文章,最近剛好接觸蘋(píng)果內(nèi)購(gòu),簡(jiǎn)單總結(jié)一下整體流程:
① 蘋(píng)果結(jié)算賬戶(hù)信息,公司信息填寫(xiě)(非開(kāi)發(fā)人員任務(wù))
② 創(chuàng)建新的待提交App版本
③ 創(chuàng)建蘋(píng)果內(nèi)購(gòu)商品信息(寶石,金幣)
④ 創(chuàng)建沙盒測(cè)試賬號(hào)
⑤ 支付功能開(kāi)發(fā)
中間在創(chuàng)建商品信息的時(shí)候圖片格式要求是640920海诲,上傳7501136一直不通過(guò),后來(lái)改了圖片尺寸之后640*960才通過(guò)~
核心代碼:

//沙盒測(cè)試環(huán)境驗(yàn)證
static NSString *SANDBOX=@"https://sandbox.itunes.apple.com/verifyReceipt";
//正式環(huán)境驗(yàn)證
static NSString *AppStore=@"https://buy.itunes.apple.com/verifyReceipt";

@interface ViewController () <SKPaymentTransactionObserver,SKProductsRequestDelegate>

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    [[SKPaymentQueue defaultQueue] addTransactionObserver:self];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (IBAction)applePayAction:(UIButton *)sender {
    if([SKPaymentQueue canMakePayments]){
        NSArray *product = [[NSArray alloc] initWithObjects:@"talkmate.coin01",nil];
        
        NSSet *nsset = [NSSet setWithArray:product];
        SKProductsRequest *request = [[SKProductsRequest alloc] initWithProductIdentifiers:nsset];
        request.delegate = self;
        [request start];
    }else{
        NSLog(@"FlyElephant-不允許進(jìn)行蘋(píng)果內(nèi)購(gòu)");
    }
}

#pragma mark - SKProductsRequestDelegate
//接收到產(chǎn)品返回信息
- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response {
    NSLog(@"productsRequest----didReceiveResponse-------------------");
    NSArray *product = response.products;
    if([product count] == 0){
        return;
    }
    
    NSLog(@"productID:%@", response.invalidProductIdentifiers);
    NSLog(@"產(chǎn)品付費(fèi)數(shù)量:%lu",(unsigned long)[product count]);
    
    for (SKProduct *pro in product) {
        NSLog(@"%@", [pro description]);
        NSLog(@"%@", [pro localizedTitle]);
        NSLog(@"%@", [pro localizedDescription]);
        NSLog(@"%@", [pro price]);
        NSLog(@"%@", [pro productIdentifier]);
        
        SKPayment *payment = [SKPayment paymentWithProduct:pro];
        
        NSLog(@"FlyElephant--發(fā)送蘋(píng)果內(nèi)購(gòu)");
        [[SKPaymentQueue defaultQueue] addPayment:payment];
    }
}

- (void)request:(SKRequest *)request didFailWithError:(NSError *)error {
    NSLog(@"request---didFailWithError");
}

- (void)requestDidFinish:(SKRequest *)request {
    NSLog(@"requestDidFinish");
}

#pragma mark - SKPaymentTransactionObserver

- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray<SKPaymentTransaction *> *)transactions {
    for(SKPaymentTransaction *tran in transactions){
        switch (tran.transactionState) {
            case SKPaymentTransactionStatePurchased:{
                NSLog(@"交易完成");
                [self verifyPurchaseWithPaymentTransaction];
                [[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];
            }
                break;
            default:
                break;
        }
    }
}

//交易結(jié)束
- (void)completeTransaction:(SKPaymentTransaction *)transaction{
    NSLog(@"交易結(jié)束");
    [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
}

//驗(yàn)證購(gòu)買(mǎi)檩互,避免越獄軟件模擬蘋(píng)果請(qǐng)求達(dá)到非法購(gòu)買(mǎi)問(wèn)題

-(void)verifyPurchaseWithPaymentTransaction{
    //從沙盒中獲取交易憑證并且拼接成請(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];

    //創(chuàng)建請(qǐng)求到蘋(píng)果官方進(jìn)行購(gòu)買(mǎi)驗(yàn)證
    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){
        NSDictionary *dicReceipt= dic[@"receipt"];
        NSDictionary *dicInApp=[dicReceipt[@"in_app"] firstObject];
        NSLog(@"購(gòu)買(mǎi)成功:%@---%@",dicReceipt,dicInApp);
        //服務(wù)端處理,或者本地處理
    }else{
        NSLog(@"購(gòu)買(mǎi)失敗闸昨,未通過(guò)驗(yàn)證蚯斯!");
    }
}

@end

最終服務(wù)端Token的返回字典:

            {
                environment = Sandbox;
                receipt =     {
                    "adam_id" = 0;
                    "app_item_id" = 0;
                    "application_version" = "1.0.2";
                    "bundle_id" = “FlyElephant”;
                    "download_id" = 0;
                    "in_app" =         (
                    {
                    "is_trial_period" = false;
                    "original_purchase_date" = "2016-11-18 10:55:00 Etc/GMT";
                    "original_purchase_date_ms" = 1479466500000;
                    "original_purchase_date_pst" = "2016-11-18 02:55:00 America/Los_Angeles";
                    "original_transaction_id" = 1000000251845596;
                    "product_id" = “FlyElephant”;
                    "purchase_date" = "2016-11-18 10:55:00 Etc/GMT";
                    "purchase_date_ms" = 1479466500000;
                    "purchase_date_pst" = "2016-11-18 02:55:00 America/Los_Angeles";
                    quantity = 1;
                    "transaction_id" = 1000000251845596;
                },
                );
                "original_application_version" = "1.0";
                "original_purchase_date" = "2013-08-01 07:00:00 Etc/GMT";
                "original_purchase_date_ms" = 1375340400000;
                "original_purchase_date_pst" = "2013-08-01 00:00:00 America/Los_Angeles";
                "receipt_creation_date" = "2016-12-09 10:31:52 Etc/GMT";
                "receipt_creation_date_ms" = 1481279512000;
                "receipt_creation_date_pst" = "2016-12-09 02:31:52 America/Los_Angeles";
                "receipt_type" = ProductionSandbox;
                "request_date" = "2016-12-09 10:31:56 Etc/GMT";
                "request_date_ms" = 1481279516562;
                "request_date_pst" = "2016-12-09 02:31:56 America/Los_Angeles";
                "version_external_identifier" = 0;
        };
        status = 0;
    }

效果圖:

FlyElephant.jpeg
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市零院,隨后出現(xiàn)的幾起案子溉跃,更是在濱河造成了極大的恐慌,老刑警劉巖告抄,帶你破解...
    沈念sama閱讀 221,198評(píng)論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件撰茎,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡打洼,警方通過(guò)查閱死者的電腦和手機(jī)龄糊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)募疮,“玉大人炫惩,你說(shuō)我怎么就攤上這事“⑴ǎ” “怎么了他嚷?”我有些...
    開(kāi)封第一講書(shū)人閱讀 167,643評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)芭毙。 經(jīng)常有香客問(wèn)我筋蓖,道長(zhǎng),這世上最難降的妖魔是什么退敦? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,495評(píng)論 1 296
  • 正文 為了忘掉前任粘咖,我火速辦了婚禮,結(jié)果婚禮上侈百,老公的妹妹穿的比我還像新娘瓮下。我一直安慰自己翰铡,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布讽坏。 她就那樣靜靜地躺著锭魔,像睡著了一般。 火紅的嫁衣襯著肌膚如雪震缭。 梳的紋絲不亂的頭發(fā)上赂毯,一...
    開(kāi)封第一講書(shū)人閱讀 52,156評(píng)論 1 308
  • 那天战虏,我揣著相機(jī)與錄音拣宰,去河邊找鬼。 笑死烦感,一個(gè)胖子當(dāng)著我的面吹牛巡社,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播手趣,決...
    沈念sama閱讀 40,743評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼晌该,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了绿渣?” 一聲冷哼從身側(cè)響起朝群,我...
    開(kāi)封第一講書(shū)人閱讀 39,659評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎中符,沒(méi)想到半個(gè)月后姜胖,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,200評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡淀散,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評(píng)論 3 340
  • 正文 我和宋清朗相戀三年右莱,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片档插。...
    茶點(diǎn)故事閱讀 40,424評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡慢蜓,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出郭膛,到底是詐尸還是另有隱情晨抡,我是刑警寧澤,帶...
    沈念sama閱讀 36,107評(píng)論 5 349
  • 正文 年R本政府宣布则剃,位于F島的核電站耘柱,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏忍级。R本人自食惡果不足惜帆谍,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望轴咱。 院中可真熱鬧汛蝙,春花似錦烈涮、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,264評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至西土,卻和暖如春讶舰,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背需了。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,390評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工跳昼, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人肋乍。 一個(gè)月前我還...
    沈念sama閱讀 48,798評(píng)論 3 376
  • 正文 我出身青樓鹅颊,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親墓造。 傳聞我的和親對(duì)象是個(gè)殘疾皇子堪伍,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評(píng)論 2 359

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

  • 參考文章 官方文檔 iOS開(kāi)發(fā)內(nèi)購(gòu)全套圖文教程 App Store上架指導(dǎo) 蘋(píng)果不允許 iOS 應(yīng)用內(nèi)置購(gòu)買(mǎi)(IA...
    劉大帥閱讀 4,905評(píng)論 8 36
  • 1、首先需要在 https://itunesconnect.apple.com 創(chuàng)建一個(gè)APP觅闽,如果還沒(méi)有在 ht...
    管樂(lè)_VICTOR閱讀 661評(píng)論 0 0
  • 前段時(shí)間因?yàn)楣咎砑恿酥Ц稑I(yè)務(wù)帝雇,于是集成了支付寶和內(nèi)購(gòu)。悲劇的是蛉拙,??尸闸,因?yàn)閷殞毐痪芰恕D镁鋺?yīng)景的話說(shuō)刘离,寶寶生氣了室叉,...
    迷了jiang閱讀 903評(píng)論 0 1
  • 一, 王浩在豪門(mén)KTV樓下待了很久硫惕,他猶豫著要不要上去茧痕,要是擱前幾年,王浩是不屑來(lái)這種場(chǎng)所的恼除。...
    李杰靈閱讀 886評(píng)論 0 3
  • 最近在閱讀時(shí)看到了孔子的弟子子貢經(jīng)商的故事踪旷,感覺(jué)子貢不但能言善辯,還是春秋時(shí)期很有經(jīng)濟(jì)頭腦的一位...
    君芝蘭閱讀 614評(píng)論 0 0