Order ID App Store trên biên lai của khách hàng cho bạn biết họ đã mua gì và Apple đã hoàn tiền hay chưa
Endpoint Look Up Order ID của Apple biến order ID trên biên lai App Store của khách hàng thành các giao dịch đã ký, kèm ngày và lý do hoàn tiền. Đây là cách dùng nó cho email hoàn tiền, những gì nó không làm được, và order ID của Google Play khác ra sao.

Điểm chính
- Apple gửi email biên lai có order ID mỗi lần khách hàng mua hàng trong ứng dụng, và khách hàng cũng có thể tìm order ID trong lịch sử mua hàng App Store của họ.
- Endpoint Look Up Order ID của App Store Server API (GET /inApps/v1/lookup/{orderId}) trả về một hoặc nhiều giao dịch đã ký cho một order ID hợp lệ, nên bộ phận hỗ trợ thấy được productId và purchaseDate mà không phải đoán.
- Một giao dịch App Store đã giải mã có revocationDate và revocationReason, nên việc tra cứu order ID cho thấy Apple đã hoàn tiền giao dịch đó hay chưa. Lý do 1 nghĩa là Apple hoàn tiền vì một vấn đề thực tế hoặc được cho là có trong ứng dụng.
- Look Up Order ID trả về OrderLookupStatus 1 và không có mảng signedTransactions khi order ID không hợp lệ với ứng dụng của bạn, dấu hiệu của biên lai sai hoặc giao dịch từ ứng dụng khác.
- Look Up Order ID không có trong môi trường sandbox của Apple, và giới hạn tốc độ trên môi trường production là 10 yêu cầu mỗi giây cho mỗi ứng dụng, áp dụng theo từng giờ.
- Nhà phát triển không thể tự hoàn tiền trên App Store. Apple quyết định tại reportaproblem.apple.com, và bước cung cấp bằng chứng duy nhất của nhà phát triển là trả lời CONSUMPTION_REQUEST trong vòng 12 giờ.
- Google Play gửi email order ID cho mỗi giao dịch mua một lần và mỗi lần gia hạn gói đăng ký, và nhà phát triển có thể tìm order ID đó trong Play Console rồi hoàn tiền trực tiếp. Play Console cho biết một khoản hoàn tiền không thể đảo ngược.
Trước khi trả lời email đòi hoàn tiền của một khách hàng iPhone, hãy hỏi order ID App Store trên biên lai Apple của họ. Chỉ một chuỗi đó, khi chạy qua endpoint Look Up Order ID của Apple, cho bạn biết họ đã mua sản phẩm nào, vào lúc nào, và Apple đã hoàn tiền hay chưa. Không có nó, bạn phải dò ảnh chụp màn hình và địa chỉ email trong cơ sở dữ liệu rồi hy vọng. Có nó, chỉ vài giây là bạn biết mình đang nói chuyện với một khách hàng trả tiền, một khách hàng đã được Apple hoàn tiền, hay một người cầm biên lai của ứng dụng khác.
Order ID App Store đến từ đâu
Tài liệu của Apple nói rất cụ thể. Khi khách hàng thực hiện một hoặc nhiều giao dịch mua trong ứng dụng của bạn, App Store gửi cho họ biên lai qua email, và biên lai đó có order ID. Khách hàng cũng có thể tìm order ID trong lịch sử mua hàng App Store. Trang lịch sử mua hàng của Apple nằm tại reportaproblem.apple.com và trong ứng dụng App Store ở mục Apps & Purchase History, mặc định hiển thị 90 ngày gần nhất, có bộ lọc cho các giao dịch cũ hơn.
Vậy là khách hàng đã cầm sẵn chìa khóa. Biểu mẫu hỗ trợ của bạn chỉ cần hỏi nó.
Vì sao địa chỉ email là chưa đủ
Apple không chia sẻ email Apple Account của khách hàng với bạn. Địa chỉ viết vào hộp thư hỗ trợ của bạn có thể chẳng liên quan gì đến tài khoản đã thanh toán. Nếu bạn đặt appAccountToken khi mua, bạn có thể gắn giao dịch với ID người dùng của mình, nhưng chỉ từ phía bạn. Order ID hoạt động từ phía khách hàng, từ một biên lai họ có thể chuyển tiếp chỉ với một lần chạm.
Look Up Order ID trả về những gì
Look Up Order ID là một phần của App Store Server API, có từ phiên bản 1.1.0. Bạn gọi GET https://api.storekit.apple.com/inApps/v1/lookup/{orderId} với JWT đã ký của bạn. Apple cho biết phản hồi dựa trên lịch sử mua trong ứng dụng của khách hàng, bất kể họ đã cài đặt, gỡ bỏ hay cài lại ứng dụng.
| Trường hoặc hành vi | Tài liệu của Apple nói gì | Bộ phận hỗ trợ làm gì với nó |
|---|---|---|
| OrderLookupStatus 0 | Order ID hợp lệ. Phản hồi chứa một mảng gồm một hoặc nhiều giao dịch đã ký | Giải mã từng giao dịch và đọc thông tin mua hàng |
| OrderLookupStatus 1 | Phản hồi không có mảng signedTransactions | Coi order ID là không hợp lệ với ứng dụng của bạn. Yêu cầu đúng biên lai |
| productId và purchaseDate | Apple nêu đây là các trường dùng cho hỗ trợ khách hàng | Xác nhận đã mua gì và khi nào |
| revocationDate | Thời điểm App Store hoàn tiền giao dịch hoặc thu hồi nó khỏi Family Sharing | Nếu có, Apple đã trả lại tiền cho khách hàng |
| revocationReason | 0: hoàn tiền vì lý do khác, ví dụ mua nhầm. 1: hoàn tiền vì một vấn đề thực tế hoặc được cho là có trong ứng dụng của bạn | Giá trị 1 là tín hiệu về sản phẩm, không chỉ là một phiếu hỗ trợ |
| appAccountToken | UUID bạn đặt khi mua, nếu có đặt | Khớp đơn hàng với hồ sơ người dùng của bạn |
| price và currency | Apple nói không dùng chúng để đối soát doanh thu | Dùng báo cáo App Store Connect cho phần tiền |
| Sandbox | Endpoint không có trong môi trường sandbox | Chỉ kiểm thử bằng order ID production |
| Giới hạn tốc độ | 10 yêu cầu mỗi giây cho mỗi ứng dụng, áp dụng theo giờ. Vượt quá sẽ nhận HTTP 429 với header Retry-After | Thừa đủ cho bộ phận hỗ trợ, không dành cho quét hàng loạt |
Biên lai này có hợp lệ với ứng dụng của tôi không?
Đó là câu hỏi OrderLookupStatus trả lời đầu tiên. Giá trị 1 nghĩa là order ID không dẫn đến giao dịch nào trong ứng dụng của bạn. Các trường hợp thường gặp là gõ sai, biên lai của ứng dụng khác, hoặc biên lai hoàn toàn không phải từ App Store. Đừng hoàn tiền, cộng tín dụng hay khôi phục gì khi giá trị là 1. Hãy nhờ khách hàng kiểm tra lại biên lai.
Apple đã hoàn tiền giao dịch này chưa?
Kiểm tra revocationDate trên từng giao dịch đã giải mã. Nếu có giá trị, Apple đã hoàn tiền giao dịch đó hoặc thu hồi nó khỏi Family Sharing, và khách hàng đã nhận lại tiền. App Store Server Notifications của bạn lẽ ra đã gửi REFUND cho cùng giao dịch, nên đây cũng là cách rẻ để xác nhận máy chủ của bạn thực sự đã thu hồi quyền truy cập.

Order ID không làm được gì trên App Store
Nó không thể tạo khoản hoàn tiền. Nhà phát triển không có nút hoàn tiền App Store. Apple quyết định việc hoàn tiền, và bài hỗ trợ của Apple đưa khách hàng đến reportaproblem.apple.com, nơi họ chọn "I'd like to", rồi "Request a refund", chọn lý do và chọn mục cần hoàn. Apple cũng cho biết khoản phí đang chờ xử lý không thể hoàn tiền cho đến khi khách hàng nhận được biên lai qua email.
Nơi duy nhất bạn có tiếng nói là CONSUMPTION_REQUEST của Apple. Khi khách hàng yêu cầu Apple hoàn tiền, Apple có thể gửi thông báo đó, và bạn có 12 giờ để trả lời bằng Send Consumption Information. Tra cứu order ID là công cụ hỗ trợ. Nó không mở ra khung thời gian đó và cũng không kéo dài nó.
Một email hoàn tiền tốn bao nhiêu khi bạn bỏ qua bước tra cứu
Hỗ trợ khách hàng mà không có order ID là nơi tiền rò rỉ âm thầm. Ba kiểu sau lặp đi lặp lại.
- Quà bù thêm trên khoản đã hoàn. Apple hoàn tiền giao dịch, khách hàng cũng viết thư cho bạn, và bộ phận hỗ trợ tặng tín dụng miễn phí hoặc thêm một tháng. Mỗi khoản tín dụng bạn tặng chạy trên năng lực tính toán, lệnh gọi API và dung lượng lưu trữ mà bạn trả tiền, cho một tài khoản đã được trả lại tiền.
- Quyền truy cập không bao giờ bị thu hồi. Nếu khâu xử lý REFUND của bạn lỗi, khách hàng đã được hoàn tiền vẫn tiếp tục sử dụng. Một lần tra cứu cho thấy revocationDate trong khi cơ sở dữ liệu của bạn vẫn ghi đang hoạt động là một báo cáo lỗi có gắn giá tiền.
- Sai tài khoản, sửa sai chỗ. Khôi phục hoặc cộng tín dụng cho tài khoản đứng sau một email được chuyển tiếp, trong khi order ID thuộc về người khác, là trao dịch vụ trả phí cho một người chưa từng mua.
Không trường hợp nào cần đến tranh chấp hay thời hạn mới gây thiệt hại. Chúng chỉ là những câu trả lời hỗ trợ đưa ra khi thiếu dữ kiện. Một lệnh gọi API cho mỗi phiếu hỗ trợ xóa bỏ việc đoán mò.
revocationReason 1 có nghĩa là tôi đã làm sai?
Không hẳn. Apple cho biết lý do 1 nghĩa là Apple hoàn tiền vì một vấn đề thực tế hoặc được cho là có trong ứng dụng của bạn. Chữ "được cho là" mang rất nhiều sức nặng ở đây. Nhưng một cụm hoàn tiền lý do 1 trên cùng một sản phẩm, sau cùng một bản phát hành, là phản hồi sản phẩm rõ ràng nhất mà Apple đưa cho bạn. Hãy đếm chúng.
Order ID của Google Play khác ra sao
Google Play vận hành theo chiều ngược lại. Tài liệu thanh toán của Google cho biết người dùng nhận email có order ID riêng cho mỗi giao dịch mua sản phẩm một lần, cho lần mua gói đăng ký đầu tiên, và cho mỗi lần gia hạn định kỳ, và bạn có thể dùng order ID để quản lý hoàn tiền trong Play Console. Bạn tìm trong Order management theo order ID hoặc địa chỉ email đầy đủ của người dùng, rồi tự hoàn tiền.
| Câu hỏi | Order ID App Store | Order ID Google Play |
|---|---|---|
| Khách hàng tìm thấy ở đâu | Biên lai email và lịch sử mua hàng App Store | Biên lai email cho mỗi giao dịch mua và mỗi lần gia hạn |
| Bạn tra cứu thế nào | Look Up Order ID trong App Store Server API | Tìm trong Order management của Play Console |
| Có hoàn tiền từ đó được không | Không. Apple quyết định | Có. Hoàn tiền toàn bộ, và hoàn tiền một phần cho giao dịch trong ứng dụng và gói đăng ký |
| Khung thời gian gửi bằng chứng | CONSUMPTION_REQUEST, 12 giờ, Apple quyết định | Xem xét chargeback qua orders.reviewrefund, 24 giờ |
| Khoản hoàn tiền có thể đảo ngược không | Bạn thì không | Không. Play Console cho biết khoản hoàn tiền không thể đảo ngược |
Trên Google Play, order ID quan trọng hơn vì chính bạn là người bấm nút. Play Console cho biết hoàn tiền đơn hàng đăng ký gần nhất sẽ gỡ gói đăng ký ngay lập tức và hủy các lần gia hạn sau, còn hoàn tiền một đơn hàng cũ hơn chỉ là hoàn tiền và gói đăng ký vẫn hoạt động. Hoàn tiền một phần chỉ được hỗ trợ cho đơn hàng đặt sau tháng 3 năm 2018, và bạn không thể hoàn tiền một phần cho ứng dụng trả phí.
Đặt order ID lên đầu quy trình hỗ trợ hoàn tiền
- Hỏi order ID trong biểu mẫu hỗ trợ, kèm một dòng gợi ý: nó nằm trong email biên lai của Apple hoặc Google Play.
- Trên iOS, gọi Look Up Order ID, giải mã mọi giao dịch, và hiển thị productId, purchaseDate, revocationDate và revocationReason trên một màn hình cho bộ phận hỗ trợ.
- Nếu OrderLookupStatus là 1, dừng lại và yêu cầu đúng biên lai. Không cấp gì cả.
- Nếu revocationDate có giá trị, xác nhận quyền truy cập đã bị thu hồi trên máy chủ của bạn, rồi đóng phiếu. Không tặng bù thêm.
- Nếu không có và khách hàng muốn lấy lại tiền, hướng họ đến reportaproblem.apple.com và chuẩn bị sẵn trình xử lý CONSUMPTION_REQUEST cho khung 12 giờ. RefundHalt trả lời yêu cầu đó bằng dữ liệu tiêu dùng mà Apple yêu cầu.
- Trên Android, tìm đúng đơn hàng trong Play Console trước khi hoàn tiền, và chủ động chọn giữa chỉ hoàn tiền hoặc hoàn tiền và thu hồi quyền truy cập.
Câu hỏi thường gặp
- Là nhà phát triển, làm sao tra cứu order ID App Store?
- Gọi endpoint Look Up Order ID của App Store Server API, GET https://api.storekit.apple.com/inApps/v1/lookup/{orderId}, với JWT đã ký của bạn. Một order ID hợp lệ trả về OrderLookupStatus 0 và một hoặc nhiều giao dịch đã ký để bạn giải mã và đọc productId, purchaseDate cùng mọi chi tiết hoàn tiền. Endpoint này không có trong sandbox.
- Khách hàng tìm order ID App Store ở đâu?
- Trong biên lai email Apple gửi mỗi lần họ mua hàng trong ứng dụng, và trong lịch sử mua hàng App Store tại reportaproblem.apple.com hoặc ở mục Apps & Purchase History trong ứng dụng App Store. Lịch sử mua hàng mặc định hiển thị 90 ngày gần nhất, có bộ lọc cho các giao dịch cũ hơn.
- Tôi có thể hoàn tiền một giao dịch App Store bằng order ID không?
- Không. Nhà phát triển không thể hoàn tiền trên App Store. Apple quyết định khi khách hàng yêu cầu tại reportaproblem.apple.com. Phần đóng góp của bạn là trả lời CONSUMPTION_REQUEST của Apple trong vòng 12 giờ bằng Send Consumption Information.
- Làm sao biết Apple đã hoàn tiền một giao dịch hay chưa?
- Tra cứu order ID và kiểm tra revocationDate trên từng giao dịch đã giải mã. Nếu có giá trị, Apple đã hoàn tiền giao dịch hoặc thu hồi nó khỏi Family Sharing. revocationReason 0 nghĩa là lý do khác như mua nhầm, còn 1 nghĩa là một vấn đề thực tế hoặc được cho là có trong ứng dụng của bạn.
- OrderLookupStatus 1 nghĩa là gì?
- Nghĩa là order ID không hợp lệ với ứng dụng của bạn, và phản hồi không có mảng signedTransactions. Thường là khách hàng gửi biên lai của ứng dụng khác, gõ sai ID, hoặc gửi biên lai không phải từ App Store. Hãy yêu cầu đúng biên lai trước khi cấp bất cứ thứ gì.
Nguồn và tài liệu đọc thêm
- Apple Developer Documentation: Look Up Order ID
- Apple Developer Documentation: orderId
- Apple Developer Documentation: revocationReason
- Apple Developer Documentation: Identifying rate limits
- Apple Support: See your purchase history for the App Store, iTunes Store, and more
- Apple Support: Request a refund for apps or content that you bought from Apple
- Play Console Help: Refund orders and subscriptions
- Android Developers: Integrate the Google Play Billing Library into your app
RefundHalt
Chế độ tự động xử lý hoàn tiền cho App Store và Google Play
Đọc tiếp
Hoàn tiền web checkout trên iOS giờ đến tay bạn thay vì Apple, và tranh chấp ngân hàng cũng vậy
Ứng dụng iPhone tại Mỹ giờ có thể dẫn người mua sang web checkout. Apple nói không thể hỗ trợ hoàn tiền cho các giao dịch này, nên việc xử lý hoàn tiền, chargeback và phí tranh chấp $15 chuyển sang bạn. Dưới đây là những gì thay đổi, chi phí ra sao và cách giảm tranh chấp.
Khoản hoàn tiền ứng dụng trả phí không bao giờ đến được máy chủ của bạn, nên chính ứng dụng phải tự phát hiện
Hoàn tiền cho ứng dụng trả phí trả trước bỏ qua mọi thông báo mà máy chủ của bạn lắng nghe. Google cho người mua hai giờ để trả lại và gỡ cài đặt ứng dụng, Apple có thể hoàn tiền trong vòng 90 ngày theo thỏa thuận với bạn, và không bên nào yêu cầu bằng chứng. Dưới đây là những gì mỗi store cho bạn biết, chi phí thực tế, và cách kiểm tra ngay trong ứng dụng.