蘋果內購服務器驗證之receipt返回多組in_app思考


最近有部分用戶反映,蘋果內購充值失敗,經過測試總結有幾個關鍵點出現問題

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就行

作者:舊舊的 <393210556@qq.com> 解決問題的方式,就是解決它一次


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM