Order ID з App Store у чеку клієнта показує, що він купив і чи Apple вже повернув гроші
Ендпоінт Look Up Order ID від Apple перетворює order ID з чека App Store на підписані транзакції, з датою і причиною повернення. Як використовувати його для листів про повернення, чого він не вміє і чим від нього відрізняється order ID у Google Play.

Головне
- Apple надсилає поштою чек з order ID під час кожної вбудованої покупки, а ще клієнти знаходять свої order ID в історії покупок App Store.
- Ендпоінт Look Up Order ID в App Store Server API (GET /inApps/v1/lookup/{orderId}) для дійсного order ID повертає одну або кілька підписаних транзакцій, тож підтримка бачить productId і purchaseDate без здогадок.
- Декодована транзакція App Store містить revocationDate і revocationReason, тому перевірка order ID показує, чи Apple вже повернув гроші за покупку. Причина 1 означає, що Apple повернув гроші через реальну або уявну проблему в застосунку.
- Look Up Order ID повертає OrderLookupStatus 1 і не повертає масив signedTransactions, якщо order ID недійсний для вашого застосунку. Це ознака неправильного чека або покупки в іншому застосунку.
- Look Up Order ID недоступний у середовищі sandbox Apple, а ліміт запитів у продакшені становить 10 запитів на секунду на застосунок і застосовується щогодини.
- Розробники не можуть оформлювати повернення в App Store. Рішення ухвалює Apple на reportaproblem.apple.com, а єдиний крок розробника з доказами це відповідь на CONSUMPTION_REQUEST протягом 12 годин.
- Google Play надсилає поштою order ID за кожну разову покупку і кожне продовження підписки, і розробник може знайти цей order ID у Play Console та повернути гроші напряму. За словами Play Console, повернення не можна скасувати.
Перш ніж відповідати на лист клієнта з iPhone про повернення, попросіть order ID з App Store у його чеку від Apple. Цей один рядок, пропущений через ендпоінт Look Up Order ID від Apple, скаже вам, який продукт він купив, коли і чи Apple вже повернув гроші. Без нього ви звіряєте скриншот і адресу пошти зі своєю базою та сподіваєтеся на краще. З ним ви за секунди розумієте, хто перед вами: клієнт, що платить, клієнт, якому Apple вже повернув гроші, чи людина з чеком з іншого застосунку.
Звідки береться order ID з App Store
Документація Apple тут конкретна. Коли клієнти здійснюють одну або кілька вбудованих покупок у вашому застосунку, App Store надсилає їм чек поштою, і в цьому чеку є order ID. Ще клієнти знаходять свої order ID в історії покупок App Store. Історія покупок Apple доступна на reportaproblem.apple.com і в застосунку App Store у розділі Застосунки та історія покупок, за замовчуванням показує останні 90 днів і має фільтри для старіших покупок.
Отже, ключ у клієнта вже є. Вашій формі підтримки потрібно лише запитати його.
Чому адреси пошти недостатньо
Apple не передає вам адресу пошти Apple Account клієнта. Адреса, з якої пишуть у підтримку, може не мати нічого спільного з акаунтом, який платив. Якщо під час покупки ви задаєте appAccountToken, ви можете пов'язати транзакцію зі своїм ID користувача, але лише зі свого боку. Order ID працює з боку клієнта, через чек, який він може переслати одним дотиком.
Що повертає Look Up Order ID
Look Up Order ID входить до App Store Server API і доступний починаючи з версії 1.1.0. Ви викликаєте GET https://api.storekit.apple.com/inApps/v1/lookup/{orderId} з підписаним JWT. За словами Apple, відповідь будується на історії вбудованих покупок клієнта, незалежно від того, чи встановлював він застосунок, видаляв чи ставив заново.
| Поле або поведінка | Що каже документація Apple | Що з цим робить підтримка |
|---|---|---|
| OrderLookupStatus 0 | Дійсний order ID. Відповідь містить масив з однієї або кількох підписаних транзакцій | Декодувати кожну і прочитати покупку |
| OrderLookupStatus 1 | Відповідь не містить масив signedTransactions | Вважати order ID недійсним для вашого застосунку. Попросити правильний чек |
| productId і purchaseDate | Apple називає ці поля для підтримки клієнтів | Підтвердити, що і коли куплено |
| revocationDate | Момент, коли App Store повернув гроші за транзакцію або відкликав її з Сімейного доступу | Якщо поле заповнене, Apple вже повернув клієнту гроші |
| revocationReason | 0: повернення з інших причин, наприклад випадкова покупка. 1: повернення через реальну або уявну проблему у вашому застосунку | 1 це сигнал про продукт, а не просто звернення до підтримки |
| appAccountToken | UUID, який ви задали під час покупки, якщо задали | Пов'язати замовлення зі своїм записом користувача |
| price і currency | Apple просить не використовувати їх для звірки виручки | Для грошей використовуйте звіти App Store Connect |
| Sandbox | Ендпоінт недоступний у середовищі sandbox | Тестувати лише на order ID з продакшену |
| Ліміт запитів | 10 запитів на секунду на застосунок, застосовується щогодини. Перевищення отримує HTTP 429 із заголовком Retry-After | Вистачає для підтримки, але не для масових перевірок |
Чи дійсний чек для мого застосунку?
Саме на це питання OrderLookupStatus відповідає першим. 1 означає, що order ID не відповідає покупкам у вашому застосунку. Звичайні випадки це помилка в наборі, чек від іншого застосунку або чек узагалі не з App Store. При 1 нічого не повертайте, не нараховуйте і не відновлюйте. Попросіть клієнта ще раз перевірити чек.
Чи Apple вже повернув гроші за цю покупку?
Перевірте revocationDate у кожній декодованій транзакції. Якщо поле заповнене, Apple уже повернув гроші за покупку або відкликав її з Сімейного доступу, і гроші в клієнта. Ваші App Store Server Notifications мали надіслати REFUND щодо тієї ж транзакції, тож це ще й дешевий спосіб переконатися, що сервер справді відкликав доступ.

Чого order ID не може в App Store
Він не може оформити повернення. У розробників немає кнопки повернення в App Store. Рішення про повернення ухвалює Apple, і стаття підтримки Apple відправляє клієнтів на reportaproblem.apple.com, де вони обирають «Я хочу», потім «Запитати повернення коштів», вказують причину і вибирають покупку. Apple також пише, що платіж в очікуванні не можна повернути, доки клієнт не отримав чек поштою.
Єдине місце, де у вас є голос, це CONSUMPTION_REQUEST від Apple. Коли клієнт просить Apple про повернення, Apple може надіслати це сповіщення, і у вас є 12 годин, щоб відповісти через Send Consumption Information. Перевірка order ID це інструмент підтримки. Вона не відкриває це вікно і не подовжує його.
У що обходиться лист про повернення, якщо пропустити перевірку
Підтримка без order ID це місце, де гроші витікають тихо. Три сценарії повторюються знову і знову.
- Жест доброї волі на додачу до повернення. Apple повертає гроші за покупку, клієнт пише ще й вам, а підтримка видає безкоштовні кредити або зайвий місяць. Кожен подарований кредит працює на обчисленнях, викликах API і сховищі, за які платите ви, і все це на акаунті, якому гроші вже повернули.
- Доступ, який так і не відкликали. Якщо обробка REFUND дала збій, клієнт після повернення далі користується сервісом. Перевірка, яка показує revocationDate, коли ваша база досі каже «активний», це баг-репорт із цінником.
- Не той акаунт, не те рішення. Якщо відновити доступ або нарахувати кредит акаунту з пересланого листа, коли order ID належить іншій людині, платний сервіс отримає той, хто нічого не купував.
Жодному з цих сценаріїв не потрібен чарджбек чи дедлайн, щоб ударити по грошах. Це просто відповіді підтримки без фактів. Один виклик API на звернення прибирає здогадки.
Чи означає revocationReason 1, що я зробив щось не так?
Не обов'язково. За словами Apple, причина 1 означає повернення через реальну або уявну проблему у вашому застосунку. Слово «уявну» тут важить багато. Але скупчення повернень з причиною 1 по одному продукту після одного релізу це найчіткіший відгук про продукт, який дає вам Apple. Рахуйте їх.
Чим відрізняється order ID у Google Play
Google Play влаштований навпаки. У документації Google щодо платежів сказано, що користувачі отримують лист з унікальним order ID за кожну разову покупку продукту, за першу покупку підписки і за кожне регулярне продовження, а order ID можна використовувати для керування поверненнями в Play Console. Ви шукаєте в Керуванні замовленнями за order ID або повною адресою пошти користувача і повертаєте гроші самі.
| Питання | Order ID з App Store | Order ID з Google Play |
|---|---|---|
| Де клієнт його знаходить | Чек поштою та історія покупок App Store | Чек поштою за кожну покупку і кожне продовження |
| Як ви його перевіряєте | Look Up Order ID в App Store Server API | Пошук у Керуванні замовленнями в Play Console |
| Чи можна за ним повернути гроші | Ні. Вирішує Apple | Так. Повні повернення і часткові для вбудованих покупок і підписок |
| Вікно для доказів під час повернення | CONSUMPTION_REQUEST, 12 годин, вирішує Apple | Перевірка чарджбеку через orders.reviewrefund, 24 години |
| Чи можна скасувати повернення | Не вами | Ні. За словами Play Console, повернення не можна скасувати |
У Google Play order ID важливіший, бо кнопку натискаєте ви. За словами Play Console, повернення за останнє замовлення підписки одразу видаляє підписку і скасовує майбутні продовження, а повернення за старіше замовлення це лише повернення, і підписка лишається активною. Часткові повернення підтримуються лише для замовлень, оформлених починаючи з березня 2018 року, а платний застосунок частково повернути не можна.
Поставте order ID на початок процесу підтримки з повернень
- Просіть order ID у формі підтримки, з підказкою в один рядок: він є в листі з чеком від Apple або Google Play.
- На iOS викличте Look Up Order ID, декодуйте кожну транзакцію і покажіть підтримці productId, purchaseDate, revocationDate і revocationReason на одному екрані.
- Якщо OrderLookupStatus дорівнює 1, зупиніться і попросіть правильний чек. Нічого не видавайте.
- Якщо revocationDate заповнене, переконайтеся, що доступ на вашому сервері вже відкликано, і закрийте звернення. Жодних жестів доброї волі зверху.
- Якщо воно не заповнене і клієнт хоче повернути гроші, відправте його на reportaproblem.apple.com і тримайте обробник CONSUMPTION_REQUEST готовим до 12-годинного вікна. RefundHalt відповідає на цей запит даними про споживання, які запитує Apple.
- На Android знайдіть точне замовлення в Play Console, перш ніж повертати гроші, і свідомо обирайте між простим поверненням і поверненням з відкликанням доступу.
Поширені запитання
- Як розробнику перевірити order ID з App Store?
- Викличте ендпоінт Look Up Order ID в App Store Server API, GET https://api.storekit.apple.com/inApps/v1/lookup/{orderId}, з підписаним JWT. Дійсний order ID повертає OrderLookupStatus 0 і одну або кілька підписаних транзакцій, які ви декодуєте, щоб прочитати productId, purchaseDate і деталі повернення, якщо вони є. Ендпоінт недоступний у sandbox.
- Де клієнт знаходить свій order ID з App Store?
- У чеку, який Apple надсилає поштою під час кожної вбудованої покупки, і в історії покупок App Store на reportaproblem.apple.com або в розділі Застосунки та історія покупок у застосунку App Store. Історія покупок за замовчуванням показує останні 90 днів і має фільтри для старіших покупок.
- Чи можу я повернути гроші за покупку в App Store за order ID?
- Ні. Розробники не можуть оформлювати повернення в App Store. Вирішує Apple, коли клієнт запитує повернення на reportaproblem.apple.com. Ваша частина це відповідь на CONSUMPTION_REQUEST від Apple протягом 12 годин через Send Consumption Information.
- Як зрозуміти, що Apple уже повернув гроші за покупку?
- Перевірте order ID і подивіться revocationDate у кожній декодованій транзакції. Якщо поле заповнене, Apple повернув гроші за покупку або відкликав її з Сімейного доступу. revocationReason 0 означає інші причини, наприклад випадкову покупку, а 1 реальну або уявну проблему у вашому застосунку.
- Що означає OrderLookupStatus 1?
- Це означає, що order ID недійсний для вашого застосунку, і у відповіді немає масиву signedTransactions. Зазвичай клієнт надіслав чек від іншого застосунку, помилився в ID або надіслав чек не з App Store. Попросіть правильний чек, перш ніж щось видавати.
Джерела та додаткове читання
- Apple Developer Documentation: Look Up Order ID
- Apple Developer Documentation: orderId
- Apple Developer Documentation: revocationReason
- Apple Developer Documentation: Identifying rate limits
- Apple Support: See your purchase history for the App Store, iTunes Store, and more
- Apple Support: Request a refund for apps or content that you bought from Apple
- Play Console Help: Refund orders and subscriptions
- Android Developers: Integrate the Google Play Billing Library into your app
RefundHalt
Автопілот повернень для App Store і Google Play
Читайте далі
Повернення коштів за веб-оплату в iOS тепер надходять до вас, а не до Apple. Як і банківські спори
Застосунки для iPhone у США тепер можуть вести покупців на веб-оплату. Apple каже, що не може допомогти з поверненнями за такі продажі, тож служба повернень, чарджбеки та комісії $15 за спір переходять до вас. Пояснюємо, що змінюється, скільки це коштує і як скоротити кількість спорів.
Повернення коштів за платний застосунок ніколи не доходить до вашого сервера, тому помітити його має сам застосунок
Повернення коштів за застосунки з оплатою під час купівлі оминають усі сповіщення, які слухає ваш сервер. Google дає покупцям дві години на повернення й видаляє застосунок, Apple за вашою угодою може повернути кошти протягом 90 днів, і жоден із них не просить доказів. Ось що повідомляє кожен магазин, скільки це коштує і як перевірити повернення в застосунку.