IAP內(nèi)購

服務(wù)器模式:

使用這種方式,要提供另外的服務(wù)器將產(chǎn)品發(fā)送給程序了罪。 服務(wù)器交付適用于訂閱锭环、內(nèi)容類商品和服務(wù),因為商品可以作為數(shù)據(jù)發(fā)送泊藕,而不需改動程序束辅辩。

例如,一個游戲提供的新的內(nèi)容(關(guān)卡等)。 Store Kit不會對服務(wù)器端的設(shè)計和交互做出定義玫锋,這方面工作需要你來完成蛾茉。 而且,Store

Kit不提供驗證用戶身份的機(jī)制撩鹿,你需要來設(shè)計谦炬。 如果你的程序需要以上功能,例如节沦,紀(jì)錄特定用戶的訂閱計劃键思, 你需要自己來設(shè)計和實現(xiàn)。

服務(wù)器類型的購買過程

1. 程序向服務(wù)器發(fā)送請求甫贯,獲得一份產(chǎn)品列表吼鳞。

2. 服務(wù)器返回包含產(chǎn)品標(biāo)識符的列表。

3. 程序向App Store發(fā)送請求获搏,得到產(chǎn)品的信息赖条。

4. App Store返回產(chǎn)品信息失乾。

5. 程序把返回的產(chǎn)品信息顯示給用戶(App的store界面)

6. 用戶選擇某個產(chǎn)品

7. 程序向App Store發(fā)送支付請求

8. App Store處理支付請求并返回交易完成信息常熙。

9. 程序從信息中獲得數(shù)據(jù),并發(fā)送至服務(wù)器碱茁。

10. 服務(wù)器紀(jì)錄數(shù)據(jù)裸卫,并進(jìn)行審(我們的)查。

11. 服務(wù)器將數(shù)據(jù)發(fā)給App Store來驗證該交易的有效性纽竣。

12. App Store對收到的數(shù)據(jù)進(jìn)行解析墓贿,返回該數(shù)據(jù)和說明其是否有效的標(biāo)識。

13. 服務(wù)器讀取返回的數(shù)據(jù)蜓氨,確定用戶購買的內(nèi)容聋袋。

14. 服務(wù)器將購買的內(nèi)容傳遞給程序。

Apple建議在服務(wù)器端存儲產(chǎn)品標(biāo)識穴吹,而不要將其存儲在plist中幽勒。 這樣就可以在不升級程序的前提下添加新的產(chǎn)品。

在服務(wù)器模式下港令, 你的程序?qū)@得交易(transaction)相關(guān)的信息啥容,并將它發(fā)送給服務(wù)器。服務(wù)器可以驗證收到的數(shù)據(jù)顷霹,并將其解碼以確定需要交付的內(nèi)容咪惠。 這個流程將在“驗證store收據(jù)”一節(jié)討論。

對于服務(wù)器模式淋淀,我們有安全性和可靠性方面的顧慮遥昧。 你應(yīng)該測試整個環(huán)境來避免威脅。《Secure Coding Guide》文檔中有相關(guān)的提示說明炭臭。

雖然非消耗性商品可以用內(nèi)置模式來恢復(fù)叫乌,訂閱類商品必須通過服務(wù)器來恢復(fù)。你要負(fù)責(zé)紀(jì)錄訂閱信息徽缚、恢復(fù)數(shù)據(jù)憨奸。 消耗類商品也可以通過服務(wù)器方式來紀(jì)錄。例如凿试,由服務(wù)器提供的一項服務(wù)排宰, 你可能需要用戶在多個設(shè)備上重新獲得結(jié)果。

蘋果服務(wù)端配置指南:

使用IAP內(nèi)購的準(zhǔn)備工作那婉。通常需要經(jīng)過以下幾個步驟(下面的準(zhǔn)備工作是針對真機(jī)的Provisioning Profile配置過程板甘,模擬器無法測試IAP內(nèi)購):

1.在蘋果開發(fā)者中心創(chuàng)建支持IAP服務(wù)的App ID并指定具體的Bundle ID,假設(shè)是“com.tj.xxx”(注意這個Bundle ID就是日后要開發(fā)的游戲的Bundle ID)详炬。

2.基于“com.tj.xxx”創(chuàng)建開發(fā)者配置文件(或描述文件)并導(dǎo)入對應(yīng)的設(shè)備(創(chuàng)建過程中選擇支持IAP內(nèi)購服務(wù)的App ID盐类,這樣iOS設(shè)備在運(yùn)行指定Boundle ID應(yīng)用程序就知道此應(yīng)用支持IAP內(nèi)購服務(wù))。

3.在iTunes Connect中創(chuàng)建一個應(yīng)用(假設(shè)叫“IAPTest”呛谜,這是一款含有內(nèi)購的游戲)并指定“套裝ID”為之前創(chuàng)建的“com.tj.xxx”在跳,讓應(yīng)用和這個App關(guān)聯(lián)(注意這個應(yīng)用不需要提交)。

4.在iTunes Connect的“用戶和職能”中創(chuàng)建沙盒測試用戶隐岛。(測試階段用沙盒用戶可以進(jìn)行購買猫妙,購買任何東西不用擔(dān)心被扣錢)。

5.到iTuens Connect中設(shè)置“App 內(nèi)購買項目”聚凹,這里仍然以上面的“IAPest”項目為例割坠,假設(shè)這個游戲中有一種道具,為“能量瓶”(為玩家提供能量)妒牙,@“能量瓶”屬于消耗品彼哼,用完一次必須再次購買。

6.到iTunes Connect中找到“協(xié)議湘今、稅務(wù)和銀行業(yè)務(wù)”增加“iOS Paid Applications”協(xié)議敢朱,并完成所有配置后等待審核通過(注意這一步如果不設(shè)置在應(yīng)用程序中無法獲得可購買產(chǎn)品)。

在iOS“設(shè)置”中找到”iTunes Store與App Store“象浑,在這里可以選擇使用沙盒用戶登錄或者處于注銷狀態(tài)蔫饰,但是一定注意不能使用真實用戶登錄,否則下面的購買測試不會成功愉豺,因為到目前為止我們的應(yīng)用并沒有真正通過蘋果官方審核篓吁,所以只能用沙盒測試用戶。

7.有了上面的設(shè)置之后保證應(yīng)用程序Bundle ID和iTunes Connect中的Bundle ID(或者說App ID中配置的Bundle ID)一致即可準(zhǔn)備開發(fā)蚪拦。

ios客戶端

#import

@interface JarIAPManager ()

{

id _observer;

}

@end

@implementation JarIAPManager

+ (instancetype)defaultManager{

static JarIAPManager *defaultManager = nil;

static dispatch_once_t onceToken = 0;

dispatch_once(&onceToken, ^{

defaultManager = [[JarIAPManager alloc]? init];

});

return defaultManager;

}

- (instancetype)init{

self = [super init];

if (self) {

[[SKPaymentQueue defaultQueue] addTransactionObserver:self];

_observer = [[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationDidEnterBackgroundNotification object:self queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *note) {

for (SKPaymentTransaction * paymentTransaction in [SKPaymentQueue defaultQueue].transactions) {

[[SKPaymentQueue defaultQueue] finishTransaction:paymentTransaction];

}

}];

}

return self;

}

- (void)dealloc{

[[SKPaymentQueue defaultQueue] removeTransactionObserver:self];

[[NSNotificationCenter defaultCenter] removeObserver:_observer];

_observer = nil;

}

-(BOOL)iapEnable{

return [SKPaymentQueue canMakePayments];

}

#pragma mark --purchase product

//根據(jù)產(chǎn)品標(biāo)識符去購買產(chǎn)品--[購買結(jié)果]

- (void)purchaseProductWithIdenfifier:(NSString *)productIdentifier Order:(NSString *)Order{

//該字符串標(biāo)識一個特定的產(chǎn)品和用戶原意購買的數(shù)量

SKMutablePayment * payment = [[SKMutablePayment alloc] init];

payment.productIdentifier = productIdentifier;

NSData *datas = [Order dataUsingEncoding:NSUTF8StringEncoding];

payment.requestData =datas;

[[SKPaymentQueue defaultQueue] addPayment:payment];

}

//SKPaymentTransactionObserver協(xié)議---[更常用的做法還是等待支付隊列告知交易狀態(tài)的更新杖剪。]

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

__weak typeof(self)weakSelf = self;

for (SKPaymentTransaction * paymentTransaction in transactions) {

//小票狀態(tài)--》支付交易的狀態(tài)

switch (paymentTransaction.transactionState) {

case SKPaymentTransactionStatePurchasing:

{

NSLog(@"JarIAPManager: Transaction is being added to the server queue.");

}

break;

case SKPaymentTransactionStatePurchased:

{

NSLog(@"JarIAPManager: Transaction is in queue, user has been charged.? Client should complete the transaction.");

[weakSelf purchaseSuccessForTransaction:paymentTransaction];

}

break;

case SKPaymentTransactionStateFailed:

{

NSLog(@"JarIAPManager: Transaction was cancelled or failed before being added to the server queue.");

[weakSelf purchaseFailedForTransaction:paymentTransaction];

}

break;

case SKPaymentTransactionStateRestored:

{

NSLog(@"JarIAPManager: Transaction was restored from user's purchase history.? Client should complete the transaction.");

[[SKPaymentQueue defaultQueue] finishTransaction:paymentTransaction];

}

default:

break;

}

}

}

執(zhí)行

- (void)purchaseFailedForTransaction:(SKPaymentTransaction *)transaction{

NSLog(@"失敗流水--》%@",transaction.transactionIdentifier);

if (transaction != nil) {

[[Toast makeText:@"交易取消冻押。" duration:3000] show:NO];

}

[[SKPaymentQueue defaultQueue] finishTransaction:transaction];

}

- (void)purchaseSuccessForTransaction:(SKPaymentTransaction *)transaction{

__weak typeof(self)weakSelf = self;

// 驗證憑證,獲取蘋果返回的交易憑證

// appStoreReceiptURL iOS7.0增加的盛嘿,購買交易完成后洛巢,會將憑證存儲在該地址

NSURL * receiptURL = [[NSBundle mainBundle] appStoreReceiptURL];

// 從沙盒中獲取到購買憑證

NSData * receiptData = [NSData dataWithContentsOfURL:receiptURL];

//base64加密

NSString *encodeStr = [receiptData base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed];

//打包成字典

NSMutableDictionary * parDic = [NSMutableDictionary dictionaryWithCapacity:3];

NSString *Order = [[NSString alloc] initWithData:transaction.payment.requestData encoding:NSUTF8StringEncoding];

DICT_SET_STRING(Order,TAG_ORDER, parDic);

DICT_SET_STRING(encodeStr, TAG_RECEIPT_DATA, parDic);

NSLog(@"下單成功的Order--》%@",Order);

if (Order !=NULL) {

//提前緩存

[[JarIAPSqliteService sharedInstance] insertTestListTransactionWithDic:parDic];

//??????? //檢測是否已經(jīng)存儲過了

//??????? NSMutableArray *getTestDatas = [[NSMutableArray alloc] init];

//??????? getTestDatas = [[JarIAPSqliteService sharedInstance] getTestList];

//??????? NSLog(@"存儲后的Order個數(shù)-->%ld",(unsigned long)getTestDatas.count);

//??????? if (getTestDatas.count != 0) {

//??????????? for (NSMutableDictionary * dic in getTestDatas) {

//??????????????? NSLog(@"存儲后的Order---》%@",dic[TAG_ORDER]);

//??????????? }

//??????? }else{

//??????????? NSLog(@"存儲為0.");

//??????? }

//發(fā)送到SDK服務(wù)器

[[LoginDataSource sharedInstance] verifyThePurchaseWithDictData:parDic completion:^(NSDictionary *resultData, NSError *error) {

if ([resultData[TAG_RESULT] intValue] == 0 || Order.length != 0) {

[weakSelf actionWithResult:resultData OrderStr:eOrder];//執(zhí)行刪除

}

}];

}

[[SKPaymentQueue defaultQueue] finishTransaction:transaction];

}

參考鏈接:

http://mobile.51cto.com/iphone-410162.htm? 比較全的文檔介紹

http://www.cocoachina.com/ios/20150129/11068.html demo

http://www.2cto.com/kf/201504/389224.html 有訂閱

http://blog.csdn.net/xingchen1106/article/details/45477433

http://blog.jobbole.com/38032/ 唐巧介紹安全

http://blog.csdn.net/fly_fish456/article/details/8955871

http://www.tairan.com/archives/2215/

【后期要理解的安全性,以及沙盒和正式環(huán)境】

http://www.360doc.com/content/14/1113/15/12282510_424834793.shtml

http://www.cocoachina.com/special/iap.html

http://www.2cto.com/kf/201504/389224.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末次兆,一起剝皮案震驚了整個濱河市稿茉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌芥炭,老刑警劉巖漓库,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異园蝠,居然都是意外死亡渺蒿,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進(jìn)店門彪薛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來茂装,“玉大人,你說我怎么就攤上這事善延∩偬” “怎么了?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵挚冤,是天一觀的道長况增。 經(jīng)常有香客問我,道長训挡,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任歧强,我火速辦了婚禮澜薄,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘摊册。我一直安慰自己肤京,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布茅特。 她就那樣靜靜地躺著忘分,像睡著了一般。 火紅的嫁衣襯著肌膚如雪白修。 梳的紋絲不亂的頭發(fā)上妒峦,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天,我揣著相機(jī)與錄音兵睛,去河邊找鬼肯骇。 笑死窥浪,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的笛丙。 我是一名探鬼主播漾脂,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼胚鸯!你這毒婦竟也來了骨稿?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤姜钳,失蹤者是張志新(化名)和其女友劉穎啊终,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體傲须,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蓝牲,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了泰讽。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片例衍。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖已卸,靈堂內(nèi)的尸體忽然破棺而出佛玄,到底是詐尸還是另有隱情,我是刑警寧澤累澡,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布梦抢,位于F島的核電站,受9級特大地震影響愧哟,放射性物質(zhì)發(fā)生泄漏奥吩。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一蕊梧、第九天 我趴在偏房一處隱蔽的房頂上張望霞赫。 院中可真熱鬧,春花似錦肥矢、人聲如沸端衰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽旅东。三九已至,卻和暖如春十艾,著一層夾襖步出監(jiān)牢的瞬間抵代,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工疟羹, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留主守,地道東北人禀倔。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像参淫,于是被迫代替她去往敵國和親救湖。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,901評論 2 345

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

  • 首先,用戶在購買產(chǎn)品時耍铜,應(yīng)用程序從應(yīng)用商店獲取該產(chǎn)品的信息邑闺,把商店 界面提供給用戶,然后讓用戶選擇產(chǎn)品棕兼,如下圖中第...
    Dosun閱讀 7,891評論 0 3
  • 購買過程的最后一部分是應(yīng)用程序等待應(yīng)用商店處理支付請求伴挚,存儲本次購買的信息以便將來啟動靶衍,下載購買的內(nèi)容,然后標(biāo)記交...
    Dosun閱讀 1,117評論 0 1
  • 1 、在iTunes Connect中田弥,每個應(yīng)用程序可以創(chuàng)建多少格內(nèi)置購買產(chǎn)品 ID 涛酗? 閱讀 In-App Pu...
    Dosun閱讀 3,876評論 0 0
  • 在我們應(yīng)用開發(fā)中我們經(jīng)常在自己的項目中使用到支付,下面我們來談?wù)刬OS這塊的支付偷厦;iOS支付主要分為兩類商叹,第三方支...
    Hither閱讀 8,257評論 9 42
  • 介紹 分享下自己做內(nèi)購遇到問題,總結(jié)出來的經(jīng)驗沪哺。 接入 使用RMStore沈自。 1、使用RMStore的接入步驟 2...
    落影l(fā)oyinglin閱讀 6,148評論 31 21