標籤:library alt 關鍵點 這一 com tps style 最新 src
最近有部分使用者反映,蘋果內購儲值失敗,經過測試總結有幾個關鍵點出現問題
1.app購買成功蘋果沒有返回票據,屬於票據遺漏(取決於蘋果伺服器的響應狀況),只能用戶端進行監聽重新整理等處理
2.app連續購買的過程中,前幾次蘋果沒有返回票據,幾次之後,蘋果返回了一個有效票據,app提交給伺服器進行驗證的過程中in_app出現多組資料的情況,這種情況還是能儲值成功了,只是不能全部到賬
3.app連續購買,有一次正常返回票據,在提交給伺服器的過程中出現意外,但實際服務端已經接受到票據,為使用者成功儲值,但app進行下次儲值帶回票據,再次提交伺服器驗證的時候,in_app中出現了上次已經提交的票據資訊,這種情況伺服器將判斷為已經儲值,導致最後一次儲值失敗
本著刨根問底的精神,查閱各方資料總結如下,蘋果的官方描述(IAP票據驗證)如下:
百度翻譯如下:
它說,票據在一個在JSON檔案,是一個數組包含所有應用程式購買收據基於應用程式購買交易收據資料輸入Base-64,而且有可能返回一個空的數組(空數組居然還是有效)
在應用程式購買收據消耗型產品添加到發票購買時,它是儲存在你的應用程式接收到完成交易。在這一點上,它是下一次收到的更新-例如從收據後,當使用者再購買或如果您的應用程式顯式重新整理收據。
原諒我的英文水平低下,看完之後一臉懵逼,下面總結一下我個人的理解,大概意思如下:
對於消耗型產品的購買,在購買完成(蘋果那邊購買完成,不是伺服器購買完成)之後會被添加到票據資訊中,直到你的APP完成交易(APP的主動行為),之後它會在使用者下一次購買的時候對票據進行重新整理,或者APP進行顯示重新整理。
看完這個就很好理解上面出現的問題了,也就是說:
驗證票據返回的receipt裡面的in_app欄位,這個欄位包含了所有你未完成交易的票據資訊。也就是在上面說到的APP完成交易之後,這個票據資訊,就會從in_app中消失。
如果APP不完成交易,這個票據資訊就會在in_app中一直保留。(這個情況可能僅限於你的商品類型為消耗型)
知道了事件的原委,就很好最佳化解決了,方案有2個
1.對票據返回的in_app資料全部進行處理,沒有儲值的全部進行儲值
2.僅對最新的儲值資訊進行處理(我們採取的方案)
因為採用一方案:
如果使用者僅進行了一次儲值,該儲值未到賬,他不再進行儲值了,那麼會無法導致。
如果他通過客服的途徑已經進行了補充儲值,那麼他在下一次儲值的時候依舊會把之前的產品票據帶回,這時候有可能出現重複儲值的情況
特別說明:如果你需要當前票據的唯一號,取in_app中最後一個票據的transaction_id就行
By Hgq
蘋果內購伺服器驗證之receipt返回多組in_app思考