API: /payments

Korrekted
Korrekted
Last updated 

Общее

Этот раздел API посвящён запросу конфигурации пейгейта и валидации оплаты пользователем доступа в приложение
  • вызов /payments/flow — для определения текущего установленного payment flow
  • вызов /payments/ping — для уведомления бекенда о присутствии пользователя, который видел пейгейт, но не активировал подписку, в приложении
  • вызов /payments/paygate — позволяет получить всю необходимую конфигурацию пейгейта, включая идентификаторы продуктов и названия кнопок
  • вызов /payments/validate — URL для «скармливания» бекенду чеков (receipts) на валидацию, чтобы получить доступ в приложение


/flow

Описание: Для определения текущего установленного payment 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
Тип запроса: 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:
  1. design1.png 172 KB View full-size Download
  2. design2.png 324 KB View full-size Download
  3. design3.png 129 KB View full-size Download
  4. design4.png 168 KB View full-size Download
  5. design5.png 212 KB View full-size Download
Пример ответа для нового пользователя:
{
    "_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": "{}"
}