Встраивание в ваше приложение

Подписки Xsolla

Для приложений, которые продают подписки через Xsolla и не имеют своего бэкенда. Приложение отправляет ID пользователя Xsolla на шлюз вместе с API-ключом; шлюз спрашивает Xsolla с вашим API-ключом Xsolla и отвечает, есть ли у пользователя активная подписка. Проверка бесплатна.

#Перед началом

  • Xsolla Publisher Account с проектом, который продаёт подписки (Subscriptions → Subscription plans).
  • ID пользователя, который приложение кладёт в платёжный токен (user.id). Для одного пользователя он должен быть всегда одинаковым, например ID, который приложение создаёт один раз и сохраняет.

#1. Получите ID и API-ключ

  1. 1

    Откройте Publisher Account

    publisher.xsolla.com

    Войдите пользователем, который может управлять API-ключами.

  2. 2

    Запишите ID мерчанта и ID проекта

    Откройте проект. Адрес имеет вид publisher.xsolla.com/<ID мерчанта>/projects/<ID проекта>, например 746076 и 273204.

  3. 3

    Создать API-ключ

    Company settings → API keys → Create API key или Settings проекта → API keys

    Скопируйте сразу: Xsolla показывает его один раз. Кто им владеет, может читать ваши подписки, поэтому не кладите его в приложение.

#2. Укажите их на API-ключе

  1. 1

    Откройте ключ, который использует приложение

    Консоль → API-ключи → Изменить

    Создайте для приложения отдельный ключ, ограничьте его нужными моделями и задайте лимит расходов.

  2. 2

    Заполните «Проверка подписки Xsolla»

    Настроить проверку Xsolla

    Введите ID мерчанта, ID проекта и API-ключ и сохраните. Перед сохранением шлюз проверяет ключ в Xsolla; ключ хранится в зашифрованном виде и больше не показывается.

#3. Проверяйте из приложения

Проверяйте, когда закрывается окно оплаты, и снова при открытии приложения. Передавайте тот же ID пользователя, что и в платёжном токене. Не блокируйте запуск приложения ожиданием ответа: показывайте последний сохранённый результат и обновляйте его, когда придёт ответ. По умолчанию каждый ключ может проверять 120 раз в минуту.

xsolla.dart
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 запроса или текст ошибки, и мы разберёмся.