定期支付概要
定期支付是用戶可以在規定的時間内使用服務,根據支付周期定期更新支付。
一般在使用音樂、電影或游戲時,都會使用定期支付服務。
開發者為了提供多種服務,可以在一個應用軟件中配置多種定期支付商品,用戶可以使用多種定期支付。
此外,為了確保新用戶,可以以折扣價提供定期支付或提供免費體驗的時間。
同樣,也可以轉換商品,讓現有用戶可以變更正在使用的定期支付商品。
處理定期支付
用户購買定期支付商品後,在使用商品期間可能進行多種狀態變更。
應用軟件要確認定期支付的狀態,應對各狀態的變更。
可以使用ONE store In-App支付library的PurchaseClient.queryPurchasesAsync() 或伺服器API getSubscriptionDetail來確認定期支付狀況。
定期支付狀態變更後,將發回SubscriptionNotification。相關内容請參閱使用
PNS(Push Notification Service)。
購買定期支付
用戶購買定期支付後,PurchaseClient.queryPurchasesAsync()返回定期支付结果, 並發送SUBSCRIPTION_PURCHASED的SubscriptionNotification。
接到該通知後,必須查詢ONE store In-App支付API更新定期支付的狀態。定期支付資源請参考以下示例。
{
+ "acknowledgementState": 0, // 購買新的定期付款時,需要acknowledge。
+ "autoRenewing": true,
"paymentState": 1,
"lastPurchaseId": "22071114040010115614",
"linkedPurchaseToken": null,
"priceAmount": "610",
"priceAmountMicros": 610000000,
"nextPriceAmount": "610",
"nextPriceAmountMicros": 610000000,
"nextPaymentTimeMillis": 1658106000000,
"pauseStartTimeMillis": null,
"pauseEndTimeMillis": null,
"priceCurrencyCode": "KRW",
"countryCode": "KR",
"startTimeMillis": 1657515841000,
+ "expiryTimeMillis": 1658156399000,
"autoResumeTimeMillis": null,
"cancelledTimeMillis": null,
"cancelReason": null,
"promotionPrice": null,
"priceChange": null
}
更新定期支付
定期支付更新后,會發送SUBSCRIPTION_RENEWED通知。
接到該通知後,必須查詢ONE store In-App支付API,將定期支付狀態更新到新的到期日。定期支付資源請參考以下示例。
{
+ "acknowledgementState": 1,
+ "autoRenewing": true,
"paymentState": 1,
"lastPurchaseId": "22071411443210116308",
"linkedPurchaseToken": null,
"priceAmount": "610",
"priceAmountMicros": 610000000,
"nextPriceAmount": "610",
"nextPriceAmountMicros": 610000000,
"nextPaymentTimeMillis": 1658365200000,
"pauseStartTimeMillis": nul,
"pauseEndTimeMillis": null,
"priceCurrencyCode": "KRW",
"countryCode": "KR",
"startTimeMillis": 1657766672000,
+ "expiryTimeMillis": 1658501999000,
"autoResumeTimeMillis": null,
"cancelledTimeMillis": null,
"cancelReason": null,
"promotionPrice": null,
"priceChange": null
}
每月支付的商品,下一個月的同一天為支付日(3個月/6個月支付的商品同理)。
例如,如果1月15日開始定期支付,下一個支付日是2月15日。
但,如果沒有相同的日期,當月的最後一天就是支付更新日。
例如,1月31日開始定期支付,下一個支付日是2月28日(或29日),再下一個支付日是3月28日(或29日)。
定期支付到期
定期支付到期後,PurchaseClient.queryPurchasesAsync()將不再返回,用戶將無法使用定期支付。
SUBSCRIPTION_EXPIRED的SubscriptionNotification也將在定期支付到期時發送
接到该通知後,必須查詢ONE store In-App支付API,更新定期支付狀態。定期支付資源請參考以下示例。
{
"acknowledgementState": 1,
+ "autoRenewing": false,
"paymentState": 1,
"lastPurchaseId": "22071213191410115875",
"linkedPurchaseToken": null,
"priceAmount": "610",
"priceAmountMicros": 610000000,
"nextPriceAmount": "610",
"nextPriceAmountMicros": 610000000,
"nextPaymentTimeMillis": 1658192400000,
"pauseStartTimeMillis": null,
"pauseEndTimeMillis": null,
"priceCurrencyCode": "KRW",
"countryCode": "KR",
"startTimeMillis": 1657599554000,
+ "expiryTimeMillis": 1658242799000,
"autoResumeTimeMillis": null,
"cancelledTimeMillis": null,
"cancelReason": null,
"promotionPrice": null,
"priceChange": null
}
解除定期支付
用户可以在ONE store應用軟件中直接解除定期支付,如果在支付手段出現問題時不解决,則會被自動解除定期支付。
也可以使用ONE store In-App支付API cancelRecurringPruchase解除定期支付。
即使用戶直接解除定期支付,也可在目前定期支付期限结束之前使用服務。
如果已經解除定期支付但尚未到期時,PurchaseClient.queryPurchasesAsync()將被返回。定期支付解除後,將發送SUBSCRIPTION_CANCELED通知。
接到該通知後,必須查詢ONE store In-App支付API,更新狀態。 查詢時 autoRenewing=false和用戶可以使用的服務期限expiryTimeMillis。
如果expiryTimeMillis期限是過去時間,服務會立即中斷。如果期限是未来,一直使用服務到相應日期。定期支付資源請參考以下示例。
{
"acknowledgementState": 1,
+ "autoRenewing": false,
"paymentState": 1,
"lastPurchaseId": "22071118111610115712",
"linkedPurchaseToken": null,
"priceAmount": "610",
"priceAmountMicros": 610000000,
"nextPriceAmount": "610",
"nextPriceAmountMicros": 610000000,
"nextPaymentTimeMillis": 1658106000000,
"pauseStartTimeMillis": null,
"pauseEndTimeMillis": null,
"priceCurrencyCode": "KRW",
"countryCode": "KR",
"startTimeMillis": 1657515841000,
+ "expiryTimeMillis": 1658156399000,
"autoResumeTimeMillis": null,
+ "cancelledTimeMillis": 1658156399000,
+ "cancelReason": 1,
"promotionPrice": null,
"priceChange": null
}
已解除用戶的定期支付,應通過應用軟件告知該定期支付的到期日期。(示例:定期支付已解除。定期支付將於2023年6月13日到期。 [確認])
取消定期支付
出於多種原因,用戶可以取消定期支付。如果定期支付被取消,應立即禁止使用服務。
此時,PurchaseClient.queryPurchasesAsync()將不再返回, 還會發送SUBSCRIPTION_EXPIRED通知。
接到該通知後,必須查詢ONE store In-App支付API,更新定期支付狀態。
定期支付資源包括autoRenewing和定期支付使用期限expiryTimeMillis。定期支付資源請參考以下示例。
{
"acknowledgementState": 1,
+ "autoRenewing": false,
"paymentState": null,
"lastPurchaseId": "22071216245010115987",
"linkedPurchaseToken": null,
"priceAmount": "610",
"priceAmountMicros": 610000000,
"nextPriceAmount": "610",
"nextPriceAmountMicros": 610000000,
"nextPaymentTimeMillis": 1658192400000,
"pauseStartTimeMillis": null,
"pauseEndTimeMillis": null,
"priceCurrencyCode": "KRW",
"countryCode": "KR",
"startTimeMillis": 1657610690000,
+ "expiryTimeMillis": 1657610749000,
"autoResumeTimeMillis": null,
+ "cancelledTimeMillis": 1657610749000,
+ "cancelReason": 1,
"promotionPrice": null,
"priceChange": null
}
定期支付的寬限期
用戶在使用定期支付時,支付手段出現了問題,如果問題得不到解决,定期支付不會立即解除。
如上所情况时,(1)延期支付 - 設定延期期限時 (2) 按帳戶保留順序變更定期支付狀態。
是否提供延期支付期限,可在ONE store開發者中心進行設定。
如果設定了延期支付期限,用戶必須在相應期間内可以使用定期支付内容。
如果在應用軟件使用PurchaseClient.queryPurchasesAsync()来確認定期支付狀態,PurchaseClient.queryPurchasesAsync()會在到期前持續返回定期支付狀態,因此應用軟件必須自動處理延期時間。
用戶的定期支付狀態被延期支付時,將發送SUBSCRIPTION_IN_GRACE_PERIOD通知。
接到該通知後,必須查詢ONE store In-App结算API,更新狀態。定期支付資源包括未來節點的expiryTimeMillis,以便適用autoRenewing=true和延期。
如果在延期时間内不解决支付問題,帳戶就會成为保留狀態,用戶將不能使用定期支付内容。
應用軟件中應該顯示資訊,以便用戶解决支付問題。
可以提供深度鏈接以幫助用戶解决支付問題。
用戶解决支付問題後,定期支付會立即更新。
{
"acknowledgementState": 0,
+ "autoRenewing": true,
"paymentState": 0,
"lastPurchaseId": "22071209533410115807",
"linkedPurchaseToken": null,
"priceAmount": "610",
"priceAmountMicros": 610000000,
"nextPriceAmount": "610",
"nextPriceAmountMicros": 610000000,
"nextPaymentTimeMillis": 1658192400000,
"pauseStartTimeMillis": null,
"pauseEndTimeMillis": null,
"priceCurrencyCode": "KRW",
"countryCode": "KR",
"startTimeMillis": 1657587215000,
+ "expiryTimeMillis": 1658242799000,
"autoResumeTimeMillis": null,
"cancelledTimeMillis": null,
"cancelReason": null,
"promotionPrice": null,
"priceChange": null
}
保留定期支付帳戶
用戶在使用定期支付時,支付手段出現問題,如果問題得不到解决,延期期限结束後,帳戶將處於保留狀態。
帳戶保留期限最長為30天,與延期期限不同,在帳戶保留狀態下不能使用定期支付内容。
另外,帳戶保留期間, PurchaseClient.queryPurchasesAsync()不會返回定期支付。
如果用戶的定期支付處於帳戶保留狀態,將發送SUBSCRIPTION_ON_HOLD通知。
接到該通知後。必須調用ONE store In-App支付API,更新定期支付資訊。在帳戶保留狀態下,定期支付資源的expiryTimeMillis被設定為過去。
在保留狀態下,用戶不能使用定期支付内容,超過指定的保留期限後,定期支付將被解除。
因此,要在應用軟件中應該顯示資訊,以便用戶能更解決問題。
可以提供深度鏈結以幫助用戶解決問題。
用戶解決問題後恢復定期支付的話,恢復那天變更為定期支付日。
帳戶保留期结束前,如果用戶不解決問題,就會發送SUBSCRIPTION_CANCELED通知,必須查詢ONE store In-App支付API,更新定期支付狀態。
{
"acknowledgementState": 0,
+ "autoRenewing": true,
"paymentState": 0,
"lastPurchaseId": "22071209361310115799",
"linkedPurchaseToken": null,
"priceAmount": "610",
"priceAmountMicros": 610000000,
"nextPriceAmount": "610",
"nextPriceAmountMicros": 610000000,
"nextPaymentTimeMillis": 1659315600000,
"pauseStartTimeMillis": null,
"pauseEndTimeMillis": null,
"priceCurrencyCode": "KRW",
"countryCode": "KR",
"startTimeMillis": 1657586174000,
+ "expiryTimeMillis": 1658242799000,
"autoResumeTimeMillis": null,
"cancelledTimeMillis": null,
"cancelReason": null,
"promotionPrice": null,
"priceChange": null
}
暫停定期支付
開發者可以在ONE store開發者中心設置暫停功能。
如果設置暫停功能,用戶可以在一定時間内暫停定期支付,而不是取消訂閱應用軟件。
暫停是在目前定期支付中的商品到期後開始。用戶在暫停期間不能使用定期支付内容。
暫停期間结束後,將重新開始定期支付。
用戶也可以在暫停期结束前直接解除暫停,重新開始定期支付。在這種情况下,解除暫停重新開始定期支付的日期成為定期支付日。
暫停時,PurchaseClient.queryPurchasesAsync()不被返回。恢復定期支付後,PurchaseClient.queryPurchasesAsync()被返回。
如果用戶選擇暫停,將會發送SUBSCRIPTION_PAUSE_SCHEDULE_CHANGED的SubscriptionNotification。
此時用戶還留有定期支付的時間,因此必須能夠繼續使用定期支付的内容。
定期支付資源包括autoRenewing=true, paymentState=1和未來的expiryTimeMillis, autoResumeTimeMillis值。
{
"acknowledgementState": 1,
+ "autoRenewing": true,
+ "paymentState": 1,
"lastPurchaseId": "22071114040010115614",
"linkedPurchaseToken": null,
"priceAmount": "610",
"priceAmountMicros": 610000000,
"nextPriceAmount": "610",
"nextPriceAmountMicros": 610000000,
"nextPaymentTimeMillis": 1660698000000,
+ "pauseStartTimeMillis": 1660748400000,
+ "pauseEndTimeMillis": 1663340399000,
"priceCurrencyCode": "KRW",
"countryCode": "KR",
"startTimeMillis": 1657515841000,
+ "expiryTimeMillis": 1660748399000,
+ "autoResumeTimeMillis": 1660698000000,
"cancelledTimeMillis": null,
"cancelReason": null,
"promotionPrice": null,
"priceChange": null
}
暫停開始後,將發送SUBSCRIPTION_PAUSED的Subscription Notification。
如果開始暫停,定期支付使用期限就到期,因此不能再使用定期支付内容。
定期支付資源包括autoRenewing=true, paymentState=0和過去的expiryTimeMillis, autoResumeTimeMillis值。
暫停期结束後,如果定期支付自動恢復或用戶解除暫停並恢復定期支付,將發送SUBSCRIPTION_RENEWED 인 SubscriptionNotification。
此時需進行與"鏈接 - 定期支付更新"相同的處理。
恢復定期支付時,如果结算出現問題,就會發生定期支付帳戶保留狀態,應進行與定期支付帳戶保留狀態相同的處理。
{
"acknowledgementState": 1,
+ "autoRenewing": true,
+ "paymentState": 0,
"lastPurchaseId": "22071114040010115614",
"linkedPurchaseToken": null,
"priceAmount": "610",
"priceAmountMicros": 610000000,
"nextPriceAmount": "610",
"nextPriceAmountMicros": 610000000,
"nextPaymentTimeMillis": 1663290000000,
+ "pauseStartTimeMillis": 1660748400000,
+ "pauseEndTimeMillis": 1663340399000,
"priceCurrencyCode": "KRW",
"countryCode": "KR",
"startTimeMillis": 1657515841000,
+ "expiryTimeMillis": 1660748399000,
+ "autoResumeTimeMillis": 1663290000000,
"cancelledTimeMillis": null,
"cancelReason": null,
"promotionPrice": null,
"priceChange": null
}
商品變更(升级和降级)
如果用戶將定期支付中的商品變更為其他定期支付商品,現有的定期支付將無效,新的定期支付將與新的購買token一起生成。
另外,定期支付資源中還包括表示現有定期支付的linkedPurchaseToken。
使用"inkedPurchaseToken可以查詢以前的定期支付,將新的定期支付與同一帳戶進行連接。
已經創建了新的定期支付,需對該支付進行"鏈接 - 購買確認"。定期支付資源請參考以下示例。
{
"acknowledgementState": 1,
"autoRenewing": true,
"paymentState": 1,
"lastPurchaseId": "22071214572510115940",
+ "linkedPurchaseToken": "220712131914S0115875",
"priceAmount": "600",
"priceAmountMicros": 600000000,
"nextPriceAmount": "600",
"nextPriceAmountMicros": 600000000,
"nextPaymentTimeMillis": 1660266000000,
"pauseStartTimeMillis": null,
"pauseEndTimeMillis": null,
"priceCurrencyCode": "KRW",
"countryCode": "KR",
"startTimeMillis": 1657605449000,
"expiryTimeMillis": 1660316399000,
"autoResumeTimeMillis": null,
"cancelledTimeMillis": null,
"cancelReason": null,
"promotionPrice": null,
"priceChange": null
}
打開定期支付的管理界面
ONE store為用戶提供定期支付管理選單,以便管理定期支付商品。
如果將PurchaseData作為參數放入SubscriptionsParams中,則確認購買數據,並運行相應定期支付商品的管理界面。 SubscriptionParams輸入null時,將運行用戶的定期支付列表界面。
以下是顯示定期支付管理界面的示例。
fun launchManageSubscription(@Nullable purchaseData: PurchaseData) {
.val subscriptionParams = when (purchaseData != null) {
true -> SubscriptionParams.newBuilder()
.setPurchaseData(purchaseData)
.build()
else -> null
}
purchaseClient.launchManageSubscription(mActivity, subscriptionParams)
}
public void launchManageSubscription(@Nullable PurchaseData purchaseData) {
SubscriptionParams subscriptionParams = null;
if (purchaseData != null) {
subscriptionParams = SubscriptionParams.newBuilder()
.setPurchaseData(purchaseData)
.build();
}
purchaseClient.launchManageSubscription(mActivity, subscriptionParams);
}
變更定期支付商品
用戶可能想在定期支付中改變計畫,購買更好或更便宜的定期支付商品。
用戶可以通過支付其他定期支付商品來變更定期支付商品,開發者可以設定比例分配模式來處理定期支付商品的變更。
可設定的比例分配模式(PurchaseFlowParams.ProrationMode)如下。
比例分配示例
用戶現在每月定期支付商品A。該定期支付需要支付2000韓元,每月1日更新。
4月15日,用戶決定將商品變更為年定期支付商品B,費用為每年36,000韓元。
IMMEDIATE_WITH_TIME_PRORATION
定期支付商品A立即终止。用戶支付了一個月(4月1日~30日)的費用,在定期支付期間中間變更了商品,因此每月定期支付費用的一半(1,000韓元)將適用於新的定期支付。 但是新的定期支付費用為每年36,000韓元,因此,1000韓元的餘額相當於10天(4月16日~25日)。 因此,4月26日需要支付新的定期支付費用36,000韓元,從第二年開始每年4月26日需支付36,000韓元。
IMMEDIATE_AND_CHARGE_PRORATED_PRICE
每小時定期支付商品B的價格(36,000韓元/年= 3000韓元/月)高於定期支付商品A的價格(2000元/月),因此可使用此模式。而定期支付商品A立即终止。用戶结算了一個月的全部費用,但只使用了期間的一半,所以每月定期支付費用的一半(1000韓元)適用於新的定期支付。新的定期支付費用是一年36,000韓元,剩下的15天的費用是1500元。因此,作為新的定期支付費用,需要支付500韓元的差額。5月1日,新定期支付商品B的費用為36,000韓元,從第二年開始每年5月1日的費用為36,000韓元。
IMMEDIATE_WITHOUT_PRORATION
定期支付商品A立即變更為定期支付商品B,不需要追加費用。5月1日,新定期支付商品B的費用是36,000韓元,從第二年開始每年5月1日支付費用是36,000韓元。
DEFERRED
定期支付商品A將持續到4月30日到期為止。5月1日適用定期支付商品B,作為新的定期支付費用,用戶需支付36,000韓元。
定期支付可以使用與"請求購買"相同的API為用戶提供商品變更功能。但是,為了變更定期支付的商品,必須具備現有的定期支付購買token和比例分配模式值。
如下列例子,需要提供關於定期支付和變更後適用的定期支付及比例分配模式的相關資訊。
val subscriptionUpdateParams = SubscriptionUpdateParams.newBuilder()
.setProrationMode(desiredProrationMode)
.setOldPurchaseToken(oldPurchaseToken)
.build()
val purchaseFlowParams = PurchaseFlowParams.newBuilder()
.setProductId(newProductId)
.setProductType(productType)
.setProductName(productName) // optional
.setDeveloperPayload(devPayload) // optional
.setSubscriptionUpdateParams(subscriptionUdpateParams)
.build()
purchaseClient.launchPurchaseFlow(activity, purchaseFlowParams)
SubscriptionUpdateParams subscriptionUpdateParams = SubscriptionUpdateParams.newBuilder()
.setProrationMode(desiredProrationMode)
.setOldPurchaseToken(oldPurchaseToken)
.build();
PurchaseFlowParams purchaseFlowParams = PurchaseFlowParams.newBuilder()
.setProductId(newProductId)
.setProductType(productType)
.setProductName(productName) // optional
.setDeveloperPayload(devPayload) // optional
.setSubscriptionUpdateParams(subscriptionUdpateParams)
.build();
purchaseClient.launchPurchaseFlow(activity, purchaseFlowParams);
對於立即進行變更的比例分配模式,由於執行"請求購買"邏輯,所以回應由PurchasesUpdatedListener接收。此外,還可以在"查詢購買订單"中得到回應。
必須使用PurchaseClient.acknowledgeAsync()或acknowledgePurchase進行"確認購買"處理。
ONE store的In-App支付API從定期支付資源中返回linkedPurchaseToken。linkedPurchaseToken應該無效化,以避免以前的tokne被用於獲得内容使用權限。
對於變更延遲的比例分配模式,接收定期支付的購買及變更與否的同時接收PurchasesUpdatedListener調用。
直到變更適用,PurchaseClient.queryPurchasesAsync()繼續返回現有定期支付商品的購買資訊。
變更適用後,PurchaseClient.queryPurchasesAsync()會返回新定期支付商品的購買資訊,發送SUBSCRIPTION_RENEWED的Subscription Notification。
如果發生變更延遲,最好接收此通知並使用acknowledgePurchase進行購買確認處理。.
變更為有促銷活動的商品
ONE store在使用促銷活動的定期支付商品時,不能變更為其他商品。
但是,成為變更對象的商品即使適用促銷活動,也可以進行變更。
如果顧客想繼續使用變更對象的商品促銷活動,必須應用IMMEDIATE_WITH_TIME_PRORATION模式。
除此之外的其他比例分配模式的情况是,即使變更對象商品適用促銷活動,也不能使用促銷活動。
推遲定期支付期限
使用ONE store In-App支付API的deferSubscription,可以推遲定期支付用戶的下一個支付日。
推遲期間,用戶可以對内容進行access。
定期支付期限的延期可以在以下情况下使用。
通過特別活動,使現有用戶在一周内額外使用定期支付。
每個API調用可以將支付期限從最少一天推遲到最多一年。如果要再次延期支付,只需在期限内再次調用API。
延期支付時,可以在電子郵件或應用軟件内發送通知,告知支付日期變更。
更改定期支付價格
在ONE store開發者中心可以變更定期支付商品的價格。
定期支付商品的基本價格變更後,新的購買會立即反映變更的價格。
但是,對於現在使用定期支付的顧客,7天後會收到變更價格的通知,之後30天會被提供價格變更同意期間。
但是即將變更為Deferred模式的訂閱商品出現價格變動時在商品模式變更後開始價格變動同意流向。
如果在期限内不同意變更價格,該定期支付將在下一個定期支付日取消。
(如果價格下降或维持不變,無需另行通知或同意,7日後在下一個更新日以變更價格支付。)
同意變更價格時
用戶同意提高訂閱費用或降低價格時,在同意期限後以變更的價格支付。
另外,將發送SUBSCRIPTION_PRICE_CHANGE_CONFIRMED的Subscription Notification。
不同意變更價格時
如果用戶不同意提高訂閱費用,定期支付將自動取消,並發送SUBSCRIPTION_REVOKED的Subscription Notification。
因失誤變更價格時
如果因失誤變更了定期支付價格,最好重新返回價格。
如果在7天内恢復價格,則不會對現有定期支付用戶造成影響。
但是,在這種情况下,新購買的顧客也會以變更的價格支付,因此價格變更要慎重。
發生兩次價格變更時
如果第一次價格變更後的第二次價格變更是在7天以内,那麼第一次價格變更將無效,只適用第二次價格變更。
但,如果第二次價格變更是在7天以後,用戶必須同意兩次價格變更。
對價格變更的同意程序會给用戶帶來不便,维持相應定期支付商品的顧客很有可能會减少。
再次强調,價格變更要慎重。