[IPA]IOS In App Purchase(內(nèi)購(gòu))驗(yàn)證
二次驗(yàn)證
IOS在沙箱環(huán)境下購(gòu)買成功之后,向蘋果進(jìn)行二次驗(yàn)證,確認(rèn)用戶是否購(gòu)買成功。
當(dāng)應(yīng)用向Apple服務(wù)器請(qǐng)求購(gòu)買,成功之后,Apple會(huì)返回以下四個(gè)數(shù)據(jù)給應(yīng)用
四個(gè)驗(yàn)證數(shù)據(jù)
productIdentifier:cosmosbox.strikehero.gems60state: Purchasedreceipt: ewoJInNpZ25hdHVyZSIgPSAiQXF1M3JiR1grbmJMeGVvZS9VZGlMa3dQWVlBdkQrVTE1L1NRL2Y0cGZlaFlBOWFaVGhSbTNMVXpHc25TUGd3aVBoMmsxSTVFaVpweGp6aEZsS0JDVXBPeHEyWFk5N1lHUGUzMFo0cThMRllDZWJPeHFzWlJaUU01N2xtZFo0bDN6eHNnaWpGemFiYkRXLzM4cm1EeXFTT0FSYzRES3dXTGFpc2EzYUY5d2JwbUFBQURWekNDQTFNd2dnSTdvQU1DQVFJQ0NCdXA0K1BBaG0vTE1BMEdDU3FHU0liM0RRRUJCUVVBTUg4eEN6QUpCZ05WQkFZVEFsVlRNUk13RVFZRFZRUUtEQXBCY0hCc1pT//receipt省略幾十行transactionIdentifier: 1000000160385706
1.產(chǎn)品標(biāo)識(shí)符: product Identifier
在itunes store應(yīng)用內(nèi)定義的產(chǎn)品ID,例如com.公司名.產(chǎn)品名.道具名(com.xxxx.video.vip)
2.交易狀態(tài): state
Purchased購(gòu)買成功
Restored恢復(fù)購(gòu)買
Failed失敗
Deferred等待確認(rèn),兒童模式需要詢問(wèn)家長(zhǎng)同意
3. Receipt
很長(zhǎng)的一段字符串,大概49行,作為二次驗(yàn)證的重要依據(jù)
4. 交易標(biāo)識(shí)符: transaction Identifier
我們需要把Receipt發(fā)送給蘋果的蘋果的服務(wù)器驗(yàn)證,用戶的購(gòu)買信息是否真實(shí)
驗(yàn)證服務(wù)器地址
在測(cè)試服務(wù)器中,發(fā)送receipt蘋果的測(cè)試服務(wù)器(https://sandbox.itunes.apple.com/verifyReceipt)驗(yàn)證
在正式服務(wù)器中(已上線Appstore),發(fā)送receipt到蘋果的正式服務(wù)器(https://buy.itunes.apple.com/verifyReceipt)驗(yàn)證
當(dāng)我們把應(yīng)用提交給蘋果審核時(shí),蘋果也是在sandbox環(huán)境購(gòu)買,其產(chǎn)生的購(gòu)買憑證,也只能連接蘋果的測(cè)試驗(yàn)證服務(wù)器,所以我們可以先發(fā)到蘋果的正式服務(wù)器驗(yàn)證,如果蘋果返回21007,則再一次連接測(cè)試服務(wù)器進(jìn)行驗(yàn)證。
驗(yàn)證購(gòu)買信息
以下是把客戶端的購(gòu)買信息發(fā)送到蘋果測(cè)試服務(wù)器進(jìn)行確認(rèn),蘋果返回的數(shù)據(jù):
ISN: url: https://sandbox.itunes.apple.com/verifyReceiptORIGINAL JSON: {"receipt":? ? {"original_purchase_date_pst":"2015-06-22 20:56:34 America/Los_Angeles",//購(gòu)買時(shí)間,太平洋標(biāo)準(zhǔn)時(shí)間"purchase_date_ms":"1435031794826",//購(gòu)買時(shí)間毫秒"unique_identifier":"5bcc5503dbcc886d10d09bef079dc9ab08ac11bb",//唯一標(biāo)識(shí)符"original_transaction_id":"1000000160390314",//原始交易ID"bvrs":"1.0",//iPhone程序的版本號(hào)"transaction_id":"1000000160390314",//交易的標(biāo)識(shí)"quantity":"1",//購(gòu)買商品的數(shù)量"unique_vendor_identifier":"AEEC55C0-FA41-426A-B9FC-324128342652",//開(kāi)發(fā)商交易ID"item_id":"1008526677",//App Store用來(lái)標(biāo)識(shí)程序的字符串"product_id":"cosmosbox.strikehero.gems60",//商品的標(biāo)識(shí)"purchase_date":"2015-06-23 03:56:34 Etc/GMT",//購(gòu)買時(shí)間"original_purchase_date":"2015-06-23 03:56:34 Etc/GMT",//原始購(gòu)買時(shí)間"purchase_date_pst":"2015-06-22 20:56:34 America/Los_Angeles",//太平洋標(biāo)準(zhǔn)時(shí)間"bid":"com.cosmosbox.StrikeHero",//iPhone程序的bundle標(biāo)識(shí)"original_purchase_date_ms":"1435031794826"http://毫秒},"status":0//狀態(tài)碼,0為成功}
蘋果返回狀態(tài)碼
蘋果返回狀態(tài)碼的解釋:https://developer.apple.com/library/ios/releasenotes/General/ValidateAppStoreReceipt/Chapters/ValidateRemotely.html
Status描述
21000App Store不能讀取你提供的JSON對(duì)象
21002receipt-data域的數(shù)據(jù)有問(wèn)題
21003receipt無(wú)法通過(guò)驗(yàn)證
21004提供的shared secret不匹配你賬號(hào)中的shared secret
21005receipt服務(wù)器當(dāng)前不可用
21006receipt合法,但是訂閱已過(guò)期。服務(wù)器接收到這個(gè)狀態(tài)碼時(shí),receipt數(shù)據(jù)仍然會(huì)解碼并一起發(fā)送
21007receipt是Sandbox receipt,但卻發(fā)送至生產(chǎn)系統(tǒng)的驗(yàn)證服務(wù)
21008receipt是生產(chǎn)receipt,但卻發(fā)送至Sandbox環(huán)境的驗(yàn)證服務(wù)
更詳細(xì)的請(qǐng)參考:http://www.2cto.com/kf/201504/389224.html
最好在客戶端存一個(gè)數(shù)據(jù)庫(kù),跟蹤訂單的狀態(tài),防止用戶訂單在某個(gè)環(huán)節(jié)出現(xiàn)問(wèn)題時(shí)無(wú)法尋找到訂單進(jìn)行二次處理。
去AppStore請(qǐng)求數(shù)據(jù)時(shí)有時(shí)候會(huì)出現(xiàn)錯(cuò)誤,你可以iTunes connect里的connect us去給他們寫郵件反饋問(wèn)題。但是大部分時(shí)間你等等就能解決了,對(duì)就是什么也不做等著。也許那一天他就好了。
單機(jī)/服務(wù)器模式
IOS 應(yīng)用內(nèi)支付(內(nèi)購(gòu) /In App Purchase)有兩種模式:
1) 單機(jī)模式
2) 服務(wù)器模式
單機(jī)模式
單機(jī)模式的流程可以簡(jiǎn)單的總結(jié)為以下幾步:
1) app從app store 獲取產(chǎn)品信息
2) 用戶選擇需要購(gòu)買的產(chǎn)品
3) app發(fā)送支付請(qǐng)求到app store
4) app store 處理支付請(qǐng)求,并返回transaction信息
5) app將購(gòu)買的內(nèi)容展示給用戶
服務(wù)器模式
服務(wù)器模式的主要流程如下所示:
1) app從服務(wù)器獲取產(chǎn)品標(biāo)識(shí)列表
2) app從app store 獲取產(chǎn)品信息
3) 用戶選擇需要購(gòu)買的產(chǎn)品
4) app 發(fā)送 支付請(qǐng)求到app store
5) app store 處理支付請(qǐng)求,返回transaction信息
6) app 將transaction receipt 發(fā)送到服務(wù)器
7) 服務(wù)器收到收據(jù)后發(fā)送到app stroe驗(yàn)證收據(jù)的有效性
8) app store 返回收據(jù)的驗(yàn)證結(jié)果
9) 根據(jù)app store 返回的結(jié)果決定用戶是否購(gòu)買成功
兩種模式比較
上述兩種模式的不同之處主要在于:交易的收據(jù)驗(yàn)證,內(nèi)建模式?jīng)]有專門去驗(yàn)證交易收據(jù),而服務(wù)器模式會(huì)使用獨(dú)立的服務(wù)器去驗(yàn)證交易收據(jù)。內(nèi)建模式簡(jiǎn)單快捷,但容易被破解。服務(wù)器模式流程相對(duì)復(fù)雜,但相對(duì)安全。
國(guó)內(nèi)連接蘋果服務(wù)器的穩(wěn)定性
開(kāi)發(fā)之初,蘋果方就很負(fù)責(zé)的告知:我們的服務(wù)器不穩(wěn)定。真正開(kāi)發(fā)之后,發(fā)現(xiàn)蘋果方果然是很負(fù)責(zé)的,不僅是不穩(wěn)定,而且足夠慢。app store server驗(yàn)證一個(gè)收據(jù)需要3-6s時(shí)間。
1.用戶能否忍受3-6s的等待時(shí)間
2.如果app store server 宕機(jī),如何確保成功付費(fèi)的用戶能夠得到正常服務(wù)。
對(duì)于第一個(gè)問(wèn)題,我們有理由相信用戶完全無(wú)法忍受,所以采用異步驗(yàn)證的方式,服務(wù)器收到客戶端的請(qǐng)求后,就將請(qǐng)求放到MCQ中去處理。
對(duì)于第二個(gè)問(wèn)題,由于蘋果人員很負(fù)責(zé)人的告知:我們的服務(wù)器不穩(wěn)定,所以不排除收據(jù)驗(yàn)證超時(shí)的情況。對(duì)于驗(yàn)證超時(shí)的收據(jù),保存到數(shù)據(jù)庫(kù)中并標(biāo)記為驗(yàn)證超時(shí),定時(shí)任務(wù)每隔一定的時(shí)間去app store驗(yàn)證,確保能夠獲取收據(jù)的驗(yàn)證結(jié)果。