一、有關(guān)Apple訂閱
1.自動續(xù)訂型方案和訂閱群組
Auto-renewable Subscriptions
自動續(xù)訂型方案,就是在用戶取消訂閱之前,每次訂閱周期期滿時自動續(xù)訂,款項由Apple
收取。
在 App Store Connect
里設(shè)置自動訂閱型方案時,每個訂閱項目一定要屬于某個訂閱群組Subscription Group
,并且要設(shè)定在改群組內(nèi)的Service Level
訂閱群組是訂閱項目的集合,有三點(diǎn)要注意:
用戶同時間內(nèi)只能訂閱同一個訂閱群組下的一個項目,若希望用戶可以同時自動續(xù)訂多個項目,則需創(chuàng)建多個訂閱群組。
在同一訂閱群組內(nèi)的
Free trial period
試用期或Introductory Price
優(yōu)惠價,只限一次。拖動排序設(shè)置
Service Level
訂閱級別,用于確定訂閱者可用的升級、降級和交叉升級行為。
2.自動續(xù)訂
自動續(xù)訂產(chǎn)品的續(xù)訂日期快到了,蘋果會自動扣款續(xù)費(fèi),若續(xù)費(fèi)成功,會生成一筆新的交易訂單保存在事務(wù)機(jī)制里面。如果App在前臺狀態(tài),此時會在觀察者隊列里面監(jiān)聽到該筆交易訂單的更新狀態(tài)。
originalPurchaseDate
:代表這個自動訂閱產(chǎn)品的第一次購買時間,服務(wù)端可以用來判斷這個用戶是什么時候開啟訂閱的。originalTransactionId
:代表第一次訂閱的交易id,服務(wù)端應(yīng)該用自己的訂單號orderId
和這個交易id進(jìn)行綁定。所以是想要跟蹤是哪筆訂單的續(xù)訂,就用這個。transactionId
每次都會改變,即使是恢復(fù)訂閱,transactionId
也會改變。
3.恢復(fù)購買
對于自動續(xù)訂型訂閱,需要提供恢復(fù)購買的功能restoreCompletedTransactions
,例如創(chuàng)建一個恢復(fù)按鈕,不然審核很可能會被拒絕。
"消耗型產(chǎn)品"和"非自動續(xù)訂訂閱"蘋果不會提供恢復(fù)的接口,不要調(diào)用restoreCompletedTransactions
方法去恢復(fù),否則有可能會被拒。非自動續(xù)訂訂閱也是跨設(shè)備同步的,所以原則上來說也需要提供恢復(fù)購買的功能,但需要依靠App自建的賬戶體系恢復(fù),不能用蘋果的恢復(fù)接口。
恢復(fù)已完成的交易會為用戶進(jìn)行的每筆已完成的交易創(chuàng)建一個新的交易,本質(zhì)上就是為交易隊列觀察者重播歷史記錄,改交易的狀態(tài)變?yōu)?code>restored。
4.在客戶端處理交易
利用蘋果的事務(wù)機(jī)制,每次重啟App時檢測未結(jié)束的訂單
-[SKPaymentQueue addTransactionObserver:]
,若訂單已經(jīng)購買但是未發(fā)放產(chǎn)品(即漏單),需要重新向服務(wù)器驗證,驗證成功后調(diào)用finishTransaction
結(jié)束該筆訂單。非特殊情況下無法對同一產(chǎn)品重復(fù)購買(即已經(jīng)發(fā)起一筆購買訂單,但是并沒有
finishTransaction
結(jié)束),所以每次購買前需要檢測是否有待處理的交易-[SKPaymentQueue transactions]
,若有則需要調(diào)用finishTransaction
結(jié)束。
There is a pending transaction for the same product identifier. Please either wait for it to be finished or finish it manually using `completePurchase` to avoid edge cases
購買時報上述錯誤,是因為發(fā)起的購買交易沒有調(diào)用finishTransaction
結(jié)束交易,無法對同一產(chǎn)品再次發(fā)起購買。
- 當(dāng)恢復(fù)訂閱時,如果產(chǎn)品從購買到續(xù)訂總共支付20次(即續(xù)訂19次),那么這個
二、有關(guān)Google訂閱
1. 上傳aab包
新增BILING
權(quán)限,然后上傳aab包到封閉測試才可新增產(chǎn)品
<uses-permission android:name="com.android.vending.BILLING"/>
2.建立產(chǎn)品
Google Play Console
--> 產(chǎn)品 --> 訂閱 --> 建立訂閱項目
例如你有包月、包季、包年三個產(chǎn)品, 你只需要創(chuàng)建一個訂閱產(chǎn)品,在該訂閱產(chǎn)品里面再創(chuàng)建三個基本方案。
3.在后端處理購買交易
對于訂閱產(chǎn)品首先需確保購買交易是否被確認(rèn),查看API
Purchases.subscriptions調(diào)用結(jié)果中的acknowledgementState
,若未被確認(rèn)必須調(diào)用API
Purchases.subscriptions.acknowledge進(jìn)行確認(rèn)。
4. 在客戶端處理購買交易
服務(wù)端必須在發(fā)送產(chǎn)品后進(jìn)行確認(rèn),由于確認(rèn)請求偶爾會失敗,所以可能會出現(xiàn)漏單的情況。防止服務(wù)端出現(xiàn)驗證錯誤的情況,需要在App每次重啟的時候使用queryPurchasesAsync
查詢有效訂閱產(chǎn)品,并向服務(wù)器重新驗證該筆購買交易。
queryPurchasesAsync
方法不需要網(wǎng)絡(luò),每次查詢都會返回有效訂閱產(chǎn)品,所以若訂閱型產(chǎn)品訂閱成功后,每次查詢都會返回,即使該產(chǎn)品已經(jīng)確認(rèn)。