İadeden Sonra Erişimi İptal Etmek: Apple ve Google'ın Sizin İçin Yapmadığı Adım
Apple ve Google, müşteri satın aldığı şeyi elinde tutarken bile iade işlemini tamamlayabilir. Erişimin tam olarak ne zaman otomatik olarak kaldırıldığını, ne zaman bunu sunucunuzun yapması gerektiğini ve çoğu entegrasyonun hiç ele almadığı tek bildirimi burada tam olarak anlatıyoruz.

Önemli noktalar
- Google Play'de bir siparişi iade etmek, tek başına kullanıcının erişimini kaldırmaz. Erişim yalnızca Play Console'da Remove entitlement seçeneği işaretlendiğinde veya API çağrısında revoke=true gönderildiğinde kaldırılır, bu da varsayılan davranış değildir.
- revoke seçeneği kullanılmadan yapılan bir iade, Voided Purchases API'de hiçbir zaman görünmez. Yalnızca bu akışı okuyan bir iptal işi, bu tür siparişlerin tamamını sessizce atlar.
- Apple, tüketilemeyen ürünler ve abonelikler için bir lisansı otomatik olarak iptal edebilir, ancak tüketilebilir bir ürün harcandığı anda zaten teslim edilmiş sayılır, bu yüzden StoreKit'in bunu iptal edecek bir mekanizması yoktur. Bakiyeyi düşürmek sunucunuzun görevidir.
- Apple kendi verdiği bir iadeyi de geri alabilir. Bir REFUND_REVERSED bildirimi, daha önce onaylanmış bir iadenin geri alındığı anlamına gelir, revocationDate yeniden null olur ve kaldırdığınız her erişim veya bakiye geri yüklenmelidir.
- Google'ın voidedReason alanı, remorse ve accidental_purchase'tan fraud, friendly_fraud ve unacknowledged_purchase'a kadar dokuz değer taşır, dolayısıyla erişimi ne zaman iptal etmeniz gerektiğini söyleyen aynı akış, hangi iptallerin kötüye kullanım, hangilerinin ise kendi entegrasyon hatanız olduğunu da söyler.
- İade edilmiş bir satın almanın erişimini korumaya devam ettiği her gün, zaten geri ödediğiniz para karşılığında arkasındaki işlem gücü, depolama ve API çağrıları için ödeme yapmaya devam ettiğiniz bir gündür.
Bir iadeyi onaylamak ile erişimi kaldırmak birbirinden ayrı iki adımdır ve bunlardan yalnızca biri otomatik olarak gerçekleşir. İşlenmiş bir iadenin iptal edilmiş bir satın alma anlamına geldiğini varsayan geliştiriciler, her iki büyük mağazada da, farklı şekillerde ve farklı nedenlerle yanılıyor. Otomasyonun tam olarak nerede durduğunu bilmek, aylar sonra bunun hiç gerçekleşmediğini fark etmek yerine iadeden sonra erişimi gerçekten iptal etmek için gereken şeydir.
Bir iade neden varsayılan olarak erişimi iptal etmez
Apple ve Google, parayı ve erişimi iki ayrı işlem olarak ele alır. Para tarafı mağaza politikasıdır: bir iade onaylandığında bu kesindir ve kayıt güncellenir. Erişim tarafı ise isteğe bağlıdır, geliştiricinin işidir ya da her ikisidir birden, bu platforma ve satın alma türüne göre değişir. Hiçbir mağaza, iade tamamlanır tamamlanmaz erişimin ortadan kalkmasını istediğinizi varsaymaz, çünkü kısmi iade, bir jest olarak verilen kredi ya da bir destek hareketi gibi birçok meşru durumda ürünün elden hiç alınmaması gerekir.
Google Play: kimsenin fark etmediği onay kutusu
Play Console'da bir siparişi iade etmek iki parçalı bir formdur: önce iade tutarı seçilir, sonra Remove entitlement seçeneğinin işaretlenip işaretlenmeyeceğine ayrıca karar verilir. Çoğu destek temsilcisinin izlediği varsayılan yol, bu seçeneği işaretlemeden bırakmaktır, çünkü çoğu iade talebi müşterinin satın aldığı şeyi elinde tuttuğu bir iyi niyet jestidir. Sorun şu ki, iade onay ekranında hiçbir yer, bunun aynı zamanda kesin olmasını istediğiniz bir iadeden sonra müşterinin bir aboneliği veya uygulama içi ürünü elinde tutmasının yolu olduğunu söylemez.
API yolunda da aynı tuzak var
Aynı seçim kodda da mevcuttur. orders.refund uç noktası isteğe bağlı bir revoke sorgu parametresi alır; bu true olduğunda öğeye erişim hemen sonlandırılır ve tekrarlayan bir abonelik için gelecekteki tüm ödemeler de bununla birlikte iptal edilir. Parametre atlanırsa varsayılan olarak false kabul edilir: iade kaydedilir, satın alma kaydı güncellenir ve kullanıcı ürünü tamamen öncekiyle aynı şekilde kullanmaya devam eder.
| Eylem | Erişim kaldırıldı mı? | Voided Purchases API'de görünüyor mu? |
|---|---|---|
| Play Console iadesi, Remove entitlement işaretlenmemiş | Hayır | Hayır |
| Play Console iadesi, Remove entitlement işaretlenmiş | Evet, hemen | Evet |
| orders.refund API, revoke parametresi atlanmış (varsayılan false) | Hayır | Hayır |
| orders.refund API, revoke=true | Evet, hemen | Evet |
İşte entegrasyonları yakalayan tam olarak o son satırdır. Voided Purchases API, Play Console'u elle sürekli kontrol etmeden bir iptal hattı kurabilmeniz için vardır, ancak yalnızca gerçekten revocation ile geçersiz kılınmış siparişleri listeler. Onay kutusu olmadan ya da revoke=true olmadan işlenen bir iade, bir hata yüzünden değil, tasarım gereği bu akışa görünmez.

voidedReason alanını okumak Bir satın alma voided olarak göründüğünde, voidedReason alanı bunun nedenini dokuz değerlik bir ölçekte belirtir: other, remorse, not_received, defective, accidental_purchase, fraud, friendly_fraud, chargeback ve unacknowledged_purchase. Bu yalnızca bir kayıt tutma meselesi değildir. Remorse ve accidental_purchase sıradan iadelerdir. Fraud, friendly_fraud ve chargeback ise düz bir iptal edip unutma yolu yerine bir dolandırıcılık inceleme kuyruğuna yönlendirilmeye değer olanlardır, çünkü aynı hesabın istatistiksel olarak tekrar etme olasılığı daha yüksektir.
Bu akışa doğrudan karşı bir şeyler inşa ediyorsanız önemli bir operasyonel ayrıntı var: purchases.voidedpurchases.list, günde 6,000 sorgu ve herhangi bir 30 saniyelik pencerede 30 sorgu ile sınırlıdır. Sıkı bir döngüde sorgulama yapan bir tasarım bu sınıra hızla ulaşır; amaçlanan desen sürekli sorgulama değil, sayfalama belirteçleriyle zamanlanmış bir çekme işlemidir.
Apple: App Store bir lisansı iptal edebilir, ama tüketilebilir bir ürünü edemez
Apple'ın App Store Server Notifications V2'si, bir iade tamamlandığı anda tüketilebilir, tüketilemeyen, otomatik yenilenen abonelik ve otomatik yenilenmeyen abonelik türlerinin tümü için bir REFUND bildirimi gönderir. Bu bildirimden sonra ne olacağı tamamen satın alma türüne bağlıdır, çünkü StoreKit'in kendi iptal mekanizması dört türden yalnızca ikisini kapsar.
Tüketilebilir ürünlerin neden istisna olduğu
Tüketilemeyen bir ürünün ya da bir aboneliğin, Apple'ın sistemlerinin kapatabileceği kalıcı bir hakkı, bir entitlement'ı vardır. Tüketilebilir bir üründe bu yoktur: bir kez kullanıldığında teslim edilmiş sayılır ve StoreKit tarafında iptal edilecek hiçbir şey kalmaz. Bir müşteri 500 coin satın alıp bunları harcadıysa ve sonra iade aldıysa, Apple'ın bakış açısından o coinler zaten yok olmuştur. Bunların hâlâ kayıtlı olduğu tek defter sizinkidir. REFUND bildirimi, eşleşen orijinal işlem kimliğini bulup bu bakiyeyi kendi kayıtlarınızdan düşmeniz için tek sinyalinizdir; Apple tarafında bunu sizin için yapacak hiçbir şey yoktur.
| Bildirim | Ne anlama gelir | Sunucunuzun ne yapması gerekir |
|---|---|---|
| REFUND | Apple, tüketilebilir, tüketilemeyen, otomatik yenilenen veya otomatik yenilenmeyen bir satın almayı iade etti | Tüketilemeyen ürün ve abonelik erişimini hemen iptal edin; tüketilebilir bakiyeyi kendiniz düşün |
| REFUND_DECLINED | Apple, bir müşterinin iade talebini reddetti | Hiçbir şey yapmanıza gerek yok. Erişim hiçbir zaman risk altında olmadı |
| REFUND_REVERSED | Apple, daha önce verdiği bir iadeyi geri aldı | REFUND bildiriminin kaldırmanıza neden olduğu erişim veya bakiyenin tamamını geri yükleyin |
| CONSUMPTION_REQUEST | Apple, bir iadeye karar vermeden önce kanıtınızı istiyor | 12 saat içinde yanıt verin; bu bildirim bir REFUND'dan önce tetiklenir, sonra değil |
Neredeyse hiç kimsenin ele almadığı bildirim
REFUND_REVERSED, çoğu entegrasyonun tamamen atladığı bildirimdir, çünkü Apple'ın kendi kararını geri almasını tanımlar; bu, geliştiricilerin çoğunun ilk seferde tasarladığı bir durum değildir. Bu bildirim geldiğinde, işlem üzerindeki revocationDate yeniden null olur: Apple açısından satın alma yeniden geçerlidir. Orijinal REFUND geldiğinde sunucunuz bir entitlement'ı sildiyse, bir abonelik kaydını iptal ettiyse ya da tüketilebilir bir bakiyeyi sıfırladıysa, REFUND_REVERSED bunların hepsini geri koymanız gerektiğinin sinyalidir.
Bu boşluğu adım adım nasıl kapatırsınız
- Google Play'de, belirli bir destek durumu müşterinin erişimi elinde tutmasını gerektirmediği sürece, ister Play Console üzerinden ister API üzerinden olsun, her iade yolunda varsayılanı revoke=true olarak ayarlayın.
- purchases.voidedpurchases.list'i sıkı bir döngüyle değil, sayfalama belirteçleriyle zamanlanmış bir şekilde sorgulayın ve günde 6,000 isteğin ve 30 saniyede 30 isteğin altında kalın.
- voidedReason değeri fraud, friendly_fraud ve chargeback olanları, otomatik iptal edip kapatmak yerine bir inceleme kuyruğuna yönlendirin.
- Apple tarafında App Store Server Notifications V2'ye abone olun ve bir REFUND bildirimi ilgili öğeleri belirttiği anda tüketilemeyen ürün ve abonelik erişimini iptal edin.
- Her tüketilebilir satın alma için orijinal işlem kimliğini saklayın, böylece bir REFUND bildirimi geldiğinde manuel arama yapmadan düşülecek doğru bakiyeyi bulabilirsiniz.
- REFUND_REVERSED'ı açıkça işleyin ve her iptali kendi işlem veya sipariş kimliğine karşı kaydedin, böylece bir geri alma işlemi tam olarak neyin kaldırıldığını geri yükleyebilsin.
Bu boşluğun asıl maliyeti nedir
Bunların hiçbiri müşteriye karşı adalet meselesi değildir; para gittikten sonra ne çalışmaya devam ettiği meselesidir. API'nizi çağırmaya, veri saklamaya ve işlem gücü tüketmeye devam eden iade edilmiş bir abonelik ahlaki bir sorun değildir, bir maliyet kalemidir: zaten geliri geri verdiğiniz bir satın alma için altyapı faturasını ödemeye devam ediyorsunuzdur. Mağazalar bu maliyeti sizin için takip etmez, çünkü onların açısından para hareket eder etmez iade tamamlanmıştır. Erişim tarafı tamamen sizin kontrol etmeniz gereken bir faturadır.
RefundHalt'ın iptali sonradan akla gelen bir iş olarak değil, iade hattının bir parçası olarak ele almasının nedeni de tam olarak budur: bir REFUND olayı ve bir erişim değişikliği tek bir işlem olarak kaydedilir ve bir REFUND_REVERSED olayı, birinin müşterinin Apple'ın geri verdiği bir şeyden hâlâ dışlanmış olduğunu fark etmesini beklemek yerine durumu otomatik olarak geri yükler.
Sık sorulan sorular
- Google Play'de bir satın almayı iade etmek erişimi otomatik olarak iptal eder mi?
- Hayır. Erişim yalnızca Play Console'da Remove entitlement işaretlenmişse veya orders.refund API çağrısı revoke=true içeriyorsa kaldırılır. İkisi de varsayılan değildir, bu yüzden bir iade işlenirken müşteri ürünü kullanmaya devam edebilir.
- App Store'da tüketilebilir bir uygulama içi satın alma iade edildiğinde ne olur?
- Apple bir REFUND bildirimi gönderir, ancak StoreKit'in tüketilebilir bir ürünü iptal etmesinin bir yolu yoktur çünkü harcandığında teslim edilmiş sayılır. Geliştiricinin sunucusu orijinal işlemi bulup bakiyeyi manuel olarak düşmelidir.
- REFUND_REVERSED bildirimi nedir ve özel bir işlem gerektirir mi?
- REFUND_REVERSED, Apple'ın daha önce verdiği bir iadeyi geri aldığı anlamına gelir; revocationDate yeniden null olur ve satın alma tekrar geçerli hale gelir. Orijinal REFUND'un kaldırdığı her erişim veya bakiye geri yüklenmelidir, ancak çoğu entegrasyon bu bildirimi hiç dinlemez.
- İade edilmiş bir Google Play siparişi neden Voided Purchases API'de görünmeyebilir?
- Bu API yalnızca revocation ile geçersiz kılınmış siparişleri listeler. Bir iade revoke seçeneği olmadan işlendiyse, sipariş bu uç noktadan hiç döndürülmez, bu yüzden yalnızca buna güvenen bir hat bu iadeleri tamamen kaçırır.
- Google'ın Voided Purchases API'sini ne sıklıkla sorgulayabilirim?
- Bu uç nokta, günde 6,000 sorgu ve herhangi bir 30 saniyelik pencerede 30 sorgu ile hız sınırlıdır, dolayısıyla sürekli sorgulama yerine sayfalama belirteçleriyle zamanlanmış bir çekme işlemi için tasarlanmıştır.
Kaynaklar ve ek okumalar
- Apple: Handling refund notifications
- Apple: notificationType (App Store Server Notifications)
- Apple: revocationReason (App Store Server Notifications)
- Google: Voided Purchases API overview
- Google: purchases.voidedpurchases REST resource
- Google: orders.refund API reference (revoke parameter)
- Google Play Console Help: manage your app's orders and issue refunds
RefundHalt
App Store ve Google Play için geri ödeme otomatik pilotu
Okumaya devam edin
The refunds you cannot contest: what Apple and Google decide without asking you
Only two refund flows ever ask for your evidence: Apple's consumption request and Google Play's chargeback review. Everything else, the 48-hour Play refund, support refunds, voided purchases, unacknowledged trials, is decided without you. Here is the full map, what you can prevent, and what you can only record.
Apple's CONSUMPTION_REQUEST, explained: the 12 hours that decide your refund
When a customer asks Apple for a refund, Apple asks you first. Here's exactly what the CONSUMPTION_REQUEST notification contains, what Apple expects back, how to answer one end to end, and why most developers silently forfeit.