Semua artikel
Deep diveWaktu baca 7 menit

Notifikasi pembelian yang dibatalkan memungkinkan server Google Play Anda mencabut akses begitu refund masuk

Google Play dapat mengirimkan notifikasi pembelian yang dibatalkan ke server Anda begitu sebuah pembelian di-refund, di-chargeback, atau dibatalkan. Notifikasi ini membawa purchaseToken, orderId, productType, dan refundType, dan artinya satu hal, cabut akses. Berikut cara membacanya dan menghubungkannya.

Ruang kerja developer saat senja dengan ponsel yang menampilkan pembayaran yang dibalik, menggambarkan notifikasi pembelian Google Play yang dibatalkan sampai ke server

Poin utama

  • Notifikasi pembelian yang dibatalkan adalah sebuah Real-time Developer Notification yang dikirim Google Play ke topik Cloud Pub/Sub Anda begitu sebuah pembelian di-refund, di-chargeback, atau dibatalkan dengan cara lain. Ini adalah sinyal push, bukan sesuatu yang harus Anda polling.
  • Notifikasi ini membawa persis empat field: `purchaseToken`, `orderId`, `productType`, dan `refundType`. Itu cukup untuk menemukan pembelian yang tepat di database Anda dan mencabut entitlement yang terikat padanya.
  • `productType` bernilai `1` untuk langganan yang dibatalkan dan `2` untuk pembelian sekali beli yang dibatalkan. `refundType` bernilai `1` untuk refund penuh dan `2` untuk refund parsial berbasis kuantitas, yang hanya berlaku pada pembelian sekali beli multi-kuantitas.
  • Notifikasi pembelian yang dibatalkan berarti pelanggan sudah menerima uangnya kembali. Panduan resmi Google adalah mencabut akses ke konten terkait, karena pembeli sudah tidak lagi seharusnya memegang entitlement itu.
  • Notifikasi pembelian yang dibatalkan mati sampai Anda menyalakannya. Di Play Console di bawah Monetization setup Anda memilih antara langganan plus semua pembelian yang dibatalkan, atau itu plus peristiwa produk sekali beli. Kedua opsi menyertakan pembelian yang dibatalkan.
  • Notifikasi pembelian yang dibatalkan bukan salah satu dari dua alur refund yang meminta bukti dari Anda. Ia adalah pemberitahuan setelah kejadian. Satu-satunya alur yang menerima input Anda adalah CONSUMPTION_REQUEST milik Apple, dengan jendela 12-hour, dan tinjauan chargeback Google Play melalui `orders.reviewrefund`, dengan jendela 24-hour.
  • Mulai August 3, 2026, Google membebankan harga pembelian ditambah biaya bank dari sebuah chargeback kepada developer. Notifikasi pembelian yang dibatalkan sering kali menjadi cara server Anda pertama kali mengetahui bahwa sebuah pembatalan chargeback telah masuk, jadi menghubungkannya adalah yang memungkinkan Anda berhenti melayani pelanggan yang sudah tidak lagi membayar Anda.

Refund di Google Play tidak harus menjadi sesuatu yang baru Anda temukan belakangan di sebuah laporan. Google Play dapat mengirimkan notifikasi pembelian yang dibatalkan ke server Anda begitu sebuah pembelian dibatalkan, entah pembeli mengambil refund mandiri, agen dukungan memberikannya, bank memaksakan chargeback, atau Anda sendiri me-refund pesanan itu dengan flag revoke aktif. Pesannya kecil, menyebutkan pembelian yang persis, dan membawa satu instruksi, kembalikan entitlement itu, karena uangnya sudah hilang.

Apa sebenarnya notifikasi pembelian yang dibatalkan itu

Notifikasi pembelian yang dibatalkan adalah salah satu jenis Real-time Developer Notifications milik Google Play, atau RTDN. RTDN adalah kanal push. Google mempublikasikan sebuah pesan ke topik Cloud Pub/Sub yang Anda miliki, dan backend Anda menerimanya dalam sekejap setelah peristiwa itu, bukan mengetahuinya pada polling terjadwal berikutnya. Itulah inti dari notifikasi pembelian yang dibatalkan dibandingkan jalur pull yang lebih lama: Anda mengetahui refund saat terjadi, bukan berjam-jam kemudian.

Jalur pull tetap ada dan tetap penting. Voided Purchases API memungkinkan server Anda menanyakan, sesuai jadwal Anda sendiri, daftar pembelian yang dibatalkan dalam suatu rentang waktu. Keduanya saling melengkapi. Notifikasi memberi tahu Anda begitu satu pembelian berubah; API memungkinkan Anda merekonsiliasi secara massal dan mengisi kembali apa pun yang tertinggal akibat pesan yang terlewat.

Notifikasi ini menumpang di dalam sebuah Real-time Developer Notification

Notifikasi pembelian yang dibatalkan tidak pernah datang sendiri. Ia berada di dalam pembungkus DeveloperNotification, dan pembungkus itu dikirimkan sebagai satu string ber-encoding base64 di dalam field data pesan Pub/Sub. Handler Anda men-decode string itu menjadi JSON sebelum bisa membaca apa pun. Pembungkus itu selalu menyebutkan aplikasi dan waktu peristiwa, dan berisi persis satu objek notifikasi dari lima yang didefinisikan Google. Kelimanya saling eksklusif, jadi pesan yang membawa voidedPurchaseNotification tidak akan sekaligus membawa peristiwa langganan atau sekali beli.

Field pembungkusApa yang dikandungnya
versionVersi skema notifikasi, misalnya 1.0
packageNameAplikasi tempat peristiwa ini terjadi, misalnya com.acme.app
eventTimeMillisKapan peristiwa terjadi, dalam milidetik sejak epoch
Salah satu dari lima objek notifikasioneTimeProductNotification, subscriptionNotification, voidedPurchaseNotification, pendingRefundReviewNotification, atau testNotification. Hanya satu yang ada per pesan

Empat field yang dibawanya

Lepaskan pembungkusnya dan notifikasi pembelian yang dibatalkan itu sendiri hanya empat field. Itu memang sengaja dibuat ringkas. Posisi Google adalah jika yang Anda butuhkan hanyalah menemukan pembelian yang tepat dan menyesuaikan entitlement, keempat field ini sudah cukup, dan Anda tidak perlu memanggil kembali API apa pun untuk bertindak.

FieldApa ituCara Anda menggunakannya
purchaseTokenToken yang diberikan ke perangkat saat item dibeliKunci utama Anda. Cocokkan dengan catatan pembelian yang Anda simpan saat memberikan entitlement
orderIdId pesanan yang ditampilkan ke pembeli, misalnya GS.0000-0000-0000Kunci kedua yang mudah dibaca manusia untuk dukungan dan rekonsiliasi
productTypeApakah item yang dibatalkan adalah langganan atau pembelian sekali beliArahkan ke jalur revoke yang tepat
refundTypeApakah pembatalan itu refund penuh atau refund parsial berbasis kuantitasPutuskan apakah mencabut semuanya atau hanya kuantitas yang di-refund

productType memberi tahu Anda apa yang dibatalkan

productType adalah bilangan bulat kecil, dan ia menentukan jalur revoke mana yang Anda tempuh. Pembatalan langganan harus mengurai akses yang sedang berjalan; pembatalan pembelian sekali beli cukup menghapus satu entitlement.

Nilai `productType`KonstantaArti
1PRODUCT_TYPE_SUBSCRIPTIONSebuah pembelian langganan dibatalkan
2PRODUCT_TYPE_ONE_TIMESebuah pembelian sekali beli dibatalkan

refundType memberi tahu Anda seberapa banyak yang dikembalikan

refundType memisahkan pembalikan penuh yang bersih dari yang parsial. Kasus parsial itu sempit. Ia hanya muncul saat sebuah pembelian sekali beli multi-kuantitas di-refund sebagian, bukan seluruh kuantitasnya.

Nilai `refundType`KonstantaArti
1REFUND_TYPE_FULL_REFUNDPembelian dibatalkan sepenuhnya
2REFUND_TYPE_QUANTITY_BASED_PARTIAL_REFUNDSebagian dari pembelian multi-kuantitas dibatalkan

Nyalakan dulu, atau ia tidak akan pernah datang

Notifikasi pembelian yang dibatalkan tidak mengalir secara default. Anda mengaktifkan RTDN sekali, di Play Console, dan mengarahkannya ke topik Pub/Sub yang Anda kendalikan. Sakelarnya ada di bawah Monetize, lalu Monetization setup, di bagian Real-time developer notifications di bagian atas halaman. Centang Enable real-time notifications, lalu tempel nama topik lengkap Anda dalam format projects/{project_id}/topics/{topic_name}, dan gunakan Send Test Message untuk memastikan salurannya berfungsi sebelum Anda memercayainya.

Toggle konten adalah tempat orang melewatkan pembelian yang dibatalkan. Kedua pilihan menyertakannya, jadi Anda tidak bisa secara tidak sengaja menolak refund sambil tetap menerima langganan.

  • Terima notifikasi untuk langganan dan semua pembelian yang dibatalkan. Anda menerima peristiwa langganan dan setiap pembelian yang dibatalkan, tetapi bukan peristiwa pembelian produk sekali beli.
  • Terima semua notifikasi untuk langganan dan produk sekali beli. Anda menerima yang di atas ditambah peristiwa produk sekali beli seperti ONE_TIME_PRODUCT_PURCHASED dan ONE_TIME_PRODUCT_CANCELED.
Sebuah kartu kredit menghadap ke bawah di samping struk kertas, mewakili pembelian Google Play yang dibatalkan

Berapa biayanya bagi Anda, dalam uang

Pembatalan adalah kerugian yang sudah tercatat pada saat notifikasi sampai ke Anda. Harga jualnya hilang, begitu pula apa pun yang Anda keluarkan untuk melayani pelanggan itu. Jika mereka menghasilkan gambar, menjalankan panggilan ke model Anda, menarik penyimpanan, atau memicu pembayaran ke pihak ketiga, biaya-biaya itu dibayar dengan uang sungguhan dan tidak kembali bersama refund. Notifikasi tidak bisa memulihkan itu semua. Yang bisa dilakukannya adalah menghentikan pendarahan mulai dari sini, dan itulah seluruh alasan untuk bertindak cepat atasnya.

Pendarahan paling parah pada langganan dan paling parah pada chargeback. Langganan yang gagal Anda cabut terus menimbulkan biaya untuk dilayani, bulan demi bulan, bagi pelanggan yang sudah tidak membayar. Dan chargeback adalah jenis pembatalan yang paling mahal. Mulai August 3, 2026, dokumentasi Google menyatakan bahwa chargeback membebankan harga pembelian ditambah biaya bank kepada developer. Notifikasi pembelian yang dibatalkan kerap menjadi tempat pertama sistem Anda sendiri mengetahui bahwa sebuah chargeback telah selesai, jadi handler yang mencabut akses seketika itulah yang mencegah penjualan yang hilang berubah menjadi penjualan yang hilang ditambah berminggu-minggu layanan gratis.

Cara menangani notifikasi pembelian yang dibatalkan, langkah demi langkah

Verifikasi dan hilangkan duplikat pesan

  • Pastikan pesan Pub/Sub berasal dari Google dan menargetkan topik yang Anda konfigurasi, lalu decode field data base64 untuk mendapatkan JSON DeveloperNotification.
  • Gunakan messageId Pub/Sub untuk membuang duplikat. Google memperingatkan bahwa notifikasi yang sama bisa dikirim lebih dari sekali, jadi perlakukan pengulangan sebagai hal normal dan buat handler Anda idempoten.
  • Konfirmasikan (acknowledge) pesan hanya setelah Anda mencatatnya dengan aman, agar crash di tengah handler tidak menghilangkan peristiwa itu.

Cari pembeliannya

  • Cocokkan purchaseToken dengan pembelian yang Anda simpan saat pertama kali memberikan entitlement. Gunakan orderId sebagai cadangan untuk pencarian dukungan dan rekonsiliasi manual.
  • Baca productType untuk memilih jalur revoke langganan atau sekali beli, dan baca refundType untuk memutuskan antara revoke penuh dan parsial.

Cabut dan catat

  • Hapus entitlement itu. Untuk refund penuh, putus akses ke item tersebut. Untuk refund parsial berbasis kuantitas, kurangi kuantitas yang diberikan sebesar jumlah yang di-refund dan biarkan sisanya utuh.
  • Catat apa yang Anda lakukan dan kapan, dengan kunci purchaseToken dan orderId. Catatan itulah yang memungkinkan Anda menjawab tiket dukungan di kemudian hari, dan yang memungkinkan Voided Purchases API merekonsiliasi dengan rapi terhadap keadaan Anda sendiri.

Di mana posisinya di antara sinyal refund lainnya

Notifikasi pembelian yang dibatalkan adalah sebuah pemberitahuan, bukan negosiasi. Ia memberi tahu Anda hasil yang sudah diputuskan. Ada baiknya melihatnya berdampingan dengan sinyal-sinyal yang mudah membuatnya tertukar, karena hanya sebagian dari sinyal itu yang pernah meminta versi cerita Anda.

SinyalArahApakah ia menerima input Anda
Notifikasi pembelian yang dibatalkan (RTDN)Google mengirim ke server AndaTidak. Ia melaporkan pembatalan yang sudah terjadi
Voided Purchases APIServer Anda menarik dari GoogleTidak. Ia adalah daftar hanya-baca dari pembatalan masa lalu
pendingRefundReviewNotification (RTDN)Google mengirim ke server AndaYa, secara tidak langsung. Ia menandai chargeback yang kemudian Anda tentang melalui orders.reviewrefund dalam 24 jam
Apple CONSUMPTION_REQUESTApple menanyakan server AndaYa. Anda membalas dengan Send Consumption Information dalam 12 jam

Kalimat yang perlu dipegang itu sederhana. Di kedua toko itu, ada persis dua alur refund di mana developer diberi kesempatan bicara, CONSUMPTION_REQUEST milik Apple dan tinjauan chargeback Google Play. Notifikasi pembelian yang dibatalkan bukan salah satunya. Pada saat ia sampai ke Anda, keputusan sudah di belakang Anda dan satu-satunya hal yang tersisa di tangan Anda adalah seberapa cepat Anda mencabut akses.

Pertanyaan yang sering diajukan

Apa arti notifikasi pembelian yang dibatalkan di Google Play?
Artinya sebuah pembelian di-refund, di-chargeback, atau dibatalkan dengan cara lain, dan pelanggan sudah menerima uangnya kembali. Panduan Google adalah mencabut akses ke konten terkait, karena pembeli sudah tidak lagi seharusnya memegang entitlement itu. Notifikasi menyebutkan pembelian yang persis melalui `purchaseToken` dan `orderId`-nya.
Field apa saja yang dikandung notifikasi pembelian Google Play yang dibatalkan?
Empat: `purchaseToken`, `orderId`, `productType`, dan `refundType`. `productType` bernilai `1` untuk langganan dan `2` untuk pembelian sekali beli. `refundType` bernilai `1` untuk refund penuh dan `2` untuk refund parsial berbasis kuantitas pada pembelian multi-kuantitas.
Bagaimana cara mengaktifkan notifikasi pembelian yang dibatalkan?
Di Play Console, buka Monetize lalu Monetization setup, dan di bagian Real-time developer notifications centang Enable real-time notifications, lalu masukkan nama topik Cloud Pub/Sub Anda. Kedua opsi konten, langganan plus semua pembelian yang dibatalkan, dan itu plus peristiwa produk sekali beli, menyertakan pembelian yang dibatalkan.
Apa perbedaan antara notifikasi pembelian yang dibatalkan dan Voided Purchases API?
Notifikasi adalah sinyal push yang dikirim secara real time melalui Cloud Pub/Sub begitu sebuah pembelian dibatalkan. Voided Purchases API adalah jalur pull yang di-query server Anda sesuai jadwalnya sendiri untuk mendaftar pembatalan dalam suatu rentang waktu. Gunakan notifikasi untuk bereaksi seketika dan API untuk merekonsiliasi dan mengisi kembali.
Apakah notifikasi pembelian yang dibatalkan memungkinkan saya menentang refund?
Tidak. Ia adalah pemberitahuan setelah kejadian atas keputusan yang sudah dibuat. Satu-satunya alur Google Play yang menerima input Anda adalah tinjauan chargeback melalui `orders.reviewrefund`, yang Anda punya 24 jam untuk menjawab, dan di Apple itu adalah CONSUMPTION_REQUEST dengan jendela 12-hour.

Sumber dan bacaan lanjutan

RefundHalt

Autopilot refund untuk App Store dan Google Play

Baca selanjutnya

Permintaan refund berikutnya sudah menuju kepada Anda.

Siapkan RefundHalt dalam waktu yang dibutuhkan untuk membaca satu lagi email dukungan tentang refund yang tidak sempat Anda sengketakan.