TL;DR
2Checkout API(現在のVerifone)を使用すると、開発者は支払い処理、サブスクリプション管理、eコマース取引をプログラムで処理できます。注文、顧客、製品、Webhook向けのRESTfulエンドポイントをサポートし、APIキーを使用したJSONベースの認証を提供します。このガイドでは、初期設定から高度なWebhook処理まで、すべてを網羅しています。
はじめに
決済処理は、あらゆるオンラインビジネスの基盤です。これを誤ると収益を失い、適切に行えばグローバル市場が開かれます。2Checkout API(最近Verifoneにブランド変更)は、世界中の45,000以上の加盟店の決済を処理し、年間数十億ドルもの取引を処理しています。
現実として、買い物客の67%が決済時の摩擦が原因でカートを放棄しています。堅牢な決済API連携は、最終的な収益に直接影響します。
このガイドでは、完全な2Checkout API連携プロセスを解説します。認証、決済処理、サブスクリプション管理、Webhook処理、エラーのトラブルシューティングを学びます。読み終える頃には、本番環境に対応した決済連携が完了しているでしょう。
2Checkout APIとは?
2Checkout (現在はVerifone Digital Commerceとして運営)は、決済処理とサブスクリプション管理のためのRESTful APIを提供します。APIは以下を処理します。
- 単発および定期的な支払い
- 顧客および製品管理
- 注文ライフサイクルの追跡
- 返金および異議申し立ての処理
- 税金およびコンプライアンスの自動化
- 多通貨対応(100以上の通貨)
主な機能
| 機能 | 説明 |
|---|---|
| RESTful設計 | JSONペイロードを使用した標準HTTPメソッド(GET、POST、PUT、DELETE) |
| サンドボックス環境 | 実際の取引を処理せずに支払いをテスト |
| Webhookサポート | 注文イベントのリアルタイム通知 |
| トークン化 | カード情報を保存せずに安全な支払いデータ処理 |
| グローバルコンプライアンス | PCI DSSレベル1、GDPR、PSD2、および3Dセキュア2.0 |
APIアーキテクチャの概要
2Checkoutはバージョン管理されたREST API構造を使用します。
https://api.2checkout.com/1/
https://api.2checkout.com/2/
バージョン2は、サブスクリプション管理とWebhook処理が改善された、現在の推奨バージョンです。
はじめに:認証設定
ステップ1:2Checkoutアカウントを作成する
APIにアクセスする前に、マーチャントアカウントが必要です。
- 2Checkout (Verifone) のサインアップページにアクセスする
- ビジネス確認を完了する(ビジネス書類が必要)
- 承認を待つ(通常24~48時間)
- コントロールパネルにアクセスしてAPI認証情報を取得する
ステップ2:APIキーを取得する
コントロールパネルのインテグレーション > APIキーに移動します。
- プライベートAPIキー:サーバー側認証に使用(秘密に保持)
- パブリックAPIキー:クライアント側トークン化に使用(公開しても安全)
- Webhookシークレット:Webhook署名の検証に使用
セキュリティに関する注意: APIキーをバージョン管理にコミットしないでください。環境変数を使用してください。
# .envファイル
TWOCHECKOUT_PRIVATE_KEY="your_private_key_here"
TWOCHECKOUT_PUBLIC_KEY="your_public_key_here"
TWOCHECKOUT_WEBHOOK_SECRET="your_webhook_secret_here"
ステップ3:サンドボックスと本番環境
2Checkoutは個別の環境を提供します。
| 環境 | ベースURL | ユースケース |
|---|---|---|
| サンドボックス | https://sandbox.2checkout.com/api/ |
開発とテスト |
| 本番環境 | https://api.2checkout.com/ |
ライブトランザクション |
開発中はサンドボックス認証情報を使用してください。実際の支払いを処理する準備ができてからのみ、本番環境のキーに切り替えてください。
ステップ4:認証方法
2Checkoutは2つの認証アプローチをサポートしています。
方法1:APIキー認証(推奨)
リクエストヘッダーにプライベートキーを含めます。
const response = await fetch('https://api.2checkout.com/1/orders', {
method: 'GET',
headers: {
'X-Api-Key': process.env.TWOCHECKOUT_PRIVATE_KEY,
'Content-Type': 'application/json',
'Accept': 'application/json'
}
});
方法2:HMAC署名認証
セキュリティを強化するために、HMAC-SHA256でリクエストに署名します。
const crypto = require('crypto');
function generateSignature(payload, privateKey) {
const hash = crypto
.createHmac('sha256', privateKey)
.update(JSON.stringify(payload))
.digest('hex');
return hash;
}
// 使用例
const payload = { order_id: '12345', amount: 99.99 };
const signature = generateSignature(payload, privateKey);
const response = await fetch('https://api.2checkout.com/1/orders', {
method: 'POST',
headers: {
'X-Api-Key': process.env.TWOCHECKOUT_PRIVATE_KEY,
'X-Signature': signature,
'Content-Type': 'application/json'
},
body: JSON.stringify(payload)
});

支払い処理:コアエンドポイント
一度限りの注文を作成する
/ordersエンドポイントを使用して1回の支払いを処理します。
const createOrder = async (customerData, productData) => {
const payload = {
currency: 'USD',
customer: {
email: customerData.email,
first_name: customerData.firstName,
last_name: customerData.lastName,
phone: customerData.phone,
billing_address: {
address1: customerData.address,
city: customerData.city,
state: customerData.state,
zip: customerData.zip,
country: customerData.country
}
},
items: [
{
name: productData.name,
quantity: productData.quantity,
price: productData.price,
product_code: productData.sku
}
],
payment_method: {
type: 'card',
card_token: customerData.cardToken // クライアント側のトークン化から
}
};
const response = await fetch('https://api.2checkout.com/1/orders', {
method: 'POST',
headers: {
'X-Api-Key': process.env.TWOCHECKOUT_PRIVATE_KEY,
'Content-Type': 'application/json'
},
body: JSON.stringify(payload)
});
return await response.json();
};
期待されるレスポンス
{
"order_id": "ORD-2026-001234",
"status": "approved",
"amount": 99.99,
"currency": "USD",
"customer_id": "CUST-789456",
"transaction_id": "TXN-9876543210",
"created_at": "2026-03-20T10:30:00Z"
}
支払いエラーの処理
常に適切なエラー処理を実装してください。
try {
const result = await createOrder(customer, product);
if (result.error) {
// 特定のエラーコードを処理
switch (result.error.code) {
case 'CARD_DECLINED':
// 別のカードを顧客に促す
break;
case 'INSUFFICIENT_FUNDS':
// 適切なメッセージを表示する
break;
case 'INVALID_CVV':
// CVVの再入力を要求する
break;
default:
// 汎用エラーをログに記録して表示する
console.error('Payment failed:', result.error);
}
}
} catch (error) {
// ネットワークまたはサーバーエラー
console.error('API request failed:', error);
}
一般的なエラーコード
| エラーコード | HTTPステータス | 説明 | 解決策 |
|---|---|---|---|
CARD_DECLINED |
402 | カードが拒否されました | 別の支払い方法を尋ねる |
INVALID_CARD |
400 | 無効なカード番号 | カード入力を検証する |
EXPIRED_CARD |
400 | カードの有効期限が切れています | 更新された有効期限を要求する |
INVALID_CVV |
400 | CVV検証に失敗しました | CVVを再要求する |
INSUFFICIENT_FUNDS |
402 | 資金不足 | 代替支払いを提案する |
DUPLICATE_ORDER |
409 | 注文はすでに処理されています | 重複をチェックする |
INVALID_CURRENCY |
400 | サポートされていない通貨 | 通貨コードを確認する |
API_KEY_INVALID |
401 | 認証に失敗しました | APIキーを確認する |
顧客管理
顧客データの管理は、サブスクリプションビジネスやリピート購入にとって不可欠です。2Checkoutは完全な顧客APIを提供します。
顧客の作成
const createCustomer = async (customerData) => {
const payload = {
email: customerData.email,
first_name: customerData.firstName,
last_name: customerData.lastName,
phone: customerData.phone,
company: customerData.company,
billing_address: {
address1: customerData.address,
address2: customerData.address2 || '',
city: customerData.city,
state: customerData.state,
zip: customerData.zip,
country: customerData.country
},
shipping_address: customerData.shippingAddress || null,
tax_exempt: false,
language: 'en'
};
const response = await fetch('https://api.2checkout.com/1/customers', {
method: 'POST',
headers: {
'X-Api-Key': process.env.TWOCHECKOUT_PRIVATE_KEY,
'Content-Type': 'application/json'
},
body: JSON.stringify(payload)
});
return await response.json();
};
顧客レスポンス
{
"customer_id": "CUST-2026-123456",
"email": "john.doe@example.com",
"first_name": "John",
"last_name": "Doe",
"created_at": "2026-03-20T10:00:00Z",
"updated_at": "2026-03-20T10:00:00Z",
"payment_methods": [],
"subscriptions": [],
"order_history": []
}
顧客詳細の取得
const getCustomer = async (customerId) => {
const response = await fetch(
`https://api.2checkout.com/1/customers/${customerId}`,
{
method: 'GET',
headers: {
'X-Api-Key': process.env.TWOCHECKOUT_PRIVATE_KEY,
'Content-Type': 'application/json'
}
}
);
return await response.json();
};
顧客情報の更新
const updateCustomer = async (customerId, updates) => {
const response = await fetch(
`https://api.2checkout.com/1/customers/${customerId}`,
{
method: 'PUT',
headers: {
'X-Api-Key': process.env.TWOCHECKOUT_PRIVATE_KEY,
'Content-Type': 'application/json'
},
body: JSON.stringify(updates)
}
);
return await response.json();
};
顧客の削除
const deleteCustomer = async (customerId) => {
const response = await fetch(
`https://api.2checkout.com/1/customers/${customerId}`,
{
method: 'DELETE',
headers: {
'X-Api-Key': process.env.TWOCHECKOUT_PRIVATE_KEY
}
}
);
return response.status === 204; // 成功時はコンテンツなし
};
注:アクティブなサブスクリプションまたは未払いの残高がある顧客を削除すると失敗します。まずサブスクリプションをキャンセルしてください。
高度な統合パターン
安全なリトライのためのべき等性
支払いAPIは、重複請求を防ぐためにべき等なリクエストをサポートする必要があります。
const createIdempotentOrder = async (payload, idempotencyKey) => {
const response = await fetch('https://api.2checkout.com/1/orders', {
method: 'POST',
headers: {
'X-Api-Key': process.env.TWOCHECKOUT_PRIVATE_KEY,
'Content-Type': 'application/json',
'X-Idempotency-Key': idempotencyKey // 注文ごとに一意
},
body: JSON.stringify(payload)
});
return await response.json();
};
// 注文ごとに一意のキーを生成する (データベースに保存)
const idempotencyKey = `order_${userId}_${Date.now()}`;
リクエストがタイムアウトしても2Checkoutが処理した場合、同じキーで再試行すると、2回請求されることなく元の結果が返されます。
3Dセキュア2.0の処理(EUコンプライアンス)
ヨーロッパの顧客の場合、PSD2の下で3Dセキュア2.0認証が必須です。
const createOrderWith3DS = async (payload) => {
const response = await fetch('https://api.2checkout.com/1/orders', {
method: 'POST',
headers: {
'X-Api-Key': process.env.TWOCHECKOUT_PRIVATE_KEY,
'Content-Type': 'application/json'
},
body: JSON.stringify({
...payload,
three_ds: {
enabled: true,
challenge_required: 'preferred', // EUの場合は 'mandatory'
notification_url: 'https://your-site.com/3ds-callback'
}
})
});
const result = await response.json();
// 3DSリダイレクトを処理
if (result.three_ds_redirect_url) {
// 認証のために顧客を銀行にリダイレクト
res.redirect(result.three_ds_redirect_url);
}
return result;
};
多通貨価格設定
現地通貨で価格を表示し、基本通貨で決済します。
const getLocalizedPrice = async (basePrice, targetCurrency) => {
const response = await fetch(
`https://api.2checkout.com/1/rates?from=USD&to=${targetCurrency}`,
{
headers: {
'X-Api-Key': process.env.TWOCHECKOUT_PRIVATE_KEY
}
}
);
const rates = await response.json();
return basePrice * rates.rate;
};
// 使用方法
const eurPrice = await getLocalizedPrice(99.99, 'EUR');
console.log(`Price: EUR ${eurPrice.toFixed(2)}`);
サブスクリプションアップグレードのための日割り計算
顧客がサイクル途中でアップグレードした場合、日割り計算された料金を計算します。
const upgradeSubscription = async (subscriptionId, newPlanId) => {
const response = await fetch(
`https://api.2checkout.com/1/subscriptions/${subscriptionId}/upgrade`,
{
method: 'POST',
headers: {
'X-Api-Key': process.env.TWOCHECKOUT_PRIVATE_KEY,
'Content-Type': 'application/json'
},
body: JSON.stringify({
plan_id: newPlanId,
proration: 'immediate', // 差額をすぐに請求
invoice_proration: true // 請求書に明細を表示
})
}
);
return await response.json();
};
一般的な問題のトラブルシューティング
問題:Webhookが届かない
症状:注文は処理されるが、システムが更新されない。
診断:
// 2CheckoutダッシュボードでWebhook配信ログを確認
// 失敗した配信試行または200以外のレスポンスを探す
解決策:
- エンドポイントが5秒以内に200 OKを返すことを確認する
- SSL証明書の有効性を確認する(HTTPSである必要がある)
- ファイアウォールで2CheckoutのIP範囲をホワイトリストに登録する
- Webhook署名検証ロジックを確認する
- 本番環境の前にWebhookシミュレータでテストする
問題:サンドボックスでのテスト支払いが失敗する
症状:サンドボックス環境ですべてのテストカードが拒否される。
解決策:
- サンドボックスAPIキー(本番環境ではない)を使用していることを確認する
- サンドボックスのベースURLを確認する:
https://sandbox.2checkout.com/api/ - 正しいテストカード番号を使用する(「テスト」セクションを参照)
- サンドボックスアカウントのステータスを確認する(非アクティブ後に期限切れになる場合がある)
問題:サブスクリプションの更新がサイレント失敗する
症状:サブスクリプションはアクティブと表示されるが、更新が処理されない。
診断:
// サブスクリプションの支払い履歴を照会
const history = await fetch(
`https://api.2checkout.com/1/subscriptions/${subId}/payments`,
{ headers: { 'X-Api-Key': privateKey } }
);
解決策:
- 顧客の支払い方法の有効期限を確認する
- コントロールパネルの督促設定を確認する
subscription.payment_failedのWebhook配信を確認するauto_renewフラグが有効になっていることを確認する
問題:通貨換算の不一致
症状:請求金額が予想される換算額と異なる。
原因:2Checkoutは変動する日次為替レートを使用する。
解決策:
- 免責事項付きで「概算」換算を表示する
- カート作成時に15分間の有効期限でレートを固定する
- 顧客の現地通貨で取引を保存する
問題:AVS(住所認証)の失敗
症状:住所不一致のため、正当なカードが拒否される。
解決策:
- 住所オートコンプリート(Google Places、Lob)を使用する
- チェックアウト時にZIP/郵便番号を必須にする
- ソフトAVSを実装する(拒否する代わりに警告を出す)
- 顧客が請求先住所を更新できるようにする
サブスクリプション管理
2Checkoutは定期請求に優れています。サブスクリプションを管理する方法は次のとおりです。
サブスクリプションの作成
const createSubscription = async (customerId, planId) => {
const payload = {
customer_id: customerId,
plan_id: planId,
start_date: new Date().toISOString(),
billing_cycle: 'monthly', // または 'annual', 'weekly'
payment_method: {
type: 'card',
card_token: 'tok_card_tokenized'
},
options: {
trial_days: 14, // オプションの無料トライアル
auto_renew: true
}
};
const response = await fetch('https://api.2checkout.com/1/subscriptions', {
method: 'POST',
headers: {
'X-Api-Key': process.env.TWOCHECKOUT_PRIVATE_KEY,
'Content-Type': 'application/json'
},
body: JSON.stringify(payload)
});
return await response.json();
};
サブスクリプションのレスポンス
{
"subscription_id": "SUB-2026-567890",
"status": "active",
"plan_id": "PLAN-PREMIUM-MONTHLY",
"customer_id": "CUST-789456",
"current_period_start": "2026-03-20T00:00:00Z",
"current_period_end": "2026-04-20T00:00:00Z",
"trial_end": "2026-04-03T00:00:00Z",
"amount": 29.99,
"currency": "USD"
}
サブスクリプションの更新
プランの変更、支払い方法の更新、数量の変更を行います。
const updateSubscription = async (subscriptionId, updates) => {
const payload = {
...updates
// 例:
// plan_id: 'PLAN-ENTERPRISE-MONTHLY',
// quantity: 5,
// payment_method: { card_token: 'new_token' }
};
const response = await fetch(
`https://api.2checkout.com/1/subscriptions/${subscriptionId}`,
{
method: 'PUT',
headers: {
'X-Api-Key': process.env.TWOCHECKOUT_PRIVATE_KEY,
'Content-Type': 'application/json'
},
body: JSON.stringify(payload)
}
);
return await response.json();
};
サブスクリプションのキャンセル
const cancelSubscription = async (subscriptionId, reason = '') => {
const payload = {
cancel_at_period_end: false, // true = 現在の期間後にキャンセル、false = 即時キャンセル
reason: reason
};
const response = await fetch(
`https://api.2checkout.com/1/subscriptions/${subscriptionId}/cancel`,
{
method: 'POST',
headers: {
'X-Api-Key': process.env.TWOCHECKOUT_PRIVATE_KEY,
'Content-Type': 'application/json'
},
body: JSON.stringify(payload)
}
);
return await response.json();
};
Webhook連携:リアルタイムイベント処理
Webhookは、ポーリングなしで支払いイベントをシステムに通知します。これは、サブスクリプションの更新、支払い失敗、払い戻しにとって重要です。
ステップ1:Webhookエンドポイントを設定する
2Checkoutコントロールパネルで:
- インテグレーション > Webhooksに移動します
- エンドポイントURLを追加します(HTTPSを使用する必要があります)
- 購読するイベントを選択します
- 保存してWebhookシークレットをメモします
ステップ2:Webhookハンドラーを作成する
const express = require('express');
const crypto = require('crypto');
const app = express();
app.post('/webhooks/2checkout', express.raw({ type: 'application/json' }), async (req, res) => {
const signature = req.headers['x-webhook-signature'];
const payload = req.body;
// Webhook署名を検証
const isValid = verifyWebhookSignature(payload, signature, process.env.TWOCHECKOUT_WEBHOOK_SECRET);
if (!isValid) {
console.error('Invalid webhook signature');
return res.status(401).send('Unauthorized');
}
const event = JSON.parse(payload.toString());
// 適切なハンドラにルーティング
switch (event.type) {
case 'order.created':
await handleOrderCreated(event.data);
break;
case 'order.approved':
await handleOrderApproved(event.data);
break;
case 'order.declined':
await handleOrderDeclined(event.data);
break;
case 'subscription.created':
await handleSubscriptionCreated(event.data);
break;
case 'subscription.renewed':
await handleSubscriptionRenewed(event.data);
break;
case 'subscription.cancelled':
await handleSubscriptionCancelled(event.data);
break;
case 'refund.processed':
await handleRefundProcessed(event.data);
break;
default:
console.log('Unhandled event type:', event.type);
}
// 受領を確認
res.status(200).send('OK');
});
function verifyWebhookSignature(payload, signature, secret) {
const expectedSignature = crypto
.createHmac('sha256', secret)
.update(payload)
.digest('hex');
return crypto.timingSafeEqual(
Buffer.from(signature, 'hex'),
Buffer.from(expectedSignature, 'hex')
);
}
重要なWebhookイベント
| イベントタイプ | トリガー | 必要なアクション |
|---|---|---|
order.created |
新規注文の作成 | 確認メールを送信 |
order.approved |
支払いの成功 | 注文の履行、アクセス許可 |
order.declined |
支払いの失敗 | 顧客に通知、リトライロジック |
subscription.renewed |
定期的な支払い | アクセス期間の延長 |
subscription.payment_failed |
更新の失敗 | 督促処理 |
subscription.cancelled |
顧客によるキャンセル | 期間終了時にアクセスを取り消す |
refund.processed |
払い戻し処理済み | ユーザー残高の更新 |
chargeback.received |
チャージバックの発生 | 証拠を収集 |
Webhookのベストプラクティス
- 常に署名を検証する - スプーフィングされたWebhookを防ぐ
- 迅速に200 OKを返す - 2Checkoutは200以外のレスポンスで再試行する
- 非同期で処理する - バックグラウンド処理のためにイベントをキューに入れる
- べき等性を実装する - 重複するWebhookの配信を処理する
- すべてをログに記録する - タイムスタンプ付きのログで支払いに関する紛争をデバッグする
統合のテスト
サンドボックス環境の使用
2Checkoutのサンドボックスでは、実際の請求なしでテストができます。
// サンドボックスのベースURLを使用
const BASE_URL = 'https://sandbox.2checkout.com/api/1';
// テストカード番号
const TEST_CARDS = {
APPROVED: '4111111111111111',
DECLINED: '4000000000000002',
INSUFFICIENT_FUNDS: '4000000000009995',
EXPIRED_CARD: '4000000000000069'
};
// テストアドレス
const TEST_ADDRESS = {
country: 'US',
zip: '90210' // AVSチェックをトリガー
};
ローカルでのWebhookテスト
ngrokを使用してローカルサーバーを公開します。
# ngrokをインストール
npm install -g ngrok
# ポート3000でサーバーを起動
node server.js
# インターネットに公開
ngrok http 3000
# ngrok URLを2CheckoutのWebhook設定にコピー
APIテストのためのApidog
Apidogは2Checkout APIテストを効率化します。
- OpenAPI仕様のインポート - 2CheckoutのAPI定義を読み込みます
- テストシナリオの作成 - 各エンドポイントのコレクションを構築します
- レスポンスのモック - APIにヒットせずにテストします
- Webhookの検証 - ペイロード構造を検査します
- チームとの共有 - 統合テストで共同作業します
サンドボックスと本番環境のキーの環境変数を作成し、ワンクリックでコンテキストを切り替えることができます。
本番環境デプロイメントチェックリスト
本番稼働前:
- [ ] サンドボックスから本番APIキーに切り替える
- [ ] ベースURLを
https://api.2checkout.com/に更新する - [ ] Webhook署名検証を有効にする
- [ ] 失敗した支払いの監視を設定する
- [ ] 一時的な障害のためのリトライロジックを設定する
- [ ] 返金およびチャージバックフローをテストする
- [ ] PCI DSSコンプライアンスを確認する(トークン化を使用)
- [ ] EU顧客向けに3Dセキュア2.0を有効にする
- [ ] 監査証跡のためにロギングを設定する
- [ ] 支払い問題のランブックを作成する
監視とアラート
これらのメトリクスを追跡します。
// 例:支払い成功率
const successRate = approvedOrders / totalOrders * 100;
if (successRate < 95) {
// 支払いチームにアラート
sendAlert('支払い成功率が95%を下回りました');
}
// 特定のエラーコードを追跡
const errorBreakdown = errors.reduce((acc, err) => {
acc[err.code] = (acc[err.code] || 0) + 1;
return acc;
}, {});
// 特定のエラーの急増時にアラート
if (errorBreakdown['CARD_DECLINED'] > threshold) {
sendAlert('カード拒否の急増を検知');
}
実世界のユースケース
Eコマースストア連携
ファッション小売業者は、グローバル決済を処理するために2Checkoutを統合しました。結果は次のとおりです。
- 100以上の通貨を自動的にサポート
- カート放棄率を23%削減
- EU VATコンプライアンスを自動的に処理
- 初年度に200万ドル以上の処理
実装には3週間かかり、最初は2Checkoutのホスト型チェックアウトページを使用し、その後カスタムUXのために直接API連携に移行しました。
SaaSサブスクリプションビジネス
プロジェクト管理SaaSは2Checkoutサブスクリプションを使用しました。
- 5,000以上のアクティブなサブスクリプションを管理
- プランアップグレードの日割り計算を処理
- 支払い失敗の更新の督促を自動化
- スマートな再試行で解約率を15%削減
主な機能:Webhook駆動のアクセス制御。subscription.renewedが届くと、ユーザーアクセスを即座に延長。subscription.cancelledが届くと、アクセス失効をスケジュール。
結論
2Checkout APIは、支払い処理とサブスクリプション管理に必要なすべてを提供します。主なポイントは次のとおりです。
- すべての開発とテストにはサンドボックス環境を使用する
- WebhookにはHMAC署名検証を実装する
- 特定のエラーコード処理でエラーを適切に処理する
- サブスクリプションフロー(試用、更新、キャンセル)を徹底的にテストする
- 本番環境での支払いメトリクスを監視する
- APIテストとチームコラボレーションを効率化するためにApidogを使用する
FAQセクション
2Checkout APIとは何ですか?
2Checkout API(現在のVerifone)は、支払い処理、サブスクリプション管理、払い戻し処理、およびEコマース取引の自動化のためのRESTfulインターフェースです。JSONペイロード、HMAC認証、リアルタイムWebhookをサポートしています。
2CheckoutはVerifoneと同じですか?
はい。2Checkoutは2020年にVerifoneに買収され、Verifone Digital Commerceにブランド名を変更しました。APIエンドポイントと機能は同じですが、一部のドキュメントではVerifoneに言及しています。
2Checkout APIキーはどのように取得できますか?
2Checkoutコントロールパネルにログインし、インテグレーション > APIキーに移動して、新しいキーを生成します。プライベートキー(サーバーサイド)とパブリックキー(クライアントサイドのトークン化)が発行されます。
2Checkoutにはサンドボックス環境がありますか?
はい。テストにはhttps://sandbox.2checkout.com/api/を使用してください。テストAPIキーを取得し、実際の請求なしでテスト取引を処理するために、個別のサンドボックスアカウントを作成してください。
2Checkoutはどのような支払い方法をサポートしていますか?
2Checkoutは、クレジットカード(Visa、Mastercard、Amex、Discover)、PayPal、Apple Pay、Google Pay、銀行振込、および100以上の国での現地決済方法をサポートしています。
Webhookを安全に処理するにはどうすればよいですか?
常にX-Webhook-SignatureヘッダーをWebhookシークレットとともにHMAC-SHA256で検証してください。イベントを非同期で処理し、再試行を防ぐためにすぐに200 OKを返してください。
サブスクリプションの支払いが失敗した場合、どうなりますか?
2Checkoutはsubscription.payment_failed Webhookを送信します。再試行ロジック(通常7日間にわたる3回の試行)を実装し、すべての再試行が失敗した場合はsubscription.cancelled Webhookを送信します。
2CheckoutはPCI DSSに準拠していますか?
はい、2CheckoutはPCI DSSレベル1認定を受けています。生のカードデータを処理しないようにクライアント側トークン化を使用することで、PCIコンプライアンスの範囲を縮小できます。
サンドボックスでサブスクリプションをテストできますか?
はい。サンドボックスは、トライアル、更新、アップグレード、ダウングレード、キャンセルを含む完全なサブスクリプションライフサイクルテストをサポートしています。成功する支払いにはテストカード4111111111111111を使用してください。
API経由で払い戻しを処理するにはどうすればよいですか?
注文IDと払い戻し金額を/refundsにPOSTリクエストとして送信します。2Checkoutは一部または全額の払い戻しを処理し、完了時にrefund.processed Webhookを送信します。
