保存された支払い方法
継続課金、ワンクリックチェックアウト体験、サブスクリプションサービスのために支払い方法を安全に保存および管理する方法を学びます。このガイドでは、カードの保存、管理、および保存された支払い方法での課金について説明します。
概要
保存された支払い方法により、取引ごとに支払い詳細を収集することなく顧客に課金できます。これは以下の場合に不可欠です:
- 継続的なサブスクリプション課金
- ワンクリックチェックアウト体験
- 自動更新サービス
- メンバーシッププラットフォーム
- 使用量ベースの課金
主な利点
- コンバージョンの向上 - ワンクリック決済で摩擦を減らす
- リテンション向上 - シームレスなサブスクリプション更新
- PCI範囲の削減 - 生のカードデータではなくトークンを使用
- 複数の支払いオプション - 複数の保存されたカードをサポート
- セキュリティ強化 - 初回使用時に3Dセキュア、その後の課金は高速
セキュリティと コンプライアンス
Omiseはすべてのカード保存を安全に処理します:
- カードはトークン化および暗号化されます
- PCI DSS レベル1準拠のインフラストラクチャ
- 生のカードデータがサーバーに触れることはありません
- カード保存用のセキュアボルト
- データ保護規制への準拠
支払い方法の保存
顧客作成時にカードを保存
const omise = require('omise')({
secretKey: 'skey_test_123'
});
// Create customer with card
const customer = await omise.customers.create({
email: 'john@example.com',
description: 'John Doe',
card: 'tokn_test_123456' // Token from client-side
});
console.log('Customer ID:', customer.id);
console.log('Default Card:', customer.default_card);
import omise
omise.api_secret = 'skey_test_123'
# Create customer with card
customer = omise.Customer.create(
email='john@example.com',
description='John Doe',
card='tokn_test_123456'
)
print(f'Customer ID: {customer.id}')
print(f'Default Card: {customer.default_card}')
<?php
$omise = new Omise(['secretKey' => 'skey_test_123']);
$customer = $omise['customers']->create([
'email' => 'john@example.com',
'description' => 'John Doe',
'card' => 'tokn_test_123456'
]);
echo "Customer ID: " . $customer['id'] . "\n";
echo "Default Card: " . $customer['default_card'];
curl https://api.omise.co/customers \
-u skey_test_123: \
-d "email=john@example.com" \
-d "description=John Doe" \
-d "card=tokn_test_123456"
既存の顧客にカードを追加
// Add additional card
await omise.customers.update('cust_test_123456', {
card: 'tokn_test_new_card'
});
// Retrieve updated customer
const customer = await omise.customers.retrieve('cust_test_123456');
console.log(`Total cards: ${customer.cards.total}`);
console.log('Cards:', customer.cards.data.map(c =>
`${c.brand} •••• ${c.last_digits}`
));
# Add additional card
customer = omise.Customer.retrieve('cust_test_123456')
customer.update(card='tokn_test_new_card')
# Retrieve updated customer
customer.reload()
print(f'Total cards: {customer.cards.total}')
for card in customer.cards.data:
print(f'{card.brand} •••• {card.last_digits}')
curl https://api.omise.co/customers/cust_test_123456 \
-u skey_test_123: \
-d "card=tokn_test_new_card"
クライアントサイドのカード保存フロー
// Frontend: Create token
async function saveCard() {
const cardData = {
name: document.getElementById('name').value,
number: document.getElementById('number').value,
expiration_month: document.getElementById('month').value,
expiration_year: document.getElementById('year').value,
security_code: document.getElementById('cvv').value
};
// Create token
const token = await Omise.createToken('card', cardData);
// Send token to backend
const response = await fetch('/api/save-card', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
token: token.id,
customerId: 'cust_test_123456'
})
});
return response.json();
}
// Backend: Save card to customer
app.post('/api/save-card', async (req, res) => {
try {
const { token, customerId } = req.body;
const customer = await omise.customers.update(customerId, {
card: token
});
res.json({
success: true,
cardId: customer.cards.data[0].id
});
} catch (error) {
res.status(400).json({
success: false,
error: error.message
});
}
});
支払い方法の管理
保存されたカードのリスト表示
const customer = await omise.customers.retrieve('cust_test_123456');
customer.cards.data.forEach(card => {
console.log(`Card ID: ${card.id}`);
console.log(`Brand: ${card.brand}`);
console.log(`Last 4: ${card.last_digits}`);
console.log(`Expires: ${card.expiration_month}/${card.expiration_year}`);
console.log(`Default: ${card.id === customer.default_card}`);
console.log('---');
});
customer = omise.Customer.retrieve('cust_test_123456')
for card in customer.cards.data:
print(f'Card ID: {card.id}')
print(f'Brand: {card.brand}')
print(f'Last 4: {card.last_digits}')
print(f'Expires: {card.expiration_month}/{card.expiration_year}')
print(f'Default: {card.id == customer.default_card}')
print('---')