StoreKitGuide(InAppPurchase)中文手冊(cè)_第1頁(yè)
StoreKitGuide(InAppPurchase)中文手冊(cè)_第2頁(yè)
StoreKitGuide(InAppPurchase)中文手冊(cè)_第3頁(yè)
StoreKitGuide(InAppPurchase)中文手冊(cè)_第4頁(yè)
StoreKitGuide(InAppPurchase)中文手冊(cè)_第5頁(yè)
已閱讀5頁(yè),還剩13頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、Store Kit Guide(In App Purchase)中文手冊(cè)一、In AppPurchase概覽Store Kit代表App和App Store之間進(jìn)行通信。程序?qū)腁pp Store接收那些你想要提供的產(chǎn)品的信息,并將它們顯示出來(lái)供用戶購(gòu)買(mǎi)。當(dāng)用戶需要購(gòu)買(mǎi)某件產(chǎn)品時(shí),程序調(diào)用StoreKit來(lái)收集購(gòu)買(mǎi)信息。下圖即為基本的store kit 模型:Store Kit的API只是為程序添加In AppPurchase功能的一小部分。你需要決定如何去記錄那些你想要提交的產(chǎn)品,如何在程序中將商店功能展現(xiàn)給用戶,還要考慮如何將用戶購(gòu)買(mǎi)的產(chǎn)品提交。本章的剩余部分會(huì)展示整個(gè)流程。Product

2、s產(chǎn)品可以是任意一項(xiàng)你想要出售的特性。產(chǎn)品在iTunes Connect中被組織,這和你添加一個(gè)新的App是一樣的。支持的產(chǎn)品種類共有四種:1. 內(nèi)容型。包括電子書(shū),電子雜志,照片,插圖,游戲關(guān)卡,游戲角色,和其他的數(shù)字內(nèi)容。2. 擴(kuò)展功能。這些功能已經(jīng)包含在App內(nèi)部。在未購(gòu)買(mǎi)之前被鎖定。例如,你可以在一個(gè)游戲程序中包含若干個(gè)小游戲,用戶可以分別來(lái)購(gòu)買(mǎi)這些游戲。3. 服務(wù)。允許程序?qū)未畏?wù)收費(fèi)。比如錄音服務(wù)。4. 訂閱。支持對(duì)內(nèi)容或服務(wù)的擴(kuò)展訪問(wèn)。例如,你的程序可以每周提供財(cái)務(wù)信息或游戲門(mén)戶網(wǎng)站的信息。應(yīng)該設(shè)定一個(gè)合理的更新周期,以避免過(guò)于頻繁的提示困擾用戶。要記?。耗銓⒇?fù)責(zé)跟蹤訂閱的過(guò)期

3、信息,并且管理續(xù)費(fèi)。App Store不會(huì)替你監(jiān)視訂閱的周期,也不提供自動(dòng)收費(fèi)的機(jī)制。In AppPurchase為創(chuàng)建產(chǎn)品提供了一種通用的機(jī)制,如何操作將由你負(fù)責(zé)。當(dāng)你設(shè)計(jì)程序的時(shí)候,有以下幾點(diǎn)需要注意:1. 你必須提供電子類產(chǎn)品和服務(wù)。不要使用In AppPurchase去出售實(shí)物和實(shí)際服務(wù)。2. 不能提供代表中介貨幣的物品,因?yàn)樽層脩糁獣运麄冑?gòu)買(mǎi)的商品和服務(wù)是很重要的。2. 服務(wù)器類型使用這終方式,要提供另外的服務(wù)器將產(chǎn)品發(fā)送給程序。 服務(wù)器交付適用于訂閱、內(nèi)容類商品和服務(wù),因?yàn)樯唐房梢宰鳛閿?shù)據(jù)發(fā)送,而不需改動(dòng)程序束。 例如,一個(gè)游戲提供的新的內(nèi)容(關(guān)卡等)。 Store Kit不會(huì)對(duì)服

4、務(wù)器端的設(shè)計(jì)和交互做出定義,這方面工作需要你來(lái)完成。 而且,Store Kit不提供驗(yàn)證用戶身份的機(jī)制,你需要來(lái)設(shè)計(jì)。 如果你的程序需要以上功能,例如,紀(jì)錄特定用戶的訂閱計(jì)劃, 你需要自己來(lái)設(shè)計(jì)和實(shí)現(xiàn)。圖1-3 展示了服務(wù)器類型的購(gòu)買(mǎi)過(guò)程。1. 程序向服務(wù)器發(fā)送請(qǐng)求,獲得一份產(chǎn)品列表。2. 服務(wù)器返回包含產(chǎn)品標(biāo)識(shí)符的列表。3. 程序向App Store發(fā)送請(qǐng)求,得到產(chǎn)品的信息。4. App Store返回產(chǎn)品信息。5. 程序把返回的產(chǎn)品信息顯示給用戶(App的store界面)6. 用戶選擇某個(gè)產(chǎn)品7. 程序向App Store發(fā)送支付請(qǐng)求8. App Store處理支付請(qǐng)求并返回交易完成信息。

5、9. 程序從信息中獲得數(shù)據(jù),并發(fā)送至服務(wù)器。10. 服務(wù)器紀(jì)錄數(shù)據(jù),并進(jìn)行審(我們的)查。11. 服務(wù)器將數(shù)據(jù)發(fā)給App Store來(lái)驗(yàn)證該交易的有效性。12. App Store對(duì)收到的數(shù)據(jù)進(jìn)行解析,返回該數(shù)據(jù)和說(shuō)明其是否有效的標(biāo)識(shí)。13. 服務(wù)器讀取返回的數(shù)據(jù),確定用戶購(gòu)買(mǎi)的內(nèi)容。14. 服務(wù)器將購(gòu)買(mǎi)的內(nèi)容傳遞給程序。Apple建議在服務(wù)器端存儲(chǔ)產(chǎn)品標(biāo)識(shí),而不要將其存儲(chǔ)在plist中。 這樣就可以在不升級(jí)程序的前提下添加新的產(chǎn)品。在服務(wù)器模式下, 你的程序?qū)@得交易(transaction)相關(guān)的信息,并將它發(fā)送給服務(wù)器。服務(wù)器可以驗(yàn)證收到的數(shù)據(jù),并將其解碼以確定需要交付的內(nèi)容。 這個(gè)流程

6、將在“驗(yàn)證store收據(jù)”一節(jié)討論。對(duì)于服務(wù)器模式,我們有安全性和可靠性方面的顧慮。 你應(yīng)該測(cè)試整個(gè)環(huán)境來(lái)避免威脅。Secure Coding Guide文檔中有相關(guān)的提示說(shuō)明。雖然非消耗性商品可以用內(nèi)置模式來(lái)恢復(fù),訂閱類商品必須通過(guò)服務(wù)器來(lái)恢復(fù)。你要負(fù)責(zé)紀(jì)錄訂閱信息、恢復(fù)數(shù)據(jù)。消耗類商品也可以通過(guò)服務(wù)器方式來(lái)紀(jì)錄。例如,由服務(wù)器提供的一項(xiàng)服務(wù), 你可能需要用戶在多個(gè)設(shè)備上重新獲得結(jié)果。(這段翻譯的比較生硬,因?yàn)槲覀€(gè)人也沒(méi)有機(jī)會(huì)把各種類型的服務(wù)跑一遍,后續(xù)會(huì)檢查并修改。希望大家一起來(lái)看看,歡迎補(bǔ)充。)取得產(chǎn)品信息要在程序內(nèi)部顯示“商店”,需要從App Store得到信息來(lái)購(gòu)建界面。 本章詳細(xì)講

7、解如何從App Store獲取產(chǎn)品信息。向App Store發(fā)送請(qǐng)求Store Kit提供了從App Store上請(qǐng)求數(shù)據(jù)的通用機(jī)制。 程序可以創(chuàng)建并初始化一個(gè)request對(duì)象, 為其附加delegate, 然后啟動(dòng)請(qǐng)求過(guò)程。請(qǐng)求將被發(fā)送到App Store,在那里被處理。 處理完成時(shí), request對(duì)象的delegate方法將被異步調(diào)用,以獲得請(qǐng)求的結(jié)果。 圖2-1顯示了請(qǐng)求的數(shù)據(jù)模型。如果程序在請(qǐng)求期間退出,則需要重新發(fā)送請(qǐng)求。下面講解請(qǐng)求過(guò)程中用到的類:SKRequestSKRequest為request的抽象根類。SKRequestDelegateSKRequestDelegate

8、是一個(gè)protocol, 實(shí)現(xiàn)用以處理請(qǐng)求結(jié)果的方法,比如請(qǐng)求成功,或請(qǐng)求失敗。發(fā)送獲得產(chǎn)品信息的請(qǐng)求程序使用products request來(lái)獲得產(chǎn)品的信息。 要完成這一過(guò)程,程序需創(chuàng)建一個(gè)request對(duì)象,其中會(huì)包含一個(gè)產(chǎn)品標(biāo)識(shí)的列表。之前提到過(guò),你的程序既可以內(nèi)置產(chǎn)品列表,又可以通過(guò)外部服務(wù)器來(lái)獲得。當(dāng)發(fā)送請(qǐng)求時(shí),產(chǎn)品標(biāo)識(shí)會(huì)傳送到App Store,App Store將會(huì)返回本地化信息(這些信息事先已經(jīng)在iTunes Connect中設(shè)置好了),你將使用這些信息來(lái)購(gòu)建內(nèi)置商店的界面(顯示商品名,描述,等等)。 圖2-2顯示了請(qǐng)求的過(guò)程。SKProductsRequest用來(lái)請(qǐng)求商品的信

9、息。 創(chuàng)建時(shí),我們將需要顯示的商品列表加入該對(duì)象。SKProductsRequestDelegate該protocol定義了處理App Store響應(yīng)的方法。SKProductsResponseSKProductsResponse對(duì)象為App Store返回的響應(yīng)信息。里面包含兩個(gè)列表(當(dāng)然是NSArray了):一是經(jīng)過(guò)驗(yàn)證有效的商品,property(nonatomic, readonly) NSArray *products另外一個(gè)是無(wú)法被識(shí)別的商品信息:property(nonatomic, readonly) NSArray * invalidProductIdentifiers有幾種

10、原因?qū)⒃斐缮唐窐?biāo)識(shí)無(wú)法被識(shí)別,如拼寫(xiě)錯(cuò)誤(當(dāng)然),被標(biāo)記為不可出售(unavailable for sale),或是對(duì)商品信息的改變沒(méi)有傳送到所有App Store的服務(wù)器。(這個(gè)原因不是很清楚,再議)。SKProductSKProduct對(duì)象包含了在App Store上注冊(cè)的商品的本地化信息。購(gòu)買(mǎi)商品當(dāng)用戶準(zhǔn)備購(gòu)買(mǎi)商品時(shí),程序向App Store請(qǐng)求支付信息,然后App Store將會(huì)創(chuàng)建持久化的交易信息,并繼續(xù)處理支付流程,即使用戶重啟程序,這個(gè)過(guò)程亦是如此。App Store同步待定交易的列表到程序中,并在交易狀態(tài)發(fā)生改變時(shí)向程序發(fā)送更新的數(shù)據(jù)。收集支付信息要收集支付信息, 你的程序可以

11、創(chuàng)建一個(gè)payment的對(duì)象,將它放到支付隊(duì)列中,如圖3-1所示。1. 一個(gè)SKPayment的對(duì)象,包含了Sword的商品標(biāo)識(shí),并且制定購(gòu)買(mǎi)數(shù)量為1。2. 使用addPayment:方法將SKPayment的對(duì)象添加到SKPaymentQueue里。3. SKPaymentmentQueue包含的所有請(qǐng)求商品,4. 使用SKPaymentTransactionObserver的paymentQueue: updatedTransactions: 方法來(lái)檢測(cè)所有完成的購(gòu)買(mǎi),并發(fā)送購(gòu)買(mǎi)的商品。5. 最后,使用finishTransaction:方法完成交易。當(dāng)payment的對(duì)象被添加到支付隊(duì)列

12、中的時(shí)候, 會(huì)創(chuàng)建一個(gè)持久保存的transaction對(duì)象來(lái)存放它。 當(dāng)支付被處理后,transaction被更新。 程序中將實(shí)現(xiàn)一個(gè)觀察者(observer)對(duì)象來(lái)獲取transaction更新的消息。 觀察者應(yīng)該為用戶提供購(gòu)買(mǎi)的商品,然后將transaction從隊(duì)列中移除。下面介紹在購(gòu)買(mǎi)過(guò)程中用到的幾個(gè)類:SKPayment要收集支付信息,先要了解一下支付對(duì)象。 支付對(duì)象包含了商品的標(biāo)識(shí)(identifier)和要購(gòu)買(mǎi)商品的數(shù)量(quantity)(數(shù)量可選)。你可以把同一個(gè)支付對(duì)象重復(fù)放入支付隊(duì)列,每一次這樣的動(dòng)作都相當(dāng)于一次獨(dú)立的支付請(qǐng)求。用戶可以在Settings程序中禁用購(gòu)買(mǎi)的功

13、能。 因此在請(qǐng)求支付之前,程序應(yīng)該首先檢查支付是否可以被處理。 調(diào)用SKPaymentQueue的canMakePayments方法來(lái)檢查。SKPaymentQueue支付隊(duì)列用以和App Store之間進(jìn)行通信。 當(dāng)新的支付對(duì)象被添加到隊(duì)列中的時(shí)候, Store Kit向App Store發(fā)送請(qǐng)求。 Store Kit將會(huì)彈出對(duì)話框詢問(wèn)用戶是否確定購(gòu)買(mǎi)。 完成的交易將會(huì)返回給程序的observer對(duì)象。SKPaymentTransactiontransaction對(duì)象在每次添加新的payment到隊(duì)列中的時(shí)候被創(chuàng)建。 transaction對(duì)象包含了一些屬性,可以讓程序確定當(dāng)前的交易狀態(tài)。程

14、序可以從支付隊(duì)列那里得到一份審核中的交易列表,但更常用的做法還是等待支付隊(duì)列告知交易狀態(tài)的更新。SKPaymentTransactionObserver在程序中實(shí)現(xiàn)SKPaymentTransactionObserver的協(xié)議,然后把它作為SKPaymentQueue對(duì)象的觀察者。該觀察者的主要職責(zé)是:檢查完成的交易,交付購(gòu)買(mǎi)的內(nèi)容,和把完成后的交易對(duì)象從隊(duì)列中移除。在程序一啟動(dòng),就應(yīng)該為支付隊(duì)列指定對(duì)應(yīng)的觀察者對(duì)象,而不是等到用戶想要購(gòu)買(mǎi)商品的時(shí)候。 Transaction對(duì)象在程序退出時(shí)不會(huì)丟失。程序重啟時(shí), Store Kit繼續(xù)執(zhí)行未完成的交易。 在程序初始化的時(shí)候添加觀察者對(duì)象,可以

15、保證所有的交易都被程序接收(也就時(shí)說(shuō),如果有未完成的transaction,如果程序重啟,就重新開(kāi)始了,如果稍候再添加觀察者,就可能會(huì)漏掉部分交易的信息)?;謴?fù)交易信息(Transactions)當(dāng)transaction被處理并從隊(duì)列移除之后,正常情況下,程序就再也看不到它們了。 如果你的程序提供的是非消耗性的或是訂閱類的商品,就必須提供restore的功能,使用戶可以在其他設(shè)備上重新存儲(chǔ)購(gòu)買(mǎi)信息。Store Kit提供內(nèi)建的功能來(lái)重新存儲(chǔ)非消耗商品的交易信息。 調(diào)用SKPaymentQueue的restoreCompletedTransactions的方法來(lái)重新存儲(chǔ)。對(duì)于那些之前已經(jīng)完成交易

16、的非消耗性商品,Apple Store生成新的,用于恢復(fù)的交易信息。 它包含了原始的交易信息。你的程序可以拿到這個(gè)信息,然后繼續(xù)為購(gòu)買(mǎi)的功能解鎖。 當(dāng)之前所有的交易都被恢復(fù)時(shí), 就會(huì)調(diào)用觀察者對(duì)象的paymentQueueRestoreCompletedTransactionsFinished方法。如果用戶試圖購(gòu)買(mǎi)已經(jīng)買(mǎi)過(guò)的非消耗性商品,程序會(huì)收到一個(gè)常規(guī)的交易信息,而不是恢復(fù)的交易信息。但是用戶不會(huì)被再次收費(fèi)。程序 應(yīng)把這類交易和原始的交易同等對(duì)待。訂閱類服務(wù)和消耗類商品不會(huì)被Store Kit自動(dòng)恢復(fù)。 要恢復(fù)這些商品,你必須在用戶購(gòu)買(mǎi)這些商品時(shí),在你自己的服務(wù)器上記錄這些交易信息, 并且

17、為用戶的設(shè)備提供恢復(fù)交易信息的機(jī)制。在程序中添加Store功能本章為添加購(gòu)買(mǎi)功能的指導(dǎo)詳細(xì)流程:準(zhǔn)備工作當(dāng)然是添加StoreKit.framework了。然后是具體的步驟:1. 決定在程序內(nèi)出售的商品的類型。之前提到過(guò),程序內(nèi)可以出售的新feature類型是有限制的。 Store Kit不允許我們下載新的代碼。 你的商品要么可以通過(guò)當(dāng)前的代碼工作(bundle類型),要么可以通過(guò)服務(wù)器下載(當(dāng)然,這里下載的為數(shù)據(jù)文件,代碼是不可以的)。 如果要修改源代碼,就只能老實(shí)的升級(jí)了。2. 通過(guò)iTunes Connect注冊(cè)商品每次添加新商品的時(shí)候都需要執(zhí)行這一步驟。 每個(gè)商品都需要一個(gè)唯一的商品標(biāo)識(shí)

18、。 App Store通過(guò)這個(gè)標(biāo)識(shí)來(lái)查找商品信息并處理支付流程。 注冊(cè)商品標(biāo)識(shí)的方法和注冊(cè)程序的方法類似。要了解如何創(chuàng)建和注冊(cè)商品信息,請(qǐng)參考“iTunes Connect Developer Guide”文檔。3. 檢測(cè)是否可以進(jìn)行支付用戶可以禁用在程序內(nèi)部支付的功能。在發(fā)送支付請(qǐng)求之前,程序應(yīng)該檢查該功能是否被開(kāi)啟。程序可在顯示商店界面之前就檢查該設(shè)置(沒(méi)啟用就不顯示商店界面了),也可以在用戶發(fā)送支付請(qǐng)求前再檢查,這樣用戶就可以看到可購(gòu)買(mǎi)的商品列表了。例子:if(SKPaymentQueue canMakePayments)./Display a store to the userelse

19、./Warn the user that purchases are disabled.4. 獲得商品的信息程序創(chuàng)建SKProductsRequest對(duì)象,用想要出售的商品的標(biāo)識(shí)來(lái)初始化, 然后附加上對(duì)應(yīng)的委托對(duì)象。 該請(qǐng)求的響應(yīng)包含了可用商品的本地化信息。/這里發(fā)送請(qǐng)求- (void)requestProductDataSKProductsRequest *request = SKProductsRequest allocinitWithProductIdentifiers:NSSet setWithObject: kMyFeatureIdentifier;request.delegate

20、= self;request start;/這個(gè)是響應(yīng)的delegate方法- (void)productsRequest: (SKProductsRequest *)requestdidReceiveResponse: (SKProductsResponse *)responseNSArray *myProduct = ducts;/生成商店的UIrequest autorelease;5. 添加一個(gè)展示商品的界面Store Kit不提供界面的類。 這個(gè)界面需要我們自己來(lái)設(shè)計(jì)并實(shí)現(xiàn)。6. 為支付隊(duì)列(payment queue)注冊(cè)一個(gè)觀察者對(duì)象你的程序需要初始化一個(gè)

21、transaction observer對(duì)象并把它指定為payment queue的觀察者。上代碼:MyStoreObserver *observer = MyStoreObserver allocinit;SKPaymentQueue defaultQueueaddTransactionObserver: observer;應(yīng)該在程序啟動(dòng)的時(shí)候就添加好觀察者,原因前面說(shuō)過(guò),重啟后程序會(huì)繼續(xù)上次未完的交易,這時(shí)就添加觀察者對(duì)象就不會(huì)漏掉之前的交易信息。7. 在MyStoreObserver類中執(zhí)行paymentQueue: updatedTransactions: 方法。這個(gè)方法會(huì)在有新的交易

22、被創(chuàng)建,或者交易被更新的時(shí)候被調(diào)用。- (void)paymentQueue: (SKPaymentQueue *)queue updatedTransactions: (NSArray *)transactionsfor(SKPaymentTransaction * transaction in transactions)switch(transaction.transactionState)case SKPaymentTransactionStatePurchased:self completeTransaction: transaction;break;case SKPaymentTra

23、nsactionStateFailed:self failedTransaction: transaction;break;case SKPaymentTransactionStateRestored:self restoreTransaction: transaction;default:break;上面的函數(shù)針對(duì)不同的交易返回狀態(tài),調(diào)用對(duì)應(yīng)的處理函數(shù)。8. 觀察者對(duì)象在用戶成功購(gòu)買(mǎi)一件商品時(shí),提供相應(yīng)的內(nèi)容,以下是在交易成功后調(diào)用的方法- (void) completeTransaction: (SKPaymentTransaction *)transaction/你的程序需要實(shí)現(xiàn)這兩個(gè)方

24、法self recordTransaction: transaction;self provideContent: ductIdentifier;/將完成后的交易信息移出隊(duì)列SKPaymentQueue defaultQueuefinishTransaction: transaction;交易成功的信息包含transactionIdentifier和transactionReceipt的屬性。其中,transactionReceipt記錄了支付的詳細(xì)信息,這個(gè)信息可以幫助你跟蹤、審(我們的)查交易,如果你的程序是用服務(wù)器來(lái)交付內(nèi)容,transact

25、ionReceipt可以被傳送到服務(wù)器,然后通過(guò)App Store驗(yàn)證交易。(之前提到的server模式,可以參考以前的圖)9. 如果交易是恢復(fù)過(guò)來(lái)的(restore),我們用這個(gè)方法來(lái)處理:- (void) restoreTransaction: (SKPaymentTransaction *)transactionself recordTransaction: transaction;self provideContent: ductIdentifier;SKPaymentQueue defaultQueue finishTransaction

26、: transaction;這個(gè)過(guò)程完成購(gòu)買(mǎi)的過(guò)程類似。 恢復(fù)的購(gòu)買(mǎi)內(nèi)容提供一個(gè)新的交易信息,這個(gè)信息包含了新的transaction的標(biāo)識(shí)和receipt數(shù)據(jù)。 如果需要的話,你可以把這些信息單獨(dú)保存下來(lái),供追溯審(我們的)查之用。但更多的情況下,在交易完成時(shí),你可能需要覆蓋原始的transaction數(shù)據(jù),并使用其中的商品標(biāo)識(shí)。10. 交易過(guò)程失敗的話,我們調(diào)用如下的方法:- (void)failedTransaction: (SKPaymentTransaction *)transactionif(transaction.error.code != SKErrorPaymentCance

27、lled)/在這類顯示除用戶取消之外的錯(cuò)誤信息SKPaymentQueue defaultQueue finishTransaction: transaction;通常情況下,交易失敗的原因是取消購(gòu)買(mǎi)商品的流程。 程序可以從error中讀出交易失敗的詳細(xì)信息。顯示錯(cuò)誤信息不是必須的,但在上面的處理方法中,需要將失敗的交易從支付隊(duì)列中移除。 一般來(lái)說(shuō),我們用一個(gè)對(duì)話框來(lái)顯示錯(cuò)誤信息,這時(shí)就應(yīng)避免將用戶取消購(gòu)買(mǎi)這個(gè)error顯示出來(lái)。11. 組織好程序內(nèi)“商店”的UI。當(dāng)用戶選擇一件商品時(shí), 創(chuàng)建一個(gè)支付對(duì)象,并放到隊(duì)列中。SKPayment *payment = SKPayment paymen

28、tWithProductIdentifier: kMyFeatureIdentifier;SKPaymentQueue defaultQueue addPayment: payment;如果你的商店支持選擇同一件商品的數(shù)量,你可以設(shè)置支付對(duì)象的quantity屬性SKMutablePayment *payment = SKMutablePayment paymentWithProductIdentifier: kMyFeatureIdentifier;payment.quantity = 3;SKPaymentQueue defaultQueue addPayment: payment;下一步

29、:本章中所示代碼可用于內(nèi)置型商品模式(Built-in)。 如果你的程序要使用服務(wù)器來(lái)發(fā)布商品,你需要負(fù)責(zé)設(shè)計(jì)和執(zhí)行iPhone程序和你的服務(wù)器之間的通信。服務(wù)器應(yīng)該驗(yàn)證數(shù)據(jù)并為程序提供內(nèi)容。驗(yàn)證store的收據(jù)使用服務(wù)器來(lái)交付內(nèi)容,我們還需要做些額外的工作來(lái)驗(yàn)證從Store Kit發(fā)送的收據(jù)信息。重要信息:來(lái)自Store的收據(jù)信息的格式是專用的。 你的程序不應(yīng)直接解析這類數(shù)據(jù)??墒褂萌缦碌臋C(jī)制來(lái)取出其中的信息。驗(yàn)證App Store返回的收據(jù)信息當(dāng)交易完成時(shí),Store Kit告知payment observer這個(gè)消息,并返回完成的transaction。 SKPaymentTransac

30、tion的transactionReceipt屬性就包含了一個(gè)經(jīng)過(guò)簽名的收據(jù)信息,其中記錄了交易的關(guān)鍵信息。你的服務(wù)器要負(fù)責(zé)提交收據(jù)信息來(lái)確定其有效性,并保證它未經(jīng)過(guò)篡改。 這個(gè)過(guò)程中,信息被以JSON數(shù)據(jù)格式發(fā)送給App Store,App Store也以JSON的格式返回?cái)?shù)據(jù)。(大家可以先了解一下JSON的格式)驗(yàn)證收據(jù)的過(guò)程:1. 從transaction的transactionReceipt屬性中得到收據(jù)的數(shù)據(jù),并以base64方式編碼。2. 創(chuàng)建JSON對(duì)象,字典格式,單鍵值對(duì),鍵名為receipt-data, 值為上一步編碼后的數(shù)據(jù)。效果為:receipt-data: (編碼后的數(shù)

31、據(jù))3. 發(fā)送HTTP POST的請(qǐng)求,將數(shù)據(jù)發(fā)送到App Store,其地址為:4. App Store的返回值也是一個(gè)JSON格式的對(duì)象,包含兩個(gè)鍵值對(duì), status和receipt:status: 0,receipt: 如果status的值為0, 就說(shuō)明該receipt為有效的。 否則就是無(wú)效的。App Store的收據(jù)發(fā)送給App Store的收據(jù)數(shù)據(jù)是通過(guò)對(duì)transaction中對(duì)應(yīng)的信息編碼而創(chuàng)建的。 當(dāng)App Store驗(yàn)證收據(jù)時(shí), 將從其中解碼出數(shù)據(jù),并以receipt的鍵返回。 返回的響應(yīng)信息是JSON格式,被包含在SKPaymentTransaction的對(duì)象中(tra

32、nsactionReceipt屬性)。Server可通過(guò)這些值來(lái)了解交易的詳細(xì)信息。 Apple建議只發(fā)送receipt數(shù)據(jù)到服務(wù)器并使用receipt數(shù)據(jù)驗(yàn)證和獲得交易詳情。 因?yàn)锳pp Store可驗(yàn)證收據(jù)信息,返回信息,保證信息不被篡改,這種方式比同時(shí)提交receipt和transaction的數(shù)據(jù)要安全。(這段得再看看)表5-1為交易信息的所有鍵,很多的鍵都對(duì)應(yīng)SKPaymentTransaction的屬性。備注:一些鍵取決于你的程序是鏈接到App Store還是測(cè)試用的Sandbox環(huán)境。更多關(guān)于sandbox的信息,請(qǐng)查看Testing a Store一章。Table 5-1 購(gòu)買(mǎi)信息的鍵:鍵名描述quantity 購(gòu)買(mǎi)商品的數(shù)量。對(duì)應(yīng)SKPayment對(duì)象中的quantity屬性product_id商品的標(biāo)識(shí),對(duì)應(yīng)SKPayment對(duì)象的productIdentifier屬性。transaction_id交易的標(biāo)識(shí),對(duì)應(yīng)SKPaym

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論