不正防止
機械学習、IPジオロケーション、カスタマイズ可能なリスクルールを活用したインテリジェントな不正検知で不正取引からビジネスを保護します。
概要
Omise不正防止は、加盟店が処理前に不正取引を識別して防止するのを支援します。システムは、カード詳細、取引パターン、IPジオロケーション、履歴行動など、複数のシグナルを分析して、リアルタイムでリスクを評価します。
主な機能:
- ✅ リアルタイム分析 - チェックアウト時の即座のリスク評価
- ✅ 機械学習 - AI駆動の不正検知モデル
- ✅ IPジオロケーション - 場所の不一致を検出
- ✅ ベロシテ ィチェック - 疑わしい取引パターンを識別
- ✅ 設定可能なルール - カスタムリスク閾値
- ✅ 手動レビュー - レビューのために取引にフラグを立てる
- ✅ チャージバック保護 - 異議申し立て率を削減
仕組み
リスクスコアリング
取引にはリスクスコア(0-100)が割り当てられます:
| スコア範囲 | リスクレベル | アクション |
|---|---|---|
| 0-30 | 低リスク | 自動承認 |
| 31-70 | 中リスク | 手動レビューのためにフラグ |
| 71-100 | 高リスク | 自動ブロック* |
*リスク許容度に基づいて設定可能な閾値
不正検知シグナル
1. IPジオロケーション
顧客のIPアドレスを分析して検出:
- 場所の不一致(IP国 vs カード国)
- 既知のプロキシ/VPN使用
- 高リスク国
- データセンターIP(非住宅用)
// チャージオブジェクトで利用可能なIPデータ
{
"ip": "203.113.128.45",
"ip_country": "TH",
"card_country": "US", // 不一致がフラグ
"fraud_score": 65
}
2. ベロシティチェック
取引パターンを監視:
- 同じIPから複数のカード
- 同じカードが急速に使用される
- 異常な購入頻度
- 新規顧客からの高額注文
フラグされる例のパターン:
- 10分以内に5回以上の取引
- 3つ以上の異なるウェブサイトで同じカード
- 注文額の突然の急増
3. カード確認
カード詳細を検証:
- BIN(銀行識別番号)分析
- カードタイプの一貫性
- AVS(住所確 認サービス)照合
- CVV確認結果
4. 履歴行動
過去の取引を分析:
- 顧客のチャージバック履歴
- 以前に異議申し立てされたカード
- ブラックリストに登録されたカード番号
- 既知の不正パターン
5. 取引特性
注文詳細を検査:
- 異常に大きな金額
- 高リスク製品カテゴリ
- 異なる国への配送
- 複数の配送先住所
実装
不正防止を有効化
不正防止はすべてのOmiseアカウントでデフォルトで有効になっています。コード変更は不要 - すべてのチャージで自動的に機能します。
API経由で不正スコアにアクセス
const charge = await omise.charges.retrieve('chrg_test_...');
console.log('Risk Score:', charge.risk_score); // 0-100
console.log('IP Country:', charge.ip_country);
console.log('Card Country:', charge.card.country);
不正データを含むチャージオブジェクト:
{
"id": "chrg_test_5rt6s9vah5lkvi1rh9c",
"amount": 100000,
"status": "pending",
"risk_score": 45,
"risk_level": "medium",
"ip": "203.113.128.45",
"ip_country": "TH",
"card": {
"country": "TH",
"financing": "credit"
}
}
手動レビューワークフロー
app.post('/webhooks/omise', async (req, res) => {
const event = req.body;
if (event.key === 'charge.complete') {
const charge = event.data;
// リスクスコアをチェック
if (charge.risk_score > 70) {
// 高リスク - 調査
await flagForManualReview(charge.id);
await notifyFraudTeam(charge);
} else if (charge.risk_score > 40) {
// 中リスク - 追加チェック
await performAdditionalVerification(charge);
}
// 低リスク - 通常処理
}
res.sendStatus(200);
});
カスタムリスクルール
async function assessCustomerRisk(charge) {
let riskScore = charge.risk_score;
// カスタムルールを追加
if (charge.amount > 500000) { // 5,000฿以上の注文
riskScore += 10;
}
if (isNewCustomer(charge.metadata.customer_id)) {
riskScore += 15;
}
if (charge.ip_country !== charge.card.country) {
riskScore += 20;
}
if (hasRecentChargebacks(charge.customer)) {
riskScore += 30;
}
return riskScore;
}
ダッシュボード管理
不正スコアを表示
- Omiseダッシュボードにログイン
- チャージに移動
- リスクインジケーターを表示:
- 🟢 低リスク - 緑のバッジ
- 🟡 中リスク - 黄色のバッジ
- 🔴 高リスク - 赤のバッジ
手動レビューキュー
- 不正 → レビューキューに移動
- フラグが立てられた取引を確認
- 取引詳細をレビュー:
- 顧客情報
- IPジオロケーションデータ
- 取引履歴
- リスク要因
- アクションを実行:
- 承認 - 支払いを処理
- 拒否 - チャージをキャンセル
- 詳細情報をリクエスト - 顧客に連絡
ベストプラクティス
1. 顧客情報を収集
const charge = await omise.charges.create({
amount: 100000,
currency: 'THB',
card: tokenId,
description: 'Order #12345',
metadata: {
customer_id: 'cust_001',
customer_email: 'john@example.com',
customer_phone: '+66876543210',
order_id: '12345',
shipping_address: '123 Main St, Bangkok',
billing_address: '123 Main St, Bangkok',
previous_orders: 5,
account_age_days: 180
}
});
2. 3D Secureを実装
高リスク取引に3D Secureを追加して責任を移転:
if (charge.risk_score > 50) {
// 中/高リスクに3D Secureを要求
const charge = await omise.charges.create({
amount: amount,
currency: 'THB',
card: tokenId,
return_uri: 'https://yourdomain.com/callback' // 3DSを有効化
});
}
3. ベロシティ制限
const RATE_LIMITS = {
per_card: { count: 3, window: 3600000 }, // 1時間に3回
per_ip: { count: 5, window: 3600000 }, // 1時間に5回
per_customer: { count: 10, window: 86400000 } // 1日に10回
};
async function checkVelocity(charge) {
const cardCharges = await getRecentCharges({
card_last_digits: charge.card.last_digits,
since: Date.now() - RATE_LIMITS.per_card.window
});
if (cardCharges.length >= RATE_LIMITS.per_card.count) {
return { blocked: true, reason: 'カードでのチャージが多すぎます' };
}
return { allowed: true };
}