Общее
Этот раздел API посвящён запросу конфигурации пейгейта и валидации оплаты пользователем доступа в приложение
- вызов /payments/flow — для определения текущего установленного payment flow
- вызов /payments/ping — для уведомления бекенда о присутствии пользователя, который видел пейгейт, но не активировал подписку, в приложении
- вызов /payments/paygate — позволяет получить всю необходимую конфигурацию пейгейта, включая идентификаторы продуктов и названия кнопок
- вызов /payments/validate — URL для «скармливания» бекенду чеков (receipts) на валидацию, чтобы получить доступ в приложение
/flow
Описание: Для определения текущего установленного payment flow
Полный путь к методу: https://www.s1eep.app/api/payments/flow
Полный путь к методу: https://www.s1eep.app/api/payments/flow
Тип запроса: POST
Требования безопасности: API-ключ
Дополнительные ожидаемые параметры:
- version — номер версии (билда) приложения
Дополнительные возвращаемые параметры:
- flow — код payment flow:
- 1 — означает, что пейгейт надо показывать при обращении к платному контенту и давать пользователю навигировать по бесплатному контенту
- 2 — блокировать пользователя пейгейтом сразу после онбординга (разрешения пуш-нотификаций и установки времени для пушей)
Пример ответа:
{ "_code": 200, "_msg": "OK", "_need_payment": false, "_data": { "flow": 2 } }
/ping
Описание: для уведомления бекенда о присутствии пользователя, который видел пейгейт, но не активировал подписку, в приложении. Следует начать вызывать в момент посещения пейгейта и далее «пинговать» бекенд раз в секунду по этому ендпоинту, пока пользователь либо не активирует подписку, либо не свернёт приложение. Эту процедуру следует выполнять лишь раз. При возврате в приложение более не «пинговать» бекенд.
Полный путь к методу: https://www.s1eep.app/api/payments/ping
Полный путь к методу: https://www.s1eep.app/api/payments/ping
Тип запроса: POST
Требования безопасности: API-ключ
Дополнительные ожидаемые параметры:
- random_string — случайная строка этой копии приложения
Дополнительные возвращаемые параметры:
- нет
Пример ответа:
{ "_code": 200, "_msg": "OK", "_need_payment": false, "_data": "{}" }
/paygate
Описание: позволяет получить всю необходимую конфигурацию пейгейта, включая идентификаторы продуктов и названия кнопок. Может получать также токен существующего и активировавшего подписку ранее пользователя, чтобы скорректировать предложение подписки и более не обещать бесплатный период пользователю.
Особенности:
В ответах сервера могут содержаться плейсхолдеры, которые надо заменять на актуальные значения, которые может знать только клиент:
Особенности:
В ответах сервера могут содержаться плейсхолдеры, которые надо заменять на актуальные значения, которые может знать только клиент:
- @price — стоимость соответствующей подписки (т.е. подписки, которая указана в блоке данных, где встретился плейсхолдер)
- @price_div — стоимость соответствующей подписки, разделённая на число, указанное в параллельном параметра div, и округлённая до 1 знака после запятой.
Полный путь к методу: https://www.s1eep.app/api/payments/paygate
Тип запроса: POST
Требования безопасности: API-ключ
Дополнительные ожидаемые параметры:
- version — номер билда приложения (чтобы демонстрировать разные тексты и идентификаторы подписок при необходимости)
- _user_token — пользовательский токен при наличии такового (необязательно)
- random_string — случайная строчка, которая генерируется один раз за жизнь приложения
- locale — локаль пользователя (2 символа), чтобы получать ответ на указанном языке при наличии его поддержки (необязательно)
- screen — экран, с которого пользователь получает пейгейт, возможные варианты:
- null
- scenes
- meditations
- stories
- sounds
Дополнительные возвращаемые параметры:
- main — словарь данных об основном экране покупок:
- design — внешний вид экрана (см. ниже)
- greeting — строчка приветствия
- text — текст с данными о продукте
- options — массив словарей с данными о предложениях покупок, каждый элемент которого состоит из:
- product_id — идентификатор продукта в iTunesConnect
- title — заголовок предложения
- caption — надпись ниже заголовка
- div — делитель для плейсхолдера @price_div
- subcaption — строчка под надписью ниже заголовка
- save — плашка для промо-тэга
- bottom_line — нижняя строчка с ключевыми условиями предложения
- button — название кнопки для активации подписки
- subbutton — надпись под кнопкой (с замочком в начале строки)
- restore — название кнопки восстановление покупок
- special_offer — словарь данных об экране со спецпредложением (может отсутствовать):
- title — заголовок экрана
- subtitle — подзаголовок
- time_left — оставшееся время для спецпредложения в формате mm:ss
- text — текст с данными о продукте
- product_id — идентификатор продукта в iTunesConnect
- special_offer_multiplicator — коэффициент спецпредложения, на него нужно умножить цену подписки, чтобы получить «прошлую» цену подписки, от которой «предоставляется» скидка
- price_tag — строчка с ценником и условиями биллинга
- button — название кнопки для активации подписки
- subbutton — надпись под кнопкой (с замочком в начале строки)
- restore — название кнопки восстановление покупок
Расшифровка поля design для экрана main:
Пример ответа для нового пользователя:
{ "_code": 200, "_msg": "OK", "_need_payment": false, "_data": { "main": { "design": 1, "greeting": "Sleepy already?", "text": "Unlock all Scenes and Sounds · Guided Meditations · Stories for Sleep", "options": [ { "product_id": "com.li.sleepwell.lifetime9999", "title": "Lifetime", "caption": "@price_div/week", "div": 53, "subcaption": "in terms of 1 year", "save": "SAVE 75%", "bottom_line": "@price" }, { "product_id": "com.li.sleepwell.yearly5999", "title": "3 days free", "caption": "@price/year", "subcaption": null, "save": null, "bottom_line": "after 3 day trial" } ], "button": "CONTINUE", "subbutton": "Secured with iTunes. Cancel anytime.", "restore": "Restore" }, "special_offer": { "title": "-50%", "subtitle": "Limited offer for the new users", "time_left": "59:59", "text": "All of the content and weekly updates", "product_id": "com.li.sleepwell.specialmonthly1499", "special_offer_multiplicator": 2, "price_tag": "@price per month", "button": "Continue", "subbutton": "Secured with iTunes. Cancel anytime.", "restore": "Restore" } } }
/validate
Описание: для проверки доступного на клиенте чека, чтобы:
- бекенд различал пользователей — фактически это есть процедура логина в приложение
- бекенд «знал», можно ли пользователю предоставлять доступ к платным частям приложения или нет. Следует вызывать каждый раз при старте приложения (имитация "Restore purchase"), а также при активации новой подписки. После того, как чеки отправлены, следует попробовать повторить доступ к платным частям приложения.
Полный путь к методу: https://www.s1eep.app/api/payments/validate
Тип запроса: POST
Требования безопасности: нет
Дополнительные ожидаемые параметры:
- receipt — чек от AppStore (base64 encoded)
- _user_token — пользовательский токен в случае наличия оного (необязательно)
- version — номер билда (необязательно)
Дополнительные возвращаемые параметры:
- user_token — в случае валидного чека, в котором есть хотя бы одна активированная подписка, будет значение отличное от null
- active_subscription — индикатор наличия у пользователя доступа к платному контенту
- user_id — идентификатор пользователя (для выполнения метода SetUserID для идентификации пользователя в Amplitude)
Примеры ответа:
{ "_code": 200, "_msg": "OK", "_need_payment": false, "_data": { "user_token": "2y3fh2fgh29h302f23f20jd9298hfduigfsiud", "active_subscription": true, "user_id": 431 } }
{ "_code": 400, "_msg": "Receipt is not valid. Receipt result code 21002", "_need_payment": false, "_data": "{}" }