Lưu ý: Kể từ ngày 2/8/2023, tất cả các ứng dụng mới phải sử dụng Thư viện Billing phiên bản 5 trở lên. Chậm nhất vào ngày 1/11/2023, tất cả các bản cập nhật cho ứng dụng hiện có đều phải sử dụng Thư viện Billing phiên bản 5 trở lên. Tìm hiểu thêm.

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 trình bày 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.

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.

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.

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.
                }
            }
        });