MPP
マシン決済プロトコル
MPPはマシン間商取引のためのインターネット決済プロトコルです。HTTP 402ステータスコードで決済要件を通知し、暗号資産(オンチェーンステーブルコイン)と法定通貨(カード、ウォレット via Stripe)の両方に対応。StripeとTempoが共同開発。
主な特徴
デュアル決済レール
オンチェーン暗号資産決済(USDCステーブルコイン)と従来の法定通貨決済(カード、ウォレット)をStripe経由で同一プロトコル上でサポート。
HTTP 402ネイティブ
HTTP 402 Payment Requiredステータスコード上に構築。標準的なHTTPリクエスト/レスポンスサイクル内で決済ネゴシエーションが完結。
チャレンジベースセッション
暗号学的チャレンジ-レスポンスによる決済検証。各チャレンジは32バイトのランダムシークレットで保護。
マシン間通信ファースト
自律エージェントとプログラマティッククライアント向けに設計。ブラウザリダイレクトや人間の操作は不要。
MPPの仕組み
クライアントが有料リソースをサーバーにリクエスト
サーバーがHTTP 402と決済チャレンジ(challengeId、金額、通貨、受付方法)を返却
クライアントが決済を完了 — オンチェーン(暗号資産をデポジットアドレスへ)またはオフチェーン(カード/ウォレット via SPT)
クライアントがAuthorizationヘッダーに決済証明を含めてリクエストを再送信
サーバーが認証情報を検証し、200 OKでリソースを返却
決済方法
2つの決済レール、1つのプロトコル
暗号資産決済
デポジットアドレスによるオンチェーンステーブルコイン決済。サーバーがブロックチェーンアドレスを提供し、クライアントが直接トークンを送金。オンチェーンで決済確認。
- 1サーバーがデポジットアドレスと対応トークンを含む402を返却
- 2クライアントがオンチェーンでデポジットアドレスにUSDCを送金
- 3Stripeが入金到着時にPaymentIntentを自動キャプチャー
- 4クライアントが決済証明を含むAuthorizationヘッダーでリトライ
SPT(共有決済トークン)決済
カード、ウォレット、その他Stripe対応手段による法定通貨決済。クライアントがトークンを作成し、サーバーがStripeの決済ネットワーク経由で課金。
- 1クライアントがSPT(共有決済トークン)を作成
- 2サーバーがトークンを使用してStripe PaymentIntentを生成
- 3Stripeのレール(カード、Linkなど)経由で決済処理
- 4サーバーが完了を検証しアクセスを許可
暗号資産決済 — フロー
支払いなしで有料リソースをリクエスト
crypto決済手段を使用する
POST /v1/payment_intents
入金アドレスを含むPaymentIntentを返す
支払い要件を含むHTTP 402レスポンス
決済でリクエストを再試行
リクエストされたリソースを返す
SPT(共有決済トークン)決済 — フロー
支払いなしで有料リソースをリクエスト
支払い要件を含むHTTP 402レスポンス
共有決済トークン(SPT)の作成
SPTを返す
SPTクレデンシャルによるリクエストの再試行
SPTでPaymentIntentを作成
POST /v1/payment_intents
確定済みのPaymentIntentを返す
リクエストされたリソースを返す
HTTPプロトコル詳細
402レスポンスとAuthorizationヘッダーの仕様
402レスポンスボディ
決済が必要な場合、サーバーはRFC 9457に準拠したJSON問題詳細オブジェクトを返却します。
{
"type": "https://paymentauth.org/problems/payment-required",
"title": "Payment Required",
"status": 402,
"detail": "Payment is required to access this resource.",
"challengeId": "ch_1abc2def3ghi..."
}PaymentIntent (Crypto)
{
"id": "pi_123",
"amount": 5000,
"currency": "usd",
"status": "requires_action",
"next_action": {
"type": "crypto_display_details",
"crypto_display_details": {
"deposit_addresses": {
"tempo": {
"address": "0x...",
"supported_tokens": [
{
"token_currency": "usdc",
"token_contract_address": "0x..."
}
]
}
}
}
}
}Authorizationヘッダー
決済後、クライアントはAuthorizationヘッダーに証明を含めます。サーバーがスキームを抽出・検証します。
コード例
暗号資産決済 (Node.js)
// Server: MPP crypto payment endpoint
import Stripe from 'stripe';
const stripe = new Stripe(process.env.STRIPE_SECRET_KEY, {
apiVersion: '2026-03-04.preview',
});
// 1. Client requests resource → server returns 402
app.get('/api/data', async (req, res) => {
const credential = Credential.fromRequest(req);
if (!credential) {
const challenge = await createChallenge({
amount: 500, // $5.00
currency: 'usd',
});
return res.status(402).json({
type: 'https://paymentauth.org/problems/payment-required',
title: 'Payment Required',
status: 402,
challengeId: challenge.id,
});
}
// 4. Verify payment credential
const scheme = Credential.extractPaymentScheme(credential);
const verified = await verifyPayment(scheme);
if (verified) {
return res.json({ data: 'protected resource' });
}
});SPT(共有決済トークン)決済 (Client)
// Client: SPT (Shared Payment Token) flow
const response = await fetch('https://api.example.com/data');
if (response.status === 402) {
const challenge = await response.json();
// Create SPT and complete payment via Stripe
const payment = await stripe.charge({
networkId: 'internal',
paymentMethodTypes: ['card', 'link'],
secretKey: process.env.STRIPE_SECRET_KEY,
});
// Retry with Authorization header
const result = await fetch('https://api.example.com/data', {
headers: {
'Authorization': `Bearer ${payment.token}`,
},
});
const data = await result.json();
}セキュリティ
チャレンジシークレット — 32バイトの暗号学的ランダム値(Base64エンコード)で各決済チャレンジを保護
認証情報検証 — サーバーが決済スキーム、PaymentIntent ID、アドレスの整合性を抽出・検証
リプレイ保護 — 各チャレンジはユニークな識別子による使い捨て
エコシステム
MPPを支える主要組織
Stripe
グローバル決済インフラ、MPPプロトコル共同開発者、法定通貨決済レール
Tempo
オンチェーン決済インフラ、暗号資産決済レール、ステーブルコイン決済
テスト & ツール
Stripeサンドボックスで暗号資産デポジットをシミュレーションしたテスト取引
mppx CLIツール(npmパッケージ)によるコマンドライン決済テスト
TempoテストネットのPATH_USDテストトークンで暗号資産フロー開発