アプリに組み込む

Xsolla サブスクリプション

Xsolla でサブスクリプションを販売し、自前のバックエンドを持たないアプリ向けです。アプリは API キーと一緒に Xsolla のユーザー ID をゲートウェイに送り、ゲートウェイはあなたの 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 を送ってください。結果を待ってアプリの起動を止めないでください。前回保存した結果を表示し、確認が返ったら更新します。既定では各キーは 1 分あたり 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: trueexpiry_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 かエラーメッセージを送っていただければ、こちらで調査します。