Bán gói thuê bao

Sử dụng bộ sưu tập để sắp xếp ngăn nắp các trang Lưu và phân loại nội dung dựa trên lựa chọn ưu tiên của bạn.

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 chương trình khuyến mãi và cho phép người dùng tự quản lý gói thuê bao của mình.

Trước khi đọc chủ đề này, hãy nhớ đọc bài viết 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 hưởng 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ể đưa nhiều gói thuê bao vào cùng một ứng dụng, để thể hiện 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 từng đă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 trong Trung tâm trợ giúp của Play Console.

Xử lý vòng đời 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 và ứng dụng của bạn cần thích ứng với từng 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ị huỷ 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 nội dung đề 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 sẽ có dạng như trong ví dụ sau. Xin lưu ý rằng 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 gói thuê bao mà hệ thống 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 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ẽ đặt subscriptionState thành "SUBSCRIPTION_STATE_CANCELED" và expiryTime chứa ngày 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 họ làm vậy.

Ứ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 đóng 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 người dùng bị huỷ gói thuê bao do khoản thanh toán của họ đã quá 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ẽ đặt subscriptionState thành "SUBSCRIPTION_STATE_EXPIRED", và expiryTime chứa ngày 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_EXPIRED",
  ...
  "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 ân 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 quyền truy cập vào gói thuê bao bị tạm ngưng. 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. Thông báo của bạn phải chứa đườ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. 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. Ví dụ: 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 chuyển sang 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,
      ...
    }
  ],
}

Sử dụng và khôi phục trạng thái tạm ngưng tài khoản

Dưới đây là ví dụ minh hoạ tiến trình một gói thuê bao chuyển sang trạng thái tạm ngưng tài khoản rồi khôi phục về trạng thái ban đầu khi người dùng khắc phục phương thức thanh toán.

Tương tự như ví dụ trước, tiến trình này cho biết một gói thuê bao chuyển sang thời gian ân hạn trước rồi mới chuyển sang trạng thái tạm ngưng tài khoản.

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

  • Trong thời gian gia hạn, người dùng vẫn có quyền sử dụng các lợi ích của gói thuê bao.
  • Trước khi gói thuê bao chuyển sang trạng thái tạm ngưng tài khoản, Google sẽ cố gắng tìm cách tính phí bằng phương thức thanh toán này trong tối đa 24 giờ. Người dùng vẫn được hưởng các lợi ích của gói thuê bao trong thời gian này. Sau khi thời gian thử lại này kết thúc, gói thuê bao sẽ chuyển sang trạng thái tạm ngưng tài khoản và người dùng sẽ mất quyền sử dụng các lợi ích của gói thuê bao.
  • Khi gói thuê bao khôi phục trong thời gian gia hạn, ngày gia hạn sẽ không được đặt lại.
  • Khi gói thuê bao khôi phục sau thời gian tạm ngưng tài khoản, ngày gia hạn sẽ được đặt lại.

Thời gian gia hạn

Nếu thời gian ân hạn được bật, thì các gói thuê bao sẽ chuyển sang thời gian ân hạn trong trường hợp 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 khoảng thời gian ân hạn ở 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 ân 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 ân hạn. Khi người dùng đang trong thời gian ân 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 ân 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.

Sử dụng và khôi phục thời gian gia hạn mà không cần tạm ngưng tài khoản

Dưới đây là ví dụ minh hoạ tiến trình một gói đăng ký chuyển sang thời gian gia hạn rồi khôi phục về trạng thái ban đầu khi người dùng khắc phục phương thức thanh toán. Trong ví dụ này, gói thuê bao không hỗ trợ trạng thái tạm ngưng tài khoản. Vì vậy, sau khi thời gian gia hạn kết thúc, người dùng sẽ mất các lợi ích của gói thuê bao.

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

  • Trong thời gian ân hạn, người dùng vẫn có quyền sử dụng các lợi ích của gói thuê bao.
  • Khi gói thuê bao khôi phục trong thời gian gia hạn, ngày gia hạn sẽ không được đặt lại.

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ừ 1 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ừ 1 tuần đến 3 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 Sự hiện diện trong cửa hàng > Sản phẩm trong ứng dụng > 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 khoảng thời gian tạm dừng kết thúc, gói thuê bao sẽ tiếp tục và Google sẽ cố gắng 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 đề về 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, như 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 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 khoảng 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 được 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 ngày 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) của ứng dụng Cửa hàng Google Play. Bạn cũng có thể cho phép người dùng Resubscribe (Đăng ký lại) để tự động gia hạn gói cơ bản sau khi hết hạn bằng cách định cấu hình gói theo tuỳ chọn "Đăng ký lại".

phần subscriptions (gói thuê bao) trong ứng dụng cửa hàng google play hiển thị gói thuê bao đã huỷ có nút resubscribe (đăng ký lại)
Hình 3. Phần Account > Subscriptions (Tài khoả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).

Khôi phục trước khi hết hạn

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, ghi nhận 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 sẽ có dạng như sau:

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

Đăng ký lại sau khi hết hạn

Nếu sản phẩm thuê bao được định cấu hình cho phép Đăng ký lại sau khi hết hạn, người dùng có thể bắt đầu mua hàng qua ứng dụng Cửa hàng Play. Trong trường hợp này, Google Play sẽ cấp một mã mua hàng mới và máy chủ phụ trợ sẽ nhận được Thông báo SUBSCRIPTION_PURCHASED theo thời gian thực dành cho nhà phát triển. Trạng thái mua hàng của loại giao dịch mua này sẽ không bao gồm linkedPurchaseToken cũng như mã nhận dạng tài khoản bị làm rối mã nguồn được liên kết với giao dịch mua ban đầu trong trường hợp này, vì giao dịch mua đã hoàn toàn hết hạn.

Để Đăng ký lại sau khi hết hạn, người dùng cần phải mở ứng dụng và bạn sẽ xử lý loại giao dịch mua này giống như giao dịch mua ngoài ứng dụng khác.

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.

Trước khi cung cấp các tuỳ chọn nâng cấp, hạ cấp hoặc đăng ký lại trong ứng dụng, bạn phải xác nhận gói thuê bao hiện có. Mọi hành động thay đổi hoặc đăng ký lại gói thuê bao sẽ bị chặn nếu gói thuê bao cũ đang chờ xác nhận.

Sau khi thay đổi hoặc đăng ký lại gói thuê bao, chúng tôi cũng yêu cầu bạn xác nhận giao dịch mua gói thuê bao mới. Bạn nên sử dụng API Nhà phát triển Google Play để xác nhận giao dịch mua nhằm tránh việc bị huỷ giao dịch mua. Tài nguyên gói thuê bao sẽ có dạ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 thuê bao mà không bị gián đoạn, người dùng phải nạp tiền vào gói trả trước cho cùng một gói thuê bao.

Đố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 cả kỳ thanh toán và quyền của họ sẽ được gia hạn 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 để xác 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 lựa chọn ưu tiên giúp người dùng có thể quản lý gói thuê bao của họ. Ví dụ về đường liên kết này được minh hoạ trong hình 4.

Nút Google Play Subscriptions (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 Google Play 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 cho gói thuê bao khi bạn tạo gói thuê bao 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" và "your-app-package" 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 mọi gói thuê bao khác, như trong hình 5 và 6:

https://play.google.com/store/account/subscriptions
Màn hình subscriptions (gói thuê bao) trên Cửa hàng Play cho thấy trạng thái đối với mọi gói thuê bao của một người dùng.
Hình 5. Màn hình subscriptions (gói thuê bao) trên Cửa hàng Play cho thấy trạng thái đối với mọi gói thuê bao của một 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 cấp thuê bao, chẳng hạn như cấp cơ bản và cấ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 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 thuê bao, 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ê bao sang một gói tự động gia hạn từ 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 xem xét tình huống 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 USD/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 USD) 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 USD/năm, nên số dư tín dụng 1 USD 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 USD cho gói thuê bao mới và thêm 36 USD 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 USD/năm = 3 USD/tháng) nhiều hơn giá của gói thuê bao Cấp 1 cho mỗi đơn vị thời gian (2 USD/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 USD) sẽ áp dụng cho gói thuê bao mới. Tuy nhiên, vì gói thuê bao mới có phí là 36 USD/năm nên 15 ngày còn lại có phí là 1,5 USD. Do đó, anh sẽ cần trả 0,5 USD 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 USD cho cấp thuê bao mới và 36 USD 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 USD. 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 USD) sẽ áp dụng cho gói thuê bao mới. Vì gói thuê bao mới đó có phí là 36 USD/năm, nên anh sẽ nhận thêm 1/36 năm nữa vào kỳ hạn gói thuê bao 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 USD. 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 nội dung đề xuất về việc 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 (được 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 gói 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 nên phụ thuộc 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ề điều kiện 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 mọi 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 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 sẽ bắt đầu ngay 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 gói 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à ngày tính từ kỳ hạn của gói thuê bao mới cộng với khoảng thời gian còn lại của gói dùng thử miễn phí.

Để hiểu cách chuyển đổi thời gian dùng thử miễn phí trong trường hợp mỗi ứng dụng đều mặc định có một gói dùng thử miễn phí, 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 USD/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 USD/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 ngay gói thuê bao của Maria lên Cấp 2. 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 USD/tháng) cho gói thuê bao mới. Tuy nhiên, vì phí thuê bao mới là 20 USD/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í gói thuê bao Cấp 2. Vì vậy, kể từ ngày 22 tháng 4, cô sẽ phải trả phí 20 USD/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 USD/tháng) nhiều hơn giá của gói thuê bao Cấp 1 cho mỗi đơn vị thời gian (10 USD/tháng). Hệ thống nâng cấp ngay gói thuê bao của Maria từ Cấp 1 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 USD 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 USD/tháng.
  • IMMEDIATE_WITHOUT_PRORATION – Gói thuê bao Cấp 1 của Maria được nâng cấp ngay 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ủa gói thuê bao 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 nâng cấp ngay gói thuê bao của Maria từ Cấp 1 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ừ thời điểm này, tức là ngày 1 tháng 7. Kể từ ngày 1 tháng 7, cô phải trả phí 20 USD/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 ngay gói thuê bao của Maria lên Cấp 2. 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 USD/tháng) cho gói thuê bao mới. Tuy nhiên, vì phí thuê bao mới là 20 USD/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í gói thuê bao 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 USD/tháng) nhiều hơn giá của gói thuê bao Cấp 1 cho mỗi đơn vị thời gian (10 USD/tháng). Hệ thống nâng cấp ngay gói thuê bao của Maria từ Cấp 1 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 USD 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 USD/tháng.
  • IMMEDIATE_WITHOUT_PRORATION – Gói thuê bao Cấp 1 của Maria được nâng cấp ngay 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 nâng cấp ngay gói thuê bao của Maria từ Cấp 1 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ừ thời điểm này, tức là ngày 1 tháng 7. Kể từ ngày 1 tháng 7, cô phải trả phí 20 USD/tháng.

Nội dung đề xuất về việc 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 tình huống:

Tình huống 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 cấ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 cấp cao hơn cho thời gian dùng thử còn lại.
Nâng cấp khi đang 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ẽ có quyền truy cập vào cấp mới tức thì 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ể tức thì phát hiện thời điểm 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 mình 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 thu hút người dùng đăng ký lại 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 trở lên: 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 đăng ký 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 đăng ký 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ả gói dùng thử miễn phí hoặc giá ưu đãi vào SKU đăng ký 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 Allow one free trial per app (Cho phép dùng thử mỗi ứng dụng một lần miễn phí) trong Google Play Console, lựa chọn này chỉ cho phép người dùng được dùng thử miễn phí mỗi ứng dụng một lần.

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 Đăng ký lại (trước đây là 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 subscriptions (gói thuê bao) trong ứng dụng cửa hàng google play hiển thị gói thuê bao đã huỷ có nút resubscribe (đăng ký lại)
Hình 8. Phần Account > Subscriptions (Tài khoả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).

Để biết thêm thông tin về cách khôi phục gói thuê bao, hãy xem phần 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 đăng ký đã 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 đăng ký 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 đăng ký 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 đăng ký 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ả gói dùng thử miễn phí hoặc giá ưu đãi vào SKU đăng ký 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 Allow one free trial per app (Cho phép dùng thử mỗi ứng dụng một lần miễn phí) trong Google Play Console, lựa chọn này chỉ cho phép người dùng được dùng thử miễn phí mỗi ứng dụng một lần.
  • 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 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 Đă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 subscription (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 resubscribe (đăng ký lại) và remove (loại bỏ)
Hình 9. Phần Account > Subscriptions (Tài khoản > 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) và 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 tại một thời điểm 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 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 phải xử lý các thao tác huỷ này như mô tả trong phần 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.

Đối với các gói trả trước, bạn có thể sử dụng API hoãn thanh toán để hoãn thời gian hết hạn.

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

Bạn có thể thay đổi giá của các gói cơ bản và ưu đãi của gói thuê bao. Ví dụ: bạn có thể có các sản phẩm kỹ thuật số cần điều chỉnh giá hằng năm, hoặc bạn có thể thay đổi nhóm lợi ích của sản phẩm và muốn phản ánh những thay đổi này trong giá.

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

Quản lý việc thay đổi giá cho các giao dịch mua mới

Khi bạn thay đổi giá của gói cơ bản hoặc ưu đãi, giá mới sẽ có hiệu lực trong vòng vài giờ đối với tất cả các giao dịch mua mới mà bạn không phải làm gì thêm. Giao dịch mua mới có thể là bất kỳ trường hợp nào sau đây:

  • Người dùng hiện không sở hữu gói thuê bao nào trong ứng dụng của bạn.
  • Người dùng đã mua một gói tự động gia hạn hiện có và giờ đang mua một gói khác, chẳng hạn như gói có kỳ thanh toán dài hơn hoặc cấp dịch vụ cao hơn.
  • Người dùng sử dụng một gói trả trước và đang thực hiện nạp tiền.

Bạn nên xử lý các giao dịch mua mới giống như mọi giao dịch mua khác.

Quản lý việc thay đổi giá đối với các giao dịch mua gói thuê bao tự động gia hạn hiện có

Bất cứ lúc nào bạn cũng có thể thay đổi giá của gói cơ bản tự động gia hạn. Theo mặc định, người đăng ký hiện tại sẽ không bị ảnh hưởng. Những người đăng ký này được đưa vào một nhóm thuần tập theo giá cũ. Khi gia hạn, họ sẽ tiếp tục thanh toán theo mức giá ban đầu của gói cơ bản. Bạn có thể chọn chấm dứt nhóm thuần tập bất cứ lúc nào và chuyển những người dùng này sang mức giá hiện tại của gói cơ bản.

Tương tự, việc thay đổi giá của các ưu đãi đặc biệt và từng giai đoạn định giá không ảnh hưởng đến người đăng ký hiện tại. Những người đăng ký này sẽ tiếp tục thanh toán theo mức giá mà họ thấy khi mua gói thuê bao.

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

Thay đổi giá gói thuê bao bằng API Nhà phát triển Google Play

Để thay đổi giá gói cơ bản của gói thuê bao theo phương thức lập trình, hãy sử dụng phương thức monetization.subscriptions.patch. Phương thức này nhận được một đối tượng Subscription có cấu hình sản phẩm thuê bao đang được thay đổi. Đặt giá mới trong đối tượng RegionalBasePlanConfig theo đúng gói cơ bản trong bộ sưu tập basePlans của gói thuê bao. Điều này có thể rất hữu ích nếu bạn có một danh mục lớn và cần cập nhật tất cả các sản phẩm trong thời gian ngắn hoặc nếu bạn có hệ thống quản lý danh mục sản phẩm để tự động thực hiện các thay đổi đối với sản phẩm thuê bao của Google Play Billing khi có thay đổi.

Để thay đổi giá gói cơ bản trong Play Console, vui lòng tham khảo Trung tâm trợ giúp của Play Console.

Chấm dứt một nhóm thuần tập theo giá cũ

Việc chấm dứt một nhóm thuần tập theo giá cũ sẽ chuyển người dùng đang trả theo mức giá cũ của gói cơ bản tự động gia hạn sang mức giá của gói cơ bản hiện tại. Để chấm dứt một mức giá cũ trong Play Console, hãy tham khảo Trung tâm trợ giúp của Play Console.

Chấm dứt nhóm thuần tập theo giá cũ bằng API Nhà phát triển Google Play

Để chấm dứt một nhóm thuần tập theo giá cũ bằng phương thức lập trình, hãy sử dụng phương thức monetization.subscriptions.basePlans.migratePrices. Phương thức này sẽ di chuyển những người đăng ký đang nhận mức giá thuê bao trước đây sang giá gói cơ bản hiện tại của khu vực đã chỉ định. Phương thức này sẽ kích hoạt việc gửi thông báo về thay đổi giá cho những người dùng hiện đang nhận mức giá cũ trước thời điểm được cung cấp. Những người đăng ký không đồng ý với mức giá mới sẽ bị chấm dứt gói thuê bao vào lần gia hạn tiếp theo.

Thời điểm thay đổi về giá có hiệu lực

Khi bạn chấm dứt một nhóm thuần tập theo giá cũ, quá trình di chuyển những người dùng này sang giá gói cơ bản hiện tại sẽ bắt đầu. Play sẽ thông báo cho những người dùng này về việc thay đổi sắp tới về giá, dù là tăng giá hay giảm giá.

Giảm giá

Nếu giá gói cơ bản hiện tại thấp hơn, Play sẽ thông báo cho người dùng qua email. Trước tiên, người dùng sẽ thanh toán theo giá gói cơ bản thấp hơn vào ngày gia hạn tiếp theo.

Tăng giá

Nếu giá gói cơ bản hiện tại cao hơn, Play sẽ thông báo cho người dùng qua email và thông báo đẩy, đồng thời người dùng sẽ bị tính giá cao hơn vào ngày gia hạn đầu tiên sau khoảng thời gian thông báo trước 37 ngày: 7 ngày đầu tiên của giai đoạn chờ và 30 ngày kể từ khi có thể bắt đầu gửi thông báo cho người dùng.

Người dùng phải đồng ý với mức giá cao hơn trong khoảng thời gian thông báo trước trên Cửa hàng Play trước lần tính phí đầu tiên theo giá mới, nếu không thì Play sẽ tự động huỷ gói thuê bao. Play sẽ thông báo cho người dùng qua email và thông báo đẩy 1 ngày và 30 ngày trước lần tính phí đầu tiên.

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 đăng ký hiện tại mỗi khi thay đổi giá của gói cơ bản hoặc chấm dứt nhóm thuần tập theo giá cũ của họ. Đối với trường hợp tăng giá, bạn nên thông báo trước cho người dùng và cho biết rằng họ cần chấp nhận việc tăng giá.

Khi tăng giá gói thuê bao, bạn có ít nhất 7 ngày sau khi chấm dứt một nhóm thuần tập cũ để thông báo cho những người đăng ký hiện tại về việc thay đổi giá trước khi Google Play bắt đầu thông báo trực tiếp cho họ. Trong thời gian này, bạn có thể huỷ yêu cầu tăng giá đang chờ xử lý một cách hiệu quả bằng cách thực hiện thay đổi khác về giá gốc. Bạn cũng có thể thông báo cho những người dùng bị ảnh hưởng trước khi Google Play làm điều này.

Trong ứng dụng của mình, bạn 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 đến màn hình gói thuê bao của Cửa hàng Play để giúp họ dễ dàng chấp nhận mức giá mới.

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

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.

Ví dụ

Ví dụ 1 (gói thuê bao hằng tháng): Vào ngày 3/3, SuperStreamz tăng giá gói thuê bao xem trực tuyến video cao cấp SuperStreamz Pro bằng cách chấm dứt một nhóm thuần tập theo giá cũ. Họ chuyển người dùng trong nhóm thuần tập theo giá cũ từ 1 USD sang giá gói thuê bao cơ bản hiện tại là 2 USD. Lần thay đổi giá này có hiệu lực từ ngày 9/4 (37 ngày sau ngày 3/3).

  • Alice là người đăng ký hiện tại. Lần gia hạn tiếp theo của cô là vào ngày 5/3. Lần gia hạn đầu tiên sau ngày có hiệu lực là vào ngày 5/5. Vì vậy, cô sẽ gia hạn vào ngày 5/3 và ngày 5/4 theo mức giá cũ (1 USD). Khi gia hạn lại vào ngày 5/5, cô phải trả mức giá mới (2 USD). Google Play bắt đầu thông báo cho Alice về việc thay đổi giá vào ngày 5/4, tức là 30 ngày trước ngày gia hạn đầu tiên với mức giá mới.
Biểu đồ tiến trình thay đổi giá chung của gói thuê bao hằng tháng có ngày gia hạn là ngày 5/3
Hình 14. Ví dụ về biểu đồ tiến trình thay đổi giá của gói thuê bao hằng tháng có ngày gia hạn là ngày 5/3.
  • Bob là người đăng ký hiện tại. Lần gia hạn tiếp theo của anh là vào ngày 29/3. Anh gia hạn vào ngày 29/3 theo mức giá cũ (1 USD) vì thay đổi về giá chưa có hiệu lực. Khi gia hạn lại vào ngày 29/4, anh sẽ phải trả mức giá mới (2 USD). Anh bắt đầu nhận được thông báo về việc thay đổi giá vào ngày 30/3, tức là 30 ngày trước ngày gia hạn đầu tiên với mức giá mới.
Biểu đồ tiến trình thay đổi giá chung của gói thuê bao hằng tháng có ngày gia hạn là ngày 29/3
Hình 15. Ví dụ về biểu đồ tiến trình thay đổi giá của gói thuê bao hằng tháng có ngày gia hạn là ngày 29/3.

Ví dụ 2 (gói thuê bao 3 tháng): Vào ngày 3/3, FindMyLove kết thúc một nhóm thuần tập theo giá cũ và tăng phí 3 tháng cho gói FindMyLove Premium từ 1 USD lên giá gói thuê bao cơ bản là 2 USD. Lần thay đổi giá này có hiệu lực từ ngày 9/4 (37 ngày sau ngày 3/3).

  • Alice là người đăng ký hiện tại. Lần gia hạn tiếp theo của cô là vào ngày 5/3. Alice gia hạn theo mức giá cũ (1 USD) vì thay đổi về giá chưa có hiệu lực. Khi gia hạn lại vào ngày 5/6, cô phải trả mức giá mới (2 USD). Cô bắt đầu nhận được thông báo về việc thay đổi giá vào ngày 6/5, tức là 30 ngày trước ngày gia hạn đầu tiên theo mức giá mới.
Biểu đồ tiến trình thay đổi giá chung của gói thuê bao 3 tháng có ngày gia hạn là ngày 5/3
Hình 16. Ví dụ về biểu đồ tiến trình thay đổi giá của gói thuê bao 3 tháng có ngày gia hạn là ngày 5/3.
  • Bob là người đăng ký hiện tại. Lần gia hạn tiếp theo của anh là vào ngày 11/4. Bob gia hạn theo mức giá mới (2 USD) vì thời điểm đó là sau ngày có hiệu lực. Anh bắt đầu nhận được thông báo về việc thay đổi giá vào ngày 12/3, tức là 30 ngày trước ngày gia hạn đầu tiên theo mức giá mới.
Sơ đồ tiến trình thay đổi giá chung của gói thuê bao 3 tháng có ngày gia hạn là ngày 11/4
Hình 17. Ví dụ về biểu đồ tiến trình thay đổi giá của gói thuê bao 3 tháng có ngày gia hạn là ngày 11/4.

Ví dụ 3 (gói thuê bao hằng tuần): Vào ngày 3/3, CutePetsNews chấm dứt một nhóm thuần tập theo giá cũ, thay đổi phí hằng tuần cho gói Weekly Dog Alerts từ 1 USD lên 2 USD. Lần thay đổi giá này có hiệu lực từ ngày 9/4.

  • Alice là người đăng ký hiện tại. Lần gia hạn hằng tuần tiếp theo của cô là vào ngày 6/3. Cô gia hạn vào các ngày 6/3, 13/3, 20/3, 27/3 và 3/4 theo mức giá cũ (1 USD) vì thay đổi về giá chưa có hiệu lực. Khi gia hạn lại vào ngày 10/4, cô sẽ phải trả mức giá mới (2 USD). Cô bắt đầu nhận được thông báo về việc thay đổi giá vào ngày 11/3, tức là 30 ngày trước ngày gia hạn đầu tiên theo mức giá mới.
Biểu đồ tiến trình thay đổi giá chung của gói thuê bao hằng tuần có ngày gia hạn là ngày 6/4
Hình 18. Ví dụ về biểu đồ tiến trình thay đổi giá của gói thuê bao hằng tuần có ngày gia hạn là ngày 6/4.

Ví dụ 4 (gói thuê bao hằng tháng, nhiều lần thay đổi giá): Ví dụ này cho thấy cách xử lý nhiều lần thay đổi giá.

Vào ngày 3/3, SuperStreamz kích hoạt quá trình thay đổi giá cho gói thuê bao xem trực tuyến video cao cấp SuperStreamz Pro, tăng giá từ 1 USD/tháng lên 2 USD/tháng. Vào ngày 10/3, nhà phát triển kích hoạt quá trình thay đổi giá thứ hai, tăng giá lên 3 USD/tháng.

Lần thay đổi giá đầu tiên có hiệu lực từ ngày 9/4 (37 ngày sau ngày 3/3). Lần thay đổi giá thứ hai có hiệu lực từ ngày 16/4 (37 ngày sau ngày 10/3).

  • Lần gia hạn tiếp theo của Alice là vào ngày 5/3. Lần gia hạn đầu tiên sau ngày có hiệu lực là vào ngày 5/5. Vì vậy, cô sẽ gia hạn vào ngày 5/3 và ngày 5/4 theo mức giá cũ (1 USD). Khi gia hạn lại vào ngày 5/5, cô phải trả mức giá mới (2 USD). Cô chỉ nhận được thông báo về lần thay đổi giá thứ hai vì giá thay đổi trong khoảng thời gian vô hiệu 7 ngày. Cô bắt đầu nhận được thông báo về việc thay đổi giá vào ngày 5/4, tức là 30 ngày trước ngày gia hạn đầu tiên với giá mới.
Biểu đồ tiến trình thay đổi giá chung của gói thuê bao hằng tháng có nhiều lần thay đổi giá
Hình 19. Ví dụ về biểu đồ tiến trình thay đổi giá của gói thuê bao hằng tháng, trong đó có nhiều lần thay đổi giá và ngày gia hạn là ngày 5/3.

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

Nếu người dùng chấp nhận mức tăng giá của gói thuê bao, thì bạn sẽ nhận được SubscriptionNotification thuộc loại SUBSCRIPTION_PRICE_CHANGED_CONFIRMED. Với mức giảm giá ở chế độ người dùng chọn không áp dụng hoặc khi gia hạn tăng giá gói thuê bao, bạn sẽ nhận được SubscriptionNotification thuộc loại SUBSCRIPTION_RENEWED. Bạn nên xử lý thông báo này giống như mọi lần gia hạn khác.

Xử lý khi người dùng 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 cần gia hạn theo mức giá cao hơn, thì họ sẽ tự động bị huỷ đăng ký và bạn sẽ nhận được SubscriptionNotification thuộc 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à bạn huỷ bỏ giá đó trong vòng 7 ngày, những người đăng ký 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. Xin lưu ý rằng những người đăng ký mới có thể sẽ nhận được mức giá nhầm lẫn trong khoảng thời gian từ lần 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 thay đổi giá của gói thuê bao 2 lần trong khoảng thời gian 7 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. Ví dụ: Nếu bạn đã chấm dứt một nhóm thuần tập theo giá cũ khi tăng giá, sau đó thay đổi giá lần nữa, thì mọi người dùng đủ điều kiện không cần phản hồi lần thay đổi giá đầu tiên nữa, vì giờ chỉ có lần thay đổi giá thứ hai được áp dụng.

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á của người dùng cho mục đích kiểm thử.

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 ân 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 ân hạn, nếu tính năng này được bật. Trong thời gian ân 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 ân 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 ân 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 ân 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 đề về 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 20. 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.
                }
            }
        });