Acepte pagos desde la aplicación en dispositivos con iOS mediante Xsolla Pay Station
¿Por qué es importante?
En abril de 2025, Apple actualizó sus directrices para que las aplicaciones distribuidas en la App Store de EE. UU. puedan incluir enlaces externos, botones y otros elementos de llamada a la acción que redirijan a los usuarios a un sitio web controlado por el desarrollador para adquirir contenidos o servicios digitales.
Ahora puede agregar botones, banners y mensajes visibles que llevan a los usuarios directamente desde su juego a la compra del artículo en un navegador (a su Web Shop o interfaz de pago) con un solo clic, sin infringir las normas de Apple ni correr el riesgo de sufrir sanciones.

Ya no tiene la obligación de ocultar los mensajes detrás de flujos indirectos ni pagar comisiones por estas compras externas.
Ambas, la integración basada en Web Shop y el Xsolla Mobile SDK, ofrecen una extensa gama de métodos de pago, incluido Apple Pay, que brinda a los usuarios una experiencia de pago cómoda e intuitiva.
Cómo elegir entre la integración basada en Web Shop y el Mobile SDK de Xsolla
Web Shop abre la interfaz de pago para un artículo específico en el navegador, según la configuración existente de tu Web Shop. El Mobile SDK de Xsolla también inicia el flujo de pago en el navegador, pero te ofrece un mayor control sobre cómo se inicia el flujo y qué parámetros se envían.
Para la mayoría de los casos de uso, recomendamos encarecidamente utilizar la integración basada en Web Shop. Ofrece:
- Capacidades de comercio en videojuegos más amplias
Web Shop incluye una amplia gama de funciones integradas como descuentos, bonificaciones, códigos promocionales, ofertas personalizadas, artículos gratuitos y más. Estas funciones se configuran desde la Cuenta del editor y se aplican automáticamente, sin necesidad de lógica adicional del lado del cliente ni desarrollo de interfaz.
- Implementación más rápida
Si ya cuentas con un Web Shop, esta es la opción más sencilla. Solo necesitas añadir un enlace en tu juego que abra el Web Shop con los parámetros necesarios.
Dado que Web Shop no forma parte del código de tu app, no requiere actualizaciones a través de la App Store. Esto también facilita la expansión a nuevos países a medida que estén disponibles.
- Cumplimiento total con las nuevas directrices de Apple
Web Shop está diseñado para cumplir con los requisitos de flujo de compras externas de Apple, ya que se abre en un navegador fuera de la app.
El Mobile SDK de Xsolla ofrece mayor flexibilidad, pero requiere un esfuerzo de desarrollo adicional. Utiliza el SDK si tu integración requiere:
- Métodos de autenticación avanzados que no son compatibles con Web Shop.
- Envío de parámetros adicionales (por ejemplo, estado actual del juego o metadatos de la sesión como nivel, plataforma y evento de activación), útiles en escenarios específicos del juego que no se aplican a Web Shop.
- Una experiencia de compra totalmente personalizable, con control completo sobre la interfaz de pago y la lógica de la transacción.
Cuando se utiliza el SDK, las capacidades de comercio en videojuegos también están disponibles a través de API, pero el desarrollador es responsable de implementar toda la lógica de negocio, el cálculo de ofertas y la interfaz de la app.
A continuación, se ofrecen detalles sobre cómo usar el SDK de manera compatible con los requisitos de Apple.
Cómo funciona
En esta guía, podrá aprender a integrar Xsolla para procesar pagos utilizando Xsolla Mobile SDK según los requisitos de Apple.
Requisitos de Apple:
No se permiten las vistas web en la aplicación para compras externas; los pagos deben producirse a través de Safari o del navegador predeterminado.
Los enlaces de compra externos solo se permiten actualmente para aplicaciones de iOS en el escaparate de Estados Unidos. Recuerde que las directrices de revisión de aplicaciones de Apple hacen referencia al
escaparate de Estados Unidos, no a la ubicación del usuario .
Flujo del usuario:
- El usuario abre la aplicación de juegos en un dispositivo con iOS.
- El usuario hace clic en el botón de compra situado junto al artículo deseado.
- La aplicación abre Safari (o el navegador predeterminado) con un enlace a Pay Station que contiene el token de pago. El SDK gestiona la autorización y la selección del artículo.
- El usuario obtiene la autorización automáticamente. Pay Station se abre para el artículo específico.
- El usuario selecciona un método de pago y finaliza la compra.
- Pay Station redirige al usuario a la aplicación del juego.
- La aplicación recibe la confirmación de compra mediante un webhook.
Inicio rápido
Regístrese para obtener su propia Cuenta del editor y cree un proyecto
Cuenta del editor es la herramienta fundamental para configurar las funciones de Xsolla, así como para operar con análisis y transacciones.
Para registrarse, vaya a Cuenta del editor y cree una cuenta. Para crear un proyecto, haga clic en Create project en el menú lateral y facilite la información necesaria. Puede modificar la configuración más adelante.

Durante el proceso de integración, debe proporcionar el ID del proyecto que se encuentra en su Cuenta del editor situado junto al nombre del proyecto.

Establecer Xsolla Login
- En su proyecto que hay dentro de Cuenta del editor, vaya a la sección Login.
- Haga clic en Create Login project.
- Seleccione Standard Login project y haga clic en Create and set up. Espere hasta que se cree su nuevo proyecto de Login. Entonces podrá ver la página del proyecto de Login.
- En el bloque Login methods, haga clic en Configure.
- En el bloque de configuración superior, haga clic en Login API integration.
- Establezca el conmutador Login with device ID en On.

- Haga clic en Save changes.
Durante el proceso de integración, necesitará su Login ID. Para obtenerlo, haga clic en el nombre de su proyecto de Login en la pista de la ruta de navegación para volver a la página del proyecto de Login y haga clic en Copy ID junto al nombre del proyecto de Login.

Configurar productos de compra desde la aplicación (artículos virtuales)
Escoja uno de los siguientes métodos para establecer su catálogo de productos con código de artículo (SKU) de IAP:
- Importar artículos: suba un archivo JSON para agregar rápidamente su catálogo a Cuenta del editor.
- Utilizar llamadas API: perfecto para actualizaciones automatizadas o a gran escala.
Instalar el SDK
El Xsolla Mobile SDK se proporciona como un XCFramework
denominado XsollaMobileSDK.xcframework
.
Para instalarlo manualmente en su proyecto Xcode haga lo siguiente:
- Abra su proyecto en Xcode.
- Seleccione el destino de su aplicación y vaya a la pestaña General.
- En la sección Frameworks, Libraries, and Embedded Content, arrastre y suelte el archivo
XsollaMobileSDK.xcframework
. - En la lista desplegable situada junto al marco, asegúrese de que la opción Embed & Sign esté seleccionada.

Configure el SDK
Para configurar el SDK, necesita los siguientes ID de Cuenta del editor:
- ID del proyecto. Se puede encontrar en Cuenta del editor junto al nombre de su proyecto.
- ID de Login. Vaya a la sección Login > Dashboard > your Login project y pulse en Copy ID junto al nombre del proyecto de Login.
Como punto de partida, pueden utilizarse los ID de ejemplo.
settings.openExternalBrowser = YES;
(Objective-C) o settings.openExternalBrowser = true;
(Swift) a la configuración de tu SDK.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)
Configure la vinculación en profundidad para que los usuarios vuelvan a la aplicación del juego después de la compra.
Configure el esquema de URL para el destino:
- Seleccione su proyecto en el navegador del proyecto.
- Seleccione su destino.
- Abra la pestaña Info.
- Haga clic en el botón ➕ de la sección URL Types.
- Establezca el URL Scheme como
$(PRODUCT_BUNDLE_IDENTIFIER)
.

Inicializar el SDK
Tras realizar la configuración, es necesario inicializar el Xsolla Mobile SDK y conectarlo a los servicios de Xsolla. Coloque esta lógica en el flujo de inicialización de su aplicación; por ejemplo, dentro del método didFinishLaunchingWithOptions de 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}
Después de iniciar SKPaymentQueue
y agregar un observador de transacciones, la aplicación puede solicitar información del código de artículo (SKU) del siguiente modo:
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}
Realizar una compra
El flujo de compras es un proceso de varias etapas, que integra recaudación de pagos, validación de compras y consumo.
Iniciar flujo de compra
Para generar un pago e iniciar una compra, use la información de SKProduct
obtenida previamente:
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)
Validar compra
Todas las compras deben ser validadas antes de entregarlas al usuario final para contribuir a evitar compras no autorizadas.
La manera más eficaz de garantizar la validez de una compra es recurrir a las llamadas de servidor a servidor (S2S), lo cual excluye al cliente del proceso de toma de decisiones y evita así la posibilidad de que se cree una brecha de seguridad.
Por lo general, el enfoque de validación con S2S sigue estos pasos:
- El cliente de la aplicación envía el ID del pedido de compra al back-end. Este ID se obtiene cuando se completa la transacción de pago en el lado del cliente (por lo general, mediante una devolución de llamada de la transacción). Consulte Iniciar flujo de compra para saber cómo se inician las compras.
- El servidor recibe el ID del pedido y valida su autenticidad mediante el enfoque de webhooks (desencadenado por los servicios de Xsolla) en cuanto la compra realiza la notificación del servidor. Esto permite gestionar la recepción asíncrona sin tener que recurrir al sondeo y puede efectuarse en segundo plano (el resultado se almacena en caché) incluso antes de que se reciba la solicitud de un cliente. Para obtener más información sobre los webhooks, consulte la sección Set up webhook (Establecer webhooks).
Consumir contenido comprado
El último paso de la cadena de flujo de compras es conceder las compras al usuario y marcarlas como “concedidas”. Al proceso también se le conoce como “consumo de compras”.
El resultado de la compra se entrega mediante la devolución de llamada paymentQueue:updatedTransactions:
en Objective-C o paymentQueue(_:updatedTransactions:)
en 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}
Establecer webhooks
Los webhooks son notificaciones sobre eventos que se producen en el sistema. Cuando se produce un evento específico, Xsolla envía una solicitud HTTP y transmite los datos del evento al servidor del juego. Estos webhooks son esenciales para que el cliente o el servidor del juego reciban notificaciones sobre los pagos y los intentos de autenticación de usuarios realizados correctamente e incorrectamente.
Habilitar webhooks
- En su proyecto de dentro de Cuenta del editor, vaya a la sección Project setting > Webhooks.
- En el campo Webhook server, especifique la URL del servidor donde desea recibir los webhooks en el formato
https://example.com
También puede especificar la URL que encuentre en una herramienta para probar webhooks. - Por defecto, se genera una clave secreta para firmar los webhooks del proyecto. Si desea generar una nueva clave secreta, haga clic en el icono de actualización.
- Haga clic en Enable webhooks.

Probar webhooks
En la pestaña Payments and Store, puede probar los siguientes webhooks:
Validación del usuario (“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}'
Pago del pedido realizado correctamente (“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}'
Probar en aislador de proceso (sandbox)
Esta sección contiene fragmentos de código y ejemplos que demuestran cómo configurar el entorno de entorno sandbox para probar pagos, habilitar el registro detallado y otras tareas relacionadas.
Habilitar el modo de aislador de proceso (sandbox)
obj-c
- obj-c
- swift
1SKPaymentSettings* settings = ...;
2
3settings.useSandbox = YES;
1let settings = SKPaymentSettings(...)
2
3settings.useSandbox = true
Habilitar el registro detallado
obj-c
- obj-c
- swift
1SKPaymentSettings* settings = ...;
2
3settings.logLevel = SKLogLevelDebug;
1let settings = SKPaymentSettings(...)
2
3settings.logLevel = .debug
Tarjetas de prueba
Para obtener una lista de tarjetas con las que simular pagos en modo sandbox, consulte la sección Test cards list.
Pasar a PAGOS REALES
- Firme el acuerdo de licencia. Para ello, en Cuenta del editor, vaya a la sección Agreements & Taxes > Agreements y rellene el formulario del acuerdo.
- Establezca
sandbox
comofalse
desde el código de configuración del 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
Cómo detectar el escaparate de iOS
Para determinar el escaparate de iOS actual y ajustar la funcionalidad del SDK en función de la región, emplee los siguientes fragmentos de código:
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}
El método loadCurrentStorefrontCountryCode
recupera de forma asíncrona el código de tres letras del país para el escaparate actual. Puede usar esta información para habilitar o deshabilitar la funcionalidad del SDK para regiones específicas.
Otra posibilidad es utilizar directamente el Storefront nativo de Apple, como se muestra a continuación:
SKStorefront
de Objective-C, ya que realiza una carga sincrónica que bloquea el subproceso principal. Esto puede hacer que la interfaz de usuario se bloquee y que la experiencia del usuario se vea afectada negativamente, como se indica en la documentación oficial de Apple.- swift
1let storefront = await Storefront.current
2let countryCode = storefront?.countryCode
3
4settings.enablePayments = countryCode == "USA"
5
6SKPaymentQueue.default().start(settings)
Cómo funciona
En esta guía, podrá aprender a integrar Xsolla para procesar pagos utilizando la API de Xsolla, de conformidad con los requisitos de Apple.
Requisitos de Apple:
No se permiten las vistas web en la aplicación para compras externas; los pagos deben producirse a través de Safari o del navegador predeterminado.
Los enlaces de compra externos solo se permiten actualmente para aplicaciones de iOS en el escaparate de Estados Unidos. Recuerde que las directrices de revisión de aplicaciones de Apple hacen referencia al
escaparate de Estados Unidos, no a la ubicación del usuario .
Flujo del usuario:
- El usuario abre la aplicación de juegos en un dispositivo con iOS.
- El usuario hace clic en el botón de compra situado junto al artículo deseado.
- La aplicación abre Safari (o el navegador predeterminado) con un enlace a Pay Station que contiene el token de pago.
- Pay Station se abre para el artículo específico.
- El usuario selecciona un método de pago y finaliza la compra.
- Pay Station redirige al usuario a la aplicación del juego.
- La aplicación recibe la confirmación de compra mediante un webhook.
Inicio rápido
Regístrese para obtener su propia Cuenta del editor y cree un proyecto
Cuenta del editor es la herramienta fundamental para configurar las funciones de Xsolla, así como para operar con análisis y transacciones.
Para registrarse, vaya a Cuenta del editor y cree una cuenta. Para crear un proyecto, haga clic en Create project en el menú lateral y facilite la información necesaria. Puede modificar la configuración más adelante.

Durante el proceso de integración, debe proporcionar el ID del proyecto que se encuentra en su Cuenta del editor situado junto al nombre del proyecto.

Configurar productos de compra desde la aplicación (artículos virtuales)
Escoja uno de los siguientes métodos para establecer su catálogo de productos con código de artículo (SKU) de IAP:
- Importar artículos: suba un archivo JSON para agregar rápidamente su catálogo a Cuenta del editor.
- Obtener datos de los artículos del catálogo mediante las llamadas API procedentes de las secciones de la documentación Common > Catalog o Virtual Items & Currency > Catalog.
Configurar enlaces universales
- Agregue un archivo de asociación de dominio a la raíz de su sitio web. Por ejemplo,
https://your-site.com/apple-app-site-association
. - En su proyecto de Xcode, vaya a
Signing & Capabilities > Associated Domains y agregueapplinks:your-site.com
.
Configure los redireccionamientos para hacer que los usuarios vuelvan a la aplicación del juego después de la compra.
- Abra su proyecto en Cuenta del editor y vaya a Pay Station > Settings > Redirect policy.
- En el campo Return URL introduzca una dirección URL o una ruta (un vínculo profundo) a la que se redirigirá al usuario tras efectuar un pago. Esta URL debe ser compatible con enlaces universales. Para mejorar la experiencia del usuario en una aplicación móvil de juegos, le recomendamos especificar un vínculo profundo como URL de retorno.
- En la lista desplegable Automatic redirect condition escoja una condición necesaria.
- En la lista desplegable Manual redirect condition seleccione None — do not redirect.
- Haga clic en Save.
Detectar el escaparate de iOS
Los sistemas de pago externos solo se permiten actualmente en EE. UU. Para comprobar si su aplicación se obtiene desde la tienda de EE. UU., use el siguiente código:
- swift
1let storefront = await Storefront.current
2let countryCode = storefront?.countryCode
3
4settings.enablePayments = countryCode == "USA"
5
6SKPaymentQueue.default().start(settings)
El método loadCurrentStorefrontCountryCode
recupera de forma asíncrona el código de tres letras del país para el escaparate actual.
Realizar una compra
Crear un pedido en el lado del servidor de la aplicación
La aplicación cliente realiza una solicitud a su servidor para recuperar un token de pago:
- 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}
Para crear un pedido con los datos del usuario y del artículo en el lado de Xsolla, use la llamada API Crear token de pago para la compra. Este método devolverá un token de pago, el cual es necesario para abrir la interfaz de pago y realizar un pago. Para utilizar el modo de aislador de proceso (sandbox), transmita el parámetro “sandbox”: true
en el cuerpo de la solicitud para obtener un token.
Abrir la interfaz de pago
Tras recibir un token, genere un enlace para abrir la interfaz de pago en un navegador mediante el siguiente enlace: , en el cual
TOKEN
es el token obtenido.
- 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}
Para probar el proceso de pago, puede usar el modo de aislador de proceso (sandbox). Es un entorno independiente que admite todas las funciones de un entorno real, excepto los pagos reales y los rechazados. En el modo de sandbox puede probar un pago único y el pago con métodos de pago guardados empleando tarjetas bancarias y PayPal.
Redirigir a los usuarios a la aplicación
Cuando su pago haya sido aceptado, redirija a los usuarios recurrentes a su aplicación mediante enlaces universales. Para gestionar el redireccionamiento, implemente el siguiente método en su SceneDelegate
o 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}
Configurar webhooks
- En su proyecto de dentro de Cuenta del editor, vaya a la sección Project setting > Webhooks.
- En el campo Webhook server, especifique la URL del servidor donde desea recibir los webhooks en el formato
https://example.com
También puede especificar la URL que encuentre en una herramienta para probar webhooks. - Por defecto, se genera una clave secreta para firmar los webhooks del proyecto. Si desea generar una nueva clave secreta, haga clic en el icono de actualización.
- Haga clic en Enable webhooks.

Para que la tienda en el juego y el sistema de gestión de pagos funcionen a pleno rendimiento, es necesario implementar el procesamiento de los principales webhooks:
Nombre del webhook | Descripción |
---|---|
Validación del usuario > Validación del usuario (user_validation ) | Se envían en distintas fases del proceso de pago para garantizar que el usuario esté registrado en el juego. |
Servicios del juego > Webhooks combinados > Successful payment for order (order_paid ) | Contiene datos de pago, detalles de la transacción e información sobre los artículos comprados. Emplee los datos del webhook para agregar artículos al usuario. |
Servicios del juego > Webhooks combinados > Cancelación del pedido (order_canceled ) | Contiene datos del pago cancelado, detalles de la transacción e información sobre los artículos comprados. Emplee los datos del webhook para eliminar los artículos comprados. |
Lanzamiento
- Firme el acuerdo de licencia. Para ello, en Cuenta del editor, vaya a la sección Agreements & Taxes > Agreements y rellene el formulario del acuerdo.
- Supere la entrevista fiscal. Para ello, en Cuenta del editor, vaya a la sección Agreements & Taxes > Tax interview y rellene el formulario.
- Cambie a un entorno de producción. Para ello, elimine
“sandbox”: true
de la solicitud de creación de un token.
¿Has encontrado una errata u otro error de texto? Selecciona el texto y pulsa Ctrl+Intro.