カードAPI
概要
カードAPIを使用すると、顧客プロファイルに保存されたクレジット/デビットカードを管理できます 。カードを保存するには、顧客に紐付ける必要があります。
カードは顧客リソース
Omise APIのカードは常に顧客に関連付けられています。カードを管理するには、顧客カードエンドポイントを使用してください。
利用可能なエンドポイント
すべてのカード操作は顧客APIの下にあります:
- カード一覧 - GET /customers/:id/cards
- カードを取得 - GET /customers/:id/cards/:card_id
- カードを更新 - PATCH /customers/:id/cards/:card_id
- カードを削除 - DELETE /customers/:id/cards/:card_id
できること
- カードを保存 - トークン化されたカードを顧客に紐付け
- 顧客のカードを一覧表示 - 顧客のすべてのカードを表示
- カード詳細を更新 - カードのメタデータを変更(名前、有効期限、請求先住所)
- デフォルトカードを設定 - 課金に使用するカードを選択
- カードを削除 - 顧客プロファイルからカードを削除
- 複数のカードを管理 - 顧客ごとに複数の決済方法を保存
カードの仕組み
1. カードデータをトークン化
まず、公開キー(クライアントサイド)を使用してトークンを作成:
// Omise.jsを使用したクライアントサイド
Omise.setPublicKey('pkey_test_...');
Omise.createToken('card', {
name: 'JOHN DOE',
number: '4242424242424242',
expiration_month: 12,
expiration_year: 2025,
security_code: '123'
}, (status, response) => {
if (status === 200) {
// トークンをサーバーに送信
sendTokenToServer(response.id);
}
});
2. 顧客にカードを紐付け
次に、トークンを顧客に紐付け(サーバーサイド):
// サーバーサイド
const customer = await omise.customers.update('cust_test_...', {
card: 'tokn_test_...'
});
console.log('カード追加:', customer.cards.data[0].id);
3. 保存されたカードを使用
顧客のデフォルトカードに課金:
const charge = await omise.charges.create({
amount: 100000,
currency: 'thb',
customer: 'cust_test_...'
});
または特定のカードを指定:
const charge = await omise.charges.create({
amount: 100000,
currency: 'thb',
customer: 'cust_test_...',
card: 'card_test_...'
});
カードオブジェクトの構造
{
"object": "card",
"id": "card_test_5xuy4w91xqz7d1w9u0t",
"livemode": false,
"location": "/customers/cust_test_.../cards/card_test_...",
"country": "th",
"city": "Bangkok",
"postal_code": "10320",
"financing": "",
"bank": "Bank of Ayudhya",
"brand": "Visa",
"fingerprint": "XK2FJbz+kQFvd/kLLRm1BVXR1kbwJpQp+lkFZyqP0u8=",
"last_digits": "4242",
"name": "JOHN DOE",
"expiration_month": 12,
"expiration_year": 2025,
"security_code_check": true,
"created_at": "2025-02-07T00:00:00Z"
}
セキュリティとPCIコンプライアンス
安全なプラクティス
- 生のカードデータをサーバーに送信しない
- 常にトークン化(Omise.js(公開キー)を使用)
- トークンまたはカードIDのみを保存
- カード番号やCVVコードをログに記録しない
- すべてのAPIリクエストにHTTPSを使用
- トークン化前にクライアントで検証
カードデータの保存
カードを顧客に保存すると:
- ✅ Omiseが暗号化されたカードデータを保存
- ✅ カードID(
card_test_...)を受け取る - ✅ 下4桁、ブランド、有効期限を表示可能
- ❌ 完全なカード番号は受け取れない
- ❌ CVVは保存されない(課金には常に必要)
ユースケース
サブスクリプションと継続課金
継続課金のために顧客のカードを保存:
// カードを保存
const customer = await omise.customers.create({
email: 'subscriber@example.com',
card: 'tokn_test_...'
});
// 毎月課金
async function chargeMonthly() {
const charge = await omise.charges.create({
amount: 99900, // 999円のサブスクリプション
currency: 'thb',
customer: customer.id,
description: '月額サブスクリプション'
});
}
ワンクリック決済
カード詳細を再入力せずに決済できるようにする:
// 顧客がチェックアウトで保存済みカードを選択
const cards = await omise.customers.listCards('cust_test_...');
// 顧客にカードを表示
cards.data.forEach(card => {
console.log(`${card.brand}の末尾${card.last_digits}`);
});
// 選択されたカードに課金
const charge = await omise.charges.create({
amount: 150000,
currency: 'thb',
customer: 'cust_test_...',
card: selectedCardId
});
期限切れカードの更新
カードの有効期限を更新:
const updatedCard = await omise.customers.updateCard(
'cust_test_...',
'card_test_...',
{
expiration_month: 12,
expiration_year: 2026,
name: 'JOHN DOE'
}
);
ベストプラクティス
すべきこと
- クライアントサイドでトークン化(Omise.jsを使用)
- デフォルトカードを設定(課金を容易にするため)
- 有効期限を事前に更新
- 古いカードを削除(プロファイルを整理)
- カードを検証(小額のオーソリ課金で)
- カード更新を適切に処理(UIで)
すべきでないこと
- 生のカードデータをサーバーに送信しない
- CVVコードを保存しない(違法で不要)
- 削除されたカードに課金しない(カードの存在を先に確認)
- 有効期限を無視しない(課金前に検証)
- 顧客間でカードを共有しない