このガイドのゴール

  • SaaS やECサイトに決済機能を導入する際の判断基準を理解する
  • Stripe と PAY.JP の特性・審査プロセス・実装パターンを比較する
  • サブスクリプション・Webhook・PCI DSS 対応の実装方針を固める

決済 API の選定は「どちらが良いか」ではなく「自分のビジネスに合うのはどちらか」の問題です。グローバル展開と国内特化では、要件が根本的に異なります。

🧩 このガイドで使うリソース
ビジネスの対象地域で選ぶ
🌏 グローバル / 多機能
Stripe
135+ 通貨対応。サブスク・従量課金・マーケットプレイス決済を単一 API でカバー。ドキュメントが英語中心だが情報量は圧倒的。
🇯🇵 国内特化
PAY.JP
日本語ドキュメント・日本語サポート。審査が比較的スムーズ。API 設計がシンプルで実装工数が少ない。

選定の判断基準

観点 Stripe PAY.JP
対応通貨 135+ 通貨 JPY のみ
決済手段 カード / コンビニ / 銀行振込 / Apple Pay / Google Pay 他 カード中心
サブスクリプション 多機能(従量課金・段階料金・トライアル) 基本的な定期課金
マーケットプレイス Stripe Connect で対応 非対応
ドキュメント 英語中心(日本語あり)。量と質ともに業界随一 日本語。簡潔でわかりやすい
審査 事業内容により 1〜数週間 数日〜1 週間程度
SDK 全主要言語対応 Ruby / PHP / Python / Java / Node.js
手数料体系 3.6%(国内カード)。業種・取引量で交渉可 3.0〜3.6%(プランによる)
📌
手数料率は交渉や取引量で変動する

上記の手数料は標準レートです。月間取引額が大きい場合はどちらのサービスも個別交渉で料率引き下げが可能です。公式サイトの料金ページで最新情報を確認してください。

アーキテクチャ: 決済フローの全体像

🔧 カード決済の基本フロー
クライアントでトークン化し、サーバで決済実行する構成
🌐 ブラウザ Stripe.js / PAY.JP.js カード情報入力 → トークン化 カード情報を直接送信(サーバを経由しない) トークンを送信 🖥️ サーバ トークンで決済実行 結果を DB 保存 Charge / PaymentIntent API 💳 決済 API Stripe / PAY.JP トークン発行 決済処理 カード会社と通信 Webhook で非同期通知(成功/失敗/返金 etc.)
🚨
カード情報を自社サーバに送信・保存しないこと

クライアント側の JS ライブラリ(Stripe.js / payjp.js)でトークン化し、サーバにはトークンだけを送ります。カード番号をサーバ経由にすると PCI DSS の SAQ D(最も厳格な監査レベル)が必要になり、現実的ではありません。

Webhook の実装

決済 API からの非同期通知(Webhook)は、決済の信頼性を確保するために不可欠です。

必ず処理すべきイベント

イベント 処理内容
charge.succeeded / payment_intent.succeeded サービスの利用権を付与
charge.failed ユーザーへの通知・リトライ案内
charge.refunded 返金処理・利用権の取消
customer.subscription.deleted サブスク解約処理
invoice.payment_failed 支払い失敗の通知・猶予期間の開始

Webhook 実装のポイント

  • 署名検証を必ず行う — リクエストが本当に決済 API から来たか確認(リプレイ攻撃防止)
  • 冪等性を確保する — 同じイベントが複数回届いても二重処理しない設計にする
  • 5 秒以内に 200 を返す — 処理に時間がかかる場合はキューに入れて即座にレスポンス
  • ログを残す — 受信したイベントを全件ログに記録(トラブル時の調査用)

サブスクリプション課金の設計

⚠️
「課金成功 = サービス提供開始」にしないこと

API のレスポンスではなく Webhook の payment_intent.succeeded をトリガーにしてください。API レスポンスは通信障害で受け取れない場合があります。Webhook はリトライされるため信頼性が高くなります。

Stripe の場合

Stripe は Subscription + Price + Product の 3 モデルで定期課金を管理します。従量課金(metered billing)や段階料金(tiered pricing)にも対応しており、SaaS の複雑な料金体系を API だけで実現できます。

PAY.JP の場合

PAY.JP は Plan + Subscription のシンプルな 2 モデル構造です。固定額の月次・年次課金が中心で、従量課金が必要な場合は自前でメーター計算を実装し都度課金する構成になります。

審査対応

決済 API を本番利用するにはサービス審査が必要です。

  • 事業内容の説明: サービスの内容、ユーザーへの提供物を具体的に記載
  • 利用規約・特商法表記: 法的に必要な表記を事前に準備
  • テスト環境の URL: 審査担当者が実際の決済フローを確認できるようにする
  • 想定取引量: 月間の取引件数・金額の見込みを提示

Stripe は事業内容によっては追加書類を求められることがあり、審査期間が長くなるケースもあります。PAY.JP は国内サービスとして審査プロセスが比較的シンプルですが、業種によっては利用不可な場合もあります。

本番チェックリスト

  • カード情報は クライアント側でトークン化(サーバ非経由)
  • Webhook の 署名検証 実装済み
  • Webhook 処理の 冪等性 確保
  • テスト環境で全決済パターン を通過(成功 / 失敗 / 3D セキュア / 返金)
  • サブスクの 猶予期間・リトライポリシー を設定
  • 特定商取引法に基づく表記 を掲載
  • エラーメッセージ をユーザーにわかりやすく表示(カードの拒否理由等)

まとめ

  • グローバル展開 / 多通貨 / 複雑な課金体系 → Stripe
  • 国内向け / シンプルな決済 / 日本語サポート重視 → PAY.JP
  • カード情報は 絶対にサーバ経由にしない(PCI DSS の問題)
  • 課金の信頼性は Webhook が担保する(API レスポンスに依存しない)
  • 審査は 事前に必要書類を揃えて 申請すると早い

この記事の情報は 2026 年 4 月時点のものです。手数料率や審査基準は変更される可能性があります。