Встраивание в ваше приложение
Подписки Xsolla
Для приложений, которые продают подписки через Xsolla и не имеют своего бэкенда. Приложение отправляет ID пользователя Xsolla на шлюз вместе с API-ключом; шлюз спрашивает Xsolla с вашим API-ключом Xsolla и отвечает, есть ли у пользователя активная подписка. Проверка бесплатна.
#Перед началом
- Xsolla Publisher Account с проектом, который продаёт подписки (Subscriptions → Subscription plans).
- ID пользователя, который приложение кладёт в платёжный токен (user.id). Для одного пользователя он должен быть всегда одинаковым, например ID, который приложение создаёт один раз и сохраняет.
#1. Получите ID и API-ключ
- 1
Откройте Publisher Account
publisher.xsolla.comВойдите пользователем, который может управлять API-ключами.
- 2
Запишите ID мерчанта и ID проекта
Откройте проект. Адрес имеет вид publisher.xsolla.com/<ID мерчанта>/projects/<ID проекта>, например 746076 и 273204.
- 3
Создать API-ключ
Company settings → API keys → Create API key или Settings проекта → API keysСкопируйте сразу: Xsolla показывает его один раз. Кто им владеет, может читать ваши подписки, поэтому не кладите его в приложение.
#2. Укажите их на API-ключе
- 1
Откройте ключ, который использует приложение
Консоль → API-ключи → ИзменитьСоздайте для приложения отдельный ключ, ограничьте его нужными моделями и задайте лимит расходов.
- 2
Заполните «Проверка подписки Xsolla»
Настроить проверку XsollaВведите ID мерчанта, ID проекта и API-ключ и сохраните. Перед сохранением шлюз проверяет ключ в Xsolla; ключ хранится в зашифрованном виде и больше не показывается.
#3. Проверяйте из приложения
Проверяйте, когда закрывается окно оплаты, и снова при открытии приложения. Передавайте тот же ID пользователя, что и в платёжном токене. Не блокируйте запуск приложения ожиданием ответа: показывайте последний сохранённый результат и обновляйте его, когда придёт ответ. По умолчанию каждый ключ может проверять 120 раз в минуту.
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. Решите, что открыть
| Ответ проверки | Что делает приложение | Типичная причина |
|---|---|---|
| active: true, in_trial: true | Открыть доступ. Показать «Пробный период заканчивается» с expiry_time. | Бесплатный пробный период, списаний ещё не было |
| active: true | Открыть доступ до expiry_time. | Оплачено, включая подписки с выключенным автопродлением, срок которых ещё не истёк |
| subscribed: true, active: false | Закрыть доступ и показать экран продления. | Отменена или заморожена |
| subscribed: false | Закрыть доступ и показать экран оформления подписки. | У пользователя ещё нет подписки или оплата не завершена |
| HTTP 502 / 503 | Использовать последний сохранённый ответ и повторить позже. | Xsolla или API-ключ не отвечает |
Сохраняйте expiry_time вместе с ответом. Между проверками считайте подписку действующей до этого времени, чтобы приложение работало и без сети.
#5. Защитите ключ в приложении
Ключ внутри приложения можно извлечь из перехваченного трафика. Включите для него подпись запросов, чтобы скопированный ключ нельзя было использовать сам по себе, обфусцируйте сборку и задайте для ключа предел квоты.
#6. Посмотрите, что произошло
Каждая проверка, включая ответы из кэша и ошибки, отображается в Консоль → Журнал запросов как бесплатная строка xsolla-verify на ключе.
- При сохранении сказано, что Xsolla не принимает ключ: ключ скопирован не полностью, удалён или принадлежит другой компании. Создайте новый.
- xsolla_credentials_invalid: ключ был удалён в Publisher Account после сохранения. Создайте новый ключ и введите его на API-ключе.
- Каждая проверка отвечает subscribed: false: ID пользователя отличается от ID в платёжном токене, или на ключе указан ID другого проекта.
Проблема не решена?
Пришлите нам ID запроса или текст ошибки, и мы разберёмся.