Усі статті
Playbook8 хв читання

Якщо ваш застосунок досі працює на App Store Server Notifications V1, Apple ніколи не питає вас про повернення коштів за підписки

Apple визнала App Store Server Notifications V1 застарілою версією в червні 2023 року, і вона так і не отримала CONSUMPTION_REQUEST для підписок, REFUND_DECLINED чи REFUND_REVERSED. Розповідаємо, що пропускає сервер на V1, скільки це коштує і як перейти на V2, не втративши жодного повернення.

Стара поштова скринька, переповнена нерозкритими листами, поруч із сучасною серверною стійкою, як ілюстрація сигналів про повернення коштів, що губляться в App Store Server Notifications V1

Головне

  • Apple визнала застарілими App Store Server Notifications V1 та ендпоінт verifyReceipt 5 червня 2023 року. Обидва досі працюють, не отримують нових функцій, і дату припинення підтримки не оголошено.
  • У документації Apple до V1 CONSUMPTION_REQUEST зазначено лише для витратних внутрішніх покупок. Запити на споживання для автоматично поновлюваних підписок додали в App Store Server Notifications V2 у квітні 2024 року.
  • REFUND_DECLINED і REFUND_REVERSED існують лише в App Store Server Notifications V2, тому сервер на V1 ніколи не дізнається, що Apple відхилила повернення коштів або скасувала вже надане.
  • У V1 повернення коштів Apple за автоматично поновлювану підписку надходить як CANCEL. У V2 воно надходить як REFUND із revocationDate і revocationReason у підписаній транзакції.
  • Apple повторює невдале сповіщення V2 п'ять разів протягом приблизно тижня, через 1, 12, 24, 48 і 72 години. Невдале сповіщення V1 отримує три повторні спроби, через 6, 24 і 48 годин, і його не можна відновити через Get Notification History.
  • Після перемикання застосунку на V2 в App Store Connect нові сповіщення одразу надходять у форматі V2, тоді як сповіщення V1, що вже перебувають у повторних спробах, можуть надходити ще приблизно 78 годин.

Version 1 App Store Server Notifications досі повідомляє про повернення коштів, але пропускає те єдине сповіщення, яке дає змогу відстояти свою позицію щодо повернення за підписку. Apple визнала V1 застарілою 5 червня 2023 року разом з ендпоінтом verifyReceipt і відтоді додавала кожну функцію, пов'язану з поверненнями, лише у V2. Якщо в налаштуваннях App Store Connect у вас досі вказано Version 1, Apple може ухвалити рішення про повернення коштів за підписку, жодного разу не надіславши вашому серверу CONSUMPTION_REQUEST. Ви не програєте суперечку. Вас просто ніколи до неї не запрошують.

Що означає визнання App Store Server Notifications V1 застарілою

Застаріла не означає вимкнена. Інженер Apple написав на форумах для розробників у червні 2023 року, що verifyReceipt і сповіщення V1 працюватимуть, доки не буде оголошено дату припинення підтримки, що цю дату ще не визначено і що розробників попередять заздалегідь. Понад три роки потому App Store Connect досі пропонує "Version 1 (deprecated)" як варіант під час налаштування URL сервера.

Насправді застарілість означає заморожування. Кожна зміна в журналі змін сповіщень Apple з червня 2023 року стосується V2: нові поля в підписаній транзакції, нові типи сповіщень, дані про 12-місячне зобов'язання, додані у квітні 2026 року. Сервер на V1 не бачить нічого з цього.

Яких сигналів про повернення коштів сервер на V1 не отримує ніколи

Ось як ті самі події повернення коштів доходять до сервера на V1 і сервера на V2, згідно з документацією Apple для кожної версії.

Подія повернення коштівVersion 1Version 2
Клієнт просить Apple повернути кошти за витратну покупкуCONSUMPTION_REQUESTCONSUMPTION_REQUEST
Клієнт просить Apple повернути кошти за автоматично поновлювану підпискуНе зазначено в документації V1CONSUMPTION_REQUEST, з квітня 2024 року
Apple повертає кошти за автоматично поновлювану підпискуCANCELREFUND
Apple повертає кошти за витратну, невитратну покупку або непоновлювану підпискуREFUNDREFUND
Apple відхиляє повернення, яке клієнт ініціював у вашому застосункуНедоступноREFUND_DECLINED
Apple скасовує вже надане повернення коштівНедоступноREFUND_REVERSED
Ви відновлюєте сповіщення, пропущені під час збоюНедоступноGet Notification History

Чи отримує V1 CONSUMPTION_REQUEST взагалі?

Так, для витратних покупок. Довідник Apple до V1 описує CONSUMPTION_REQUEST як сповіщення, яке надсилається, коли клієнт ініціює запит на повернення коштів за витратну внутрішню покупку. Інженер Apple підтвердив на форумах у 2023 році, що запити на споживання у V1 надходять для придатних повернень. Прогалина стосується підписок. Журнал змін Apple датує запити на споживання для підписок 11 квітня 2024 року, у V2, а документація Send Consumption Information зазначає, що Apple надсилає запит через ваш ендпоінт V2.

Чому CANCEL у V1 легко неправильно зрозуміти

У V1, коли Apple повертає кошти за підписку, тип сповіщення CANCEL, часто разом із DID_CHANGE_RENEWAL_STATUS. Чимало серверів трактують будь-яке скасування як вимкнення клієнтом автопоновлення, і доступ залишається активним до кінця періоду. V2 усуває цю неоднозначність. Повернення коштів надходить як REFUND, а вимкнення клієнтом поновлення надходить як DID_CHANGE_RENEWAL_STATUS з підтипом AUTO_RENEW_DISABLED.

Скільки грошей коштує залишатися на V1

Кожне рішення про повернення коштів в App Store ухвалює Apple. CONSUMPTION_REQUEST є єдиною точкою, де ваші дані про використання потрапляють до цього рішення, і Apple просить відповісти протягом 12 годин. У V1 повернення коштів за підписки оминають цей крок.

Ось розрахунковий приклад з умовними цифрами. Припустімо, ваш застосунок продає щомісячну підписку за $9.99, що включає генерацію зображень за допомогою ШІ. Підписник виконує 400 генерацій за місяць, і кожна коштує вам реальних грошей на інференс моделі. Потім він просить Apple повернути кошти.

Стаття витратСервер на V1Сервер на V2
Ваша частка платежуПовертається, якщо Apple схвалитьПовертається, якщо Apple схвалить
Обчислення, виклики API та сховище, використані за той місяцьУже оплачено, не повертаєтьсяУже оплачено, не повертається
Можливість показати Apple 400 генераційНемаєОдин CONSUMPTION_REQUEST, 12 годин
Дізнатися, що Apple відхилила поверненняНіколиREFUND_DECLINED
Дізнатися, що повернення скасованоНіколиREFUND_REVERSED

Платіж, який ви втрачаєте, це ваша частка, а не роздрібна ціна. Apple виплачує 70% ціни підписки за вирахуванням застосовних податків протягом першого року платного обслуговування підписника і 85% після цього або для учасників App Store Small Business Program. Рахунок за обчислення разом із цим не зменшується. Інференс, виклики сторонніх API і зберігання файлів були оплачені тоді, коли клієнт ними користувався.

Два відсутні сповіщення про результат теж коштують грошей. Без REFUND_REVERSED сервер, який відкликав доступ після повернення коштів, ніколи не відновить його, коли Apple скасує повернення, тож клієнт, який платить, залишається без доступу і пише в підтримку. Без REFUND_DECLINED ви не відрізните повернення, яке ще розглядається, від того, яке Apple відхилила.

Руки розробника переставляють мережевий кабель зі старого порту патч-панелі в новий поруч із відкритим ноутбуком

Як перейти з V1 на V2, не втративши жодного повернення

Перехід на V2 це зміна на сервері плюс одне налаштування. Власні рекомендації Apple на форумах від App Store Commerce Engineer у грудні 2025 року пояснюють, що відбувається в день перемикання.

Створіть ендпоінт V2, перш ніж змінювати налаштування

  • Приймайте POST, тіло якого містить signedPayload. Корисні навантаження V2 мають формат JWS і підписані Apple, тож перевіряйте підпис, перш ніж довіряти будь-чому всередині. App Store Server Library від Apple робить це за вас.
  • Замініть обробку CANCEL на REFUND, а REFUND_DECLINED і REFUND_REVERSED обробляйте як нові випадки.
  • Відповідайте на CONSUMPTION_REQUEST для підписок через Send Consumption Information і лише тоді, коли клієнт дав згоду на передавання даних Apple. Apple зазначає, що без згоди відповідати не слід.
  • У разі успіху повертайте HTTP від 200 до 206. Будь-який код 40x або 50x змушує Apple повторити спробу.

Змініть налаштування в App Store Connect

В App Store Connect відкрийте свій застосунок, виберіть App Information у розділі General, знайдіть App Store Server Notifications і вкажіть свій ендпоінт V2 як Production Server URL, вибравши Version 2. Якщо хочете протестувати, спершу зробіть те саме для sandbox URL і скористайтеся Request a Test Notification, щоб переконатися, що ваш сервер відповідає.

Залиште обробник V1 працювати приблизно три дні

Після перемикання нові сповіщення одразу надходять у форматі V2 для кожної підписки, старої чи нової. Сповіщення V1, що вже перебувають у повторних спробах, і далі надходять у форматі V1, доки не будуть успішно доставлені або не вичерпають спроби. Apple оцінює останню можливу повторну спробу V1 приблизно у 78 годин, тобто 6 + 24 + 48. Залиште старий обробник працювати довше за цей час, а потім видаліть його.

Заодно замініть verifyReceipt

verifyReceipt визнали застарілим того ж дня. Він досі відповідає, але Apple спрямовує сервери до App Store Server API. Get Transaction Info повертає одну підписану транзакцію, Get Transaction History повертає історію клієнта, а Get Refund History перелічує всі покупки клієнта, за які було повернено кошти. Разом зі сповіщеннями V2 вони покривають усе, для чого більшість серверів використовували квитанції, зокрема поле cancellation_date, яке колись позначало повернення коштів у квитанції.

RefundHalt підключається до App Store Server Notifications V2 і відповідає на кожен CONSUMPTION_REQUEST у межах 12-годинного вікна, використовуючи дані про використання, які ваш застосунок уже записує. Якщо ви досі на V1, саме перемикання робить усе це можливим.

Поширені запитання

Чи вимикають App Store Server Notifications V1?
Поки що ні. Apple визнала V1 і verifyReceipt застарілими 5 червня 2023 року, і обидва досі працюють. Apple заявила, що дати припинення підтримки ще немає і що розробників повідомлять заздалегідь. Тим часом V1 не отримує нових функцій.
Чи отримую я сповіщення CONSUMPTION_REQUEST на V1?
Лише для витратних покупок, згідно з документацією Apple до V1. Запити на споживання для автоматично поновлюваних підписок додали у V2 у квітні 2024 року, і Apple надсилає їх через ваш ендпоінт V2. Якщо ви продаєте підписки і залишаєтеся на V1, ви не можете відповідати на ці запити на повернення коштів.
Як виглядає повернення коштів за підписку у V1 порівняно з V2?
У V1 воно надходить як CANCEL, часто разом із DID_CHANGE_RENEWAL_STATUS. У V2 воно надходить як REFUND із revocationDate і revocationReason у підписаній транзакції. Також V2 надсилає REFUND_DECLINED, коли Apple відхиляє повернення, ініційоване у вашому застосунку, і REFUND_REVERSED, коли Apple скасовує надане повернення.
Що відбувається зі сповіщеннями, коли я перемикаюся з V1 на V2?
Невдовзі після перемикання нові сповіщення надходять у форматі V2 для всіх підписок. Сповіщення V1, які вже повторюються, і далі надходять у форматі V1, доки не будуть доставлені або не вичерпають повторні спроби, на що, за оцінкою Apple, іде приблизно 78 годин після перемикання. Тримайте обидва обробники активними протягом цього часу.
Чи можна повернутися на V1 після переходу на V2?
Так, через ендпоінт Modify an App в App Store Connect API, як описано в технічній нотатці Apple TN3180. Apple називає це нетиповим випадком і досі позначає V1 як застарілу, тож повернення означає відмову від запитів на споживання для підписок і новіших сповіщень про повернення коштів.

Джерела та додаткове читання

RefundHalt

Автопілот повернень для App Store і Google Play

Читайте далі

Deep dive9 хв читання

Одне повернення коштів за місячною підпискою Apple із 12-місячним зобов'язанням може завершити весь рік або лише один його місяць

Місячна підписка Apple із 12-місячним зобов'язанням ділить повернення коштів на два випадки. Якщо повернути минулий місяць, оплата триває. Якщо повернути поточний місяць, зобов'язання завершується одразу. Розповідаємо, як кожен випадок доходить до вашого сервера, скільки він коштує і що надсилати Apple.

Playbook8 хв читання

Політика повернення коштів у вашому застосунку не переважає правила Apple чи Google, тож пишіть ту, що відповідає реальності

Політика повернення коштів у застосунку зобовʼязує вас лише там, де повернення справді здійснюєте ви. Apple сама повертає кошти за кожну покупку в App Store, а Google Play передає повернення вам через 48 годин. Ось що кажуть угоди обох магазинів, чого коштує необережна обіцянка і які пункти варто прописати.

Наступний запит на повернення вже в дорозі.

Налаштуйте RefundHalt за час, потрібний, щоб прочитати черговий лист у підтримку про повернення, яке ви не встигли оскаржити.