Введение
Раздел содержит описание методов для работы с продуктом Платежи. Для обращения к методам используется базовая аутентификация. Для открытия платежного интерфейса и обеспечения безопасности проведения платежей необходимо получить токен.
Базовый URL: https://api.xsolla.com.
Открытие платежного интерфейса
Команда Иксоллы создала виджет для упрощения интеграции платежного интерфейса на вашем сайте. Скрипт виджета доступен по ссылке. Используйте этот URL для загрузки скрипта на вашу страницу. Более подробная информация доступна в нашем проекте на Github.
Список параметров для инициализации виджета:
Параметр | Тип | Описание |
---|---|---|
access_token | string | Токен, полученный по API. Обязательный. |
sandbox | boolean | Передайте true для тестирования. Будет использоваться URL sandbox-secure.xsolla.com вместо secure.xsolla.com. |
lightbox | object | Объект со списком настроек, доступных в случае открытия в lightbox (для полноэкранной версии). |
lightbox.width | string | Ширина lightbox. При значении null соответствует ширине платежного интерфейса. Значение по умолчанию null. |
lightbox.height | string | Высота lightbox. Значение по умолчанию 100%. Если значение null, высота lightbox соответствует высоте платежного интерфейса. |
lightbox.zIndex | integer | Свойство, отвечающее за положение объекта, по умолчанию 1000. |
lightbox.overlayOpacity | integer | Непрозрачность верхнего слоя (от 0 до 1), по умолчанию .6. |
lightbox.overlayBackground | string | Фон для верхнего слоя, по умолчанию #000000. |
lightbox.modal | boolean | Можно ли закрыть lightbox, по умолчанию false. |
lightbox.closeByClick | boolean | Должен ли закрываться lightbox при клике на верхний слой, по умолчанию true. |
lightbox.closeByKeyboard | boolean | Должен ли закрываться lightbox при нажатии ESC, по умолчанию true. |
lightbox.contentBackground | string | Фон фрейма, по умолчанию #ffffff. Обратите внимание, что настройка влияет только на фон фрейма lightbox и не меняет фон окна платежного интерфейса. |
lightbox.contentMargin | string | Отступ вокруг фрейма, по умолчанию 10px. |
lightbox.spinner | string | Тип прелоадера, может принимать значение xsolla или round, по умолчанию xsolla. |
lightbox.spinnerColor | string | Цвет прелоадера. |
childWindow | object | Настройки дочернего окна, в котором открывается платежный интерфейс. Работает для мобильной версии. |
childWindow.target | string | Свойство, определяющее, где должно быть открыто дочернее окно, может принимать значения _blank, _self, _parent, по умолчанию _blank. |
Скрипт позволяет вам отслеживать события, происходящие в платежном интерфейсе. В зависимости от типа события вы можете выполнять различные действия на вашей странице.
Список событий:
Параметр | Описание |
---|---|
init | Инициализация виджета. |
open | Открытие виджета. |
load | Событие после загрузки платежного интерфейса. |
close | Событие после закрытия платежного интерфейса. |
status | Событие, когда пользователь попадает на страницу статуса. |
status-invoice | Событие, когда пользователь попадает на страницу статуса, но платеж еще не завершен. |
status-delivering | Событие, когда пользователь попадает на страницу статуса, платеж завершен, мы прислали оповещение о платеже. |
status-done | Событие, когда пользователь попадает на страницу статуса, платеж успешно зачислен. |
status-troubled | Событие, когда пользователь попадает на страницу статуса, но платеж не прошел. |
Если вы хотите самостоятельно открывать платежный интерфейс, используйте ссылку https://secure.xsolla.com/paystation3/?access_token=ACCESS_TOKEN.
Для тестирования используйте URL https://sandbox-secure.xsolla.com/paystation3/?access_token=ACCESS_TOKEN.
Токен
Для обеспечения безопасности проведения платежа API Иксоллы использует токен, который содержит внутри себя платежные параметры, вместо прямого получения данных через HTTP GET запрос на страницу оплаты. Перед открытием страницы оплаты вы должны получить новый токен. Время жизни токена — 24 часа.
Получение токена
Можно создать токен с любыми параметрами пользователя. Вы отправляете нам эти параметры при получении токена, а мы отправляем их вам после успешной оплаты. Токен может содержать только описанные ниже параметры, либо параметры, предопределенные партнером.
HTTP-ЗАПРОС
- http
POST https://api.xsolla.com/merchant/v2/merchants/{merchant_id}/token
Параметр | Тип | Описание |
---|---|---|
user | object | Объект с информацией о пользователе. |
user.id | object | Объект с данными об ID пользователя. Обязательный. |
user.id.value | string | ID пользователя. |
user.name | object | Объект с информацией о нике пользователя. |
user.name.value | string | Ник пользователя. |
user.email | object | Email пользователя (объект). Параметр user.email используется при построении моделей антифрода и проведения платежей. Его передача является обязательным требованием Иксоллы и платежных систем. Отсутствие этого параметра может влиять на конверсию платежей. Обязательный. |
user.email.value | string | Email пользователя. Должен быть валидным в соответствии с протоколом RFC 822. Обязательный. |
user.phone | object | Объект с информацией о телефоне пользователя. |
user.phone.value | string | Номер телефона пользователя. |
user.country | object | Объект с информацией о стране пользователя. |
user.country.value | string | Используется двухбуквенное обозначение страны согласно стандарту ISO 3166-1 alpha-2. |
user.country.allow_modify | boolean | Может ли пользователь изменить страну на странице оплаты. false по умолчанию. |
user.attributes | object | Объект с данными об атрибутах пользователя, необходимых для фильтрации списка предметов. Параметры передаются в json хэше парами ключ-значение. |
user.steam_id | object | Объект с данными о Steam ID пользователя. |
user.steam_id.value | string | Steam ID пользователя. |
user.tracking_id | object | Объект с данными о Tracking ID пользователя. |
user.tracking_id.value | string | Уникальный Tracking ID (используется для проведения рекламных кампаний). |
user.public_id.value | string | Параметр позволяет однозначно идентифицировать пользователя, а также, в отличие от user ID, известен пользователю (адрес электронной почты, никнейм, и т.д.). Параметр может использоваться при оплате покупки вне игрового магазина (например, кнопка игры в терминалах оплаты). |
user.utm | object | Объект с данными о характеристиках трафика. |
user.utm.utm_source | string | Источник трафика |
user.utm.utm_medium | string | Канал трафика (контекстная реклама, медийная реклама, email-рассылка). |
user.utm.utm_campaign | string | Название кампании. В данный параметр следует указывать транслитерированное или переведенное на английский язык название кампании. |
user.utm.utm_term | string | Ключевое слово кампании. При использовании этого параметра в статистике будут собираться данные по тем ключевым словам, которые используются для таргетинга вашей рекламной кампании (а не по поисковым запросам). В Google Analytics содержимое метки utm_term попадает в единый отчет с поисковыми запросами. |
user.utm.utm_content | string | Содержание кампании. |
user.is_legal | boolean | Является ли пользователь юридическим лицом. |
user.legal | object | Объект с реквизитами юридического лица. Объект и все его параметры являются обязательными, если в user.is_legal передано значение ‘true’. |
user.legal.name | string | Полное юридическое наименование. |
user.legal.address | string | Полный юридический адрес. |
user.legal.vat_id | string | Индивидуальный идентификатор налогоплательщика. |
user.legal.country | string | Страна регистрации. Используется двухбуквенное обозначение страны согласно стандарту ISO 3166-1 alpha-2. |
settings | object | Объект, содержащий настройки проекта. |
settings.external_id | string | Внешний ID транзакции. |
settings.project_id | integer | ID игры в Иксолле. Вы можете найти этот параметр в Личном кабинете. Обязательный. |
settings.language | string | Язык интерфейса. Используется двухбуквенное обозначение (в нижнем регистре). |
settings.return_url | string | Пользователь будет перенаправлен на данную страницу после совершения платежа. Параметры user_id, foreigninvoice, invoice_id и status будут автоматически добавлены к ссылке. |
settings.currency | string | Предпочтительная валюта платежа. Используется трехбуквенное обозначение валюты согласно стандарту ISO 4217. |
settings.mode | string | Передайте значение sandbox, чтобы провести тестовые платежи. Обратите внимание, что URL для страницы оплаты будет https://sandbox-secure.xsolla.com. |
settings.payment_method | integer | ID способа оплаты. |
settings.payment_widget | string | Виджет оплаты. Принимает значения paybycash или giftcard. При передаче этого параметра пользователь перенаправляется на виджет Pay with Cash или Gift Cards. |
settings.ui | object | Объект с настройками интерфейса. |
settings.ui.theme | string | Внешний вид интерфейса оплаты. Может принимать значения default (по умолчанию) или default_dark. |
settings.ui.size | string | Размер платежного интерфейса. В зависимости от требуемых размеров платежного интерфейса, параметр может принимать следующие значения:
|
settings.ui.version | string | Тип устройства. Может принимать значения desktop (по умолчанию) или mobile. |
settings.ui.desktop | object | Объект с данными настроек для desktop-версии. |
settings.ui.desktop.header | object | Объект с настройками header. |
settings.ui.desktop.header.is_visible | boolean | Должен ли header отображаться на странице оплаты. |
settings.ui.desktop.header.visible_logo | boolean | Если значение true, то логотип будет отображаться в header (необходимо сначала прислать файл с логотипом вашему менеджеру). |
settings.ui.desktop.header.visible_name | boolean | Должно ли название игры отображаться в header. |
settings.ui.desktop.header.visible_purchase | boolean | Должно ли описание покупки (purchase.description.value) отображаться в header, по умолчанию true. |
settings.ui.desktop.header.type | string | Внешний вид header. Может принимать значения compact (название игры и ID пользователя не будут показываться в header) или normal. |
settings.ui.desktop.header.close_button | boolean | Показывать ли кнопку Закрыть в настольной версии платежного интерфейса. Нажатие на кнопку закрывает платежный интерфейс и перенаправляет пользователя на адрес, указанный в параметре "settings.return_url. false по умолчанию. |
settings.ui.desktop.subscription_list | object | Объект с данными настройки списка подписок. |
settings.ui.desktop.subscription_list.layout | string | Шаблон списка. Принимает значения list (по умолчанию) или grid. |
settings.ui.desktop.subscription_list.description | string | Здесь вы можете передать текст про подписки. Текст появится перед списком рекуррентных планов в интерфейсе оплаты. |
settings.ui.desktop.subscription_list.display_local_price | boolean | Если значение true и если локальная валюта пользователя отличается от базовой валюты плана, пользователь будет видеть две цены: цену в локальной валюте и цену в базовой валюте плана. |
settings.ui.desktop.virtual_item_list | object | Объект с данными настройки списка предметов. |
settings.ui.desktop.virtual_item_list.layout | string | Шаблон списка. Принимает значения list (по умолчанию) или grid. |
settings.ui.desktop.virtual_item_list.button_with_price | boolean | Если значение true, то цена за предмет будет показана внутри кнопки. Если false, то цена будет слева от кнопки. false по умолчанию. |
settings.ui.desktop.virtual_item_list.view | string | Вывод списка групп виртуальных предметов либо в виде вертикального меню, либо над окном в виде горизонтального меню. Принимает значения horizontal_navigation или vertical (по умолчанию). |
settings.ui.desktop.virtual_currency_list | object | Объект с данными настройки списка пакетов виртуальной валюты. |
settings.ui.desktop.virtual_currency_list.description | string | Здесь вы можете передать текст про виртуальную валюту. Текст появится перед списком пакетов виртуальной валюты в интерфейсе оплаты. |
settings.ui.desktop.virtual_currency_list.button_with_price | boolean | Если значение true, то цена за предмет будет показана внутри кнопки. Если false, то цена будет слева от кнопки. false по умолчанию. |
settings.ui.header.visible_virtual_currency_balance | boolean | Должен ли этот элемент быть видимым в интерфейсе оплаты. true по умолчанию. |
settings.ui.mobile.mode | string | Пользователь может совершить платеж только через сохраненные способы оплаты. Принимает значение saved_accounts. |
settings.ui.mobile.header.close_button | boolean | Показывать ли кнопку Закрыть в мобильной версии платежного интерфейса. Нажатие на кнопку закрывает платежный интерфейс и перенаправляет пользователя на адрес, указанный в параметре settings.return_url. false по умолчанию. |
settings.ui.mobile.footer.is_visible | boolean | Скрывать или нет footer в мобильной версии платежного интерфейса. |
settings.ui.license_url | string | Ссылка на лицензионное соглашение. |
settings.ui.components | object | Объект с данными настройки пунктов меню. |
settings.ui.components.virtual_items | object | Объект с данными настройки меню предметов. |
settings.ui.components.virtual_items.order | integer | Место вкладки в меню. |
settings.ui.components.virtual_items.hidden | boolean | Должна ли вкладка отображаться в меню. |
settings.ui.components.virtual_items.selected_group | string | Группа, которая будет выбрана при открытии вкладки. |
settings.ui.components.virtual_items.selected_item | string | Предмет, который будет выбран при открытии вкладки. Должен быть передан артикул предмета. |
settings.ui.components.virtual_currency | object | Объект с данными настройки меню виртуальной валюты. |
settings.ui.components.virtual_currency.custom_amount | boolean | Возможность ввода произвольного количества виртуальной валюты в интерфейсе оплаты. |
settings.ui.components.virtual_currency.order | integer | Место вкладки в меню. |
settings.ui.components.virtual_currency.hidden | boolean | Должна ли вкладка отображаться в меню. |
settings.ui.components.subscriptions | object | Объект с данными настройки меню подписок. |
settings.ui.components.subscriptions.order | integer | Место вкладки в меню. |
settings.ui.components.subscriptions.hidden | boolean | Должна ли вкладка отображаться в меню. |
settings.ui.mode | string | Платежный интерфейс в режиме Личного кабинета. Принимает значение user_account. Header содержит только навигационное меню Личного кабинета; исключается возможность выбора предмета и оплата покупки; режим Личного кабинета доступен только в desktop-режиме. |
settings.ui.user_account | object | Объект с данными об аккаунте пользователя. |
settings.ui.user_account.info | object | Страница Мой аккаунт. |
settings.ui.user_account.info.order | integer | Место вкладки в меню. |
settings.ui.user_account.info.enable | boolean | Должна ли вкладка отображаться в меню. false по умолчанию. |
settings.ui.user_account.history | object | Страница 'История' пользователя. |
settings.ui.user_account.history.order | integer | Место вкладки в меню. |
settings.ui.user_account.history.enable | boolean | Должна ли вкладка отображаться в меню. false по умолчанию. |
settings.ui.user_account.payment_accounts | object | Страница Мои платежные аккаунты. |
settings.ui.user_account.payment_accounts.order | integer | Место вкладки в меню. |
settings.ui.user_account.payment_accounts.enable | boolean | Должна ли вкладка отображаться в меню. false по умолчанию. |
settings.ui.user_account.subscriptions | object | Страница Управление подписками. |
settings.ui.user_account.subscriptions.order | integer | Место вкладки в меню. |
settings.ui.user_account.subscriptions.enable | boolean | Должна ли вкладка отображаться в меню. false по умолчанию. |
purchase | object | Объект с информацией о заказе. |
purchase.virtual_currency | object | Объект с данными о виртуальной валюте. |
purchase.virtual_currency.quantity | float | Количество виртуальной валюты в заказе. |
purchase.virtual_currency.currency | string | Валюта пакета виртуальной валюты, на основе которой будут сделаны все расчеты. |
purchase.virtual_items | object | Объект с данными о предметах. |
purchase.virtual_items.currency | string | Валюта предмета в заказе, на основе которой будут сделаны все расчеты. |
purchase.virtual_items.items | array | Массив с данными о предмете. |
purchase.virtual_items.items.sku | string | ID предмета (артикул). |
purchase.virtual_items.items.amount | integer | Количество этого предмета в заказе. |
purchase.virtual_items.available_groups | array | Массив с данными о группах предметов. Только предметы из указанных групп будут показаны в интерфейсе оплаты. |
purchase.subscription | object | Объект с данными о подписке. |
purchase.subscription.plan_id | string | ID рекуррентного плана. |
purchase.subscription.operation | string | Тип операции, применяемой к плану подписки пользователя. Чтобы изменить план подписки, передайте в параметре значение change_plan. В параметре purchase.subscription.plan_id необходимо передать ID нового плана подписки. |
purchase.subscription.product_id | string | ID рекуррентного продукта. |
purchase.subscription.currency | string | Валюта рекуррентного плана в заказе, на основе которой будут сделаны все расчеты. |
purchase.subscription.available_plans | array | Массив с данными о планах подписок. Только планы из этого списка будут показаны в платежном интерфейсе. |
purchase.subscription.trial_days | integer | Количество дней триального периода. |
purchase.pin_codes | object | Объект с данными о ключе. |
purchase.pin_codes.currency | string | Валюта ключа в заказе, на основе которой будут сделаны все расчеты. |
purchase.pin_codes.codes | array | Массив с данными о ключах. |
purchase.pin_codes.codes.digital_content | string | Артикул игры, настраивается в Личном кабинете. |
purchase.pin_codes.codes.drm | string | DRM-платформа, на которой игра будет доступна. Может принимать значения steam, playstation, xbox, uplay, origin, drmfree, gog, epicgames, nintendo_eshop, discord_game_store или oculus. Пожалуйста, убедитесь, что нужная DRM-платформа настроена в Личном кабинете. Если значение не передано в токене, будет выбрана платформа, указанная пользователем в платежном интерфейсе. |
purchase.pin_codes.upgrade | object | Объект с информацией об апгрейде. |
purchase.pin_codes.upgrade.id_user_history | integer | ID записи, содержащей данные о пользователе и пакетах, которыми он владеет. |
purchase.pin_codes.upgrade.id | integer | ID апгрейда. |
purchase.gift | object | Объект с информацией о подарке. |
purchase.gift.giver_id | string | ID дарителя. |
purchase.gift.message | string | Сообщение от дарителя. |
purchase.gift.hide_giver_from_receiver | string | Показывать ли данные дарителя получателю подарка. true по умолчанию. |
purchase.gift.friends | array | Массив с данными о друзьях. |
purchase.gift.friends.id | string | ID получателя подарка. |
purchase.gift.friends.name | string | Никнейм получателя подарка. |
purchase.gift.friends.email | string | Email получателя подарка. |
purchase.coupon_code | object | Объект с информацией о промокоде на скидку или бонусы при покупке. |
purchase.coupon_code.value | string | Значение промокода. |
purchase.coupon_code.hidden | boolean | Скрыть поле для ввода промокода в интерфейсе оплаты. false по умолчанию. |
custom_parameters | object | Ваши дополнительные параметры. Параметры передаются в json хеше парами ключ-значение. |
Если какой-либо параметр был передан в некорректном формате, токен не может быть выдан. Мы вернем 422 HTTP код, в JSON объекте в теле ответа будет содержаться информация об ошибке. В параметре extended_message мы указываем, какие именно параметры были переданы неверно.
- http
{
"extended_message": {
"global_errors": [],
"property_errors": {
"settings.project_id": [
"string value found, but an integer is required"
]
}
}
}
- http
- curl
- php
- C#
- python
- ruby
- java
- js
POST https://api.xsolla.com/merchant/v1/merchants/{merchant_id}/token
Headers:
Authorization: Basic <your_authorization_basic_key>
Content-Type: application/json
Body:
{
"purchase": {
"virtual_currency": {
"quantity": 100
},
"virtual_items": {
"items": [
{
"amount": 1,
"sku": "SKU01"
}
]
}
},
"settings": {
"currency": "USD",
"language": "en",
"project_id": 16184,
"ui": {
"components": {
"virtual_currency": {
"custom_amount": true
}
},
"desktop": {
"virtual_item_list": {
"button_with_price": true,
"layout": "list"
}
},
"size": "medium"
}
},
"user": {
"country": {
"allow_modify": true,
"value": "US"
},
"email": {
"value": "john.smith@mail.com"
},
"id": {
"value": "user_2"
},
"name": {
"value": "John Smith"
}
}
}
curl --request POST \
--url https://api.xsolla.com/merchant/v1/merchants/{merchant_id}/token \
--header 'authorization: Basic <your_authorization_basic_key>' \
--header 'content-type: application/json' \
--data '{"user":{"id":{"value":"user_2"},"name":{"value":"John Smith"},"email":{"value":"john.smith@mail.com"},"country":{"value":"US","allow_modify":true}},"settings":{"project_id":16184,"currency":"USD","language":"en","ui":{"size":"medium","desktop":{"virtual_item_list":{"layout":"list","button_with_price":true}},"components":{"virtual_currency":{"custom_amount":true}}}},"purchase":{"virtual_currency":{"quantity":100},"virtual_items":{"items":[{"sku":"SKU01","amount":1}]}}}'
<?php
$client = new http\Client;
$request = new http\Client\Request;
$body = new http\Message\Body;
$body->append('{"user":{"id":{"value":"user_2"},"name":{"value":"John Smith"},"email":{"value":"john.smith@mail.com"},"country":{"value":"US","allow_modify":true}},"settings":{"project_id":16184,"currency":"USD","language":"en","ui":{"size":"medium","desktop":{"virtual_item_list":{"layout":"list","button_with_price":true}},"components":{"virtual_currency":{"custom_amount":true}}}},"purchase":{"virtual_currency":{"quantity":100},"virtual_items":{"items":[{"sku":"SKU01","amount":1}]}}}');
$request->setRequestUrl('https://api.xsolla.com/merchant/v1/merchants/{merchant_id}/token');
$request->setRequestMethod('POST');
$request->setBody($body);
$request->setHeaders(array(
'authorization' => 'Basic <your_authorization_basic_key>',
'content-type' => 'application/json'
));
$client->enqueue($request)->send();
$response = $client->getResponse();
echo $response->getBody();
var client = new RestClient("https://api.xsolla.com/merchant/v1/merchants/{merchant_id}/token");
var request = new RestRequest(Method.POST);
request.AddHeader("authorization", "Basic <your_authorization_basic_key>");
request.AddHeader("content-type", "application/json");
request.AddParameter("application/json", "{\"user\":{\"id\":{\"value\":\"user_2\"},\"name\":{\"value\":\"John Smith\"},\"email\":{\"value\":\"john.smith@mail.com\"},\"country\":{\"value\":\"US\",\"allow_modify\":true}},\"settings\":{\"project_id\":16184,\"currency\":\"USD\",\"language\":\"en\",\"ui\":{\"size\":\"medium\",\"desktop\":{\"virtual_item_list\":{\"layout\":\"list\",\"button_with_price\":true}},\"components\":{\"virtual_currency\":{\"custom_amount\":true}}}},\"purchase\":{\"virtual_currency\":{\"quantity\":100},\"virtual_items\":{\"items\":[{\"sku\":\"SKU01\",\"amount\":1}]}}}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
import http.client
conn = http.client.HTTPSConnection("api.xsolla.com")
payload = "{\"user\":{\"id\":{\"value\":\"user_2\"},\"name\":{\"value\":\"John Smith\"},\"email\":{\"value\":\"john.smith@mail.com\"},\"country\":{\"value\":\"US\",\"allow_modify\":true}},\"settings\":{\"project_id\":16184,\"currency\":\"USD\",\"language\":\"en\",\"ui\":{\"size\":\"medium\",\"desktop\":{\"virtual_item_list\":{\"layout\":\"list\",\"button_with_price\":true}},\"components\":{\"virtual_currency\":{\"custom_amount\":true}}}},\"purchase\":{\"virtual_currency\":{\"quantity\":100},\"virtual_items\":{\"items\":[{\"sku\":\"SKU01\",\"amount\":1}]}}}"
headers = {
'content-type': "application/json",
'authorization': "Basic <your_authorization_basic_key>"
}
conn.request("POST", "/merchant/v1/merchants/{merchant_id}/token", payload, headers)
res = conn.getresponse()
data = res.read()
print(data.decode("utf-8"))
require 'uri'
require 'net/http'
url = URI("https://api.xsolla.com/merchant/v1/merchants/{merchant_id}/token")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
request = Net::HTTP::Post.new(url)
request["content-type"] = 'application/json'
request["authorization"] = 'Basic <your_authorization_basic_key>'
request.body = "{\"user\":{\"id\":{\"value\":\"user_2\"},\"name\":{\"value\":\"John Smith\"},\"email\":{\"value\":\"john.smith@mail.com\"},\"country\":{\"value\":\"US\",\"allow_modify\":true}},\"settings\":{\"project_id\":16184,\"currency\":\"USD\",\"language\":\"en\",\"ui\":{\"size\":\"medium\",\"desktop\":{\"virtual_item_list\":{\"layout\":\"list\",\"button_with_price\":true}},\"components\":{\"virtual_currency\":{\"custom_amount\":true}}}},\"purchase\":{\"virtual_currency\":{\"quantity\":100},\"virtual_items\":{\"items\":[{\"sku\":\"SKU01\",\"amount\":1}]}}}"
response = http.request(request)
puts response.read_body
OkHttpClient client = new OkHttpClient();
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\"user\":{\"id\":{\"value\":\"user_2\"},\"name\":{\"value\":\"John Smith\"},\"email\":{\"value\":\"john.smith@mail.com\"},\"country\":{\"value\":\"US\",\"allow_modify\":true}},\"settings\":{\"project_id\":16184,\"currency\":\"USD\",\"language\":\"en\",\"ui\":{\"size\":\"medium\",\"desktop\":{\"virtual_item_list\":{\"layout\":\"list\",\"button_with_price\":true}},\"components\":{\"virtual_currency\":{\"custom_amount\":true}}}},\"purchase\":{\"virtual_currency\":{\"quantity\":100},\"virtual_items\":{\"items\":[{\"sku\":\"SKU01\",\"amount\":1}]}}}");
Request request = new Request.Builder()
.url("https://api.xsolla.com/merchant/v1/merchants/{merchant_id}/token")
.post(body)
.addHeader("content-type", "application/json")
.addHeader("authorization", "Basic <your_authorization_basic_key>")
.build();
Response response = client.newCall(request).execute();
var data = JSON.stringify({
"user": {
"id": {
"value": "user_2"
},
"name": {
"value": "John Smith"
},
"email": {
"value": "john.smith@mail.com"
},
"country": {
"value": "US",
"allow_modify": true
}
},
"settings": {
"project_id": 16184,
"currency": "USD",
"language": "en",
"ui": {
"size": "medium",
"desktop": {
"virtual_item_list": {
"layout": "list",
"button_with_price": true
}
},
"components": {
"virtual_currency": {
"custom_amount": true
}
}
}
},
"purchase": {
"virtual_currency": {
"quantity": 100
},
"virtual_items": {
"items": [
{
"sku": "SKU01",
"amount": 1
}
]
}
}
});
var xhr = new XMLHttpRequest();
xhr.withCredentials = true;
xhr.addEventListener("readystatechange", function () {
if (this.readyState === this.DONE) {
console.log(this.responseText);
}
});
xhr.open("POST", "https://api.xsolla.com/merchant/v1/merchants/{merchant_id}/token");
xhr.setRequestHeader("content-type", "application/json");
xhr.setRequestHeader("authorization", "Basic <your_authorization_basic_key>");
xhr.send(data);
{
"token": "eop57k1boA7nnYPtewZ6KEXJyJADEwRT"
}
{
"token": "eop57k1boA7nnYPtewZ6KEXJyJADEwRT"
}
{
"token": "eop57k1boA7nnYPtewZ6KEXJyJADEwRT"
}
{
"token": "eop57k1boA7nnYPtewZ6KEXJyJADEwRT"
}
{
"token": "eop57k1boA7nnYPtewZ6KEXJyJADEwRT"
}
{
"token": "eop57k1boA7nnYPtewZ6KEXJyJADEwRT"
}
{
"token": "eop57k1boA7nnYPtewZ6KEXJyJADEwRT"
}
{
"token": "eop57k1boA7nnYPtewZ6KEXJyJADEwRT"
}
Список дополнительных параметров
Вы можете передавать в токене в объекте custom_parameters дополнительные параметры, которые могут использоваться для настройки антифрод-фильтров. Рекомендуемые параметры приведены в таблице ниже, при необходимости данный список можно расширить.
Параметр | Тип | Описание |
---|---|---|
registration_date | string | Дата регистрации аккаунта согласно стандарту ISO 8601. |
total_hours | integer | Общее количество часов, проведенных в игре. |
total_characters | integer | Количество персонажей игрока. |
social_networks_added | boolean | Подключил ли игрок профили в социальных сетях. |
profile_image_added | boolean | Загрузил ли игрок изображение профиля. |
active_date | string | Дата последнего посещения согласно стандарту ISO 8601. |
total_friends | integer | Количество друзей игрока. |
additional_verification | boolean | Использует ли игрок дополнительные способы защиты аккаунта. |
win_rate | integer | Рейтинг побед игрока. |
last_change_password_date | string | Дата последней смены пароля согласно стандарту ISO 8601. |
chat_activity | boolean | Пишет ли игрок в чате. |
forum_activity | boolean | Пишет ли игрок в форуме. |
total_bans | integer | Количество банов игрока в чате/на форуме. |
profile_completed | boolean | Добавил ли игрок дополнительную информацию в профиль. |
notifications_enabled | boolean | Подписался ли игрок на рассылку уведомлений. |
user_level | integer | Уровень игрока, репутация или ранг. |
karma_points | integer | Карма игрока. |
total_sum | float | Общая сумма платежей. |
non_premium_currency | float | Сумма непремиальной валюты игрока. |
total_game_events | integer | Количество внутриигровых событий, в которых участвовал игрок. |
total_gifts | integer | Количество подарков, отправленных или полученных игроком. |
tutorial_completed | boolean | Завершил ли игрок обучение в игре. |
completed_tasks | integer | Количество выполненных заданий. |
items_used | boolean | Использует ли игрок купленные в игре предметы. |
pvp_activity | boolean | Участвует ли игрок в PvP. |
total_clans | integer | Количество кланов, в которых состоит игрок. |
unlocked_achievements | integer | Количество разблокированных умений. |
total_inventory_value | float | Суммарная стоимость инвентаря во внутриигровой валюте. |
character_customized | boolean | Настраивал ли игрок персонажа. |
session_time | string | Период времени, который пользователь проводит в игре, согласно стандарту ISO 8601. |
Токенизация
Узнайте больше о настройке токенизации для вашего приложения в документации по продукту Платежи.
Список сохраненных платежных аккаунтов
Загрузка списка сохраненных платежных аккаунтов пользователя.
HTTP-ЗАПРОС
- http
GET https://api.xsolla.com/merchant/v2/projects/{project_id}/users/{user_id}/payment_accounts
Параметр | Тип | Описание |
---|---|---|
project_id | integer | ID проекта. |
user_id | string | ID пользователя. |
- http
- curl
- php
- C#
- python
- ruby
- java
- js
GET https://api.xsolla.com/merchant/v1/projects/{project_id}/users/{user_id}/payment_accounts
Headers:
Authorization: Basic <your_authorization_basic_key>
curl --request GET \
--url https://api.xsolla.com/merchant/v1/projects/{project_id}/users/{user_id}/payment_accounts \
--header 'authorization: Basic <your_authorization_basic_key> '
<?php
$client = new http\Client;
$request = new http\Client\Request;
$request->setRequestUrl('https://api.xsolla.com/merchant/v1/projects/{project_id}/users/{user_id}/payment_accounts');
$request->setRequestMethod('GET');
$request->setHeaders(array(
'authorization' => 'Basic <your_authorization_basic_key> '
));
$client->enqueue($request)->send();
$response = $client->getResponse();
echo $response->getBody();
var client = new RestClient("https://api.xsolla.com/merchant/v1/projects/{project_id}/users/{user_id}/payment_accounts");
var request = new RestRequest(Method.GET);
request.AddHeader("authorization", "Basic <your_authorization_basic_key> ");
IRestResponse response = client.Execute(request);
import http.client
conn = http.client.HTTPSConnection("api.xsolla.com")
headers = { 'authorization': "Basic <your_authorization_basic_key> " }
conn.request("GET", "/merchant/v1/projects/{project_id}/users/{user_id}/payment_accounts", headers=headers)
res = conn.getresponse()
data = res.read()
print(data.decode("utf-8"))
require 'uri'
require 'net/http'
url = URI("https://api.xsolla.com/merchant/v1/projects/{project_id}/users/{user_id}/payment_accounts")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
request = Net::HTTP::Get.new(url)
request["authorization"] = 'Basic <your_authorization_basic_key> '
response = http.request(request)
puts response.read_body
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://api.xsolla.com/merchant/v1/projects/{project_id}/users/{user_id}/payment_accounts")
.get()
.addHeader("authorization", "Basic <your_authorization_basic_key> ")
.build();
Response response = client.newCall(request).execute();
var data = null;
var xhr = new XMLHttpRequest();
xhr.withCredentials = true;
xhr.addEventListener("readystatechange", function () {
if (this.readyState === this.DONE) {
console.log(this.responseText);
}
});
xhr.open("GET", "https://api.xsolla.com/merchant/v1/projects/{project_id}/users/{user_id}/payment_accounts");
xhr.setRequestHeader("authorization", "Basic <your_authorization_basic_key> ");
xhr.send(data);
[
{
"id": 4612345,
"name": "PP_saved_account",
"payment_system": {
"id": 24,
"name": "PayPal"
},
"type": "paypal"
}
]
[
{
"id": 4612345,
"name": "PP_saved_account",
"payment_system": {
"id": 24,
"name": "PayPal"
},
"type": "paypal"
}
]
[
{
"id": 4612345,
"name": "PP_saved_account",
"payment_system": {
"id": 24,
"name": "PayPal"
},
"type": "paypal"
}
]
[
{
"id": 4612345,
"name": "PP_saved_account",
"payment_system": {
"id": 24,
"name": "PayPal"
},
"type": "paypal"
}
]
[
{
"id": 4612345,
"name": "PP_saved_account",
"payment_system": {
"id": 24,
"name": "PayPal"
},
"type": "paypal"
}
]
[
{
"id": 4612345,
"name": "PP_saved_account",
"payment_system": {
"id": 24,
"name": "PayPal"
},
"type": "paypal"
}
]
[
{
"id": 4612345,
"name": "PP_saved_account",
"payment_system": {
"id": 24,
"name": "PayPal"
},
"type": "paypal"
}
]
[
{
"id": 4612345,
"name": "PP_saved_account",
"payment_system": {
"id": 24,
"name": "PayPal"
},
"type": "paypal"
}
]
Оплата по сохраненному платежному аккаунту
Оплата по сохраненному платежному аккаунту.
HTTP-ЗАПРОС
- http
POST https://api.xsolla.com/merchant/v2/projects/{project_id}/users/{user_id}/payments/{type}/{account_id}
Параметр | Тип | Описание |
---|---|---|
project_id | integer | ID проекта. Обязательный. |
user_id | string | ID пользователя. Обязательный. |
type | string | Тип платежного аккаунта. Обязательный. Возможные значения: card — банковские карты, amazon — Amazon Pay, skrill — Skrill Digital Wallet, yandex — Яндекс.Деньги, paymasterwebmoney — WebMoney, paypal — PayPal, qiwi — QIWI Кошелек. В случае успешного ответа (HTTP код — 200) запрос возвращает идентификатор транзакции и ее текущий статус. Возможные статусы:
|
account_id | integer | Идентификатор сохраненного платежного аккаунта в базе данных Иксоллы. Обязательный. |
user | object | Объект с информацией о пользователе. |
user.ip | string | IP адрес пользователя. Обязательный. |
user.name | string | Имя пользователя. |
user.legal | object | Объект с реквизитами юридического лица. |
user.legal.name | string | Полное юридическое наименование. |
user.legal.address | string | Полный юридический адрес. |
user.legal.vat_id | string | Индивидуальный идентификатор налогоплательщика. |
user.legal.country | string | Страна регистрации. Используется двухбуквенное обозначение страны согласно стандарту ISO 3166-1 alpha-2. |
purchase | object | Объект с информацией о заказе. |
purchase.virtual_currency | object | Объект с данными о виртуальной валюте. |
purchase.virtual_currency.quantity | float | Количество виртуальной валюты в заказе. |
purchase.checkout | object | Объект с информацией о заказе. |
purchase.checkout.currency | string | Валюта заказа. Используется трехбуквенное обозначение валюты согласно стандарту ISO 4217. |
purchase.checkout.amount | float | Сумма заказа. |
settings | object | Объект с данными о настройках. |
settings.mode | string | Передайте значение sandbox, чтобы провести тестовые платежи. Для проведения реальных платежей этот параметр необходимо убрать. |
custom_parameters | string | Ваши дополнительные параметры. Параметры передаются в json хеше парами ключ-значение. |
- http
- curl
- php
- C#
- python
- ruby
- java
- js
POST https://api.xsolla.com/merchant/v1/projects/{project_id}/users/{user_id}/payments/{type}/{account_id}
Headers:
Authorization: Basic <your_authorization_basic_key>
Content-Type: application/json
Body:
{
"card": {
"cvn": "123"
},
"purchase": {
"description": {
"value": "currency purchase"
},
"virtual_currency": {
"quantity": 100
}
},
"settings": {
"currency": "USD",
"external_id": "ext123",
"save": true
},
"user": {
"id": "user123",
"ip": "111.11.11.11",
"name": "John Smith",
"legal" : {
"name": "My Awesome Company",
"address": "17 Crown Street London SW2 0JW United Kingdom",
"vat_id": "GB111111111",
"country": "GB"
}
}
curl --request POST \
--url https://api.xsolla.com/merchant/v1/projects/{project_id}/users/{user_id}/payments/{type}/{account_id} \
--header 'authorization: Basic <your_authorization_basic_key>' \
--header 'content-type: application/json' \
--data '{"user":{"id":"user123","ip":"111.11.11.11","name":"John Smith","legal":{"name":"My Awesome Company","address":"17 Crown Street London SW2 0JW United Kingdom","vat_id":"GB111111111","country":" GB"}},"card":{"cvn":"123"},"purchase":{"virtual_currency":{"quantity":100},"description":{"value":"currency purchase"}},"settings":{"save":true,"currency":"USD","external_id":"ext123"}}'
<?php
$client = new http\Client;
$request = new http\Client\Request;
$body = new http\Message\Body;
$body->append('{"user":{"id":"user123","ip":"111.11.11.11","name":"John Smith","legal":{"name":"My Awesome Company","address":"17 Crown Street London SW2 0JW United Kingdom","vat_id":"GB111111111","country":" GB"}},"card":{"cvn":"123"},"purchase":{"virtual_currency":{"quantity":100},"description":{"value":"currency purchase"}},"settings":{"save":true,"currency":"USD","external_id":"ext123"}}');
$request->setRequestUrl('https://api.xsolla.com/merchant/v1/projects/{project_id}/users/{user_id}/payments/{type}/{account_id}');
$request->setRequestMethod('POST');
$request->setBody($body);
$request->setHeaders(array(
'authorization' => 'Basic <your_authorization_basic_key>',
'content-type' => 'application/json'
));
$client->enqueue($request)->send();
$response = $client->getResponse();
echo $response->getBody();
var client = new RestClient("https://api.xsolla.com/merchant/v1/projects/{project_id}/users/{user_id}/payments/{type}/{account_id}");
var request = new RestRequest(Method.POST);
request.AddHeader("authorization", "Basic <your_authorization_basic_key>");
request.AddHeader("content-type", "application/json");
request.AddParameter("application/json", "{\"user\":{\"id\":\"user123\",\"ip\":\"111.11.11.11\",\"name\":\"John Smith\",\"legal\":{\"name\":\"My Awesome Company\",\"address\":\"17 Crown Street London SW2 0JW United Kingdom\",\"vat_id\":\"GB111111111\",\"country\":\"GB\"}},\"card\":{\"cvn\":\"123\"},\"purchase\":{\"virtual_currency\":{\"quantity\":100},\"description\":{\"value\":\"currency purchase\"}},\"settings\":{\"save\":true,\"currency\":\"USD\",\"external_id\":\"ext123\"}}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
import http.client
conn = http.client.HTTPSConnection("api.xsolla.com")
payload = "{\"user\":{\"id\":\"user123\",\"ip\":\"111.11.11.11\",\"name\":\"John Smith\",\"legal\":{\"name\":\"My Awesome Company\",\"address\":\"17 Crown Street London SW2 0JW United Kingdom\",\"vat_id\":\"GB111111111\",\"country\":\"GB\"}},\"card\":{\"cvn\":\"123\"},\"purchase\":{\"virtual_currency\":{\"quantity\":100},\"description\":{\"value\":\"currency purchase\"}},\"settings\":{\"save\":true,\"currency\":\"USD\",\"external_id\":\"ext123\"}}"
headers = {
'content-type': "application/json",
'authorization': "Basic <your_authorization_basic_key>"
}
conn.request("POST", "/merchant/v1/projects/{project_id}/users/{user_id}/payments/{type}/{account_id}", payload, headers)
res = conn.getresponse()
data = res.read()
print(data.decode("utf-8"))
require 'uri'
require 'net/http'
url = URI("https://api.xsolla.com/merchant/v1/projects/{project_id}/users/{user_id}/payments/{type}/{account_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
request = Net::HTTP::Post.new(url)
request["content-type"] = 'application/json'
request["authorization"] = 'Basic <your_authorization_basic_key>'
request.body = "{\"user\":{\"id\":\"user123\",\"ip\":\"111.11.11.11\",\"name\":\"John Smith\",\"legal\":{\"name\":\"My Awesome Company\",\"address\":\"17 Crown Street London SW2 0JW United Kingdom\",\"vat_id\":\"GB111111111\",\"country\":\"GB\"}},\"card\":{\"cvn\":\"123\"},\"purchase\":{\"virtual_currency\":{\"quantity\":100},\"description\":{\"value\":\"currency purchase\"}},\"settings\":{\"save\":true,\"currency\":\"USD\",\"external_id\":\"ext123\"}}"
response = http.request(request)
puts response.read_body
OkHttpClient client = new OkHttpClient();
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\"user\":{\"id\":\"user123\",\"ip\":\"111.11.11.11\",\"name\":\"John Smith\",\"legal\":{\"name\":\"My Awesome Company\",\"address\":\"17 Crown Street London SW2 0JW United Kingdom\",\"vat_id\":\"GB111111111\",\"country\":\"GB\"}},\"card\":{\"cvn\":\"123\"},\"purchase\":{\"virtual_currency\":{\"quantity\":100},\"description\":{\"value\":\"currency purchase\"}},\"settings\":{\"save\":true,\"currency\":\"USD\",\"external_id\":\"ext123\"}}");
Request request = new Request.Builder()
.url("https://api.xsolla.com/merchant/v1/projects/{project_id}/users/{user_id}/payments/{type}/{account_id}")
.post(body)
.addHeader("content-type", "application/json")
.addHeader("authorization", "Basic <your_authorization_basic_key>")
.build();
Response response = client.newCall(request).execute();
var data = JSON.stringify({
"user": {
"id": "user123",
"ip": "111.11.11.11",
"name": "John Smith",
"legal" : {
"name": "My Awesome Company",
"address": "17 Crown Street London SW2 0JW United Kingdom",
"vat_id": "GB111111111",
"country": "GB"
},
},
"card": {
"cvn": "123"
},
"purchase": {
"virtual_currency": {
"quantity": 100
},
"description": {
"value": "currency purchase"
}
},
"settings": {
"save": true,
"currency": "USD",
"external_id": "ext123"
}
});
var xhr = new XMLHttpRequest();
xhr.withCredentials = true;
xhr.addEventListener("readystatechange", function () {
if (this.readyState === this.DONE) {
console.log(this.responseText);
}
});
xhr.open("POST", "https://api.xsolla.com/merchant/v1/projects/{project_id}/users/{user_id}/payments/{type}/{account_id}");
xhr.setRequestHeader("content-type", "application/json");
xhr.setRequestHeader("authorization", "Basic <your_authorization_basic_key>");
xhr.send(data);
{
"transaction_id": 123458390
}
{
"transaction_id": 123458390
}
{
"transaction_id": 123458390
}
{
"transaction_id": 123458390
}
{
"transaction_id": 123458390
}
{
"transaction_id": 123458390
}
{
"transaction_id": 123458390
}
{
"transaction_id": 123458390
}
Удаление сохраненного платежного аккаунта
Удаление сохраненного платежного аккаунта.
HTTP-ЗАПРОС
- http
DELETE https://api.xsolla.com/merchant/v2/projects/{project_id}/users/{user_id}/payment_accounts/{type}/{account_id}
Параметр | Тип | Описание |
---|---|---|
project_id | integer | ID проекта. |
user_id | string | ID пользователя. |
type | string | Тип платежного аккаунта. Возможные значения: card — банковские карты, amazon — Amazon Pay, skrill — Skrill Digital Wallet, yandex — Яндекс.Деньги, paymasterwebmoney — WebMoney, paypal — PayPal, qiwi — QIWI Кошелек. В случае успешного ответа (HTTP код — 200) запрос возвращает идентификатор транзакции и ее текущий статус. Возможные статусы:
|
account_id | integer | Идентификатор сохраненного платежного аккаунта в базе данных Иксоллы. |
- http
- curl
- php
- C#
- python
- ruby
- java
- js
DELETE https://api.xsolla.com/merchant/v1/projects/{project_id}/users/{user_id}/payment_accounts/{type}/{account_id}
Headers:
Authorization: Basic <your_authorization_basic_key>
curl --request DELETE \
--url https://api.xsolla.com/merchant/v1/projects/{project_id}/users/{user_id}/payment_accounts/{type}/{account_id} \
--header 'authorization: Basic <your_authorization_basic_key>'
<?php
$client = new http\Client;
$request = new http\Client\Request;
$request->setRequestUrl('https://api.xsolla.com/merchant/v1/projects/{project_id}/users/{user_id}/payment_accounts/{type}/{account_id}');
$request->setRequestMethod('DELETE');
$request->setHeaders(array(
'authorization' => 'Basic <your_authorization_basic_key>'
));
$client->enqueue($request)->send();
$response = $client->getResponse();
echo $response->getBody();
var client = new RestClient("https://api.xsolla.com/merchant/v1/projects/{project_id}/users/{user_id}/payment_accounts/{type}/{account_id}");
var request = new RestRequest(Method.DELETE);
request.AddHeader("authorization", "Basic <your_authorization_basic_key>");
IRestResponse response = client.Execute(request);
import http.client
conn = http.client.HTTPSConnection("api.xsolla.com")
headers = { 'authorization': "Basic <your_authorization_basic_key>" }
conn.request("DELETE", "/merchant/v1/projects/{project_id}/users/{user_id}/payment_accounts/{type}/{account_id}", headers=headers)
res = conn.getresponse()
data = res.read()
print(data.decode("utf-8"))
require 'uri'
require 'net/http'
url = URI("https://api.xsolla.com/merchant/v1/projects/{project_id}/users/{user_id}/payment_accounts/{type}/{account_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
request = Net::HTTP::Delete.new(url)
request["authorization"] = 'Basic <your_authorization_basic_key>'
response = http.request(request)
puts response.read_body
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://api.xsolla.com/merchant/v1/projects/{project_id}/users/{user_id}/payment_accounts/{type}/{account_id}")
.delete(null)
.addHeader("authorization", "Basic <your_authorization_basic_key>")
.build();
Response response = client.newCall(request).execute();
var data = null;
var xhr = new XMLHttpRequest();
xhr.withCredentials = true;
xhr.addEventListener("readystatechange", function () {
if (this.readyState === this.DONE) {
console.log(this.responseText);
}
});
xhr.open("DELETE", "https://api.xsolla.com/merchant/v1/projects/{project_id}/users/{user_id}/payment_accounts/{type}/{account_id}");
xhr.setRequestHeader("authorization", "Basic <your_authorization_basic_key>");
xhr.send(data);