Intégralo en tu app
Suscripciones de Xsolla
Para apps que venden suscripciones con Xsolla y no tienen backend propio. Tu app envía el ID de usuario de Xsolla a la pasarela con una clave API; la pasarela consulta a Xsolla con tu clave API de Xsolla y responde si ese usuario tiene una suscripción activa. La verificación es gratuita.
#Antes de empezar
- Una Xsolla Publisher Account con un proyecto que vende suscripciones (Subscriptions → Subscription plans).
- El ID de usuario que tu app pone en el token de pago (user.id). Usa siempre el mismo para un usuario, por ejemplo un ID que la app crea una vez y guarda.
#1. Obtén los ID y una clave API
- 1
Abre Publisher Account
publisher.xsolla.comInicia sesión con un usuario que pueda gestionar claves API.
- 2
Anota el ID de comerciante y el ID de proyecto
Abre el proyecto. La dirección es publisher.xsolla.com/<ID de comerciante>/projects/<ID de proyecto>, por ejemplo 746076 y 273204.
- 3
Crear una clave de API
Company settings → API keys → Create API key, o Settings del proyecto → API keysCópiala enseguida: Xsolla solo la muestra una vez. Quien la tenga puede leer tus suscripciones, así que no la pongas en la app.
#2. Ponlos en una clave API
- 1
Abre la clave que usa tu app
Consola → Claves de API → EditarUsa una clave solo para la app, limitada a los modelos que usa y con un tope de gasto.
- 2
Rellena Verificación de suscripción de Xsolla
Configurar verificación de XsollaIntroduce el ID de comerciante, el ID de proyecto y la clave API, y guarda. La pasarela prueba la clave con Xsolla antes de guardarla; se guarda cifrada y no se vuelve a mostrar.
#3. Comprueba desde la app
Comprueba al cerrarse la ventana de pago y otra vez al abrir la app. Envía el mismo ID de usuario que la app puso en el token de pago. No bloquees el arranque esperando la respuesta: muestra el último resultado guardado y actualízalo cuando llegue. Cada clave puede comprobar 120 veces por minuto por defecto.
import 'dart:convert';
import 'package:http/http.dart' as http;
const apiKey = 'sk-YOUR_KEY';
Future<Map<String, dynamic>?> checkXsolla(String userId) async {
final res = await http.post(
Uri.parse('https://www.aisplice.store/v1/xsolla/verify'),
headers: {
'Authorization': 'Bearer $apiKey',
'Content-Type': 'application/json',
// Request signing on for this key? Then this call must be signed too:
// ...signedHeaders('POST', '/v1/xsolla/verify'),
},
body: jsonEncode({'user_id': userId}),
);
if (res.statusCode != 200) return null; // keep the last saved answer
return jsonDecode(res.body) as Map<String, dynamic>;
}
Future<void> refreshEntitlement(String userId) async {
final status = await checkXsolla(userId);
if (status == null) return;
await saveEntitlement(status); // your local storage
if (status['active'] == true) unlockPaidFeatures();
}#4. Decide qué desbloquear
| Respuesta de la verificación | Qué hace la app | Causa habitual |
|---|---|---|
| active: true, in_trial: true | Desbloquea. Muestra “La prueba termina” con expiry_time. | Prueba gratuita, aún sin cobro |
| active: true | Desbloquea hasta expiry_time. | Pagado, incluidas las suscripciones con renovación desactivada que aún no han vencido |
| subscribed: true, active: false | Bloquea y muestra una pantalla de renovación. | Cancelada o congelada |
| subscribed: false | Bloquea y muestra la pantalla de suscripción. | Este usuario aún no tiene suscripción, o el pago no ha terminado |
| HTTP 502 / 503 | Conserva la última respuesta guardada y reintenta más tarde. | Xsolla o la clave API no responde |
Guarda expiry_time con la respuesta. Entre verificaciones, trata la suscripción como utilizable hasta esa hora, para que un teléfono sin conexión siga funcionando.
#5. Protege la clave en la app
Una clave dentro de una app se puede leer del tráfico capturado. Activa la firma de solicitudes en esa clave para que una clave copiada no pueda usarse por sí sola, ofusca la compilación y mantén un tope de cuota en la clave.
#6. Revisa qué pasó
Cada verificación, incluidas las respuestas en caché y los fallos, aparece en Consola → Registros de solicitudes como una fila xsolla-verify gratuita en la clave.
- Al guardar dice que Xsolla no acepta la clave: se copió incompleta, se eliminó o es de otra empresa. Crea una nueva.
- xsolla_credentials_invalid: la clave se eliminó en Publisher Account después de guardarla. Crea una clave nueva e introdúcela en la clave API.
- Todas las verificaciones responden subscribed: false: el ID de usuario no coincide con el del token de pago, o el ID de proyecto de la clave es de otro proyecto.
¿Sigues con el problema?
Envíanos el ID de solicitud o el mensaje de error y lo revisaremos.