Bán gói thuê bao

Chủ đề này mô tả cách xử lý các sự kiện trong vòng đời của gói thuê bao, chẳng hạn như các lần gia hạn và hết hạn. Chủ đề này cũng mô tả các tính năng bổ sung của gói thuê bao, chẳng hạn như cung cấp các chương trình khuyến mãi và cho phép người dùng tự quản lý các gói thuê bao của mình.

Trước khi đọc chủ đề này, hãy nhớ đọc phần Tích hợp Thư viện Google Play Billing vào ứng dụng để biết các hướng dẫn chung về cách bán và quản lý các sản phẩm trong ứng dụng của bạn.

Nếu bạn chưa định cấu hình các sản phẩm thuê bao cho ứng dụng thì hãy xem phần Tạo và định cấu hình sản phẩm.

Tổng quan về gói thuê bao

Gói thuê bao là những lợi ích mà người dùng được quyền truy cập trong một khoảng thời gian nhất định. Ví dụ: một gói thuê bao có thể cấp quyền cho người dùng truy cập vào dịch vụ phát nhạc trực tuyến.

Bạn có thể sở hữu nhiều gói thuê bao cho cùng một ứng dụng, để thể hiện cho các lợi ích hoàn toàn khác nhau hoặc các cấp độ khác nhau của một nhóm lợi ích (ví dụ: cấp Bạc" và cấp "Vàng").

Thông qua các gói cơ bảnưu đãi, bạn có thể tạo nhiều cấu hình cho cùng một sản phẩm thuê bao. Ví dụ: bạn có thể tạo ưu đãi cho những người dùng mới chưa bao giờ đăng ký ứng dụng của bạn. Tương tự, bạn cũng có thể tạo ưu đãi nâng cấp cho những người dùng đã đăng ký.

Để biết thông tin tổng quan chi tiết về các sản phẩm thuê bao, như gói cơ bản và ưu đãi, vui lòng xem nội dung tài liệu Trung tâm trợ giúp của Play Console.

Xử lý chu kỳ đăng ký của gói thuê bao

Một gói thuê bao có thể trải qua nhiều thay đổi về trạng thái trong suốt vòng đời của mình và ứng dụng của bạn cần phản hồi với mỗi thay đổi. Để kiểm tra trạng thái của thuê bao, ứng dụng của bạn có thể truy vấn bằng cách sử dụng BillingClient.queryPurchasesAsync() trong Thư viện Google Play Billing hoặc Purchases.subscriptionsv2:get trong API Nhà phát triển Google Play.

BillingClient.queryPurchasesAsync() Purchases.subscriptionsv2:get
Trạng thái Có được trả về? isAutoRenewing Có được trả về? thời gian hết hạn trạng thái gói thuê bao tự động gia hạn
Đang hoạt động Đúng Tương lai SUBSCRIPTION_STATE_ACTIVE Đúng
Bị hủy Sai Tương lai SUBSCRIPTION_STATE_CANCELED Sai
Trong thời gian gia hạn Đúng Tương lai (kết thúc thời gian gia hạn) SUBSCRIPTION_STATE_IN_GRACE_PERIOD Đúng
Đang chờ Không Không có Trong quá khứ (kết thúc thời gian hết hạn dự kiến hoặc kết thúc thời gian gia hạn, nếu có) SUBSCRIPTION_STATE_ON_HOLD Đúng
Đã tạm dừng Không Không có Đã ngừng cung cấp SUBSCRIPTION_STATE_PAUSED Đúng
Đã hết hạn Không Không có Đã ngừng cung cấp SUBSCRIPTION_STATE_EXPIRED Sai

Nếu ứng dụng của bạn lưu trữ trạng thái gói thuê bao trên một máy chủ phụ trợ bảo mật, thì bạn nên theo dõi quá trình thay đổi trạng thái bằng cách sử dụng Thông báo theo thời gian thực dành cho nhà phát triển để đảm bảo trạng thái được đồng bộ hoá. Hệ thống sẽ gửi SubscriptionNotification đối với các sự kiện ảnh hưởng đến trạng thái gói thuê bao, chẳng hạn như các lần gia hạn và huỷ.

Ứng dụng của bạn cần xử lý các thay đổi về trạng thái được mô tả trong các phần sau.

Gói thuê bao mới

Hãy nhớ làm theo các đề xuất của chúng tôi để xử lý các giao dịch mua mới. Khi người dùng mua một gói thuê bao, hệ thống sẽ trả gói thuê bao về bằng BillingClient.queryPurchasesAsync() và sẽ gửi một SubscriptionNotification với loại thông báo SUBSCRIPTION_PURCHASED. Khi nhận được thông báo này, bạn nên truy vấn API Nhà phát triển Google Play để nhận trạng thái gói thuê bao mới nhất. Tài nguyên gói thuê bao tương tự như ví dụ sau: Lưu ý tài nguyên này sẽ có acknowledgementStateACKNOWLEDGEMENT_STATE_PENDING cho đến khi bạn xác nhận giao dịch mua:

{
  "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
      }
    }
  ],
}

Gia hạn

Nếu bạn gia hạn thành công một gói thuê bao, thì gói thuê bao đó sẽ tiếp tục được BillingClient.queryPurchasesAsync() trả về.

Hệ thống cũng sẽ gửi một thông báo SUBSCRIPTION_RENEWED khi người dùng gia hạn gói thuê bao. Ứng dụng của bạn phải đảm bảo rằng người dùng vẫn có quyền sử dụng gói thuê bao, sau đó cập nhật trạng thái gói thuê bao bằng expiryTime mới được cung cấp trong tài nguyên của gói thuê bao được trả về từ API Nhà phát triển Google Play. Tài nguyên của gói thuê bao trông giống như sau:

{
  "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
      }
    }
  ]
}

Hết hạn

Khi một gói thuê bao hết hạn, gói thuê bao đó sẽ không còn được trả về trong BillingClient.queryPurchasesAsync() và người dùng sẽ mất quyền truy cập vào gói thuê bao đó.

Hệ thống cũng gửi một SubscriptionNotification với loại SUBSCRIPTION_EXPIRED khi gói thuê bao hết hạn. Khi nhận được thông báo này, bạn nên truy vấn API nhà phát triển Google Play để nhận trạng thái gói thuê bao mới nhất. Tài nguyên gói thuê bao trông giống như sau:

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_EXPIRED",
  ...
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": expiration_time_in_past,
      ...
    }
  ],
}

Huỷ

Người dùng có thể tự nguyện huỷ gói thuê bao trong Cửa hàng Play hoặc hệ thống sẽ tự động huỷ gói thuê bao nếu họ không khôi phục sau khi bị tạm ngưng tài khoản. Khi người dùng huỷ một gói thuê bao, họ sẽ vẫn có quyền truy cập vào nội dung đó cho đến khi kết thúc chu kỳ thanh toán hiện tại. Khi chu kỳ thanh toán kết thúc, quyền truy cập sẽ bị thu hồi.

Khi bị huỷ nhưng chưa hết hạn, thì gói thuê bao sẽ được trả về từ BillingClient.queryPurchasesAsync(). Thao tác huỷ gói thuê bao sẽ kích hoạt thông báo SUBSCRIPTION_CANCELED. Khi bạn nhận được thông báo này, tài nguyên gói thuê bao mà hệ thống trả về từ API Nhà phát triển Google Play sẽ chứa autoRenewing = falseexpiryTime chứa ngày mà người dùng sẽ mất quyền truy cập vào gói thuê bao. Nếu expiryTime là thời gian trong quá khứ, thì người dùng sẽ mất quyền truy cập ngay lập tức. Nếu không thì người dùng sẽ được giữ lại quyền cho đến khi quyền truy cập hết hạn. Tài nguyên gói thuê bao trông giống như sau:

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_CANCELED",
  ...
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": expiration_time,
      ...
    }
  ],
}

Ứng dụng của bạn có thể xem trường cancelReason trong tài nguyên gói thuê bao mà hệ thống trả về từ API nhà phát triển Google Play để tìm hiểu lý do gói thuê bao bị huỷ (ví dụ: khách hàng đã huỷ hoặc gặp vấn đề về thanh toán). Nếu người dùng đã huỷ gói thuê bao, thì bạn có thể xem trường cancelSurveyResult để tìm hiểu lý do người dùng huỷ gói thuê bao.

Ứng dụng của bạn có thể muốn hiển thị thông báo trong ứng dụng để thông báo cho người dùng rằng gói thuê bao của họ đã bị huỷ, chẳng hạn như "Gói thuê bao của bạn sẽ hết hạn vào _ngày nào đó". Ứng dụng của bạn cũng có thể liên kết sâu đến Cửa hàng Google Play để cho phép người dùng khôi phục gói thuê bao.

Nếu hiển thị thông báo này, thì bạn cũng nên đưa ra lựa chọn cho phép người dùng loại bỏ vĩnh viễn thông báo.

Ngoài ra, xin lưu ý rằng các thông báo về việc huỷ gia hạn có thể gây phiền toái cho người dùng, đặc biệt là những người dùng đã huỷ gói thuê bao theo cách thủ công chứ không phải gói thuê bao bị huỷ do quá trình thanh toán của họ đã hết hạn. Bạn có thể lựa chọn không thông báo cho những người dùng đã huỷ gói thuê bao theo cách thủ công.

Thu hồi

Ứng dụng của bạn có thể thu hồi gói thuê bao của người dùng vì nhiều lý do, kể cả việc thu hồi gói thuê bao bằng cách sử dụng Purchases.subscriptions:revoke hoặc việc hệ thống hoàn trả phí cho giao dịch mua. Trong trường hợp này, ứng dụng của bạn sẽ thu hồi quyền của người dùng ngay lập tức. Gói thuê bao đã thu hồi sẽ không còn được trả về từ BillingClient.queryPurchasesAsync(). Khi việc thu hồi xảy ra, hệ thống cũng sẽ gửi một SubscriptionNotification với loại SUBSCRIPTION_REVOKED. Khi bạn nhận được thông báo này, tài nguyên gói thuê bao mà hệ thống trả về từ API Nhà phát triển Google Play sẽ chứa autoRenewing = falseexpiryTime chứa ngày mà người dùng sẽ mất quyền truy cập vào gói thuê bao. Tài nguyên gói thuê bao trông giống như sau:

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
  ...
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": expiration_time,
      ...
    }
  ],
}

Tạm ngưng tài khoản

Tạm ngưng tài khoản là một trạng thái của gói thuê bao. Trạng thái này sẽ bắt đầu khi phương thức thanh toán của người dùng không thành công và mọi thời gian gia hạn được liên kết đã kết thúc mà không có giải pháp thanh toán nào. Khi một gói thuê bao chuyển sang trạng thái tạm ngưng tài khoản, bạn phải chặn quyền truy cập của người dùng vào nội dung hoặc dịch vụ. Thời gian tạm ngưng tài khoản sẽ kéo dài tối đa 30 ngày.

Trong thời gian tạm ngưng tài khoản, BillingClient.queryPurchasesAsync() sẽ không trả về gói thuê bao.

Trong thời gian tạm ngưng tài khoản, bạn nên xử lý mọi yêu cầu huỷ, yêu cầu khôi phục hoặc yêu cầu mua lại gói thuê bao nếu cần.

Khi một người dùng bị tạm ngưng tài khoản, bạn nên tận dụng thông báo theo thời gian thực dành cho nhà phát triển để cho người dùng biết lý do tạm ngưng quyền truy cập vào gói thuê bao. Trong ứng dụng của mình, bạn nên có thông báo hướng dẫn cách khắc phục phương thức thanh toán và lấy lại quyền truy cập vào gói thuê bao. Tin nhắn của bạn phải bao gồm đường liên kết đến phần cài đặt gói thuê bao trên Google Play để người dùng có thể khắc phục phương thức thanh toán của mình. Ví dụ: Bạn có thể sử dụng một thông báo tương tự như sau:

"There is a problem with your subscription. Click here to go to the
Google Play subscription settings to fix your payment method."

Nếu người dùng có thể truy cập vào nội dung gói thuê bao bên ngoài ứng dụng của bạn, thì bạn nên gửi một thông báo đẩy hoặc email cho người dùng để họ biết rằng gói thuê bao của họ không còn hoạt động nữa.

Nếu khách hàng đã khắc phục sự cố thanh toán thì bạn có thể hiển thị một thông báo trong ứng dụng để thông báo cho người dùng khi gói thuê bao được khôi phục. Chẳng hạn, bạn có thể sử dụng một thông báo tương tự như sau:

"Your form of payment was updated, and your subscription has
been recovered."

Trong Thông báo theo thời gian thực dành cho nhà phát triển, bạn sẽ nhận được một SubscriptionNotification với loại SUBSCRIPTION_ON_HOLD khi gói thuê bao bước vào trạng thái tạm ngưng tài khoản. Hãy gọi API nhà phát triển Google Play từ máy chủ phụ trợ bảo mật của bạn để truy xuất thông tin gói thuê bao mới. Trong thời gian tạm ngưng tài khoản, expiryTime của tài nguyên gói thuê bao được đặt thành dấu thời gian trước đây:

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_ON_HOLD",
  ...
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": timestamp_in_past,
      ...
    }
  ],
}

Sau khi người dùng khắc phục phương thức thanh toán, gói thuê bao sẽ quay về trạng thái hoạt động và sau đó bạn phải khôi phục quyền truy cập vào nội dung đã thuê bao.

Nếu ứng dụng của bạn chỉ dựa vào queryPurchasesAsync() để xác định xem người dùng có quyền truy cập gói thuê bao hay không, thì ứng dụng sẽ tự động xử lý việc khôi phục gói thuê bao sau khi tạm ngưng tài khoản.

Nếu ứng dụng của bạn đồng bộ hoá trạng thái gói thuê bao với một máy chủ, thì bạn nên theo dõi SubscriptionNotification với loại SUBSCRIPTION_RECOVERED để nhận được thông báo khi gói thuê bao được khôi phục và người dùng sẽ lấy lại quyền truy cập. Nếu bạn truy vấn một gói thuê bao sau khi nhận được thông báo này, thì hệ thống sẽ thiết lập expiryTime thành một dấu thời gian trong tương lai:

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
  ...
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": next_renewal_date,
      ...
    }
  ],
}

Nếu người dùng không khắc phục phương thức thanh toán trước khi kết thúc thời gian tạm ngưng tài khoản, thì bạn sẽ nhận được thông báo theo thời gian thực dành cho nhà phát triển SUBSCRIPTION_CANCELED. Để biết hướng dẫn về cách xử lý một yêu cầu huỷ, hãy xem phần yêu cầu huỷ gói thuê bao. Khi bạn truy vấn gói thuê bao đã bị huỷ theo cách này, hệ thống sẽ thiết lập expiryTime được trả về thành một dấu thời gian trong quá khứ:

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_CANCELED",
  ...
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": timestamp_in_past,
      ...
    }
  ],
}

Thời gian gia hạn

Nếu thời gian gia hạn được bật, thì các gói thuê bao sẽ chuyển sang thời gian gia hạn nếu có vấn đề về thanh toán khi kết thúc chu kỳ thanh toán. Trong thời gian này, người dùng vẫn sẽ có quyền truy cập vào gói thuê bao, trong khi Google Play thì cố gắng gia hạn gói thuê bao. Bạn có thể chỉ định độ dài thời gian gia hạn trong phần cài đặt sản phẩm trong ứng dụng trên Google Play Console.

Nếu ứng dụng của bạn chỉ dựa vào queryPurchasesAsync() để kiểm tra xem người dùng có quyền truy cập gói thuê bao hay không, thì ứng dụng sẽ tự động xử lý thời gian gia hạn, vì queryPurchasesAsync() tiếp tục trả về các giao dịch mua đã huỷ trước ngày hết hạn.

Nếu ứng dụng của bạn đồng bộ hoá trạng thái gói thuê bao với một phần phụ trợ, thì bạn nên theo dõi SubscriptionNotification với loại SUBSCRIPTION_IN_GRACE_PERIOD để nhận được thông báo khi người dùng chuyển sang thời gian gia hạn. Khi người dùng đang trong thời gian gia hạn, tài nguyên gói thuê bao sẽ chứa autoRenewEnabled = true.

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_IN_GRACE_PERIOD",
  ...
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": timestamp_in_future,
      "autoRenewingPlan": {
        "autoRenewEnabled": true
      }
    }
  ],
}

Khi người dùng chuyển sang thời gian gia hạn, bạn nên hiển thị thông báo trong ứng dụng để hướng dẫn người dùng cách khắc phục phương thức thanh toán. Nếu không thì người dùng sẽ mất quyền truy cập vào gói thuê bao khi thời gian gia hạn kết thúc. Thông báo này có thể liên kết sâu đến Cửa hàng Google Play để giúp người dùng quản lý gói thuê bao.

Ngay sau khi người dùng khắc phục phương thức thanh toán, gói thuê bao sẽ gia hạn và ứng dụng có thể xử lý quá trình gia hạn như mô tả trong phần gia hạn.

Nếu người dùng không khắc phục phương thức thanh toán trong thời gian gia hạn, thì gói thuê bao sẽ chuyển sang trạng thái tạm ngưng tài khoản.

Gói thuê bao bị tạm dừng

Bạn có thể ngăn tình trạng người dùng tự rời bỏ ứng dụng bằng cách cho phép người dùng tạm dừng gói thuê bao. Khi bạn bật tính năng tạm dừng, người dùng có thể chọn tạm dừng gói thuê bao của họ trong khoảng thời gian từ một tuần đến 3 tháng, tuỳ thuộc vào khoảng thời gian định kỳ. Sau khi bật, lựa chọn tạm dừng sẽ xuất hiện cả ở trung tâm thuê bao và trong quy trình huỷ. Xin lưu ý rằng người dùng không thể tạm dừng gói thuê bao hằng năm và giới hạn tạm dừng từ một tuần đến ba tháng có thể thay đổi bất kỳ lúc nào.

Để cho phép người dùng tạm dừng gói thuê bao, hãy làm như sau:

  1. Đăng nhập vào Google Play Console.
  2. Chọn ứng dụng của bạn, sau đó chuyển đến Store presence (Sự hiện diện trong cửa hàng) > In-app products (Sản phẩm trong ứng dụng) > Subscriptions (Gói thuê bao).
  3. Mở rộng phần Subscription settings (Cài đặt thuê bao).
  4. Chọn Activate Pause (Kích hoạt chế độ tạm dừng).

Việc tạm dừng gói thuê bao chỉ có hiệu lực sau khi kết thúc kỳ thanh toán hiện tại. Trong khi gói thuê bao bị tạm dừng, người dùng sẽ không có quyền truy cập vào gói thuê bao. Khi giai đoạn tạm dừng kết thúc, gói thuê bao sẽ tiếp tục và Google sẽ thử gia hạn gói thuê bao. Nếu yêu cầu tiếp tục thành công, thì gói thuê bao sẽ hoạt động trở lại. Nếu yêu cầu tiếp tục không thành công do vấn đề thanh toán, thì người dùng sẽ chuyển sang trạng thái tạm ngưng tài khoản, như minh hoạ trong hình 1:

Một người dùng tạm dừng gói thuê bao, sau đó gói thuê bao chuyển sang trạng thái tạm ngưng tài khoản
Hình 1. Một người dùng tạm dừng gói thuê bao, sau đó gói thuê bao chuyển sang trạng thái tạm ngưng tài khoản.

Người dùng cũng có thể chọn tiếp tục gói thuê bao theo cách thủ công bất cứ lúc nào trong khoảng thời gian tạm dừng, theo minh hoạ trong hình 2. Khi người dùng tiếp tục theo cách thủ công, ngày thanh toán sẽ thay đổi thành ngày tiếp tục gói thuê bao theo cách thủ công.

Một người dùng tạm dừng rồi tiếp tục gói thuê bao
Hình 2. Một người dùng tạm dừng rồi tiếp tục gói thuê bao.

Khi hệ thống tạm dừng gói thuê bao của người dùng, queryPurchasesAsync() sẽ không trả về gói thuê bao đó. Nếu người dùng tiếp tục gói thuê bao, thì sau đó queryPurchasesAsync() sẽ trả về gói thuê bao.

Nếu ứng dụng của bạn đồng bộ hoá trạng thái gói thuê bao với một máy chủ phụ trợ bảo mật, thì bạn nên theo dõi Thông báo theo thời gian thực dành cho nhà phát triển để duy trì trạng thái. Những thông báo này cũng cho phép bạn thông báo cho người dùng trong ứng dụng của mình rằng họ đã tạm dừng gói thuê bao và không còn quyền truy cập vào gói thuê bao đó. Bạn cũng nên cung cấp cho người dùng cách để tiếp tục gói thuê bao theo cách thủ công, bằng cách sử dụng một đường liên kết sâu đến Google Play.

Hệ thống sẽ gửi một SubscriptionNotification với loại SUBSCRIPTION_PAUSE_SCHEDULE_CHANGED khi người dùng bắt đầu tạm dừng gói thuê bao. Tại thời điểm này, người dùng vẫn có quyền truy cập vào gói thuê bao, đồng thời tài nguyên gói thuê bao sẽ chứa autoRenewing = true ,paymentState = 1 (Khoản thanh toán đã nhận) cũng như các giá trị trong tương lai cho expiryTimeautoResumeTimeMillis.

Hệ thống sẽ gửi một SubscriptionNotification có loại SUBSCRIPTION_PAUSED khi yêu cầu tạm dừng có hiệu lực. Tại thời điểm này, người dùng sẽ mất quyền truy cập vào gói thuê bao, đồng thời tài nguyên cho gói thuê bao sẽ chứa autoRenewing = truepaymentState = 0 (đang chờ xử lý) cũng như một giá trị trong tương lai cho autoResumeTimeMillis và một giá trị trong quá khứ cho expiryTime.

Hệ thống sẽ gửi một SubscriptionNotification với loại SUBSCRIPTION_RENEWED nếu gói thuê bao được tiếp tục tự động vào cuối thời gian tạm dừng hoặc nếu người dùng đã chọn tiếp tục gói thuê bao theo cách thủ công. Bạn nên xử lý vấn đề này theo cách được mô tả trong phần gia hạn.

Hệ thống sẽ gửi một SubscriptionNotification với loại SUBSCRIPTION_ON_HOLD nếu việc thanh toán thất bại trong quá trình cố gắng tiếp tục gói thuê bao. Bạn nên xử lý vấn đề này theo cách mô tả trong phần trạng thái tạm ngưng tài khoản.

Khôi phục

Gói thuê bao đã huỷ vẫn tiếp tục xuất hiện trong ứng dụng Cửa hàng Play cho đến ngày hết hạn. Người dùng có thể khôi phục gói thuê bao đã huỷ trước khi gói thuê bao hết hạn bằng cách nhấp vào Resubscribe (Đăng ký lại) (trước đây là Restore (Khôi phục)) trong phần Subscriptions (Gói thuê bao) trong ứng dụng Cửa hàng Google Play.

phần gói thuê bao trong ứng dụng cửa hàng Google Play cho thấy gói thuê bao đã huỷ có nút resubscribe (đăng ký lại)
Hình 3. Phần Account (Tài khoản) > Subscriptions (Gói thuê bao) trong ứng dụng Cửa hàng Google Play cho thấy gói thuê bao đã huỷ có nút Resubscribe (Đăng ký lại).

Nếu ứng dụng của bạn chỉ dựa vào queryPurchasesAsync() để xác định xem người dùng có quyền truy cập gói thuê bao hay không, thì ứng dụng sẽ tự động xử lý các yêu cầu khôi phục vì queryPurchasesAsync() tiếp tục trả về các giao dịch mua đã huỷ trước ngày hết hạn. Một gói thuê bao đã khôi phục sẽ tiếp tục gia hạn như khi chưa bị huỷ.

Nếu ứng dụng của bạn đồng bộ hoá trạng thái gói thuê bao với một phần phụ trợ, thì bạn nên theo dõi SubscriptionNotification với loại SUBSCRIPTION_RESTARTED. Ứng dụng của bạn có thể phản hồi sau khi nhận được thông báo này, xác định rằng gói thuê bao hiện đã được thiết lập để gia hạn và ngừng hiển thị thông báo khôi phục gói thuê bao trong ứng dụng. Tài nguyên gói thuê bao trông giống như sau:

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
  ...
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": next_renewal_date
      ...
    }
  ],
}

Nâng cấp, hạ cấp và đăng ký lại

Khi người dùng nâng cấp, hạ cấp hoặc đăng ký lại ứng dụng của bạn trước khi gói thuê bao hết hạn, thì gói thuê bao cũ sẽ không còn hợp lệ và hệ thống sẽ tạo gói thuê bao mới với mã thông báo giao dịch mua mới.

Ngoài ra, tài nguyên gói thuê bao mà hệ thống trả về từ API Nhà phát triển Google Play sẽ chứa một linkedPurchaseToken cho biết giao dịch mua cũ mà người dùng đã nâng cấp hạ cấp hoặc đăng ký lại. Bạn có thể sử dụng linkedPurchaseToken để tra cứu gói thuê bao cũ và xác định tài khoản người dùng hiện có, nhờ đó bạn có thể liên kết giao dịch mua mới với cùng một tài khoản. Bạn cũng nên sử dụng API Nhà phát triển Google Play để xác nhận giao dịch mua nhằm giảm bớt phiền hà cho người dùng. Tài nguyên gói thuê bao trông giống như sau:

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
  "linkedPurchaseToken": old_purchase_token,
  ...
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": next_renewal_date,
      "autoRenewingPlan": {
        "autoRenewEnabled": true
      }
    }
  ],
}

Tích hợp gói trả trước

Gói trả trước không tự động gia hạn khi hết hạn. Để kéo dài quyền đăng ký mà không bị gián đoạn, người dùng phải nạp tiền gói trả trước cho cùng một gói đăng ký.

Đối với giao dịch nạp tiền, hãy triển khai quy trình thanh toán như cách bạn thực hiện với giao dịch mua gốc. Bạn không cần ra dấu việc mua hàng là một giao dịch nạp tiền.

Các giao dịch nạp tiền của gói trả trước luôn sử dụng chế độ chia theo tỷ lệ IMMEDIATE_AND_CHARGE_FULL_PRICE và bạn không cần phải đặt chế độ này một cách rõ ràng. Người dùng sẽ bị tính phí ngay cho kỳ thanh toán đầy đủ và quyền của họ sẽ được kéo dài theo khoảng thời gian đã chỉ định trong phần nạp tiền.

Sau khi nạp tiền, các trường sau trong đối tượng kết quả Purchase đã được cập nhật để phản ánh giao dịch mua nạp tiền gần đây nhất:

  • Id đơn đặt hàng
  • Thời gian mua hàng
  • Chữ ký
  • Mã thông báo giao dịch mua
  • Đã xác nhận

Các trường Purchase sau luôn chứa dữ liệu giống nhau trong giao dịch mua ban đầu:

  • Tên gói
  • Trạng thái mua hàng
  • Sản phẩm
  • Tự động gia hạn

Xác nhận mua hàng trả trước

Tương tự như gói thuê bao tự động gia hạn, bạn phải xác nhận các gói trả trước sau khi mua. Cả giao dịch mua ban đầu và mọi giao dịch nạp tiền đều phải được ghi nhận. Để biết thêm thông tin, hãy xem phần Xử lý giao dịch mua.

Do thời hạn gói trả trước có thể ngắn, điều quan trọng là bạn phải xác nhận giao dịch mua càng sớm càng tốt.

Gói trả trước có thời hạn một tuần trở lên phải được xác nhận trong vòng ba ngày.

Bạn phải xác nhận các gói trả trước có thời hạn ngắn hơn một tuần trong vòng một nửa thời lượng của gói. Ví dụ: nhà phát triển có 1,5 ngày để ghi nhận gói trả trước 3 ngày.

Là một nhà phát triển, bạn phải giúp khách hàng cảm thấy dễ dàng trong việc quản lý gói thuê bao. Ứng dụng của bạn phải bao gồm một đường liên kết trên màn hình cài đặt hoặc màn hình tuỳ chọn mà người dùng có thể sử dụng để quản lý gói thuê bao. Ví dụ về đường liên kết này được minh hoạ trong hình 4.

Nút Gói thuê bao trên Google Play trong hình ảnh này là một ví dụ về đường liên kết "quản lý gói thuê bao".
Hình 4. Nút Subscriptions (Gói thuê bao) trên Google Play là một ví dụ về đường liên kết "Quản lý gói thuê bao".

Trong trình xử lý lượt nhấp của đường liên kết này, hãy thêm logic để xác định liệu người dùng có bất kỳ gói thuê bao nào trong ứng dụng của bạn mà chưa hết hạn hay không. Từ logic này, hệ thống sẽ thiết lập expiryTime trong tương lai hoặc thiết lập autoRenewing thành true.

productId của mỗi gói thuê bao khớp với mã sản phẩm mà bạn chỉ định khi bạn tạo nó trong Play Console. Để xác định productId cho gói thuê bao hiện có bằng phương thức lập trình, hãy truy vấn phần phụ trợ của ứng dụng để biết danh sách các gói thuê bao liên kết với một người dùng cụ thể.

Nếu người dùng có gói thuê bao chưa hết hạn, thì bạn có thể chuyển hướng họ đến một URL tương tự như sau, thay thế "your-sub-product-id (mã-sản-phẩm-phụ)" và "your-app-package (gói-ứng-dụng)" bằng mã gói thuê bao và thông tin về gói ứng dụng:

https://play.google.com/store/account/subscriptions?sku=your-sub-product-id&package=your-app-package

Nếu người dùng không có gói thuê bao nào chưa hết hạn trong ứng dụng thì bạn có thể sử dụng URL sau để chuyển hướng người dùng đến trang mà họ sẽ thấy tất cả gói thuê bao khác, như trong hình 5 và 6:

https://play.google.com/store/account/subscriptions
Màn hình gói thuê bao trên Cửa hàng Play cho thấy trạng thái cho tất cả gói thuê bao của người dùng.
Hình 5. Màn hình gói thuê bao trên Cửa hàng Play cho thấy trạng thái cho tất cả gói thuê bao của người dùng.
Hãy nhấn vào một gói thuê bao để xem thêm thông tin chi tiết.
Hình 6. Hãy nhấn vào một gói thuê bao để xem thêm thông tin chi tiết.

Bạn có thể tìm thấy mã mẫu cho logic đường liên kết của gói thuê bao trong ứng dụng mẫu Classy Taxi.

Cho phép người dùng nâng cấp, hạ cấp hoặc thay đổi gói thuê bao

Bạn có thể cung cấp cho người dùng các lớp thuê bao khác nhau, chẳng hạn như lớp cơ sở và lớp cao cấp. Hình 7 cho thấy một màn hình có hai cấp thuê bao:

ứng dụng này có 2 cấp thuê bao
Hình 7. Ứng dụng này có 2 cấp thuê bao.

Người dùng cần có quyền truy cập vào một màn hình tương tự như hình 7 để nâng cấp hoặc hạ cấp gói thuê bao. Khi nâng cấp hoặc hạ cấp gói thuê bao, bạn có thể thiết lập chế độ chia theo tỷ lệ để xác định mức độ ảnh hưởng của thay đổi đối với người đăng ký.

Bảng sau đây liệt kê các chế độ chia theo tỷ lệ:

Chế độ chia theo tỷ lệNội dung mô tả
IMMEDIATE_WITH_TIME_PRORATION Gói thuê bao được nâng cấp hoặc hạ cấp ngay lập tức. Hệ thống sẽ điều chỉnh thời gian còn lại dựa trên mức chênh lệch giá và cấp một khoản tín dụng tương đương vào gói thuê bao mới bằng cách dời ngày thanh toán tiếp theo. Đây là hành vi mặc định.
IMMEDIATE_AND_CHARGE_PRORATED_PRICE Gói thuê bao được nâng cấp ngay lập tức, và chu kỳ thanh toán vẫn giữ nguyên. Sau đó, hệ thống sẽ tính mức chênh lệch giá cho khoảng thời gian còn lại của người dùng.
IMMEDIATE_WITHOUT_PRORATION Gói thuê bao được nâng cấp hoặc hạ cấp ngay lập tức, đồng thời hệ thống sẽ tính giá mới khi người dùng gia hạn gói thuê bao. Chu kỳ thanh toán vẫn giữ nguyên.
DEFERRED Gói thuê bao chỉ được nâng cấp hoặc hạ cấp khi người dùng gia hạn gói thuê bao.
IMMEDIATE_AND_CHARGE_FULL_PRICE Gói thuê bao được nâng cấp hoặc hạ cấp và hệ thống sẽ tính phí người dùng ở mức giá đầy đủ đối với quyền truy cập mới ngay lập tức. Hệ thống sẽ chuyển giá trị còn lại của gói thuê bao trước đó sang cùng một quyền hoặc sẽ chia thời gian theo tỷ lệ khi chuyển sang một quyền khác.

Nếu người dùng đang thay đổi quyền của gói thuê bao, thì bạn phải chỉ định tỷ lệ chia sẻ theo thời gian chạy. Đối với các thay đổi về quyền, bạn không thể chỉ định chế độ chia sẻ mặc định qua Google Play Console.

Nếu người dùng không thay đổi quyền đăng ký, bạn có thể sử dụng chế độ chia theo tỷ lệ mặc định được định cấu hình thông qua Play Console. Bạn cũng có thể ghi đè hành vi này bằng cách chỉ định chế độ chia theo tỷ lệ trong SubscriptionUpdateParams. Hãy lưu ý những hạn chế sau:

  • Khi nâng cấp, hạ cấp hoặc chuyển đổi gói thuê bao sang gói trả trước từ gói trả trước hoặc gói tự động gia hạn, thì bạn chỉ được chỉ định chế độ chia tỷ lệ là IMMEDIATE_AND_CHARGE_FULL_PRICE. Nếu bạn chỉ định bất kỳ chế độ chia theo tỷ lệ nào khác, thì giao dịch mua sẽ không thành công và lỗi sẽ hiển thị cho người dùng.
  • Khi chuyển đổi gói trong cùng một gói thuê baosang một gói tự động gia hạntừ một gói trả trước, chế độ chia theo tỷ lệ hợp lệ là IMMEDIATE_AND_CHARGE_FULL_PRICEIMMEDIATE_WITHOUT_PRORATION. Nếu bạn chỉ định bất kỳ chế độ chia theo tỷ lệ nào khác, thì giao dịch mua sẽ không thành công và lỗi sẽ hiển thị cho người dùng.

Ví dụ về chia theo tỷ lệ

Để tìm hiểu cách hoạt động của từng chế độ chia theo tỷ lệ, hãy cân nhắc trường hợp sau:

Samwise đăng ký gói thuê bao về nội dung trực tuyến trên ứng dụng Country Gardener. Hiện tại, anh đang dùng gói thuê bao theo tháng với phiên bản nội dung Cấp 1 chỉ có văn bản. Phí thuê bao của anh là 2 đô la mỗi tháng và gói thuê bao sẽ được gia hạn vào ngày đầu tiên của tháng.

Vào ngày 15 tháng 4, Samwise đã chọn nâng cấp lên phiên bản gói thuê bao Cấp 2 theo năm. Phiên bản này bao gồm bản cập nhật video và phí thuê bao là 36 đô la mỗi năm.

Khi nâng cấp gói thuê bao, nhà phát triển sẽ chọn một chế độ chia theo tỷ lệ. Danh sách sau đây mô tả mức ảnh hưởng của từng chế độ chia theo tỷ lệ đến gói thuê bao của Samwise:

IMMEDIATE_WITH_TIME_PRORATION
Gói thuê bao Cấp 1 của Samwise sẽ kết thúc ngay lập tức. Vì anh đã thanh toán cho cả tháng (Từ ngày 1 đến 30 tháng 4) nhưng đã nâng cấp vào giữa kỳ hạn thuê bao, nên nửa gói thuê bao của tháng đó (1 đô la) sẽ áp dụng sang gói thuê bao mới. Tuy nhiên, vì gói thuê bao mới đó có phí là 36 đô la mỗi năm, nên số dư tín dụng 1 đô la chỉ thanh toán được cho 10 ngày (Từ ngày 16 đến 25 tháng 4). Vì vậy, vào ngày 26 tháng 4, anh sẽ cần trả 36 đô la cho gói thuê bao mới và thêm 36 đô la khác vào ngày 26 tháng 4 của mỗi năm sau đó.
IMMEDIATE_AND_CHARGE_PRORATED_PRICE
Hệ thống có thể sử dụng chế độ này vì giá của gói thuê bao Cấp 2 cho mỗi đơn vị thời gian (36 đô la/năm = 3 đô la/tháng) lớn hơn giá của gói thuê bao Cấp 1 cho mỗi đơn vị thời gian (2 đô la/tháng). Gói thuê bao Cấp 1 của Samwise sẽ kết thúc ngay lập tức. Vì anh đã thanh toán cho cả tháng nhưng mới chỉ sử dụng một nửa tháng, nên một nửa thời gian gói thuê bao của tháng đó (1 đô la) sẽ được áp dụng cho gói thuê bao mới. Tuy nhiên, vì gói thuê bao mới có phí là 36 đô la/năm nên 15 ngày còn lại có phí là 1,5 đô la. Do đó, anh sẽ cần trả 0,5 đô la chênh lệch cho gói thuê bao mới. Vào ngày 1 tháng 5, hệ thống tính phí Samwise 36 đô la cho cấp thuê bao mới và thêm 36 đô la vào ngày 1 tháng 5 của mỗi năm sau đó.
IMMEDIATE_WITHOUT_PRORATION
Hệ thống ngay lập tức nâng cấp gói thuê bao Cấp 1
của Samwise lên Cấp 2 mà không mất thêm phí và vào ngày 1 tháng 5, anh phải trả phí 36 đô la cho lớp thuê bao mới và 36 đô la khác vào ngày 1 tháng 5 mỗi năm sau.
DEFERRED
Gói thuê bao Cấp 1 của Samwise sẽ tiếp tục cho đến khi hết hạn vào ngày 30 tháng 4. Vào ngày 1 tháng 5, gói thuê bao Cấp 2 có hiệu lực, và hệ thống tính phí Samwise 36 đô la cho cấp thuê bao mới.
IMMEDIATE_AND_CHARGE_FULL_PRICE
Gói thuê bao Cấp 1
của Samwise sẽ kết thúc ngay lập tức. Gói thuê bao Cấp 2 bắt đầu từ hôm nay và anh bị tính phí 36 đô la. Vì anh đã thanh toán cho cả tháng nhưng mới chỉ sử dụng một nửa tháng, nên một nửa gói thuê bao của tháng đó (1 đô la) sẽ áp dụng cho gói thuê bao mới. Vì gói thuê bao mới đó có phí là 36 đô la/năm, nên anh sẽ nhận thêm 1/36 năm nữa vào kỳ hạn đăng ký của mình (khoảng 10 ngày). Do đó, lần tính phí tiếp theo của Samwise sẽ là sau 1 năm 10 ngày kể từ hôm nay với giá là 36 đô la. Sau đó, hệ thống sẽ tính phí cho anh 36 đô la với mỗi năm sau.

Khi chọn chế độ chia theo tỷ lệ, hãy nhớ xem bài viết các đề xuất về chia theo tỷ lệ.

Ứng dụng của bạn có thể cung cấp cho người dùng tính năng nâng cấp hoặc hạ cấp theo các bước tương tự như khi bắt đầu quy trình mua. Tuy nhiên khi thực hiện việc nâng cấp hoặc hạ cấp, bạn cần cung cấp thông tin chi tiết về gói thuê bao hiện tại, gói thuê bao trong tương lai (đã nâng cấp hoặc hạ cấp) và chế độ chia theo tỷ lệ để sử dụng, như trong ví dụ sau:

String offerToken = productDetails
                        .getSubscriptionOfferDetails(selectedOfferIndex)
                        .getOfferToken();

BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder()
    .setProductDetailsParamsList(
        ImmuableList.of(
            ProductDetailsParams.newBuilder()
                // fetched via queryProductDetailsAsync
                .setProductDetails(productDetails)
                // offerToken can be found in
                // ProductDetails=>SubscriptionOfferDetails
                .setOfferToken(offerToken)
                .build()))
    .setSubscriptionUpdateParams(
        SubscriptionUpdateParams.newBuilder()
            // purchaseToken can be found in Purchase#getPurchaseToken
            .setOldSkuPurchaseToken("old_purchase_token")
            .setReplaceSkusProrationMode(ProrationMode.IMMEDIATE_AND_CHARGE_FULL_PRICE)
            .build())
    .build();

BillingResult billingResult = billingClient.launchBillingFlow(activity, billingFlowParams);

// process purchase results from PurchasesUpdatedListener registered with BillingClient
public void onPurchaseUpdated(BillingResult billingResult, @Nullable List<Purchase> purchases) {
  // check BillingResult
  // process returned Purchase list, e.g. grant entitlement
}

Đối với các chế độ chia theo tỷ lệ thay thế ngay lập tức, ứng dụng của bạn sẽ nhận được giao dịch mua mới trong PurchasesUpdatedListener. Giao dịch mua này cũng có trên BillingClient.queryPurchasesAsync(). Khi bạn nhận được mã thông báo giao dịch mua, hãy thực hiện quá trình xác minh tương tự như khi xác minh mã thông báo giao dịch mua mới. Hãy nhớ xác nhận các giao dịch mua này với BillingClient.acknowledgePurchase() trên Thư viện Google Play Billing hoặc Purchases.subscriptions:acknowledge trên API Nhà phát triển Google Play.

API Nhà phát triển Google Play trả về một linkedPurchaseToken trong tài nguyên gói thuê bao. Hãy nhớ vô hiệu hoá mã thông báo mà hệ thống cung cấp trong linkedPurchaseToken để đảm bảo rằng người dùng không sử dụng mã thông báo cũ để truy cập vào các dịch vụ của bạn. Vui lòng xem phần Nâng cấp, hạ cấp và đăng ký lại để biết thông tin chi tiết về cách xử lý các giao dịch nâng cấp và hạ cấp.

Đối với chế độ thay thế bị hoãn, ứng dụng của bạn sẽ nhận được một lệnh gọi đến PurchasesUpdatedListener với giao dịch mua gói thuê bao ban đầu và trạng thái cho biết liệu giao dịch nâng cấp hay hạ cấp có thành công không. Cho đến khi thao tác thay thế có hiệu lực, BillingClient.queryPurchasesAsync() sẽ tiếp tục trả về giao dịch mua cho gói thuê bao ban đầu. Sau khi gói mới có hiệu lực, queryPurchasesAsync() sẽ trả về dữ liệu mua của gói thuê bao mới và hệ thống sẽ gửi một thông báo SUBSCRIPTION_RENEWED đến máy chủ phụ trợ bảo mật của bạn. Đối với các yêu cầu thay thế bị hoãn, bạn nên theo dõi thông báo này và xác nhận giao dịch mua bằng cách sử dụng Purchases.subscriptions:acknowledge. Bạn có thể sử dụng linkedPurchaseToken trong tài nguyên thuê bao để xác định người dùng nào trong phần phụ trợ thuê bao (nếu có) cần cập nhật quyền mới. Ứng dụng của bạn không được dựa vào việc người dùng mở ứng dụng và xác nhận qua BillingClient.acknowledgePurchase(), vì người dùng có thể không mở ứng dụng trong vòng 3 ngày kể từ khi việc thay đổi gói có hiệu lực.

Nâng cấp khi có thời gian dùng thử miễn phí hoặc có giá ưu đãi

Chế độ cài đặt về điều kiện dùng thử miễn phí sẽ áp dụng khi người dùng nâng cấp hoặc hạ cấp. Bạn có thể điều chỉnh chế độ cài đặt về việc dùng thử miễn phí trong Google Play Console.

Xin lưu ý những điều sau:

  • Nếu người dùng chỉ có thể nhận được một lần dùng thử miễn phí cho tất cả thuê bao hiện có trong ứng dụng của bạn, thì gói mà người dùng đang thay đổi sẽ không có thời gian dùng thử hoặc giá ưu đãi.
  • Nếu bạn cung cấp một lần dùng thử miễn phí cho mỗi sản phẩm thuê bao, thì gói mà người dùng đang thay đổi có thể có thời gian dùng thử miễn phí hoặc giá ưu đãi.

Bảng sau mô tả hành vi của từng chế độ chia theo tỷ lệ nếu cả gói mới và gói cũ đều có thời gian dùng thử miễn phí và người dùng đang nâng cấp trong thời gian dùng thử miễn phí:

Một lần dùng thử miễn phí cho mỗi ứng dụng Một lần dùng thử miễn phí cho mỗi sản phẩm thuê bao
IMMEDIATE_WITH_TIME_PRORATION Người dùng sẽ mất thời gian dùng thử miễn phí ngay lập tức. Hệ thống sẽ chuyển đổi thời gian dùng thử miễn phí còn lại thành khoảng thời gian miễn phí tương đương của cấp mới dựa trên mức chênh lệch về giá. Người dùng sẽ mất gói dùng thử miễn phí trước đó nhưng ngay lập tức bắt đầu gói dùng thử miễn phí mới. Ngoài ra, hệ thống sẽ chuyển đổi thời gian dùng thử miễn phí còn lại của cấp cũ thành khoảng thời gian miễn phí tương đương của cấp mới và thêm khoảng thời gian này vào thời gian dùng thử miễn phí mới.
IMMEDIATE_AND_CHARGE_PRORATED_PRICE

Người dùng sẽ mất thời gian dùng thử miễn phí ngay lập tức. Sau đó, hệ thống sẽ tính mức chênh lệch về giá cho khoảng thời gian còn lại của người dùng. Ngày thanh toán tiếp theo vẫn không thay đổi.

Lưu ý: Lựa chọn này chỉ dành cho việc nâng cấp gói thuê bao, trong đó, giá mỗi đơn vị thời gian sẽ tăng lên.

IMMEDIATE_WITHOUT_PRORATION Hệ thống sẽ ngay lập tức nâng cấp người dùng lên cấp mới. Người dùng vẫn có quyền dùng thử miễn phí cấp mới cho đến khi kỳ thanh toán trước đó kết thúc.
DEFERRED Người dùng vẫn có quyền dùng thử miễn phí gói thuê bao cũ cho đến ngày thanh toán tiếp theo.
IMMEDIATE_AND_CHARGE_FULL_PRICE Người dùng sẽ mất thời gian dùng thử miễn phí ngay lập tức. Hệ thống sẽ tính phí của gói thuê bao mới cho người dùng. Ngày thanh toán tiếp theo là kỳ hạn của gói thuê bao mới cộng với khoảng thời gian còn lại từ thời gian dùng thử miễn phí.

Để hiểu cách hoạt động của quá trình chuyển đổi thời gian dùng thử miễn phí trong trường hợp mặc định là có một lần dùng thử miễn phí cho mỗi ứng dụng, hãy xem xét tình huống sau:

Maria có gói thuê bao nội dung trực tuyến từ ứng dụng Country Gardener. Hiện tại, cô đang dùng gói thuê bao theo tháng với phiên bản nội dung Cấp 1 chỉ có văn bản. Phí thuê bao của cô là 10 đô la/tháng và cô đã đăng ký vào ngày 1 tháng 4. Cô đang dùng thử miễn phí 30 ngày cho lần đăng ký đầu tiên, có nghĩa là cô sẽ thanh toán lần đầu vào ngày 1 tháng 5.

Vào ngày 15 tháng 4, Maria chọn nâng cấp lên gói thuê bao Cấp 2. Gói này bao gồm bản cập nhật video và phí thuê bao là 20 đô la/tháng. Gói thuê bao thứ hai này cũng có thời gian dùng thử 30 ngày.

Danh sách sau đây mô tả cách chuyển đổi thời gian dùng thử miễn phí cho từng chế độ chia theo tỷ lệ:

  • IMMEDIATE_WITH_TIME_PRORATION – Hệ thống nâng cấp Maria lên Cấp 2 ngay lập tức. Vì Maria đã nâng cấp vào giữa thời gian của gói thuê bao, nên hệ thống sẽ áp dụng một nửa thời gian của gói thuê bao trong tháng đó (15 ngày với mức giá 10 đô la/tháng) cho gói thuê bao mới. Tuy nhiên, vì phí thuê bao mới là 20 đô la/tháng, nên số dư trong 15 ngày chỉ thanh toán được cho 7,5 ngày. Maria không đủ điều kiện dùng thử miễn phí một lần nữa tại Cấp 2. Vì vậy, kể từ ngày 22 tháng 4, cô sẽ phải trả phí 20 đô la mỗi tháng.
  • IMMEDIATE_AND_CHARGE_PRORATED_PRICE – Hệ thống có thể sử dụng chế độ này vì giá của gói thuê bao Cấp 2 cho mỗi đơn vị thời gian (20 đô la/tháng) lớn hơn giá của gói thuê bao Cấp 1 cho mỗi đơn vị thời gian (10 đô la/tháng). Hệ thống ngay lập tức nâng cấp gói thuê bao Cấp 1 của Maria lên Cấp 2 và cô không còn thời gian dùng thử miễn phí nữa. Vì ngày thanh toán tiếp theo của Maria là ngày 1 tháng 5, nên hệ thống tính phí cho cô là 10 đô la vào hôm nay cho chi phí của nửa cuối tháng 4. Sau đó từ ngày 1 tháng 5, cô sẽ phải trả phí 20 đô la mỗi tháng.
  • IMMEDIATE_WITHOUT_PRORATION – Gói thuê bao Cấp 1 của Maria ngay lập tức được nâng cấp lên Cấp 2. Maria được dùng thử miễn phí đến hết ngày 30 tháng 4 và hiện có quyền truy cập vào nội dung Cấp 2. Từ ngày 1 tháng 5, cô phải trả phí 20 đô la mỗi tháng.
  • DEFERRED – Gói thuê bao Cấp 1 của Maria sẽ tiếp tục cho đến hạn thanh toán tiếp theo vào ngày 1 tháng 5. Vào ngày 1 tháng 5, gói thuê bao Cấp 2 có hiệu lực và Maria sẽ phải trả phí 20 đô la vào ngày đầu tiên của mỗi tháng.
  • IMMEDIATE_AND_CHARGE_FULL_PRICE – Hệ thống ngay lập tức nâng cấp gói thuê bao Cấp 1 của Maria lên Cấp 2 và cô không còn thời gian dùng thử miễn phí nữa. Hôm nay, cô sẽ phải trả phí 20 đô la. Vì Maria còn 15 ngày dùng thử miễn phí, nên ngày thanh toán tiếp theo của cô là 1 tháng + 15 ngày kể từ bây giờ tức là ngày 1 tháng 7. Kể từ ngày 1 tháng 7, cô phải trả phí 20 đô la mỗi tháng.

Danh sách sau đây mô tả hành vi chuyển đổi nếu nhà phát triển cho phép dùng thử miễn phí một lần cho mỗi gói thuê bao:

  • IMMEDIATE_WITH_TIME_PRORATION – Hệ thống nâng cấp Maria lên Cấp 2 ngay lập tức. Vì Maria đã nâng cấp vào giữa thời gian của gói thuê bao, nên hệ thống sẽ áp dụng một nửa thời gian của gói thuê bao trong tháng đó (15 ngày với mức giá 10 đô la/tháng) cho gói thuê bao mới. Tuy nhiên, vì phí thuê bao mới là 20 đô la/tháng, nên số dư trong 15 ngày chỉ thanh toán được cho 7,5 ngày. Maria đủ điều kiện dùng thử miễn phí một lần nữa tại Cấp 2. Vì vậy, cô không phải trả phí thêm 37,5 ngày. Từ ngày 22 tháng 5, cô phải trả phí 20 đô la mỗi tháng.
  • IMMEDIATE_AND_CHARGE_PRORATED_PRICE – Hệ thống có thể sử dụng chế độ này vì giá của gói thuê bao Cấp 2 cho mỗi đơn vị thời gian (20 đô la/tháng) lớn hơn giá của gói thuê bao Cấp 1 cho mỗi đơn vị thời gian (10 đô la/tháng). Hệ thống ngay lập tức nâng cấp gói thuê bao Cấp 1 của Maria lên Cấp 2 và cô không còn thời gian dùng thử miễn phí nữa. Vì ngày thanh toán tiếp theo của Maria là ngày 1 tháng 5, nên hệ thống tính phí cho cô là 10 đô la vào hôm nay cho chi phí của nửa cuối tháng 4. Sau đó từ ngày 1 tháng 5, cô sẽ phải trả phí 20 đô la mỗi tháng.
  • IMMEDIATE_WITHOUT_PRORATION – Gói thuê bao Cấp 1 của Maria ngay lập tức được nâng cấp lên Cấp 2. Maria được dùng thử miễn phí đến hết ngày 30 tháng 4 và hiện có quyền truy cập vào Cấp 2.
  • DEFERRED – Gói thuê bao Cấp 1 của Maria sẽ tiếp tục cho đến hạn thanh toán tiếp theo vào ngày 1 tháng 5. Vào ngày 1 tháng 5, gói thuê bao Cấp 2 có hiệu lực và Maria sẽ phải trả phí 20 đô la vào ngày đầu tiên của mỗi tháng.
  • IMMEDIATE_AND_CHARGE_FULL_PRICE – Hệ thống ngay lập tức nâng cấp gói thuê bao Cấp 1 của Maria lên Cấp 2 và cô không còn thời gian dùng thử miễn phí nữa. Hôm nay, cô sẽ phải trả phí 20 đô la. Vì Maria còn 15 ngày dùng thử miễn phí, nên ngày thanh toán tiếp theo của cô là 1 tháng + 15 ngày kể từ bây giờ tức là ngày 1 tháng 7. Kể từ ngày 1 tháng 7, cô phải trả phí 20 đô la mỗi tháng.

Các đề xuất về chia theo tỷ lệ

Bảng sau đây cho thấy các trường hợp chia theo tỷ lệ cùng với những điều chúng tôi đề xuất cho từng trường hợp:

Trường hợp Chế độ chia theo tỷ lệ được đề xuất Kết quả
Nâng cấp lên một lớp đắt hơn IMMEDIATE_AND_CHARGE_PRORATED_PRICE Người dùng sẽ nhận được quyền truy cập ngay lập tức trong khi vẫn giữ nguyên kỳ thanh toán.
Hạ cấp xuống một lớp rẻ hơn DEFERRED Người dùng đã thanh toán cho lớp đắt tiền hơn, vì vậy họ sẽ duy trì quyền truy cập cho đến ngày thanh toán tiếp theo.
Thay đổi khoảng thời gian định kỳ trên cùng một lớp (ví dụ: hằng tháng thành hằng năm) DEFERRED Người dùng sẽ thanh toán mức giá định kỳ mới vào ngày thanh toán tiếp theo.
Nâng cấp khi dùng thử miễn phí, giữ thời gian dùng thử IMMEDIATE_WITHOUT_PRORATION Người dùng vẫn có quyền dùng thử miễn phí nhưng sẽ nâng cấp lên lớp cao hơn cho thời gian dùng thử còn lại.
Nâng cấp khi dùng thử miễn phí – chấm dứt quyền dùng thử miễn phí IMMEDIATE_AND_CHARGE_PRORATED_PRICE Người dùng sẽ nhận được quyền truy cập vào lớp mới ngay lập tức nhưng không có thời gian dùng thử miễn phí nữa.

Quản lý khách hàng

Khi sử dụng thông báo theo thời gian thực dành cho nhà phát triển, bạn có thể phát hiện theo thời gian thực khi người dùng quyết định huỷ gói thuê bao. Khi người dùng huỷ, nhưng trước khi gói thuê bao của họ hết hạn, bạn có thể gửi cho họ thông báo đẩy hoặc thông báo trong ứng dụng để yêu cầu họ đăng ký lại.

Sau khi người dùng đã huỷ gói thuê bao, bạn có thể cố gắng thuyết phục họ quay trở lại thông qua ứng dụng của bạn hoặc thông qua Cửa hàng Play. Bảng sau đây mô tả các trường hợp khác nhau của gói thuê bao cùng với các thao tác thuyết phục liên quan và các yêu cầu đối với ứng dụng.

Trước khi gói thuê bao hết hạn Sau khi gói thuê bao hết hạn
Trong ứng dụng Trong Cửa hàng Play Trong ứng dụng Trong Cửa hàng Play
Tính năng Thuyết phục Gói thuê bao trong ứng dụng Khôi phục Gói thuê bao trong ứng dụng Đăng ký lại
Người dùng thực hiện quy trình thanh toán Không
Gói thuê bao của người dùng vẫn được liên kết với cùng một SKU Người dùng có thể đăng ký cùng hoặc khác SKU Người dùng có thể đăng ký cùng hoặc khác SKU
Tạo mã thông báo giao dịch mua mới Không
Bật theo mặc định Không Có, tất cả nhà phát triển đều phải hỗ trợ Không

Ứng dụng không có Thư viện Billing 2.0+: Không

Ứng dụng có Thư viện Billing 2.0+: Có. Nhà phát triển có thể chọn không tham gia trong Console (Bảng điều khiển).

Thời điểm người dùng phải trả phí

Nếu sử dụng cùng SKU: khi kết thúc kỳ thanh toán hiện tại.

Nếu sử dụng khác SKU: tuỳ thuộc vào chế độ chia theo tỷ lệ.

Kết thúc kỳ thanh toán hiện tại Ngay lập tức Ngay lập tức
Quá trình triển khai bắt buộc Cung cấp giao diện người dùng đăng ký lại trong ứng dụng của bạn

Phát hiện thay đổi trong trạng thái gói thuê bao

Đường liên kết sâu đến Cửa hàng Play

Cung cấp giao diện người dùng đăng ký lại trong ứng dụng của bạn Xử lý các giao dịch mua ngoài ứng dụng

Trước khi gói thuê bao hết hạn – trong ứng dụng

Đối với những gói thuê bao đã bị huỷ nhưng chưa hết hạn, bạn có thể cho phép người thuê bao khôi phục gói thuê bao trong ứng dụng của bạn bằng cách áp dụng quy trình mua sản phẩm trong ứng dụng tương tự như đối với người thuê bao mới. Hãy đảm bảo rằng giao diện người dùng của bạn phản ánh rằng người dùng hiện có một gói thuê bao. Ví dụ: Bạn có thể muốn hiển thị ngày hết hạn hiện tại của người dùng và giá định kỳ với một nút Reactivate (Kích hoạt lại).

Trong hầu hết các trường hợp, bạn sẽ muốn cung cấp cho người dùng cùng một mức giá và SKU mà họ đã đăng ký, như sau:

  • Bắt đầu giao dịch mua gói thuê bao mới có cùng SKU.
  • Gói thuê bao mới sẽ thay thế gói thuê bao cũ và gia hạn vào cùng ngày hết hạn. Hệ thống ngay lập tức đánh dấu gói thuê bao cũ là hết hạn.
  • Ví dụ: Achilles có gói thuê bao của ứng dụng Example Music và gói thuê bao sẽ hết hạn vào ngày 1 tháng 8. Vào ngày 10 tháng 7, anh đăng ký lại gói thuê bao một tháng với cùng mức giá mỗi tháng. Gói thuê bao mới được tính theo tỷ lệ với khoản tín dụng còn lại, ngay lập tức sẽ có hiệu lực và vẫn gia hạn vào ngày 1 tháng 8.

Nếu bạn muốn đưa ra một mức giá khác (chẳng hạn như thời gian dùng thử miễn phí mới hoặc mức giá chiết khấu khi quay lại), thì bạn có thể cung cấp một SKU khác cho người dùng:

  • Hãy bắt đầu quá trình nâng cấp hoặc hạ cấp với SKU khác bằng cách sử dụng chế độ chia theo tỷ lệ IMMEDIATE_WITHOUT_PRORATION.
  • Gói thuê bao mới sẽ thay thế gói thuê bao cũ và gia hạn vào cùng ngày hết hạn. Người dùng cần trả mức phí của SKU mới, kể cả mọi mức giá ưu đãi, vào ngày hết hạn ban đầu. Nếu hệ thống tạo gói thuê bao cũ bằng mã tài khoản bị làm rối, thì mã tài khoản đó sẽ được truyền cho BillingFlowParams để nâng cấp và hạ cấp.
  • Ví dụ: Achilles có gói thuê bao của ứng dụng Example Music và gói thuê bao sẽ hết hạn vào ngày 1 tháng 8. Vào ngày 10 tháng 7, anh đăng ký lại gói thuê bao hằng năm với mức giá ưu đãi. Gói thuê bao mới sẽ hoạt động ngay lập tức và hệ thống sẽ tính phí người dùng ở mức giá ưu đãi vào ngày 1 tháng 8.
  • Nếu bạn quyết định đưa cả lần dùng thử miễn phí hoặc giá ưu đãi vào trong SKU quay lại, hãy đảm bảo rằng người dùng đủ điều kiện bằng cách bỏ đánh dấu hộp Cho phép dùng thử mỗi ứng dụng một lần miễn phí trong Google Play Console vì lựa chọn này chỉ cho phép người dùng được dùng thử mỗi ứng dụng một lần miễn phí.

Khi bạn nhận được mã thông báo giao dịch mua, hãy xử lý giao dịch mua như cách bạn sẽ thực hiện với gói thuê bao mới. Ngoài ra, API Nhà phát triển Google Play trả về một linkedPurchaseToken trong tài nguyên gói thuê bao. Hãy nhớ vô hiệu hoá mã thông báo mà hệ thống cung cấp trong linkedPurchaseToken để đảm bảo rằng người dùng không sử dụng mã thông báo cũ để truy cập vào các dịch vụ của bạn.

Trước khi gói thuê bao hết hạn — trong Cửa hàng Play

Trong khi gói thuê bao đã bị huỷ nhưng vẫn hoạt động, người dùng có thể khôi phục gói thuê bao trong trung tâm thuê bao của Google Play bằng cách nhấp vào Resubscribe (Đăng ký lại) (trước đây là Restore (Khôi phục)). Thao tác này giúp giữ nguyên gói thuê bao và mã thông báo giao dịch mua.

phần gói thuê bao trong ứng dụng cửa hàng Google Play cho thấy gói thuê bao đã huỷ có nút resubscribe (đăng ký lại)
Hình 8. Phần Account (Tài khoản) > Subscriptions (Gói thuê bao) trong ứng dụng Cửa hàng Google Play cho thấy gói thuê bao đã huỷ có nút Resubscribe (Đăng ký lại).

Để biết thêm thông tin về cách khôi phục gói thuê bao, hãy xem phần Tính năng khôi phục.

Sau khi gói thuê bao hết hạn – trong ứng dụng

Bạn có thể cho phép người thuê bao đã hết hạn đăng ký lại trong ứng dụng của bạn bằng cách áp dụng quy trình mua sản phẩm trong ứng dụng giống như cho người thuê bao mới. Xin lưu ý những điều sau:

  • Để giảm giá cho người dùng, bạn có thể cung cấp một mã sản phẩm có giá đặc biệt cho gói thuê bao của mình, còn gọi là SKU quay lại. Bạn có thể đưa ra ưu đãi trong ứng dụng của mình hoặc có thể thông báo cho người dùng về ưu đãi bên ngoài ứng dụng (chẳng hạn như trong email).
  • Để bắt đầu gói thuê bao quay lại, hãy bắt đầu quy trình mua hàng trong ứng dụng Android của bạn bằng cách sử dụng Thư viện Google Play Billing. Quá trình này giống như quá trình thuê mới, nhưng bạn có thể xác định SKU của người dùng.
  • Nếu bạn quyết định đưa cả lần dùng thử miễn phí hoặc giá ưu đãi vào trong SKU quay lại, hãy đảm bảo rằng người dùng đủ điều kiện bằng cách bỏ đánh dấu hộp Cho phép dùng thử mỗi ứng dụng một lần miễn phí trong Google Play Console vì tuỳ chọn này chỉ cho phép người dùng được dùng thử mỗi ứng dụng một lần miễn phí.
  • Nếu người dùng đăng ký lại cùng một SKU, thì họ sẽ không còn đủ điều kiện dùng thử miễn phí hoặc hưởng giá ưu đãi. Hãy đảm bảo rằng giao diện người dùng của bạn phản ánh quy định này.

Khi bạn nhận được mã thông báo giao dịch mua, hãy xử lý giao dịch mua như cách bạn sẽ thực hiện với gói thuê bao mới. Bạn sẽ không nhận được linkedPurchaseToken trong tài nguyên cho gói thuê bao.

Sau khi gói thuê bao hết hạn — trong Cửa hàng Play

Nếu hệ thống bật tính năng này, thì người dùng có thể đăng ký lại cùng một SKU trong tối đa một năm sau khi hết hạn bằng cách nhấp vào nút Resubscribe (Đăng ký lại) trong trung tâm thuê bao Google Play. Thao tác này sẽ tạo ra một gói thuê bao và mã thông báo giao dịch mua mới.

phần subscriptions (gói thuê bao) trong ứng dụng cửa hàng google play cho thấy gói thuê bao đã huỷ và đã hết hạn cùng với nút đăng ký lại (resubscribe) và loại bỏ (remove)
Hình 9. Phần Account (Tài khoản) > Subscriptions (Gói thuê bao) trong ứng dụng Cửa hàng Google Play cho thấy một gói thuê bao đã huỷ và hết hạn, kèm theo các nút Resubscribe (Đăng ký lại)Remove (Loại bỏ).

Việc đăng ký lại được coi là giao dịch mua bên ngoài ứng dụng, vì vậy, hãy nhớ làm theo các phương pháp hay nhất để xử lý các giao dịch mua được thực hiện từ bên ngoài ứng dụng của bạn.

Quảng bá gói thuê bao

Bạn có thể tạo mã khuyến mãi để cung cấp cho người dùng có chọn lọc một gói dùng thử miễn phí mở rộng đối với một gói thuê bao hiện có. Để tìm hiểu thêm, hãy xem phần Mã khuyến mãi.

Đối với bản dùng thử miễn phí, Google Play xác minh rằng người dùng có một phương thức thanh toán hợp lệ trước khi bắt đầu quá trình dùng thử miễn phí. Một số người dùng có thể thấy quy trình xác minh này là một khoản tiền tạm giữ hoặc một khoản phí trong phương thức thanh toán của họ. Đây là khoản tiền tạm giữ hoặc khoản phí và sau đó hệ thống sẽ huỷ bỏ hoặc hoàn lại tiền.

Sau khi thời gian dùng thử kết thúc, hệ thống sẽ tính phí cho phương thức thanh toán của người dùng đối với toàn bộ số tiền của gói thuê bao.

Nếu người dùng huỷ gói thuê bao bất kỳ lúc nào trong thời gian dùng thử miễn phí, thì gói thuê bao vẫn hoạt động cho tới khi hết thời gian dùng thử và họ sẽ không phải trả phí khi thời gian dùng thử miễn phí kết thúc.

Huỷ, hoàn tiền hoặc thu hồi

Bạn có thể sử dụng API nhà phát triển Google Play để huỷ, hoàn tiền hoặc thu hồi một gói thuê bao. Chức năng này cũng có trong Google Play Console.

  • Huỷ: Người dùng có thể huỷ gói thuê bao trên Google Play. Bạn cũng có thể cung cấp tuỳ chọn để người dùng huỷ gói thuê bao trong ứng dụng hoặc trên trang web của bạn. Ứng dụng của bạn phải xử lý các thao tác huỷ này như mô tả trong phần Tính năng thu hồi.
  • Hoàn tiền: Khi bạn hoàn lại tiền, người dùng có thể tiếp tục sử dụng gói thuê bao. Bạn có thể sử dụng tính năng hoàn tiền nếu chẳng hạn như đã xảy ra lỗi kỹ thuật ngăn người dùng truy cập sản phẩm của bạn nhưng lỗi này đã được giải quyết. Xin lưu ý rằng để hoàn tiền nhiều hơn khoản thanh toán gần đây nhất hoặc nếu bạn muốn hoàn tiền một phần, bạn phải sử dụng Google Play Console.
  • Thu hồi: Khi bạn thu hồi gói thuê bao, người dùng sẽ mất quyền truy cập ngay lập tức. Tính năng này có thể sử dụng nếu chẳng hạn như xảy ra lỗi kỹ thuật ngăn người dùng truy cập sản phẩm của bạn và người dùng không muốn tiếp tục sử dụng sản phẩm. Ứng dụng của bạn sẽ xử lý các yêu cầu huỷ này như mô tả trong phần Tính năng thu hồi.

Bảng sau đây minh hoạ các điểm khác biệt giữa các tính năng huỷ, hoàn tiền và thu hồi.

Ngừng gia hạn Hoàn tiền Thu hồi quyền truy cập
Huỷ Không Không
Hoàn tiền Không Không
Thu hồi

Hoãn thanh toán cho người đăng ký

Bạn có thể chuyển sang ngày thanh toán tiếp theo cho người đăng ký tự động gia hạn bằng cách sử dụng Purchases.subscriptions:defer từ API Nhà phát triển Google Play. Trong thời gian hoãn, hệ thống sẽ đăng ký cho người dùng đến nội dung của bạn với quyền truy cập đầy đủ nhưng không phải trả phí. Hệ thống cập nhật ngày gia hạn gói thuê bao tương ứng với ngày mới.

Khoản thanh toán bị hoãn cho phép bạn thực hiện các việc sau:

  • Tặng quyền truy cập miễn phí cho người dùng dưới dạng ưu đãi đặc biệt, chẳng hạn như tặng một tuần miễn phí cho giao dịch mua phim.
  • Tặng quyền truy cập miễn phí cho khách hàng như một cử chỉ thể hiện uy tín kinh doanh.

Hệ thống có thể hoãn khoản thanh toán chỉ trong một ngày và tối đa là một năm cho mỗi lệnh gọi API. Để hoãn việc tính phí thêm nữa, bạn có thể gọi lại API trước ngày thanh toán mới.

Ví dụ: Darcy có gói thuê bao nội dung trực tuyến hằng tháng cho ứng dụng Fishing Quarterly. Cô thường phải trả 1,25 bảng Anh vào ngày đầu tiên của mỗi tháng. Vào tháng 3, cô đã tham gia một cuộc khảo sát trực tuyến dành cho nhà xuất bản ứng dụng. Nhà xuất bản tặng cô 6 tuần miễn phí bằng cách hoãn khoản thanh toán tiếp theo cho đến ngày 15 tháng 5, tức là 6 tuần sau ngày thanh toán được lên lịch trước đó vào ngày 1 tháng 4. Darcy không phải trả phí cho tháng 4 hoặc đầu tháng 5 và vẫn có quyền truy cập vào nội dung. Vào ngày 15 tháng 5, cô phải trả phí thuê bao thông thường là 1,25 bảng Anh cho tháng đó. Ngày gia hạn tiếp theo là ngày 15 tháng 6.

Khi hoãn thanh toán, bạn có thể thông báo cho người dùng qua email hoặc trong ứng dụng để thông báo cho họ rằng ngày thanh toán đã thay đổi.

Thay đổi giá gói thuê bao

Để biết thông tin về cách thay đổi giá đăng ký bằng Play Console, hãy xem nội dung tài liệu Trung tâm trợ giúp của Play Console.

Nhắc nhở: Bạn không nên thay đổi giá gói thuê bao Đăng ký bằng Google.

Google Play cho phép bạn bán các sản phẩm kỹ thuật số trên toàn thế giới cho nhiều người dùng ở các khu vực khác nhau với các đơn vị tiền tệ và mức độ cân nhắc về giá khác nhau. Đôi khi, do chi phí theo khu vực, sự biến động về đơn vị tiền tệ hoặc các lý do khác, bạn có thể cần thay đổi giá của gói đăng ký.

Bạn có thể thay đổi giá của bất kỳ gói cơ bản hoặc ưu đãi nào, giá mới sẽ có hiệu lực trong vòng một giờ đối với tất cả các giao dịch mua mới.

Người dùng các gói trả trước luôn thanh toán giá hiện tại cho các giao dịch nạp tiền và thay đổi gói.

Theo mặc định, những người dùng đã đăng ký gói tự động gia hạn sẽ không bị ảnh hưởng. Thay vào đó, hệ thống sẽ tạo một nhóm giá cũ. Nếu muốn, bạn có thể thay đổi giá của gói cơ bản thành giá hiện tại bằng cách kết thúc nhóm thuần tập. Bạn không thể thay đổi giá của giai đoạn đặt giá miễn phí hoặc ưu đãi cho người dùng mới.

Để biết thêm thông tin về cách sử dụng nhóm thuần tập theo giá cũ, vui lòng xem nội dung Trung tâm trợ giúp của Play Console.

Thông báo cho người dùng về việc thay đổi giá

Bạn nên thông báo cho người thuê bao hiện tại mỗi khi thay đổi giá của gói cơ bản, đặc biệt khi giá tăng lên.

Khi tăng giá gói thuê bao, bạn có ít nhất 7 ngày để thông báo cho những người thuê bao hiện tại về việc thay đổi giá trước khi Google Play có thể bắt đầu thông báo cho họ.

Những người thuê bao hiện tại có ít nhất 30 ngày để xem xét việc tăng giá và quyết định có chấp nhận mức giá đó hay không. Nếu không chấp nhận mức tăng giá, gói thuê bao của họ sẽ tự động bị hủy trước khi họ trả mức giá cao hơn.

Người dùng có thể xem xét việc tăng giá trên màn hình thuê bao của Cửa hàng Play, nơi hộp thoại tương tự như hình 13 được hiển thị.

Hộp thoại chung thông báo cho người dùng về việc thay đổi giá của gói thuê bao
Hình 13. Hộp thoại ví dụ thông báo cho người dùng về việc thay đổi giá của gói thuê bao.

Google Play sẽ thông báo trực tiếp cho người thuê bao hiện tại tất cả các thay đổi về giá sắp tới.

Trong ứng dụng của mình, bạn cũng nên thông báo cho những người dùng bị ảnh hưởng và cung cấp đường liên kết sâu tới màn hình thuê bao Cửa hàng Play.

Khi bạn giảm giá một gói đăng ký, người dùng không cần phải đồng ý với thay đổi đó đồng thời hộp thoại thay đổi về giá cũng sẽ không hiển thị. Họ sẽ được tính giá thấp hơn kể từ ngày thanh toán tiếp theo.

Xử lý việc xác nhận thay đổi giá của người dùng

Nếu người dùng chấp nhận mức tăng giá gói thuê bao hoặc nếu bạn đã giảm giá, gói thuê bao sẽ gia hạn và được xử lý giống như mọi lần gia hạn khác. Ngoài ra, bạn sẽ nhận được một SubscriptionNotification với loại SUBSCRIPTION_PRICE_CHANGE_CONFIRMED.

Xử lý khi không chấp nhận mức tăng giá

Nếu người dùng chưa chấp nhận mức tăng giá trước khi họ trả mức giá cao hơn, thì họ sẽ tự động bị hủy đăng ký và bạn sẽ nhận được SubscriptionNotification loại SUBSCRIPTION_CANCELED. Bạn có thể xử lý sự kiện này như mô tả trong mục Yêu cầu huỷ.

Thay đổi giá do nhầm lẫn

Nếu bạn vô tình thay đổi giá của một gói thuê bao, hãy huỷ thay đổi ngay lập tức. Miễn là giá đó được huỷ bỏ trong vòng bảy ngày, những người thuê bao hiện tại sẽ không nhận được thông báo về việc thay đổi giá do nhầm lẫn. Lưu ý những người thuê bao mới có thể sẽ nhận được mức giá nhầm lẫn trong khoảng thời gian từ thời điểm thay đổi giá đầu tiên đến thời điểm huỷ bỏ.

Thực hiện hai thay đổi về giá liên tiếp

Nếu bạn đã kết thúc một nhóm thuần tập trong giá cũ với mức tăng giá, sau đó thay đổi giá lần nữa, thì bất kỳ người dùng nào đủ điều kiện cũng không cần phản hồi cho lần thay đổi giá đầu tiên, vì giờ đây chỉ có thay đổi về giá lần thứ hai.

Bạn nên đảm bảo rằng bạn chỉ thực hiện một thay đổi về giá tại một thời điểm. Bạn không nên thay đổi giá cho mục đích kiểm thử.

Nếu bạn thay đổi giá của gói đăng ký hai lần trong khoảng thời gian bảy ngày, thì những người dùng bị ảnh hưởng chỉ cần đồng ý với lần thay đổi giá mới nhất.

Xử lý khoản thanh toán bị từ chối

Nếu có vấn đề về thanh toán khi kết thúc chu kỳ thanh toán, thì Google sẽ định kỳ thử gia hạn gói thuê bao trong một khoảng thời gian trước khi huỷ gói thuê bao đó. Thời gian thử lại này có thể kéo dài tối đa 30 ngày và cộng với mọi thời gian gia hạn được chỉ định. Trong thời gian này, Google cũng gửi email và thông báo cho người dùng để yêu cầu họ cập nhật phương thức thanh toán.

Sau khi khoản thanh toán bị từ chối, gói thuê bao sẽ chuyển sang thời gian gia hạn, nếu tính năng này được bật. Trong thời gian gia hạn, người dùng vẫn có quyền truy cập vào gói thuê bao.

Sau khi kết thúc thời gian gia hạn, gói thuê bao sẽ chuyển sang trạng thái tạm ngưng tài khoản trong tối đa 30 ngày. Trong thời gian tạm ngưng tài khoản, bạn có thể chặn quyền truy cập vào gói thuê bao này.

Để tăng tối đa khả năng khôi phục gói thuê bao trong thời gian khoản thanh toán bị từ chối, bạn có thể thông báo cho người dùng về sự cố thanh toán và yêu cầu họ khắc phục sự cố.

Bạn có thể tự làm điều này, như mô tả trong phần thời gian gia hạn và phần tạm ngưng tài khoản, hoặc bạn có thể triển khai API gửi thông báo trong ứng dụng. Với tính năng này, Google sẽ cho người dùng thấy thông báo trong ứng dụng của bạn.

Gửi thông báo trong ứng dụng

Nếu bạn đã bật tính năng gửi thông báo trong ứng dụng bằng InAppMessageCategoryId.TRANSACTIONAL, thì Google Play sẽ hiển thị thông báo cho người dùng trong thời gian gia hạn và thời gian tạm ngưng tài khoản một lần mỗi ngày, đồng thời, Google Play cũng sẽ cho họ cơ hội giải quyết vấn đề thanh toán mà không cần rời khỏi ứng dụng.

Thanh thông báo nhanh gửi thông báo để người dùng khắc phục vấn đề thanh toán
Hình 14. Thanh thông báo nhanh gửi thông báo để người dùng khắc phục vấn đề thanh toán.

Bạn nên gọi API này bất cứ khi nào người dùng mở ứng dụng để xác định thông báo có xuất hiện hay không.

Nếu người dùng khôi phục thành công gói thuê bao, thì bạn sẽ nhận được một mã phản hồi SUBSCRIPTION_STATUS_UPDATED cùng với mã thông báo giao dịch mua. Sau đó, bạn nên sử dụng mã thông báo giao dịch mua này để gọi API Nhà phát triển Google Play và làm mới trạng thái gói thuê bao trong ứng dụng của mình.

Tích hợp tính năng gửi thông báo trong ứng dụng

Để cho người dùng thấy thông báo trong ứng dụng, hãy sử dụng BillingClient.showInAppMessages().

Dưới đây là ví dụ về cách kích hoạt quy trình gửi thông báo trong ứng dụng:

Kotlin

val inAppMessageParams = InAppMessageParams.newBuilder()
        .addInAppMessageCategoryToShow(InAppMessageCategoryId.TRANSACTIONAL)
        .build()

billingClient.showInAppMessages(activity,
        inAppMessageParams,
        object : InAppMessageResponseListener() {
            override fun onInAppMessageResponse(inAppMessageResult: InAppMessageResult) {
                if (inAppMessageResult.responseCode == InAppMessageResponseCode.NO_ACTION_NEEDED) {
                    // The flow has finished and there is no action needed from developers.
                } else if (inAppMessageResult.responseCode
                        == InAppMessageResponseCode.SUBSCRIPTION_STATUS_UPDATED) {
                    // The subscription status changed. For example, a subscription
                    // has been recovered from a suspend state. Developers should
                    // expect the purchase token to be returned with this response
                    // code and use the purchase token with the Google Play
                    // Developer API.
                }
            }
        })

Java

InAppMessageParams inAppMessageParams = InAppMessageParams.newBuilder()
        .addInAppMessageCategoryToShow(InAppMessageCategoryId.TRANSACTIONAL)
        .build();

billingClient.showInAppMessages(activity,
        inAppMessageParams,
        new InAppMessageResponseListener() {
            @Override
            public void onInAppMessageResponse(InAppMessageResult inAppMessageResult) {
                if (inAppMessageResult.responseCode
                        == InAppMessageResponseCode.NO_ACTION_NEEDED) {
                    // The flow has finished and there is no action needed from developers.
                } else if (inAppMessageResult.responseCode
                        == InAppMessageResponseCode.SUBSCRIPTION_STATUS_UPDATED) {
                    // The subscription status changed. For example, a subscription
                    // has been recovered from a suspend state. Developers should
                    // expect the purchase token to be returned with this response
                    // code and use the purchase token with the Google Play
                    // Developer API.
                }
            }
        });