Penanganan refund rusak dengan diam-diam, jadi uji refund pembelian dalam aplikasi di sandbox sebelum pelanggan asli melakukannya
Penanganan refund Anda hanya berjalan setelah pelanggan sudah pergi, jadi bug di dalamnya tetap tak terlihat sampai merugikan uang sungguhan. Kedua toko memungkinkan Anda memicu refund di lingkungan uji terlebih dahulu. Berikut cara menguji refund pembelian dalam aplikasi di App Store dan Google Play sebelum satu pun menjadi nyata.

Poin utama
- Pengujian StoreKit di Xcode memungkinkan Anda me-refund pembelian secara lokal dengan mengklik panah refund di Transaction Manager, yang memicu listener Transaction.updates aplikasi Anda, tetapi tidak pernah menghubungi Apple, jadi tidak ada App Store Server Notification yang dikirim.
- Untuk menguji sisi server pada Apple, arahkan URL sandbox App Store Server Notifications V2 ke backend Anda: refund sandbox lalu mengirimkan REFUND asli, dan permintaan refund mengirimkan CONSUMPTION_REQUEST, ke server Anda.
- Endpoint Request a Test Notification dari Apple mengirim notifikasi bertipe TEST ke URL yang Anda konfigurasi dan mengembalikan testNotificationToken, sehingga Anda dapat memastikan webhook Anda dapat dijangkau sebelum ada peristiwa asli yang terpicu.
- Sandbox Apple tidak pernah mencoba ulang notifikasi yang gagal, jadi webhook yang mati saat sandbox terpicu akan menjatuhkan peristiwa itu tanpa percobaan kedua, jenis kegagalan yang sama yang kemudian merugikan Anda satu jendela refund asli.
- Google Play memberi penguji lisensi sebuah metode pembayaran bernama Test card, approves then charges back, yang memicu PendingRefundReviewNotification beberapa saat setelah pembelian sehingga Anda dapat melatih respons orders.reviewrefund 24 jam Anda.
- Untuk penguji lisensi di Google Play, pembelian yang tidak di-acknowledge otomatis di-refund setelah 3 menit alih-alih 3 hari yang ditunggu produksi, jadi jalur acknowledgment yang rusak gagal dengan cepat dan jelas saat pengujian.
- Penangan refund yang tidak pernah Anda uji adalah yang membuat akses berbayar pelanggan yang sudah di-refund tetap aktif, dan mulai 3 Agustus 2026 respons chargeback Google Play yang tidak diuji dapat merugikan Anda harga pembelian dikurangi biaya layanan Play ditambah biaya bank.
Penanganan refund Anda adalah satu-satunya jalur kode yang hanya berjalan setelah pelanggan sudah pergi. Tidak ada dalam QA normal Anda yang menyentuhnya, karena untuk mencapainya Anda harus benar-benar di-refund. Jadi ia dirilis tanpa diuji, diam selama berbulan-bulan, lalu gagal pada refund asli, di mana kegagalan itu merugikan uang alih-alih sebuah uji merah. Perbaikannya adalah berhenti memperlakukan refund sebagai sesuatu yang terjadi pada Anda dan mulai memicunya dengan sengaja. Baik Apple maupun Google memungkinkan Anda memicu refund di lingkungan uji dan menyaksikan server Anda bereaksi. Berikut cara menguji refund pembelian dalam aplikasi di App Store dan Google Play sebelum pelanggan yang membayar membuktikan penangan Anda rusak.
Tiga lingkungan tempat refund dapat terpicu, dan hanya satu yang produksi
Ada tiga tempat terpisah tempat refund Apple atau Google dapat dipicu saat Anda membangun, dan ketiganya tidak dapat dipertukarkan. Dua di antaranya milik Anda untuk dipicu sesuai permintaan. Yang ketiga adalah produksi, tempat Anda tidak pernah ingin bertemu bug refund untuk pertama kalinya. Jebakannya adalah menganggap yang mudah, pengujian lokal di Xcode, membuktikan seluruh pipeline Anda. Ia membuktikan aplikasi Anda. Ia tidak mengatakan apa pun tentang server Anda.
Pengujian StoreKit di Xcode bersifat lokal, jadi ia menguji aplikasi Anda dan tidak ada yang lain
Pengujian StoreKit bawaan Xcode berjalan terhadap file konfigurasi di Mac Anda, tanpa perjalanan bolak-balik ke Apple. Buka StoreKit Transaction Manager dari debug bar, pilih transaksi yang dibeli, dan klik panah refund melengkung. Transaksi berubah menjadi refunded dan listener Transaction.updates aplikasi Anda terpicu, persis seperti yang akan terjadi di dunia nyata. Anda juga dapat memanggil beginRefundRequest untuk menampilkan lembar refund asli, dan di lingkungan Xcode masalah yang Anda pilih dipetakan satu-ke-satu ke sebuah RevocationReason, dengan refund diterapkan segera. Ini adalah cara tercepat untuk membuktikan klien Anda memutus akses saat revocationDate menjadi non-nil. Ini juga seluruh yang dapat diberitahukan pengujian lokal kepada Anda, karena tidak ada di sini yang pernah mencapai server Apple, jadi tidak ada App Store Server Notification yang dikirim. Backend Anda tidak belajar apa pun.
Sandbox adalah tempat server Anda akhirnya mendengar tentang refund
Untuk menguji separuh integrasi Anda yang memutuskan soal uang, yaitu server Anda, Anda memerlukan sandbox Apple. Konfigurasikan URL sandbox App Store Server Notifications V2 di App Store Connect, masukkan sandbox tester di sebuah perangkat, dan beli. Kini refund di sandbox mengirimkan notifikasi REFUND asli ke backend Anda, dan permintaan refund pada consumable atau auto-renewable mengirimkan CONSUMPTION_REQUEST, payload tertanda yang sama yang akan diterima server produksi Anda. Sebelum memicu apa pun, panggil endpoint Request a Test Notification. Ia memberi tahu server App Store untuk mengirim notifikasi bertipe TEST ke URL yang Anda konfigurasi dan memberi Anda testNotificationToken, yang Anda teruskan ke Get Test Notification Status untuk memastikan pengiriman. Jika perjalanan bolak-balik itu tidak berhasil, notifikasi asli pun tidak akan.
| Lingkungan | Apa yang bisa dipicunya | Apa yang dibuktikannya | Apa yang tidak bisa dilakukannya |
|---|---|---|---|
| Pengujian StoreKit di Xcode | Refund melalui Transaction Manager atau lembar beginRefundRequest | Aplikasi Anda bereaksi terhadap refund secara lokal, dalam hitungan detik | Tidak pernah menghubungi Apple, jadi tidak ada notifikasi server yang dikirim |
| Sandbox | REFUND dan CONSUMPTION_REQUEST asli ke server Anda, ditambah notifikasi TEST sesuai permintaan | Backend Anda menerima, memverifikasi, dan menindaklanjuti payload tertanda | Tidak mencoba ulang notifikasi yang gagal diterima endpoint Anda |
| Production | Setiap refund, dengan uang sungguhan | Tidak ada yang ingin Anda pelajari di sini lebih dulu | Anda tidak bisa membatalkan biaya sebuah bug |
Cara menguji refund pembelian dalam aplikasi di App Store
Jalankan dalam urutan ini, dari pemeriksaan klien yang murah hingga perjalanan server penuh. Setiap langkah menguji bagian yang berbeda, dan yang belakangan adalah yang benar-benar ditagihkan produksi kepada Anda.
- Buat In-App Purchase key di bawah Users and Access, Integrations, In-App Purchase di App Store Connect, dan gunakan untuk menandatangani panggilan App Store Server API Anda.
- Arahkan URL sandbox App Store Server Notifications V2 Anda ke backend Anda, lalu panggil Request a Test Notification dan pastikan payload
TESTtiba dan terverifikasi terhadap rantai sertifikat Apple. - Di Transaction Manager Xcode, refund sebuah pembelian dan pastikan aplikasi Anda melepas entitlement saat
revocationDatedisetel. - Masukkan sandbox tester, beli consumable, minta refund, dan pastikan server Anda menerima
CONSUMPTION_REQUESTserta dapat menyusun dan mengirim balasan Send Consumption Information dengan waktu yang cukup di dalam jendela 12 jam. - Refund sebuah pembelian sandbox dan pastikan notifikasi
REFUNDmencapai server Anda, bahwa Anda mencabut akses atau mengurangi saldo consumable, dan bahwa pengiriman berulang dari notifikasi yang sama tidak diterapkan ganda.

Cara melatih refund dan chargeback di Google Play
Google Play tidak punya mode lokal seperti Xcode. Semuanya berjalan terhadap server Google, tetapi penguji lisensi membuatnya gratis dan aman. Tambahkan akun Google uji Anda sebagai penguji lisensi di Play Console dan mereka mendapatkan sekumpulan metode pembayaran uji yang tidak pernah menagih uang sungguhan. Google menandai setiap pembelian uji dengan pemberitahuan di tengah dialog beli, dan pajak tidak dihitung. Yang penting untuk pengujian refund adalah instrumen uji mana yang Anda pilih, karena masing-masing menghasilkan hasil yang berbeda.
| Test payment method | Apa yang disimulasikannya | Mengapa Anda akan memakainya |
|---|---|---|
| Test instrument, always approves | Pembelian sukses yang bersih | Menyiapkan pesanan yang lalu bisa Anda refund atau cabut |
| Test instrument, always declines | Pembayaran gagal | Memastikan Anda tidak memberi apa pun saat ditolak |
| Slow test card, approves after a few minutes | Pembelian tertunda yang kemudian sukses | Menguji penanganan PENDING Anda sebelum memberi akses |
| Slow test card, declines after a few minutes | Pembelian tertunda yang kemudian gagal | Memastikan penolakan tertunda tidak pernah membocorkan entitlement |
| Test card, approves then charges back | Chargeback yang diinisiasi pengguna | Memicu PendingRefundReviewNotification dan melatih respons 24 jam Anda |
Picu refund, chargeback, dan auto-refund acknowledgment
- Beli dengan kartu uji approve-then-charge-back, dan sebuah
PendingRefundReviewNotificationmendarat di topik Real-time Developer Notifications Anda beberapa saat kemudian. Jawab dengan satu panggilanorders.reviewrefund, karena Google hanya menyimpan respons pertama Anda. - Refund dan cabut pesanan uji dari tab Orders di Play Console untuk memicu
VoidedPurchaseNotification, dan pastikan server Anda menarik entitlement. - Biarkan pembelian penguji lisensi tidak di-acknowledge dengan sengaja. Google otomatis me-refund-nya setelah 3 menit alih-alih 3 hari yang diizinkan produksi, dan mengirim email pembatalan kepada Anda, jadi jalur acknowledgment yang rusak muncul dalam hitungan menit, bukan pada hari keempat di produksi.
Berapa biaya sebenarnya dari jalur refund yang tidak diuji
Penangan refund bukan hiasan. Ia adalah kode yang menghentikan Anda membayar untuk melayani seseorang yang tidak lagi membayar Anda. Ketika ia gagal diam-diam, refund tetap berjalan, tetapi akses, saldo, dan pengeluaran di baliknya tidak berhenti.
Telusuri uangnya. Ketika Apple atau Google me-refund pembelian, Anda mengembalikan harga jual dan toko mengembalikan komisinya, sejauh ini buku besar seimbang. Yang tidak kembali adalah semua yang sudah Anda belanjakan untuk mengantarkan produk: komputasi di balik hasil yang dihasilkan, panggilan model API, penyimpanan untuk apa yang disimpan pengguna, pembayaran yang sudah Anda kirim ke kreator. Penangan refund yang tidak pernah mencabut akses membiarkan pengguna yang sudah di-refund terus membelanjakan itu dengan anggaran Anda, tanpa ada yang tersisa di sistem untuk menghentikannya.
Dua jendela bukti membuatnya lebih tajam. CONSUMPTION_REQUEST yang tidak pernah Anda uji di sandbox adalah balasan yang Anda kirim salah bentuk atau terlambat, dan Apple sering memberikan refund secara default ketika jawaban Anda tidak masuk dalam 12 jam. Respons chargeback Google Play yang tidak pernah Anda picu dengan kartu uji adalah jendela 24 jam yang Anda kelola buruk secara langsung, dan mulai 3 Agustus 2026 chargeback Play yang kalah merugikan Anda harga pembelian dikurangi biaya layanan Play ditambah biaya chargeback bank. Setiap kegagalan itu dapat direproduksi secara gratis di lingkungan uji terlebih dahulu. Tidak satu pun murah di produksi.
| Jalur tidak teruji | Bagaimana ia gagal di produksi | Berapa biayanya bagi Anda |
|---|---|---|
| REFUND handler | Pengguna yang di-refund tetap punya akses | Komputasi, panggilan API, penyimpanan, dan pembayaran yang terus Anda keluarkan untuknya |
| CONSUMPTION_REQUEST reply | Salah bentuk, atau dikirim setelah 12 jam | Apple memberikan refund secara default, jadi Anda kehilangan penjualan dan pengeluaran |
| orders.reviewrefund response | Terlewat atau salah dalam 24 jam | Mulai 3 Agustus 2026, harga pembelian dikurangi biaya layanan Play, ditambah biaya chargeback bank |
Daftar periksa singkat sebelum Anda merilis penanganan refund
Anda tidak butuh lab. Anda perlu sudah menyaksikan setiap peristiwa mengenai kode Anda sekali.
- Aplikasi Anda melepas akses saat transaksi StoreKit menampilkan
revocationDate, dikonfirmasi di Transaction Manager Xcode. - URL server sandbox Anda menerima notifikasi
TESTdan memverifikasinya terhadap sertifikat Apple. - Sebuah
REFUNDsandbox mencabut akses atau mengurangi saldo, dan pengiriman ulang tidak dihitung ganda. - Sebuah
CONSUMPTION_REQUESTsandbox menghasilkan balasan Send Consumption Information yang valid dengan waktu cukup di dalam 12 jam. - Sebuah
PendingRefundReviewNotificationGoogle dari kartu uji chargeback menghasilkan tepat satu panggilanorders.reviewrefund. - Sebuah pembelian uji Google Play yang tidak di-acknowledge otomatis di-refund dalam 3 menit dan rekonsiliasi Anda menyadarinya.
Jalankan daftar itu sekali dan penanganan refund berhenti menjadi kode yang Anda harap bekerja. Ia menjadi kode yang sudah Anda saksikan bekerja.
Pertanyaan yang sering diajukan
- Bisakah saya menguji refund App Store tanpa pembelian asli?
- Ya. Pengujian StoreKit di Xcode memungkinkan Anda me-refund pembelian secara lokal melalui Transaction Manager, tanpa uang sungguhan dan tanpa akun App Store, yang memicu listener Transaction.updates aplikasi Anda. Ia tidak mengirim notifikasi server, jadi ia hanya menguji aplikasi Anda, bukan backend Anda.
- Apakah pengujian StoreKit lokal mengirim App Store Server Notifications?
- Tidak. Pengujian StoreKit di Xcode berjalan sepenuhnya di Mac Anda terhadap konfigurasi lokal dan tidak pernah menghubungi server Apple, jadi tidak ada App Store Server Notification, termasuk REFUND atau CONSUMPTION_REQUEST, yang pernah dikirim. Gunakan sandbox untuk menguji server Anda.
- Bagaimana cara menguji respons chargeback Google Play?
- Gunakan metode pembayaran penguji lisensi bernama Test card, approves then charges back. Ia memicu PendingRefundReviewNotification beberapa saat setelah pembelian, notifikasi yang sama seperti yang dikirim chargeback bank sungguhan, sehingga Anda dapat melatih balasan orders.reviewrefund 24 jam Anda.
- Mengapa pembelian uji Google Play saya di-refund setelah beberapa menit?
- Untuk penguji lisensi, Google otomatis me-refund pembelian setelah 3 menit jika aplikasi Anda belum meng-acknowledge-nya, dan mengirim email pembatalan kepada Anda. Produksi menunggu 3 hari, tetapi penguji mendapatkan versi yang dipercepat sehingga jalur acknowledgment yang rusak muncul cepat.
- Apakah sandbox Apple mencoba ulang notifikasi refund yang gagal?
- Tidak. Sandbox tidak mencoba ulang App Store Server Notifications, jadi jika endpoint Anda mati saat refund sandbox terpicu, notifikasi itu dijatuhkan tanpa percobaan kedua. Pastikan dulu URL Anda dapat dijangkau dengan Request a Test Notification.
Sumber dan bacaan lanjutan
- Apple Developer: Testing refund requests
- Apple Developer: Testing App Store server notifications
- Apple Developer: Request a Test Notification (App Store Server API)
- Apple Developer: Testing In-App Purchases with the sandbox
- Android Developers: Test your Google Play Billing Library integration
- Android Developers: Help Google dispute chargebacks (orders.reviewrefund)
- Play Console Help: Updates to refund protection and chargeback cost responsibility
RefundHalt
Autopilot refund untuk App Store dan Google Play
Baca selanjutnya
Biaya sebuah refund untuk aplikasi Anda lebih besar daripada harga yang Anda kembalikan
Harga yang direfund adalah baris terkecil pada tagihan. Sebuah refund juga membalikkan komisi toko, jadi Anda kehilangan bagian Anda, dan komputasi, panggilan API, penyimpanan, serta pembayaran yang sudah Anda keluarkan pun hilang. Sebuah chargeback Google Play setelah 3 Agustus 2026 menambahkan biaya bank di atasnya. Inilah tagihan lengkapnya.
Pengembalian dana langganan tidak bekerja seperti pengembalian dana sekali beli, dan toko tempat Anda berada yang menentukan seberapa besar suara Anda
Pengembalian dana langganan membalik seluruh periode penagihan, bukan satu penjualan tunggal. Di App Store, Apple yang memutuskan dan server Anda hanya mengetahui hasilnya. Di Google Play Anda sendiri memilih pengembalian penuh atau prorata. Berikut cara setiap toko menangani pengembalian dana langganan, dan berapa biaya satu pengembalian bagi Anda.