Mỗi lần gia hạn có mã đơn hàng Google Play riêng, và đó là con số cần kiểm tra trước khi hoàn tiền cho bất kỳ ai
Một mã đơn hàng Google Play như GPA.1234-5678-9012-34567..2 chỉ đúng một khoản phí. Bài viết này hướng dẫn cách đọc hậu tố gia hạn, tra cứu đơn hàng trong Play Console hoặc Orders API, và hoàn đúng khoản phí khách hàng muốn nói đến mà không phải trả tiền cho khoản sai.

Điểm chính
- Mã đơn hàng Google Play có dạng GPA.1234-5678-9012-34567, và các lần gia hạn gói thuê bao được thêm hậu tố, nên GPA.1234-5678-9012-34567..0 là lần gia hạn đầu tiên của gói thuê bao đó.
- Hàm getOrderId() của Play Billing Library trả về mã của đơn hàng ban đầu cho các lần gia hạn thuê bao, không phải mã riêng của lần gia hạn, và trả về null khi giao dịch mua còn ở trạng thái PENDING.
- Google đã thêm get và batchGet vào tài nguyên Orders của Play Developer API vào ngày 21 tháng 5 năm 2025. batchGet nhận từ 1 đến 1.000 mã đơn hàng khác nhau và làm thất bại toàn bộ yêu cầu nếu có bất kỳ mã nào không được tìm thấy.
- Một Order từ Orders API mang state PENDING, PROCESSED, CANCELED, PENDING_REFUND, PARTIALLY_REFUNDED hoặc REFUNDED, cùng với developerRevenueInBuyerCurrency, là số tiền đã trừ các khoản hoàn tiền một phần, thuế và phí.
- Phương thức orders.refund của Google Play không thể hoàn tiền cho đơn hàng cũ hơn 3 năm, và truyền revoke=true sẽ chấm dứt ngay quyền truy cập của khách hàng vào gói thuê bao hoặc vật phẩm.
- Trong Play Console, Hoàn tiền và thu hồi (Refund and revoke) áp dụng cho đơn hàng gần nhất trong một gói thuê bao, còn Chỉ hoàn tiền (Refund only) áp dụng cho đơn hàng cũ hơn và giữ gói thuê bao vẫn hoạt động.
- Google Play tự xử lý các yêu cầu hoàn tiền trong vòng 48 giờ sau khi mua. Sau 48 giờ, Google chuyển khách hàng sang nhà phát triển, và đó thường là lúc một mã đơn hàng xuất hiện trong hộp thư hỗ trợ của bạn.
Hãy nhìn vào phần cuối của mã đơn hàng trước khi hoàn tiền cho một khách hàng Google Play. GPA.1234-5678-9012-34567 là khoản phí đầu tiên của một gói thuê bao. GPA.1234-5678-9012-34567..2 là khoản thứ ba. Chúng dùng chung phần gốc, nhưng là những khoản thanh toán khác nhau, và Play Console xử lý chúng khác nhau khi bạn hoàn tiền. Mã đơn hàng Google Play là mã nhận dạng duy nhất khách hàng nhìn thấy được, nên đó là mã sẽ xuất hiện trong hộp thư hỗ trợ của bạn. Đọc đúng mã, bạn sẽ hoàn đúng khoản phí họ thực sự phàn nàn, và chỉ một lần.
Mã đơn hàng Google Play cho bạn biết điều gì
Tài liệu Play Billing Library của Google mô tả định dạng qua ví dụ. Mã đơn hàng bắt đầu bằng GPA, sau đó là các nhóm chữ số. Với gói thuê bao, mỗi lần gia hạn nhận mã đơn hàng gốc cộng thêm hai dấu chấm và một bộ đếm bắt đầu từ số không. Vì vậy, giao dịch mua ban đầu không có hậu tố, lần gia hạn đầu tiên là ..0, lần thứ hai là ..1, và cứ thế tiếp tục.
Nhờ đó, hậu tố cho bạn biết nhanh một người đã trả tiền bao lâu. Khách hàng viết thư về GPA.3333-4137-0319-36762..11 đã được gia hạn mười hai lần. Khách hàng đưa ra mã gốc không có hậu tố thì hoặc chỉ mua một lần, hoặc đang nói đến khoản thanh toán đầu tiên của họ.
| Mã đơn hàng | Ý nghĩa |
|---|---|
| GPA.1234-5678-9012-34567 | Giao dịch mua một lần, hoặc khoản phí đầu tiên của một gói thuê bao |
| GPA.1234-5678-9012-34567..0 | Lần gia hạn đầu tiên của gói thuê bao đó |
| GPA.1234-5678-9012-34567..1 | Lần gia hạn thứ hai |
| null trong Billing Library | Giao dịch mua vẫn ở trạng thái PENDING, trước khi Google xử lý thanh toán |
Mã đơn hàng xuất hiện ở đâu, và bạn nhận được phiên bản nào
Đây là chỗ nhiều nhóm vấp phải. Mỗi nơi trả cho bạn một dạng khác nhau của cùng một mã.
- Biên lai Google Play của khách hàng hiển thị mã đơn hàng của khoản phí tương ứng, kể cả các lần gia hạn.
- Trong ứng dụng của bạn, Purchase.getOrderId() từ Play Billing Library trả về mã của đơn hàng ban đầu cho các lần gia hạn thuê bao. Ví dụ của chính Google: thay vì GPA.1234-5678-9012-34567..0, bạn nhận được GPA.1234-5678-9012-34567.
- Trên máy chủ của bạn, purchases.subscriptionsv2 cung cấp cho mỗi line item một latestSuccessfulOrderId, là mã của đơn hàng thành công gần nhất cho mục đó. Google thêm trường này vào ngày 21 tháng 5 năm 2025.
- Trong Voided Purchases API, orderId xác định duy nhất một giao dịch mua một lần, một giao dịch mua thuê bao hoặc một lần gia hạn thuê bao. Tài liệu của Google khuyên dùng orderId, không phải purchase token, để phân biệt các lần gia hạn.
Purchase token thực ra dùng để làm gì
Purchase token xác định toàn bộ giao dịch mua. Với gói thuê bao, một token bao gồm khoản phí ban đầu và mọi lần gia hạn sau đó. Vì vậy, đó là khóa đúng cho quyền sử dụng nhưng là khóa sai cho việc hoàn tiền. Hoàn tiền và chargeback xảy ra trên một khoản phí duy nhất, và chỉ mã đơn hàng mới chỉ đúng một khoản phí.
Cách tra cứu một đơn hàng Google Play
Trong Play Console
Quản lý đơn hàng (Order management) chấp nhận mã đơn hàng hoặc địa chỉ email đầy đủ của khách hàng trong ô tìm kiếm. Mỗi đơn hàng hiển thị một trong các trạng thái sau: Đã xử lý (Processed), Đã hủy (Cancelled), Đang chờ (Pending), Đang chờ hoàn tiền (Pending refund), Đã hoàn tiền (Refunded), Đang chờ hoàn tiền một phần (Pending partial refund) hoặc Đã hoàn tiền một phần (Partially refunded). Nếu khách hàng đưa email thay vì biên lai, hãy tìm theo email và chọn khoản phí theo ngày, rồi xác nhận hậu tố trước khi hành động.
Với Orders API
Kể từ ngày 21 tháng 5 năm 2025, tài nguyên Orders trong Google Play Developer API có orders.get cho một đơn hàng và orders.batchget cho một danh sách. Một vài giới hạn quan trọng trong thực tế:
- batchget nhận từ 1 đến 1.000 mã đơn hàng mỗi yêu cầu, và các mã phải khác nhau.
- Nếu bất kỳ mã đơn hàng nào không được tìm thấy hoặc không thuộc gói ứng dụng, toàn bộ yêu cầu batchget sẽ thất bại.
- Các lệnh gọi Orders API được tính vào hạn mức Play Developer API của bạn, mặc định là 200.000 lệnh gọi mỗi ngày.
Order trả về mới là phần hữu ích. Nó chứa state của đơn hàng, purchaseToken, createTime và lastEventTime, tổng tiền và thuế, một salesChannel như IN_APP hoặc PLAY_STORE, và một orderHistory gồm các sự kiện xử lý, hủy, hoàn tiền và hoàn tiền một phần. Nó cũng có developerRevenueInBuyerCurrency, được Google định nghĩa là doanh thu của bạn tính bằng đơn vị tiền tệ của người mua, đã trừ các khoản hoàn tiền một phần, thuế và phí. Khi Google là bên bán hàng chính thức (merchant of record), địa chỉ người mua chỉ chứa quốc gia.
| State đơn hàng | Tài liệu tham khảo của Google ghi gì |
|---|---|
| PENDING | Đã tạo và đang chờ xử lý |
| PROCESSED | Đã xử lý thành công |
| CANCELED | Đã hủy trước khi được xử lý |
| PENDING_REFUND | Yêu cầu hoàn tiền đang chờ xử lý |
| PARTIALLY_REFUNDED | Một phần số tiền đơn hàng đã được hoàn |
| REFUNDED | Toàn bộ số tiền đơn hàng đã được hoàn |
Hoàn tiền đúng đơn hàng
Khi đã biết khách hàng nói đến khoản phí nào, Play Console cho bạn một lựa chọn phụ thuộc vào vị trí của đơn hàng đó trong gói thuê bao.
| Tùy chọn | Áp dụng cho | Điều gì xảy ra |
|---|---|---|
| Hoàn tiền và thu hồi (Refund and revoke) | Đơn hàng gần nhất trong một gói thuê bao | Hoàn tiền, gói thuê bao bị gỡ ngay lập tức, các lần gia hạn sau bị hủy |
| Chỉ hoàn tiền (Refund only) | Một đơn hàng cũ hơn trong gói thuê bao | Hoàn tiền, gói thuê bao vẫn hoạt động |
| Hoàn tiền một phần (Partial refund) | Giao dịch mua trong ứng dụng và gói thuê bao đặt sau tháng 3 năm 2018, không áp dụng cho ứng dụng trả phí | Bất kỳ tỷ lệ nào dưới 100%, hoặc số tiền trước thuế thấp hơn tổng đơn hàng |
| Hủy gói thuê bao (Cancel subscription) | Một gói thuê bao đang hoạt động | Không hoàn tiền, quyền truy cập kéo dài đến hết kỳ thanh toán hiện tại |
Qua API, orders.refund nhận tên gói ứng dụng và mã đơn hàng. Đơn hàng cũ hơn 3 năm không thể được hoàn tiền. Tham số tùy chọn revoke, khi đặt là true, chấm dứt ngay quyền truy cập vào gói thuê bao hoặc vật phẩm trong ứng dụng. Trang trợ giúp của Google cũng lưu ý rằng không thể đảo ngược khoản hoàn tiền sau khi đã thực hiện, nên mã đơn hàng bạn truyền vào là quyết định cuối cùng.
Vì sao một đơn hàng $0.00 xuất hiện với người đăng ký?
Tài liệu về vòng đời gói thuê bao của Google giải thích điều này. Khi người dùng đăng ký lại từ ứng dụng của bạn cho cùng một base plan trước khi gói thuê bao hết hạn, Google Play tạo một đơn hàng $0.00. Họ không bị tính phí vì đã trả cho kỳ hiện tại, và việc thanh toán bình thường tiếp tục vào ngày gia hạn ban đầu. Đây không phải dùng thử miễn phí hay khuyến mãi. Không có gì để hoàn trên đơn hàng đó. Nếu khách hàng muốn lấy lại tiền, hãy tìm đơn hàng có trả phí trước nó.
Hoàn tiền nhầm đơn hàng khiến bạn mất gì
Hoàn tiền trả lại giá bán. Hoàn tiền một phần cũng vận hành như vậy theo tỷ lệ. Ví dụ của Google: hoàn tiền một phần 50% cũng thu lại 50% khoản thanh toán cho bạn và 50% phí dịch vụ. Thứ không quay lại là mọi chi phí bạn đã bỏ ra để phục vụ khách hàng đó, gồm tài nguyên tính toán, lệnh gọi API bên thứ ba, lưu trữ và mọi khoản chi cho đối tác liên kết. Hoàn nhầm đơn hàng, bạn sẽ trả khoản đó hai lần.
Chuyện xảy ra như sau. Một khách hàng dùng gói tháng viết thư về khoản phí ..4, khoản của tuần trước. Một người trong nhóm bạn tìm theo email, thấy đơn hàng đầu tiên ở trên cùng, và nhấn Chỉ hoàn tiền trên đơn hàng gốc từ nhiều tháng trước. Giờ khách hàng được hoàn tiền cho một kỳ họ đã sử dụng. Khoản phí họ phàn nàn vẫn còn nguyên, và gói thuê bao của họ vẫn tiếp tục gia hạn. Họ vẫn có thể yêu cầu ngân hàng đảo ngược khoản phí tuần trước.

Con đường qua ngân hàng giờ đây là con đường tốn kém. Với các đơn hàng đặt sau ngày 3 tháng 8 năm 2026, Google cho biết khi một chargeback được chấp nhận, nhà phát triển chịu trách nhiệm cho giá mua, trừ phí dịch vụ của Play, cộng thêm phí chargeback mà ngân hàng thu. Chargeback là quyết định cuối cùng tại ngân hàng. Một hậu tố đọc nhầm có thể dẫn đến mất số tiền bằng hai lần hoàn tiền, cộng thêm phí.
Những khoản hoàn tiền không bao giờ đến hộp thư của bạn
Phần lớn các khoản hoàn tiền Google Play hoàn toàn không cần đến bạn hay mã đơn hàng. Chính sách hoàn tiền của Google cho biết khách hàng có thể được hoàn tiền trong vòng 48 giờ sau khi mua thông qua Google Play, và sau 48 giờ thì nên liên hệ nhà phát triển. Google cũng hoàn tiền và thu hồi các gói thuê bao mà bạn không acknowledge trong vòng ba ngày. Bạn chỉ biết về những trường hợp đó sau này qua Voided Purchases API, nơi báo cáo voidedSource (0 là Người dùng, 1 là Nhà phát triển, 2 là Google) và một voidedReason như Remorse, Chargeback hoặc Unacknowledged_purchase.
Chỉ có một quy trình hoàn tiền của Google Play yêu cầu ý kiến từ phía bạn. Khi một chargeback cần nhà phát triển xem xét, bạn có 24 giờ để phản hồi qua orders.reviewrefund với lựa chọn hoàn tiền APPROVE, DECLINE hoặc NEUTRAL cùng bằng chứng sử dụng giao dịch mua. RefundHalt thay bạn trả lời yêu cầu xem xét đó trong thời hạn, dựa trên dữ liệu sử dụng bạn đã có, để một đơn hàng bị tranh chấp nhận được bằng chứng của bạn thay vì sự im lặng.
Danh sách kiểm tra ngắn cho phiếu hỗ trợ liên quan đến mã đơn hàng
- Yêu cầu mã đơn hàng đầy đủ trên biên lai Google Play, bao gồm cả hậu tố.
- Tra cứu trong Play Console hoặc bằng orders.get, và kiểm tra state trước tiên.
- Xác nhận ngày tính phí khớp với mô tả của khách hàng.
- Chỉ dùng Hoàn tiền và thu hồi cho đơn hàng gần nhất, và Chỉ hoàn tiền cho các đơn hàng cũ hơn.
- Ghi lại mã đơn hàng bạn đã hoàn tiền, để dễ nhận ra một chargeback sau này trên đơn hàng khác.
Câu hỏi thường gặp
- ..0 ở cuối mã đơn hàng Google Play có nghĩa là gì?
- Nó đánh dấu lần gia hạn đầu tiên của một gói thuê bao. Google Play gán cho mỗi lần gia hạn mã đơn hàng gốc của gói thuê bao cộng thêm hai dấu chấm và một bộ đếm bắt đầu từ số không, nên GPA.1234-5678-9012-34567..0 là lần gia hạn đầu tiên và ..1 là lần thứ hai. Mã gốc không có hậu tố là khoản phí ban đầu.
- Vì sao getOrderId() trong ứng dụng của tôi trả về mã đơn hàng khác với biên lai của khách hàng?
- Vì Play Billing Library trả về mã của đơn hàng ban đầu cho các lần gia hạn thuê bao. Ví dụ của Google là thay vì GPA.1234-5678-9012-34567..0 cho lần gia hạn đầu tiên, getOrderId() trả về GPA.1234-5678-9012-34567. Hãy dùng latestSuccessfulOrderId từ purchases.subscriptionsv2 trên máy chủ để lấy mã riêng của lần gia hạn.
- Làm sao để tra cứu một đơn hàng Google Play theo mã đơn hàng?
- Tìm trong Quản lý đơn hàng (Order management) của Play Console, nơi chấp nhận mã đơn hàng hoặc địa chỉ email đầy đủ của khách hàng, hoặc gọi orders.get trong Google Play Developer API. orders.batchget tra cứu cùng lúc từ 1 đến 1.000 mã đơn hàng khác nhau, và toàn bộ yêu cầu thất bại nếu có bất kỳ mã nào không được tìm thấy.
- Tôi có thể hoàn tiền cho một đơn hàng Google Play đã hơn một năm không?
- Có, tối đa 3 năm. Tài liệu tham khảo orders.refund của Google cho biết đơn hàng cũ hơn 3 năm không thể được hoàn tiền. Với một đơn hàng cũ hơn trong gói thuê bao, tùy chọn Chỉ hoàn tiền (Refund only) của Play Console trả lại tiền và giữ gói thuê bao vẫn hoạt động.
- Vì sao có một đơn hàng Google Play $0.00 cho người đăng ký?
- Đơn hàng này xuất hiện khi người dùng đăng ký lại từ ứng dụng của bạn cho cùng một base plan trước khi gói thuê bao hết hạn. Người dùng không bị tính phí vì đã trả cho kỳ hiện tại, và việc thanh toán định kỳ tiếp tục vào ngày gia hạn ban đầu. Google cho biết điều này không có nghĩa là đã áp dụng dùng thử miễn phí hay giảm giá khuyến mãi.
Nguồn và tài liệu đọc thêm
- Android Developers: Purchase (Play Billing Library), getOrderId
- Google Play Developer API: REST Resource orders
- Google Play Developer API: orders.batchget
- Google Play Developer API: orders.refund
- Google Play Developer API release notes
- Google Play Developer API: purchases.voidedpurchases
- Play Console Help: Issue refunds or cancel orders
- Google Play Billing: Subscription lifecycle
- Google Play Help: Apps, games and in-app purchases refund policies
- 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.