關(guān)于蘋果內(nèi)購(IAP)的一些問題以及那些坑:
最近在研究蘋果內(nèi)購功能,所以,在網(wǎng)上找了一些資料仿村,進行學(xué)習(xí)衣迷。但是,內(nèi)購功能在實現(xiàn)的過程中挑社,有很多坑,筆者算是真的遇到了好多啊阱当,下面也是自己對內(nèi)購的一些心得與體會吧捌木!
我這里說的可能不太詳盡,所以凤覆,我先把再網(wǎng)上看到的一些帖子貼在這里,以便大家做內(nèi)購的時候贴膘,方便查找相關(guān)信息玄柠。
這里是一篇寫的比較全面的帖子,但是沒有寫中間問題處理:?
在網(wǎng)上搜了一些相關(guān)的帖子虚汛,簡單歸納總結(jié)了一下玲献,覺得論壇里有一個叫Teng的世界的大神,寫了三篇博客,寫的很詳細(xì):
?【IAP支付之一】In-App Purchase Walk Through 整個支付流程
【IAP支付之二】In app purchase 本地購買和服務(wù)器購買兩種購買模式
【IAP支付之三】蘋果IAP安全支付與防范 receipt收據(jù)驗證
大家在做內(nèi)購之前,推薦看一下!
但是,畢竟我們開發(fā)的IAP是在蘋果的平臺上面運行,所以迎卤,如果英語能力好的話侨糟,最好去蘋果官網(wǎng)無看<官方指南>,里面涉及到了一些論壇的貼子里沒有提到過的問題二拐,而這些內(nèi)容企软,也很有可能會被大家忽略铅辞。下面是<官方文檔中文翻譯>,可以對照官方文檔查看。但有時候還會出現(xiàn)相關(guān)的問題。好吧寥粹,廢話不多說岛杀,下面開始說IAP的實現(xiàn)以及具體會遇到的問題,我這里可能會涉及到好多需要注意的問題,流程性的東西會少一些。大家盡量在讀本篇博客之前,先把上面的幾個博客看一下。
首先,我們要去iTunes store創(chuàng)建幾個我們需要在內(nèi)購中使用到的產(chǎn)品,記住,產(chǎn)品的ID一定要唯一。蘋果官方提到了刻剥,IAP購買項有幾種類型:
Consumable products:消耗類產(chǎn)品
Non-consumable products:非消耗類產(chǎn)品
Auto-renewable subscriptions:自動更新訂閱產(chǎn)品
Non-renewable subscriptions.非自動更新訂閱產(chǎn)品
Free subscriptions.免費訂閱產(chǎn)
我們通常再游戲中用到的游戲幣屬于消耗類產(chǎn)品漓藕,賽車軌道等屬于非消耗類產(chǎn)品诀蓉,通常這2種會比較常見渠啤。我當(dāng)時用的是消耗類產(chǎn)品沥曹。
當(dāng)完成產(chǎn)品創(chuàng)建之后,去iTunes store申請一個測試賬號玄帕,就要開始編寫代碼了裤纹。在編寫代碼之前鹰椒,最重要的漆际,是要了解整個內(nèi)購實現(xiàn)的流程奸汇。這里找到了一個比較好的對<流程解說的帖子>擂找,下面是流程圖:
歸根結(jié)底塘雳,其實肩刃,我們一直在和APP store在打交道,而并不是和蘋果的服務(wù)器進行打交道,所以,大家要避免這個誤區(qū),而APP store才和蘋果服務(wù)器進行打交道揪阶,這一層侨艾,其實我們基本是不需要考慮的姻成。
流程:
1.首先,從圖上的第一步,客戶端向自己的服務(wù)器發(fā)送了一個請求逗抑,請求產(chǎn)品列表加勤,然后,我們自己的服務(wù)器會返回給客戶端產(chǎn)品的identifiers,也就是我們在創(chuàng)建產(chǎn)品的時候怜奖,設(shè)置的產(chǎn)品ID迁央,當(dāng)獲取之后,我們需要根據(jù)獲得的identifiers向APP store請求產(chǎn)品的詳細(xì)信息短条。但對于某些應(yīng)用來說屹蚊,可能產(chǎn)品種類沒有什么變動嘱兼,所以通孽,就直接將identifiers集成在了應(yīng)用中,有的是直接放在了plist文件中遂填,需要的時候并齐,直接調(diào)用测垛,不需要向服務(wù)器發(fā)送請求链快,獲得訂單信息霉祸。但這樣也有缺點,當(dāng)產(chǎn)品發(fā)生變動的時候,需要發(fā)布新的版本,更新應(yīng)用才行,所以帆离,不推薦使用這種方案们妥。
2.當(dāng)獲取了產(chǎn)品信息之后,要刷新UI,展示給用戶,讓用戶選擇需要購買那種產(chǎn)品雷绢,然后點擊購買按鈕。當(dāng)用戶購買某個產(chǎn)品的時候宇立,我們的APP會向APP store發(fā)送購買請求润脸,APP store接收到垦巴,購買請求之后,會進行訂單的處理展运,然后怒允,返回給我們購買的結(jié)果,同時,從上面的途中抡秆,我們還可以看到乍桂,返回到客戶端有一個receipt data憋沿,這個東西其實是用來進行校驗的證書(其實是很長的字符串壶辜,大概3000多個字符吧),防止有人使用越獄插件,從而反復(fù)獲取我們的產(chǎn)品秒际,尤其是類似金幣這種嵌莉。
3.當(dāng)客戶端獲得購買結(jié)果之后,將支付信息(包括驗證證書)發(fā)送到服務(wù)器椎扬,服務(wù)器向AppStore發(fā)起驗證揖铜,這個驗證必須是post請求龄寞,將數(shù)據(jù)以json格式發(fā)送過去,同時,receipt要進行base64編碼朴读,當(dāng)蘋果確認(rèn)之后姨伟,會給我們返回狀態(tài)碼,告訴我們是否成功仔燕。
這是蘋果官方給出的集中狀態(tài)值鳞疲,蘋果返回回來的數(shù)據(jù)也是json格式的睛挚,會有一個state字段勃教,當(dāng)為0的時候著蛙,表示成功,我們測試的接口是:https://sandbox.itunes.apple.com/verifyReceipt豁生,生產(chǎn)環(huán)境的接口是:https://buy.itunes.apple.com/verifyReceipt
框舔,所以大家要區(qū)分好這兩個接口。21007表示將測試環(huán)境獲得receipt發(fā)送到了生產(chǎn)環(huán)境纬凤,21008表示將生產(chǎn)環(huán)境的receipt發(fā)送到了測試環(huán)境下福贞,其他的返回值,應(yīng)該都表示驗證失敗停士,但是挖帘,具體是什么,我也不清楚恋技,英語好的話拇舀,可以自己翻譯一下,然后蜻底,告訴我骄崩。這里是<蘋果官方驗證文檔>,大家可以查看這個薄辅,寫出客戶端驗證的代碼要拂。因為我不是做服務(wù)端的,所以不知道怎么寫服務(wù)端驗證站楚,但是宇弛,這兩者應(yīng)該是相通的,大家可以在下面寫評論源请,一起討論一下枪芒。
4.當(dāng)服務(wù)器從APPstore獲得返回狀態(tài)后彻况,判斷是否有這條購買記錄,如果有舅踪,就更新服務(wù)器端數(shù)據(jù)庫纽甘,表示物品已經(jīng)購買,再給客戶端發(fā)送購買結(jié)果抽碌。這里說的APPstore悍赢,我再網(wǎng)上找了好多資料,都是這么說的货徙,但我覺得其實就是蘋果服務(wù)器給提供的接口左权,只不過為了方便,所以痴颊,在畫圖的時候赏迟,就都畫成了向APP store發(fā)送驗證,其實蠢棱,這里是蘋果服務(wù)器提供的一個接口锌杀。
筆者公司當(dāng)時用的是RMStore這個開源庫,這個用著很方便泻仙,所以糕再,大家也可以嘗試一下,但不保證完全沒有問題玉转,因為我在使用的過程中突想,其實也遇到了一些棘手的問題。大家也可以自己寫支付這個模塊究抓,其實猾担,正常的這個流程也不是很麻煩,先把基本流程寫完漩蟆,再考慮可能出現(xiàn)的問題垒探,就會好很多妓蛮。我在上面引用的幾個鏈接里面怠李,有的鏈接里面有具體的代碼,大家可以參考一下蛤克。
用RMStore的話捺癞,主要會調(diào)用這樣一個方法:
[html]?view plain?copy
-?(void)addPayment:(NSString*)productIdentifier??
??????????????user:(NSString*)userIdentifier??
???????????success:(void?(^)(SKPaymentTransaction?*transaction))successBlock??
???????????failure:(void?(^)(SKPaymentTransaction?*transaction,?NSError?*error))failureBlock;??
先來說說這些參數(shù)吧。首先构挤,第一個參數(shù)髓介,這個就是我們獲取到的產(chǎn)品的identifier,就是要購買的那個產(chǎn)品的唯一標(biāo)識筋现;然后是這個user唐础,這個是用戶自定義的一個東西箱歧,可以是用戶的UUID或者其他信息,這個用途很大的一膨。會在后面提到呀邢;這里的success ?block,實在支付成功后豹绪,回調(diào)的內(nèi)容价淌,只要把成功后進行的操作寫在里面就可以了,但是瞒津,由于成功后蝉衣,需要的操作也很多,大家一定要把操作封裝一下巷蚪,在里面調(diào)用病毡,否則,邏輯會很亂钓辆,而且剪验,下面的failure block中還要對很多異常狀況進行判斷和處理,其中有一個就是“無法連接到iTunes store”前联,這個問題很麻煩功戚,后面會具體說。一般情況下似嗤,如果不考慮user這個變量啸臀,可以直接使用下面的方法:
[html]?view plain?copy
-?(void)addPayment:(NSString*)productIdentifier??
???????????success:(void?(^)(SKPaymentTransaction?*transaction))successBlock??
???????????failure:(void?(^)(SKPaymentTransaction?*transaction,?NSError?*error))failureBlock;??
這個方法要調(diào)用上面的方法,但是user默認(rèn)為nil烁落。
支付流程看起來就是這樣乘粒,感覺好像很簡單,但是伤塌,這里面的問題其實很大灯萍。上面只是在一切都正常的狀態(tài)下,才會走的流程每聪,但是旦棉,如果考慮到網(wǎng)絡(luò)問題、斷網(wǎng)药薯、應(yīng)用閃退绑洛,有越獄插件等問題,問題就麻煩了童本,這個歷程真屯,各個過程中需要考慮的問題,其實穷娱,還是很多的绑蔫。好的运沦,下面我們就一步一步開始說IAP實現(xiàn)過程中的各種坑。先重新把上面的圖拿過來配深。
首先來說第一步:
這一步還是很輕松的茶袒,我們向服務(wù)器獲取產(chǎn)品identifiers,由于需要進行網(wǎng)絡(luò)請求凉馆,而且是支付薪寓,所以,一定要把斷網(wǎng)考慮進來澜共,這個是必須的向叉,那么,在這一步嗦董,我們要判斷母谎,當(dāng)沒有獲取數(shù)據(jù)的時候,要提示用戶暫時沒有獲取產(chǎn)品列表信息京革,這部分其實還好奇唤,不需要考慮太多。
之后的一些過程匹摇,就比較復(fù)雜了咬扇,考慮的東西也會比較多了。首先把剩下的部分拿過來:
這部分問題很多廊勃,而且懈贺,需要邏輯也很復(fù)雜。首先說第七步坡垫,這一部分梭灿,再應(yīng)用中,當(dāng)點擊購買的時候冰悠,會彈出輸入框堡妒,要求輸入賬號和密碼,當(dāng)點擊取消的時候溉卓,實際上會調(diào)用failure block.調(diào)用failure block的時候皮迟,會獲得一條支付信息transaction和一個error,我們可以判斷transaction的相關(guān)信息的诵,來判斷取消狀態(tài)万栅,
[objc]?view plain?copy
if?(transaction.error.code?==?SKErrorPaymentCancelled)??
也就是判斷這個訂單信息的error的code值佑钾,這個就是取消狀態(tài)西疤。但實際上,這只是一種比較常見的狀態(tài)休溶。當(dāng)用戶再購買的過程中代赁,如果在這個過程中扰她,突然斷網(wǎng)了,或者請求支付的訂單狀態(tài)有問題芭碍,也就是上面的過程⑦出現(xiàn)了問題徒役,就會觸發(fā)其他的幾種狀態(tài),這個時候窖壕,如果只是輸出訂單失敗的信息忧勿,會出現(xiàn)“無法連接到iTunes store”,這是一種很讓人頭疼的狀態(tài)瞻讽,因為鸳吸,你根本不知道到底是什么問題,到底是怎么無法連接到iTunes store速勇。我當(dāng)時也被這個問題坑了 晌砾,后來發(fā)現(xiàn),這其實是一種請求失敗烦磁,和SKErrorPaymentCancelled類似养匈。SKErrorPaymentCancelled和其他幾種狀態(tài)其實是枚舉類型:
[objc]?view plain?copy
NS_ASSUME_NONNULL_BEGIN??
SK_EXTERNNSString?*?const?SKErrorDomain?NS_AVAILABLE_IOS(3_0);??
//?error?codes?for?the?SKErrorDomain??
enum?{??
????SKErrorUnknown,??
SKErrorClientInvalid,//?client?is?not?allowed?to?issue?the?request,?etc.??
SKErrorPaymentCancelled,//?user?cancelled?the?request,?etc.??
SKErrorPaymentInvalid,//?purchase?identifier?was?invalid,?etc.??
SKErrorPaymentNotAllowed,//?this?device?is?not?allowed?to?make?the?payment??
SKErrorStoreProductNotAvailable,//?Product?is?not?available?in?the?current?storefront??
};??
NS_ASSUME_NONNULL_END??
屬于同一類問題,也就是上面說的無法連接到iTunes store都伪,雖然知道了這幾種狀態(tài)呕乎,但是,還是不知道這幾種狀態(tài)到底代表什么陨晶。于是就去蘋果的開發(fā)文檔里面看了一下楣嘁,
[objc]?view plain?copy
Constants??
SKErrorUnknown??
Indicates?that?an?unknown?or?unexpected?error?occurred.??
Available?in?iOS3.0?and?later.??
SKErrorClientInvalid??
Indicates?that?the?client?is?not?allowed?to?perform?the?attempted?action.??
Available?in?iOS3.0?and?later.??
SKErrorPaymentCancelled??
Indicates?that?the?user?cancelled?a?payment?request.??
Available?in?iOS3.0?and?later.??
SKErrorPaymentInvalid??
Indicates?that?one?of?the?payment?parameters?was?not?recognized?by?the?Apple?App?Store.??
Available?in?iOS3.0?and?later.??
SKErrorPaymentNotAllowed??
Indicates?that?the?user?is?not?allowed?to?authorize?payments.??
Available?in?iOS3.0?and?later.??
SKErrorStoreProductNotAvailable??
Indicates?that?the?requested?product?is?not?available?in?the?store.??
Available?in?iOS6.0?and?later.??
這是官方的解釋,可以嘗試翻譯一下珍逸,了解其代表的含義逐虚。后來在網(wǎng)上搜索了一下相關(guān)的文章,只找到一個谆膳,說了<無法連接到iTunes store>叭爱,但這里寫的幾種狀態(tài),并沒有全部涵蓋漱病,后來我在網(wǎng)上又找了一下买雾,下面是我給出的對無法連接到iTunes store的處理:
[objc]?view plain?copy
if?(transaction.error?!=?nil)?{??
switch?(transaction.error.code)?{??
case?SKErrorUnknown:??
NSLog(@"SKErrorUnknown");??
detail?=@"未知的錯誤,您可能正在使用越獄手機";??
break;??
case?SKErrorClientInvalid:??
NSLog(@"SKErrorClientInvalid");??
detail?=@"當(dāng)前蘋果賬戶無法購買商品(如有疑問杨帽,可以詢問蘋果客服)";??
break;??
case?SKErrorPaymentCancelled:??
NSLog(@"SKErrorPaymentCancelled");??
detail?=@"訂單已取消";??
break;??
case?SKErrorPaymentInvalid:??
NSLog(@"SKErrorPaymentInvalid");??
detail?=@"訂單無效(如有疑問漓穿,可以詢問蘋果客服)";??
break;??
case?SKErrorPaymentNotAllowed:??
NSLog(@"SKErrorPaymentNotAllowed");??
detail?=@"當(dāng)前蘋果設(shè)備無法購買商品(如有疑問,可以詢問蘋果客服)";??
break;??
case?SKErrorStoreProductNotAvailable:??
NSLog(@"SKErrorStoreProductNotAvailable");??
detail?=@"當(dāng)前商品不可用";??
break;??
?default:??
NSLog(@"No?Match?Found?for?error");??
detail?=@"未知錯誤";??
break;??
????}??
}??
這個SKErrorUnknown實在是很難處理注盈,我找了好多的帖子晃危,包括stackoverflow姊舵,也沒看到太多的說法妄荔,有一些說可能是越獄手機孟抗,才會出現(xiàn)這種狀態(tài)疫诽,在測試的時候,我們通常也會遇到這種問題鳍鸵。測試的時候苇瓣,我們要再iTunes connect申請測試賬號,有的時候偿乖,測試賬號出問題击罪,或者,測試賬號已經(jīng)被取消了贪薪,不再使用了外邓,而支付的時候,仍然在使用這個測試賬號古掏,這個時候损话,也會出現(xiàn)unknown狀態(tài)。
當(dāng)然槽唾,失敗有很多種丧枪,這是無法連接到iTunes store,不是網(wǎng)絡(luò)的問題庞萍。上面提到失敗的時候拧烦,會有transaction和error兩個返回值,當(dāng)網(wǎng)絡(luò)出現(xiàn)問題的時候钝计,error.code是負(fù)值恋博。這時,成功的話私恬,沒有這個error信息债沮,這時,我們就可以判斷到底是怎么回事了本鸣,當(dāng)返回了error的時候疫衩,先判斷transaction.error是否為空,不為空的話荣德,進行上面的switch判斷闷煤,為空的話,說明交易的訂單信息沒有問題涮瞻,這時候鲤拿,就只是網(wǎng)絡(luò)的問題了,就提示用戶網(wǎng)絡(luò)異常署咽。
當(dāng)我們向AppStore發(fā)送了請求之后近顷,如果AppStore交易完成之后,也就是上面的成功的success block,我們首先要將訂單信息保存到本地幕庐,然后發(fā)送給我們自己的服務(wù)器,當(dāng)我們的服務(wù)器給我們返回信息的時候家淤,我們再更新UI异剥,同時,刪除本地保存的訂單信息絮重。這個訂單信息冤寿,可以保存在數(shù)據(jù)庫中,也可以保存在文件中青伤,但是督怜,蘋果建議保存在文件中,用NSCoding進行編碼保存狠角,這樣會更好一些号杠。
向自己服務(wù)器發(fā)送消息的話,還要注意很多東西丰歌。這里面也包括AFNetworking的一些問題姨蟋。但我不了解這是不是偶發(fā)的事情。當(dāng)時出現(xiàn)的問題狀況是這樣的:Error?Domain=com.alamofire.error.serialization.response?Code=-1016?"Request?failed:?unacceptable?content-type:?text/html"
[html]?view plain?copy
Error?Domain=com.alamofire.error.serialization.response?Code=-1016?"Request?failed:?unacceptable?content-type:?text/html"??
我當(dāng)時還不知道這是怎么回事立帖,后來在網(wǎng)上找了一些資料眼溶,才了解到,這是AFNetworking對網(wǎng)絡(luò)請求的數(shù)據(jù)類型的一種支持問題晓勇,下面奉上一篇帖子堂飞,告訴大家怎么解決這個問題:
Error Domain=com.alamofire.error.serialization.response Code=-1016 "Request failed: unacceptable con
當(dāng)出現(xiàn)這種問題的時候,訂單信息會無法上傳到自己的服務(wù)器绑咱,這時候绰筛,就出問題了,用戶已經(jīng)支付了描融,錢已經(jīng)扣了别智,但是,我們的服務(wù)器沒有訂單信息稼稿,所以薄榛,無法給用戶發(fā)貨,類似這樣損害用戶利益的事情是絕對不被允許的让歼。所以敞恋,可以按照上面帖子的說法,修改請求類型谋右,添加對text/html的支持硬猫,就可以避免這種問題了。此外,當(dāng)我們自己的服務(wù)器出錯的時候啸蜜,當(dāng)用戶打算將訂單信息上傳到我們服務(wù)器的時候坑雅,此時,服務(wù)器可能會返回一些我們預(yù)先設(shè)定好的狀態(tài)碼衬横,對于這種狀態(tài)裹粤,我們也要在客戶端進行相應(yīng)的判斷,當(dāng)遇到這樣的問題的時候蜂林,提示用服務(wù)器出錯遥诉,趕緊聯(lián)系我們的客服,進行問題的解決噪叙。
上面說到矮锈,我們向APP store發(fā)送支付請求的時候,當(dāng)支付完成的時候睁蕾,服務(wù)器會將訂單返回給我們苞笨,這個時候,我們首先應(yīng)該做的子眶,其實是將訂單信息保存到本地猫缭,然后,再向我們自己的服務(wù)器發(fā)送訂單信息壹店,當(dāng)服務(wù)器給我們反饋信息猜丹,通知我們成功之后,再刪除本地保存的訂單信息硅卢。如果失敗的話射窒,我們這里要設(shè)置一個定時器,將未完成的失敗訂單将塑,定時提交到我們的服務(wù)器脉顿,從而獲得要購買的商品。但是点寥,如果一直沒有網(wǎng)絡(luò)怎么辦艾疟?這是,我們就要在每次應(yīng)用打開的時候敢辩,查詢是否有未完成的訂單信息蔽莱,然后將訂單信息上傳到服務(wù)器,從而獲得我們要購買的商品戚长。
這種狀態(tài)處理完了之后盗冷,還有其他的一些狀態(tài),例如同廉,網(wǎng)絡(luò)狀態(tài)不好的狀態(tài)下仪糖,當(dāng)我們向APP Store發(fā)起訂單請求的時候柑司,請求成功了,但是锅劝,當(dāng)APP Store給我們返回訂單的時候攒驰,斷網(wǎng)了,或者故爵,此時退出了應(yīng)用玻粪,以及應(yīng)用閃退,那該怎么辦呢稠集?其實奶段,蘋果已經(jīng)替我們想好了這種問題的解決辦法饥瓷。我們只要在應(yīng)用啟動的時候剥纷,設(shè)置一下代理,就可以了呢铆,這是<官方文檔>晦鞋,我們需要在應(yīng)用啟動的時候,設(shè)置SKPaymentQueue的代理方法
[objc]?view plain?copy
[[SKPaymentQueue?defaultQueue]?addTransactionObserver:self];??
并實現(xiàn)代理方法
[objc]?view plain?copy
-?(BOOL)application:(UIApplication?*)application?didFinishLaunchingWithOptions:(NSDictionary?*)launchOptions??
{??
//?Attach?an?observer?to?the?payment?queue??
[[SKPaymentQueue?defaultQueue]?addTransactionObserver:self];??
return?YES;??
}??
//?Called?when?the?application?is?about?to?terminate??
-?(void)applicationWillTerminate:(UIApplication?*)application??
{??
//?Remove?the?observer??
[[SKPaymentQueue?defaultQueue]?removeTransactionObserver:self];??
}??
當(dāng)訂單狀態(tài)發(fā)生狀態(tài)的時候棺克,會異步調(diào)用這個方法悠垛,從而,通知我們更新訂單娜谊,并上傳訂單信息到服務(wù)器确买,給用戶發(fā)貨。如果使用RMStore的話纱皆,其實不需要我們手動實現(xiàn)湾趾,因為RMstore就是這個observe,所以派草,在應(yīng)用啟動的時候搀缠,我們就應(yīng)該對RMSotre這個單例進行初始化。
下面來說下面這個方法:
[html]?view plain?copy
-?(void)addPayment:(NSString*)productIdentifier??
??????????????user:(NSString*)userIdentifier??
???????????success:(void?(^)(SKPaymentTransaction?*transaction))successBlock??
???????????failure:(void?(^)(SKPaymentTransaction?*transaction,?NSError?*error))failureBlock;??
這個方法里里面有一個user屬性近迁,是用來用戶自定義的字段艺普,當(dāng)我們發(fā)送支付請求的時候,發(fā)送這個字段之后鉴竭,當(dāng)獲取了支付成功的請求之后歧譬,這個字段會原封不動的返回回來。當(dāng)我們用同一個手機搏存,登錄了2個不同的賬號的時候缴罗,這個字段就非常有用了。正常情況下祭埂,當(dāng)我們獲得支付訂單信息之后面氓,要把訂單信息上傳到自己的服務(wù)器兵钮,那么,怎么確定就是是哪個用戶呢舌界,默認(rèn)情況下掘譬,我們會把保存在本地的用戶賬號,也一起返回給自己的服務(wù)器呻拌。但是葱轩,我們假設(shè)這樣一種狀況:我們現(xiàn)在有一個手機,A在上面下單了藐握,訂單已經(jīng)發(fā)送給APP store靴拱,這個時候,斷網(wǎng)了猾普,還沒接到APP store反饋回來的支付結(jié)果袜炕,這個時候,A退出了賬號初家,過了一會兒偎窘,有網(wǎng)絡(luò)了,B登錄了溜在,這個時候陌知,如果訂單返回了,那么掖肋,我們正常狀態(tài)下仆葡,需要把這個訂單上傳到我們的服務(wù)器中。那么志笼,問題來了沿盅,我們此時無法或得到下訂單的A的用戶信息。如果還是按照默認(rèn)的狀態(tài)籽腕,此時嗡呼,會把B的賬號信息一起發(fā)送到我們的服務(wù)器,這樣皇耗,就出錯了南窗,A買的東西,沒得到郎楼,B沒有買万伤,卻得到了。這是不合理的呜袁。所以敌买,我們要在向APP store發(fā)送支付請求的時候,一起把下單的用戶信息發(fā)過去阶界,也就是保存在上面的那個user字段值虹钮,當(dāng)獲得APP store的反饋的時候聋庵,再將用戶信息一起取出來,然后發(fā)送到服務(wù)器芙粱,這樣祭玉,就不會出現(xiàn)上面說的那種問題了。
以上就是我對最近開發(fā)中遇到的一些問題的解決春畔,有不全面的地方和說錯的地方脱货,還請大家批評指點。
轉(zhuǎn)載:http://blog.csdn.net/u013152587/article/details/50488353