Giới thiệu về các 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 cho biết đó 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ế độ thay thế 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 giao dịch 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:

  • Mã đơn 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.

Tích hợp gói thuê bao trả góp

Gói thuê bao trả góp là một loại gói thuê bao mà người dùng trả phí theo nhiều lần trong một khoảng thời gian, thay vì trả toàn bộ phí thuê bao trước.

Những điểm khác cần cân nhắc đối với gói thuê bao trả góp:

  • Phạm vi cung cấp theo quốc gia: Tính năng gói thuê bao trả góp chỉ có ở Brazil, Pháp, Ý và Tây Ban Nha (hãy kiểm tra Console để biết phạm vi cung cấp mới nhất).
  • Đặt giá: Khi bạn đặt giá cho gói thuê bao trả góp trên Console, giá này sẽ thể hiện số tiền thanh toán hằng tháng. Thông tin này, kết hợp với khoảng thời gian cam kết đã đặt, sẽ tạo ra tổng số tiền cho gói thuê bao trong màn hình mua hàng.
  • Thời hạn cam kết: Tổng thời hạn cam kết của gói thuê bao ban đầu, trong đó bạn phải thanh toán hằng tháng. Ví dụ: nếu một gói cơ bản có thời hạn cam kết là 15 tháng, thì người dùng sẽ thanh toán 15 lần hằng tháng trong khoảng thời gian này.
  • Gia hạn: Trong bối cảnh gói thuê bao trả góp, "gia hạn" có nghĩa là kết thúc một khoảng thời gian cam kết, có thể là khoảng thời gian cam kết ban đầu hoặc khoảng thời gian cam kết tiếp theo. Sau khi đăng ký lần đầu, lần gia hạn đầu tiên sẽ diễn ra sau khi hoàn tất toàn bộ thời hạn cam kết ban đầu. Các lần gia hạn tiếp theo sẽ diễn ra sau khi mỗi khoảng thời gian cam kết tiếp theo được thực hiện. Loại hình gia hạn cho gói thuê bao trả góp có thể là "tự động gia hạn hằng tháng" hoặc "tự động gia hạn trong cùng thời hạn". Đối với lựa chọn "tự động gia hạn hằng tháng", bạn không có nghĩa vụ nào sau đó và gói này hoạt động như một gói thuê bao hằng tháng, trong đó mỗi khoản phí thuê bao hằng tháng đều là một lần gia hạn.
  • Kỳ thanh toán: Trong bối cảnh gói thuê bao trả góp, kỳ thanh toán đề cập đến khoảng thời gian định kỳ mà các khoản thanh toán riêng lẻ được thực hiện, như được chỉ định trong gói cơ bản.
  • Thay đổi gói so với thay đổi giá: Đối với các thay đổi về giá và việc huỷ, cam kết là chắc chắn. Điều này có nghĩa là nếu người dùng muốn huỷ hoặc nhà phát triển muốn thay đổi giá, thì thay đổi đó sẽ có hiệu lực khi một kỳ cam kết kết thúc. Đối với các thay đổi về kế hoạch, cam kết không chắc chắn. Điều này có nghĩa là bạn không phải đợi đến khi kết thúc thời hạn cam kết để thay đổi gói, mà thay đổi sẽ có hiệu lực ngay lập tức hoặc vào ngày thanh toán tiếp theo dựa trên chế độ thay thế đã đặt.
  • Thay đổi gói trong cùng một gói thuê bao: Không cho phép thay đổi gói từ gói cơ bản trả góp sang gói cơ bản không trả góp của cùng một sản phẩm thuê bao.
  • Thông báo theo thời gian thực dành cho nhà phát triển (RTDN): Thông báo theo thời gian thực dành cho nhà phát triển SUBSCRIPTION_CANCELLATION_SCHEDULED sẽ được gửi ngay khi người dùng huỷ gói thuê bao khi vẫn còn khoản thanh toán cho khoảng thời gian cam kết. Yêu cầu huỷ đang chờ xử lý và sẽ chỉ có hiệu lực khi kết thúc thời hạn cam kết. Sau đó, nếu người dùng không khôi phục, thì RTDN SUBSCRIPTION_CANCELEDSUBSCRIPTION_EXPIRED sẽ được gửi vào cuối thời gian cam kết.

  • Thanh toán / Thuê bao thực hiện: Các khoản thanh toán cho nhà phát triển sẽ diễn ra khi người dùng thanh toán hằng tháng, tuân theo các điều khoản giống như tất cả các gói thuê bao khác. Nhà phát triển không được trả trước khi người dùng đăng ký gói thuê bao trả góp.

  • Thu thập khoản thanh toán bị bỏ lỡ: Nếu người dùng không thanh toán được bất kỳ khoản thanh toán gói thuê bao trả góp nào, thì Google và Nhà phát triển sẽ không cố gắng thu thập bất kỳ khoản thanh toán bị bỏ lỡ hoặc chưa thanh toán nào của người dùng, ngoại trừ việc Google có thể định kỳ thử thanh toán lại trong bất kỳ Thời gian gia hạn hoặc Thời gian tạm ngưng tài khoản nào hiện hành theo các phương pháp thử thanh toán lại thông thường của Google. Google sẽ không chịu trách nhiệm với Nhà phát triển đối với mọi khoản thanh toán trả góp còn lại chưa thanh toán.

  • Phạm vi cung cấp Thư viện Play Billing: Trường installmentDetails chỉ có trong PBL 7 trở lên. Đối với PBL 5 trở lên, gói thuê bao trả góp sẽ được trả về bằng queryProductDetails(), nhưng gói thuê bao sẽ không bao gồm thông tin chi tiết về khoản trả góp như số lượt thanh toán đã cam kết của gói.

Dùng đường liên kết sâu để cho phép người dùng 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 để cho phép người dùng quản lý gói thuê bao của họ. Bạn có thể kết hợp đường liên kết này vào giao diện tự nhiên của ứng dụng.

Bạn có thể bao gồm một đường liên kết sâu từ ứng dụng của mình đến trung tâm thuê bao của Google Play đối với các gói thuê bao chưa hết hạn. Bạn có thể xác định các gói thuê bao này bằng cách sử dụng trường subscriptionState của tài nguyên gói thuê bao. Từ đó, bạn có thể liên kết sâu đến trung tâm thuê bao trong ứng dụng Cửa hàng Google Play theo một số cách.

Sử dụng URL sau để chuyển hướng người dùng đến trang hiển thị tất cả các gói thuê bao của họ, như trong hình 1 và 2:

https://play.google.com/store/account/subscriptions
Màn hình Gói thuê bao trên Cửa hàng Play cho biết trạng thái của mọi gói thuê bao được thanh toán qua Google Play của người dùng.
Hình 1. Màn hình Gói thuê bao trên Cửa hàng Play cho biết trạng thái của mọi gói thuê bao được thanh toán qua Google Play của người dùng.


Nhấn vào một gói thuê bao để xem thêm thông tin chi tiết.
Hình 2. Nhấn vào một gói thuê bao để xem thêm thông tin chi tiết.

Đường liên kết sâu này có thể hữu ích trong việc giúp người dùng khôi phục một gói thuê bao đã huỷ từ trung tâm thuê bao trong ứng dụng Cửa hàng Play.

Để liên kết trực tiếp đến trang quản lý của một gói thuê bao chưa hết hạn, hãy cho biết tên gói và productId liên kết với gói thuê bao đã mua. Để 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 máy chủ phụ trợ của ứng dụng hoặc gọi BillingClient.queryPurchasesAsync() để 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ể. Mỗi gói thuê bao sẽ chứa productId tương ứng trong thông tin trạng thái của gói thuê bao. Mỗi đối tượng SubscriptionPurchaseLineItem liên kết với một giao dịch mua gói thuê bao chứa giá trị productId liên kết với gói thuê bao mà người dùng đã mua trong mục hàng đó.

Sử dụng URL sau để chuyển hướng người dùng đến một màn hình quản lý gói thuê bao cụ thể, thay thế "your-sub-product-id" và "your-app-package" bằng productId và tên gói ứng dụng tương ứng:

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

Sau đó, người dùng có thể quản lý các phương thức thanh toán và sử dụng các tính năng bao gồm huỷ, đăng ký lại và tạm dừng.

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 nhiều tuỳ chọn thay đổi gói thuê bao cho những người đăng ký hiện tại để phù hợp hơn với nhu cầu của họ:

  • Nếu bán nhiều cấp thuê bao, chẳng hạn như gói thuê bao "cơ bản" và "cao cấp", thì bạn có thể cho phép người dùng chuyển đổi giữa các cấp bằng cách mua gói ưu đãi hoặc gói cơ bản của một gói thuê bao khác.
  • Bạn có thể cho phép người dùng thay đổi kỳ thanh toán hiện tại, chẳng hạn như chuyển từ gói hằng tháng sang gói hằng năm.
  • Bạn cũng có thể cho phép người dùng chuyển đổi giữa gói tự động gia hạn và gói trả trước.

Bạn có thể khuyến khích người dùng thực hiện bất kỳ thay đổi nào trong số này bằng cách cung cấp các gói ưu đãi để giảm giá cho người dùng đủ điều kiện. Ví dụ: bạn có thể tạo một ưu đãi giảm giá 50% cho năm đầu tiên khi chuyển từ gói hằng tháng sang gói hằng năm và chỉ dành cho những người dùng đã đăng ký gói hằng tháng mà chưa mua gói ưu đãi này. Bạn có thể xem thêm thông tin về điều kiện áp dụng ưu đãi trong Trung tâm trợ giúp

Hình 3 là một ứng dụng mẫu có 3 gói khác nhau:

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

Ứng dụng của bạn có thể hiển thị một màn hình tương tự như hình 3 để đưa ra cho người dùng các lựa chọn thay đổi gói thuê bao. Trong mọi trường hợp, người dùng phải biết rõ thông tin về gói thuê bao họ đang dùng và những lựa chọn khi họ thay đổi gói đó.

Khi người dùng quyết định nâng cấp, hạ cấp hoặc thay đổi gói thuê bao, bạn sẽ chỉ định một chế độ thay thế giúp xác định cách áp dụng giá trị chia theo tỷ lệ của kỳ thanh toán đã trả hiện tại và thời điểm diễn ra bất kỳ thay đổi nào về quyền.

Chế độ thay thế

Bảng sau đây liệt kê các chế độ thay thế hiện có và ví dụ về cách sử dụng, cũng như số lượng khoản thanh toán được coi là đã thanh toán.

Chế độ thay thế

Mô tả

Ví dụ về cách sử dụng

Các khoản thanh toán đã cam kết được ghi nhận là đã thanh toán (Đối với việc thay thế gói thuê bao trả góp)

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.

Nâng cấp lên một cấp đắt tiền hơn mà không phải thanh toán khoản tăng thêm ngay lập tức.

0

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.

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.

Nâng cấp lên một cấp đắt tiền hơn mà không thay đổi ngày thanh toán.

1

CHARGE_FULL_PRICE

Gói thuê bao được nâng cấp hoặc hạ cấp tức thì và hệ thống sẽ tính phí người dùng ở mức giá đầy đủ đối với quyền 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 mức quyền tương tự hoặc sẽ chia thời gian theo tỷ lệ khi chuyển sang một quyền khác.

Lưu ý: Nếu gói thuê bao mới có ưu đãi dùng thử miễn phí hoặc ưu đãi cho người dùng mới, thì người dùng sẽ bị tính phí 0 USD hoặc giá của ưu đãi cho người dùng mới (tuỳ theo trường hợp áp dụng) tại thời điểm nâng cấp hoặc hạ cấp.

Nâng cấp từ kỳ thanh toán ngắn hơn lên kỳ thanh toán dài hơn.

1 (Lưu ý: 0 nếu gói thuê bao mới có thời gian dùng thử miễn phí.)

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.

Nâng cấp lên một cấp thuê bao cao hơn mà vẫn được hưởng khoảng thời gian miễn phí còn lại.

0

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 đó. Tuy nhiên, giao dịch mua mới sẽ diễn ra ngay lập tức với hai mục sau:

  • Mục hiện có đã tắt tính năng tự động gia hạn và thời gian hết hạn được đặt thành cuối chu kỳ thanh toán hiện tại.
  • Quyền mới bắt đầu sau khi mặt hàng hiện tại hết hạn. Bạn có thể cho phép người dùng thực hiện các thay đổi khác nếu họ muốn. Ví dụ: người dùng có thể quay về gói ban đầu hoặc bắt đầu một thay đổi mới bị trì hoãn của gói.

Lưu ý: Đối với gói thuê bao trả góp, thay đổi về gói sẽ diễn ra vào đầu ngày thanh toán tiếp theo.

Hạ cấp xuống cấp ít tiền hơn.

1

Để tìm hiểu thêm về cách áp dụng các ưu đãi nâng cấp hoặc hạ cấp nhằm bán thêm hoặc thu hút người dùng đăng ký lại, hãy đọc hướng dẫn về ưu đãi và chương trình khuyến mãi.

Đặt chế độ thay thế cho một giao dịch mua

Bạn có thể dùng nhiều chế độ thay thế cho các loại chuyển đổi gói thuê bao, dựa trên những lựa chọn ưu tiên và logic kinh doanh của bạn. Phần này giải thích cách thiết lập chế độ thay thế cho một thay đổi trong gói thuê bao và các giới hạn áp dụng.

Đăng ký lại hoặc chuyển đổi gói trong cùng một gói thuê bao

Bạn có thể chỉ định một chế độ thay thế mặc định trong Google Play Console. Chế độ cài đặt này cho phép bạn chọn thời điểm tính phí người đăng ký hiện tại nếu họ mua một ưu đãi hoặc gói cơ bản khác của cùng một gói thuê bao hay đăng ký lại sau khi huỷ. Các lựa chọn có sẵn là Tính phí ngay, tương đương với CHARGE_FULL_PRICETính phí vào ngày thanh toán tiếp theo, tương đương với WITHOUT_PRORATION. Đây là các chế độ thay thế chỉ phù hợp khi chuyển đổi giữa các gói cơ bản trong cùng một gói thuê bao.

Ví dụ: nếu bạn đang triển khai một ưu đãi thu hút người dùng đăng ký lại cho cùng một gói sau khi người dùng huỷ nhưng trước khi gói thuê bao đó kết thúc, thì bạn có thể xử lý giao dịch mua mới như một giao dịch thông thường mà không cần cho biết bất kỳ giá trị nào trong SubscriptionUpdateParams. Hệ thống sẽ sử dụng chế độ thay thế mặc định mà bạn đã định cấu hình trong gói thuê bao và tự động xử lý quá trình chuyển đổi gói từ giao dịch mua cũ sang giao dịch mua mới.

Chuyển đổi gói giữa các gói thuê bao hoặc ghi đè chế độ thay thế mặc định

Nếu người dùng thay đổi sản phẩm thuê bao (mua một gói thuê bao khác) hoặc nếu bạn muốn ghi đè chế độ thay thế mặc định vì bất kỳ lý do nào, thì bạn sẽ chỉ định mức tỷ lệ tại thời gian chạy trong các tham số của quy trình mua.

Để cung cấp chính xác SubscriptionUpdateParams trong cấu hình quy trình mua tại thời gian chạy, hãy lưu ý các hạn chế sau:

  • Khi nâng cấp, hạ cấp hoặc chuyển đổi sang gói trả trước từ gói trả trước, gói tự động gia hạn hoặc gói trả góp trong cùng một gói thuê bao, thì bạn chỉ được chỉ định chế độ thay thế là CHARGE_FULL_PRICE. Nếu bạn chỉ định bất kỳ chế độ thay thế nào khác, thì giao dịch mua sẽ không thành công và người dùng sẽ nhìn thấy thông báo lỗi.
  • Khi chuyển đổi từ một gói tự động gia hạn hoặc gói trả trước sang gói tự động gia hạn trong cùng một gói thuê bao, thì các chế độ chia theo tỷ lệ hợp lệ sẽ là CHARGE_FULL_PRICEWITHOUT_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à người dùng sẽ nhìn thấy thông báo lỗi.
  • Không được phép chuyển đổi gói trong cùng một sản phẩm thuê bao từ gói cơ bản trả góp sang gói cơ bản không trả góp.

Các hành vi và ví dụ về chế độ thay thế

Để 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 có mua một gói thuê bao cho nội dung trực tuyến trên ứng dụng Country Gardener. Gói thuê bao mà anh đang dùng là gói theo tháng với phiên bản nội dung Cấp 1 chỉ có văn bản. Phí thuê bao là 2 USD/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 các nội dung video cập nhật 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:

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 lại 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 đó.

Bạn nên gọi PurchasesUpdatedListener của ứng dụng ngay khi giao dịch mua thành công và bạn có thể truy xuất giao dịch mua mới đó trong lệnh gọi queryPurchasesAsync(). Máy chủ phụ trợ của bạn sẽ ngay lập tức nhận được một Thông báo theo thời gian thực dành cho nhà phát triển SUBSCRIPTION_PURCHASED.

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 USD cho cấp thuê bao mới và sẽ tính thêm 36 USD vào ngày 1 tháng 5 của mỗi năm sau đó.

Bạn nên gọi PurchasesUpdatedListener của ứng dụng ngay khi giao dịch mua thành công và bạn có thể truy xuất giao dịch mua mới đó trong lệnh gọi queryPurchasesAsync(). Máy chủ phụ trợ của bạn sẽ ngay lập tức nhận được một Thông báo theo thời gian thực dành cho nhà phát triển SUBSCRIPTION_PURCHASED.

WITHOUT_PRORATION

Hệ thống sẽ nâng cấp gói thuê bao Cấp 1 của Samwise lên Cấp 2 ngay lập tức mà không tính thêm phí và vào ngày 1 tháng 5, anh sẽ phải trả phí 36 USD cho cấp thuê bao mới và cứ thế trả 36 USD vào ngày 1 tháng 5 của mỗi năm sau đó.

Bạn nên gọi PurchasesUpdatedListener của ứng dụng ngay khi giao dịch mua thành công và bạn có thể truy xuất giao dịch mua mới đó trong lệnh gọi queryPurchasesAsync(). Máy chủ phụ trợ của bạn sẽ ngay lập tức nhận được một Thông báo theo thời gian thực dành cho nhà phát triển SUBSCRIPTION_PURCHASED.

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 sẽ có hiệu lực và hệ thống sẽ tính phí Samwise 36 USD cho cấp thuê bao mới.

Bạn nên gọi PurchasesUpdatedListener của ứng dụng ngay khi giao dịch mua thành công và bạn có thể truy xuất giao dịch mua mới đó trong lệnh gọi queryPurchasesAsync(). Máy chủ phụ trợ của bạn sẽ ngay lập tức nhận được một Thông báo theo thời gian thực dành cho nhà phát triển SUBSCRIPTION_PURCHASED. Bạn nên xử lý giao dịch mua theo cách tương tự như mọi giao dịch mua mới khác tại thời điểm đó. Cụ thể, hãy đảm bảo bạn xác nhận giao dịch mua mới. Xin lưu ý rằng startTime của gói thuê bao mới được điền tại thời điểm thay thế có hiệu lực, xảy ra khi gói thuê bao cũ hết hạn. Khi đó, bạn sẽ nhận được RTDN SUBSCRIPTION_RENEWED cho gói thuê bao mới. Hãy đọc thêm về hành vi của ReplacementMode.DEFERRED trong bài viết Xử lý yêu cầu thay thế bị hoãn.

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 vậy, 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í anh là 36 USD cho mỗi năm tiếp theo.

Khi chọn chế độ chia theo tỷ lệ, hãy nhớ xem các đề xuất cho chế độ thay thế của chúng tôi.

Kích hoạt các thay đổi về gói thuê bao trong ứng dụng

Ứng dụng của bạn có thể cung cấp cho người dùng lựa chọn 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ế độ thay thế sẽ sử dụng, như trong ví dụ sau:

Kotlin

val offerToken = productDetails
        .getSubscriptionOfferDetails(selectedOfferIndex)
        .getOfferToken()

val billingParams = BillingFlowParams.newBuilder().setProductDetailsParamsList(
       listOf(
           BillingFlowParams.ProductDetailsParams.newBuilder()
               .setProductDetails(productDetails)
               .setOfferToken(offerToken)
               .build()
       )
       ).setSubscriptionUpdateParams(
           BillingFlowParams.SubscriptionUpdateParams.newBuilder()
               .setOldPurchaseToken("old_purchase_token")
               .setSubscriptionReplacementMode(
                 BillingFlowParams.ReplacementMode.CHARGE_FULL_PRICE
               )
               .build()
       ).build()

billingClient.launchBillingFlow(
    activity,
    billingParams
   )
// ...

Java

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
            .setOldPurchaseToken("old_purchase_token")
            .setSubscriptionReplacementMode(ReplacementMode.CHARGE_FULL_PRICE)
            .build())
    .build();

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

Các đề xuất cho chế độ thay thế

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

Trường hợp Chế độ thay thế đề xuất Kết quả
Nâng cấp lên một lớp đắt hơn 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 cấp ít tiền 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.
Nâng cấp khi dùng thử miễn phí, giữ thời gian dùng thử 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í 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.

Xử lý giao dịch mua thay đổi gói thuê bao

Khi có các thay đổi về gói sẽ hình thành nên các giao dịch mua mới bất kể kỳ hạn và mục đích. Các thay đổi đó phải được xử lý và xác nhận giống như sau khi quy trình thanh toán hoàn tất thành công. Ngoài việc xử lý giao dịch mua mới một cách phù hợp, bạn phải gỡ bỏ giao dịch mua đang được thay thế.

Hành vi trong ứng dụng tương tự đối với mọi giao dịch mua mới. Ứng dụng của bạn nhận được kết quả của giao dịch mua mới trong PurchasesUpdatedListener và giao dịch mua mới sẽ có trong queryPurchasesAsync.

API Nhà phát triển Google Play sẽ trả về một linkedPurchaseToken trong tài nguyên gói thuê bao khi một giao dịch mua thay thế cho giao dịch hiện có. 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.

Khi bạn nhận được mã thông báo giao dịch mua mới, hãy thực hiện quy trình xác minh tương tự như khi xác minh một 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 bằng BillingClient.acknowledgePurchase() trong Thư viện Google Play Billing hoặc bằng Purchases.subscriptions:acknowledge trong API Nhà phát triển Google Play.

Xử lý chế độ thay thế bị hoãn

Với chế độ thay thế bị hoãn, bạn có thể để người dùng sử dụng hết quyền còn lại trong gói cũ của họ trước khi bắt đầu dùng gói mới.

Khi bạn sử dụng ReplacementMode.DEFERRED cho một giao dịch mua mới, queryPurchasesAsync() sẽ trả về mã thông báo giao dịch mua mới sau khi quy trình mua diễn ra. Mã này vẫn được liên kết với sản phẩm cũ cho đến khi yêu cầu thay thế bị hoãn diễn ra vào ngày gia hạn tiếp theo, sau ngày đó sản phẩm mới sẽ được trả về.

Trước đây, bạn có thể có được trải nghiệm người dùng này bằng ProrationMode.DEFERRED nhưng hiện ProrationMode.DEFERRED không còn được dùng với Thư viện Play Billing 6. Hãy xem bảng sau đây để tìm hiểu những điểm khác biệt về hành vi:

Thời gian

ProrationMode.DEFERRED (không dùng nữa)

ReplacementMode.DEFERRED

Ngay sau khi quy trình mua thành công (ứng dụng)

PurchasesUpdatedListener được gọi sau khi giao dịch mua có trạng thái nâng cấp hay hạ cấp là thành công.

Quyền đối với gói cũ sẽ tiếp tục cho đến ngày gia hạn tiếp theo. Để đảm bảo ứng dụng cấp quyền phù hợp, queryPurchasesAsync() sẽ trả về một đối tượng Mua có mã thông báo giao dịch mua gốc và quyền gốc cho đến khi việc thay thế diễn ra.

Mã thông báo giao dịch mua mới không xuất hiện, vì vậy, không thể xử lý mã vào thời điểm này.

PurchasesUpdatedListener được gọi sau khi giao dịch mua có trạng thái nâng cấp hay hạ cấp là thành công.

queryPurchasesAsync() sẽ ngay lập tức trả lại giao dịch mua có mã thông báo giao dịch mua mớiquyền gốc liên kết với giao dịch mua đó.

Mã thông báo giao dịch mua mới sẽ xuất hiện, vì vậy, mã cần được xử lý tại thời điểm này, có cân nhắc đến thời điểm thay thế diễn ra.

Ngay sau khi quy trình mua thành công (máy chủ phụ trợ)

SUBSCRIPTION_PURCHASED RTDN không được gửi sau quy trình mua. Máy chủ phụ trợ chưa biết được về giao dịch mua mới.

SUBSCRIPTION_PURCHASED RTDN có product_id cũ được gửi ngay sau quy trình mua của mã thông báo giao dịch mua mới.

Việc gọi phương thức purchases.subscriptionsv2.get bằng mã thông báo giao dịch mua mới sẽ trả về một giao dịch mua có "startTime" cho biết thời gian mua với 2 mục riêng:

  • Một mục riêng thể hiện quyền và có "expiryTime" (thời gian hết hạn) trong tương lai. Quyền cũ sẽ không được gia hạn và có DeferredItemReplacement chứa sản phẩm của quyền mới. Điều này cho biết việc thay thế quyền cũ đang chờ xử lý sau khi quyền đó hết hạn.
  • Một mục riêng thể hiện quyền mới mua. Phương diện này chưa có giá trị nào được đặt cho "expiryTime".

SUBSCRIPTION_EXPIRED được gửi cho mã thông báo giao dịch mua . Khi gọi phương thức purchases.subscriptionsv2.get bằng mã thông báo giao dịch mua , phương thức này có vẻ như đã hết hạn (quyền của gói cũ được chuyển sang giao dịch mua mới trong thời gian còn lại).

Khi thay thế – lần gia hạn đầu tiên sau quy trình mua (ứng dụng)

queryPurchasesAsync() trả về một đối tượng Mua mới có quyền và mã thông báo giao dịch mua mới.

Mã thông báo giao dịch mua mới này đang xuất hiện, vì vậy cần được xử lý.

queryPurchasesAsync() sẽ ngay lập tức trả về giao dịch mua có mã thông báo giao dịch mua mớiquyền mới liên kết với giao dịch mua đó.

Giao dịch mua mới chắc hẳn đã được xử lý khi quy trình mua thành công nên ứng dụng không phải thực hiện bất kỳ hành động đặc biệt nào ngoài việc đảm bảo cấp đúng quyền.

Khi thay thế – lần gia hạn đầu tiên sau quy trình mua (máy chủ phụ trợ)

Giao dịch mua mới giờ đây có thể được xử lý và xác nhận khi SUBSCRIPTION_RENEWED RTDN đầu tiên được gửi.

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 máy chủ phụ trợ thuê bao (nếu có) cần được cập nhật quyền mới.

Giao dịch mua mới đã được xử lý và xác nhận khi gửi SUBSCRIPTION_PURCHASED RTDN cho mã thông báo giao dịch mua mới và được ghi lại dưới dạng "startTime".

Với ReplacementMode.DEFERRED, các lần gia hạn đầu tiên sẽ tuân theo hành vi tiêu chuẩn của mọi lần gia hạn khác và bạn không cần xử lý logic đặc biệt cho việc thay thế khi sự kiện này diễn ra.

Khi gọi phương thức purchases.subscriptionsv2.get bằng mã thông báo giao dịch mua mới, hệ thống sẽ trả về một giao dịch mua có 2 mục riêng:

  • Một mục riêng thể hiện quyền , có "expiryTime" (thời gian hết hạn) trong quá khứ và không có giá trị được đặt cho DeferredItemReplacement.
  • Một mục thể hiện quyền mới, có "expiryTime" (thời gian hết hạn) trong tương lai và cờ auto_renewing_enabled đang bật.

Từ giờ trở đi, bạn nên sử dụng ReplacementMode.DEFERRED thay vì ProrationMode.DEFERRED (không được dùng nữa), vì phương thức này biểu thị hành vi tương tự liên quan đến các thay đổi về quyền, nhưng cung cấp cách quản lý giao dịch mua nhất quán hơn với hành vi của các giao dịch mua mới khác.

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 chính 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 thu hút người dùng đăng ký lại), thì bạn có thể cung cấp một SKU khác cho người dùng:

  • 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ế độ thay thế WITHOUT_PRORATION.
  • Gói thuê bao mới sẽ thay thế gói thuê bao cũ và gia hạn vào chính 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 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 Đă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 yêu cầu huỷ này như mô tả trong phần Yêu cầu huỷ.
  • 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 yêu cầu 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 gia hạn gói thuê bao, thì Google sẽ định kỳ thử gia hạn gói thuê bao một thời gian trước khi huỷ. Thời gian khôi phục có thể bao gồm một thời gian ân hạn, sau đó là một thời gian tạm ngưng tài khoản. Trong thời gian này, Google gửi email và thông báo cho người dùng để nhắc 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 bạn định cấu hình gói thuê bao. Trong thời gian ân hạn, bạn cần đảm bảo người dùng vẫn được hưởng các quyền của gói thuê bao.

Sau khi kết thúc thời gian ân hạn, gói thuê bao sẽ chuyển sang thời gian tạm ngưng tài khoản. Trong thời gian tạm ngưng tài khoản, bạn cần đảm bảo người dùng sẽ không được hưởng các quyền của gói thuê bao.

Trong Google Play Console, bạn có thể chỉ định khoảng thời gian ân hạn và tạm ngưng tài khoản của từng gói cơ bản tự động gia hạn. Việc chỉ định thời lượng nhỏ hơn giá trị mặc định có thể làm giảm số lượng gói thuê bao khôi phục được sau khi bị từ chối thanh toán.

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

Xử lý các giao dịch đang chờ xử lý của gói thuê bao

Giao dịch đang chờ xử lý có thể xảy ra trong giao dịch mua ban đầu, nạp tiền, nâng cấp hoặc hạ cấp. Giao dịch mua gói thuê bao bắt đầu ở trạng thái SUBSCRIPTION_STATE_PENDING trước khi chuyển sang trạng thái SUBSCRIPTION_STATE_ACTIVE. Nếu giao dịch đã hết hạn hoặc bị người dùng huỷ, giao dịch đó sẽ chuyển đến SUBSCRIPTION_STATE_PENDING_PURCHASE_EXPIRED. Bạn phải và chỉ nên cập nhật quyền của người dùng sau khi giao dịch hoàn tất.

Việc thay đổi trạng thái gói thuê bao cho giao dịch mua ban đầu có giao dịch đang chờ xử lý rất đơn giản. Ứng dụng của bạn sẽ nhận được Purchase ở trạng thái PENDING khi người dùng bắt đầu một giao dịch đang chờ xử lý. Khi giao dịch hoàn tất, ứng dụng của bạn sẽ nhận lại Purchase với trạng thái được cập nhật thành PURCHASED. Thông báo SubscriptionNotification thuộc loại SUBSCRIPTION_PURCHASED sẽ được gửi đến máy khách RTDN. Làm theo quy trình thông thường để xác minh giao dịch mua, cấp cho người dùng quyền truy cập vào nội dung và xác nhận giao dịch mua. Nếu giao dịch hết hạn hoặc bị huỷ, thông báo SubscriptionNotification thuộc loại SUBSCRIPTION_PENDING_PURCHASE_CANCELED sẽ được gửi đến ứng dụng RTDN của bạn. Trong những trường hợp như vậy, người dùng không bao giờ được cấp quyền truy cập vào nội dung.

Việc nạp tiền, nâng cấp hoặc hạ cấp với các giao dịch đang chờ xử lý sẽ làm thay đổi trạng thái của cả gói thuê bao cũ và mới. Khi người dùng bắt đầu một giao dịch nạp tiền, nâng cấp hoặc hạ cấp đang chờ xử lý, ứng dụng của bạn sẽ nhận được Purchase cho gói thuê bao cũ bằng đối tượng PendingPurchaseUpdate. Tại thời điểm này, người dùng vẫn sở hữu gói thuê bao cũ và chưa có gói thuê bao mới. Việc gọi getProducts()getPurchaseToken() trên đối tượng PendingPurchaseUpdate sẽ trả về mã sản phẩm và mã thông báo giao dịch mua của gói thuê bao mới. Khi giao dịch hoàn tất, ứng dụng của bạn sẽ nhận được một Purchase với mã thông báo giao dịch mua cấp cao nhất được đặt cho gói thuê bao mới và trạng thái được đặt thành PURCHASED. Thông báo SubscriptionNotification thuộc loại SUBSCRIPTION_PURCHASED sẽ được gửi đến máy khách RTDN. Chỉ tại thời điểm này, bạn mới nên thay thế mã thông báo giao dịch mua cũ bằng mã thông báo giao dịch mua mới và cập nhật quyền truy cập của người dùng vào nội dung. Nếu giao dịch hết hạn hoặc bị huỷ, thông báo SubscriptionNotification thuộc loại SUBSCRIPTION_PENDING_PURCHASE_CANCELED sẽ được gửi đến máy khách RTDN. Trong những trường hợp như vậy, người dùng vẫn có quyền truy cập vào nội dung của gói thuê bao cũ.