Apple và Google hoàn tiền theo từng cửa hàng, vì vậy gói đăng ký đa nền tảng của bạn phải tự chấm dứt quyền truy cập ở mọi nơi khác
Khi Apple hoặc Google hoàn tiền một gói đăng ký đa nền tảng, ứng dụng Android, ứng dụng iPhone và trang web của bạn không tự biết điều đó. Bài viết này hướng dẫn cách gắn mỗi giao dịch mua trên cửa hàng với một tài khoản, thu hồi đúng quyền lợi và ngừng trả tiền để phục vụ những người dùng đã được hoàn tiền.

Điểm chính
- App Review Guideline 3.1.3(b) của Apple cho phép các ứng dụng hoạt động trên nhiều nền tảng cung cấp cho người dùng quyền truy cập vào nội dung và gói đăng ký đã mua trên nền tảng khác hoặc trên trang web của nhà phát triển, miễn là các mục đó cũng được bán dưới dạng giao dịch mua trong ứng dụng.
- Apple và Google chỉ hoàn tiền các giao dịch mua trên cửa hàng của chính họ, nên khoản hoàn tiền của Apple cho một gói đăng ký đa nền tảng không ảnh hưởng đến việc thanh toán qua Google Play hay trên web của khách hàng. Máy chủ của nhà phát triển phải thu hồi quyền truy cập đã cấp trên mọi nền tảng.
- Apple gửi thông báo REFUND qua App Store Server Notifications V2 khi hoàn tiền một sản phẩm tiêu hao, sản phẩm không tiêu hao, gói đăng ký không tự gia hạn hoặc gói đăng ký tự động gia hạn, và nêu rõ nhà phát triển có trách nhiệm lưu trữ, theo dõi và xử lý từng giao dịch đã hoàn tiền.
- appAccountToken của Apple là một UUID mà nhà phát triển gắn vào In-App Purchase, và endpoint Set App Account Token của App Store Server API có thể bổ sung giá trị này sau đó cho các giao dịch mua bên ngoài ứng dụng, chẳng hạn như một mã ưu đãi đã đổi.
- setObfuscatedAccountId của Google Play liên kết giao dịch mua với một tài khoản trong ứng dụng của nhà phát triển, giới hạn 64 ký tự, và sẽ khiến giao dịch mua bị chặn nếu chứa dữ liệu cá nhân ở dạng văn bản thuần như email.
- Voided Purchases API của Google Play báo cáo các giao dịch mua bị hoàn tiền và bị chargeback kèm orderId và voidedSource có giá trị 0 cho User, 1 cho Developer hoặc 2 cho Google.
- Với các đơn hàng Google Play được đặt sau ngày 3 tháng 8 năm 2026, khi một khoản chargeback thành công, nhà phát triển chịu giá mua, trừ đi phí dịch vụ của Play, cộng thêm phí chargeback của ngân hàng.
Người đăng ký của bạn đã thanh toán cho Apple, mở ứng dụng Android của bạn ngay chiều hôm đó, và giờ dùng trang web của bạn ở nơi làm việc. Rồi Apple hoàn tiền cho họ. Google Play không biết. Hệ thống thanh toán web của bạn không biết. Trừ khi chính máy chủ của bạn chấm dứt quyền truy cập, một gói đăng ký đa nền tảng đã được hoàn tiền vẫn tiếp tục hoạt động trên mọi màn hình đọc cơ sở dữ liệu tài khoản của bạn. Các cửa hàng hoàn tiền theo từng cửa hàng riêng, và hệ thống tài khoản của bạn là nơi duy nhất mà toàn bộ gói đăng ký tồn tại. Vì thế đó cũng là nơi duy nhất có thể chấm dứt nó.
Vì sao khoản hoàn tiền của một cửa hàng không chấm dứt gói đăng ký đa nền tảng
Apple cho phép mô hình này một cách rõ ràng. App Review Guideline 3.1.3(b), Multiplatform Services, quy định rằng các ứng dụng hoạt động trên nhiều nền tảng có thể cho phép người dùng truy cập nội dung, gói đăng ký hoặc tính năng họ đã mua trong ứng dụng của bạn trên nền tảng khác hoặc trên trang web của bạn, với điều kiện các mục đó cũng được bán dưới dạng giao dịch mua trong ứng dụng.
Hướng dẫn của Apple về việc cung cấp một gói đăng ký cho nhiều ứng dụng mô tả cách vận hành trên thực tế. Máy chủ của bạn cấp quyền truy cập dựa trên một cơ sở dữ liệu tài khoản thống nhất, và mọi ứng dụng đều đọc từ đó. Cũng hướng dẫn đó cảnh báo rằng nếu một giao dịch mua không được truyền sang các ứng dụng khác, người dùng có thể phải trả tiền nhiều lần cho cùng một dịch vụ.
Thiết kế đó có một hệ quả mà nhiều người bỏ sót. Quyền lợi nằm trong cơ sở dữ liệu của bạn, nhưng mỗi cửa hàng chỉ biết biên nhận của riêng mình. Apple có thể hoàn tiền giao dịch mua trên iPhone và báo cho máy chủ của bạn. Apple không thể báo gì cho ứng dụng Android hay trang web của bạn. Nếu trình xử lý hoàn tiền chỉ cập nhật ứng dụng iOS, khách hàng nhận lại tiền mà vẫn giữ gói đăng ký ở mọi nơi khác.
| Nơi họ thanh toán | Ai quyết định hoàn tiền | Máy chủ của bạn biết bằng cách nào | Ai có thể dừng gia hạn |
|---|---|---|---|
| App Store | Apple | Thông báo REFUND trong App Store Server Notifications V2 | Khách hàng, trong phần cài đặt gói đăng ký App Store hoặc màn hình quản lý mà ứng dụng của bạn mở ra |
| Google Play | Google trong 48 giờ đầu, sau đó là bạn hoặc Google | Voided Purchases API và thông báo thời gian thực cho nhà phát triển | Khách hàng, hoặc bạn thông qua purchases.subscriptionsv2.cancel |
| Trang web của bạn | Bạn | Webhook từ đơn vị xử lý thanh toán của bạn | Bạn |
Cách thu hồi quyền truy cập trên mọi nền tảng sau khi hoàn tiền
Gắn mọi giao dịch mua trên cửa hàng với một tài khoản
Khớp một khoản hoàn tiền với đúng người là phần khó nhất, vì mỗi cửa hàng nhận diện người mua theo cách riêng. Cả hai đều cung cấp một trường cho ID tài khoản của chính bạn. Hãy dùng nó cho mọi giao dịch mua.
- Trên Apple, đặt appAccountToken, một UUID do bạn tạo, khi giao dịch mua bắt đầu. App Store trả lại cùng UUID đó trong thông tin giao dịch và thông tin gia hạn. Apple cho biết bạn có thể dùng lại một giá trị cho mọi giao dịch thuộc cùng một khách hàng.
- Nếu khách hàng mua bên ngoài ứng dụng của bạn, ví dụ bằng cách đổi mã ưu đãi trong App Store, giao dịch sẽ không có token. Endpoint Set App Account Token sẽ bổ sung token. Với gói đăng ký tự động gia hạn, token áp dụng cho kỳ gia hạn hiện tại và các kỳ sau, không áp dụng cho các giao dịch trước đó, và không hoạt động với giao dịch mua được chia sẻ qua Family Sharing.
- Trên Google Play, truyền một ID tài khoản đã được làm mờ bằng setObfuscatedAccountId khi bạn khởi chạy luồng thanh toán. Giá trị này giới hạn 64 ký tự. Google cho biết dữ liệu cá nhân ở dạng văn bản thuần như email sẽ khiến giao dịch mua bị chặn, và khuyến nghị dùng mã hóa hoặc hàm băm một chiều.
Lắng nghe cả hai cửa hàng, rồi ghi một quyền lợi duy nhất
Apple gửi REFUND khi hoàn tiền bất kỳ loại sản phẩm nào, kể cả gói đăng ký tự động gia hạn. Apple gửi REFUND_REVERSED khi đảo ngược một khoản hoàn tiền đã chấp thuận, do khách hàng khiếu nại. Trên Google Play, Voided Purchases API liệt kê các giao dịch mua bị hoàn tiền và bị chargeback, mỗi giao dịch kèm một orderId xác định chính xác giao dịch mua hoặc kỳ gia hạn. Đơn vị xử lý thanh toán web của bạn gửi sự kiện hoàn tiền riêng. Cả ba nên đi vào cùng một trình xử lý và thay đổi cùng một bản ghi.
Thu hồi quyền lợi, không phải tài khoản
Hoàn tiền hủy một giao dịch mua, không hủy một con người. Hãy gỡ bỏ quyền truy cập đến từ giao dịch mua đã hoàn tiền, rồi tính lại những gì tài khoản đó vẫn còn. Nếu khách hàng còn một gói đăng ký đang hoạt động từ cửa hàng khác, họ vẫn giữ quyền truy cập nhờ gói đó. Nếu không, mọi ứng dụng sẽ mất các tính năng cao cấp ở lần kiểm tra máy chủ tiếp theo.
Khi cùng một người đăng ký trên hai cửa hàng
Đăng ký trùng lặp là nửa còn lại của vấn đề. Một người đăng ký trên Android, mua iPhone mới, không đăng nhập, rồi đăng ký lại. Giờ họ trả tiền hai lần cho một dịch vụ, và một trong hai khoản phí đó thường biến thành yêu cầu hoàn tiền. Đội ngũ thương mại của Apple, khi trả lời một nhà phát triển trên Apple Developer Forums, đã nói ngắn gọn: hệ thống tài khoản của ứng dụng nên có logic để ngăn việc mua trùng trên một nền tảng khác.
Kiểm tra mọi cửa hàng trước khi hiển thị paywall
Yêu cầu người dùng đăng nhập trước paywall, tra cứu mọi giao dịch mua đang hoạt động của họ trên máy chủ, và bỏ qua ưu đãi nếu bất kỳ giao dịch nào đã bao gồm nền tảng này. Chỉ một bước kiểm tra đó đã ngăn được phần lớn các khoản phí trùng trước khi chúng xảy ra.
Nên hoàn tiền giao dịch mua nào khi việc trùng đã xảy ra?
Hãy hoàn tiền giao dịch mà bạn kiểm soát. Trên Google Play, bạn có thể tự hoàn tiền trong Play Console, và purchases.subscriptionsv2.cancel với DEVELOPER_REQUESTED_STOP_PAYMENTS sẽ dừng khoản thanh toán tiếp theo. Gói đăng ký web hoàn toàn do bạn quyết định hoàn tiền. Hoàn tiền App Store do Apple quyết định, nên nếu giao dịch trùng nằm trên iPhone, khách hàng phải yêu cầu Apple, và ứng dụng của bạn có thể mở yêu cầu đó bằng API yêu cầu hoàn tiền của StoreKit.
Cái giá của một khoản hoàn tiền bỏ sót một nền tảng
Số tiền hoàn lại chỉ là tổn thất đầu tiên. Một khách hàng có khoản hoàn tiền Apple chưa bao giờ đến được ứng dụng Android hay trang web của bạn vẫn tiếp tục dùng những gì bạn trả tiền để vận hành. Mỗi phiên vẫn tiêu tốn tài nguyên tính toán. Mỗi tính năng AI vẫn gọi API bên thứ ba mà bạn bị tính phí. Tệp của họ vẫn chiếm dung lượng lưu trữ, và nếu ứng dụng của bạn trả tiền cho nhà sáng tạo theo lượt xem hoặc lượt dùng, các khoản chi đó vẫn tiếp tục. Với gói năm, điều này có thể đồng nghĩa với cả một năm chi phí phục vụ cho một tài khoản giờ không trả gì.
Con đường qua ngân hàng còn tệ hơn. Với các đơn hàng Google Play được đặt sau ngày 3 tháng 8 năm 2026, Google cho biết khi một khoản chargeback thành công, nhà phát triển chịu trách nhiệm về giá mua, trừ đi phí dịch vụ của Play, cộng thêm phí chargeback mà tổ chức tài chính thu. Chargeback là quyết định cuối cùng tại ngân hàng. Một khách hàng đã chargeback mà vẫn còn quyền truy cập đã khiến bạn mất cùng lúc giá mua, các khoản phí và chi phí phục vụ.
| Những gì vẫn chạy sau một lần thu hồi bị bỏ sót | Ai trả tiền |
|---|---|
| Tài nguyên tính toán của máy chủ cho mỗi phiên trên Android hoặc web | Bạn |
| Các lệnh gọi API bên thứ ba mà tính năng của bạn thực hiện | Bạn |
| Dung lượng lưu trữ cho tệp và lịch sử của người dùng | Bạn |
| Khoản chi trả cho nhà sáng tạo theo lượt dùng hoặc lượt xem | Bạn |
| Phí chargeback cho đơn hàng Google Play sau ngày 3 tháng 8 năm 2026 | Bạn, ngoài giá mua trừ đi phí dịch vụ của Play |

Mức sử dụng đa nền tảng vẫn là bằng chứng
Một tài khoản trên mọi nền tảng cũng hữu ích khi cửa hàng yêu cầu phía bạn cung cấp thông tin. Thông tin tiêu thụ của Apple hỏi khách hàng đã dùng bao nhiêu phần của một sản phẩm tiêu hao, sản phẩm không tiêu hao hoặc gói đăng ký không tự gia hạn. Với gói đăng ký tự động gia hạn, bạn không gửi tỷ lệ phần trăm, vì Apple tự tính dựa trên thời gian đã trôi qua. Quy trình xem xét chargeback của Google Play chấp nhận tối đa 1.000 sự kiện sử dụng, mỗi sự kiện có thể mang ID tài khoản đã được làm mờ. Mức sử dụng được ghi nhận dưới một ID tài khoản, dù phát sinh từ thiết bị nào, đều là mức sử dụng bạn có thể chứng minh.
Những khoản hoàn tiền không bao giờ hỏi ý kiến bạn
Phần lớn các khoản hoàn tiền được quyết định mà không cần đến bạn. Google Play có thể hoàn tiền một giao dịch mua trong vòng 48 giờ qua quy trình hoàn tiền riêng. Hoàn tiền do bộ phận hỗ trợ của cửa hàng thực hiện, giao dịch mua bị vô hiệu, và việc Google tự động hoàn tiền các giao dịch mua bạn không xác nhận, sau khoảng 72 giờ, đều xảy ra trước và chỉ được báo cáo sau đó. Với những trường hợp này, logic thu hồi ở trên là toàn bộ công việc.
Chỉ có hai quy trình yêu cầu bằng chứng. CONSUMPTION_REQUEST của Apple cho bạn 12 giờ để gửi thông tin tiêu thụ. Quy trình xem xét chargeback của Google Play cho bạn 24 giờ kể từ PendingRefundReviewNotification để trả lời qua orders.reviewrefund, và Google chỉ ghi nhận lần gọi đầu tiên của bạn. RefundHalt trả lời cả hai trong thời hạn, dựa trên dữ liệu sử dụng bạn đã thu thập, gắn với cùng một tài khoản trên các ứng dụng của bạn.
Danh sách kiểm tra ngắn cho hoàn tiền đa nền tảng
- Đặt appAccountToken cho giao dịch mua trên Apple và ID tài khoản đã được làm mờ cho giao dịch mua trên Google Play.
- Bổ sung token Apple còn thiếu bằng Set App Account Token cho các lượt đổi mã ưu đãi.
- Chuyển REFUND và REFUND_REVERSED của Apple, giao dịch mua bị vô hiệu trên Google Play và hoàn tiền trên web vào một trình xử lý duy nhất.
- Lưu từng giao dịch mua cùng nguồn của nó, và tính quyền truy cập từ tất cả giao dịch mua đang hoạt động.
- Kiểm tra giao dịch mua trên mọi cửa hàng trước khi hiển thị paywall trên bất kỳ nền tảng nào.
Câu hỏi thường gặp
- Tôi có thể cho người dùng iPhone truy cập gói đăng ký họ đã mua trên Android hoặc trang web của tôi không?
- Có. App Review Guideline 3.1.3(b) của Apple cho phép các ứng dụng hoạt động trên nhiều nền tảng cung cấp cho người dùng quyền truy cập vào nội dung, gói đăng ký hoặc tính năng đã mua trên nền tảng khác hoặc trên trang web của bạn, miễn là các mục đó cũng được bán dưới dạng giao dịch mua trong ứng dụng iPhone.
- Nếu Apple hoàn tiền cho một người đăng ký, Google Play hoặc hệ thống thanh toán web của tôi có biết không?
- Không. Apple chỉ báo cho máy chủ của bạn qua thông báo REFUND trong App Store Server Notifications V2, ngoài ra không báo cho ai khác. Máy chủ của bạn phải thu hồi quyền truy cập mà giao dịch mua đó đã cấp trên Android, trên web và ở bất kỳ nơi nào tài khoản đó đăng nhập.
- Làm sao để khớp một khoản hoàn tiền App Store với tài khoản người dùng?
- Hãy dùng appAccountToken, một UUID mà ứng dụng của bạn gắn vào giao dịch mua và App Store trả lại trong thông tin giao dịch. Với các giao dịch mua bên ngoài ứng dụng, chẳng hạn như đổi mã ưu đãi, endpoint Set App Account Token của Apple sẽ thêm hoặc thay thế token. Endpoint này không hỗ trợ giao dịch Family Sharing.
- Một khách hàng đăng ký trên cả App Store và Google Play. Tôi nên hoàn tiền bên nào?
- Hãy hoàn tiền bên mà bạn kiểm soát. Bạn có thể hoàn tiền một đơn hàng Google Play trong Play Console và dừng khoản thanh toán tiếp theo bằng purchases.subscriptionsv2.cancel. Apple quyết định hoàn tiền App Store, nên giao dịch trùng trên iPhone phải đi qua yêu cầu hoàn tiền của Apple, mà ứng dụng của bạn có thể mở bằng StoreKit.
- Mức sử dụng trên trang web hoặc ứng dụng Android của tôi có được tính là bằng chứng khi xem xét hoàn tiền không?
- Mức sử dụng được ghi nhận dưới một tài khoản có thể củng cố câu trả lời của bạn. Thông tin tiêu thụ của Apple hỏi đã dùng bao nhiêu phần của một sản phẩm tiêu hao, sản phẩm không tiêu hao hoặc gói đăng ký không tự gia hạn, và quy trình xem xét chargeback của Google Play chấp nhận tối đa 1.000 sự kiện sử dụng có thể mang ID tài khoản đã được làm mờ.
Nguồn và tài liệu đọc thêm
- Apple: App Review Guidelines, 3.1.3(b) Multiplatform Services
- Apple Developer Documentation: Offering a subscription across multiple apps
- Apple Developer Documentation: Handling refund notifications
- Apple Developer Documentation: notificationType
- Apple Developer Documentation: Set App Account Token
- Android Developers: BillingFlowParams.Builder, setObfuscatedAccountId
- Google Play Developer API: purchases.voidedpurchases
- Google Play Console Help: Updates to refund protection and chargeback cost responsibility
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 quá mức có thể khiến bạn mất nhiều hơn chính khoản hoàn tiền, vì cả hai kho ứng dụng đều coi đó là tín hiệu chất lượng
Hướng dẫn 5.6.4 của Apple nêu rõ yêu cầu hoàn tiền quá mức là dấu hiệu ứng dụng không đạt chuẩn chất lượng, còn Thỏa thuận phân phối của Google cho phép gỡ ứng dụng của nhà phát triển mới dựa trên tỷ lệ hoàn tiền. Đây là những gì mỗi kho quy định, cái giá khi bị gỡ và cách tránh rủi ro.
Hãy xác minh thông báo máy chủ App Store trước khi xử lý hoàn tiền, vì bất kỳ ai cũng có thể gửi yêu cầu đến URL webhook của bạn
Một thông báo hoàn tiền chỉ là một yêu cầu HTTPS cho đến khi bạn kiểm tra chữ ký của nó. Bài viết này hướng dẫn cách xác minh thông báo máy chủ App Store và tin nhắn RTDN của Google Play, mỗi cửa hàng ký những gì, và một khoản hoàn tiền giả mạo hoặc bị từ chối nhầm khiến bạn tốn bao nhiêu.