Принимайте платежи в iOS-приложениях через Xsolla Pay Station
Почему это важно
В апреле 2025 года Apple обновила правила: теперь приложения, распространяемые в App Store США, могут содержать внешние ссылки, кнопки и другие элементы, которые перенаправляют пользователей на веб-сайт разработчика для покупки цифрового контента или сервисов.
Теперь вы можете размещать кнопки, баннеры и сообщения, которые позволяют игрокам перейти напрямую из игры к оплате предмета в браузере (в Web Shop или платежный интерфейс) в один клик, без риска нарушить правила Apple.

Вам больше не требуется создавать обходные сценарии, чтобы предоставить игрокам ссылку на свой сайт, или платить комиссию за внешние покупки.
И интеграция на основе Web Shop, и Xsolla Mobile SDK поддерживают широкий выбор платежных методов, включая Apple Pay — это обеспечивает игрокам привычный и удобный процесс оплаты.
Как выбрать между интеграцией на базе Web Shop и Xsolla Mobile SDK
Web Shop открывает платежный интерфейс для конкретного предмета в браузере на основе вашей текущей конфигурации Web Shop. Xsolla Mobile SDK также запускает платежный процесс в браузере, но предоставляет больше контроля над тем, как инициируется процесс и какие параметры передаются.
В большинстве случаев мы настоятельно рекомендуем использовать интеграцию на базе Web Shop. Она предлагает:
- Расширенные возможности игровой монетизации
Web Shop включает широкий набор встроенных функций монетизации, таких как скидки, бонусы, промокоды, персонализированные предложения, бесплатные предметы и многое другое. Эти функции настраиваются в Личном кабинете и применяются автоматически — без необходимости реализовывать дополнительную логику на стороне клиента или разрабатывать интерфейс.
- Быстрая реализация
Если у вас уже есть Web Shop, это самый простой вариант. Достаточно добавить в игру ссылку, которая откроет Web Shop с необходимыми параметрами.
Поскольку Web Shop не является частью кода вашего приложения, его не нужно обновлять через App Store. Это также упрощает выход на новые рынки по мере их появления.
- Полное соответствие обновленным требованиям Apple
Web Shop разработан в соответствии с требованиями Apple к внешним платежным процессам — он запускается в браузере вне приложения.
Xsolla Mobile SDK обеспечивает большую гибкость, но требует дополнительных усилий по разработке. Используйте SDK, если ваша интеграция требует:
- Расширенных методов аутентификации, выходящих за рамки возможностей Web Shop.
- Передачи дополнительных параметров (например, текущего состояния игры или метаданных сессии, таких как уровень, платформа и событие-триггер) — полезно для игровых сценариев, не поддерживаемых в Web Shop.
- Полной кастомизации процесса покупки, включая полный контроль над платежным интерфейсом и логикой транзакций.
При использовании SDK функции монетизации также доступны через API, но ответственность за реализацию бизнес-логики, расчет предложений и разработку пользовательского интерфейса лежит на разработчике.
Подробности о том, как использовать SDK в соответствии с требованиями Apple, приведены ниже.
Как это работает
Это руководство описывает, как подключить 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.
- Нажмите Создать вариант авторизации.
- Выберите Стандартный вариант авторизации и нажмите Создать и настроить. Подождите, пока вариант авторизации не будет создан. Затем вы увидите страницу настроек варианта авторизации.
- В блоке Способы авторизации выберите любой вариант и нажмите Настроить.
- В верхнем блоке параметров нажмите Интеграция 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. Чтобы получить его, зайдите в Личный кабинет, перейдите в Login > 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-запрос с данными об этом событии на сервер вашей игры. Вебхуки необходимы для информирования клиента игры и/или сервера о статусе платежей (успешных и неуспешных), а также о попытках аутентификации пользователей.
Включить получение вебхуков
1. В проекте в Личном кабинете перейдите в раздел Настройки проекта > Вебхуки. 2. В поле Сервер для вебхуков укажите адрес сервера, на который вы хотите получать вебхуки (формат:https://example.com
). Также можно указать тестовый URL, полученный в инструменте для тестирования вебхуков.
3. Секретный ключ проекта для подписи вебхуков генерируется по умолчанию. Если вы хотите изменить его, нажмите значок обновления.
4. Нажмите Получать вебхуки.
Тестирование вебхуков
Во вкладке 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 из разделов документации Общие > Каталог или Виртуальные предметы и валюта > Каталог.
Настройка универсальных ссылок (universal links)
- Добавьте верификационный файл для вашего домена в корень веб-сайта. Например,
https://your-site.com/apple-app-site-association
. - В вашем проекте Xcode, перейдите в раздел
Signing & Capabilities > Associated Domains и добавьтеapplinks:your-site.com
.
Настройка редиректов для перенаправления пользователей в игру после покупки
- Откройте проект в Личном кабинете и перейдите в раздел Pay Station > Настройки > Политика редиректа.
- В поле 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.