Подключите Buy Button через Mobile SDK
Почему это важно

После недавних изменений в политике Apple в отдельных регионах разработчикам разрешено направлять пользователей из приложений на внешние сайты для приема оплаты за виртуальные товары.
Теперь можно размещать кнопки, баннеры, сообщения и другие элементы, которые перенаправляют пользователей напрямую из игры к оплате товара в браузере (в ваш Web Shop или платежный интерфейс) в один клик, без риска нарушить правила Apple.
Интеграция Buy Button через Mobile SDK подходит вам, если вы хотите перенаправлять пользователя из игры к форме оплаты товара и получить больше контроля над процессом покупки, включая:
- Гибкую кастомизации процесса покупки — от логики транзакций до визуального оформления.
- Поддержку бессерверной интеграции — SDK может работать без серверной части: обработка покупки и начисление товаров выполняются на клиенте, без использования вебхуков.
- Широкий выбор способов оплаты, включая оплату в один клик с помощью Apple Pay, обеспечивая быстрые и привычные сценарии покупки на мобильных устройствах.
Интеграция через Xsolla Mobile SDK также подходит вам, если вы используете собственный Web Shop не на базе Site Builder и заинтересованы в интеграции Pay Station в свою игру.
Рассмотрите интеграцию на основе Web Shop, если вам нужно быстрое low-code решение.
Как это работает
Это руководство описывает, как подключить Xsolla для обработки платежей через Xsolla Mobile SDK в соответствии с требованиями Apple.
Требования Apple:
Встроенные WebView для внешних покупок не допускаются — оплата должна производиться через Safari или другой стандартный браузер.
Внешние ссылки на покупки разрешены только для приложений, размещенных в американском App Store. Обратите внимание: в руководствах Apple указано, что
учитывается страна маркетплейса, а не фактическое местоположение пользователя .
Cценарий пользователя:
- Пользователь запускает игру на iOS-устройстве.
- Пользователь нажимает кнопку покупки рядом с нужным товаром.
- Приложение открывает ссылку на платежный интерфейс (Pay Station) с токеном оплаты в Safari (или другом стандартном браузере). SDK обрабатывает авторизацию и выбор товара.
- Xsolla автоматически авторизует пользователя. Открывается страница оплаты конкретного товара.
- Пользователь выбирает способ оплаты и завершает покупку.
- Pay Station перенаправляет пользователя обратно в приложение.
- Приложение получает подтверждение покупки через вебхук.
Быстрый старт
Регистрация в Личном кабинете и создание проекта
Личный кабинет — основной инструмент для настройки возможностей Xsolla, а также для работы с аналитикой и транзакциями.
Чтобы зарегистрироваться, перейдите в Личный кабинет и создайте учетную запись. Чтобы создать проект, нажмите Создать проект в боковом меню и заполните необходимые данные. Позже вы сможете изменить настройки проекта.

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

Настройка Xsolla Login
- В проекте в Личном кабинете перейдите в раздел Игроки > Авторизация.
- Нажмите Создать вариант авторизации.
- Выберите Стандартный вариант авторизации и нажмите Создать и настроить. Подождите, пока вариант авторизации не будет создан. Затем вы увидите страницу настроек варианта авторизации.
- В блоке Способы авторизации выберите любой вариант и нажмите Настроить.
- В верхнем блоке параметров нажмите Интеграция Login API.
- Установите переключатель Вход с ID устройства в положение Вкл.

- Нажмите Сохранить изменения.
В процессе интеграции вам понадобится Login ID. Чтобы его получить, нажмите название проекта Login в навигационной цепочке и затем кнопку Скопировать ID рядом с названием проекта.

Настройка внутриигровых покупок (виртуальных предметов)
Вы можете выбрать один из следующих способов для настройки каталога IAP:
- Импортируйте предметы: загрузите JSON-файл, чтобы быстро добавить каталог в Личный кабинет.
- Используйте запросы API: оптимально для автоматизированных или массовых обновлений.
Установка SDK
Xsolla Mobile SDK поставляется в виде XCFramework
с названием XsollaMobileSDK.xcframework
.
Чтобы установить SDK вручную в ваш Xcode-проект:
- Откройте ваш проект в Xcode.
- Выберите целевое приложение (target) и перейдите на вкладку General.
- В разделе Frameworks, Libraries, and Embedded Content перетащите файл
XsollaMobileSDK.xcframework
. - В раскрывающемся списке рядом с фреймворком выберите Embed & Sign.

Настройка SDK
Для настройки SDK понадобятся следующие идентификаторы из Личного кабинета:
- ID проекта. Отображается в Личном кабинете рядом с названием проекта.
- Login ID. Чтобы получить его, зайдите в Личный кабинет, перейдите в Игроки > Авторизация > Dashboard > проект Login, нажмите Скопировать ID.
В качестве отправной точки вы можете использовать тестовые идентификаторы.
settings.openExternalBrowser = YES;
(Objective-C) или settings.openExternalBrowser = true;
(Swift).obj-c
- obj-c
- swift
1#import <XsollaMobileSDK/StoreKitWrapper.h>
2
3SKPaymentSettings* settings = [[SKPaymentSettings alloc] initWithProjectId: 77640
4 loginProjectId:@"026201e3-7e40-11ea-a85b-42010aa80004"
5 platform: SKPaymentPlatformStandalone
6 paystationUIThemeId: SKPaystationThemeDark
7 paystationUISize: SKPaystationSizeMedium];
8
9settings.useSandbox = YES;
10settings.enablePayments = YES;
11settings.openExternalBrowser = YES;
12
13SKPaymentQueue* queue = [SKPaymentQueue defaultQueue];
14[queue startWithSettings: settings];
15[queue addTransactionObserver: self];
1import XsollaMobileSDK
2
3let settings = SKPaymentSettings(projectId: 77640,
4 loginProjectId: "026201e3-7e40-11ea-a85b-42010aa80004",
5 platform: .standalone)
6
7settings.useSandbox = true;
8settings.enablePayments = true;
9settings.openExternalBrowser = true;
10
11SKPaymentQueue.default().start(settings)
12SKPaymentQueue.default().add(self)
Настройка диплинка для возврата пользователя в приложение после покупки
Настройте URL-схему для целевого приложения:
- Выберите проект в навигаторе проекта.
- Выберите целевое приложение.
- Откройте вкладку Info.
- Нажмите кнопку ➕ в разделе URL Types.
- В поле URL Scheme укажите
$(PRODUCT_BUNDLE_IDENTIFIER)
.

Инициализация SDK
После настройки необходимо инициализировать Xsolla Mobile SDK и подключить его к сервисам Xsolla. Разместите эту логику в процессе инициализации приложения — например, в методе didFinishLaunchingWithOptions класса AppDelegate.
obj-c
- obj-c
- swift
1SKPaymentQueue* queue = [SKPaymentQueue defaultQueue];
2[queue startWithSettings: settings]; // settings from the previous step
3
4// conform your class to SKPaymentTransactionObserver and implement its method
5@interface YourClass (SKPaymentTransactionObserver) <SKPaymentTransactionObserver>
6@end
7
8@implementation YourClass (SKPaymentTransactionObserver)
9
10- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions {
11 for(SKPaymentTransaction *transaction in transactions) {
12 switch (transaction.transactionState) {
13 case SKPaymentTransactionStateFailed:
14 // purchase failed, present an error
15 break;
16 case SKPaymentTransactionStatePurchased:
17 // award the player with the purchase of the SKU - transaction.payment.productIdentifier
18 break;
19 default: break;
20 }
21 }
22}
23
24@end
1SKPaymentQueue.default().start(settings)
2SKPaymentQueue.default().add(self)
3
4// conform your class to SKPaymentTransactionObserver and implement its method
5extension YourClass: SKPaymentTransactionObserver {
6 func paymentQueue(_: SKPaymentQueue, updatedTransactions: [SKPaymentTransaction]) {
7 for transaction in updatedTransactions {
8 switch transaction.transactionState {
9 case .failed:
10 // purchase failed, present an error
11 case .purchased:
12 // award the player with the purchase of the SKU - transaction.payment.productIdentifier
13 default:
14 break
15 }
16 }
17 }
18}
После запуска SKPaymentQueue
и добавления наблюдателя транзакций приложение может запросить информацию о SKU следующим образом:
obj-c
- obj-c
- swift
1NSSet *skus = [NSSet setWithArray:@[@"your_sku1", @"your_sku2"]];
2SKProductsRequest* req = [[SKProductsRequest alloc] initWithProductIdentifiers:skus];
3
4req.delegate = self;
5[req start];
6
7// conform your class to SKProductsRequestDelegate and implement its method
8@interface YourClass (SKProductsRequestDelegate) <SKProductsRequestDelegate>
9@end
10
11@implementation YourClass (SKProductsRequestDelegate)
12
13- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response {
14 // save loaded products somewhere
15 self.products = response.products
16}
17
18@end
1let skus: Set<String> = ["your_sku1", "your_sku2"]
2let req = SKProductsRequest(productIdentifiers: skus)
3
4req.delegate = self
5req.start()
6
7// conform your class to SKProductsRequestDelegate and implement its method
8extension YourClass: SKProductsRequestDelegate {
9 func productsRequest(_ request: SKProductsRequest, didReceive response: SKProductsResponse) {
10 // save loaded products somewhere
11 self.products = response.products
12 }
13}
Совершение покупки
Процесс покупки включает несколько этапов: инициацию покупки, подтверждение покупки, начисление покупки.
Инициация покупки
Для начала покупки необходимо использовать ранее загруженный объект SKProduct
:
obj-c
- obj-c
- swift
1SKProduct *product = ...; // previously fetched product
2SKPayment *payment = [SKPayment paymentWithProduct:product];
3[[SKPaymentQueue defaultQueue] addPayment:payment];
1let product = ... // previously fetched product
2let payment = SKPayment(product: product)
3SKPaymentQueue.default().add(payment)
Подтверждение покупки
Каждую покупку следует подтверждать до того, как начислить ее пользователю, чтобы избежать несанкционированных транзакций.
запросов (S2S), исключающих клиента из процесса принятия решений. Это повышает безопасность и исключает возможные уязвимости.
Обычно проверка через S2S включает следующие шаги:
- Клиент приложения отправляет на сервер ID заказа, полученный при завершении транзакции на стороне клиента (обычно через callback-транзакции, подробные сведения приведены в разделе Инициация покупки).
- Сервер получает этот ID заказа и проверяет его подлинность с помощью вебхуков — уведомлений, отправляемых сервисами Xsolla после завершения покупки. Такой подход позволяет обрабатывать данные асинхронно, без постоянных запросов к серверу, и выполнять проверку в фоновом режиме (с кэшированием результата) еще до получения запроса от клиента. Подробная информация приведена в разделе Настройка вебхуков.
Начисление покупки
Завершающий этап процесса покупки — это выдача приобретенного товара пользователю и фиксация факта его получения. Этот этап также называют потреблением покупки (purchase consumption).
Результат покупки передается через функцию обратного вызова paymentQueue:updatedTransactions:
в Objective-C или paymentQueue(_:updatedTransactions:)
в Swift.
obj-c
- obj-c
- swift
1- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions {
2 for(SKPaymentTransaction *transaction in transactions) {
3 switch (transaction.transactionState) {
4 case SKPaymentTransactionStateFailed:
5 // Always acknowledge transaction and finish it
6 [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
7 break;
8 case SKPaymentTransactionStatePurchased:
9 // here you can save the purchase and award it to the user
10 // Always acknowledge transaction and finish it after it was saved
11 [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
12 break;
13 default: break;
14 }
15 }
16}
1func paymentQueue(_: SKPaymentQueue, updatedTransactions: [SKPaymentTransaction]) {
2 for transaction in updatedTransactions {
3 switch transaction.transactionState {
4 case .failed:
5 // Always acknowledge transaction and finish it
6 SKPaymentQueue.default().finishTransaction(transaction)
7 case .purchased:
8 // here you can save the purchase and award it to the user
9 // Always acknowledge transaction and finish it after it was saved
10 SKPaymentQueue.default().finishTransaction(transaction)
11 default:
12 break
13 }
14 }
15}
Настройка вебхуков
Вебхуки — это уведомления о событиях, происходящих в системе. Когда происходит определенное событие, Xsolla отправляет HTTP-запрос с данными об этом событии на сервер вашей игры. Вебхуки необходимы для информирования клиента игры и/или сервера о статусе платежей (успешных и неуспешных), а также о попытках аутентификации пользователей.
Включить получение вебхуков
- В проекте в Личном кабинете перейдите в раздел Настройки проекта > Вебхуки.
- В поле Сервер для вебхуков укажите адрес сервера, на который вы хотите получать вебхуки (формат:
https://example.com
). Также можно указать тестовый URL, полученный в инструменте для тестирования вебхуков. - Секретный ключ проекта для подписи вебхуков генерируется по умолчанию. Если вы хотите изменить его, нажмите значок обновления.
- Нажмите Получать вебхуки.

Тестирование вебхуков
Во вкладке Payments and Store вы можете протестировать следующие вебхуки:
Проверка пользователя (“notification_type”:“user_validation”):
- curl
1curl -v 'https://your.hostname/your/uri' \
2-X POST \
3-H 'Accept: application/json' \
4-H 'Content-Type: application/json' \
5-H 'Authorization: Signature 13342703ccaca5064ad33ba451d800c5e823db8f' \
6-d '{
7 "notification_type":"user_validation",
8 "settings": {
9 "project_id": 18404,
10 "merchant_id": 2340
11 },
12 "user": {
13 "ip": "127.0.0.1",
14 "phone": "18777976552",
15 "email": "email@example.com",
16 "id": "1234567",
17 "name": "John Smith",
18 "country": "US"
19 }
20}'
Успешная оплата заказа (“notification_type”: “order_paid”):
- curl
1curl -v 'https://your.hostname/your/uri' \
2-X POST \
3-H 'Accept: application/json' \
4-H 'Content-Type: application/json' \
5-H 'Authorization: Signature d09695066c52c1b8bdae92f2d6eb59f5b5f89843' \
6-d '{
7 "notification_type": "order_paid",
8 "items": [
9 {
10 "sku": "com.xsolla.item_1",
11 "type": "virtual_good",
12 "is_pre_order": false,
13 "quantity": 3,
14 "amount": "1000",
15 "promotions": [
16 {
17 "amount_without_discount": "6000",
18 "amount_with_discount": "5000",
19 "sequence": 1
20 },
21 {
22 "amount_without_discount": "5000",
23 "amount_with_discount": "4000",
24 "sequence": 2
25 }
26 ],
27 "custom_attributes":
28 {
29 "purchased": 0,
30 "attr": "value"
31 }
32 },
33 {
34 "sku": "com.xsolla.item_new_1",
35 "type": "bundle",
36 "is_pre_order": false,
37 "quantity": 1,
38 "amount": "1000",
39 "promotions": []
40 },
41 {
42 "sku": "com.xsolla.gold_1",
43 "type": "virtual_currency",
44 "is_pre_order": false,
45 "quantity": 1500,
46 "amount": null,
47 "promotions": []
48 }
49 ],
50 "order": {
51 "id": 1,
52 "mode": "default",
53 "currency_type": "virtual",
54 "currency": "sku_currency",
55 "amount": "2000",
56 "status": "paid",
57 "platform": "xsolla",
58 "comment": null,
59 "invoice_id": "1",
60 "promotions": [
61 {
62 "amount_without_discount": "4000",
63 "amount_with_discount": "2000",
64 "sequence": 1
65 }
66 ],
67 "promocodes": [
68 {
69 "code": "promocode_some_code",
70 "external_id": "promocode_sku"
71 }
72 ],
73 "coupons": [
74 {
75 "code": "WINTER2021",
76 "external_id": "coupon_sku"
77 }
78 ]
79 },
80 "user": {
81 "external_id": "id_xsolla_login_1",
82 "email": "gc_user@xsolla.com"
83 },
84 "billing": {
85 "notification_type": "payment",
86 "settings": {
87 "project_id": 18404,
88 "merchant_id": 2340
89 },
90 "purchase": {
91 "subscription": {
92 "plan_id": "b5dac9c8",
93 "subscription_id": "10",
94 "product_id": "Demo Product",
95 "date_create": "2014-09-22T19:25:25+04:00",
96 "date_next_charge": "2014-10-22T19:25:25+04:00",
97 "currency": "USD",
98 "amount": 9.99
99 },
100 "total": {
101 "currency": "USD",
102 "amount": 200
103 },
104 "promotions": [{
105 "technical_name": "Demo Promotion",
106 "id": 853
107 }],
108 "coupon": {
109 "coupon_code": "ICvj45S4FUOyy",
110 "campaign_code": "1507"
111 }
112 },
113 "transaction": {
114 "id": 1,
115 "external_id": 1,
116 "payment_date": "2014-09-24T20:38:16+04:00",
117 "payment_method": 1,
118 "payment_method_name": "PayPal",
119 "payment_method_order_id": 1234567890123456789,
120 "dry_run": 1,
121 "agreement": 1
122 },
123 "payment_details": {
124 "payment": {
125 "currency": "USD",
126 "amount": 230
127 },
128 "vat": {
129 "currency": "USD",
130 "amount": 0,
131 "percent": 20
132 },
133 "sales_tax": {
134 "currency": "USD",
135 "amount": 0,
136 "percent": 0
137 },
138 "direct_wht": {
139 "currency": "USD",
140 "amount": 0,
141 "percent": 0
142 },
143 "payout_currency_rate": "1",
144 "payout": {
145 "currency": "USD",
146 "amount": 200
147 },
148 "country_wht": {
149 "currency": "USD",
150 "amount": 2,
151 "percent": 10
152 },
153 "user_acquisition_fee": {
154 "currency": "USD",
155 "amount": 2,
156 "percent": 1
157 },
158 "xsolla_fee": {
159 "currency": "USD",
160 "amount": 10
161 },
162 "payment_method_fee": {
163 "currency": "USD",
164 "amount": 20
165 },
166 "repatriation_commission": {
167 "currency": "USD",
168 "amount": 10
169 }
170 }
171 }
172 ,
173 "custom_parameters": {
174 "parameter1": "value1",
175 "parameter2": "value2"
176 }
177}'
Тестирование в sandbox-режиме
Этот раздел содержит примеры кода, демонстрирующие, как настроить sandbox-среду для тестирования платежей, включения подробного логирования и других задач.
Активация sandbox-режима
obj-c
- obj-c
- swift
1SKPaymentSettings* settings = ...;
2
3settings.useSandbox = YES;
1let settings = SKPaymentSettings(...)
2
3settings.useSandbox = true
Включение расширенного логирования
obj-c
- obj-c
- swift
1SKPaymentSettings* settings = ...;
2
3settings.logLevel = SKLogLevelDebug;
1let settings = SKPaymentSettings(...)
2
3settings.logLevel = .debug
Тестовые банковские карты
Список карт, с помощью которых можно симулировать платеж в sandbox-режиме, доступен в разделе Список тестовых банковских карт.
Запуск
- Чтобы подписать соглашение, в Личном кабинете перейдите в раздел Договоры и налоги > Договоры и заполните форму.
- Затем установите параметр
sandbox
в значениеfalse
в конфигурации SDK.
obj-c
- obj-c
- swift
1SKPaymentSettings* settings = ...;
2
3settings.useSandbox = NO;
4settings.logLevel = SKLogLevelError;
1let settings = SKPaymentSettings(...)
2
3settings.useSandbox = false
4settings.logLevel = .error
Как определить регион iOS storefront
Чтобы определить текущий регион App Store (региональную витрину или iOS storefront) и адаптировать работу SDK под нужную страну, используйте следующий код:
obj-c
- obj-c
- swift
1[SKPaymentQueue loadCurrentStorefrontCountryCodeWithCompletion:^(NSString* _Nullable countryCode) {
2 settings.enablePayments = countryCode && [countryCode isEqualToString:@"USA"];
3
4 [[SKPaymentQueue defaultQueue] startWithSettings:settings];
5}];
1SKPaymentQueue.loadCurrentStorefrontCountryCode { countryCode in
2 settings.enablePayments = countryCode == "USA"
3
4 SKPaymentQueue.default().start(settings)
5}
Метод loadCurrentStorefrontCountryCode
асинхронно возвращает код страны (три символа) для текущей региональной витрины. Это позволяет включать или отключать функции SDK в зависимости от региона.
В качестве альтернативы можно использовать встроенный нативный класс Apple — Storefront, как показано ниже:
SKStorefront
в Objective-C, так как она загружает данные синхронно и может блокировать главный поток. Это может привести к зависанию интерфейса и ухудшению пользовательского опыта, как указано в официальной документации Apple.- swift
1let storefront = await Storefront.current
2let countryCode = storefront?.countryCode
3
4settings.enablePayments = countryCode == "USA"
5
6SKPaymentQueue.default().start(settings)
Как это работает
Это руководство описывает, как подключить Xsolla для обработки платежей через Xsolla API в соответствии с требованиями Apple.
Требования Apple:
Встроенные WebView для внешних покупок не допускаются — оплата должна производиться через Safari или другой стандартный браузер.
Внешние ссылки на покупки разрешены только для приложений, размещенных в американском App Store. Обратите внимание: в руководствах Apple указано, что
учитывается страна маркетплейса, а не фактическое местоположение пользователя .
Cценарий пользователя:
- Пользователь запускает игру на iOS-устройстве.
- Пользователь нажимает кнопку покупки рядом с нужным товаром.
- Приложение открывает ссылку на платежный интерфейс (Pay Station) с токеном оплаты в Safari (или другом стандартном браузере).
- Открывается страница оплаты конкретного товара.
- Пользователь выбирает способ оплаты и завершает покупку.
- Pay Station перенаправляет пользователя обратно в приложение.
- Приложение получает подтверждение покупки через вебхук.
Быстрый старт
Регистрация в Личном кабинете и создание проекта
Личный кабинет — основной инструмент для настройки возможностей Xsolla, а также для работы с аналитикой и транзакциями.
Чтобы зарегистрироваться, перейдите в Личный кабинет и создайте учетную запись. Чтобы создать проект, нажмите Создать проект в боковом меню и заполните необходимые данные. Позже вы сможете изменить настройки проекта.

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

Настройка внутриигровых покупок (виртуальных предметов)
Вы можете выбрать один из следующих способов для настройки каталога IAP:
- Импортируйте предметы: загрузите JSON-файл, чтобы быстро добавить каталог в Личный кабинет.
- Создать каталог товаров с помощью методов API из раздела документации Виртуальные предметы и валюта > Admin.
Настройка универсальных ссылок (universal links)
Универсальные ссылки — это ссылки вида https://your-site.com/your-game
, которые открываются в приложении, если оно установлено на устройстве пользователя, или в браузере, если приложение не установлено.
Чтобы настроить универсальные ссылки:
- Добавьте верификационный файл для вашего домена в корень веб-сайта. Например,
https://your-site.com/apple-app-site-association
. - В вашем проекте Xcode, перейдите в раздел
Signing & Capabilities > Associated Domains и добавьтеapplinks:your-site.com
.
Настройка редиректов для перенаправления пользователей в игру после покупки
- Откройте проект в Личном кабинете и перейдите в раздел Платежи > Платежный интерфейс > Настройки > Политика редиректа.
- В поле Return URL введите URL-адрес страницы или путь в приложении (диплинк), на который пользователь должен переходить после совершения платежа. Этот URL-адрес должен поддерживать универсальные ссылки. Для улучшения пользовательского опыта в мобильном приложении игры мы рекомендуем указывать диплинки в качестве return URL.
- В раскрывающемся списке Условия для автоматического редиректа выберите необходимое условие.
- В раскрывающемся списке Условия для ручного редиректа выберите Нет — редирект не происходит.
- Нажмите Сохранить.
Определение региона iOS storefront
В настоящее время внешние платежные системы разрешены только в США. Чтобы определить текущий регион приложения, используйте следующий код:
- swift
1let storefront = await Storefront.current
2let countryCode = storefront?.countryCode
3
4settings.enablePayments = countryCode == "USA"
5
6SKPaymentQueue.default().start(settings)
Метод loadCurrentStorefrontCountryCode
асинхронно возвращает код страны (три символа) для текущей региональной витрины.
Совершение покупки
Создание заказа на серверной стороне приложения
Клиент приложения делает запрос к вашему серверу, чтобы получить платежный токен:
- swift
1struct TokenRequest: Codable {
2 let sku: String
3 let userId: String
4}
5
6func fetchPaymentToken(for sku: String, userId: String, completion: @escaping (Result<String, Error>) -> Void) {
7 let req = TokenRequest(sku: sku, userId: userId)
8 guard let url = URL(string: "https://your-backend.com/xsolla/create_token") else { return }
9 var request = URLRequest(url: url)
10 request.httpMethod = "POST"
11 request.setValue("application/json", forHTTPHeaderField: "Content-Type")
12 request.httpBody = try? JSONEncoder().encode(req)
13 URLSession.shared.dataTask(with: request) { data, _, error in
14 if let error = error {
15 completion(.failure(error)); return
16 }
17 let token = try! JSONDecoder().decode([String: String].self, from: data!)["token"]!
18 completion(.success(token))
19 }.resume()
20}
Чтобы на стороне Xsolla сформировать заказ с данными о пользователе и товаре, используйте метод API Создание платежного токена для покупки. Метод вернет платежный токен, который потребуется для открытия платежного интерфейса и совершения оплаты. Чтобы получить доступ к тестовому окружению, передайте параметр “sandbox”: true
.
Открытие платежного интерфейса
После получения токена, сформируйте ссылку для открытия платежного интерфейса в браузере по следующему URL-адресу: https://secure.xsolla.com/paystation4/?token=TOKEN
, где TOKEN
— полученный токен.
- swift
1func openPayStation(token: String) {
2 let urlString = "https://secure.xsolla.com/paystation4/?token=\(token)"
3 guard let url = URL(string: urlString) else { return }
4 UIApplication.shared.open(url, options: [:], completionHandler: nil)
5}
Для тестирования процесса оплаты вы можете использовать тестовое окружение (sandbox-режим). Это автономная рабочая среда, в которой доступны все функции live-режима, кроме проведения реальных платежей и отмены платежей. В тестовом окружении вы можете протестировать совершение как разовой оплаты, так и оплаты сохраненными способами с помощью банковских карт и PayPal.
Возврат пользователя в приложение
После успешного платежа, выполните возвращение пользователя в ваше приложение с помощью универсальных ссылок. Для обработки редиректа, реализуйте следующий метод в SceneDelegate
или AppDelegate
:
- swift
1func scene(_ scene: UIScene, continue userActivity: NSUserActivity) {
2 guard userActivity.activityType == NSUserActivityTypeBrowsingWeb,
3 let url = userActivity.webpageURL,
4 url.host == "your-site.com",
5 url.path.starts(with: "/payment_callback_success") else { return }
6 // Extract parameters (e.g., status, transaction_id)
7 let components = URLComponents(url: url, resolvingAgainstBaseURL: false)
8 let queryItems = components?.queryItems
9 let status = queryItems?.first { $0.name == "status" }?.value
10 handlePaymentResult(status: status)
11}
Настройка вебхуков
- В проекте в Личном кабинете перейдите в раздел Настройки проекта > Вебхуки.
- В поле Сервер для вебхуков укажите адрес сервера, на который вы хотите получать вебхуки (формат:
https://example.com
). Также можно указать тестовый URL, полученный в инструменте для тестирования вебхуков. - Секретный ключ проекта для подписи вебхуков генерируется по умолчанию. Если вы хотите изменить его, нажмите значок обновления.
- Нажмите Получать вебхуки.

Для полноценной работы внутриигрового магазина и управления платежами, необходимо реализовать обработку основных вебхуков:
Название вебхука | Описание |
---|---|
Проверка пользователей > Проверка существования пользователя (user_validation ) | Отправляется на разных этапах оплаты, чтобы удостовериться, что пользователь зарегистрирован в игре. |
Игровые сервисы > Объединенные вебхуки > Успешная оплата заказа (order_paid ) | Данные платежа, детали транзакции и информация о купленных товарах. Используйте данные вебхука для начисления товаров пользователю. |
Игровые сервисы > Объединенные вебхуки > Отмена заказа (order_canceled ) | Данные отмененного платежа, детали транзакции и информацию о купленных товарах. Используйте данные вебхука для списания купленных товаров у пользователя. |
Запуск
- Чтобы подписать соглашение, в Личном кабинете перейдите в раздел Договоры и налоги > Договоры и заполните форму.
- Пройдите налоговое интервью. Для этого в Личном кабинете перейдите в раздел Договоры и налоги > Налоговое интервью и заполните форму.
- Переключитесь на боевое окружение. Для этого удалите
“sandbox”: true
из запроса на получение токена.
Нашли опечатку или ошибку в тексте? Выделите ее и нажмите Ctrl+Enter.