Lampirkan appAccountToken pada setiap pembelian App Store, atau Anda tidak bisa membela refund
Apple mengirimkan CONSUMPTION_REQUEST ke server Anda saat pelanggan meminta refund, tetapi transaksi itu tidak pernah menyebutkan siapa mereka. appAccountToken adalah UUID yang menautkan sebuah pembelian kembali ke pengguna Anda. Setel dan Anda bisa menjawab Apple dengan data nyata. Lewati dan Anda hanya menebak.

Poin utama
- appAccountToken adalah UUID yang Anda lampirkan pada pembelian App Store sehingga transaksi yang dihasilkan menunjuk kembali ke pengguna yang tepat di sistem Anda sendiri. Apple menyimpannya pada transaksi dan mengembalikannya di mana pun transaksi itu muncul.
- Satu-satunya aturan format yang ditegakkan Apple adalah bahwa nilainya harus UUID yang valid. Kirim apa pun yang lain, sebuah id, email, atau string gabungan, dan StoreKit diam-diam membuangnya lalu mengembalikan appAccountToken sebagai nil.
- Di StoreKit 2 Anda menyetelnya dengan satu opsi pembelian, Product.PurchaseOption.appAccountToken(_:), menggunakan UUID stabil yang Anda buat dan simpan untuk akun tersebut.
- Setel sekali pada pembelian asli dan Apple membawa token yang sama di setiap perpanjangan, percobaan ulang penagihan, dan peningkatan dalam rantai langganan.
- Sejak 2025, endpoint Set App Account Token memungkinkan server Anda melampirkan token pada pembelian yang dilakukan di luar aplikasi Anda, seperti penukaran kode penawaran dan pembelian yang dipromosikan, yang tidak pernah bisa dijangkau oleh alur dalam aplikasi.
- appAccountToken adalah yang membuat CONSUMPTION_REQUEST dari Apple dapat dijawab. Tanpanya Anda tidak bisa memetakan refund ke pelanggan yang penggunaannya seharusnya Anda uraikan dalam jendela 12 jam.
- Refund yang tidak bisa Anda identifikasi adalah refund yang tidak bisa Anda bela. Anda mengembalikan uang atas pembelian yang punya bukti untuk dipertahankan, ditambah komputasi, panggilan API, dan pembayaran yang sudah Anda keluarkan untuk mengirimkannya.
Seorang pelanggan meminta refund ke Apple, Apple mengirimkan CONSUMPTION_REQUEST ke server Anda, dan Anda punya dua belas jam untuk menjawab dengan data nyata tentang bagaimana orang itu menggunakan produk. Lalu Anda membuka notifikasi itu dan menyadari Anda tidak tahu siapa mereka. Transaksi membawa originalTransactionId dan id produk, tetapi tidak ada yang menunjuk ke akun di basis data Anda sendiri. Celah itulah yang persis ditutup oleh appAccountToken, dan jika Anda tidak menyetelnya saat pembelian, Anda tidak bisa menutupnya belakangan untuk penjualan tersebut.
appAccountToken adalah UUID yang Anda lampirkan pada pembelian sehingga transaksi App Store yang dihasilkan membawa penunjuk kembali ke pengguna yang tepat di sistem Anda. Setel, dan setiap pertanyaan refund yang pernah Apple ajukan tentang pelanggan itu datang dengan identitasnya terlampir. Lewati, dan Anda menebak. Berikut apa itu field ini, cara menyetelnya, endpoint baru yang menyelamatkan pembelian yang dilakukan di luar aplikasi Anda, dan berapa sebenarnya biaya mata rantai yang hilang saat sebuah refund tiba.
Apa sebenarnya appAccountToken itu
appAccountToken adalah UUID buram yang Anda buat dan berikan ke StoreKit pada saat pembelian. Apple menyimpannya pada transaksi dan mengembalikannya di info transaksi untuk pembelian itu, dan tetap di sana. Dalam kata-kata Apple, ini adalah "UUID yang mengaitkan transaksi dengan akun pengguna di layanan Anda sendiri." Satu-satunya aturan format adalah bahwa nilainya harus UUID. Apple tidak membacanya, tidak memvalidasi ke mana ia terpetakan, dan tidak peduli apa artinya di sisi Anda. Ini adalah tautan yang Anda kendalikan.
Karena ia hidup pada transaksi, ia kembali di mana pun transaksi itu kembali. Transaksi bertanda tangan dalam notifikasi server, respons Get Transaction Info dari App Store Server API, dan setiap perpanjangan dalam rantai langganan, semuanya membawa token yang sama jika Anda menyetelnya pada pembelian asli. Satu UUID, dilampirkan sekali, mengikuti penagihan pelanggan sepanjang umur hubungan itu.
Ia harus berupa UUID asli, atau ia diam-diam menghilang
Satu aturan yang ditegakkan Apple adalah format. StoreKit 2 membutuhkan UUID RFC 4122. Jika Anda mengirim string gabungan, id bilangan bulat, atau alamat email, StoreKit tidak melempar error. Ia membuang nilai itu dan transaksi kembali dengan appAccountToken disetel ke nil. Pengembang terus-menerus mengalaminya, dan gejalanya selalu sama, semacam varian dari "appAccountToken hilang dalam payload transaksi" di forum Apple sendiri, hampir selalu karena nilai yang dikirim bukan UUID yang valid. Buat UUID asli di sisi server, simpan terhadap akun, dan jangan pernah memberikan apa pun yang lain ke StoreKit.
Cara menyetelnya saat pembelian
Di StoreKit 2 ini adalah satu opsi pembelian. Buat UUID di server Anda saat pengguna mendaftar atau pertama kali mencapai checkout, simpan pada catatan akun mereka, dan berikan nilai yang sama ke panggilan pembelian.
Tanda tangannya adalah Product.PurchaseOption.appAccountToken(_ token: UUID), dan sebuah pembelian terlihat seperti try await product.purchase(options: [.appAccountToken(token)]). Saat transaksi kembali, diverifikasi melalui App Store Server API atau dikirim oleh notifikasi server, ia membawa UUID itu, dan server Anda mencari pelanggan dalam satu kueri.
Gunakan satu token stabil per akun
Jangan membuat token baru untuk setiap pembelian oleh pengguna yang sama. Apple mengembalikan token pada perpanjangan, percobaan ulang penagihan, dan peningkatan dalam rantai yang sama, jadi UUID stabil per akun memberi Anda benang yang bersih dari pembelian pertama hingga setiap peristiwa mendatang. Token yang berubah setiap pembelian memutus benang itu dan menggagalkan seluruh tujuannya. Satu akun, satu token, digunakan kembali setiap kali akun itu membeli.
Endpoint yang menyelamatkan pembelian di luar aplikasi
Hingga 2025 ada sebuah lubang. Jika pelanggan menukar kode penawaran atau membeli pembelian dalam aplikasi yang dipromosikan langsung dari App Store, aplikasi Anda tidak pernah menjalankan alur pembelian, jadi tidak ada tempat untuk menyetel appAccountToken. Transaksi-transaksi itu datang anonim dan tetap begitu.
WWDC 2025 menutup celah itu dengan endpoint Set App Account Token. Server Anda memanggil PUT /inApps/v1/transactions/{originalTransactionId}/appAccountToken di App Store Server API dengan UUID di dalam body, dan Apple menyetel token pada transaksi itu. Ini bekerja untuk setiap jenis produk, mencakup penukaran kode penawaran dan pembelian yang dipromosikan, dan nilai yang Anda kirim menimpa token apa pun yang sudah ada pada transaksi. Anda sekarang bisa mengaitkan sebuah pembelian belakangan, dari server Anda, tanpa pernah melewati aplikasi Anda.

| Saluran pembelian | Di mana Anda menyetel appAccountToken | Catatan |
|---|---|---|
| Pembelian dalam aplikasi | Opsi pembelian StoreKit saat membeli | Product.PurchaseOption.appAccountToken(UUID) |
| Penukaran kode penawaran | Endpoint Set App Account Token, sisi server | Tidak ada alur dalam aplikasi untuk dikaitkan, jadi setel setelahnya |
| Pembelian dalam aplikasi yang dipromosikan dari App Store | Endpoint Set App Account Token, sisi server | Pembelian terjadi di luar aplikasi Anda |
| Perpanjangan langganan | Tidak ada yang perlu dilakukan | Dibawa otomatis dari pembelian asli |
Di mana mata rantai yang hilang membuat Anda rugi uang
Tujuan token bukanlah catatan yang rapi. Tujuannya adalah bahwa satu-satunya pertanyaan refund Apple untuk pengembang, CONSUMPTION_REQUEST, hanya dapat dijawab jika Anda bisa menemukan pelanggan yang dimaksud.
Saat pembeli meminta refund atas produk consumable atau langganan yang tidak diperbarui, Apple mengirimkan notifikasi CONSUMPTION_REQUEST ke server Anda dan memberi Anda dua belas jam untuk membalas dengan Send Consumption Information. Jawaban Anda adalah data tentang pelanggan spesifik itu: seberapa banyak produk yang mereka konsumsi, lama keanggotaan akun mereka, total belanja seumur hidup mereka, status pengiriman mereka. appAccountToken sendiri adalah salah satu field dalam permintaan itu, dan yang lebih penting, itulah cara transaksi notifikasi terpetakan ke akun yang penggunaannya akan Anda uraikan. Tanpa token, tanpa pencarian, tanpa jawaban yang akurat.
Berapa sebenarnya biaya jawaban kosong
Refund yang tidak teridentifikasi memaksa pilihan yang buruk. Anda bisa menjawab permintaan konsumsi tanpa apa pun, yang terbaca sebagai konsumsi rendah dan mendorong Apple ke arah mengabulkan refund, termasuk kepada pelanggan yang memakai produk secara intensif. Atau Anda bisa menebak. Bagaimanapun juga Anda mengembalikan uang atas pembelian yang punya bukti untuk dibela, dan Anda sudah membayar biaya nyata untuk melayaninya.
Biaya itu bukan harga jual. Sebuah produk consumable yang menjalankan sekumpulan panggilan API model, menghasilkan gambar, mengekspor video, atau memicu pembayaran kreator telah menghabiskan uang nyata pada saat ia dikirimkan. Refund mengembalikan pembayaran pelanggan. Ia tidak mengembalikan tagihan penyedia. Kalikan satu pelanggan yang tidak dapat diidentifikasi dengan setiap refund yang mereka ajukan, dan dengan setiap peminta refund berulang yang mengandalkan Anda tidak mengetahui siapa mereka, dan token yang Anda lewati menjadi baris kode termahal yang tidak pernah Anda tulis.
Ide yang sama ada di Android, dengan nama lain
Google Play memecahkan masalah yang sama persis dengan setObfuscatedAccountId, yang melampirkan pengenal akun pada pembelian sehingga tinjauan chargeback Google melalui orders.reviewrefund dapat dijawab terhadap pengguna nyata. Toko berbeda, mekanika berbeda, pelajaran yang sama: lampirkan identitas saat pembelian atau Anda tidak bisa membela sengketa belakangan. Di App Store, alat itu adalah appAccountToken, dan ia harus berupa UUID.
Tiga kebiasaan yang menjaga token tetap di tempatnya
- Buat satu UUID per akun dan simpan. Satu token stabil per pelanggan, dibuat saat mereka mendaftar atau pada checkout pertama, disimpan pada catatan mereka dan digunakan kembali untuk setiap pembelian.
- Validasi sebelum Anda mengirimkannya. Pastikan nilainya adalah UUID asli di kode pembelian Anda, agar id yang cacat tidak pernah bisa diam-diam menjadi token nil pada transaksi.
- Isi ulang pembelian di luar aplikasi. Saat notifikasi server tiba untuk penukaran kode penawaran atau pembelian yang dipromosikan tanpa token, panggil endpoint Set App Account Token untuk melampirkan yang benar.
Lakukan ketiganya dan setiap transaksi yang pernah Apple kirim kepada Anda, termasuk permintaan refund, tiba sudah terikat pada pelanggan yang menjadi pemiliknya.
Inilah fondasi yang diandalkan RefundHalt. Kami membaca appAccountToken dari setiap transaksi dan notifikasi server, mengaitkannya dengan penggunaan yang sudah kami lacak untuk akun itu, dan menjawab permintaan konsumsi Apple dalam jendela dua belas jam dengan angka nyata pelanggan. Token adalah benangnya. Setel sekali dan pembelaan refund Anda punya sesuatu untuk dipegang.
Pertanyaan yang sering diajukan
- Apa itu appAccountToken di App Store?
- appAccountToken adalah UUID yang Anda buat dan lampirkan pada pembelian melalui StoreKit sehingga transaksi App Store yang dihasilkan menunjuk kembali ke akun pengguna tertentu di sistem Anda sendiri. Apple menyimpannya pada transaksi dan mengembalikannya di info transaksi, notifikasi server, dan setiap perpanjangan dalam rantai yang sama, yang memungkinkan Anda menghubungkan setiap peristiwa mendatang, termasuk permintaan refund, ke pelanggan yang tepat.
- Mengapa appAccountToken saya nil atau hilang?
- Hampir selalu karena nilai yang Anda kirim bukan UUID yang valid. StoreKit 2 membutuhkan UUID RFC 4122 dan diam-diam membuang apa pun yang lain, jadi string gabungan, id bilangan bulat, atau email kembali sebagai appAccountToken nil sementara pembelian tetap berhasil. Penyebab umum lainnya adalah pembelian yang dilakukan di luar aplikasi Anda, seperti penukaran kode penawaran, di mana tidak ada alur dalam aplikasi yang berjalan untuk menyetel token.
- Bisakah saya menyetel appAccountToken setelah pembelian, untuk kode penawaran?
- Ya, sejak 2025. Endpoint Set App Account Token di App Store Server API memungkinkan server Anda melampirkan atau menimpa token pada transaksi yang sudah ada dengan memanggil PUT /inApps/v1/transactions/{originalTransactionId}/appAccountToken dengan UUID di dalam body. Ini bekerja untuk setiap jenis produk dan dibuat untuk pembelian yang dilakukan di luar aplikasi Anda, seperti penukaran kode penawaran dan pembelian dalam aplikasi yang dipromosikan.
- Apakah appAccountToken harus berupa UUID?
- Ya. Satu-satunya aturan format yang ditegakkan Apple adalah bahwa nilainya harus UUID yang valid. Selain itu ia buram, jadi ia bisa terpetakan ke kunci akun apa pun yang Anda suka di sisi Anda, tetapi jika bukan UUID StoreKit tidak akan menyimpannya dan transaksi kembali dengan appAccountToken disetel ke nil.
- Bagaimana appAccountToken membantu dengan refund?
- Saat pelanggan meminta refund, Apple mengirimkan CONSUMPTION_REQUEST dan memberi Anda dua belas jam untuk merespons dengan data tentang pembeli spesifik itu. appAccountToken adalah cara Anda mencocokkan transaksi notifikasi dengan akun yang penggunaannya perlu Anda laporkan, dan ia adalah salah satu field dalam permintaan konsumsi itu sendiri. Tanpanya Anda tidak bisa menjawab dengan penggunaan nyata, jadi Apple cenderung mengabulkan refund yang punya bukti untuk Anda tolak.
- Apakah appAccountToken harus berbeda untuk setiap pembelian?
- Tidak. Gunakan satu UUID stabil per akun dan gunakan kembali untuk setiap pembelian yang dilakukan pengguna itu. Apple membawa token melintasi perpanjangan dan peningkatan dalam rantai langganan, jadi token stabil memberi Anda tautan yang bersih dari waktu ke waktu. Token yang berubah setiap pembelian memutus tautan itu dan mempersulit mengaitkan transaksi kembali ke pelanggan yang sama.
Sumber dan bacaan lanjutan
- Apple Developer: appAccountToken (StoreKit Transaction)
- Apple Developer: Product.PurchaseOption.appAccountToken(_:)
- Apple Developer: Set App Account Token (App Store Server API)
- Apple Developer: appAccountToken (App Store Server API)
- Apple Developer: ConsumptionRequest (Send Consumption Information)
- Apple Developer: Send Consumption Information
- WWDC25: Dive into App Store server APIs for In-App Purchase
RefundHalt
Autopilot refund untuk App Store dan Google Play
Baca selanjutnya
Jangan mengonfirmasi pembelian Google Play dalam tiga hari dan Google akan mengembalikan dananya, inilah biayanya bagi Anda
Google Play secara otomatis mengembalikan dana dan mencabut pembelian apa pun yang tidak dikonfirmasi server Anda dalam tiga hari. Ini adalah kegagalan integrasi, bukan keputusan pelanggan, dan sepenuhnya dapat dicegah. Berikut aturan persisnya, mengapa aturan itu terpicu, dan berapa biaya sebenarnya dari setiap penjualan yang hilang.
Penyalahgunaan refund berulang membebani Anda dua kali, begini cara toko membiarkan Anda melawan balik
Pelanggan yang meminta refund lagi dan lagi bukanlah kebetulan. Penyalahgunaan refund membebani Anda uang yang dikembalikan ditambah komputasi yang sudah Anda keluarkan, dan kedua toko memberi Anda sinyal identitas, appAccountToken milik Apple dan ID akun tersamar milik Google, untuk merangkai pola itu menjadi satu.