juspay/hyperswitch
主な特徴
- **コネクター非依存**: 50以上のグローバル決済プロセッサーをサポート
- **モジュラーアーキテクチャ**: 必要なコンポーネントのみを選択可能
- **コスト可視性**: 決済コストの監査、監視、最適化ツール
- **インテリジェントルーティング**: MLベースの動的ルーティングで承認率を最大化
- **リトライメカニズム**: パッシブチャーンを減らすインテリジェントリトライ戦略
- **PCIコンプライアンス**: カード、トークン、ウォレットの安全な保管
- **100+通貨サポート**: グローバルな決済に対応
- **Rustによる高パフォーマンス**: 高速、信頼性、メモリ安全性
リポジトリ解析: juspay/hyperswitch
基本情報
- リポジトリ名: juspay/hyperswitch
- 主要言語: Rust
- スター数: 23,044
- フォーク数: 3,911
- 最終更新: アクティブに更新中
- ライセンス: Apache License 2.0
- トピックス: payments, rust, payment-gateway, payment-processor, orchestration
概要
一言で言うと
Rustで構築されたオープンソースのペイメントオーケストレーションプラットフォーム。「ペイメントのLinux」として、企業が自社の決済スタックを完全にコントロールできるようにする。
詳細説明
Hyperswitchは、Juspayによって開発されたコンポーザブルなオープンソース決済インフラです。従来の決済ゲートウェイの問題点(ベンダーロックイン、不透明なコスト、限定的な機能)を解決するために設計されています。
このプラットフォームは、企業が必要なコンポーネントだけを選択して使用できるモジュラーアーキテクチャを採用し、既存の決済スタックの上に統合できるように設計されています。現在、400以上の企業が使用しており、150名以上のエンジニアによって積極的に開発されています。
主な特徴
- コネクター非依存: 50以上のグローバル決済プロセッサーをサポート
- モジュラーアーキテクチャ: 必要なコンポーネントのみを選択可能
- コスト可視性: 決済コストの監査、監視、最適化ツール
- インテリジェントルーティング: MLベースの動的ルーティングで承認率を最大化
- リトライメカニズム: パッシブチャーンを減らすインテリジェントリトライ戦略
- PCIコンプライアンス: カード、トークン、ウォレットの安全な保管
- 100+通貨サポート: グローバルな決済に対応
- Rustによる高パフォーマンス: 高速、信頼性、メモリ安全性
使用方法
インストール
前提条件
- Rust 1.70以上
- PostgreSQL 14.9以上
- Redis 7.0以上
- DockerとDocker Compose(オプション)
- Node.js 16+(E2Eテスト用)
インストール手順
# 方法1: Docker Composeを使用(推奨)
git clone https://github.com/juspay/hyperswitch
cd hyperswitch
docker compose up -d
# サンドボックス環境へアクセス
# http://localhost:9000 - コントロールセンター
# http://localhost:8080 - APIエンドポイント
# 方法2: ソースからビルド
# 依存関係のインストール
./scripts/setup.sh
# ビルドと実行
cargo build --release
./target/release/hyperswitch
基本的な使い方
Hello World相当の例
# マーチャントアカウントの作成
curl -X POST http://localhost:8080/accounts \
-H "Content-Type: application/json" \
-H "api-key: ${API_KEY}" \
-d '{
"merchant_id": "merchant_001",
"merchant_name": "My Store",
"merchant_details": {
"primary_contact_person": "John Doe",
"primary_email": "john@mystore.com"
}
}'
# ペイメントの作成
curl -X POST http://localhost:8080/payments \
-H "Content-Type: application/json" \
-H "api-key: ${API_KEY}" \
-d '{
"amount": 1000,
"currency": "USD",
"confirm": true,
"payment_method": {
"type": "card",
"card": {
"card_number": "4242424242424242",
"card_exp_month": "12",
"card_exp_year": "2025",
"card_cvc": "123"
}
}
}'
実践的な使用例
// Node.js SDKを使用したペイメントフロー
const hyperswitch = require('@juspay-tech/hyperswitch-node');
const client = hyperswitch({
apiKey: process.env.HYPERSWITCH_API_KEY,
baseUrl: 'http://localhost:8080'
});
// 顧客の作成
const customer = await client.customers.create({
email: 'customer@example.com',
name: 'John Doe',
phone: '+1234567890'
});
// ペイメントメソッドの保存
const paymentMethod = await client.paymentMethods.create({
customer_id: customer.customer_id,
payment_method: 'card',
payment_method_type: 'credit',
card: {
card_number: '4242424242424242',
card_exp_month: '12',
card_exp_year: '2025',
card_holder_name: 'John Doe'
}
});
// リカーリングペイメントの設定
const payment = await client.payments.create({
amount: 5000,
currency: 'USD',
customer_id: customer.customer_id,
payment_method_id: paymentMethod.payment_method_id,
setup_future_usage: 'off_session',
mandate_data: {
customer_acceptance: {
acceptance_type: 'online',
accepted_at: new Date().toISOString(),
online: {
ip_address: '192.168.1.1',
user_agent: 'Mozilla/5.0...'
}
}
}
});
高度な使い方
// カスタムコネクターの実装例
use hyperswitch_connectors::{
ConnectorCommon, ConnectorIntegration,
types::{PaymentsAuthorizeData, PaymentsResponseData}
};
#[derive(Debug, Clone)]
pub struct MyCustomConnector;
impl ConnectorCommon for MyCustomConnector {
fn id(&self) -> &'static str {
"my_custom_connector"
}
fn get_auth_header(
&self,
auth_type: &types::ConnectorAuthType,
) -> CustomResult<Vec<(String, request::Maskable<String>)>, errors::ConnectorError> {
// API認証ヘッダーの構築
let auth = auth_type
.as_api_key()
.ok_or(errors::ConnectorError::FailedToObtainAuthType)?;
Ok(vec![(
"Authorization".to_string(),
format!("Bearer {}", auth.api_key).into_masked(),
)])
}
}
// ペイメント承認の実装
impl ConnectorIntegration<Authorize, PaymentsAuthorizeData, PaymentsResponseData>
for MyCustomConnector
{
fn get_url(
&self,
_req: &PaymentsAuthorizeData,
connectors: &settings::Connectors,
) -> CustomResult<String, errors::ConnectorError> {
Ok(format!("{}/payments", self.base_url(connectors)))
}
fn get_request_body(
&self,
req: &PaymentsAuthorizeData,
) -> CustomResult<Option<RequestContent>, errors::ConnectorError> {
let connector_req = MyConnectorPaymentRequest {
amount: req.request.amount,
currency: req.request.currency,
card: self.get_card_details(&req.request.payment_method_data)?,
};
Ok(Some(RequestContent::Json(Box::new(connector_req))))
}
fn handle_response(
&self,
data: &PaymentsAuthorizeData,
res: Response,
) -> CustomResult<PaymentsResponseData, errors::ConnectorError> {
let response: MyConnectorResponse = res
.response
.parse_struct("MyConnectorResponse")
.change_context(errors::ConnectorError::ResponseDeserializationFailed)?;
// レスポンスをHyperswitch形式に変換
types::RouterData::try_from(ResponseRouterData {
response,
data: data.clone(),
http_code: res.status_code,
})
}
}
ドキュメント・リソース
公式ドキュメント
- README.md: プロジェクト概要、インストール手順
- docs/: コントリビューションガイド、セキュリティポリシー
- api-reference/: OpenAPI仕様書、APIドキュメント
- add_connector.md: 新しい決済コネクターの追加方法
- 公式サイト: https://hyperswitch.io/
サンプル・デモ
- postman/: Postmanコレクション(全コネクター対応)
- connector-template/: 新コネクター追加用テンプレート
- cypress-tests/: E2Eテストケース
- config/config.example.toml: 設定ファイルのサンプル
チュートリアル・ガイド
- 公式ドキュメント: https://docs.hyperswitch.io/
- GitHub Discussions: コミュニティサポート
- Slack/Discord: リアルタイムサポート
- YouTube: Hyperswitch公式チャンネル
技術的詳細
アーキテクチャ
全体構造
Hyperswitchは、モジュラーでコンポーザブルなアーキテクチャを採用しています:
- コアルーター: ペイメント処理エンジン
- コネクターレイヤー: 各決済プロセッサーとの統合
- データレイヤー: PostgreSQLでの持続化
- キャッシュレイヤー: Redisでの高速アクセス
- 監視レイヤー: Prometheus、Grafana、OTEL
ディレクトリ構成
hyperswitch/
├── crates/ # Rustワークスペース
│ ├── router/ # コア決済処理エンジン
│ ├── api_models/ # APIモデル定義
│ ├── hyperswitch_connectors/ # コネクター実装
│ ├── diesel_models/ # データベースモデル
│ ├── analytics/ # 分析・レポート
│ └── scheduler/ # タスクスケジューラー
├── migrations/ # データベースマイグレーション
├── config/ # 設定ファイル
├── api-reference/ # APIドキュメント
├── monitoring/ # 監視設定
└── cypress-tests/ # E2Eテスト
主要コンポーネント
-
Router: ペイメントルーティングと処理
- 場所:
crates/router/ - 依存: api_models, diesel_models, connectors
- インターフェース: payments, refunds, mandates API
- 場所:
-
Connectors: 決済プロセッサー統合
- 場所:
crates/hyperswitch_connectors/ - 依存: ConnectorCommon, ConnectorIntegration traits
- インターフェース: authorize, capture, void, refund
- 場所:
-
Analytics: データ分析エンジン
- 場所:
crates/analytics/ - 依存: ClickHouse, PostgreSQL
- インターフェース: metrics, reports, dashboards
- 場所:
-
Scheduler: バックグラウンドタスク処理
- 場所:
crates/scheduler/ - 依存: Redis, PostgreSQL
- インターフェース: retry, webhook, reconciliation
- 場所:
技術スタック
コア技術
- 言語: Rust 1.70+(メモリ安全性、並行処理、async/await)
- Webフレームワーク:
- Actix-web: 高性能HTTPサーバー
- Axum: 代替フレームワークオプション
- 主要ライブラリ:
- Diesel: ORMとデータベースアクセス
- Tokio: 非同期ランタイム
- Serde: シリアライゼーション
- Redis-rs: Redisクライアント
- Reqwest: HTTPクライアント
開発・運用ツール
- ビルドツール:
- Cargo: Rustパッケージマネージャー
- Make: ビルドオートメーション
- Nix: 再現可能な開発環境
- テスト:
- 単体テスト: cargo test
- E2Eテスト: Cypress
- パフォーマンス: locust
- CI/CD:
- GitHub Actions
- コードカバレッジレポート
- デプロイ:
- Docker/Docker Compose
- Helm charts (K8s)
- AWS CloudFormation
設計パターン・手法
- モジュラーアーキテクチャ: 独立したコンポーネントの組み合わせ
- ストラテジーパターン: コネクター実装の抽象化
- リポジトリパターン: データアクセス層の分離
- ファサードパターン: 統一APIインターフェース
- イベントドリブン: Webhookを使用した通知
データフロー・処理フロー
-
APIリクエスト受信:
- 認証・認可
- リクエスト検証
- レート制限確認
-
ルーティング決定:
- ルールエンジン評価
- MLベースの最適コネクター選択
- フォールバック処理
-
コネクター処理:
- データ変換(Hyperswitch → コネクター形式)
- APIコール
- レスポンス変換(コネクター → Hyperswitch形式)
-
データ持続化:
- PostgreSQLへの保存
- Redisキャッシュ更新
- 監査ログ記録
-
レスポンス返却:
- 統一フォーマットでの応答
- Webhookイベント発火
API・インターフェース
公開API
Payments API
- 目的: ペイメントの作成、確認、キャプチャ
- 使用例:
# ペイメント作成
POST /payments
{
"amount": 1000,
"currency": "USD",
"payment_method": {
"type": "card",
"card": {...}
},
"routing": {
"type": "single",
"data": {"connector": "stripe"}
}
}
Routing API
- 目的: 動的ルーティングルールの設定
- 使用例:
// ルーティングルール作成
POST /routing
{
"name": "high_value_routing",
"algorithm": {
"type": "priority",
"data": [
{
"connector": "adyen",
"merchant_connector_id": "mca_123"
}
]
},
"profile_id": "pro_123"
}
設定・カスタマイズ
設定ファイル
# config.tomlの例
[server]
host = "0.0.0.0"
port = 8080
workers = 4
[database]
username = "hyperswitch"
password = "secure_password"
host = "localhost"
port = 5432
dbname = "hyperswitch_db"
pool_size = 20
[redis]
host = "localhost"
port = 6379
pool_size = 10
reconnect_max_attempts = 5
[jwekey]
vault_encryption_key = "..."
vault_private_key = "..."
vault_public_key = "..."
[connectors.supported]
wallets = ["applepay", "googlepay", "paypal"]
cards = ["credit", "debit"]
bank_transfers = ["ach", "sepa", "bacs"]
拡張・プラグイン開発
- 新コネクター追加:
- connector-template/をコピー
- ConnectorCommon、ConnectorIntegration traitを実装
- transformersでデータ変換定義
- カスタムルーティング:
- ルールエンジンAPIを使用
- カスタムアルゴリズムの実装
- Webhookハンドラー:
- イベントタイプごとのハンドラー定義
- カスタム認証:
- AuthN/AuthZプロバイダーの統合
パフォーマンス・スケーラビリティ
パフォーマンス特性
- レイテンシ: API応答 <50ms (p99)
- スループット: 10,000+ TPS
- 最適化手法:
- Rustのゼロコスト抽象化
- 非同期I/O (Tokio)
- コネクションプーリング
- Redisキャッシュの活用
- データベースクエリ最適化
スケーラビリティ
- 水平スケーリング: ステートレスアーキテクチャ
- マルチテナント対応: マーチャントごとの分離
- データベースシャーディング対応
- ロードバランサー対応
- リージョン別デプロイメント
制限事項
- Rustの学習曲線が急峻
- 一部のコネクターは地域制限あり
- リアルタイム分析はClickHouseが必要
- 完全なSaaS版は提供されていない
評価・所感
技術的評価
強み
- ベンダー非依存: ロックインなしで柔軟な決済スタック
- 完全なコントロール: ソースコードとデータの完全な所有権
- コスト最適化: 詳細なコスト分析と最適化ツール
- 高パフォーマンス: Rustによる優れた性能
- 活発なコミュニティ: 150+名のエンジニアによる開発
改善の余地
- ドキュメントのさらなる充実
- より多くのコネクターサポート
- GUIベースの管理ツール
- マネージドサービスオプション
- ノーコード統合ツール
向いている用途
- 複数の決済プロセッサーを使用する企業
- 決済コストの最適化が必要な企業
- ベンダーロックインを避けたい組織
- 高度なルーティング機能が必要なケース
- セルフホストを好む企業
向いていない用途
- 単一の決済プロセッサーで十分な場合
- 技術リソースが限られる小規模企業
- フルマネージドサービスを望む場合
- Rustの学習が困難なチーム
- シンプルな決済ゲートウェイが必要な場合
総評
Hyperswitchは、「ペイメントのLinux」というコンセプトを見事に実現した、革新的なオープンソース決済プラットフォームです。特に、ベンダーロックインからの解放と、完全なコントロールを企業に提供する点が大きな価値です。
Rustでの実装による高パフォーマンスと信頼性、モジュラーアーキテクチャによる柔軟性、そして活発なコミュニティによる継続的な改善は、このプロジェクトの強みです。現在400以上の企業が利用していることからも、その実用性が証明されています。
一方で、Rustの学習コストの高さや、セルフホストの複雑さは、一部の組織にとって導入の障壁になる可能性があります。しかし、決済スタックへの完全なコントロールを求める企業にとっては、これらの課題を上回る価値があると言えるでしょう。
総合的に見て、Hyperswitchはエンタープライズ向けの次世代決済インフラとして、特にコスト最適化やマルチベンダー戦略を重視する組織にとって非常に魅力的な選択肢です。