Перейти к содержимому

Основные положения

Вебхуки — это оповещения о происходящих в системе событиях. При наступлении определенного события Xsolla отправляет HTTP-запрос к вашему приложению, в котором передаются данные о событии. Чаще всего отправляется POST-запрос в JSON-формате.

Примеры событий:

  • взаимодействие пользователя с каталогом товаров;
  • оплата или отмена заказа.

Когда происходит настроенное событие, Xsolla через вебхук оповещает вашу систему об этом. В результате вы можете:

  • пополнить баланс пользователя;
  • выполнить возврат платежа;
  • начислить новые предметы пользователю или списать их;
  • начать предоставление подписки;
  • заблокировать пользователя в случае подозрения в мошенничестве.

Пример работы вебхука обработки платежей:

Вебхук обработки 
платежей

Примечание

В зависимости от используемого решения и типа интеграции набор вебхуков и последовательность взаимодействия могут отличаться от приведенного примера.

Видеоинструкция по интеграции вебхуков Xsolla:

Настройка вебхуков при работе с продуктами и решениями Xsolla:

Продукт/ РешениеОбязательно/ ОпциональноДля чего нужны вебхуки
PaymentsОбязательно
  • Валидация пользователей.
  • Получение информации о деталях транзакции в случаях успешного платежа или возврата платежа.
  • Начисление купленных товаров пользователю и списание товаров в случае отмены заказа.
МагазинОбязательно
  • Валидация пользователей.
  • Получение информации о деталях транзакции в случаях успешного платежа или возврата платежа.
  • Начисление купленных товаров пользователю и списание товаров в случае отмены заказа.
Game SalesОпциональноДля продажи ключей не требуется валидация пользователя и начисление ему товаров. Вы можете подключить вебхуки, если вы хотите получать информацию о событиях, например об оплате или отмене заказа.
Если вы подключите вебхуки, важно обрабатывать все поступающие обязательные вебхуки.
SubscriptionsОпциональноПолучение информации о создании, изменении или отмене подписки. Альтернативный вариант — запрос информации с помощью API.
Web ShopОбязательно
  • Валидация пользователей.
  • Получение информации о деталях транзакции в случаях успешного платежа или возврата платежа.
  • Начисление купленных товаров пользователю и списание товаров в случае отмены заказа.
  • Аутентификация пользователей, если вы используете аутентификацию через ID пользователя. Альтернативный вариант — использование аутентификации пользователей через Xsolla Login.
Digital Distribution HubОбязательно
  • Валидация пользователей.
  • Связывание ID транзакции со стороны Xsolla с ID транзакции в вашей системе.
  • Передача дополнительных параметров транзакции в заказе.
  • Начисление купленных товаров пользователю и списание их в случае отмены заказа.

Подробная информация по настройке вебхуков для Digital Distribution Hub приведена в инструкции.

LoginОпционально

Получение информации о наступлении события:

  • регистрация/ авторизация пользователей;
  • подтверждение пользователем email-адреса;
  • привязка аккаунта социальной сети пользователя.

Подробная информация о настройке вебхуков приведена в документации Login.

Список обязательных вебхуков

Если вы используете продукты и решения, для которых работа с вебхуками обязательна, подключите и протестируйте вебхуки в Личном кабинете и настройте их обработку. При наступлении определенных событий вебхуки отправляются последовательно. Поэтому, если вы не обработаете какой-то из вебхуков, последующие вебхуки не будут отправлены. Список необходимых вебхуков представлен ниже.

Store и Payments

На стороне Xsolla настроено 2 варианта отправки вебхуков при покупке и возврате товаров на сайте — информация с данными платежа и транзакции и информация о купленных товарах может приходить отдельно или может быть объединена в один вебхук.

Получение информации в объединенных вебхуках:

Если вы зарегистрировались в Личном кабинете после 22 января 2025 г., вы получаете всю информацию в вебхуках Успешная оплата заказа (order_paid) и Отмена заказа (order_canceled). В этом случае вам не требуется обрабатывать вебхуки Успешный платеж (payment) и Возврат платежа (refund).

Получение информации в отдельных вебхуках:

Если вы зарегистрировались в Личном кабинете до 22 января 2025 г. включительно, вы получаете вебхуки:

Вам необходимо обрабатывать все поступающие вебхуки. Для перехода к новому варианту с получением объединенных вебхуков обратитесь к персональному менеджеру проекта или напишите на csm@xsolla.com.

Для полноценной работы внутриигрового магазина и управления платежами, необходимо реализовать обработку основных вебхуков:

Если вы получаете объединенные вебхуки:

Название и тип вебхукаОписание
Проверка пользователей >Проверка существования пользователя (user_validation)Отправляется на разных этапах оплаты, чтобы удостовериться, что пользователь зарегистрирован в игре.
Игровые сервисы > Объединенные вебхуки >Успешная оплата заказа (order_paid)Данные платежа, детали транзакции и информация о купленных товарах. Используйте данные вебхука для начисления товаров пользователю.
Игровые сервисы > Объединенные вебхуки >Отмена заказа (order_canceled)Данные отмененного платежа, детали транзакции и информацию о купленных товарах. Используйте данные вебхука для списания купленных товаров у пользователя.

Если вы получаете отдельные вебхуки:

Название и тип вебхукаОписание
Проверка пользователей >Проверка существования пользователя (user_validation)Отправляется на разных этапах оплаты, чтобы удостовериться, что пользователь зарегистрирован в игре.
Платежи >Успешный платеж (payment)Данные платежа и детали транзакции.
Игровые сервисы > Отдельные вебхуки >Успешная оплата заказа (order_paid)Информация о купленных товарах. Используйте данные вебхука для начисления товаров пользователю.
Платежи >Возврат платежа (refund)Данные платежа и детали транзакции.
Игровые сервисы > Отдельные вебхуки >Отмена заказа (order_canceled)Информация о купленных товарах. Используйте данные вебхука для списания купленных товаров у пользователя.

Если вы используете персонализацию каталога товаров, реализованную на стороне вашего приложения, настройте обработку вебхука Персонализация каталога на стороне партнера.

Примечание

Чтобы принимать реальные платежи, достаточно подписать лицензионный договор и реализовать обработку вебхуков:

Subscriptions

Для автоматического управления планами подписок необходимо реализовать обработку основных вебхуков:

  • Проверка существования пользователя (user_validation) — отправляется на разных этапах оплаты, чтобы удостовериться, что пользователь зарегистрирован в игре.
  • Успешный платеж (payment) — отправляется, когда заказ оплачен, и содержит информацию о данных платежа и детали транзакции.
  • Создание подписки (create_subscription) — отправляется, когда был получен ответ об успешной обработке вебхука Успешный платеж или пользователь приобрел подписку с пробным периодом. Содержит детали купленной подписки и данные пользователя. Используйте данные вебхука для добавления подписки пользователю.
  • Изменение подписки (update_subscription) — отправляется при продлении или изменении подписки, когда был получен ответ об успешной обработке вебхука Успешный платеж. Содержит детали купленной подписки и данные пользователя. Используйте данные вебхука для продления подписки пользователю или изменения параметров подписки.
  • Возврат платежа (refund) — отправляется, когда заказ был отменен, и содержит информацию о данных отмененного платежа и детали транзакции.
  • Отмена подписки (cancel_subscription) — отправляется, если был получен ответ об успешной обработке вебхука Возврат платежа или подписка была отменена по другой причине. Содержит информацию о подписке и данные пользователя. Используйте данные вебхука для списания купленных подписок у пользователя.

Настройка вебхуков в Личном кабинете

Общие настройки

Чтобы включить получение вебхуков:

  1. В проекте в Личном кабинете перейдите в раздел Настройки проекта > Вебхуки.
  2. В поле Сервер для вебхуков укажите URL-адрес вашего сервера для получения вебхуков в формате https://example.com. Вы также можете ввести URL-адрес из инструмента для тестирования вебхуков.

Внимание

Для передачи данных используется протокол HTTPS, протокол HTTP не поддерживается.

  1. Создайте секретный ключ:
    1. В разделе Secret keys нажмите Add key.
    2. В открывшемся модальном окне введите название ключа, которое позволит идентифицировать его в общем списке.
    3. Нажмите Create key.
    4. Нажмите Copy secret и сохраните созданный ключ на вашей стороне.
    5. Нажмите Done.
    6. Подтвердите, что вы сохранили ключ, и нажмите Ok, close.

Добавить 
ключ

Внимание

Основные рекомендации:

  • Сохраните созданный секретный ключ на вашей стороне. Ключ отображается в Личном кабинете только один раз — сразу после создания.
  • Никому не сообщайте ваш секретный ключ.
  • Секретный ключ должен храниться на вашем сервере и никогда — в бинарных файлах или на фронтенде.

  1. Нажмите Получать вебхуки.

Примечание

Для тестирования вебхуков вы можете выбрать любой специализированный сайт, например webhook.site, или платформу, например ngrok.

Внимание

Вы не можете отправлять вебхуки на разные URL-адреса одновременно. Однако вы можете сначала указать в Личном кабинете URL-адрес для тестирования, а затем изменить его на боевой.

Чтобы отключить получение вебхуков:

  1. В проекте в Личном кабинете перейдите в раздел Настройки проекта > Вебхуки.
  2. Нажмите Отключить вебхуки.

Ротация секретных ключей

Регулярное обновление секретных ключей повышает безопасность вашей интеграции. В одном проекте вы можете создать до 5 секретных ключей, чтобы обеспечить их ротацию. Для этого:

  1. В разделе Настройки проекта > Вебхуки нажмите Add key.

Добавить 
ключ

  1. В открывшемся модальном окне введите название ключа, которое позволит идентифицировать его в общем списке.
  2. Нажмите Create key.
  3. Нажмите Copy secret и сохраните созданный ключ на вашей стороне.
  4. Нажмите Done.
  5. Подтвердите, что вы сохранили ключ, и нажмите Ok, close.

Внимание

Основные рекомендации:

  • Сохраните созданный секретный ключ на вашей стороне. Ключ отображается в Личном кабинете только один раз — сразу после создания.
  • Никому не сообщайте ваш секретный ключ.
  • Секретный ключ должен храниться на вашем сервере и никогда — в бинарных файлах или на фронтенде.

В проекте может быть только один активный секретный ключ. Если вы хотите его изменить, нажмите Set as active у другого ключа и подтвердите действие. После успешной миграции на новый ключ мы рекомендуем удалять деактивированные ключи.

Изменить активный 
ключ

Расширенные настройки

Для вебхуков раздела Payments and Store доступны расширенные настройки. Они автоматически отобразятся под блоком Общие настройки после того, как вы нажмете кнопку Получать вебхуки.

Примечание

Если расширенные настройки не отображаются, убедитесь, что получение вебхуков подключено в общих настройках и вы находитесь на вкладке Тестирование > Payments and Store.

В этом разделе вы можете настроить получение дополнительной информации в вебхуках. Для этого установите соответствующие переключатели в активное положение. В строке каждого разрешения указаны вебхуки, на которые повлияют изменение настроек.

ПереключательОписание
Показывать информацию о транзакциях сохраненными способами оплаты (отображается, если вы зарегистрировались в Личном кабинете до 22 января 2025 г. и получаете отдельные вебхуки).Информация о сохраненном способе оплаты передается в кастомном объекте payment_account.
Показывать информацию о транзакциях сохраненными способами оплаты.

В вебхуке будет передаваться информация в кастомных параметрах:

  • saved_payment_method:
    • 0 — сохраненный способ оплаты не используется;
    • 1 — способ оплаты был сохранен при совершении текущей транзакции;
    • 2 — используется ранее сохраненный способ оплаты.
  • payment_type:
    • 1 — единоразовый платеж;
    • 2 — рекуррентный платеж.
Добавить объект order в вебхук (отображается, если вы зарегистрировались в Личном кабинете до 22 января 2025 г. и получаете отдельные вебхуки).В вебхуке Успешный платеж будет передаваться информация о заказе в объекте order.
Показывать только необходимую информацию о пользователе без чувствительных данных.

В вебхуке о пользователе будет передаваться только следующая информация:

  • ID;
  • страна.
Передавать кастомные параметры.В вебхуке будет передаваться информация о кастомных параметрах из токена.
Показывать БИН карты и последние 4 цифры ее номера.

В вебхуке будет передаваться следующая информация о номере карты:

  • первые 6 цифр в параметре card_bin;
  • последние 4 цифры в параметре card_suffix.
Показывать бренд карты.Бренд карты, с которой была совершена оплата. Например, Mastercard или Visa.
Показывать информацию о причине возврата.Детальная информация о причине возврата.
Показать региональный налог у источника и стоимость каналов привлечения трафика.В вебхуке будут передаваться объекты payment_details.​country_wht и payment_details.​user_acquisition_fee. По умолчанию этот переключатель активирован.
Отправлять информацию о 3DS.В вебхуке будет передаваться объект cards с данными о прохождении пользователем проверки 3-D Secure.

Расширенные 
настройки

Тестирование вебхуков в Личном кабинете

Тестирование вебхуков помогает убедиться в корректной настройке проекта как на вашей стороне, так и на стороне Xsolla.

Если вебхуки настроены успешно, ниже блока настройки вебхуков отобразится блок тестирования вебхуков.

Раздел 
тестирования

Содержание блока зависит от варианта получения вебхуков.

Если вы зарегистрировались в Личном кабинете после 22 января 2025 г., вы получаете объединенные вебхуки:

Название вкладки для тестирования вебхуковНазвание и тип вебхука
Payments and StoreПроверка пользователей >Проверка существования пользователя (user_validation)
Игровые сервисы > Объединенные вебхуки >Успешная оплата заказа (order_paid)
Игровые сервисы > Объединенные вебхуки >Отмена заказа (order_canceled)
SubscriptionsПроверка пользователей >Проверка существования пользователя (user_validation)
Платежи >Успешный платеж (payment)

Если вы зарегистрировались в Личном кабинете до 22 января 2025 г., вы получаете отдельные вебхуки:

Название вкладки для тестирования вебхуковНазвание и тип вебхука
StoreИгровые сервисы > Отдельные вебхуки >Успешная оплата заказа (order_paid)
Игровые сервисы > Отдельные вебхуки >Отмена заказа (order_canceled)
PaymentsПроверка пользователей >Проверка существования пользователя (user_validation)
Платежи >Успешный платеж (payment)
SubscriptionsПроверка пользователей >Проверка существования пользователя (user_validation)
Платежи >Успешный платеж (payment)

Примечание

Если в блоке тестирования отобразилось предупреждение, что тест не пройден, проверьте настройки ответа на вебхук в вашем обработчике вебхуков. Причины ошибок в тестировании указаны в результатах тестирования.

Пример:

Для тестирования вы используете специализированный сайт webhook.site.

В разделе Тестирование ответа на неверную подпись отображается ошибка.

Это происходит, потому что Xsolla отправляет вебхук с неверной подписью и ожидает, что ваш обработчик ответит 4xx HTTP-кодом с указанием кода ошибки INVALID_SIGNATURE.

webhook.site отправляет 200 HTTP-код в ответ на все вебхуки, в том числе на вебхук с неверной подписью. Ожидаемый 4xx HTTP-код не может быть получен, поэтому в результате тестирования отображается ошибка.

Далее описан процесс тестирования для сценария с объединенными вебхуками.

Payments and Store

На вкладке Payments and Store вы можете протестировать работу следующих вебхуков:

Чтобы протестировать вебхуки:

  1. В блоке тестирования вебхуков перейдите на вкладку Payments and Store.
  2. В раскрывающемся списке выберите тип товара. Если выбранный тип товара еще не настроен в Личном кабинете, нажмите кнопку для перехода к настройке товара соответствующего типа. После создания товара вернитесь в раздел тестирования вебхуков и перейдите к следующему шагу.
  3. Заполните необходимые поля:
    • ID пользователя — при тестировании вы можете указать любую комбинацию букв и цифр.
    • Укажите произвольное значение в поле ID заказа Xsolla.
    • ID заявки в Xsolla — ID транзакции на стороне Xsolla. При тестировании вы можете указать любое числовое значение.
    • Invoice ID — ID транзакции на стороне вашей игры. При тестировании вы можете указать любую комбинацию букв и цифр. Для успешной оплаты это не обязательный параметр, но вы можете передать его, чтобы связать ID транзакции на вашей стороне с ID транзакции на стороне Xsolla.
    • Сумма — сумма платежа. При тестировании вы можете указать любое числовое значение.
    • Валюта — выберите валюту из раскрывающегося списка.
    • Выберите артикул товара из раскрывающегося списка и укажите его количество. Вы можете выбрать несколько товаров. Для этого нажмите + и добавьте товары в новой строке.
  4. Нажмите Проверить вебхуки.

На URL-адрес сервера вебхуков придут вебхуки Проверка существования пользователя, Успешная оплата заказа и Отмена заказа с указанными данными. Ниже кнопки Проверить вебхук отобразятся результаты тестирования каждого типа вебхука.

Если в вашем проекте в разделе Настройки проекта > Настройки интеграции установлен флажок Использовать public user ID, на URL-адрес сервера вебхуков также придет вебхук Поиск пользователя и в разделе тестирования отобразится результат его проверки.

Для каждого вебхука вам необходимо настроить обработку обоих сценариев: успешного и с ошибкой.

Раздел тестирования 
платежей

Subscriptions

Примечание

Для тестирования вебхуков у вас должен быть создан хотя бы один план подписки в Личном кабинете в разделе Каталог товаров > Подписки.

На вкладке Subscriptions вы можете протестировать работу следующих вебхуков при управлении подписками:

Примечание

Тестирование других сценариев управления подписками описано в руководстве по интеграции.

Чтобы протестировать вебхуки:

  1. В блоке тестирования вебхуков перейдите на вкладку Subscriptions.
  2. Заполните необходимые поля:
    • ID пользователя — при тестировании вы можете указать любую комбинацию букв и цифр.
    • ID заявки в Xsolla — ID транзакции на стороне Xsolla. При тестировании вы можете указать любое числовое значение.
    • Public user ID — ID, который известен пользователю, например, email или никнейм. Это поле отображается, если в вашем проекте в разделе Настройки проекта > Настройки интеграции установлен флажок Использовать public user ID.
    • Сумма — сумма платежа. При тестировании вы можете указать любое числовое значение.
    • Валюта — выберите валюту из раскрывающегося списка.
    • ID плана — план подписки. Выберите план из раскрывающегося списка.
    • Продукт подписки — выберите продукт из раскрывающегося списка (опционально). Список отображается, если в вашем проекте есть настроенные продукты.
    • Invoice ID — ID транзакции на стороне вашей игры. При тестировании вы можете указать любую комбинацию букв и цифр. Для успешной оплаты это не обязательный параметр, но вы можете передать его, чтобы связать ID транзакции на вашей стороне с ID транзакции на стороне Xsolla.
    • Пробный период. Для тестирования покупки подписки без пробного периода или тестирования продления подписки , укажите значение 0.
  3. Нажмите Протестировать.

На указанный URL-адрес придут вебхуки с введенными данными. Ниже кнопки Протестировать отобразятся результаты тестирования каждого вебхука как для успешного сценария, так и для случая возникновения ошибки.

Обработчик вебхуков

Обработчик вебхуков – это программный код, который позволяет принимать поступающие вебхуки на указанный URL-адрес, генерировать подпись и отправлять ответ на вебхук на сервер Xsolla.

Примечание

Вы можете использовать библиотеку Pay Station PHP SDK, которая содержит готовые классы для обработки вебхуков.

На стороне вашего приложения реализуйте прием вебхуков со следующих IP-адресов:

  • 185.30.20.0/24;
  • 185.30.21.0/24;
  • 185.30.22.0/24;
  • 185.30.23.0/24;
  • 34.102.38.178;
  • 34.94.43.207
  • 35.236.73.234;
  • 34.94.69.44;
  • 34.102.22.197.

Если у вас подключен продукт Login, дополнительно добавьте обработку вебхуков со следующих IP-адресов:

  • 34.94.0.85;
  • 34.94.14.95;
  • 34.94.25.33;
  • 34.94.115.185;
  • 34.94.154.26;
  • 34.94.173.132;
  • 34.102.48.30;
  • 35.235.99.248;
  • 35.236.32.131;
  • 35.236.35.100;
  • 35.236.117.164.

Ограничения:

  • В базе данных вашего приложения не должно быть нескольких успешных транзакций с одинаковым ID.
  • Если обработчик вебхуков получил вебхук с ID, который уже существует в базе, необходимо вернуть результат предыдущей обработки данной транзакции. Не рекомендуется зачислять пользователю повторную покупку и создавать дублирующие записи в базе данных.

Генерация подписи

Чтобы обеспечить безопасную передачу данных, вам необходимо убедиться, что вебхук действительно был отправлен с сервера Xsolla и не был изменен в процессе передачи. Для этого сгенерируйте собственную подпись на основе тела запроса и сравните ее с подписью, полученной в заголовке authorization этого же запроса. Если подписи совпадают, вебхук является подлинным и его можно обрабатывать.

Шаги верификации:

  1. Получите подпись из заголовка authorization входящего запроса вебхука. Формат заголовка: Signature <signature_value>.

  2. Получите тело запроса вебхука в формате JSON.

    Внимание

    Используйте JSON в полученном виде. Не парсите и не перекодируйте данные, так как это изменит форматирование и приведет к ошибке проверки подписи.

  3. Сгенерируйте собственную подпись для сравнения:

    1. Конкатенируйте JSON из тела запроса и секретный ключ проекта, т. е. объедините две строки, добавив секретный ключ проекта в конец строки.
    2. Примените к полученной строке криптографическую хэш-функцию SHA-1. В результате вы получите шестнадцатеричную строку в нижнем регистре.

  4. Сравните полученную строку с подписью из заголовка authorization. Если подписи совпадают, вебхук является подлинным.

Ниже вы можете найти примеры реализации генерации подписи для следующих языков: C#, C++, Go, PHP и Node.js.

Пример вебхука (HTTP):

POST /your_uri HTTP/1.1
host: your.host
accept: application/json
content-type: application/json
content-length: 165
authorization: Signature 52eac2713985e212351610d008e7e14fae46f902
{
  "notification_type":"user_validation",
  "user":{
      "ip":"127.0.0.1",
      "phone":"18777976552",
      "email":"email@example.com",
      "id":1234567,
      "name":"Xsolla User",
      "country":"US"
  }
}

Пример вебхука (curl):

curl -v 'https://your.hostname/your/uri' \
-X POST \
-H 'authorization: Signature 52eac2713985e212351610d008e7e14fae46f902' \
-d '{
  "notification_type":
    "user_validation",
    "user":
      {
        "ip": "127.0.0.1",
        "phone": "18777976552",
        "email": "email@example.com",
        "id": 1234567,
        "name": "Xsolla User",
        "country": "US"
      }
    }'

Пример реализации генерации подписи для C# (универсальный пример):

Примечание

Этот пример кода совместим с .NET Framework 4.0 и выше, а также с .NET Core и другими современными версиями .NET. Для проверки подписи реализовано сравнение с постоянным временем выполнения с помощью метода ConstantTimeEquals, что помогает предотвратить атаки по времени.

using System;
using System.Security.Cryptography;
using System.Text;
public static class XsollaWebhookSignature
{
    public static string ComputeSha1(string jsonBody, string secretKey)
    {
        // Concatenation of the JSON from the request body and the project's secret key
        string dataToSign = jsonBody + secretKey;
        using (SHA1 sha1 = SHA1.Create())
        {
            byte[] hashBytes = sha1.ComputeHash(Encoding.UTF8.GetBytes(dataToSign));
            // Convert hash bytes to lowercase hexadecimal string
            var hexString = new StringBuilder(hashBytes.Length * 2);
            foreach (byte b in hashBytes)
            {
                hexString.Append(b.ToString("x2"));
            }
            return hexString.ToString();
        }
    }
    public static bool VerifySignature(string jsonBody, string secretKey, string receivedSignature)
    {
        string computedSignature = ComputeSha1(jsonBody, secretKey);
        string receivedSignatureLower = receivedSignature.ToLower();
        // Use constant-time comparison to prevent timing attacks
        return ConstantTimeEquals(computedSignature, receivedSignatureLower);
    }
    private static bool ConstantTimeEquals(string a, string b)
    {
        if (a.Length != b.Length)
        {
            return false;
        }
        int result = 0;
        for (int i = 0; i < a.Length; i++)
        {
            result |= a[i] ^ b[i];
        }
        return result == 0;
    }
}

Пример реализации генерации подписи для C# (.NET 5.0 и выше):

Примечание

Чтобы использовать метод Convert.ToHexString, вам необходима версия .NET 5.0 или выше.

Если у вас версия .NET 7.0 или выше, вы также можете использовать метод CryptographicOperations.FixedTimeEquals вместо ConstantTimeEquals.

// For .NET 5.0 and later, you can use the more concise Convert.ToHexString method:
using System;
using System.Security.Cryptography;
using System.Text;
public static class XsollaWebhookSignature
{
    public static string ComputeSha1(string jsonBody, string secretKey)
    {
        string dataToSign = jsonBody + secretKey;
        using var sha1 = SHA1.Create();
        byte[] hashBytes = sha1.ComputeHash(Encoding.UTF8.GetBytes(dataToSign));
        return Convert.ToHexString(hashBytes).ToLower();
    }
    public static bool VerifySignature(string jsonBody, string secretKey, string receivedSignature)
    {
        string computedSignature = ComputeSha1(jsonBody, secretKey);
        string receivedSignatureLower = receivedSignature.ToLower();
        // Use constant-time comparison to prevent timing attacks
        return ConstantTimeEquals(computedSignature, receivedSignatureLower);
    }
    private static bool ConstantTimeEquals(string a, string b)
    {
        if (a.Length != b.Length)
        {
            return false;
        }
        int result = 0;
        for (int i = 0; i < a.Length; i++)
        {
            result |= a[i] ^ b[i];
        }
        return result == 0;
    }
}

Пример реализации генерации подписи для C# (.NET 7.0 и выше):

Примечание

Если у вас версия .NET 7.0 или выше, вы можете использовать метод CryptographicOperations.FixedTimeEquals.

// For .NET 7.0+, you can use the built-in CryptographicOperations.FixedTimeEquals:
using System.Security.Cryptography;
public static bool VerifySignature(string jsonBody, string secretKey, string receivedSignature)
{
    string computedSignature = ComputeSha1(jsonBody, secretKey);
    byte[] computedBytes = Encoding.UTF8.GetBytes(computedSignature);
    byte[] receivedBytes = Encoding.UTF8.GetBytes(receivedSignature.ToLower());
    return CryptographicOperations.FixedTimeEquals(computedBytes, receivedBytes);
}

Пример реализации генерации подписи для C++:

#include <string>
#include <sstream>
#include <iomanip>
#include <openssl/sha.h>
class XsollaWebhookSignature {
public:
    static std::string computeSha1(const std::string& jsonBody, const std::string& secretKey) {
        // Concatenation of the JSON from the request body and the project's secret key
        std::string dataToSign = jsonBody + secretKey;
        unsigned char digest[SHA_DIGEST_LENGTH];
        // Create SHA1 hash
        SHA1(reinterpret_cast<const unsigned char*>(dataToSign.c_str()),
             dataToSign.length(), digest);
        // Convert to lowercase hexadecimal string
        std::ostringstream hexStream;
        hexStream << std::hex << std::setfill('0');
        for (int i = 0; i < SHA_DIGEST_LENGTH; ++i) {
            hexStream << std::setw(2) << static_cast<unsigned int>(digest[i]);
        }
        return hexStream.str();
    }
    static bool verifySignature(const std::string& jsonBody, const std::string& secretKey, const std::string& receivedSignature) {
        std::string computedSignature = computeSha1(jsonBody, secretKey);
        // Timing-safe comparison
        if (computedSignature.length() != receivedSignature.length()) {
            return false;
        }
        volatile unsigned char result = 0;
        for (size_t i = 0; i < computedSignature.length(); ++i) {
            result |= (computedSignature[i] ^ receivedSignature[i]);
        }
        return result == 0;
    }
};

Пример реализации генерации подписи для Go:

package main
import (
	"crypto/sha1"
    "crypto/subtle"
	"encoding/hex"
	"strings"
)
type XsollaWebhookSignature struct{}
func (x *XsollaWebhookSignature) ComputeSha1(jsonBody, secretKey string) string {
	// Concatenation of the JSON from the request body and the project's secret key
	dataToSign := jsonBody + secretKey
	// Create SHA1 hash
	h := sha1.New()
	h.Write([]byte(dataToSign))
	signature := h.Sum(nil)
	// Convert to lowercase hexadecimal string
	return strings.ToLower(hex.EncodeToString(signature))
}
func (x *XsollaWebhookSignature) VerifySignature(jsonBody, secretKey, receivedSignature string) bool {
	computedSignature := x.ComputeSha1(jsonBody, secretKey)
	receivedSignatureLower := strings.ToLower(receivedSignature)
	// Use constant time comparison to prevent timing attacks
	return subtle.ConstantTimeCompare([]byte(computedSignature), []byte(receivedSignatureLower)) == 1
}

Пример реализации генерации подписи для PHP:

<?php
class XsollaWebhookSignature
{
    /**
     * Compute SHA1 signature from webhook JSON body and secret key
     *
     * @param string $jsonBody The raw JSON body from webhook
     * @param string $secretKey The project's secret key
     * @return string The lowercase SHA1 signature
     */
    public static function computeSha1(string $jsonBody, string $secretKey): string
    {
        // Concatenation of the JSON from the request body and the project's secret key
        $dataToSign = $jsonBody . $secretKey;
        // Generate SHA1 signature
        $signature = sha1($dataToSign);
        return strtolower($signature);
    }
    /**
     * Verify webhook signature using timing-safe comparison
     *
     * @param string $jsonBody The raw JSON body from webhook
     * @param string $secretKey The project's secret key  
     * @param string $receivedSignature The signature from authorization header
     * @return bool True if signature is valid, false otherwise
     */
    public static function verifySignature(string $jsonBody, string $secretKey, string $receivedSignature): bool
    {
        $computedSignature = self::computeSha1($jsonBody, $secretKey);
        // Use hash_equals for timing-safe comparison
        return hash_equals($computedSignature, strtolower($receivedSignature));
    }
}
?>

Пример реализации генерации подписи для Node.js:

const crypto = require('crypto');
class XsollaWebhookSignature {
    // IMPORTANT: jsonBody must be the raw JSON string exactly as received from Xsolla
    static computeSha1(jsonBody, secretKey) {
        // Concatenation of the JSON from the request body and the project's secret key
        const dataToSign = jsonBody + secretKey;
        // Create SHA1 hash
        const hash = crypto.createHash('sha1');
        hash.update(dataToSign, 'utf8');
        // Convert to lowercase hexadecimal string
        return hash.digest('hex').toLowerCase();
    }
    static verifySignature(jsonBody, secretKey, receivedSignature) {
        const computedSignature = this.computeSha1(jsonBody, secretKey);
        const cleanReceivedSignature = receivedSignature.toLowerCase();
        // Check if signatures have the same length before using timingSafeEqual
        if (computedSignature.length !== cleanReceivedSignature.length) {
            return false;
        }
        try {
            return crypto.timingSafeEqual(
                Buffer.from(computedSignature, 'hex'),
                Buffer.from(cleanReceivedSignature, 'hex')
            );
        } catch (error) {
            // Return false if there's any error (e.g., invalid hex characters)
            return false;
        }
    }
}

Отправка ответов на вебхук

Чтобы подтвердить получение вебхука, ваш сервер должен вернуть:

  • 200, 201, или 204 HTTP-код в случае успешного ответа.
  • 400 HTTP-код с описанием проблемы, если указанный пользователь не был найден или если передана недействительная подпись. Ваш обработчик вебхуков также может возвращать 5xx HTTP-код при временных проблемах на вашем сервере.

Если на вебхуки Успешная оплата заказа и Отмена заказа сервер Xsolla не получил ответ или получил ответ с кодом 5xx, осуществляется повторная отправка вебхуков по следующему расписанию:

  • 2 попытки с интервалом 5 минут;
  • 7 попыток с интервалом 15 минут;
  • 10 попыток с интервалом 60 минут.

Максимально осуществляется 20 попыток отправки вебхуков в течение 12 часов с момента первой попытки.

Логика повторной отправки вебхуков Успешный платеж и Возврат платежа описана на странице соответствующего вебхука.

Внимание

При одновременном выполнении следующих условий платеж все равно будет возвращен пользователю:

  • Инициатор возврата — Xsolla.
  • На вебхук получен ответ с кодом 4xx, или после всех повторных попыток ответ не был получен, или был получен код 5xx.

Если на вебхук Проверка существования пользователя сервер Xsolla не получил ответ или получил ответ с 400 или 5xx HTTP-кодом, повторная отправка вебхука Проверка существования пользователя не осуществляется. Пользователь увидит ошибку, вебхуки Успешный платеж и Успешная оплата заказа отправлены не будут.

Ошибки

Коды ошибок для HTTP-кода 400:

КодОписание
INVALID_USERНеверный пользователь
INVALID_PARAMETERНеверный параметр
INVALID_SIGNATUREПодпись неверна
INCORRECT_AMOUNTНекорректная сумма
INCORRECT_INVOICEНеверный заказ
HTTP/1.1 400 Bad Request
{
    "error":{
        "code":"INVALID_USER",
        "message":"Invalid user"
    }
}

Лучшие практики

Безопасность

Соблюдайте следующие рекомендации:

  • Используйте только протокол HTTPS с действительным сертификатом.
  • При проверке подписи всегда используйте тело запроса в полученном виде — не парсите и не перекодируйте данные.
  • Не передавайте чувствительные данные в URL-адресах и не раскрывайте технические детали в сообщениях об ошибках.
  • Отключите проверку CSRF для URL-адреса вебхука — входящие запросы от Xsolla не содержат токен CSRF и будут отклонены без этой настройки.
  • Добавьте IP-адреса Xsolla в белый список.

Архитектура обработчика вебхуков

Соблюдайте следующие рекомендации:

  1. Принимайте POST-запрос с телом запроса и заголовками, не изменяя их.
  2. Сгенерируйте подпись для проверки подлинности вебхука и верните в ответе соответствующий статус:
    • 4xx — при несовпадении подписей.
    • 2xx — в случае успешного ответа. Мы рекомендуем вернуть 204 No Content до выполнения основной бизнес-логики. 200 OK также допустим.
  3. Передайте тело ответа (payload) в асинхронную задачу или очередь для дальнейшей обработки.
  4. Обеспечьте идемпотентность. Ваша система должна быть готова к повторному получению вебхуков.

Пример сценария:

HTTP POST /webhooks/xsolla
  read raw_body, headers
  if !verify_signature(raw_body, headers['authorization']):
     return 400 {"error":{"code":"INVALID_SIGNATURE","message":"Invalid signature"}}
  enqueue(raw_body)
  return 204  # or 200

Идемпотентность и дубликаты

Соблюдайте следующие рекомендации:

  • Используйте ID транзакции и/или внешний ID, ID заказа в качестве ключей идемпотентности.
  • Сохраняйте обработанные ID и возвращайте прежний результат при получении дубликата.
  • Исключите повторное начисление товаров, двойное списание средств и дублирование записей в базе данных.
  • Обратите внимание, что при последовательной доставке сбой на более раннем событии блокирует обработку последующих.

Стабильность системы

Соблюдайте следующие рекомендации:

  • Для выполнения ресурсозатратных задач (таких как обращение к внешним сервисам, биллинг или начисление товаров) используйте очереди и асинхронный подход.
  • Установите интервалы для обработчика вебхука (1–3 с). При временных сбоях полагайтесь на механизм повторной отправки Xsolla.
  • Не используйте обработчик для повторной отправки вебхуков — это выполняется на стороне Xsolla.
  • Логируйте время отправки вебхуков и статусы их обработки, настройте оповещения при резком росте ошибок 5xx и повторных попыток.
  • Передавайте ID корреляции из вебхука в логи и систему мониторинга (APM).
  • Настройте логирование и мониторинг ошибок. В случае неустранимых ошибок перемещайте задачи в очередь недоставленных сообщений (dead-letter queue, DLQ). Реализуйте инструмент безопасного воспроизведения событий, защищенный механизмом идемпотентности.

Примеры реализации

Успешная покупка — начисление выполнено один раз:

Покупка

Повторная отправка (таймаут на стороне партнера):

Таймаут

Возврат платежа:

Возврат

Недоступность сервера партнера:

Недоступность 
сервера

Частые вопросы

Необходимо ли для вебхуков использовать HTTPS?

Да.

Могу ли я получать платежные вебхуки на несколько URL-адресов?

Нет. Платежные вебхуки работают по протоколу Server-to-Server и отправляются на один URL-адрес, указанный в настройках проекта. Если вы хотите получать оповещения в вашей игре, на сайте или мобильном приложении, реализуйте отправку вебхуков на собственном сервере, чтобы пересылать данные между Xsolla и игрой. Вы также можете протестировать работу вебхуков из консоли разработчика.

Примечание

Если вы тестируете интеграцию локально, `POST`-запросы от Xsolla не доходят до URL-адресов вида http://localhost:3000/my-webhook-endpoint. Используется такие сервисы как ngrok, которые позволяют создать туннель для внешнего доступа, благодаря чему вы сможете локально получать запросы от Xsolla. Подробнее вы можете прочитать, например, в документации ngrok.

Почему оповещение от Xsolla не пришло на URL-адрес вебхука?

Убедитесь, что ваш вебхук-сервер поддерживает POST и GET HTTP-запросы.

Как предотвратить дубликаты ID транзакций при обработке?

Используйте внешний ID — это ID транзакции в игре, который присваивается заказу в вашей системе. На стороне Xsolla внешний ID связан с ID транзакции, поэтому наличие внешнего ID позволяет Xsolla предотвращать повторную оплату одной и той же транзакции. Подробная информация о настройке приведена в документации.

Какие есть лучшие практики работы с вебхуками?

Мы рекомендуем:

  • Возвращать код 204 или 200 сразу после проверки подписи.
  • Проверять подпись вебхука, не изменяя тело запроса.
  • Обеспечить идемпотентность всех операций.
  • Логировать все операции и настроить мониторинг ошибок.
  • Не передавать чувствительные данные в URL-адресах и не раскрывать технические детали в сообщениях об ошибках.

Подробная информация приведена в разделе с лучшими практиками.

Краткий чеклист интеграции вебхуков

Для корректной работы вебхуков убедитесь, что перед запуском проекта выполнены следующие пункты:

  • Используется протокол HTTPS.
  • Реализована проверка подписи вебхука без изменения тела запроса.
  • Ответ 204/200 отправляется, как только подтверждена подпись.
  • Обеспечена идемпотентность всех операций.
  • Настроены логирование ошибок и их мониторинг.
  • Чувствительные данные не передаются в URL-адресах, и технические детали не раскрываются в сообщениях об ошибках.
  • Поддерживаются повторные попытки отправки вебхуков с учетом логики работы Xsolla.
  • Вся интеграция задокументирована.

Список вебхуков

Примечание

Тип оповещения передается в параметре notification_type.

ВебхукТип оповещенияОписание
Проверка существования пользователяuser_validationПроверка существования пользователя в игре.
Поиск пользователяuser_searchПолучение информации о пользователе по публичному ID пользователя.
Успешный платежpaymentОповещение об успешном платеже.
Возврат платежаrefundОповещение об отмене платежа.
Частичный возврат платежаpartial_refundОповещение о частичном возврате платежа.
Отмена платежаps_declinedОповещение об отмене транзакции платежной системой.
Транзакция отклонена при проверке AFSafs_rejectОповещение об отмене транзакции системой расширенного антифрода.
Обновление черного списка AFSafs_black_listОповещение об изменении черного списка AFS.
Создание подпискиcreate_subscriptionОповещение о создании подписки.
Изменение подпискиupdate_subscriptionОповещение о продлении подписки или о смене каких-либо параметров внутри подписки.
Отмена подпискиcancel_subscriptionОповещение об отмене подписки.
Непродлеваемая подпискаnon_renewal_subscriptionОповещение о смене статуса на непродлеваемый.
Добавление платежного аккаунтаpayment_account_addОповещение о добавлении или сохранении платежного аккаунта.
Удаление платежного аккаунтаpayment_account_removeОповещение об удалении платежного аккаунта.
Проверка пользователя в Web Shop-Отправлено из Web Shop для проверки существования пользователя в игре.
Персонализация каталога на стороне партнераpartner_side_catalogОтправляется, когда пользователь взаимодействует с магазином.
Успешная оплата заказаorder_paidОтправляется, когда заказ оплачен.
Отмена заказаorder_canceledОтправляется, когда заказ отменен.
ДиспутdisputeОповещение об открытии нового диспута.
Скачать описание OpenAPI
Языки
Серверы
https://api.xsolla.com/merchant/v2/
Mock server
https://xsolla.redocly.app/_mock/ru/webhooks/

Проверка пользователей

Вебхуки
Вебхуки

Частичный возврат платежаВебхук

Запрос

При частичном возврате платежа Xsolla отправляет детали отмененной транзакции в вебхуке с типом partial_refund на URL-адрес вебхука. Подробная информация о процессе частичного возврата платежа приведена в инструкции.

После сохранения URL-адреса вебхука в Личном кабинете вы можете настроить получение дополнительной информации в вебхуке. Для этого в разделе Настройки проекта > Вебхуки > Расширенные настройки установите следующий переключатель в активное положение.

Примечание

Если вы зарегистрировались в Личном кабинете до 22 января 2025 г. (включительно), переключатели располагаются в разделе Настройки проекта > Вебхуки > Тестирование > Payments > Расширенные настройки.

ПереключательОписание
Показывать информацию о транзакциях сохраненными способами оплаты

В вебхуке будет передаваться информация в кастомных параметрах:

  • saved_payment_method:
    • 0 — сохраненный способ оплаты не используется;
    • 1 — способ оплаты был сохранен при совершении текущей транзакции;
    • 2 — используется ранее сохраненный способ оплаты.
  • payment_type:
    • 1 — единоразовый платеж;
    • 2 — рекуррентный платеж.

Коды отмены:

КодПричина отменыОписание
1Cancellation by the user request / the game requestИспользуется, если отмена произошла из Личного кабинета.
3Integration errorИспользуется в случае проблем с интеграцией между Xsolla и игрой.
В этом случае мы не рекомендуем заносить пользователя в черный список.
5Test paymentИспользуется в случае совершения тестового платежа с последующей отменой.
В этом случае мы не рекомендуем заносить пользователя в черный список.
7Fraud notification from PSИспользуется, если платежная система не произвела выплату по транзакции из-за потенциального фрода.
В этом случае мы рекомендуем добавить пользователя в черный список.
9Cancellation by the user requestИспользуется, если игра или заказ не удовлетворяют требованиям пользователя по каким-либо причинам.
В этом случае мы не рекомендуем заносить пользователя в черный список.
10Cancellation by the game requestИспользуется, когда игра просит отменить транзакцию.
В этом случае мы не рекомендуем заносить пользователя в черный список.
Телоapplication/json
custom_parametersobject

Ваши дополнительные параметры.

notification_typestring(notification_type)обязательный

Тип оповещения.

payment_detailsobjectобязательный

Объект с финансовыми данными платежа.

payment_details.​direct_whtobject

Налог, удерживаемый у источника выплаты.

payment_details.​direct_wht.​amountnumber(float)

Сумма.

payment_details.​direct_wht.​currencystring(currency)

Валюта. Используется трехбуквенное обозначение валюты согласно стандарту ISO 4217.

payment_details.​direct_wht.​percentnumber(float)

Процент налога, удерживаемого у источника выплаты.

payment_details.​paymentobject

Объект с данными о сумме, которую оплатил пользователь.

payment_details.​payment.​amountnumber(float)

Сумма.

payment_details.​payment.​currencystring(currency)

Валюта. Используется трехбуквенное обозначение валюты согласно стандарту ISO 4217.

payment_details.​payment_method_feeobject

Размер комиссии платежной системы.

payment_details.​payment_method_fee.​amountnumber(float)

Сумма.

payment_details.​payment_method_fee.​currencystring(currency)

Валюта. Используется трехбуквенное обозначение валюты согласно стандарту ISO 4217.

payment_details.​payment_method_sumobject

Объект с данными о сумме, которая была оплачена из платежной системы.

payment_details.​payment_method_sum.​amountnumber(float)

Сумма.

payment_details.​payment_method_sum.​currencystring(currency)

Валюта. Используется трехбуквенное обозначение валюты согласно стандарту ISO 4217.

payment_details.​payoutobject

Объект с данными о сумме выплаты.

payment_details.​payout.​amountnumber(float)

Сумма.

payment_details.​payout.​currencystring(currency)

Валюта. Используется трехбуквенное обозначение валюты согласно стандарту ISO 4217.

payment_details.​payout_currency_ratestring

Курс валюты платежа к валюте выплаты.

payment_details.​repatriation_commissionobject

Объект с информацией о затратах на репатриацию, возлагаемых на Xsolla третьими сторонами.

payment_details.​repatriation_commission.​amountnumber(float)

Сумма.

payment_details.​repatriation_commission.​currencystring(currency)

Валюта. Используется трехбуквенное обозначение валюты согласно стандарту ISO 4217.

payment_details.​sales_taxobject

Размер налога (только для США и Канады).

payment_details.​sales_tax.​amountnumber(float)

Сумма.

payment_details.​sales_tax.​currencystring(currency)

Валюта. Используется трехбуквенное обозначение валюты согласно стандарту ISO 4217.

payment_details.​sales_tax.​percentnumber(float)

Процент налога.

payment_details.​vatobject

Размер VAT (только для Евросоюза).

payment_details.​vat.​amountnumber(float)

Сумма.

payment_details.​vat.​currencystring(currency)

Валюта. Используется трехбуквенное обозначение валюты согласно стандарту ISO 4217.

payment_details.​vat.​percentnumber(float)

Процент VAT.

payment_details.​xsolla_balance_sumobject

Объект с данными о сумме, которая была оплачена с Xsolla-баланса.

payment_details.​xsolla_balance_sum.​amountnumber(float)

Сумма.

payment_details.​xsolla_balance_sum.​currencystring(currency)

Валюта. Используется трехбуквенное обозначение валюты согласно стандарту ISO 4217.

payment_details.​xsolla_feeobject

Размер комиссии Xsolla.

payment_details.​xsolla_fee.​amountnumber(float)

Сумма.

payment_details.​xsolla_fee.​currencystring(currency)

Валюта. Используется трехбуквенное обозначение валюты согласно стандарту ISO 4217.

purchaseobject

Объект с информацией о заказе.

purchase.​checkoutobject

Объект с информацией о заказе.

purchase.​checkout.​amountnumber(float)

Сумма заказа.

purchase.​checkout.​currencystring(currency)

Валюта. Используется трехбуквенное обозначение валюты согласно стандарту ISO 4217.

purchase.​totalobjectобязательный

Объект с данными об общей стоимости покупки.

purchase.​total.​amountnumber(float)

Сумма частичного возврата платежа.

purchase.​total.​currencystring(currency)

Валюта. Используется трехбуквенное обозначение валюты согласно стандарту ISO 4217.

refund_detailsobject

Объект с финансовыми данными рефанда.

refund_details.​authorstring

Инициатор возврата платежа. Значение поля передается согласно таблице:

Инициатор возвратаЗначение поля
Игра (через API).API
Пользователь Личного кабинета (автоматический возврат).Email-адрес пользователя
Пользователь Личного кабинета (при участии службы поддержки Xsolla).support@xsolla.com
Xsolla (при участии службы поддержки Xsolla).support@xsolla.com
refund_details.​codeinteger

ID кода.

refund_details.​datestring

Дата возврата платежа.

refund_details.​reasonstring

Причина отмены.

settingsobject

Объект, содержащий настройки проекта.

settings.​merchant_idinteger(settings.merchant_id)

ID продавца.

settings.​project_idinteger(settings.project_id)

ID проекта. Вы можете найти этот параметр в Личном кабинете рядом с названием проекта.

transactionobjectобязательный

Объект с информацией о транзакции, связанной с этой операцией.

transaction.​agreementinteger

ID соглашения.

transaction.​datestring

Дата транзакции.

transaction.​dry_runinteger

Признак тестовой транзакции. Значение параметра равно 1 для тестового платежа, для реального платежа параметр не передается.

transaction.​external_idstring

Внешний ID транзакции.

transaction.​idinteger(int64)

ID транзакции.

userobject

Объект с информацией о пользователе.

user.​countrystring(user.country)

Страна пользователя. Используется двухбуквенное обозначение страны согласно стандарту ISO 3166-1 alpha-2.

user.​emailstring(user.email)

Email пользователя.

user.​idstring(user.id)обязательный

ID пользователя.

user.​ipstring(user.ip)

IP адрес пользователя.

user.​namestring(user.name)

Имя пользователя.

user.​phonestring(user.phone)

Номер телефона пользователя (в международном формате).

user.​zipstring(user.zip)

Почтовый индекс.

curl -v 'https://your.hostname/your/uri' \
-X POST \
-d '{
        "notification_type": "partial_refund",
        "settings": {
          "project_id": 18404,
          "merchant_id": 2340
        },
        "purchase": {
            "checkout": {
                "currency": "USD",
                "amount": 50
            },
            "total":{
                "currency": "USD",
                "amount": 200
            }
        },
        "user": {
            "ip": "127.0.0.1",
            "phone": "18777976552",
            "email": "email@example.com",
            "id": "1234567",
            "name": "John Smith",
            "country": "US"
        },
        "transaction": {
            "id": 1,
            "external_id": 1,
            "dry_run": 1,
            "agreement": 1,
            "date": "2022-03-01 10:53:15"
        },
        "refund_details": {
            "author": "email@example.com",
            "date": "2022-03-01 10:56:48"
        },
        "payment_details": {
            "sales_tax": {
                "currency": "USD",
                "amount": 0
            },
            "direct_wht": {
                "currency": "USD",
                "amount": 0.70
            },
            "xsolla_fee": {
                "currency": "USD",
                "amount": "10"
            },
            "payout": {
                "currency": "USD",
                "amount": "200"
            },
            "payment_method_fee": {
                "currency": "USD",
                "amount": "20"
            },
            "payment": {
                "currency": "USD",
                "amount": "230"
            },
            "repatriation_commission": {
                "currency": "USD",
                "amount": 10
            }
        }
    }
}'

Ответы

Верните, чтобы сообщить об успешной обработке вехбука.

Ответ
Нет содержимого

Успешный платежВебхук

Запрос

Когда пользователь успешно совершает оплату, Xsolla отправляет детали платежа в вебхуке с типом payment на URL-адрес вебхука.

Ожидаемые коды ответов описаны в разделе Responses, но вы можете использовать и другие коды:

Код ответаОписание
200, 201, 204Успешный ответ.
4xxВозникновение ошибки. Например, если указанный пользователь не был найден или если передана недействительная подпись.
5xxВременная ошибка на сервере. При получении этого ответа Xsolla отправляет вебхук повторно с увеличенным интервалом, пока ваш обработчик не подтвердит их получение. Максимальное количество попыток — 12 в течение 48 часов.

После сохранения URL-адреса вебхука в Личном кабинете вы можете настроить получение дополнительной информации в вебхуке.

Примечание

Если вы зарегистрировались в Личном кабинете до 22 января 2025 года (включительно), вы можете найти переключатели в проекте в разделе Настройки > Вебхуки > Тестирование > Payments > Расширенные настройки.

ПереключательОписание
Показывать информацию о сохраненном платежном аккаунтеИнформация о сохраненном способе оплаты передается в кастомном объекте payment_account.
Показывать информацию о транзакциях сохраненными способами оплаты

В вебхуке будет передаваться информация в кастомных параметрах:

  • saved_payment_method:
    • 0 — сохраненный способ оплаты не используется;
    • 1 — способ оплаты был сохранен при совершении текущей транзакции;
    • 2 — используется ранее сохраненный способ оплаты.
  • payment_type:
    • 1 — единоразовый платеж;
    • 2 — рекуррентный платеж.
Добавить объект order в вебхукВ вебхуке Успешный платеж будет передаваться информация о заказе в объекте order.
Показывать только необходимую информацию о пользователе без чувствительных данных

В вебхуке о пользователе будет передаваться только следующая информация:

  • ID;
  • страна.
Показывать БИН карты и последние 4 цифры ее номера

В вебхуке будет передаваться следующая информация о номере карты:

  • первые 6 цифр в параметре card_bin;
  • последние 4 цифры в параметре card_suffix.
Показывать бренд картыБренд карты, с которой была совершена оплата. Например, Mastercard или Visa.
Показать региональный налог у источника и стоимость каналов привлечения трафика.В вебхуке будут передаваться объекты payment_details.​country_wht и payment_details.​user_acquisition_fee. По умолчанию этот переключатель активирован.
Отправлять информацию о 3DS.В вебхуке будет передаваться объект cards с данными о прохождении пользователем проверки 3-D Secure.

Внимание

Набор полей, отправляемых в вебхуке, зависит:

  • от расширенных настроек, которые вы установили в Личном кабинете;
  • кастомных настроек, которые были заданы на стороне Xsolla.

При возникновении вопросов обратитесь к персональному менеджеру проекта или напишите на csm@xsolla.com.

Телоapplication/json
custom_parametersobject

Ваши дополнительные параметры.

notification_typestring(notification_type)обязательный

Тип оповещения.

payment_detailsobjectобязательный

Объект с финансовыми данными платежа.

payment_details.​country_whtobject(country_whc)

Объект с данными о дополнительных издержках при международных транзакциях в некоторых странах.

payment_details.​country_wht.​amountnumber(float)

Сумма.

payment_details.​country_wht.​currencystring(currency)

Валюта. Используется трехбуквенное обозначение валюты согласно стандарту ISO 4217.

payment_details.​country_wht.​percentnumber(float)

Размер дополнительных издержек, в процентах.

payment_details.​direct_whtobject

Налог, удерживаемый у источника выплаты.

payment_details.​direct_wht.​amountnumber(float)

Сумма.

payment_details.​direct_wht.​currencystring(currency)

Валюта. Используется трехбуквенное обозначение валюты согласно стандарту ISO 4217.

payment_details.​direct_wht.​percentnumber(float)

Процент налога, удерживаемого у источника выплаты.

payment_details.​paymentobject

Объект с данными о сумме, которую оплатил пользователь.

payment_details.​payment.​amountnumber(float)

Сумма.

payment_details.​payment.​currencystring(currency)

Валюта. Используется трехбуквенное обозначение валюты согласно стандарту ISO 4217.

payment_details.​payment_method_feeobject

Размер комиссии платежной системы.

payment_details.​payment_method_fee.​amountnumber(float)

Сумма.

payment_details.​payment_method_fee.​currencystring(currency)

Валюта. Используется трехбуквенное обозначение валюты согласно стандарту ISO 4217.

payment_details.​payment_method_sumobject

Объект с данными о сумме, которая была оплачена из платежной системы.

payment_details.​payment_method_sum.​amountnumber(float)

Сумма.

payment_details.​payment_method_sum.​currencystring(currency)

Валюта. Используется трехбуквенное обозначение валюты согласно стандарту ISO 4217.

payment_details.​payoutobject

Объект с данными о сумме выплаты.

payment_details.​payout.​amountnumber(float)

Сумма.

payment_details.​payout.​currencystring(currency)

Валюта. Используется трехбуквенное обозначение валюты согласно стандарту ISO 4217.

payment_details.​payout_currency_ratestring

Курс валюты платежа к валюте выплаты.

payment_details.​repatriation_commissionobject

Объект с информацией о затратах на репатриацию, возлагаемых на Xsolla третьими сторонами.

payment_details.​repatriation_commission.​amountnumber(float)

Сумма.

payment_details.​repatriation_commission.​currencystring(currency)

Валюта. Используется трехбуквенное обозначение валюты согласно стандарту ISO 4217.

payment_details.​sales_taxobject

Размер налога (только для США и Канады).

payment_details.​sales_tax.​amountnumber(float)

Сумма.

payment_details.​sales_tax.​currencystring(currency)

Валюта. Используется трехбуквенное обозначение валюты согласно стандарту ISO 4217.

payment_details.​sales_tax.​percentnumber(float)

Процент налога.

payment_details.​user_acquisition_feeobject

Объект с данными о сумме вознаграждения каналов привлечения трафика (аффилированные сети и инфлюенсеры).

payment_details.​user_acquisition_fee.​amountnumber(float)

Сумма.

payment_details.​user_acquisition_fee.​currencystring(currency)

Валюта. Используется трехбуквенное обозначение валюты согласно стандарту ISO 4217.

payment_details.​user_acquisition_fee.​percentnumber(float)

Ставка вознаграждения за привлечение пользователей, %.

payment_details.​vatobject

Размер VAT (только для Евросоюза).

payment_details.​vat.​amountnumber(float)

Сумма.

payment_details.​vat.​currencystring(currency)

Валюта. Используется трехбуквенное обозначение валюты согласно стандарту ISO 4217.

payment_details.​vat.​percentnumber(float)

Процент VAT.

payment_details.​xsolla_balance_sumobject

Объект с данными о сумме, которая была оплачена с Xsolla-баланса.

payment_details.​xsolla_balance_sum.​amountnumber(float)

Сумма.

payment_details.​xsolla_balance_sum.​currencystring(currency)

Валюта. Используется трехбуквенное обозначение валюты согласно стандарту ISO 4217.

payment_details.​xsolla_feeobject

Размер комиссии Xsolla.

payment_details.​xsolla_fee.​amountnumber(float)

Сумма.

payment_details.​xsolla_fee.​currencystring(currency)

Валюта. Используется трехбуквенное обозначение валюты согласно стандарту ISO 4217.

purchaseobject

Объект с информацией о заказе.

purchase.​checkoutobject

Объект с информацией о заказе.

purchase.​checkout.​amountnumber(float)

Сумма заказа.

purchase.​checkout.​currencystring(currency)

Валюта. Используется трехбуквенное обозначение валюты согласно стандарту ISO 4217.

purchase.​couponobject

Объект с информацией о купоне (если при создании подписки был использован купон).

purchase.​coupon.​campaign_codestring

Код кампании купонов.

purchase.​coupon.​coupon_codestring

Код купона.

purchase.​giftobject

Объект с информацией о подарке.

purchase.​gift.​giver_idstring

ID дарителя.

purchase.​gift.​hide_giver_from_receiverstring

Флаг, показывать ли дарителя получателю подарка.

purchase.​gift.​messagestring

Сообщение от дарителя.

purchase.​gift.​receiver_emailstring

Email получателя подарка.

purchase.​gift.​receiver_idstring

ID получателя подарка.

purchase.​orderobject(order)

Объект с информацией о заказе. Чтобы получать эту информацию, в Личном кабинете в разделе Настройки проекта > Вебхуки > Расширенные настройки установите переключатель Добавить объект order в вебхук в положение Вкл.

purchase.​order.​idinteger

Идентификатор заказа.

purchase.​order.​lineitemsArray of objects

Массив с параметрами, которые содержат информацию о товарах.

purchase.​order.​lineitems[].​priceobject

Объект с информацией о цене товара.

purchase.​order.​lineitems[].​price.​amountnumber(float)

Общая стоимость товара в валюте.

purchase.​order.​lineitems[].​price.​currencystring

Валюта, в которой указана цена товара.

purchase.​order.​lineitems[].​quantityinteger

Количество этого предмета в заказе.

purchase.​order.​lineitems[].​skustring

Артикул предмета.

purchase.​promotionsArray of objects

Массив с данными акций, которые действуют на данную покупку.

purchase.​promotions[].​idinteger

ID акции.

purchase.​promotions[].​technical_namestring

Техническое название акции.

purchase.​subscriptionobject

Объект с данными о подписке.

purchase.​subscription.​amountnumber(float)(amount-float)

Сумма покупки.

purchase.​subscription.​currencystring(currency)

Валюта. Используется трехбуквенное обозначение валюты согласно стандарту ISO 4217.

purchase.​subscription.​date_createstring(subscription.date_create)

Дата создания подписки. Дата и время согласно стандарту ISO 8601.

purchase.​subscription.​date_next_chargestring

Дата следующего списания. Дата и время согласно стандарту ISO 8601.

purchase.​subscription.​plan_idstring(subscription.plan_id)

ID плана (внешний id, если план был создан через API).

purchase.​subscription.​product_idstring

ID продукта (если был отправлен в токене).

purchase.​subscription.​subscription_idinteger(subscription.subscription_id)

ID подписки в базе данных Xsolla.

purchase.​subscription.​tagsArray of strings(subscription.tags)

Теги плана.

purchase.​totalobjectобязательный

Объект с данными об общей стоимости покупки.

purchase.​total.​amountnumber(float)

Общая сумма покупки.

purchase.​total.​currencystring(currency)

Валюта. Используется трехбуквенное обозначение валюты согласно стандарту ISO 4217.

settingsobject

Объект, содержащий настройки проекта.

settings.​merchant_idinteger(settings.merchant_id)

ID продавца.

settings.​project_idinteger(settings.project_id)

ID проекта. Вы можете найти этот параметр в Личном кабинете рядом с названием проекта.

transactionobjectобязательный

Объект с информацией о транзакции, связанной с этой операцией.

transaction.​agreementinteger

ID соглашения.

transaction.​dry_runinteger

Признак тестовой транзакции. Значение параметра равно 1 для тестового платежа, для реального платежа параметр не передается.

transaction.​external_idstring(external-id)

Внешний ID транзакции. Изучите подробную информацию в Частых вопросах.

transaction.​idinteger(int64)

ID транзакции.

transaction.​payment_datestring

Дата платежа.

transaction.​payment_methodinteger

ID способа оплаты.

transaction.​payment_method_namestring

Название способа оплаты.

transaction.​payment_method_order_idstring

ID платежа в платежной системе.

userobject

Объект с информацией о пользователе.

user.​countrystring(user.country)

Страна пользователя. Используется двухбуквенное обозначение страны согласно стандарту ISO 3166-1 alpha-2.

user.​emailstring(user.email)

Email пользователя.

user.​idstring(user.id)обязательный

ID пользователя.

user.​ipstring(user.ip)

IP адрес пользователя.

user.​namestring(user.name)

Имя пользователя.

user.​phonestring(user.phone)

Номер телефона пользователя (в международном формате).

user.​zipstring(user.zip)

Почтовый индекс.

curl -v 'https://your.hostname/your/uri' \
-X POST \
-d '{
    "notification_type": "payment",
    "settings": {
      "project_id": 18404,
      "merchant_id": 2340
    },
    "purchase": {
        "subscription": {
            "plan_id": "b5dac9c8",
            "subscription_id": "10",
            "product_id": "Demo Product",
            "date_create": "2014-09-22T19:25:25+04:00",
            "date_next_charge": "2014-10-22T19:25:25+04:00",
            "currency": "USD",
            "amount": 9.99
        },
        "checkout": {
            "currency": "USD",
            "amount": 50
        },
        "total": {
            "currency": "USD",
            "amount": 200
        },
        "promotions": [{
            "technical_name": "Demo Promotion",
            "id": 853
        }],
        "coupon": {
            "coupon_code": "ICvj45S4FUOyy",
            "campaign_code": "1507"
        },
        "order": {
          "id": 1234
          "lineitems": [
          {
            "sku": "com.xsolla.item_1",
            "quantity": 1,
            "price": {
              "currency": "EUR",
              "amount": 6.5
              }
          }
          ]
          }
    },
    "user": {
        "ip": "127.0.0.1",
        "phone": "18777976552",
        "email": "email@example.com",
        "id": "1234567",
        "name": "John Smith",
        "country": "US"
    },
    "transaction": {
        "id": 1,
        "external_id": 1,
        "payment_date": "2014-09-24T20:38:16+04:00",
        "payment_method": 1,
        "payment_method_name": "PayPal",
        "payment_method_order_id": 1234567890123456789,
        "dry_run": 1,
        "agreement": 1
    },
    "payment_details": {
        "payment": {
            "currency": "USD",
            "amount": 230
        },
        "vat": {
            "currency": "USD",
            "amount": 0,
            "percent": 20
        },
        "sales_tax": {
            "currency": "USD",
            "amount": 0,
            "percent": 0
        },
        "direct_wht": {
            "currency": "USD",
            "amount": 0,
            "percent": 0
        },
        "payout_currency_rate": "1",
        "payout": {
            "currency": "USD",
            "amount": 200
        },
        "country_wht": {
            "currency": "USD",
            "amount": 2,
            "percent": 10
        },
        "user_acquisition_fee": {
            "currency": "USD",
            "amount": 2,
            "percent": 1
        },
        "xsolla_fee": {
            "currency": "USD",
            "amount": 10
        },
        "payment_method_fee": {
            "currency": "USD",
            "amount": 20
        },
        "repatriation_commission": {
            "currency": "USD",
            "amount": 10
        }
    },
    "custom_parameters": {
        "parameter1": "value1",
        "parameter2": "value2"
    }
}'

Ответы

Верните, чтобы сообщить об успешной обработке вехбука.

Ответ
Нет содержимого

Отмена платежаВебхук

Запрос

Если транзакция была отклонена платежной системой, Xsolla присылает детали транзакции в вебхуке с типом ps_declined на URL-адрес вебхука. Вебхук отправляется на этапе авторизации или обработки платежа. Вебхук payment\ order_paid при этом отправлен не будет.

Типичные причины отклонения транзакции платежной системой:

  • Авторизация карты не удалась (пример: платежная система не смогла завершить процесс авторизации из-за технического сбоя или отсутствия ответа от банка) или была отклонена (пример: банк ответил, но отказал в операции из-за недостатка средств или неверных данных карты).
  • Проверка 3-D Secure не удалась, не была завершена или истекло время ожидания подтверждения пользователем.
  • Процессор или банк-эквайер временно недоступен или возвращает жесткий отказ (hard decline) из-за необратимой ошибки: например, закрытого счета или недействительного номера карты. Повторная попытка без устранения причины ошибки не приведет к успешному результату.

Следует отличать:

  • От отклонений транзакции со стороны антифрод-системы, информация о которых передается в вебхуке afs_reject.
  • Возврата и частичного возврата платежа после успешной оплаты, информация о котором передается в вебхуках refund и partial_refund.

Примечание

Чтобы получать вебхук ps_declined, обратитесь к персональному менеджеру проекта или напишите на csm@xsolla.com.

Телоapplication/json
notification_typestring(notification_type)обязательный

Тип оповещения.

refund_detailsobject

Объект с финансовыми данными рефанда.

refund_details.​authorstring

Инициатор возврата платежа. Значение поля передается согласно таблице:

Инициатор возвратаЗначение поля
Игра (через API).API
Пользователь Личного кабинета (автоматический возврат).Email-адрес пользователя
Пользователь Личного кабинета (при участии службы поддержки Xsolla).support@xsolla.com
Xsolla (при участии службы поддержки Xsolla).support@xsolla.com
refund_details.​codeinteger

ID кода.

КодПричина отменыОписание
1Cancellation by the user request / the game requestИспользуется, если отмена произошла из Личного кабинета.
2ChargebackИспользуется, если по транзакции был chargeback.
3Integration errorИспользуется в случае проблем с интеграцией между Xsolla и игрой.
В этом случае мы не рекомендуем заносить пользователя в черный список.
4Potential fraudИспользуется в случае потенциального фрода.
В этом случае мы рекомендуем добавить пользователя в черный список.
5Test paymentИспользуется в случае совершения тестового платежа с последующей отменой.
В этом случае мы не рекомендуем заносить пользователя в черный список.
6User invoice expiredИспользуется, если был выбран способ оплаты с системой отложенного платежа.
7Fraud notification from PSИспользуется, если платежная система не произвела выплату по транзакции из-за потенциального фрода.
В этом случае мы рекомендуем добавить пользователя в черный список.
8Cancellation by the PS requestИспользуется, когда платежная система запросила отмену транзакции.
В этом случае мы не рекомендуем заносить пользователя в черный список.
9Cancellation by the user requestИспользуется, если игра или заказ не удовлетворяют требованиям пользователя по каким-либо причинам.
В этом случае мы не рекомендуем заносить пользователя в черный список.
10Cancellation by the game requestИспользуется, когда игра просит отменить транзакцию.
В этом случае мы не рекомендуем заносить пользователя в черный список.
11Account holder called to report fraudИспользуется, когда владелец аккаунта сообщил, что не совершал данный платеж.
12Friendly fraudИспользуется, если нам сообщили о friendly fraud.
13DuplicateИспользуется, если произошла попытка повторной оплаты по счету.
refund_details.​reasonstring

Причина отмены.

settingsobject

Объект, содержащий настройки проекта.

settings.​merchant_idinteger(settings.merchant_id)

ID продавца.

settings.​project_idinteger(settings.project_id)

ID проекта. Вы можете найти этот параметр в Личном кабинете рядом с названием проекта.

transactionobjectобязательный

Объект с информацией о транзакции, связанной с этой операцией.

transaction.​dry_runinteger

Признак тестовой транзакции. Значение параметра равно 1 для тестового платежа, для реального платежа параметр не передается.

transaction.​external_idstring

Внешний ID транзакции.

transaction.​idinteger(int64)

ID транзакции.

transaction.​payment_methodinteger

ID способа оплаты.

userobject

Объект с информацией о пользователе.

user.​countrystring(user.country)

Страна пользователя. Используется двухбуквенное обозначение страны согласно стандарту ISO 3166-1 alpha-2.

user.​emailstring(user.email)

Email пользователя.

user.​idstring(user.id)обязательный

ID пользователя.

user.​ipstring(user.ip)

IP адрес пользователя.

user.​namestring(user.name)

Имя пользователя.

curl -v 'https://your.hostname/your/uri' \
-X POST \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-H 'Authorization: Signature 80543ba63e1e50cf05f15150fe75e7245da9a898' \
-d '{
  "notification_type": "ps_declined",
  "settings": {
    "project_id": "18404",
    "merchant_id": "2340"
  },
  "user": {
    "ip": "127.0.0.1",
    "email": "email@example.com",
    "id": "1234567",
    "country": "US"
  },
  "transaction": {
    "id": "1",
    "dry_run": "1",
    "payment_method": "1"
  },
  "refund_details": {
    "author": "support@xsolla.com",
    "code": "8",
    "reason": "Cancellation by the PS request",
    "reason_detail": "Insufficient funds"
  }
}'

Ответы

Верните, чтобы сообщить об успешной обработке вехбука.

Ответ
Нет содержимого

Объединенные вебхуки

Вебхуки
Вебхуки

Вебхук персонализации

Вебхуки
Вебхуки
Вебхуки