Trả lời nhanh: Google Play cung cấp cho bạn hai cách để biết một giao dịch mua đã bị hoàn tiền hoặc bị thu hồi. Real-time Developer Notifications (RTDN) đẩy các sự kiện đến server của bạn ngay khi chúng xảy ra, thông qua Google Cloud Pub/Sub. Voided Purchases API cho phép bạn kéo danh sách các giao dịch mua bị hủy khi cần. Đây không phải là hai lựa chọn thay thế cho nhau — RTDN mang lại tốc độ, Voided Purchases API mang lại một lớp bảo vệ, và một thiết lập đáng tin cậy sẽ sử dụng cả hai để không gì bị lọt qua.
Vì sao Google cung cấp hai cơ chế
Trên Google Play, hầu hết các khoản hoàn tiền xảy ra mà không hỏi ý kiến bạn — Google phát hành hoàn tiền, thu hồi quyền sử dụng, và công việc của bạn là phát hiện ra điều đó để ứng dụng và dữ liệu phân tích của bạn luôn chính xác. (Để biết những gì bạn có thể và không thể tranh chấp, xem Google Play Refunds & Chargebacks.)
Google cung cấp hai công cụ khác nhau để giúp bạn phát hiện điều này, và chúng giải quyết vấn đề theo hai hướng đối lập. Một công cụ đẩy sự kiện đến bạn ngay khi chúng xảy ra. Công cụ còn lại cho phép bạn yêu cầu một danh sách bất cứ khi nào bạn muốn. Khi dùng kết hợp, chúng bù đắp cho điểm yếu của nhau; khi dùng riêng lẻ, mỗi công cụ đều có một lỗ hổng.
Đối với các nhà phát triển tập trung vào việc theo dõi hoàn tiền trên Android, việc hiểu sự khác biệt này rất quan trọng vì một luồng sự kiện theo thời gian thực và một cơ chế đối chiếu lịch sử giải quyết những phần khác nhau của vấn đề giám sát hoàn tiền.
Real-time Developer Notifications (push)
Real-time Developer Notifications (RTDN) là cơ chế push. Khi có điều gì xảy ra với một gói đăng ký hoặc giao dịch mua, bao gồm hoàn tiền và các giao dịch mua bị hủy, Google sẽ phát (publish) một sự kiện đến một topic Google Cloud Pub/Sub mà backend của bạn đăng ký theo dõi (subscribe). Điểm mấu chốt ở đây là tính tức thời: bạn biết về sự kiện gần như ngay khi nó xảy ra, thay vì phát hiện ra nó sau nhiều giờ.
Đối với các nhà phát triển đang tìm hiểu về tích hợp RTDN Google Play, đây chính là cơ chế kết nối các sự kiện thanh toán của Google Play với backend của bạn. Với bất kỳ điều gì nhạy cảm về thời gian, như một đợt xem xét chargeback mà bạn chỉ có khoảng 24 giờ để phản hồi, tính tức thời này là yếu tố quyết định tất cả. Nếu bạn chỉ dựa vào việc kiểm tra định kỳ, bạn đã mất đi khoảng thời gian mà mình không có sẵn.
Điểm cần lưu ý: RTDN hoạt động trên Pub/Sub, nghĩa là bạn cần thiết lập project Google Cloud, một topic, các quyền publish phù hợp cho Google Play, và một subscriber ở phía bạn. Đây là nhiều thành phần hơn so với một webhook đơn lẻ, và đây cũng là nơi nhiều nhà phát triển bị khựng lại.
Voided Purchases API (pull)
Google Play Voided Purchases API là cơ chế pull. Nó trả về một danh sách các đơn hàng đã bị hủy, hoàn tiền, chargeback, hoặc thu hồi, mà bạn có thể truy vấn khi cần. Thay vì chờ một sự kiện, bạn hỏi trực tiếp Google: những gì đã bị hủy?
Điểm mạnh của nó là tính đầy đủ và khả năng khôi phục. Nếu một thông báo push bị trễ, bị bỏ lỡ, hoặc không bao giờ được xử lý, một lần pull đến Google Play Voided Purchases API vẫn sẽ phát hiện ra giao dịch mua bị hủy đó. Đây là cách bạn đối chiếu và đảm bảo hồ sơ của mình khớp với hồ sơ của Google.
Sự đánh đổi là bản chất của nó không tức thời — đây là thứ bạn phải truy vấn, nên nếu dùng riêng lẻ, nó là một lớp bảo vệ hơn là một yếu tố kích hoạt.
Vì sao bạn cần cả hai, không chỉ một
Đây là điểm khác biệt khiến nhiều người nhầm lẫn: đây không phải là quyết định "chọn cái tốt hơn".
Chỉ dùng RTDN mang lại tốc độ nhưng không đảm bảo tính đầy đủ — bỏ lỡ hoặc xử lý sai một thông báo thì sự kiện đó sẽ biến mất khỏi tầm nhìn của bạn.
Chỉ dùng Voided Purchases API mang lại tính đầy đủ nhưng không có tốc độ — bạn chỉ biết về một khoản hoàn tiền vào lần tiếp theo bạn truy vấn.
RTDN Google Play cung cấp cho backend của bạn một tín hiệu theo thời gian thực, trong khi Google Play Voided Purchases API cung cấp lớp đối chiếu cho các sự kiện bị bỏ lỡ hoặc bị trễ.
Một thiết lập đáng tin cậy sẽ sử dụng RTDN làm yếu tố kích hoạt theo thời gian thực và Voided Purchases API làm lớp đối chiếu để bắt lại bất cứ điều gì mà luồng push đã bỏ lỡ. Tốc độ cộng với một lớp bảo vệ. Nếu chỉ dùng một trong hai, bạn sẽ để lại một lỗ hổng mà cuối cùng bạn sẽ rơi vào đó.
Những phần phức tạp
Thiết lập đúng cách phức tạp hơn những gì nghe có vẻ, và công việc này là liên tục chứ không phải chỉ làm một lần:
Cấp phát Pub/Sub. Tạo topic, cấp quyền publish cho Google Play, đăng ký (subscribe) backend của bạn, và thiết lập chính xác các quyền — đây là bước dễ khiến bạn mất một hoặc vài buổi chiều nhất. Việc thiết lập Pub/Sub Play Billing này cũng cần duy trì độ tin cậy khi hạ tầng thanh toán của bạn phát triển.
Hai hệ thống cần đồng bộ. Bạn hiện đang vận hành một push consumer và một job pull-and-reconcile theo lịch, và phải đảm bảo chúng khớp với nhau.
Khử trùng lặp và thứ tự. Cùng một sự kiện có thể đến với bạn nhiều hơn một lần, hoặc không theo đúng thứ tự; việc xử lý của bạn phải mang tính idempotent.
Luôn cập nhật. Google liên tục chỉnh sửa các billing API và loại sự kiện, và tích hợp của bạn phải theo kịp, nếu không sẽ dần trở nên lạc hậu mà bạn không hề nhận ra.
Thông báo hoàn tiền Google Play. Hệ thống của bạn cần xử lý chính xác từng thông báo hoàn tiền Google Play liên quan và liên kết nó với đúng giao dịch mua, quyền sử dụng, và hồ sơ khách hàng.
Riêng lẻ, không có điều nào trong số này là quá phức tạp. Nhưng kết hợp lại, đây là một phần hạ tầng thực sự cần xây dựng và duy trì — chỉ để đổi lấy khả năng theo dõi chính xác các khoản hoàn tiền mà hầu hết bạn cũng không thể tranh chấp.
Cách điều này phù hợp với việc xử lý hoàn tiền
Ghép các phần lại với nhau, việc xử lý hoàn tiền trên Google Play gồm hai nửa: nắm bắt điều duy nhất bạn có thể tranh chấp (đợt xem xét chargeback) trong khung thời gian của nó, và ghi lại chính xác mọi thứ khác mà bạn không thể tranh chấp để quyền sử dụng và dữ liệu phân tích của bạn luôn trung thực. Cả hai nửa đều phụ thuộc vào việc nền tảng RTDN + Voided Purchases phải vững chắc.
Đối với các team đang thắc mắc làm thế nào để theo dõi hoàn tiền Google Play với RTDN và Voided Purchases API, câu trả lời là sử dụng RTDN để phát hiện sự kiện nhanh và Voided Purchases API để đối chiếu và khôi phục. Điều này giúp backend của bạn có một bức tranh đầy đủ hơn về các khoản hoàn tiền, giao dịch mua bị hủy, và chargeback.
Đây chính xác là lớp mà RefundSensor quản lý giúp bạn. Nó tự động cấp phát topic Pub/Sub để bạn chỉ cần dán một tên topic vào Play Console, tiếp nhận RTDN theo thời gian thực, đối chiếu với các giao dịch mua bị hủy để không gì bị bỏ lỡ, gửi đề xuất từ chối (decline recommendation) cho các đợt xem xét chargeback trong khung thời gian cho phép, và ghi lại mọi khoản hoàn tiền khác, tất cả trong một dashboard duy nhất cùng với các khoản hoàn tiền Apple của bạn. Bạn nhận được kết quả của một thiết lập hai cơ chế đúng đắn mà không cần xây dựng hay duy trì bất kỳ cơ chế nào.
Nguồn chính thức {#official-sources}
Các billing API của Google thay đổi liên tục, vì vậy hãy coi tài liệu chính thức của Google là nguồn tham khảo cuối cùng:
Một thiết lập, hai cơ chế, không cần duy trì. RefundSensor tự động cấp phát Pub/Sub, tiếp nhận RTDN theo thời gian thực, đối chiếu với các giao dịch mua bị hủy, và xử lý các đợt xem xét chargeback cho Google Play và Apple, tất cả trong một dashboard. Bắt đầu miễn phí →
Các internal link cần thêm sau khi xuất bản: Google Play refunds cornerstone · Apple refund automation cornerstone · the 12-hour window.
Câu hỏi thường gặp
RTDN đẩy (push) các sự kiện đến server của bạn theo thời gian thực qua Pub/Sub; Voided Purchases API cho phép bạn kéo (pull) danh sách các đơn hàng bị hủy khi cần. RTDN mang lại tốc độ, còn Voided Purchases API mang lại tính đầy đủ.
Để có một thiết lập đáng tin cậy, câu trả lời là có. RTDN là yếu tố kích hoạt theo thời gian thực, còn Voided Purchases API là lớp bảo vệ đối chiếu cho bất cứ điều gì mà luồng push bỏ lỡ. Nếu chỉ dùng một trong hai, bạn sẽ luôn có một lỗ hổng.
Đó là một đơn hàng không còn hợp lệ, thường do hoàn tiền, chargeback, hoặc bị thu hồi quyền. Theo dõi các voided purchase giúp đảm bảo quyền sử dụng (entitlements) và dữ liệu phân tích của bạn luôn chính xác.
RTDN hoạt động trên Google Cloud Pub/Sub, nên bao gồm một topic, quyền publish cho Google Play, và một subscriber ở phía bạn — nhiều thành phần hơn so với việc chỉ dán một URL. RefundSensor tự động cấp phát (auto-provision) topic Pub/Sub để loại bỏ sự phức tạp đó.
Hầu như là không. Các khoản hoàn tiền và thu hồi quyền thông thường do Google quyết định. Trường hợp duy nhất có thể tranh chấp là chargeback đang được xem xét, mà bạn nên phát hiện qua RTDN và phản hồi trong khung thời gian khoảng 24 giờ.



