# 應用定期支付

{% hint style="warning" %}
對於2025年8月25日以後在韓國訂閱的定期支付，如果用戶在免費體驗或新優惠期結束前不同意，訂閱將被取消。

* ONE store會在促銷期結束前30天通過電子郵件和ONE store通知請求用戶同意。
* 此外，在ONE store定期支付管理界面也會徵求同意，開發者可以在應用內使用[打开定期支付管理界面](https://onestore-dev.gitbook.io/dev/cht/tools/billing/v21/sdk#id-04.-sdk-10)向客戶請求同意。
  {% endhint %}

## **定期支付概要** <a href="#id-ying-yong-ding-qi-zhi-fu-ding-qi-zhi-fu-gai-yao" id="id-ying-yong-ding-qi-zhi-fu-ding-qi-zhi-fu-gai-yao"></a>

定期支付是用戶可以在規定的時間内使用服務，根據支付周期定期更新支付。

一般在使用音樂、電影或游戲時，都會使用定期支付服務。

開發者為了提供多種服務，可以在一個應用軟件中配置多種定期支付商品，用戶可以使用多種定期支付。

此外，為了確保新用戶，可以以折扣價提供定期支付或提供免費體驗的時間。

同樣，也可以轉換商品，讓現有用戶可以變更正在使用的定期支付商品。

## **處理定期支付** <a href="#id-ying-yong-ding-qi-zhi-fu-chu-li-ding-qi-zhi-fu" id="id-ying-yong-ding-qi-zhi-fu-chu-li-ding-qi-zhi-fu"></a>

用户購買定期支付商品後,在使用商品期間可能進行多種狀態變更。

應用軟件要確認定期支付的狀態，應對各狀態的變更。

可以使用ONE store In-App支付library的PurchaseClient.queryPurchasesAsync() 或伺服器API getSubscriptionDetail來確認定期支付狀況。

<table data-header-hidden><thead><tr><th></th><th width="164"></th><th width="116"></th><th width="127"></th><th width="118"></th><th></th></tr></thead><tbody><tr><td> </td><td><strong>PurchaseClient.queryPurchasesAsync()</strong></td><td></td><td><strong>getSubscriptionDetail</strong></td><td></td><td></td></tr><tr><td>狀態</td><td>是否返回 </td><td>recurringState</td><td>是否返回</td><td>expiryTimeMillis</td><td>autoRenewing</td></tr><tr><td>訂閱中</td><td>是</td><td>0</td><td>是</td><td>今後日程</td><td>true</td></tr><tr><td>解除</td><td>是</td><td>1</td><td>是</td><td>今後日程</td><td>false</td></tr><tr><td>延期</td><td>是</td><td>0</td><td>是</td><td>今後日程(延期结束)</td><td>true</td></tr><tr><td>保留</td><td>否</td><td>0</td><td>是</td><td>结束(預計到期時間结束或延期结束(如果有的话))</td><td>true</td></tr><tr><td>暫停</td><td>否</td><td>0</td><td>是</td><td>已结束</td><td>true</td></tr><tr><td>到期</td><td>否</td><td>1</td><td>是</td><td>已结束</td><td>false</td></tr></tbody></table>

定期支付狀態變更後，將發回SubscriptionNotification。相關内容請參閱`使用`PNS(Push Notification Service)。

### 購買定期支付 <a href="#id-ying-yong-ding-qi-zhi-fu-gou-mai-ding-qi-zhi-fu" id="id-ying-yong-ding-qi-zhi-fu-gou-mai-ding-qi-zhi-fu"></a>

用戶購買定期支付後，PurchaseClient.queryPurchasesAsync()返回定期支付结果， 並發送SUBSCRIPTION\_PURCHASED的SubscriptionNotification。&#x20;

接到該通知後,必須查詢ONE store In-App支付API更新定期支付的狀態。定期支付資源請参考以下示例。 &#x20;

```json
{
+    "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
}
```

### 更新定期支付 <a href="#id-ying-yong-ding-qi-zhi-fu-geng-xin-ding-qi-zhi-fu" id="id-ying-yong-ding-qi-zhi-fu-geng-xin-ding-qi-zhi-fu"></a>

定期支付更新后，會發送SUBSCRIPTION\_RENEWED通知。&#x20;

接到該通知後，必須查詢ONE store In-App支付API，將定期支付狀態更新到新的到期日。定期支付資源請參考以下示例。&#x20;

<pre class="language-json"><code class="lang-json">{
+  "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,
<strong>+  "expiryTimeMillis": 1658501999000,
</strong>   "autoResumeTimeMillis": null,
   "cancelledTimeMillis": null,
   "cancelReason": null,
   "promotionPrice": null,
   "priceChange": null
}
</code></pre>

{% hint style="info" %}
每月支付的商品，下一個月的同一天為支付日（3個月/6個月支付的商品同理）。

例如，如果1月15日開始定期支付，下一個支付日是2月15日。

但，如果沒有相同的日期，當月的最後一天就是支付更新日。

例如，1月31日開始定期支付，下一個支付日是2月28日（或29日），再下一個支付日是3月28日（或29日）。
{% endhint %}

### 定期支付到期 <a href="#id-ying-yong-ding-qi-zhi-fu-zhi-fu-dao-qi-dao-qi" id="id-ying-yong-ding-qi-zhi-fu-zhi-fu-dao-qi-dao-qi"></a>

定期支付到期後，PurchaseClient.queryPurchasesAsync()將不再返回，用戶將無法使用定期支付。&#x20;

SUBSCRIPTION\_EXPIRED的SubscriptionNotification也將在定期支付到期時發送&#x20;

接到该通知後，必須查詢ONE store In-App支付API，更新定期支付狀態。定期支付資源請參考以下示例。

```json
{    
     "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
}
```

### 解除定期支付 <a href="#id-ying-yong-ding-qi-zhi-fu-jie-chu-ding-qi-zhi-fu" id="id-ying-yong-ding-qi-zhi-fu-jie-chu-ding-qi-zhi-fu"></a>

用户可以在ONE store應用軟件中直接解除定期支付,如果在支付手段出現問題時不解决，則會被自動解除定期支付。 &#x20;

也可以使用ONE store In-App支付API cancelRecurringPruchase解除定期支付。&#x20;

即使用戶直接解除定期支付,也可在目前定期支付期限结束之前使用服務。 &#x20;

如果已經解除定期支付但尚未到期時，PurchaseClient.queryPurchasesAsync()將被返回。定期支付解除後，將發送SUBSCRIPTION\_CANCELED通知。

接到該通知後，必須查詢ONE store In-App支付API，更新狀態。 查詢時 autoRenewing=false和用戶可以使用的服務期限expiryTimeMillis。&#x20;

如果expiryTimeMillis期限是過去時間，服務會立即中斷。如果期限是未来，一直使用服務到相應日期。定期支付資源請參考以下示例。    &#x20;

```json
{
     "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日到期。 \[確認])\
&#x20;

### 取消定期支付 <a href="#id-ying-yong-ding-qi-zhi-fu-qu-xiao-ding-qi-zhi-fu" id="id-ying-yong-ding-qi-zhi-fu-qu-xiao-ding-qi-zhi-fu"></a>

出於多種原因，用戶可以取消定期支付。如果定期支付被取消，應立即禁止使用服務。

此時，PurchaseClient.queryPurchasesAsync()將不再返回， 還會發送SUBSCRIPTION\_EXPIRED通知。&#x20;

接到該通知後，必須查詢ONE store In-App支付API，更新定期支付狀態。

定期支付資源包括autoRenewing和定期支付使用期限expiryTimeMillis。定期支付資源請參考以下示例。

```json
{    
     "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
}
```

### 定期支付的寬限期 <a href="#id-ying-yong-ding-qi-zhi-fu-ding-qi-zhi-fu-de-kuan-xian-qi" id="id-ying-yong-ding-qi-zhi-fu-ding-qi-zhi-fu-de-kuan-xian-qi"></a>

用戶在使用定期支付時，支付手段出現了問題，如果問題得不到解决，定期支付不會立即解除。

如上所情况时，(1)延期支付 - 設定延期期限時 (2) 按帳戶保留順序變更定期支付狀態。 &#x20;

是否提供延期支付期限,可在ONE store開發者中心進行設定。 &#x20;

如果設定了延期支付期限，用戶必須在相應期間内可以使用定期支付内容。&#x20;

如果在應用軟件使用PurchaseClient.queryPurchasesAsync()来確認定期支付狀態，PurchaseClient.queryPurchasesAsync()會在到期前持續返回定期支付狀態，因此應用軟件必須自動處理延期時間。 &#x20;

用戶的定期支付狀態被延期支付時，將發送SUBSCRIPTION\_IN\_GRACE\_PERIOD通知。

接到該通知後，必須查詢ONE store In-App结算API，更新狀態。定期支付資源包括未來節點的expiryTimeMillis，以便適用autoRenewing=true和延期。

<br>

如果在延期时間内不解决支付問題，帳戶就會成为保留狀態，用戶將不能使用定期支付内容。

應用軟件中應該顯示資訊，以便用戶解决支付問題。 &#x20;

可以提供深度鏈接以幫助用戶解决支付問題。 &#x20;

用戶解决支付問題後，定期支付會立即更新。&#x20;

```json
{    
     "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
}
```

### 保留定期支付帳戶  <a href="#id-ying-yong-ding-qi-zhi-fu-bao-liu-ding-qi-zhi-fu-zhang-hu" id="id-ying-yong-ding-qi-zhi-fu-bao-liu-ding-qi-zhi-fu-zhang-hu"></a>

用戶在使用定期支付時，支付手段出現問題，如果問題得不到解决，延期期限结束後，帳戶將處於保留狀態。

帳戶保留期限最長為30天，與延期期限不同，在帳戶保留狀態下不能使用定期支付内容。

另外，帳戶保留期間， PurchaseClient.queryPurchasesAsync()不會返回定期支付。

如果用戶的定期支付處於帳戶保留狀態，將發送SUBSCRIPTION\_ON\_HOLD通知。

接到該通知後。必須調用ONE store In-App支付API，更新定期支付資訊。在帳戶保留狀態下，定期支付資源的expiryTimeMillis被設定為過去。\
&#x20; \
在保留狀態下，用戶不能使用定期支付内容，超過指定的保留期限後，定期支付將被解除。

因此，要在應用軟件中應該顯示資訊，以便用戶能更解決問題。

可以提供深度鏈結以幫助用戶解決問題。 &#x20;

用戶解決問題後恢復定期支付的話，恢復那天變更為定期支付日。

帳戶保留期结束前，如果用戶不解決問題，就會發送SUBSCRIPTION\_CANCELED通知，必須查詢ONE store In-App支付API，更新定期支付狀態。

```json
{
     "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
}
```

### 暫停定期支付 <a href="#id-ying-yong-ding-qi-zhi-fu-zan-ting-ding-qi-zhi-fu" id="id-ying-yong-ding-qi-zhi-fu-zan-ting-ding-qi-zhi-fu"></a>

開發者可以在ONE store開發者中心設置暫停功能。&#x20;

如果設置暫停功能，用戶可以在一定時間内暫停定期支付，而不是取消訂閱應用軟件。&#x20;

暫停是在目前定期支付中的商品到期後開始。用戶在暫停期間不能使用定期支付内容。&#x20;

暫停期間结束後，將重新開始定期支付。 <br>

用戶也可以在暫停期结束前直接解除暫停，重新開始定期支付。在這種情况下，解除暫停重新開始定期支付的日期成為定期支付日。&#x20;

暫停時，PurchaseClient.queryPurchasesAsync()不被返回。恢復定期支付後，PurchaseClient.queryPurchasesAsync()被返回。  <br>

如果用戶選擇暫停，將會發送SUBSCRIPTION\_PAUSE\_SCHEDULE\_CHANGED的SubscriptionNotification。  &#x20;

此時用戶還留有定期支付的時間，因此必須能夠繼續使用定期支付的内容。&#x20;

定期支付資源包括autoRenewing=true， paymentState=1和未來的expiryTimeMillis， autoResumeTimeMillis值。&#x20;

```json
{    
     "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。 &#x20;

如果開始暫停，定期支付使用期限就到期，因此不能再使用定期支付内容。&#x20;

定期支付資源包括autoRenewing=true， paymentState=0和過去的expiryTimeMillis， autoResumeTimeMillis值。  <br>

暫停期结束後，如果定期支付自動恢復或用戶解除暫停並恢復定期支付，將發送SUBSCRIPTION\_RENEWED 인 SubscriptionNotification。 &#x20;

此時需進行與"鏈接 - 定期支付更新"相同的處理。&#x20;

恢復定期支付時，如果结算出現問題，就會發生定期支付帳戶保留狀態，應進行與定期支付帳戶保留狀態相同的處理。

```json
{    
     "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
}
```

### 商品變更（升级和降级） <a href="#id-ying-yong-ding-qi-zhi-fu-shang-pin-bian-geng-sheng-ji-he-jiang-ji" id="id-ying-yong-ding-qi-zhi-fu-shang-pin-bian-geng-sheng-ji-he-jiang-ji"></a>

如果用戶將定期支付中的商品變更為其他定期支付商品，現有的定期支付將無效，新的定期支付將與新的購買token一起生成。&#x20;

另外，定期支付資源中還包括表示現有定期支付的linkedPurchaseToken。&#x20;

使用"inkedPurchaseToken可以查詢以前的定期支付，將新的定期支付與同一帳戶進行連接。&#x20;

已經創建了新的定期支付，需對該支付進行"鏈接 - 購買確認"。定期支付資源請參考以下示例。&#x20;

<pre class="language-json"><code class="lang-json">{
    "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,
<strong>    "priceChange": null
</strong>}
</code></pre>

## **打**開**定期支付的管理界面** <a href="#id-ying-yong-ding-qi-zhi-fu-da-kai-ding-qi-zhi-fu-de-guan-li-jie-mian" id="id-ying-yong-ding-qi-zhi-fu-da-kai-ding-qi-zhi-fu-de-guan-li-jie-mian"></a>

ONE store為用戶提供定期支付管理選單，以便管理定期支付商品。 &#x20;

如果將*PurchaseData*作為參數放入*SubscriptionsParams*中，則確認購買數據，並運行相應定期支付商品的管理界面。 *SubscriptionParams*輸入null時，將運行用戶的定期支付列表界面。&#x20;

以下是顯示定期支付管理界面的示例。&#x20;

{% tabs %}
{% tab title="Kotlin" %}

```kotlin
fun launchManageSubscription(@Nullable purchaseData: PurchaseData) {
    .val subscriptionParams = when (purchaseData != null) {
true -> SubscriptionParams.newBuilder()
.setPurchaseData(purchaseData)
.build()
else -> null
}
purchaseClient.launchManageSubscription(mActivity, subscriptionParams)
}
```

{% endtab %}

{% tab title="Java" %}

```java
public void launchManageSubscription(@Nullable PurchaseData purchaseData) {
SubscriptionParams subscriptionParams = null;
if (purchaseData != null) {
       subscriptionParams = SubscriptionParams.newBuilder()
.setPurchaseData(purchaseData)
.build();
}
purchaseClient.launchManageSubscription(mActivity, subscriptionParams);
}
```

{% endtab %}
{% endtabs %}

<table data-header-hidden><thead><tr><th></th><th width="282.3333333333333"></th><th></th></tr></thead><tbody><tr><td>規格<strong>Uri</strong></td><td><a href="onestore://common/subscription/payment/{caller_package}?purchase_token={purchase_token">onestore://common/subscription/payment/{caller_package}?purchase_token={purchase_token</a>}</td><td></td></tr><tr><td>規格 <strong>parameter</strong></td><td><strong>caller_package</strong><br><strong>(mandatory)</strong></td><td>調用聯動規格的應用軟件的packageName</td></tr><tr><td><strong>purchase_token</strong><br><strong>(optional)</strong></td><td>進入特定購買詳細資訊内容的購買Token</td><td></td></tr><tr><td><strong>詳細資訊</strong></td><td>· 移動到我的主页>定期支付業面列表界面<br>· 如果存在purchase_token，將移動到相關購買token的定期支付詳細資訊。</td><td></td></tr><tr><td><strong>支持版本</strong></td><td>ONE store Client v7.9.0 이상 ( android:versionName="7.9.0" android:versionCode="70900" )<br>ONE store Service v7.140 以上</td><td></td></tr></tbody></table>

## 變**更定期支付商品**

用戶可能想在定期支付中改變計畫，購買更好或更便宜的定期支付商品。&#x20;

用戶可以通過支付其他定期支付商品來變更定期支付商品，開發者可以設定比例分配模式來處理定期支付商品的變更。&#x20;

可設定的比例分配模式(PurchaseFlowParams.ProrationMode)如下。 &#x20;

| **比例分配模式**                              | 說**明**                                                              |
| --------------------------------------- | ------------------------------------------------------------------- |
| IMMEDIATE\_WITH\_TIME\_PRORATION        | 定期支付的變更將立即進行，以價格差異為基礎調整定期支付更新日。                                     |
| IMMEDIATE\_AND\_CHARGE\_PRORATED\_PRICE | <p>定期支付的變更將立即進行，定期支付更新日保持一致。根據剩餘時間的價格差異來支付費用。<br>（該模式僅在商品升级時適用）</p> |
| IMMEDIATE\_WITHOUT\_PRORATION           | 定期支付的變更將立即進行，下一個支付日使用新的價格。定期支付更新日保持一致。                              |
| DEFERRED                                | 現有定期更新商品到期後將被更換，並被要求支付新的定期支付商品費用。                                   |

### **比例分配示例** <a href="#id-ying-yong-ding-qi-zhi-fu-bi-li-fen-pei-shi-li" id="id-ying-yong-ding-qi-zhi-fu-bi-li-fen-pei-shi-li"></a>

用戶現在每月定期支付商品A。該定期支付需要支付2000韓元，每月1日更新。&#x20;

4月15日，用戶決定將商品變更為年定期支付商品B，費用為每年36,000韓元。 \
&#x20;\
**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韓元。\
&#x20;\
**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韓元。\
&#x20;\
**IMMEDIATE\_WITHOUT\_PRORATION**

定期支付商品A立即變更為定期支付商品B，不需要追加費用。5月1日，新定期支付商品B的費用是36,000韓元，從第二年開始每年5月1日支付費用是36,000韓元。\
&#x20;\
**DEFERRED**

定期支付商品A將持續到4月30日到期為止。5月1日適用定期支付商品B，作為新的定期支付費用，用戶需支付36,000韓元。 <br>

定期支付可以使用與"請求購買"相同的API為用戶提供商品變更功能。但是，為了變更定期支付的商品，必須具備現有的定期支付購買token和比例分配模式值。&#x20;

如下列例子，需要提供關於定期支付和變更後適用的定期支付及比例分配模式的相關資訊。&#x20;

{% tabs %}
{% tab title="Kotlin" %}

```kotlin
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)
```

{% endtab %}

{% tab title="Java" %}

```java
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);
```

{% endtab %}
{% endtabs %}

對於立即進行變更的比例分配模式，由於執行"請求購買"邏輯，所以回應由PurchasesUpdatedListener接收。此外，還可以在"查詢購買订單"中得到回應。&#x20;

必須使用PurchaseClient.acknowledgeAsync()或acknowledgePurchase進行"確認購買"處理。&#x20;

ONE store的In-App支付API從定期支付資源中返回linkedPurchaseToken。linkedPurchaseToken應該無效化，以避免以前的tokne被用於獲得内容使用權限。 <br>

對於變更延遲的比例分配模式，接收定期支付的購買及變更與否的同時接收PurchasesUpdatedListener調用。 &#x20;

直到變更適用，PurchaseClient.queryPurchasesAsync()繼續返回現有定期支付商品的購買資訊。&#x20;

變更適用後，PurchaseClient.queryPurchasesAsync()會返回新定期支付商品的購買資訊，發送SUBSCRIPTION\_RENEWED的Subscription Notification。&#x20;

如果發生變更延遲，最好接收此通知並使用acknowledgePurchase進行購買確認處理。.  \
&#x20;

### 變更為有促銷活動的商品 <a href="#id-ying-yong-ding-qi-zhi-fu-bian-geng-wei-you-cu-xiao-huo-dong-de-shang-pin" id="id-ying-yong-ding-qi-zhi-fu-bian-geng-wei-you-cu-xiao-huo-dong-de-shang-pin"></a>

ONE store在使用促銷活動的定期支付商品時，不能變更為其他商品。&#x20;

但是，成為變更對象的商品即使適用促銷活動，也可以進行變更。&#x20;

如果顧客想繼續使用變更對象的商品促銷活動，必須應用IMMEDIATE\_WITH\_TIME\_PRORATION模式。&#x20;

除此之外的其他比例分配模式的情况是，即使變更對象商品適用促銷活動，也不能使用促銷活動。 \
&#x20;

## **推**遲**定期支付期限** <a href="#id-ying-yong-ding-qi-zhi-fu-tui-chi-ding-qi-zhi-fu-qi-xian" id="id-ying-yong-ding-qi-zhi-fu-tui-chi-ding-qi-zhi-fu-qi-xian"></a>

使用ONE store In-App支付API的deferSubscription，可以推遲定期支付用戶的下一個支付日。&#x20;

推遲期間，用戶可以對内容進行access。&#x20;

定期支付期限的延期可以在以下情况下使用。&#x20;

* 通過特別活動，使現有用戶在一周内額外使用定期支付。&#x20;
* 由於系统故障等原因，可以给顧客追加使用期限。&#x20;

每個API調用可以將支付期限從最少一天推遲到最多一年。如果要再次延期支付，只需在期限内再次調用API。 <br>

延期支付時，可以在電子郵件或應用軟件内發送通知，告知支付日期變更。  \
&#x20;

## **更改定期支付**價格 <a href="#id-ying-yong-ding-qi-zhi-fu-geng-gai-ding-qi-zhi-fu-jia-ge" id="id-ying-yong-ding-qi-zhi-fu-geng-gai-ding-qi-zhi-fu-jia-ge"></a>

在ONE store開發者中心可以變更定期支付商品的價格。&#x20;

定期支付商品的基本價格變更後，新的購買會立即反映變更的價格。&#x20;

但是，對於現在使用定期支付的顧客，7天後會收到變更價格的通知，之後30天會被提供價格變更同意期間。&#x20;

{% hint style="info" %}
但是即將變更為Deferred模式的訂閱商品出現價格變動時在商品模式變更後開始價格變動同意流向。
{% endhint %}

如果在期限内不同意變更價格，該定期支付將在下一個定期支付日取消。&#x20;

(如果價格下降或维持不變，無需另行通知或同意，7日後在下一個更新日以變更價格支付。) \
&#x20;

### 同意變更價格時 <a href="#id-ying-yong-ding-qi-zhi-fu-tong-yi-bian-geng-jia-ge-shi" id="id-ying-yong-ding-qi-zhi-fu-tong-yi-bian-geng-jia-ge-shi"></a>

用戶同意提高訂閱費用或降低價格時，在同意期限後以變更的價格支付。&#x20;

另外，將發送SUBSCRIPTION\_PRICE\_CHANGE\_CONFIRMED的Subscription Notification。  \
&#x20;

### 不同意變更價格時 <a href="#id-ying-yong-ding-qi-zhi-fu-bu-tong-yi-bian-geng-jia-ge-shi" id="id-ying-yong-ding-qi-zhi-fu-bu-tong-yi-bian-geng-jia-ge-shi"></a>

如果用戶不同意提高訂閱費用，定期支付將自動取消，並發送SUBSCRIPTION\_REVOKED的Subscription Notification。\
&#x20;

### 因失誤變更價格時 <a href="#id-ying-yong-ding-qi-zhi-fu-yin-shi-wu-bian-geng-jia-ge-shi" id="id-ying-yong-ding-qi-zhi-fu-yin-shi-wu-bian-geng-jia-ge-shi"></a>

如果因失誤變更了定期支付價格，最好重新返回價格。&#x20;

如果在7天内恢復價格，則不會對現有定期支付用戶造成影響。&#x20;

但是，在這種情况下，新購買的顧客也會以變更的價格支付，因此價格變更要慎重。 \
&#x20;

### 發生兩次價格變更時    <a href="#id-ying-yong-ding-qi-zhi-fu-fa-sheng-liang-ci-jia-ge-bian-geng-shi" id="id-ying-yong-ding-qi-zhi-fu-fa-sheng-liang-ci-jia-ge-bian-geng-shi"></a>

如果第一次價格變更後的第二次價格變更是在7天以内，那麼第一次價格變更將無效，只適用第二次價格變更。&#x20;

但，如果第二次價格變更是在7天以後，用戶必須同意兩次價格變更。&#x20;

對價格變更的同意程序會给用戶帶來不便，维持相應定期支付商品的顧客很有可能會减少。&#x20;

再次强調，價格變更要慎重。&#x20;


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://onestore-dev.gitbook.io/dev/cht/tools/billing/v21/subs.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
