تصميم محرّك قواعد الاحتيال لـ B2B 2026 — السرعة وتقييم BIN والبصمة
يختلف احتيال B2B في السلع الرقمية عن B2C — عدد معاملات أقل، لكن متوسط فاتورة أعلى (200–2000 دولار)، وردّ المبلغ يكلّفك المنتج ورسوم التبادل ورسوم النزاع. هذا المقال هو المخطط لمحرّك قواعد احتيال يلتقط أكثر من 70% من الاحتيال بنسبة إيجابيات كاذبة أقل من 0.5%.
يعيش محرّك الاحتيال بالكامل في نظامك ويعمل قبل أن تستدعي POST /api/orders على FoxReload. وبمجرد تقديم الطلب وتنفيذه، تُسلَّم الأكواد — فطبقة الاحتيال لديك هي البوّابة التي تقرّر ما إذا كان ينبغي استدعاء الـ API من الأساس.
1. قواعد السرعة — الأساس
السرعة = تكرار الإجراءات لكل نافذة زمنية. المجموعة الأساسية:
type FraudSignal = { rule: string; score: number; reason: string };
async function checkVelocity(order: Order): Promise<FraudSignal[]> {
const signals: FraudSignal[] = [];
const ipCount = await redis.zcount(`vel:ip:${order.ip}`, Date.now() - 600_000, '+inf');
if (ipCount > 5) signals.push({ rule: 'ip_velocity', score: 80, reason: '>5 orders/10min' });
const cards = await redis.scard(`vel:cards:${order.userId}:24h`);
if (cards > 3) signals.push({ rule: 'multi_card', score: 60, reason: '>3 cards/24h' });
return signals;
}
التخزين — مجموعات Redis المرتّبة بمدة بقاء TTL = النافذة. الكتابة — ZADD vel:ip:1.2.3.4 NOW order_id + EXPIRE 600.
2. تقييم مخاطر BIN
تحدّد أول 6–8 أرقام من رقم البطاقة (BIN) البنك المُصدِر. يحتفظ معظم مزوّدي مكافحة الاحتيال بجدول مخاطر BIN:
const binRisk = await binLookup(card.bin); // 0..100
if (binRisk > 70) flags.push({ rule: 'high_risk_bin', score: 50, reason: `BIN ${card.bin}` });
if (binRisk === 100) return reject('blocked_bin'); // prepaid mass-issuance cards
نطاقات BIN عالية المخاطر هي البطاقات مسبقة الدفع (خاصة المُصدَرة بكميات كبيرة من جهات غير مصرفية)، والبطاقات من ولايات خاضعة لعقوبات، ونطاقات BIN المرصودة في موجات احتيال حديثة. حدّث الجدول أسبوعيًا.
3. بصمة الجهاز
بصمة بلا كوكيز (fpjs، ClientJS):
import FingerprintJS from '@fingerprintjs/fingerprintjs-pro';
const fp = await FingerprintJS.load({ apiKey: process.env.FPJS_KEY });
const result = await fp.get();
// result.visitorId — stable hash, ~99% accuracy
const fpHistory = await db.fingerprints.find({ visitorId: result.visitorId });
if (fpHistory.chargebackCount > 0) flag.score += 90;
يربط هذا "جهازًا حقيقيًا واحدًا — بحسابات كثيرة" ويلتقط احتيال إنشاء الحسابات بكميات كبيرة.
4. مقارنة — Sift وSumsub والبناء الداخلي
| المزوّد | النوع | التكلفة/المعاملة | الإعداد | الدقة |
|---|---|---|---|---|
| قواعد JSON الداخلية | قواعد | 0 دولار | 1–2 أسبوع | 60–70% |
| Sift | تعلّم آلي كخدمة | 0.04 دولار | يوم واحد | 85–92% |
| Sumsub | KYC + احتيال | 0.50–1.50 دولار | 3 أيام | 80–88% |
| Riskified | ضمان ردّ المبالغ | 0.8–1.2% من الحجم | أسبوعان | أكثر من 90% |
| Stripe Radar | مدمج في المدفوعات | 0.5%/قرار | 0 | 75–85% |
التوصية لشركاء FoxReload — حتى 500 ألف دولار شهريًا — قواعد داخلية + Stripe Radar. فوق 500 ألف دولار شهريًا — أضف Sift أو Riskified. اعتمد Sumsub فقط إذا كنت تحتاج أيضًا إلى KYC.
نقطة التكامل مع FoxReload
شغّل فحوصات الاحتيال لديك قبل استدعاء POST /api/orders. بوّابة نموذجية:
async function processOrder(customerOrder: CustomerOrder) {
const signals = await checkVelocity(customerOrder);
const score = signals.reduce((s, sig) => s + sig.score, 0);
if (score >= 100) {
return { decision: 'reject', reasons: signals };
}
if (score >= 50) {
await queueForManualReview(customerOrder);
return { decision: 'hold' };
}
// Safe to proceed — call FoxReload
const order = await fetch('https://public-api.foxreload.com/api/orders', {
method: 'POST',
headers: { 'X-API-Key': process.env.FOXRELOAD_KEY, 'Content-Type': 'application/json' },
body: JSON.stringify({
items: [{ itemId: customerOrder.productId, quantity: customerOrder.qty }],
}),
});
return { decision: 'approved', order: await order.json() };
}
محرّك الاحتيال لديك هو خط الدفاع الأول. يعالج FoxReload ما ترسله — وتصفية المخاطر مسؤوليتك أنت. احصل على الوصول.
