Nếu ứng dụng của bạn vẫn dùng App Store Server Notifications V1, Apple sẽ không bao giờ hỏi bạn về các yêu cầu hoàn tiền gói đăng ký
Apple đã ngừng hỗ trợ App Store Server Notifications V1 từ tháng 6 năm 2023, và phiên bản này chưa bao giờ có CONSUMPTION_REQUEST cho gói đăng ký, REFUND_DECLINED hay REFUND_REVERSED. Bài viết này giải thích máy chủ V1 bỏ lỡ những gì, thiệt hại ra sao và cách chuyển sang V2 mà không mất một khoản hoàn tiền nào.

Điểm chính
- Apple đã ngừng hỗ trợ App Store Server Notifications V1 và endpoint verifyReceipt vào ngày 5 tháng 6 năm 2023. Cả hai vẫn hoạt động, không nhận thêm tính năng mới và chưa có ngày kết thúc vòng đời được công bố.
- Tài liệu V1 của Apple chỉ liệt kê CONSUMPTION_REQUEST cho giao dịch mua trong ứng dụng loại tiêu hao. Yêu cầu tiêu thụ cho gói đăng ký tự động gia hạn được bổ sung vào App Store Server Notifications V2 vào tháng 4 năm 2024.
- REFUND_DECLINED và REFUND_REVERSED chỉ có trong App Store Server Notifications V2, vì vậy máy chủ V1 không bao giờ biết Apple đã từ chối một yêu cầu hoàn tiền hay đã thu hồi một khoản hoàn tiền.
- Trên V1, khoản hoàn tiền của Apple cho gói đăng ký tự động gia hạn đến dưới dạng CANCEL. Trên V2, nó đến dưới dạng REFUND kèm revocationDate và revocationReason trong giao dịch đã ký.
- Apple thử gửi lại một thông báo V2 bị lỗi năm lần trong khoảng một tuần, sau 1, 12, 24, 48 và 72 giờ. Một thông báo V1 bị lỗi chỉ được thử lại ba lần, sau 6, 24 và 48 giờ, và không thể khôi phục qua Get Notification History.
- Sau khi ứng dụng chuyển sang V2 trong App Store Connect, các thông báo mới đến ngay ở định dạng V2, trong khi các thông báo V1 đang được thử lại vẫn có thể tiếp tục đến trong khoảng 78 giờ.
Version 1 của App Store Server Notifications vẫn gửi thông tin hoàn tiền, nhưng lại thiếu đúng một thông báo cho phép bạn trình bày lập luận trong một yêu cầu hoàn tiền gói đăng ký. Apple ngừng hỗ trợ V1 vào ngày 5 tháng 6 năm 2023, cùng lúc với endpoint verifyReceipt, và từ đó chỉ bổ sung mọi tính năng liên quan đến hoàn tiền vào V2. Nếu phần cài đặt App Store Connect của bạn vẫn ghi Version 1, Apple có thể quyết định một khoản hoàn tiền gói đăng ký mà không hề gửi CONSUMPTION_REQUEST đến máy chủ của bạn. Bạn không thua trong cuộc tranh luận đó. Bạn chỉ đơn giản là không bao giờ được mời tham gia.
Việc Apple ngừng hỗ trợ App Store Server Notifications V1 có nghĩa là gì
Ngừng hỗ trợ không có nghĩa là bị tắt. Một kỹ sư của Apple đã viết trên diễn đàn nhà phát triển vào tháng 6 năm 2023 rằng verifyReceipt và thông báo V1 sẽ tiếp tục hoạt động cho đến khi có thông báo về ngày kết thúc vòng đời, rằng ngày đó chưa được ấn định và nhà phát triển sẽ được báo trước. Hơn ba năm sau, App Store Connect vẫn cung cấp lựa chọn "Version 1 (deprecated)" khi bạn thiết lập URL máy chủ.
Điều mà việc ngừng hỗ trợ thực sự mang lại là sự đóng băng. Mọi thay đổi trong changelog thông báo của Apple kể từ tháng 6 năm 2023 đều là thay đổi của V2: trường mới trong giao dịch đã ký, loại thông báo mới, dữ liệu cam kết 12 tháng được bổ sung vào tháng 4 năm 2026. Máy chủ V1 không thấy bất kỳ điều nào trong số đó.
Những tín hiệu hoàn tiền mà máy chủ V1 không bao giờ nhận được
Dưới đây là cách cùng một sự kiện hoàn tiền đến máy chủ V1 và máy chủ V2, theo tài liệu của Apple cho từng phiên bản.
| Sự kiện hoàn tiền | Version 1 | Version 2 |
|---|---|---|
| Khách hàng yêu cầu Apple hoàn tiền cho một sản phẩm tiêu hao | CONSUMPTION_REQUEST | CONSUMPTION_REQUEST |
| Khách hàng yêu cầu Apple hoàn tiền cho một gói đăng ký tự động gia hạn | Không có trong tài liệu V1 | CONSUMPTION_REQUEST, từ tháng 4 năm 2024 |
| Apple hoàn tiền một gói đăng ký tự động gia hạn | CANCEL | REFUND |
| Apple hoàn tiền một sản phẩm tiêu hao, không tiêu hao hoặc gói đăng ký không tự gia hạn | REFUND | REFUND |
| Apple từ chối yêu cầu hoàn tiền mà khách hàng khởi tạo trong ứng dụng của bạn | Không có | REFUND_DECLINED |
| Apple thu hồi một khoản hoàn tiền đã chấp thuận | Không có | REFUND_REVERSED |
| Bạn khôi phục các thông báo bị lỡ trong lúc gián đoạn | Không có | Get Notification History |
V1 có còn nhận CONSUMPTION_REQUEST không?
Có, với sản phẩm tiêu hao. Tài liệu tham khảo V1 của Apple mô tả CONSUMPTION_REQUEST là thông báo được gửi khi khách hàng bắt đầu yêu cầu hoàn tiền cho một giao dịch mua trong ứng dụng loại tiêu hao. Một kỹ sư của Apple đã xác nhận trên diễn đàn vào năm 2023 rằng yêu cầu tiêu thụ của V1 được gửi cho các khoản hoàn tiền đủ điều kiện. Khoảng trống nằm ở gói đăng ký. Changelog của Apple ghi nhận yêu cầu tiêu thụ cho gói đăng ký bắt đầu từ ngày 11 tháng 4 năm 2024, trên V2, và tài liệu Send Consumption Information cho biết Apple gửi yêu cầu này qua endpoint V2 của bạn.
Vì sao CANCEL trên V1 dễ bị hiểu sai
Trên V1, khi Apple hoàn tiền một gói đăng ký, loại thông báo là CANCEL, thường đi kèm DID_CHANGE_RENEWAL_STATUS. Nhiều máy chủ coi mọi lần hủy là việc khách hàng tắt tự động gia hạn, nên quyền truy cập vẫn tiếp tục đến hết kỳ. V2 loại bỏ sự mơ hồ này. Một khoản hoàn tiền đến dưới dạng REFUND, còn việc khách hàng tắt gia hạn đến dưới dạng DID_CHANGE_RENEWAL_STATUS với loại phụ AUTO_RENEW_DISABLED.
Ở lại V1 khiến bạn mất bao nhiêu tiền
Apple quyết định mọi khoản hoàn tiền trên App Store. CONSUMPTION_REQUEST là thời điểm duy nhất dữ liệu sử dụng của bạn đến được với quyết định đó, và Apple yêu cầu bạn trả lời trong vòng 12 giờ. Trên V1, các khoản hoàn tiền gói đăng ký bỏ qua bước này.
Sau đây là một ví dụ với số liệu minh họa. Giả sử ứng dụng của bạn bán gói đăng ký hằng tháng giá $9.99 có bao gồm tạo ảnh bằng AI. Một người đăng ký tạo 400 ảnh trong một tháng, và mỗi lần tạo đều khiến bạn tốn tiền thật cho việc suy luận mô hình. Sau đó họ yêu cầu Apple hoàn tiền.
| Khoản chi phí | Máy chủ V1 | Máy chủ V2 |
|---|---|---|
| Phần thanh toán của bạn | Bị hoàn lại nếu Apple chấp thuận | Bị hoàn lại nếu Apple chấp thuận |
| Điện toán, lệnh gọi API và lưu trữ đã dùng trong tháng | Đã trả, không thu hồi được | Đã trả, không thu hồi được |
| Cơ hội cho Apple thấy 400 lần tạo ảnh | Không có | Một CONSUMPTION_REQUEST, 12 giờ |
| Biết Apple đã từ chối hoàn tiền | Không bao giờ | REFUND_DECLINED |
| Biết một khoản hoàn tiền đã bị thu hồi | Không bao giờ | REFUND_REVERSED |
Khoản thanh toán bạn mất là phần của bạn, không phải giá niêm yết. Apple trả 70% giá gói đăng ký, sau khi trừ các loại thuế áp dụng, trong năm đầu tiên người đăng ký sử dụng dịch vụ trả phí, và 85% sau đó hoặc cho thành viên của App Store Small Business Program. Hóa đơn điện toán thì không giảm theo. Chi phí suy luận, lệnh gọi API của bên thứ ba và lưu trữ tệp đã được trả khi khách hàng sử dụng.
Hai thông báo kết quả bị thiếu cũng gây tốn kém. Không có REFUND_REVERSED, máy chủ đã thu hồi quyền truy cập khi có hoàn tiền sẽ không bao giờ khôi phục quyền đó khi Apple thu hồi khoản hoàn tiền, nên một khách hàng đang trả tiền vẫn bị khóa và phải liên hệ bộ phận hỗ trợ. Không có REFUND_DECLINED, bạn không thể phân biệt một yêu cầu hoàn tiền còn đang chờ với một yêu cầu đã bị Apple từ chối.

Cách chuyển từ V1 sang V2 mà không bỏ sót khoản hoàn tiền nào
Chuyển sang V2 gồm một thay đổi phía máy chủ và một thiết lập. Hướng dẫn của chính Apple trên diễn đàn, từ một App Store Commerce Engineer vào tháng 12 năm 2025, giải thích điều gì xảy ra vào ngày bạn chuyển đổi.
Xây dựng endpoint V2 trước khi đổi thiết lập
- Chấp nhận một yêu cầu POST có body chứa signedPayload. Payload V2 ở định dạng JWS, được Apple ký, vì vậy hãy xác minh chữ ký trước khi tin bất kỳ nội dung nào bên trong. App Store Server Library của Apple làm việc này cho bạn.
- Chuyển phần xử lý CANCEL sang REFUND, và xử lý REFUND_DECLINED cùng REFUND_REVERSED như các trường hợp mới.
- Trả lời CONSUMPTION_REQUEST cho gói đăng ký bằng Send Consumption Information, và chỉ khi khách hàng đã đồng ý chia sẻ dữ liệu với Apple. Apple cho biết nếu không có sự đồng ý thì bạn không nên phản hồi.
- Trả về HTTP 200 đến 206 khi thành công. Bất kỳ mã 40x hoặc 50x nào cũng khiến Apple thử lại.
Đổi thiết lập trong App Store Connect
Trong App Store Connect, mở ứng dụng của bạn, chọn App Information trong mục General, tìm App Store Server Notifications và đặt Production Server URL thành endpoint V2 của bạn với Version 2 được chọn. Nếu muốn kiểm thử, hãy làm tương tự với URL sandbox trước, và dùng Request a Test Notification để xác nhận máy chủ của bạn phản hồi.
Giữ trình xử lý V1 hoạt động trong khoảng ba ngày
Sau khi chuyển đổi, các thông báo mới đến ngay ở định dạng V2, cho mọi gói đăng ký, cũ hay mới. Các thông báo V1 đang được thử lại vẫn tiếp tục đến ở định dạng V1 cho đến khi thành công hoặc hết lượt thử. Apple ước tính lần thử lại V1 cuối cùng có thể xảy ra vào khoảng 78 giờ, tức là 6 cộng 24 cộng 48. Hãy để trình xử lý cũ chạy quá mốc đó rồi mới gỡ bỏ.
Thay thế verifyReceipt luôn trong lúc này
verifyReceipt cũng bị ngừng hỗ trợ cùng ngày. Endpoint này vẫn phản hồi, nhưng Apple khuyến nghị máy chủ dùng App Store Server API thay thế. Get Transaction Info trả về một giao dịch đã ký, Get Transaction History trả về lịch sử của một khách hàng, và Get Refund History liệt kê mọi giao dịch mua đã được hoàn tiền của một khách hàng. Kết hợp với thông báo V2, các API này đáp ứng những gì phần lớn máy chủ từng dùng biên lai để làm, bao gồm cả trường cancellation_date từng đánh dấu một khoản hoàn tiền trong biên lai.
RefundHalt kết nối với App Store Server Notifications V2 và trả lời từng CONSUMPTION_REQUEST trong khung 12 giờ, dựa trên dữ liệu sử dụng mà ứng dụng của bạn đã ghi nhận. Nếu bạn vẫn đang dùng V1, việc chuyển đổi chính là bước giúp mọi điều đó trở nên khả thi.
Câu hỏi thường gặp
- App Store Server Notifications V1 có sắp bị tắt không?
- Chưa. Apple ngừng hỗ trợ V1 và verifyReceipt vào ngày 5 tháng 6 năm 2023, và cả hai vẫn hoạt động. Apple cho biết hiện chưa có ngày kết thúc vòng đời và nhà phát triển sẽ được thông báo trước. Trong thời gian đó, V1 không nhận thêm tính năng mới.
- Tôi có nhận được thông báo CONSUMPTION_REQUEST trên V1 không?
- Chỉ với sản phẩm tiêu hao, theo tài liệu V1 của Apple. Yêu cầu tiêu thụ cho gói đăng ký tự động gia hạn được bổ sung vào V2 vào tháng 4 năm 2024, và Apple gửi chúng qua endpoint V2 của bạn. Nếu bạn bán gói đăng ký và vẫn ở lại V1, bạn không thể trả lời các yêu cầu hoàn tiền đó.
- Một khoản hoàn tiền gói đăng ký trông như thế nào trên V1 so với V2?
- Trên V1, nó đến dưới dạng CANCEL, thường kèm DID_CHANGE_RENEWAL_STATUS. Trên V2, nó đến dưới dạng REFUND, với revocationDate và revocationReason trong giao dịch đã ký. V2 còn gửi REFUND_DECLINED khi Apple từ chối một yêu cầu hoàn tiền được khởi tạo trong ứng dụng của bạn và REFUND_REVERSED khi Apple thu hồi một khoản hoàn tiền đã chấp thuận.
- Điều gì xảy ra với thông báo khi tôi chuyển từ V1 sang V2?
- Các thông báo mới đến ở định dạng V2 ngay sau khi bạn chuyển đổi, cho tất cả gói đăng ký. Các thông báo V1 đang được thử lại tiếp tục đến ở định dạng V1 cho đến khi thành công hoặc hết lượt thử, mà Apple ước tính khoảng 78 giờ sau khi chuyển đổi. Hãy giữ cả hai trình xử lý chạy trong khoảng thời gian đó.
- Tôi có thể quay lại V1 sau khi đã chuyển sang V2 không?
- Có, thông qua endpoint Modify an App của App Store Connect API, như technote TN3180 của Apple mô tả. Apple gọi đây là trường hợp bất thường và vẫn đánh dấu V1 là đã ngừng hỗ trợ, vì vậy quay lại đồng nghĩa với việc từ bỏ yêu cầu tiêu thụ cho gói đăng ký và các thông báo hoàn tiền mới hơn.
Nguồn và tài liệu đọc thêm
- Apple Developer Documentation: App Store Server Notifications changelog
- Apple Developer Documentation: notification_type (Version 1)
- Apple Developer Documentation: notificationType (Version 2)
- Apple Developer Documentation: Responding to App Store Server Notifications
- Apple Developer Documentation: Send Consumption Information V1
- Apple Developer Documentation: App Store Receipts (verifyReceipt deprecated)
- Apple Developer Documentation: TN3180, Reverting to App Store Server Notifications V1
- App Store Connect Help: Enter server URLs for App Store Server Notifications
- Apple Developer Forums: When will the verifyReceipt API be deprecated? (Apple staff reply, June 2023)
- Apple Developer Forums: Switching App Store Server Notifications from V1 to V2 (Apple staff reply, December 2025)
- Apple Developer: Auto-renewable subscriptions (net revenue after one year of paid service)
RefundHalt
Chế độ tự động xử lý hoàn tiền cho App Store và Google Play
Đọc tiếp
Một lần hoàn tiền trên gói thuê bao tháng cam kết 12 tháng của Apple có thể chấm dứt cả năm, hoặc chỉ một tháng
Gói thuê bao tháng cam kết 12 tháng của Apple chia việc hoàn tiền thành hai trường hợp. Hoàn tiền cho một tháng đã qua thì việc thanh toán vẫn tiếp tục. Hoàn tiền cho tháng hiện tại thì cam kết chấm dứt ngay. Bài viết giải thích từng trường hợp đến máy chủ của bạn ra sao, tốn bao nhiêu, và bạn nên gửi gì cho Apple.
Chính sách hoàn tiền của ứng dụng không thể vượt trên Apple hay Google, vậy hãy viết chính sách khớp với những gì thực sự xảy ra
Chính sách hoàn tiền của ứng dụng chỉ ràng buộc bạn ở nơi bạn thực sự là người hoàn tiền. Apple tự hoàn tiền cho mọi giao dịch mua trên App Store, còn Google Play giao việc hoàn tiền cho bạn sau 48 giờ. Dưới đây là nội dung của từng thỏa thuận, cái giá của một lời hứa thiếu cân nhắc và những điều khoản đáng viết.