Serverとして使う

APIやコンテンツを提供し、JPYCで収益を得る方法を解説します。

対象

APIやコンテンツを売りたい開発者・企業

必要なもの

  • JPYC受取用のEVMアドレス
  • APIキー(/dashboardで発行)

セットアップ手順

  1. /dashboardでAPIキーを発行
    ログインして「新規発行」からAPIキーと受取アドレスを登録します。 発行したキーと受取アドレスは、Facilitatorが送金先としてDBの値を強制的に採用します (paymentRequirements.payToが登録アドレスと一致しない場合は400で拒否されます)。
  2. 受け取りアドレスを登録
    APIキー発行時にJPYCの受取先EVMアドレスを設定します。
  3. サーバーに402レスポンスを実装
    支払いが必要なエンドポイントでpaymentRequirementsを含む402レスポンスを返し、クライアントからのPAYMENT-SIGNATUREヘッダーを受け取ります。
  4. Facilitatorに検証と送金を依頼
    /verifyで署名・nonce・金額を検証し、成功したら/settleでオンチェーン送金を実行します。
  5. 環境変数を設定
    X402_API_KEYX402_FACILITATOR_URLRECIPIENT_ADDRESSを環境変数に設定します。

サンプルコード(Express)

import express from "express";

const app = express();

const X402_FACILITATOR_URL =
  process.env.X402_FACILITATOR_URL || "https://yen402.com";
const X402_API_KEY = process.env.X402_API_KEY!;         // /dashboard で発行
const RECIPIENT_ADDRESS = process.env.RECIPIENT_ADDRESS!; // JPYC 受取アドレス
const JPYC_ASSET = "0xe7c3d8c9a439fede00d2600032d5db0be71c3c29";

const paymentRequirements = {
  scheme: "exact",
  network: "eip155:137",   // Polygon mainnet (CAIP-2)
  asset: JPYC_ASSET,
  amount: "1000000000000000000", // 1 JPYC (18 decimals)
  payTo: RECIPIENT_ADDRESS,
  extra: { name: "JPY Coin", version: "1" }, // EIP-712 domain
};

// 有料エンドポイント
app.get("/api/premium", async (req, res) => {
  // x402 v2: PAYMENT-SIGNATURE ヘッダーに base64 エンコードされた
  // paymentPayload が入る
  const header = req.headers["payment-signature"];
  if (!header) {
    return res.status(402).json({
      x402Version: 2,
      accepts: [paymentRequirements],
    });
  }

  const paymentPayload = JSON.parse(
    Buffer.from(String(header), "base64").toString("utf-8"),
  );

  const body = JSON.stringify({ paymentPayload, paymentRequirements });
  const headers = {
    "Content-Type": "application/json",
    "X-API-Key": X402_API_KEY, // facilitator 認証
  };

  // 1) verify: 署名・nonce・残高条件をチェック(オンチェーン書き込みなし)
  const verifyRes = await fetch(`${X402_FACILITATOR_URL}/verify`, {
    method: "POST",
    headers,
    body,
  });
  const verify = await verifyRes.json();
  if (!verifyRes.ok || !verify.isValid) {
    return res.status(402).json({ error: verify.error ?? "verify failed" });
  }

  // 2) settle: transferWithAuthorization をブロードキャスト
  const settleRes = await fetch(`${X402_FACILITATOR_URL}/settle`, {
    method: "POST",
    headers,
    body,
  });
  const settle = await settleRes.json();
  if (!settleRes.ok || !settle.success) {
    return res.status(402).json({ error: settle.error ?? "settle failed" });
  }

  // PAYMENT-RESPONSE に settle 結果を base64 で載せてクライアントへ
  res.setHeader(
    "PAYMENT-RESPONSE",
    Buffer.from(JSON.stringify(settle)).toString("base64"),
  );
  res.json({ data: "Premium content here" });
});

app.listen(3000);

verify と settle が2段階に分かれているのは x402 v2 仕様です。 verify はオンチェーン書き込みを伴わない検証のみ、settle でtransferWithAuthorizationをブロードキャストします。

環境変数

X402_API_KEY

/dashboardで発行したAPIキー

X402_FACILITATOR_URL

Facilitatorエンドポイント(例: https://yen402.com)。 SDKの規約どおり/verify/settleが付与されます。

RECIPIENT_ADDRESS

JPYC受取用EVMアドレス。DB登録値と一致させる必要があります。 登録値はGET /payment-infoX-API-Keyヘッダー必須)で確認できます。

Claude Code ではじめる

最速でサーバー実装を動かすには Claude Code を使ってください。以下のプロンプトをそのまま貼り付けるだけで、クローンから起動まで一緒に進めてくれます。

こんにちは Claude。

https://github.com/kakedashi3/x402-jpyc-example.git を今いるディレクトリにクローンして。

それから README.md を読んで。x402 × JPYC のサーバーをローカルで動かしたい。

server/ ディレクトリの npm install、.env の設定(X402_API_KEY・X402_FACILITATOR_URL・RECIPIENT_ADDRESS)、開発サーバーの起動まで一緒に進めて。