设想一下:用户购买了订阅,更换了设备,重新安装了你的应用,然后突然失去了访问权限。这是失去用户信任的最快方式。
這正是「恢復購買」功能存在的意義。它看似可有可無的按鈕,實則不可或缺,尤其對訂閱制應用程式而言更是如此。
此選項讓使用者無需再次付費即可重新取得先前購買的內容。
這個小按鈕在建立信任、符合規範及提升用戶留存率方面扮演著關鍵角色。
为什么它很重要
- 使用者信任:若使用者曾付費一次,便期望無論使用何種裝置,都能持續享有存取權限。
- 支援負載:混亂或缺失的還原邏輯 = 憤怒用戶 + 更多工單。
- 應用商店合規性:蘋果與谷歌均要求您為特定產品類型提供還原選項。
哪些购买可以被恢复
可恢復的購買項目包括:
- 非消耗品:一次性購買項目,例如終身使用權或高級功能。
- 自動續訂訂閱服務:每月/每年方案,可跨裝置同步使用。
- 非自動續訂訂閱:固定期限存取權限(例如:3個月通行證)。
無法恢復:
- 消耗品,例如硬幣、額外生命或一次性加速道具。這些物品的設計初衷就是供玩家消耗使用。
“恢复购买”按钮的工作原理
- 使用者介面/使用者體驗。新增一個「恢復購買」按鈕——通常位於設定選項中或直接顯示於付費牆上。
- 觸發器。點擊後,透過以下方式觸發還原:
- SKPaymentQueue.restoreCompletedTransactions() 適用於 iOS
- BillingClient.queryPurchaseHistoryAsync() 適用於 Android
- 或您的後端邏輯(若您在伺服器端管理授權)
- 更新存取權限。還原完成後,請重新整理使用者的訂閱狀態並解鎖內容。
- 添加說明文字。簡單的提示可減少混淆:「若您已更換裝置或重新安裝應用程式,請使用此選項。」
- 避免重複。若使用者已具備存取權限,請停用按鈕或完全隱藏該按鈕。
- 帳戶邏輯。針對需登入的應用程式:將訂閱綁定至用戶帳戶,並透過後端同步以簡化跨裝置資料復原流程。
iOS 上的购买恢复机制
在 iOS 上,恢复购买会刷新应用收据,并重新交付与用户 Apple ID 关联的产品。该过程在后台静默运行,体验应当简洁明了。
以下是使用原生 StoreKit(StoreKit 2 之前版本)的实现方法:
1. 启动恢复流程
呼叫 restoreCompletedTransactions() 以觸發還原流程:
SKPaymentQueue.default().restoreCompletedTransactions()这会指示 StoreKit 查找与当前 Apple ID 关联的所有历史购买记录。
2. 处理已恢复的交易
監聽付款佇列並檢查是否出現 .restored 交易狀態。接著解鎖內容並標記交易為完成:
func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
for transaction in transactions {
if transaction.transactionState == .restored {
// Unlock access based on restored product
unlockContent(transaction: transaction)
SKPaymentQueue.default().finishTransaction(transaction)
}
}
}請務必呼叫 finishTransaction(_:)。否則,StoreKit 可能會持續重試相同的交易。
3. 妥善处理失败情况
恢复可能因收据无效、网络问题或 Apple ID 没有符合条件的购买记录而失败。请向用户显示清晰的反馈信息,并记录错误日志以便调试。
正在使用 Adapty SDK?我們透過單一方法呼叫即可處理所有流程,包含收據驗證與邊際案例。
Android 上的购买恢复机制
在 Android 上,恢复购买意味着通过 Google Play 检查用户的购买历史记录,并重新激活任何非消耗型产品或有效订阅。Android 没有像 iOS 那样的内置”恢复”按钮,因此你需要通过 billing API 手动处理。
以下是使用 Google Play Billing Library 的实现方法:
1. 查詢購買記錄
使用 queryPurchaseHistoryAsync() 來擷取用戶的過往購買紀錄:
billingClient.queryPurchaseHistoryAsync(
BillingClient.SkuType.SUBS
) { billingResult, purchaseHistoryList ->
if (billingResult.responseCode == BillingClient.BillingResponseCode.OK && purchaseHistoryList != null) {
for (purchase in purchaseHistoryList) {
// Restore subscription access
restoreEntitlement(purchase)
}
}
}您亦可透過傳遞 BillingClient.SkuType.INAPP 來查詢應用程式內購買項目。
2. 验证并解锁
获取购买历史记录后,验证收据(最好在服务器端进行),并相应地授予访问权限。请务必验证签名数据以防止伪造。
Adapty 开箱即用地处理购买验证、用户访问逻辑和跨平台同步。
3. 用户体验注意事项
由于 Android 用户通常不会期望看到”恢复购买”按钮,你可以:
- 登入或應用程式啟動時自動觸發還原
- 或者在设置中提供一个不显眼的选项,以确保透明度
无论采用哪种方式,请确保恢复逻辑在后台静默运行,并在访问权限恢复后更新界面。
总结
“恢复购买”按钮看似简单,但它在订阅旅程中扮演着至关重要的角色。
- 它能建立信任。
- 它能降低流失率。
- 它能确保你的合规性。
让它醒目可见,让它正常运作,让它简单易懂。




