Üç App Store iade bildirimi Apple karar verdikten sonra gelir ve REFUND_REVERSED satışı size geri verir
Apple, App Store Server Notifications V2 üzerinden dört iade mesajı gönderir ve çoğu uygulama yalnızca ikisini işler. REFUND iptal etmenizi söyler, REFUND_DECLINED satışı korumak anlamına gelir ve REFUND_REVERSED satışı geri verir ve aldığınız şeyi geri yüklemenizi ister. İşte her birinin gerektirdiği şey.

Önemli noktalar
- Apple, App Store Server Notifications V2 üzerinden iadeyle ilgili dört mesaj gönderir. CONSUMPTION_REQUEST kanıtınızı ister ve REFUND, REFUND_DECLINED ve REFUND_REVERSED, Apple zaten karar verdikten sonra sonucu bildirir.
- Bir REFUND bildirimi, App Store'un işlemi iade ettiği anlamına gelir. revocationDate ve revocationReason taşır ve bu, o tek işleme bağlı hak sahipliğini iptal etme sinyalinizdir, o ürünün her satın alımını değil.
- revocationReason iki değere sahiptir. 1, iadenin ürününüzle ilgili bir sorun nedeniyle verildiği anlamına gelir ve 0, başka bir nedenle verildiği anlamına gelir. Sorun değeri, kaydetmeye ve eğilimini izlemeye değer bir kalite sinyalidir.
- REFUND_DECLINED, Apple'ın müşterinin iadesini reddettiği anlamına gelir. Satışı korur ve hiçbir şeyi değiştirmezsiniz, bu da yalnızca karar kesinleşmeden önce erişimi iptal etmediyseniz güvenlidir.
- REFUND_REVERSED, Apple'ın daha önce verdiği bir iadeyi tersine çevirdiği anlamına gelir, genellikle müşteri iadeye itiraz ettikten sonra. İptal alanları işlemden düşer ve Apple'ın kendi talimatı, içeriği iptal ettiyseniz onu geri yüklemeniz gerektiğidir.
- Dört bildirimin hepsine HTTP 200 ile yanıt verin. Sunucunuz kapalıysa ve birini kaçırdıysa, Get Refund History uç noktası iade edilmiş işlemleri işlem kimliğine göre aramanıza ve mutabakat kurmanıza olanak tanır.
- Geçmiş bir abonelik dönemi için yapılan iade, her zaman erişimin sona ermesi gerektiği anlamına gelmez. Daha yeni bir ücretli dönem hâlâ etkinse, eski işlem üzerinden iptal etmek, ödemesi güncel olan bir müşteriyi kesip atar.
Apple iadenize karar verir ve sonra konuşmaya devam eder. Sonuç belirlendiğinde, App Store sunucunuza üç App Store iade bildiriminden birini gönderir ve her biri farklı bir hamle ister. Bir REFUND, paranın gittiğini ve erişimi çekmeniz gerektiğini söyler. Bir REFUND_DECLINED, müşterinin talebi kaybettiğini ve satışı koruduğunuzu söyler. Bir REFUND_REVERSED, Apple'ın zaten verdiği bir iadeyi geri aldığını söyler, yani satış yine sizindir ve aldığınız her şeyi geri vermeniz gerekir. Çoğu uygulama ilkini bağlar ve diğer ikisini sessizce göz ardı eder. Ödeme yapan bir müşteri işte böyle, ödediği bir şeyden kilitlenip kalır.
Bu üçü, yanıt vermenizi isteyen tek iade mesajı olan CONSUMPTION_REQUEST'ten ayrıdır. Karar sonrası bildirimler bir tartışma istemez. Bir HTTP 200 ve müşterinin erişimine doğru değişikliği isterler. İşte her birinin ne anlama geldiği, gerçekleri taşıyan tam alanlar ve yanlış işlediğinizde paranın nereden sızdığı.
Dört iade bildirimi ve hangisi yanıt istiyor
App Store Server Notifications V2 tek bir akıştır. Onu bir URL'ye yönlendirirsiniz ve Apple her bildirim türünü oraya gönderir, dolayısıyla işleyin ya da işlemeyin dört iade mesajının tümünü zaten alırsınız. Türlerden dördü iadelere değinir ve yalnızca biri bir sorudur.
| Bildirim | Apple size ne söylüyor | Sizin eyleminiz | Yanıt bekleniyor |
|---|---|---|---|
| CONSUMPTION_REQUEST | Bir müşteri iade istedi ve Apple verinizi istiyor | 12 saat içinde Send Consumption Information gönderin | Evet, gerçek veri |
| REFUND | App Store işlemi iade etti | O işlem için hak sahipliğini iptal edin | Hayır, HTTP 200 |
| REFUND_DECLINED | App Store iadeyi reddetti | Erişimi koruyun, hiçbir şeyi değiştirmeyin | Hayır, HTTP 200 |
| REFUND_REVERSED | Apple verdiği bir iadeyi tersine çevirdi | İptal ettiğiniz içeriği geri yükleyin | Hayır, HTTP 200 |
Bir REFUND bildirimi size gerçekte ne söyler
REFUND, App Store bir işlemi bir müşteriye başarıyla iade ettiğinde tetiklenir. Her satın alma türüne uygulanır: bir tüketilebilir, bir tüketilemez, bir otomatik yenilenen abonelik ve yenilenmeyen bir abonelik. Bildirimin içindeki imzalı işlem artık iadeden önce sahip olmadığı iki alan taşır ve bu iki alan işin tüm özüdür.
revocationDate ve revocationReason gerçekleri taşır
revocationDate, App Store'un işlemi iade ettiği veya iptal ettiği milisaniye cinsinden UNIX zamanıdır. revocationReason size iadenin kategorisini söyler ve tam olarak iki değer alır.
| revocationReason | Apple'ın anlamı | Ondan ne çıkarmalı |
|---|---|---|
| 1 | İade, ürünle ilgili bir sorun nedeniyle verildi | Bir kalite veya teslimat sinyali. Kaydedin, eğilimini izleyin ve tek bir üründe ya da tek bir yapıda bir örüntü arayın |
| 0 | İade başka bir nedenle verildi | Sıradan bir iade. Hak sahipliğini iptal edin ve devam edin |
Bir işlemde revocationDate'in bulunması başlı başına işaretin kendisidir. Daha sonra bir işlemi çekerseniz ve onun bir revocationDate'i varsa, o satın alma iade edilmiştir, bildirim olsun ya da olmasın. Nedeni onun yanında okuyun ki tek bir sürümde değer-1 iadelerinden oluşan bir dalga gürültü gibi gözünüzden kaçmasın.
Ürüne göre değil, işleme göre iptal edin
Buradaki tuzak çok fazlasını iptal etmektir. Bir REFUND tek bir işlemi adlandırır. Size müşterinin o ürün kimliğiyle yaptığı her satın almayı devre dışı bırakmanızı söylemez. Apple'ın kendi rehberliği, herhangi bir şeyi kesmeden önce müşterinin hâlâ hangi erişime sahip olduğunu kontrol etmenizdir, çünkü hak sahiplikleri örtüşür. Klasik örnek bir aboneliktir: bir iade geçen ayın yenilemesine gelirken bu ayın yenilemesi etkin ve tam ödenmiştir. Ürüne göre iptal edin ve zaten sona ermiş bir dönem için yapılan bir iade yüzünden güncel, ödeme yapan bir müşteriyi kesip atmış olursunuz.
REFUND_DECLINED zaten kazandığınız anlamına gelir, o yüzden bunu geri almayın
REFUND_DECLINED, App Store müşterinin iade talebini reddettiğinde gelir. Müşteri istedi, Apple hayır dedi ve siz satışı korursunuz. İlk bakışta yapacak bir şey yoktur ve mesele de budur. Bu bildirimin açığa çıkardığı hata farklı bir hatadır: erişimi erken iptal etmek.
Kodunuz CONSUMPTION_REQUEST'e, Apple karar vermeden önce müşterinin erişimini çekerek tepki verirse, bir REFUND_DECLINED o kararın patladığı andır. Apple paranızı tuttu ve siz iadesi reddedilmiş bir müşteriyi kilitlediniz. O müşteri artık kullanamadığı bir ürün için ödeme yapar, bir destek talebi açar ve bunu hatırlar. Çözüm bir özellik değil, bir kuraldır: REFUND'da iptal edin, talepte asla değil. REFUND_DECLINED yalnızca Apple'ın, erken iptalin yanlış bir karar olacağını doğrulamasıdır.
REFUND_REVERSED, size geri ödeme yapan bildirimdir
REFUND_REVERSED, neredeyse kimsenin işlemediği bildirimdir ve size parayı geri getiren de odur. Apple bunu, daha önce verdiği bir iadeyi tersine çevirdiğinde gönderir, tipik olarak müşteri o iadeye itiraz ettikten sonra. Bir REFUND'un işleme eklediği iptal alanları yeniden kaldırılır, böylece satın alma yeniden ödenmiş olarak okunur. Apple, geliştiricinin işini tek satırda ifade eder: uygulamanız ilgili iade sonucunda içerik veya hizmetleri iptal ettiyse, onları geri yüklemesi gerekir. Bir tüketilebilirden otomatik yenilenen bir aboneliğe kadar her satın alma türüne uygulanır.
Haftalar sonrası sorunu
Geliştiricilerin Apple'ın kendi forumlarında dile getirdiği gerçek soru zamanlamadır. Bir REFUND_REVERSED, orijinal REFUND'dan haftalar sonra, bir abonelik dönemi sona erdikten çok sonra gelebilir. O zaman erişimi geri yükler misiniz? İşlemin gerçekte verdiği şeyi, o işlemin kapsadığı şeyle sınırlı olarak geri yükleyin. Bir tüketilebilir veya bir tüketilemez için kilidi yeniden açın. Zaten geçmiş bir abonelik dönemi için yeni süre dağıtmıyorsunuz, kaydı düzeltiyorsunuz ki müşterinin geçmişi doğru olsun ve hâlâ geçerli olan herhangi bir hak sahipliği yeniden devreye girsin. Belirli işlemi geri yükleyin ve örtüşme mantığınız şu anda neyin etkin olduğuna karar versin.

Bunu doğru yapmakta para nerede
Bu bildirimlerin her biri gerçek bir sayıya karşılık gelir ve onu yanlış işlemenin maliyeti yalnızca satış fiyatı değildir.
REFUND: iade edilmiş bir müşteriye hizmet etmek için ödeme yapmayı bırakın
REFUND geldiği an satış fiyatı gitmiştir. Hâlâ kontrol edebileceğiniz şey, sunmaya devam etmenin maliyetidir. İade edilmiş bir hak sahipliğinin etkin kaldığı her saat, müşterinin artık ödemediği şeylere harcamaya devam edersiniz: işlem gücü, model API çağrıları, depolama ve onun kullanımına bağlı herhangi bir içerik üreticisi ya da ortak ödemesi. REFUND'da hemen iptal etmek o sayacı durdurur. Bildirimi göz ardı etmek, mağazanın zaten telafi ettiği biri için bir ürünü finanse etmeniz anlamına gelir.
REFUND_DECLINED: bir kazancı iyi niyet iadesine dönüştürmeyin
Erken iptal ettiğinizde ve iade daha sonra reddedildiğinde, satışı kâğıt üzerinde korudunuz ama uygulamada kaybettiniz. Ödeme yapan müşteri ürünü kullanamaz, dolayısıyla bir destek görüşmesini ve çoğu zaman durumu düzeltmek için isteğe bağlı bir iadeyi devralırsınız. Bu, hiçbir zaman tehlikede olmamış tek bir satış için iki kez ödeme yapmaktır. REFUND_DECLINED'ı doğru işlemek hiçbir şeye mal olmaz, tam da bu yüzden REFUND'a kadar erişime dokunmadan bırakmak benimseyebileceğiniz en ucuz kuraldır.
REFUND_REVERSED: en kötü ikili, hem paralarının hem erişimlerinin gitmiş olmasıdır
REFUND_REVERSED'ı göz ardı edin ve tahtadaki en kötü sonuca ulaşırsınız. Size ödeme yapıldı ve müşterinin elinde hiçbir şey yok. İadeyi tersine çevirmek için bankasıyla zaten bir kez iletişime geçti ve artık ücretlendirildiği bir üründen kilitlenmiş biri, bankayla ikinci kez iletişime geçmesi muhtemel bir kişidir. O sonraki itiraz bir kart ters ibrazına dönüşebilir, ki bu banka nezdinde kesindir ve satışın hiç maliyet ettiğinden daha fazlaya mal olur. REFUND_REVERSED geldiği an erişimi geri yüklemek, tüm iade akışındaki en ucuz sigortadır.
Neyi bağlamalı
Model doğru olduğunda işleme küçüktür. Hak sahipliklerini işlem kimliğine göre anahtarlayın ki her bildirim tek bir satın almayı işaret etsin. CONSUMPTION_REQUEST'te verinizi 12 saat içinde gönderin. REFUND'da o işlemi iptal edin. REFUND_DECLINED'da hiçbir şey yapmayın. REFUND_REVERSED'da geri yükleyin. Hepsine hızlıca HTTP 200 döndürün ve erişim değişikliğini kendi zamanınızda yapın.
Bildirimlerin bıraktığı boşluk için Get Refund History uç noktasını kullanın. Bir kesinti sırasında sunucunuz kapalıysa ve bir REFUND'u kaçırdıysa, /inApps/v2/refund/lookup/{transactionId} adresinde bir işlem kimliği için App Store Server API iade aramasını çağırın ve imzalı işlemleri revocationDate ve revocationReason değerleriyle geri okuyun. Bir seferde tek bir işlemi eşleştirir ve müşterinin iade edilmiş satın alımları arasında sayfalar, böylece kaçırılan bir webhook kalıcı olarak yanlış ayarlanmış bir hak sahipliğine dönüşmez.
İşte bu, RefundHalt'ın sizin için çalıştırdığı kısımdır. Dört türün tümünü dinler, REFUND'da iptal eder, REFUND_DECLINED'da erişime dokunmadan tutar ve REFUND_REVERSED'da otomatik olarak geri yükler, her biri tam işleme anahtarlanmış olarak. Tersine çevrilmiş bir iade, ödeme yapan bir müşteri kilitli kalırken bir kuyrukta beklemez ve reddedilmiş biri, geri almanız gereken bir iptali asla tetiklemez.
Sık sorulan sorular
- REFUND ile REFUND_REVERSED arasındaki fark nedir?
- REFUND, App Store'un bir işlemi iade ettiği ve o hak sahipliğini iptal etmeniz gerektiği anlamına gelir, oysa REFUND_REVERSED, Apple'ın verdiği bir iadeyi geri aldığı ve iptal ettiğiniz içeriği geri yüklemeniz gerektiği anlamına gelir. İkisi bir çifttir: bir satın alma REFUND geçebilir ve sonra, müşterinin itirazı bozulursa, REFUND_REVERSED. Erişim değişikliklerinizi işlem kimliğine göre anahtarlayın ki her bildirim doğru satın alma üzerinde işlem yapsın.
- Bir REFUND bildirimi için geri bir şey göndermem gerekiyor mu?
- Hayır. REFUND, REFUND_DECLINED ve REFUND_REVERSED'a bir HTTP 200 ve gövdesiz yanıt verirsiniz. Yalnızca CONSUMPTION_REQUEST veri göndermenizi ister ve bunu 12 saat içinde Send Consumption Information uç noktası üzerinden yapar. Diğer üçü, Apple'ın bir kararı bildirmesidir, bir soru sorması değil.
- Bir REFUND_DECLINED bildirimi aldığımda ne yapmalıyım?
- Hiçbir şey değişmez, çünkü müşterinin iadesi reddedildi ve siz satışı korursunuz. REFUND_DECLINED'ın iş çıkarmasının tek yolu, Apple karar vermeden önce erişimi erken iptal etmenizdir. CONSUMPTION_REQUEST yerine REFUND'da iptal edin, o zaman bir REFUND_DECLINED, erişimin doğru şekilde el değmeden bırakıldığının bir teyidi olur.
- REFUND_REVERSED iadeden haftalar sonra geldiğinde erişimi geri yüklemeli miyim?
- Evet, o belirli işlemin verdiği hak sahipliğini geri yükleyin. Apple, uygulamanız ilgili iade nedeniyle içeriği iptal ettiyse onu geri yüklemesi gerektiğini belirtir. Bir tüketilebilir veya tüketilemez için kilidi yeniden açın. Zaten sona ermiş bir abonelik dönemi için yeni süre vermiyorsunuz, kaydı düzeltiyorsunuz, dolayısıyla örtüşme mantığınız şu anda neyin etkin olduğuna yine de karar verir.
- Sunucumun kaçırdığı bir iade bildirimini nasıl yakalarım?
- App Store Server API Get Refund History uç noktasını kullanın, bu uç nokta bir müşterinin iade edilmiş işlemlerini /inApps/v2/refund/lookup/{transactionId} adresinde işlem kimliğine göre arar. revocationDate ve revocationReason ile imzalı işlemler döndürür, böylece bir kesintiden sonra, zaten tetiklenmiş bir bildirimi beklemeden erişimi mutabık kılabilirsiniz. Çağrı başına tek bir işlem kimliğini işler ve müşterinin iade edilmiş satın alımları arasında sayfalar.
Kaynaklar ve ek okumalar
RefundHalt
App Store ve Google Play için geri ödeme otomatik pilotu
Okumaya devam edin
Artık her Apple iade talebi bir gerekçeyle geliyor ve onu okumanın yolu consumptionRequestReason
WWDC24'ten bu yana her Apple CONSUMPTION_REQUEST bir consumptionRequestReason taşıyor, yani müşterinin iade istemek için kendi belirttiği gerekçe. UNINTENDED_PURCHASE'tan LEGAL'a kadar beş değer var ve her biri 12 saatlik pencerenizde geri gönderdiğiniz yanıtı değiştirmeli. İşte her birini nasıl okuyacağınız.
Google Play'in ters ibraz incelemesi savunma için size 24 saat verir, işte göndermeniz gerekenler
Bir banka bir Google Play tahsilatını geri çektiğinde, Google sunucunuza bir PendingRefundReviewNotification gönderir ve 24 saatlik bir sayaç başlatır. Buna ReviewRefund API üzerinden bir iade tercihi ve gerçek tüketim kanıtıyla yanıt verin, yoksa anlaşmazlık sizsiz karara bağlanır. İşte tüm akış, alan alan.