Tất cả bài viết
Cẩm nangĐọc trong 8 phút

Hoàn tiền add-on gói đăng ký Google Play có thể nhắm từng mục một, nhưng khách hàng của bạn chỉ có thể hủy cả gói

Google Play cho phép một gói đăng ký cơ bản mang tối đa 49 add-on trên cùng một purchase token. Bài viết này giải thích cách hoàn tiền add-on gói đăng ký hoạt động, lệnh gọi API nào hoàn tiền một mục mà không ảnh hưởng phần còn lại, khi nào Google chặn nó, và mỗi cách hoàn tiền tốn của bạn bao nhiêu.

Một người ngồi ở bàn quán cà phê xem điện thoại Android bên cạnh hóa đơn liệt kê từng mục, kiểu giao dịch mua theo gói mà việc hoàn tiền add-on gói đăng ký Google Play áp dụng theo từng dòng

Điểm chính

  • Tính năng gói đăng ký kèm add-on của Google Play đặt một gói đăng ký cơ bản và tối đa 49 add-on, tổng cộng 50 mục, vào một giao dịch mua, và mọi mục phải dùng chung một chu kỳ thanh toán định kỳ.
  • Người dùng Google Play không thể hủy riêng một add-on từ Play Subscription Center. Họ chỉ có thể hủy gói đăng ký cơ bản cùng các add-on của nó một lúc, nên việc gỡ một add-on phải diễn ra trong ứng dụng của nhà phát triển.
  • Phương thức purchases.subscriptionsv2.revoke nhận một itemBasedRefund với một productId. Nếu các mục khác vẫn còn hoạt động, Google chỉ thu hồi và hoàn tiền toàn bộ cho mục đó, và gói đăng ký tiếp tục chạy.
  • Google chặn hoàn tiền theo mục khi gói đăng ký đang ở trạng thái thanh toán bị từ chối, khi mục đã hết hạn hoặc không được sở hữu, và với gói đăng ký trả trước.
  • proratedRefund trên gói đăng ký kèm add-on sẽ hoàn tiền đơn hàng mới nhất của mọi mục, tính theo tỷ lệ thời gian còn lại đến lần gia hạn tiếp theo, và thu hồi quyền truy cập vào tất cả các mục cùng lúc.
  • Real-time developer notifications cho gói đăng ký kèm add-on không chứa subscriptionId, nên backend phải gọi purchases.subscriptionsv2.get và đọc từng lineItem để biết mục nào vẫn còn quyền sử dụng.
  • Luồng hoàn tiền duy nhất của Google Play yêu cầu nhà phát triển cung cấp bằng chứng là chargeback được gắn cờ xem xét qua orders.reviewrefund, với thời hạn 24 giờ. Với đơn hàng đặt sau ngày 3 tháng 8 năm 2026, một chargeback thua sẽ khiến nhà phát triển mất giá mua trừ phí dịch vụ của Play, cộng thêm phí của ngân hàng.

Bán một gói đăng ký cơ bản kèm ba add-on trên Google Play và bạn có thể hoàn tiền bất kỳ add-on nào mà không hủy phần còn lại. Khách hàng của bạn thì không làm được điều đó từ phía họ. Google chỉ cho người dùng hủy cả gói, nên công cụ chính xác để hoàn tiền add-on gói đăng ký Google Play nằm trong tay bạn, nhà phát triển, và chỉ qua API. Dùng đúng cách, bạn hoàn tiền đúng dòng bị lỗi. Dùng sai lệnh gọi, bạn hoàn tiền, hoặc thu hồi, mọi thứ.

Cấu trúc của một gói đăng ký kèm add-on

Google công bố tính năng thanh toán nhiều sản phẩm cho gói đăng ký tại I/O 2025. Một luồng mua hàng bán gói đăng ký cơ bản cùng các add-on tùy chọn, được tính tiền chung theo một lịch. Hướng dẫn cho nhà phát triển của Google đặt ra các giới hạn rõ ràng:

  • Chỉ base plan tự động gia hạn mới có thể mang add-on. Gói trả trước thì không.
  • Mọi mục phải dùng chung một chu kỳ thanh toán định kỳ. Không được gắn add-on hằng tháng vào gói cơ bản hằng năm.
  • Một giao dịch mua chứa tối đa 50 mục, tức là một gói cơ bản và tối đa 49 add-on.
  • Tính năng này không có ở Hàn Quốc.

Tất cả nằm trên một purchase token duy nhất. Khi bạn gọi purchases.subscriptionsv2.get, phản hồi chứa danh sách lineItems, mỗi mục một phần tử. Mỗi line item có productId, expiryTime và latestSuccessfulOrderId riêng. Trường cuối cùng chính là thứ giúp hoàn tiền theo từng mục khả thi: mỗi mục có đơn hàng mới nhất của riêng nó.

Tính theo tỷ lệ ngay từ ngày đầu

Khi người dùng thêm add-on giữa chu kỳ, Google tính ngay một khoản theo tỷ lệ để add-on gia hạn cùng ngày với gói cơ bản. Ví dụ của chính Google là một add-on $10 hằng tháng được thêm vào ngày 15 tháng 8 sau 7 ngày dùng thử, bị tính $2.90 cho phần còn lại của tháng 8. Vì vậy một add-on có thể có đơn hàng đầu tiên ngắn, số tiền lẻ, trước đơn hàng đầy đủ đầu tiên. Hãy nhớ điều này khi bạn tra xem lần hoàn tiền sẽ rơi vào đơn hàng nào.

Khách hàng của bạn chỉ có thể hủy cả gói

Trang trợ giúp người dùng của Google nói thẳng điều này. Người dùng chỉ có thể hủy gói đăng ký cơ bản và các add-on cùng nhau, và hiện tại họ không thể hủy riêng từng add-on từ Google Play. Tính năng tạm dừng cũng không có. Nếu người dùng từ chối mức tăng giá, Google sẽ hủy gói đăng ký cơ bản cùng mọi add-on đi kèm.

Điều đó khiến khách hàng muốn bỏ một add-on chỉ còn hai lựa chọn trong Play Store: hủy tất cả, hoặc yêu cầu hoàn tiền. Cả hai đều không tốt cho bạn. Hướng dẫn của Google cho biết ứng dụng của bạn có thể cung cấp tính năng gỡ add-on thay thế. Add-on đã gỡ sẽ hết hạn vào cuối chu kỳ thanh toán hiện tại, và phần còn lại của gói vẫn tiếp tục gia hạn.

So sánh các công cụ hoàn tiền add-on gói đăng ký Google Play

Google cho bạn năm cách để trả lại tiền trên gói đăng ký kèm add-on. Chúng khác nhau ở phần được hoàn tiền và việc quyền truy cập có kết thúc hay không.

Công cụPhần được hoàn tiềnĐiều gì xảy ra với quyền truy cập
Hoàn tiền trong Play Console cho một đơn hàng cụ thểSố tiền bạn chọn trên đơn hàng đóKhông có gì bị thu hồi
orders.refund, không đặt revokeToàn bộ số tiền của một đơn hàngKhông có gì bị thu hồi
subscriptionsv2.revoke với itemBasedRefundToàn bộ khoản phí mới nhất của một mụcChỉ mục đó kết thúc, trừ khi đó là mục còn hoạt động cuối cùng
subscriptionsv2.revoke với proratedRefundĐơn hàng mới nhất của từng mục, tính theo tỷ lệ thời gian còn lạiMọi mục kết thúc ngay lập tức
subscriptionsv2.revoke với fullRefundToàn bộ khoản phí mới nhất của từng mụcMọi mục kết thúc ngay lập tức

Google đưa thêm một cảnh báo nghiêm khắc trong hướng dẫn về add-on: đừng gọi purchases.subscriptions.refund đã ngừng hỗ trợ trên gói đăng ký kèm add-on. Ngoài ra, orders.refund không thể xử lý đơn hàng cũ hơn ba năm.

Cách itemBasedRefund hoạt động

Đối tượng itemBasedRefund nhận một trường bắt buộc, productId, chỉ định mục cần thu hồi. Google mô tả hai kết quả:

  • Các mục khác vẫn hoạt động: chỉ mục được chỉ định bị thu hồi và hoàn tiền toàn bộ, và gói đăng ký tiếp tục.
  • Không còn mục nào khác hoạt động: mục bị thu hồi, hoàn tiền toàn bộ, và toàn bộ gói đăng ký bị hủy.

Mỗi yêu cầu chỉ chỉ định được một mục. Để hoàn tiền hai add-on, hãy gọi hai lần.

Khi nào Google chặn hoàn tiền theo mục

Google từ chối itemBasedRefund trong ba trường hợp. Gói đăng ký đang ở bất kỳ trạng thái thanh toán bị từ chối nào, bao gồm thời gian gia hạn thanh toán và tạm giữ tài khoản. Mục bạn chỉ định không được sở hữu hoặc đã hết hạn. Hoặc giao dịch mua là gói đăng ký trả trước, loại hoàn toàn không hỗ trợ ngừng theo từng mục.

Hoàn tiền theo ID đơn hàng hoạt động ra sao

Hướng dẫn của Google lưu ý rằng cờ revoke trên orders.refund chỉ chấm dứt quyền truy cập nếu đơn hàng đó là đơn mới nhất của gói đăng ký. Với đơn hàng cũ hơn, việc hoàn tiền thành công và không có gì bị thu hồi. Play Console cũng hoạt động như vậy: hoàn tiền đơn hàng gần nhất thì gói đăng ký bị gỡ, hoàn tiền đơn cũ hơn thì gói vẫn hoạt động. Với add-on, hãy lấy đơn hàng từ latestSuccessfulOrderId của đúng line item, nếu không bạn có thể hoàn tiền một khoản phí khác với khoản bạn định.

Ai quyết định hoàn tiền, và khi nào bạn được yêu cầu cung cấp bằng chứng

Phần lớn các lần hoàn tiền trên gói đăng ký kèm add-on được quyết định mà không cần bạn, giống như mọi gói đăng ký Play khác. Trong vòng 48 giờ sau khi mua, người dùng có thể gửi yêu cầu cho Google qua mục Báo cáo sự cố, và Google sẽ quyết định. Sau thời gian đó, Google chuyển họ sang bạn. Và nếu bạn không acknowledge một giao dịch mua gói đăng ký mới trong vòng ba ngày, Google sẽ tự động hoàn tiền cho người dùng và thu hồi giao dịch mua.

Chỉ có một luồng hỏi ý kiến từ phía bạn. Khi chủ thẻ gửi chargeback và Google gắn cờ để nhà phát triển xem xét, bạn nhận được PendingRefundReviewNotification và có 24 giờ để gọi orders.reviewrefund kèm lựa chọn hoàn tiền và bằng chứng sử dụng. Bản thân chargeback do ngân hàng quyết định, và quyết định của ngân hàng là cuối cùng.

Theo dõi hoàn tiền add-on trên máy chủ của bạn

Tài liệu tham chiếu RTDN của Google liệt kê SUBSCRIPTION_ITEMS_CHANGED cho thay đổi ở một mục trong gói đăng ký, và SUBSCRIPTION_REVOKED cho gói đăng ký bị thu hồi trước thời điểm hết hạn. Hướng dẫn của Google cho biết việc thu hồi qua subscriptionsv2.revoke kích hoạt cả thông báo SUBSCRIPTION_REVOKED lẫn VoidedPurchaseNotification, và được ghi lại trong Voided Purchases API.

Điểm cần chú ý là subscriptionId. Google cho biết trường này không có trong RTDN cho gói đăng ký kèm add-on. Vì vậy đừng tin vào thông báo để biết mục nào đã thay đổi. Với mỗi thông báo cho một gói:

  • Gọi purchases.subscriptionsv2.get với purchaseToken.
  • Đọc từng lineItem và expiryTime của nó. Google nói bạn phải làm mới expiryTime cho tất cả các mục, không chỉ mục bạn đoán.
  • Cấp hoặc gỡ quyền truy cập theo productId, không theo purchase token.
  • Thăm dò Voided Purchases API để dự phòng. API này bao quát 30 ngày gần nhất.

Thời gian gia hạn thanh toán và tạm giữ tài khoản áp dụng cho cả gói

Sự cố thanh toán ảnh hưởng đến tất cả các mục cùng lúc. Google chọn thời gian gia hạn thanh toán ngắn nhất trong các mục đang hoạt động và áp dụng cho toàn bộ lần gia hạn. Trong thời gian gia hạn thanh toán, người dùng vẫn giữ mọi mục. Khi bị tạm giữ tài khoản, quyền truy cập vào tất cả các mục bị đình chỉ. Nếu thanh toán không bao giờ phục hồi, các mục bị từ chối thanh toán sẽ hết hạn và các mục còn lại tiếp tục cho phần còn lại của chu kỳ thanh toán.

Bàn làm việc của nhà phát triển với laptop hiển thị biểu đồ chi phí máy chủ bên cạnh hóa đơn liệt kê từng mục, nơi theo dõi các chi phí đã trả đằng sau mỗi add-on gói đăng ký Google Play

Mỗi cách hoàn tiền tốn của bạn bao nhiêu tiền

Add-on thường gắn với một thứ bạn phải trả tiền. Dung lượng lưu trữ đám mây bổ sung được nhà cung cấp lưu trữ tính phí. Gói tín dụng AI được tính bằng các lệnh gọi API mô hình. Thêm một chỗ ngồi nghĩa là thêm tài nguyên tính toán, và một hạng dành cho nhà sáng tạo có thể phát sinh khoản chi trả. Mỗi chi phí đó phát sinh khi người dùng sử dụng add-on, và việc hoàn tiền trả lại giá bán mà không trả lại bất kỳ chi phí nào trong số đó.

Hoàn tiền quá tay

Sai lầm tốn kém là dùng fullRefund hoặc proratedRefund khi khiếu nại chỉ liên quan đến một add-on. Cả hai đều thu hồi mọi mục, nên bạn trả lại cả giá gói cơ bản và mất một người đăng ký vốn muốn ở lại. itemBasedRefund chỉ trả lại khoản phí mới nhất của add-on đó. Khi nó bị chặn, orders.refund trên đơn hàng mới nhất của mục đó sẽ trả lại tiền mà không chấm dứt bất cứ thứ gì.

Hoàn tiền một phần và phí

Play Console cho phép bạn hoàn tiền một phần cho đơn hàng gói đăng ký, và Google cho biết tỷ lệ hoàn tiền cũng áp dụng cho khoản thanh toán và phí dịch vụ của bạn. Hoàn tiền một nửa đơn hàng thì một nửa phí của Google cũng được trả lại. Chi phí riêng của bạn để cung cấp add-on đó thì không.

Chargeback trên một gói

Với đơn hàng đặt sau ngày 3 tháng 8 năm 2026, Google chuyển chi phí chargeback sang nhà phát triển. Khi một chargeback thành công, bạn phải trả giá mua trừ phí dịch vụ của Play, cộng thêm các khoản phí ngân hàng thu. Một đơn hàng theo gói với nhiều add-on là một đơn hàng lớn hơn để mất. Nhật ký sử dụng theo từng add-on, gắn với ID tài khoản đã làm rối, là thứ bạn sẽ gửi trong đợt xem xét 24 giờ.

Danh sách kiểm tra cho hoàn tiền add-on

  • Cung cấp cách gỡ một add-on ngay trong ứng dụng, vì Google Play không có tính năng này.
  • Lưu productId, expiryTime và latestSuccessfulOrderId của từng lineItem ở mỗi thông báo.
  • Mặc định dùng itemBasedRefund khi vấn đề chỉ nằm ở một add-on.
  • Khi gói đăng ký đang trong thời gian gia hạn thanh toán hoặc tạm giữ tài khoản, hãy hoàn tiền đơn hàng của mục đó bằng orders.refund thay thế.
  • Không bao giờ gọi purchases.subscriptions.refund đã ngừng hỗ trợ trên một gói.
  • Ghi nhật ký sử dụng add-on theo từng tài khoản để phản hồi xem xét chargeback có thể gửi đi trong 24 giờ.
  • Báo cáo tỷ lệ hoàn tiền theo từng add-on, không chỉ theo gói đăng ký, để một add-on kém không bị che khuất trong số liệu của base plan.

Câu hỏi thường gặp

Người dùng có thể hủy chỉ một add-on trong gói đăng ký Google Play không?
Không thể từ Google Play. Trang trợ giúp của Google cho biết người dùng chỉ có thể hủy gói đăng ký cơ bản và các add-on cùng nhau. Ứng dụng của bạn có thể cung cấp tính năng gỡ một add-on, và add-on đó sẽ hết hạn vào cuối chu kỳ thanh toán hiện tại.
Làm sao để hoàn tiền một add-on mà không hủy gói đăng ký?
Gọi purchases.subscriptionsv2.revoke với itemBasedRefund chỉ định productId của add-on. Nếu các mục khác vẫn hoạt động, Google chỉ thu hồi và hoàn tiền toàn bộ cho mục đó. Bạn cũng có thể hoàn tiền đơn hàng mới nhất của mục đó bằng orders.refund mà không đặt cờ revoke, cách này trả lại tiền và giữ nguyên quyền truy cập.
Vì sao lệnh gọi itemBasedRefund của tôi thất bại?
Google chặn nó khi gói đăng ký đang ở trạng thái thanh toán bị từ chối, khi mục không được sở hữu hoặc đã hết hạn, và với gói đăng ký trả trước. Hãy kiểm tra expiryTime của line item và trạng thái gói đăng ký trước khi gọi.
Hoàn tiền theo tỷ lệ có dùng được cho gói đăng ký kèm add-on không?
Có, nhưng nó thu hồi mọi thứ. Google hoàn tiền đơn hàng mới nhất của từng mục, tính theo tỷ lệ thời gian còn lại đến lần gia hạn tiếp theo, và quyền truy cập vào tất cả các mục kết thúc ngay lập tức.
RTDN nào cho tôi biết một add-on đã được hoàn tiền?
Hướng dẫn của Google cho biết việc thu hồi kích hoạt SUBSCRIPTION_REVOKED và VoidedPurchaseNotification, còn SUBSCRIPTION_ITEMS_CHANGED bao gồm các thay đổi ở một mục trong gói. Vì subscriptionId không có đối với gói, hãy gọi purchases.subscriptionsv2.get và đọc từng lineItem để xem điều gì đã thay đổi.

Nguồn và tài liệu đọc thêm

RefundHalt

Chế độ tự động xử lý hoàn tiền cho App Store và Google Play

Đọc tiếp

Yêu cầu hoàn tiền tiếp theo đã đang trên đường đến.

Thiết lập RefundHalt trong khoảng thời gian bạn cần để đọc thêm một email hỗ trợ về khoản hoàn tiền mà mình chưa kịp phản biện.