更新內(nèi)購 (包括服務(wù)器雙向驗(yàn)證)

最近在更新版本,發(fā)現(xiàn)好多用戶來進(jìn)行應(yīng)用內(nèi)的服務(wù)退款,理由頻多,但是還不能確定用戶是否支付成功,所以看了一下蘋果內(nèi)購的官方文檔,發(fā)現(xiàn)有驗(yàn)證服務(wù)器的方法,于是就加上了楷拳。

具體內(nèi)購怎么做在這里就不說了,網(wǎng)上有詳細(xì)的講解。

首先內(nèi)購有幾種類別呢,這個一定要搞清楚,否則會遇到很多問題。在游戲中我們經(jīng)常用到的主要由分兩種:

非消耗品 (Nonconsumable)買了就有筑悴,頭銜谋逻,功能

指的是在游戲中一次性購買并擁有永久訪問權(quán)的物品或服務(wù)蘑险。非消耗品物品可以被用戶再次下載,并且能夠在用戶的所有設(shè)備上使用

消耗品 (Consumable)窄做,買了就用,用了就沒

專為支持可消耗的物品或服務(wù)設(shè)計的慰技,消耗品購買不可被再次下載椭盏,根據(jù)其特點(diǎn),消耗品不能在用戶的設(shè)備之間跨設(shè)備使用吻商,除非自定義服務(wù)在用戶的賬號之間共享這些信息庸汗。

接下來我們就開始應(yīng)用內(nèi)購,需要導(dǎo)入StoreKit框架手报。定義好的商品

#define kIAPBomb @ "airplay.10bombs"

#define kIAPBullet @"airplay.laserBullet"

1. 實(shí)例化請求時蚯舱,必須指定有效的identifiers集合改化,之所以如此處理,主要是為了確保提交的內(nèi)購商品真的通過了蘋果的審批枉昏,處于可用狀態(tài)陈肛!

2. 要想獲取到準(zhǔn)確的可用產(chǎn)品集合,需要通過代理方法實(shí)現(xiàn)

- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response

3. 越獄用戶無法測試內(nèi)購兄裂,但是可以購買

1@interfaceITViewController() <SKProductsRequestDelegate,SKPaymentTransactionObserver>

2{

3// 產(chǎn)品字典

4NSMutableDictionary*_productDict;

5}

1-(void)viewDidLoad

2{

3[super viewDidLoad];

4

5[self requestProducts];

6

7// 設(shè)置購買隊(duì)列的監(jiān)聽器

8[[SKPaymentQueue defaultQueue]addTransactionObserver:self];

9}

3.4.詢問蘋果的服務(wù)器能夠銷售哪些商品

#pragma mark 詢問蘋果的服務(wù)器能夠銷售哪些商品

- (void)requestProducts

{

// 能夠銷售的商品

NSSet*set=[[NSSetalloc] initWithObjects:kIAPBomb, kIAPBullet,nil];

// "異步"詢問蘋果能否銷售

SKProductsRequest*request = [[SKProductsRequestalloc] initWithProductIdentifiers:set];

request.delegate=self;

// 啟動請求

[request start];

}

3.5.獲取詢問結(jié)果句旱,成功采取操作把商品加入可售商品字典里

- (void)productsRequest:(SKProductsRequest*)request didReceiveResponse:(SKProductsResponse*)response

{

if(_productDict ==nil) {

_productDict=[NSMutableDictionarydictionaryWithCapacity:response.products.count];

}

for(SKProduct*productinresponse.products) {

// 激活了對應(yīng)的銷售操作按鈕,相當(dāng)于商店的商品上架允許銷售

NSLog(@"%@", product.productIdentifier);

if([product.productIdentifier isEqualToString:kIAPBullet]) {

_bulletButton.enabled=YES;

}

if([product.productIdentifier isEqualToString:kIAPBomb]) {

_bombButton.enabled=YES;

}

// 填充商品字典

[_productDict setObject:product forKey:product.productIdentifier];

}

}

3.6.用戶決定購買商品

1#pragma mark - 用戶決定購買商品

2- (void)buyProduct:(SKProduct*)product

3{

4// 要購買產(chǎn)品(店員給用戶開了個小票)

5SKPayment*payment =[SKPaymentpaymentWithProduct:product];

6

7//// 設(shè)置購買隊(duì)列的監(jiān)聽器

8//[[SKPaymentQueue defaultQueue] addTransactionObserver:self];

9

10// 去收銀臺排隊(duì)晰奖,準(zhǔn)備購買(異步網(wǎng)絡(luò))

11[[SKPaymentQueuedefaultQueue] addPayment:payment];

12}

1-(IBAction)purchaseProducts

2{

3[self buyProduct:_productDict[kIAPBullet]];

4}

5

6-(IBAction)purchaseBomb:(id)sender

7{

8[self buyProduct:_productDict[kIAPBomb]];

9}

3.7.判斷購買狀態(tài)是否成功

#pragma mark - SKPaymentTransaction Observer

#pragma mark 購買隊(duì)列狀態(tài)變化

- (void)paymentQueue:(SKPaymentQueue*)queue updatedTransactions:(NSArray*)transactions

{

// 調(diào)試

for(SKPaymentTransaction*transactionintransactions) {

NSLog(@"隊(duì)列狀態(tài)變化 %@", transaction);

// 如果小票狀態(tài)是購買完成

if(SKPaymentTransactionStatePurchased==transaction.transactionState) {

NSLog(@"購買完成 %@", transaction.payment.productIdentifier);

// 更新界面或者數(shù)據(jù)妻顶,把用戶購買得商品交給用戶

// ...

// 驗(yàn)證購買憑據(jù)

[selfverifyPruchase];

// 將交易從交易隊(duì)列中刪除

[[SKPaymentQueuedefaultQueue] finishTransaction:transaction];

}elseif(SKPaymentTransactionStateRestored==transaction.transactionState) {

NSLog(@"恢復(fù)成功 %@", transaction.payment.productIdentifier);

// 更新界面或者數(shù)據(jù),把用戶購買得商品交給用戶

// ...

// 將交易從交易隊(duì)列中刪除

[[SKPaymentQueuedefaultQueue] finishTransaction:transaction];

}

}

}

3.8.給用戶提供恢復(fù)功能(因?yàn)樵诓煌O(shè)備上永久性商品可能會出現(xiàn)需要恢復(fù)購買的情況)

#pragmamark-恢復(fù)商品

-(void)restorePurchase

{

// 恢復(fù)已經(jīng)完成的所有交易.(僅限永久有效商品)

[[SKPaymentQueue defaultQueue]restoreCompletedTransactions];

}

3.9.驗(yàn)證購買(防止第三方插件漏洞)iOS7新特性

提示:雖然蘋果在iOS7提升了購買憑據(jù)的安全性伯襟,但是處于金錢考慮馏锡,購買完成后,一定要做憑據(jù)的驗(yàn)證工作蛆楞。

#pragma mark 驗(yàn)證購買憑據(jù)

- (void)verifyPruchase

{

// 驗(yàn)證憑據(jù)溯乒,獲取到蘋果返回的交易憑據(jù)

// appStoreReceiptURL iOS7.0增加的,購買交易完成后豹爹,會將憑據(jù)存放在該地址

NSURL*receiptURL =[[NSBundlemainBundle] appStoreReceiptURL];

// 從沙盒中獲取到購買憑據(jù)

NSData*receiptData =[NSDatadataWithContentsOfURL:receiptURL];


// 發(fā)送網(wǎng)絡(luò)POST請求裆悄,對購買憑據(jù)進(jìn)行驗(yàn)證

NSURL*url =[NSURLURLWithString:ITMS_SANDBOX_VERIFY_RECEIPT_URL];

// 國內(nèi)訪問蘋果服務(wù)器比較慢,timeoutInterval需要長一點(diǎn)

13NSMutableURLRequest*request = [NSMutableURLRequestrequestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicytimeoutInterval:10.0f];

request.HTTPMethod =@"POST";

// 在網(wǎng)絡(luò)中傳輸數(shù)據(jù)臂聋,大多情況下是傳輸?shù)淖址皇嵌M(jìn)制數(shù)據(jù)

/ 傳輸?shù)氖荁ASE64編碼的字符串

/**

BASE64 常用的編碼方案光稼,通常用于數(shù)據(jù)傳輸,以及加密算法的基礎(chǔ)算法孩等,傳輸過程中能夠保證數(shù)據(jù)傳輸?shù)姆€(wěn)定性

BASE64是可以編碼和解碼的

*/

NSString*encodeStr =[receiptData base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed];


NSString*payload = [NSStringstringWithFormat:@"{\"receipt-data\" : \"%@\"}", encodeStr];

NSData*payloadData =[payload dataUsingEncoding:NSUTF8StringEncoding];


request.HTTPBody =payloadData;


// 提交驗(yàn)證請求钟哥,并獲得官方的驗(yàn)證JSON結(jié)果

NSData*result =[NSURLConnectionsendSynchronousRequest:request returningResponse:nilerror:nil];

// 官方驗(yàn)證結(jié)果為空

if(result ==nil) {

NSLog(@"驗(yàn)證失敗");

}


NSDictionary*dict =[NSJSONSerializationJSONObjectWithData:result options:NSJSONReadingAllowFragmentserror:nil];


NSLog(@"%@", dict);


if(dict !=nil) {

// 比對字典中以下信息基本上可以保證數(shù)據(jù)安全

// bundle_id&application_version&product_id&transaction_id

NSLog(@"驗(yàn)證成功");

}

}

3.9.說說整個購買流程結(jié)構(gòu)

1.蘋果APP(商家) ——— 2.告訴蘋果Store服務(wù)器要賣的商品 ——— 3.蘋果審核完(告訴你是否可以賣)

4.用戶(買商品) ———? 5.蘋果APP(商家) ——— ?6.開發(fā)票給(用戶) ————

7.用戶(拿著發(fā)票去蘋果Store服務(wù)器付款) —— 8.付款成功(用戶在APP里獲得服務(wù)商品)

(注意:如果要模擬測試內(nèi)購,需要用真機(jī)才可以測試)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末瞎访,一起剝皮案震驚了整個濱河市腻贰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌扒秸,老刑警劉巖播演,帶你破解...
    沈念sama閱讀 212,029評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異伴奥,居然都是意外死亡写烤,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,395評論 3 385
  • 文/潘曉璐 我一進(jìn)店門拾徙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來洲炊,“玉大人,你說我怎么就攤上這事≡莺猓” “怎么了询微?”我有些...
    開封第一講書人閱讀 157,570評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長狂巢。 經(jīng)常有香客問我撑毛,道長,這世上最難降的妖魔是什么唧领? 我笑而不...
    開封第一講書人閱讀 56,535評論 1 284
  • 正文 為了忘掉前任藻雌,我火速辦了婚禮,結(jié)果婚禮上斩个,老公的妹妹穿的比我還像新娘胯杭。我一直安慰自己,他們只是感情好受啥,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,650評論 6 386
  • 文/花漫 我一把揭開白布做个。 她就那樣靜靜地躺著,像睡著了一般腔呜。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上再悼,一...
    開封第一講書人閱讀 49,850評論 1 290
  • 那天核畴,我揣著相機(jī)與錄音,去河邊找鬼冲九。 笑死谤草,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的莺奸。 我是一名探鬼主播丑孩,決...
    沈念sama閱讀 39,006評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼灭贷!你這毒婦竟也來了温学?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,747評論 0 268
  • 序言:老撾萬榮一對情侶失蹤甚疟,失蹤者是張志新(化名)和其女友劉穎仗岖,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體览妖,經(jīng)...
    沈念sama閱讀 44,207評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡轧拄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,536評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了讽膏。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片檩电。...
    茶點(diǎn)故事閱讀 38,683評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出俐末,到底是詐尸還是另有隱情料按,我是刑警寧澤,帶...
    沈念sama閱讀 34,342評論 4 330
  • 正文 年R本政府宣布鹅搪,位于F島的核電站站绪,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏丽柿。R本人自食惡果不足惜恢准,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,964評論 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望甫题。 院中可真熱鬧馁筐,春花似錦、人聲如沸坠非。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,772評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽炎码。三九已至盟迟,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間潦闲,已是汗流浹背攒菠。 一陣腳步聲響...
    開封第一講書人閱讀 32,004評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留歉闰,地道東北人辖众。 一個月前我還...
    沈念sama閱讀 46,401評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像和敬,于是被迫代替她去往敵國和親凹炸。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,566評論 2 349

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

  • iOS應(yīng)用如果涉及到支付功能昼弟,分為兩類:第三方支付和蘋果內(nèi)購啤它。那么什么情況下選擇使用第三方支付,又在什么情況下選擇...
    ZfRee閱讀 38,837評論 36 66
  • 自己開發(fā)的視頻直播項(xiàng)目舱痘,牽涉到充值金幣蚕键,用到了蘋果公司的內(nèi)購,趴坑了兩天衰粹,這里總結(jié)下實(shí)現(xiàn)蘋果內(nèi)購锣光。 一. 創(chuàng)建測試...
    Leo丶Dicaprio閱讀 3,365評論 8 7
  • iOS應(yīng)用內(nèi)付費(fèi)(IAP)開發(fā)步驟 1.蘋果iTunes Connect內(nèi)購產(chǎn)品信息錄入。 1)創(chuàng)建app內(nèi)購買項(xiàng)...
    MillerWang閱讀 10,986評論 0 7
  • 關(guān)于dom操作铝耻,我們分創(chuàng)建誊爹、增蹬刷、刪、改频丘、查办成、屬性操作、事件操作來大體介紹一下 創(chuàng)建 1.createElement...
    cb12hx閱讀 2,178評論 1 2
  • 混沌.
    歐姆奶奶閱讀 154評論 0 0