購買的訂閱項目可能在許多因素下,經歷生命週期多種狀態。這些因素包括自動續訂行為、付款遭拒狀況,以及開發人員管理動作。
處理自動續訂型訂閱項目的生命週期
使用者的訂閱狀態變更時,後端伺服器會收到 SubscriptionNotification
訊息
如要在後端更新狀態,請使用通知中的購買憑證呼叫 purchases.subscriptionsv2.get
API。此端點可為特定購買憑證提供最新訂閱狀態,也是管理訂閱項目時的可靠資料來源。
購買憑證的效期會從訂閱項目註冊當天起算,至訂閱項目到期後 60 天結束。此期限過後,購買憑證就會失效,無法用於呼叫 Google Play Developer API。
新購自動續訂型訂閱項目
使用者購買訂閱項目時,系統會將 SUBSCRIPTION_PURCHASED
類型的 SubscriptionNotification
訊息傳送至您的 RTDN 用戶端。無論您接收通知或註冊新應用程式內購買交易的方法是透過 PurchasesUpdatedListener
,還是在應用程式內以 onResume()
方法手動擷取購買交易,都應在安全的後端中處理新購買交易。如要採用這種方式,請按照下列步驟進行:
- 查詢
purchases.subscriptionsv2.get
端點,取得包含最新訂閱狀態的訂閱資源。 - 確認
subscriptionState
欄位的值為SUBSCRIPTION_STATE_ACTIVE
。 - 驗證購買交易。
- 將內容存取權授予使用者。如果在建立購買交易時使用
setObfuscatedAccountId
和setObfuscatedProfileId
設定 ID,就可以運用訂閱資源中的ExternalAccountIdentifiers
物件,找出與購買交易相關聯的使用者帳戶。
Play 帳款服務程式庫也包含確認訂閱的 acknowledgePurchase()
方法,以及檢查確認狀態的 isAcknowledged()
方法。但建議您在後端處理購買交易,提高安全性。
以下是新購訂閱資源的參考範例:
{
"kind": "androidpublisher#subscriptionPurchaseV2",
"startTime": "2022-04-22T18:39:58.270Z",
"regionCode": "US",
"subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
"latestOrderId": "GPA.3333-4137-0319-36762",
"acknowledgementState": "ACKNOWLEDGEMENT_STATE_PENDING", // need to acknowledge new purchases
"lineItems": [
{
"productId": "sub_variant_plan01",
"expiryTime": next_renewal_date,
"autoRenewingPlan": {
"autoRenewEnabled": true
}
}
],
}
續訂
對於非分期付款的自動續訂訂閱項目,系統會在續訂時傳送 SUBSCRIPTION_RENEWED
通知。對於分期付款訂閱項目,每次在帳單日向訂閱項目收費時,系統都會傳送 SUBSCRIPTION_RENEWED
通知。請確保使用者仍有權存取訂閱項目,並使用 Google Play Developer API 所傳回訂閱資源提供的新 expiryTime
更新訂閱狀態。以下是訂閱資源的參考範例:
{
"kind": "androidpublisher#subscriptionPurchaseV2",
"startTime": "2022-04-22T18:39:58.270Z",
"regionCode": "US",
"subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
"latestOrderId": "GPA.3333-4137-0319-36762",
"acknowledgementState": "ACKNOWLEDGEMENT_STATE_ACKNOWLEDGED",
"lineItems": [
{
"productId": "sub_variant_plan01",
"expiryTime": next_renewal_date,
"autoRenewingPlan": {
"autoRenewEnabled": true
}
}
]
}
您不需要確認訂閱項目續訂情形。
寬限期
如果續訂訂閱項目時發生付款問題,Google 會通知使用者,並在訂閱項目到期前定期嘗試續訂一段時間。這段用來解決問題的緩衝期是寬限期加上後續的帳戶保留期。在寬限期內,使用者仍應可存取訂閱授權項目。
queryPurchasesAsync()
方法會繼續傳回處於寬限期的購買交易。如果應用程式僅使用 queryPurchasesAsync
檢查使用者是否有權存取訂閱項目,則應用程式應自動處理寬限期,因為這類訂閱項目會在 Play 帳款服務程式庫中顯示為有效。
將訂閱狀態與後端同步可讓您更清楚瞭解付款遭拒情形,並在您嘗試降低非自願流失率時,提供更多背景資訊。如要在使用者進入寬限期時收到通知,請監聽 SUBSCRIPTION_IN_GRACE_PERIOD
類型的 SubscriptionNotification
訊息。當使用者處於寬限期時,訂閱資源會包含 autoRenewEnabled = true
。Google Play 會動態延長 expiryTime
的值,直到寬限期到期為止,因為必須等到使用者取消訂閱或寬限期達到上限時,授權才會失效。在這段期間內,subscriptionState
欄位的值為 SUBSCRIPTION_STATE_IN_GRACE_PERIOD
。以下是訂閱資源參考範例:
{
"kind": "androidpublisher#subscriptionPurchaseV2",
...
"subscriptionState": "SUBSCRIPTION_STATE_IN_GRACE_PERIOD",
...
"lineItems": [
{
"productId": "sub_variant_plan01",
"expiryTime": timestamp_in_future,
"autoRenewingPlan": {
"autoRenewEnabled": true
}
}
],
}
Google Play 會在寬限期內向使用者通知付款遭拒,並提示使用者在 Play 商店中修正付款方式問題。使用者進入寬限期後,您也應建議他們修正付款方式,以免發生非自願的付款失敗問題。方法很簡單,只要使用應用程式內通訊 API 即可。如果您在使用者開啟應用程式時呼叫這個 API,系統就會在暫時性 Snackbar 中顯示 Google Play 訊息,通知使用者付款遭拒。這則訊息還包含深層連結,方便使用者修正 Google Play 中的付款方式。
使用者修正付款方式後,訂閱項目會以原本的續訂日期續訂,您也可以按照續訂相關章節的說明處理續訂作業。
如果使用者未在寬限期內修正付款方式,訂閱項目就會進入帳戶保留狀態,使用者也會失去授權。
寬限期存取權與復原
圖 2 時間軸顯示訂閱項目進入寬限期,並在使用者修正付款方式後復原。寬限期結束後,使用者應失去訂閱福利,並進入帳戶保留狀態。
請務必記住以下要點:
- 在寬限期內,使用者仍享有訂閱福利。
- 如果在寬限期內復原訂閱項目,續訂日期「不會」重設。
- 如果您延長寬限期 (例如從 7 天延長到 14 天),仍在寬限期內的使用者就能享有訂閱福利更長一段時間。
- 如果您縮短寬限期,雖然使用者未超過舊寬限期,但會超過新寬限期,因此他們的訂閱福利會立即撤銷。例如您將寬限期從 14 天縮短為 7 天,對處於舊寬限期第 8 到 14 天的使用者來說,訂閱福利會立即遭到撤銷。
- 訂閱仍處於有效狀態,在靜默寬限期結束前,您不會收到寬限期 RTDN
靜默寬限期
您可以設定 0 天的寬限期,但 Play 會等待至少 1 天,確保有足夠的時間重試付款。這個靜默寬限期可為付款處理作業提供安全網。在這段 24 小時內,訂閱項目會維持 ACTIVE
狀態。
如要保持與訂閱狀態變更同步,最好的方法就是監聽即時開發人員通知 (RTDN) 並做出回應。請在 RTDN 時間 (而非到期時間) 呼叫 purchases.subscriptionsv2.get()
方法,以便取得更準確的訂閱狀態。
視 24 小時的靜默寬限期後的訂閱狀態而定,您應該會收到下列其中一則通知:
SUBSCRIPTION_ON_HOLD
(如果已啟用)SUBSCRIPTION_CANCELED
(如果已取消)SUBSCRIPTION_EXPIRED
(如果已過期)SUBSCRIPTION_RENEWED
(如果續約成功)
您也可以在 24 小時的靜默寬限期過後的任何時間點呼叫 subscriptionV2.get()
方法,取得訂閱的最新狀態。
帳戶保留
如果續訂訂閱項目時發生付款問題,系統會在寬限期結束後開始帳戶保留期。訂閱項目進入帳戶保留狀態時,您應封鎖訂閱授權的存取權。
在帳戶保留期間,您應繼續視需要處理訂閱項目的所有取消、還原或重新購買作業,因為在訂閱項目處於保留狀態時,使用者可能會做出上述變更。
系統會在使用者進入帳戶保留期時發送 RTDN 通知,方便您盡快通知使用者為何訂閱項目遭到停權。方法很簡單,只要使用應用程式內通訊 API 即可。請在使用者開啟應用程式時呼叫這個 API,系統就會在暫時性 Snackbar 中顯示訊息,通知使用者付款遭拒。這則訊息還包含深層連結,方便使用者修正 Google Play 中的付款方式。
如果使用者可以在應用程式外存取訂閱內容,可能會發現使用者已在不同途徑失去存取權。建議您向使用者傳送推播通知或電子郵件,說明訂閱項目已因付款遭拒而失效。
在帳戶保留期間,queryPurchasesAsync()
方法不會傳回訂閱項目,因此若應用程式使用這個方法顯示現有的購買交易,則應預設支援帳戶保留功能。
透過即時開發人員通知,您會在訂閱項目進入帳戶保留狀態時,收到 SUBSCRIPTION_ON_HOLD
類型的 SubscriptionNotification
。只要從安全的後端伺服器呼叫 purchases.subscriptionsv2.get
方法,即可擷取新的訂閱資訊。在帳戶保留期間,訂閱資源的 expiryTime
欄位會設為過去的時間戳記,而 subscriptionState
欄位會設為 SUBSCRIPTION_STATE_ON_HOLD
:
{
"kind": "androidpublisher#subscriptionPurchaseV2",
...
"subscriptionState": "SUBSCRIPTION_STATE_ON_HOLD",
...
"lineItems": [
{
"productId": "sub_variant_plan01",
"expiryTime": timestamp_in_past,
...
}
],
}
如要恢復存取權,使用者必須修正自己的付款方式。Play 會通知因付款遭拒而處於帳戶保留狀態的使用者,您也應建議他們修正付款方式。
使用者修正付款方式後,訂閱項目會恢復為活動狀態,接著您必須還原訂閱內容的存取權。在此情況下,購買憑證會與帳戶保留狀態開始前相同,因為系統正在復原相同的購買交易,您也會收到 SUBSCRIPTION_RECOVERED
類型的 RTDN。
若是分期付款訂閱項目,則每筆付款嘗試都可能會發生付款遭拒和退款情形。
復原之後,Play 帳款服務程式庫會透過 queryPurchasesAsync()
方法再次傳回訂閱項目。如果您使用這個方法判斷使用者是否有權存取訂閱項目,則應用程式應自動處理從保留狀態復原的訂閱項目。
只要監聽 SUBSCRIPTION_RECOVERED
類型的 SubscriptionNotification
訊息,即可在訂閱項目復原時收到通知,而使用者應重新取得存取權。如果您在收到這則通知後查詢訂閱項目,expiryTime
欄位會設為未來的時間戳記,subscriptionState
欄位則會再次設為 SUBSCRIPTION_STATE_ACTIVE
:
{
"kind": "androidpublisher#subscriptionPurchaseV2",
...
"subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
...
"lineItems": [
{
"productId": "sub_variant_plan01",
"expiryTime": next_renewal_date,
...
}
],
}
如果使用者在帳戶保留期結束前未修正付款方式,您就會收到 SUBSCRIPTION_CANCELED
類型的 RTDN。如需有關處理取消訂閱的操作說明,請參閱「取消」一節。當您查詢以這種方式取消的訂閱項目時,傳回的 expiryTime
欄位會設為過去的時間戳記:
{
"kind": "androidpublisher#subscriptionPurchaseV2",
...
"subscriptionState": "SUBSCRIPTION_STATE_CANCELED",
...
"lineItems": [
{
"productId": "sub_variant_plan01",
"expiryTime": timestamp_in_past,
...
}
],
}
您在帳戶保留期間收到取消通知後,系統會立即發送 SUBSCRIPTION_EXPIRED
類型的 RTDN,因為使用者已失去付費授權,訂閱項目也已取消。您可以照常處理此到期情形。
在原始購買交易的帳戶保留期內,使用者可以重新購買相同的訂閱方案或其他您透過應用程式提供的方案,藉此重新取得存取權。在這種情況下,系統會核發新的購買憑證,並傳回新的值,做為這個新例項的 SUBSCRIPTION_PURCHASED
事件。
帳戶保留存取權與復原
圖 3 為時間軸範例,顯示訂閱項目進入帳戶保留狀態,並在使用者修正付款方式後復原的程序。
與上一個範例類似,圖 4 時間軸顯示訂閱項目先進入寬限期,再進入帳戶保留狀態,接著在保留期間復原。
請務必記住以下要點:
- 訂閱項目進入帳戶保留狀態之前,Google Play 會繼續嘗試透過付款方式收費,最多嘗試 48 小時。使用者在這段期間內仍享有訂閱福利。重試期結束後,訂閱項目會進入帳戶保留狀態,使用者應無法再享有訂閱福利。
- 如果訂閱項目從暫停狀態還原時付款方式失效,就會直接進入帳戶保留狀態。
- 訂閱項目從帳戶保留狀態復原時,續訂日期會重設。
到期日
訂閱項目到期後,使用者應無法存取該訂閱項目。在這種情況下,系統會傳送 SUBSCRIPTION_EXPIRED
類型的 SubscriptionNotification
訊息。您收到這則通知時,請查詢 Google Play Developer API,取得最新的訂閱資源。確認 subscriptionState
為 SUBSCRIPTION_STATE_EXPIRED
後,請移除授權,並在後端將購買狀態註冊為無效。以下是訂閱資源的參考範例:
{
"kind": "androidpublisher#subscriptionPurchaseV2",
...
"subscriptionState": "SUBSCRIPTION_STATE_EXPIRED",
...
"lineItems": [
{
"productId": "sub_variant_plan01",
"expiryTime": expiration_time_in_past,
...
}
],
}
取消
使用者可以自發性地從 Play 訂閱中心取消訂閱,也可以在訂閱項目進入帳戶保留狀態後不進行復原,讓系統自動取消訂閱項目。開發人員也可以使用 purchases.subscriptions.cancel
觸發取消作業。取消訂閱後,使用者可保留內容存取權,直到目前的帳單週期結束為止。帳單週期結束後,存取權應會撤銷。
取消非分期付款的自動續訂訂閱項目會觸發 SUBSCRIPTION_CANCELED
通知。收到這則通知時,從 Google Play Developer API 傳回的訂閱資源會將 subscriptionState
欄位設為 SUBSCRIPTION_STATE_CANCELED
,而 expiryTime
欄位會納入使用者無法再存取該訂閱項目的日期。如果該日期是過去的日期,使用者應會立即失去授權。舉例來說,如果使用者在帳戶保留期間因付款遭拒而取消訂閱,就可能會發生這種情況。
以下為購買交易取消時的訂閱資源參考範例:
{
"kind": "androidpublisher#subscriptionPurchaseV2",
...
"subscriptionState": "SUBSCRIPTION_STATE_CANCELED",
...
"lineItems": [
{
"productId": "sub_variant_plan01",
"expiryTime": expiration_time,
...
}
],
}
若是分期付款訂閱項目,當使用者在承諾期內仍需支付款項時,系統會在使用者主動取消訂閱後傳送 SUBSCRIPTION_CANCELLATION_SCHEDULED
通知。取消作業處於待處理狀態,並會在目前的承諾期結束時生效。收到這則通知時,從 Google Play Developer API 傳回的訂閱資源會將 subscriptionState 欄位設為 SUBSCRIPTION_STATE_ACTIVE
,因為分期付款訂閱項目在承諾期結束前仍會處於有效狀態。不過,系統會顯示空的 pendingCancellation 物件。系統會傳送 SUBSCRIPTION_CANCELED
通知,接著在承諾期結束時傳送 SUBSCRIPTION_EXPIRED
。
以下是分期付款訂閱購買交易的訂閱資源參考範例:
{
"kind": "androidpublisher#subscriptionPurchaseV2",
...
"subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
...
"lineItems": [
{
"productId": "sub_plan01",
"expiryTime": expiration_time,
"autoRenewingPlan": {
"autoRenewEnabled": true,
"recurringPrice": {
"currencyCode": "USD",
"units": "1",
"nanos": 990000000
},
"installmentDetails": {
"initialCommittedPaymentsCount": 6,
"remainingCommittedPaymentsCount": 5,
"pendingCancellation": {}
...
}
}
}
],
}
您可以查看訂閱資源中的 canceledStateContext
欄位,瞭解取消訂閱的原因,例如是由使用者、系統或您取消訂閱。如果是由使用者取消訂閱,您可以查看 userInitiatedCancellation
欄位,瞭解使用者取消該訂閱項目的原因。這有助於制定明智的溝通策略。
如果訂閱項目已取消,但尚未到期,queryPurchasesAsync()
仍會傳回該訂閱項目。建議您在應用程式中顯示訊息,通知使用者訂閱項目已取消,並提供到期日資訊。
撤銷
訂閱項目遭撤銷的原因有很多,包括後端使用 purchases.subscriptionsv2.revoke
撤銷訂閱項目,或是購買交易遭退單。在這類情況下,請立即撤銷使用者授權。發生這類情況時,系統會傳送 SUBSCRIPTION_REVOKED
類型的 SubscriptionNotification
訊息。您收到這則通知時,從 Google Play Developer API 傳回的訂閱資源會將 subscriptionState
欄位設為 SUBSCRIPTION_STATE_EXPIRED
。
以下為購買交易撤銷時的訂閱資源參考範例:
{
"kind": "androidpublisher#subscriptionPurchaseV2",
...
"subscriptionState": "SUBSCRIPTION_STATE_EXPIRED",
...
"lineItems": [
{
"productId": "sub_variant_plan01",
"expiryTime": expiration_time,
...
}
]
}
延後訂閱
考慮延長使用者授權的原因有很多。舉例來說,您可能會想以特別促銷活動的形式向使用者提供免費存取權,例如購買一部電影可免費使用一週,或向消費者提供免費存取權來表達善意。您可以使用 Play Developer API 的 purchases.subscriptions.defer
方法,將自動續訂型訂閱項目的下一個帳單日期往後延。執行此操作時,系統會傳送 SUBSCRIPTION_DEFERRED
類型的 SubscriptionNotification
訊息。在延後期間,使用者可完整存取訂閱內容,但無須支付費用。系統將根據延後的收費日期更新續訂日期。
對於預付方案,您可以使用延後收費的 API,將到期時間延後。
以下為訂閱項目延後時的訂閱資源參考範例:
{
"kind": "androidpublisher#subscriptionPurchaseV2",
...
"subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
...
"lineItems": [
{
"productId": "sub_variant_plan01",
"expiryTime": timestamp_in_future,
...
}
],
}
暫停的訂閱項目
您可以讓使用者暫停訂閱項目,降低自願性流失率。啟用暫停功能時,使用者可以選擇將訂閱項目暫停一週至三個月,視循環週期而定。
訂閱項目週期性付款 | 每週 | 每月 | 3 個月 | 6 個月 | 年繳 |
---|---|---|---|---|---|
可用的暫停長度* | 1 週 2 週 3 週 4 週 |
1 個月 2 個月 3 個月 |
1 個月 2 個月 3 個月 |
1 個月 2 個月 3 個月 |
無 |
目前的帳單週期結束後,訂閱項目暫停設定才會生效。訂閱項目暫停期間,使用者無法存取該訂閱項目,也不會支付續約費用。暫停期間結束後,訂閱就會恢復,Google 會嘗試續訂該訂閱項目。如果成功恢復訂閱,該訂閱項目就會再次生效。如果因付款問題而恢復失敗,使用者會進入帳戶保留狀態,如圖 5 和圖 6 所示:
使用者也可以選擇在暫停期間內,隨時手動恢復訂閱項目,如圖 6 所示。使用者手動恢復訂閱時,帳單日期會變更為手動恢復日期。
使用者暫停訂閱時,Play 帳款服務程式庫不會透過 queryPurchasesAsync()
方法傳回訂閱項目。恢復訂閱後,queryPurchasesAsync()
方法會再次傳回該訂閱項目。
您可以監聽 RTDN,瞭解使用者何時暫停訂閱。這些通知也可讓您在應用程式中告知使用者,說明他們已暫停訂閱項目,因此無法存取訂閱內容。您也應提供一種方式,讓使用者可隨時使用 Google Play 深層連結手動恢復訂閱。
使用者暫停訂閱項目時,系統會傳送 SUBSCRIPTION_PAUSE_SCHEDULE_CHANGED
類型的 SubscriptionNotification
訊息。此時,使用者應可繼續存取訂閱項目,直到下次續訂日期為止,且訂閱資源會包含 autoRenewEnabled = true
,而 subscriptionState
欄位的值為 SUBSCRIPTION_STATE_ACTIVE
。
暫停功能生效後,系統會傳送 SUBSCRIPTION_PAUSED
類型的 SubscriptionNotification
訊息。在這種情況下,使用者應無法存取訂閱項目,訂閱資源會包含 autoRenewEnabled = true
,而 subscriptionState
欄位會設為 SUBSCRIPTION_STATE_PAUSED
。只要查看 PausedStateContext
物件,就能瞭解訂閱項目應於何時再次續訂。
如果在暫停期結束時自動恢復訂閱,或是使用者選擇手動恢復訂閱,則系統會傳送 SUBSCRIPTION_RENEWED
類型的 SubscriptionNotification
訊息。您應依據「續訂」一節所述的方式處理。
如果在暫停後嘗試恢復訂閱時付款失敗,系統會傳送 SUBSCRIPTION_ON_HOLD
類型的 SubscriptionNotification
訊息。您應依據「帳戶保留」一節的說明處理這項程序。
重新訂閱
如果是自動續訂型的訂閱基本方案,Google Play 商店可能會顯示「重新訂閱」按鈕。這個按鈕可讓使用者重新取得訂閱項目的存取權限。不過,按鈕也可能因多種因素而不顯示,例如訂閱項目很久以前就到期了就會這樣。
雖然該按鈕一律會標示為「重新訂閱」,但其功能取決於訂閱狀態。
如果是在尚未到期的情況下取消訂閱,使用者仍會持續訂閱並享有訂閱福利。此時若使用者輕觸「重新訂閱」,取消作業就會復原,訂閱項目也會繼續續訂。這項操作在 Play 開發人員說明文件和 API 中稱為「還原」。
自動續約型訂閱項目到期後,您可以讓使用者購買相同的訂閱基本方案。這就是 Play 開發人員說明文件和 API 中所稱的「重新訂閱」。您可以使用 Play 管理中心或 API,為每個基本方案設定這個選項。
在到期前還原
如果應用程式僅使用 queryPurchasesAsync()
方法判斷使用者是否有權存取訂閱項目,則應用程式應自動處理還原作業,因為 queryPurchasesAsync()
方法會在到期日前繼續傳回已取消的購買交易。還原的訂閱項目會像不曾被取消般繼續續訂。
如果應用程式會與後端同步處理訂閱狀態,則您應監聽 SUBSCRIPTION_RESTARTED
類型的 SubscriptionNotification
訊息。收到此 RTDN 後,應用程式可以回應通知、記錄訂閱項目現已設為續訂,並停止在應用程式中顯示還原訊息。以下是訂閱資源的參考範例:
{
"kind": "androidpublisher#subscriptionPurchaseV2",
...
"subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
...
"lineItems": [
{
"productId": "sub_variant_plan01",
"expiryTime": next_renewal_date
...
}
],
}
到期後重新訂閱
如果您使用 Google Play 管理中心或 API 將自動續訂型基本方案設為允許重新訂閱,使用者便可在 Google Play 商店中重新購買到期的訂閱項目。
在這些新的購買交易中,Google Play 會核發全新的購買憑證,而您的後端會收到 SUBSCRIPTION_PURCHASED
類型的 RTDN。這時此類應用程式外購交易的購買狀態不會包含與初始交易相關的 linkedPurchaseToken
,因為原本的訂閱項目已完全到期。後端必須處理及確認這些全新的購買交易,就像對其他購買交易一樣。
升級、降級和重新訂閱
如果使用者選擇升級、降級,或在訂閱項目到期前,透過應用程式取消訂閱又重新註冊,舊的訂閱項目就會失效,系統也會使用新的購買憑證建立新訂閱項目。
此外,從 Google Play Developer API 傳回的訂閱資源會包含 linkedPurchaseToken
欄位,這個欄位會指出使用者進行升級、降級或重新訂閱的舊購買交易。您可以使用該欄位中的購買憑證查詢舊訂閱項目,並找出現有的使用者帳戶,方便您將新購買交易連結至同一個帳戶。
向應用程式使用者提供升級、降級或重新註冊選項之前,您必須先確認現有的訂閱項目。如果現有的訂閱項目尚待確認,系統會禁止任何方案變更或重新訂閱行為。
如果使用者成功升級、降級或重新訂閱,系統會將此視為新的購買交易,您必須再次確認。建議您使用 Google Play Developer API 確認購買交易。以下是訂閱資源的參考範例:
{
"kind": "androidpublisher#subscriptionPurchaseV2",
...
"subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
"linkedPurchaseToken": old_purchase_token,
...
"lineItems": [
{
"productId": "sub_variant_plan01",
"expiryTime": next_renewal_date,
"autoRenewingPlan": {
"autoRenewEnabled": true
}
}
],
}
價格異動
請參閱價格異動最佳做法指南,瞭解如何變更自動續訂型訂閱項目的費用,並在適當情況下通知使用者。
當價格異動以「選擇接受」的形式套用到現有訂閱者時,您會在使用者確認或拒絕新價格時收到 RTDN。
處理選擇接受型價格異動的使用者確認動作
如果使用者接受訂閱價格調漲,您會收到 SUBSCRIPTION_PRICE_CHANGED_CONFIRMED
類型的 SubscriptionNotification
訊息。如果使用者續訂了選擇不接受型降價方案或漲價的訂閱項目,您會收到 SUBSCRIPTION_RENEWED
類型的 SubscriptionNotification
訊息。請依照其他續訂程序的做法處理這種通知。
處理使用者選擇不接受價格調漲的情況
如果使用者在需要以更高的價格續約前,未接受選擇接受型漲價方案,系統會自動取消訂閱,而您會收到 SUBSCRIPTION_CANCELED
類型的 SubscriptionNotification
訊息。請按照「取消」一節的說明處理。
對於選擇不接受型漲價方案,使用者也可以透過相同的機制來取消訂閱。
處理預付方案的生命週期
與自動續約型訂閱項目一樣,您必須在每筆新購買交易建立後確認預付方案。如果是預付方案,您必須完整處理初次購買和所有儲值作業,因為使用者每次都必須完成購買流程。
由於預付方案的持續時間可能比較短,請務必盡快確認購買交易。預付期為一週或以上的預付方案必須在 3 天內確認。預付期少於一週的預付方案必須在方案效期一半的時間內確認。舉例來說,如果是為期三天的預付方案,開發人員有 1.5 天的時間確認購買交易。
使用者購買預付方案訂閱項目時 (包括每次儲值),系統會將 SUBSCRIPTION_PURCHASED
類型的 SubscriptionNotification
訊息傳送到您的 RTDN 用戶端。請呼叫 purchases.subscriptionsv2.get
方法,查看最新的預付方案訂閱狀態。
系統會為儲值購買交易核發新的購買憑證,並透過 linkedPurchaseToken
欄位將上一個購買憑證傳送給您,做為新訂閱項目購買交易狀態的一部分。購買憑證的效期會從訂閱項目註冊當天起算,至訂閱項目到期後 60 天結束。此期限過後,購買憑證就會失效,無法用於呼叫 Google Play Developer API。
以下為預付方案購買交易的訂閱資源參考範例:
{
"kind": "androidpublisher#subscriptionPurchaseV2",
"startTime": "2022-04-22T18:39:58.270Z",
"regionCode": "US",
"subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
"latestOrderId": "GPA.3333-4137-0319-36762",
"acknowledgementState": "ACKNOWLEDGEMENT_STATE_ACKNOWLEDGED",
"lineItems": [
{
"productId": "prepaid_plan01",
"expiryTime": expiry_date,
"prepaidPlan": {
"allowExtendAfterTime": timestamp_after_which_topups_are_allowed
}
}
]
}
您可以在 expiryTime
欄位中查看授權結束時間。儲值購買交易會透過累計時間增加授權時間。這表示如果使用者在原本的授權到期前儲值,新增的時間就會添加至先前的到期日。
建議您在應用程式中顯示訊息,告知使用者可以透過儲值來延長預付訂閱項目。如要得知使用者何時可以儲值,請查看訂閱資源的 allowExtendAfterTime
欄位。
預付方案不會自動續訂,因此無法取消。如果使用者想取消預付方案,只需等待到期日來臨即可。