3D Secure
เพิ่มการยืนยันตัวตนสองขั้นตอนจากธนาค ารเพื่อลดการฉ้อโกงมากกว่า 70% และโอนความรับผิดชอบ chargeback ไปยังผู้ออกบัตร
ภาพรวม
3D Secure (3DS) เป็นชั้นความปลอดภัยเพิ่มเติมสำหรับธุรกรรมบัตรเครดิตและเดบิตออนไลน์ที่ต้องการให้ผู้ถือบัตรผ่านขั้นตอนการยืนยันเพิ่มเติมกับธนาคารผู้ออกบัตร การยืนยันตัวตนนี้ช่วยลดการฉ้อโกงอย่างมีนัยสำคัญและโอนความรับผิดชอบ chargeback จากร้านค้าไปยังธนาคาร
ประโยชน์หลัก:
- ✅ ลดการฉ้อโกงมากกว่า 70% - การยืนยันตัวตนเพิ่มเติมป้องกันการใช้งานโดยไม่ได้รับอนุญาต
- ✅ โอนความรับผิดชอบ - ธนาคารรับผิดชอบ chargeback สำหรับธุรกรรมที่ยืนยันแล้ว
- ✅ อัตรา chargeback ที่ต่ำลง - ลดข้อพิพาทและค่าธรรมเนียมที่เกี่ยวข้อง
- ✅ ตัวเลือก Frictionless - 3DS2 อนุญาตให้อนุมัติทันทีสำหรับธุรกรรมความเสี่ยงต่ำ
- ✅ จำเป็นสำหรับการปฏิบัติตาม - บังคับใช้สำหรับประเภทธุรกิจและภูมิภาคบางแห่ง
3D Secure 1 vs 3D Secure 2
| คุณสมบัติ | 3DS1 (เลิกใช้แล้ว) | 3DS2 (มาตรฐานปัจจุบัน) |
|---|---|---|
| สถานะ | เลิกใช้ตุลาคม 2022 | ใช้งานและจำเป็น |
| วิธีการยืนยันตัวตน | OTP/SMS เท่านั้น | OTP, SMS, ไบโอเมตริกส์, การจดจำใบหน้า |
| Frictionless Flow | ไม่พร้อมใช้งาน | พร้อมใช้งานสำหรับธุรกรรมความเสี่ยงต่ำ |
| การรองรับมือถือ | จำกัด | รองรับเต็มรูปแบบในแอป |
| การแชร์ข้อมูล | จำกัด | บริบทธุรกรรมที่สมบูรณ์ (อุปกรณ์, ตำแหน่ง, ประวัติ) |
| ประสบการณ์ผู้ใช้ | ต้องมีปฏิสัมพันธ์เสมอ | การตัดสินใจอัจฉริยะตามความเสี่ยง |
| อัตราการอนุมัติ | ต่ำกว่า | สูงกว่า (frictionless ลดการละทิ้งรถเข็น) |
3D Secure 1 ถูกยกเลิกในเดือนตุลาคม 2022 การใช้งานทั้งหมดควรใช้ 3D Secure 2 (3DS2)
3DS2 ทำงานอย่างไร
Frictionless Flow
- ธนาคารวิเคราะห์ความเสี่ยงธุรกรรมโดยใช้ข้อมูลละเอียด (ID อุปกรณ์, ตำแหน่งทางภูมิศาสตร์, ประวัติก ารซื้อ)
- หากความเสี่ยงต่ำพอ ธุรกรรมได้รับการอนุมัติทันทีโดยไม่ต้องมีปฏิสัมพันธ์กับลูกค้า
- การปกป้องความรับผิดเหมือนกับ challenge flow
- ประสบการณ์ผู้ใช้ที่ดีกว่ามาก - ไม่มีการเปลี่ยนเส้นทาง, ชำระเงินเร็วขึ้น
Challenge Flow
- ใช้สำหรับธุรกรรมที่มีความเสี่ยงสูงกว่าที่ต้องการการยืนยันเพิ่มเติม
- ลูกค้าถูกเปลี่ยนเส้นทางไปยังหน้ายืนยันตัวตนของธนาคาร
- ตัวเลือกการยืนยันตัวตนหลายแบบ:
- OTP (รหัสผ่านใช้ครั้งเดียวทาง SMS)
- ไบโอเมตริกส์ (ลายนิ้วมือ, Face ID)
- การแจ้งเตือนแบบพุชแอปธนาคาร
- โดยปกติใช้เวลา 1-3 นาที
- อาจใช้เวลาถึง 10 นาทีหากเป็นการลงทะเบียนครั้งแรก
เมื่อใดควรเปิดใช้งาน 3D Secure
บังคับสำหรับ
- ✅ การเดินทางและที่พัก - โรงแรม, สายการบิน, แพลตฟอร์มการจอง
- ✅ สินค้าดิจิทัล - เพลง, ภาพยนตร์, ซอฟต์แวร์, เกม
- ✅ ไอเทมเสมือน - สกุลเงินในเกม, การซื้อในแอป
- ✅ บัตรเติมเงิน - บัตรของขวัญ, บริการเติมเงิน
- ✅ ร้านค้าความเสี่ยงสูง - ตามที่กำหนดโดยนักวิเคราะห์การฉ้อโกง
แนะนำสำหรับ
- ธุรกรรมมูลค่าสูง (> 10,000 บาทหรือเทียบเท่า)
- ธุรกิจที่มีอัตรา chargeback > 0.3%
- ธุรกรรมบัตรระหว่างประเทศ
- ลูกค้าครั้งแรก
- รูปแบบธุรกรรมที่น่าสงสัย
ไม่แนะนำสำหรับ
- ❌ การสมัครสมาชิกแบบเกิดซ้ำ - ป้องกันการเรียกเก็บเงินอัตโนมัติ
- ❌ การซื้อซ้ำด้วยคลิกเดียว - ต้องการปฏิสัมพันธ์ทุกครั้ง
- ❌ ธุรกรรมมูลค่าต่ำ - อาจลดการแปลงในการซื้อจำนวนเล็ก
สำหรับการสมัครสมาชิก: ใช้ 3DS สำหรับการตั้งค่าบัตรเริ่มต้น จากนั้นเรียกเก็บเงิน customer ID ที่บันทึกไว้โดยไม่ใช้ 3DS สำหรับการชำระเงินครั้งต่อไป (ขึ้นอยู่กับกฎของธนาคาร)
คู่มือการใช้งาน
ขั้นตอนที่ 1: เปิดใช้งาน 3DS ในบัญชีของคุณ
ติดต่อฝ่ายสนับสนุน Omise เพื่อเปิดใช้งาน 3D Secure:
Email: support@omise.co
หัวเรื่อง: เปิดใช้งาน 3D Secure สำหรับ [บัญชีของคุณ]
ขั้นตอนที่ 2: สร้าง Token (กระบวนการมาตรฐาน)
// ฝั่งไคลเอ็นต์: สร้าง token ตามปกติ
Omise.setPublicKey("pkey_test_YOUR_KEY");
Omise.createToken("card", {
name: "John Doe",
number: "4242424242424242",
expiration_month: 12,
expiration_year: 2027,
security_code: "123"
}, function(statusCode, response) {
if (statusCode === 200) {
// ส่ง token ไปยังเซิร์ฟเวอร์
submitToServer(response.id);
}
});
ขั้นตอนที่ 3: สร้าง Charge พร้อม return_uri
พารามิเตอร์ return_uri จำเป็น สำหรับ 3DS:
- cURL
- Node.js
- PHP
- Python
curl https://api.omise.co/charges \
-u skey_test_YOUR_SECRET_KEY: \
-d "amount=100000" \
-d "currency=THB" \
-d "card=tokn_test_..." \
-d "return_uri=https://yourdomain.com/payment/callback"
const omise = require('omise')({
secretKey: 'skey_test_YOUR_SECRET_KEY'
});
const charge = await omise.charges.create({
amount: 100000,
currency: 'THB',
card: tokenId,
return_uri: 'https://yourdomain.com/payment/callback'
});
// ตรวจสอบว่าต้องการการยืนยันตัวตน 3DS หรือไม่
if (charge.authorize_uri) {
// เปลี่ยนเส้นทางลูกค้าไปยัง authorize_uri สำหรับการยืนยันตัวตน
res.redirect(charge.authorize_uri);
} else {
// Charge เสร็จสมบูรณ์โดยไม่ใช้ 3DS (frictionless)
handleSuccess(charge);
}
<?php
$charge = OmiseCharge::create(array(
'amount' => 100000,
'currency' => 'THB',
'card' => $tokenId,
'return_uri' => 'https://yourdomain.com/payment/callback'
));
if (isset($charge['authorize_uri'])) {
// เปลี่ยนเส้นทางไปยังการยืนยันตัวตน 3DS
header('Location: ' . $charge['authorize_uri']);
exit;
} else {
// Charge สำเร็จ (frictionless flow)
handleSuccess($charge);
}
?>
import omise
omise.api_secret = 'skey_test_YOUR_SECRET_KEY'
charge = omise.Charge.create(
amount=100000,
currency='THB',
card=token_id,
return_uri='https://yourdomain.com/payment/callback'
)
if charge.authorize_uri:
# เปลี่ยนเส้นทางไปยังหน้า 3DS
return redirect(charge.authorize_uri)
else:
# Frictionless สำเร็จ
return handle_success(charge)
ขั้นตอนที่ 4: จัดการการเปลี่ยนเส้นทางลูกค้า
หาก authorize_uri มีอยู่ในการตอบกลับ ให้เปลี่ยนเส้นทางลูกค้า:
// ฝั่ งเซิร์ฟเวอร์
app.post('/create-charge', async (req, res) => {
const charge = await omise.charges.create({
amount: req.body.amount,
currency: 'THB',
card: req.body.token,
return_uri: 'https://yourdomain.com/payment/callback',
metadata: {
order_id: req.body.order_id
}
});
if (charge.authorize_uri) {
// ต้องการการยืนยันตัวตน 3DS
res.json({
requires_3ds: true,
authorize_uri: charge.authorize_uri,
charge_id: charge.id
});
} else {
// Frictionless - charge เสร็จสมบูรณ์
res.json({
requires_3ds: false,
status: charge.status,
charge_id: charge.id
});
}
});
// ฝั่งไคลเอ็นต์
fetch('/create-charge', {
method: 'POST',
body: JSON.stringify({ token, amount, order_id })
})
.then(res => res.json())
.then(data => {
if (data.requires_3ds) {
// เปลี่ยนเส้นทางไปยังการยืนยันตัวตน 3DS
window.location.href = data.authorize_uri;
} else {
// การชำระเงินเสร็จสมบูรณ์
window.location.href = '/payment-success';
}
});