ข้ามไปยังเนื้อหาหลัก

FPX (Financial Process Exchange)

ยอมรับการโอนเงินธนาคารออนไลน์ทันที จากธนาคารมาเลเซีย 19 แห่งขึ้นไปผ่าน FPX เกตเวย์การชำระเงินระหว่างธนาคารของมาเลเซีย โดยมีการนำมาใช้อย่างแพร่หลายทั่วทั้งประเทศ

ภาพรวม

FPX (Financial Process Exchange) เป็นเกตเวย์ชำระเงินธนาคารออนไลน์ของมาเลเซีย ที่ดำเนินการโดย PayNet ทำให้ลูกค้าสามารถชำระเงินจากบัญชีธนาคารผ่านอินเทอร์เน็ตแบงก์กิ้ง ซึ่งเป็นหนึ่งในวิธีการชำระเงินที่ได้รับความนิยมมากที่สุดในประเทศมาเลเซียสำหรับการซื้อขายอิเล็กทรอนิกส์

คุณลักษณะหลัก:

  • ธนาคาร 19 แห่งขึ้นไป - รองรับธนาคารมาเลเซียหลักทั้งหมด
  • ระบบการสนับสนุนของชาติ - เกตเวย์ระหว่างธนาคารอย่างเป็นทางการของมาเลเซีย
  • ยืนยันทันที - การประมวลผลการชำระเงินแบบเรียลไทม์
  • ขีดจำกัดสูง - ได้ถึง RM30,000 ต่อธุรกรรม
  • ไม่ต้องลงทะเบียน - ลูกค้าใช้อินเทอร์เน็ตแบงก์กิ้งที่มีอยู่
  • น่าเชื่อถือ - ดำเนินการโดย PayNet (ธนาคารแห่งชาติมาเลเซีย)

ภูมิภาคที่รองรับ

ภูมิภาคสกุลเงินจำนวนขั้นต่ำจำนวนสูงสุดวงเงินรายวัน
มาเลเซียMYRRM1.00RM30,000แตกต่างกันไปตามธนาคาร

ธนาคารที่รองรับ

FPX รองรับธนาคารมาเลเซีย 19 แห่งขึ้นไป:

ธนาคารหลัก:

  • Affin ธนาคาร
  • Alliance ธนาคาร
  • AmBank
  • ธนาคาร Islam
  • ธนาคาร Muamalat
  • ธนาคาร Rakyat
  • BSN (ธนาคาร Simpanan Nasional)
  • CIMB ธนาคาร
  • Hong Leong ธนาคาร
  • HSBC ธนาคาร
  • Kuwait Finance House
  • Maybank
  • OCBC ธนาคาร
  • Public ธนาคาร
  • RHB ธนาคาร
  • Standard Chartered
  • UOB (United Overseas ธนาคาร)

วิธีการทำงาน

ประสบการณ์ลูกค้า:

  1. ลูกค้าเลือก "FPX" ที่ชำระเงิน
  2. เปลี่ยนเส้นทางไปยังเกตเวย์ FPX
  3. เลือกธนาคารจากรายการ
  4. เปลี่ยนเส้นทางไปยังอินเทอร์เน็ตแบงก์กิ้งของธนาคารที่เลือก
  5. เข้าสู่ระบบด้วยข้อมูลประจำตัวอินเทอร์เน็ตแบงก์กิ้ง
  6. ตรวจสอบและอนุญาตการชำระเงิน
  7. กลับไปยังไซต์ผู้ค้า

เวลาทั่วไปในการทำให้สำเร็จ: 2-5 นาที

ตัวอย่างการไหลของการชำระเงิน

การเลือกธนาคารและการเข้าสู่ระบบ:

การเลือก��ธนาคารและการเข้าสู่ระบบ

ขั้นตอนการตรวจสอบสิทธิ์เกตเวย์ FPX:

  • ❶ เลือก FPX - ลูกค้าเลือกการโอนธนาคาร FPX ที่ชำระเงิน
  • ❷ เปลี่ยนเส้นทางไปยัง FPX - นำทางไปยังเกตเวย์ชำระเงิน FPX ของมาเลเซีย
  • ❸ เลือกธนาคาร - เลือกจากรายการธนาคารที่เข้าร่วม 19 แห่งขึ้นไป
  • ❹ เปลี่ยนเส้นทางธนาคาร - ส่งต่อไปยังพอร์ทัลอินเทอร์เน็ตแบงก์กิ้งของธนาคารที่เลือก
  • ❺ เข้าสู่ระบบ - ใส่ชื่อผู้ใช้และรหัสผ่านอินเทอร์เน็ตแบงก์กิ้ง
  • ❻ ตรวจสอบ 2FA - ทำการตรวจสอบสิทธิ์สองขั้นตอน (TAC/OTP)
  • ❼ ตรวจสอบสิทธิ์สมบูรณ์ - ดำเนินการให้สิทธิ์การชำระเงิน

ยืนยันการชำระเงิน:

ยืนยันการชำระเงิน

การให้สิทธิ์และการทำให้ธุรกรรมสมบูรณ์:

  • ❽ ตรวจสอบรายละเอียด - ชื่อผู้ค้า จำนวนการชำระเงิน และหมายเลขอ้างอิงปรากฏ
  • ❾ ตรวจสอบบัญชี - ยืนยันบัญชีแหล่งการชำระเงิน
  • ❿ อนุญาตการชำระเงิน - คลิกปุ่มยืนยันเพื่ออนุมัติการโอน
  • ⓫ กำลังประมวลผล - ธนาคารประมวลผลการโอนระหว่างธนาคารผ่าน FPX
  • ⓬ ยืนยันความสำเร็จ - ข้อความเสร็จสิ้นการชำระเงินพร้อมหมายเลขธุรกรรม
  • ⓭ กลับไปยังผู้ค้า - เปลี่ยนเส้นทางกลับไปยังหน้ายืนยันของผู้ค้า

การเพิ่มประสิทธิภาพ

ขั้นตอนที่ 1: สร้างแหล่งที่มา FPX

curl https://api.omise.co/sources \
-u skey_test_YOUR_SECRET_KEY: \
-d "type=fpx" \
-d "amount=10000" \
-d "currency=MYR" \
-d "email=customer@example.com"

การตอบสนอง:

{
"object": "source",
"id": "src_test_5rt6s9vah5lkvi1rh9c",
"type": "fpx",
"flow": "redirect",
"amount": 10000,
"currency": "MYR",
"email": "customer@example.com"
}

ขั้นตอนที่ 2: สร้างค่าใช้

curl https://api.omise.co/charges \
-u skey_test_YOUR_SECRET_KEY: \
-d "amount=10000" \
-d "currency=MYR" \
-d "source=src_test_5rt6s9vah5lkvi1rh9c" \
-d "return_uri=https://yourdomain.com/payment/callback"

ขั้นตอนที่ 3: เปลี่ยนเส้นทางลูกค้า

app.post('/checkout/fpx', async (req, res) => {
try {
const { amount, order_id, customer_email } = req.body;

// ตรวจสอบจำนวนเงิน
if (amount < 100 || amount > 3000000) {
return res.status(400).json({
error: 'จำนวนเงินต้องอยู่ระหว่าง RM1 ถึง RM30,000'
});
}

// สร้างแหล่งที่มา
const source = await omise.sources.create({
type: 'fpx',
amount: amount,
currency: 'MYR',
email: customer_email
});

// สร้างค่าใช้
const charge = await omise.charges.create({
amount: amount,
currency: 'MYR',
source: source.id,
return_uri: `${process.env.BASE_URL}/payment/callback`,
metadata: {
order_id: order_id
}
});

// เปลี่ยนเส้นทางไปยัง FPX
res.redirect(charge.authorize_uri);

} catch (error) {
console.error('ข้อผิดพลาด FPX:', error);
res.status(500).json({ error: error.message });
}
});

ขั้นตอนที่ 4: จัดการการคืน

app.get('/payment/callback', async (req, res) => {
try {
const chargeId = req.query.charge_id;
const charge = await omise.charges.retrieve(chargeId);

if (charge.status === 'successful') {
await processOrder(charge.metadata.order_id);
res.redirect('/payment-success');
} else if (charge.status === 'failed') {
res.redirect('/payment-failed?reason=' + charge.failure_message);
} else {
res.redirect('/payment-pending');
}
} catch (error) {
res.redirect('/payment-error');
}
});

ขั้นตอนที่ 5: จัดการ Webhook

app.post('/webhooks/omise', (req, res) => {
const event = req.body;

if (event.key === 'charge.complete' && event.data.source.type === 'fpx') {
const charge = event.data;

if (charge.status === 'successful') {
processOrder(charge.metadata.order_id);
} else if (charge.status === 'failed') {
handleFailedPayment(charge.metadata.order_id);
}
}

res.sendStatus(200);
});

ตัวอย่างการเพิ่มประสิทธิภาพที่สมบูรณ์

// เซิร์ฟเวอร์ Express.js
const express = require('express');
const omise = require('omise')({
secretKey: process.env.OMISE_SECRET_KEY
});

const app = express();
app.use(express.json());

app.post('/checkout/fpx', async (req, res) => {
try {
const { amount, order_id, customer_email } = req.body;

// ตรวจสอบจำนวนเงิน (RM1 - RM30,000)
if (amount < 100 || amount > 3000000) {
return res.status(400).json({
error: 'จำนวนเงินต้องอยู่ระหว่าง RM1 ถึง RM30,000'
});
}

// ตรวจสอบอีเมล
if (!customer_email || !customer_email.includes('@')) {
return res.status(400).json({
error: 'ต้องมีที่อยู่อีเมลที่ถูกต้องสำหรับการชำระเงิน FPX'
});
}

// สร้างแหล่งที่มา
const source = await omise.sources.create({
type: 'fpx',
amount: amount,
currency: 'MYR',
email: customer_email
});

// สร้างค่าใช้
const charge = await omise.charges.create({
amount: amount,
currency: 'MYR',
source: source.id,
return_uri: `${process.env.BASE_URL}/payment/callback`,
metadata: {
order_id: order_id,
payment_method: 'fpx',
customer_email: customer_email
}
});

// ส่งคืน URL การให้สิทธิ์
res.json({
authorize_uri: charge.authorize_uri,
charge_id: charge.id
});

} catch (error) {
console.error('ข้อผิดพลาด FPX:', error);
res.status(500).json({ error: error.message });
}
});

// ตัวจัดการการเรียกกลับ
app.get('/payment/callback', async (req, res) => {
try {
const chargeId = req.query.charge_id;
const charge = await omise.charges.retrieve(chargeId);

if (charge.status === 'successful') {
res.redirect(`/order-success?order=${charge.metadata.order_id}`);
} else {
res.redirect(`/payment-failed?charge=${chargeId}`);
}
} catch (error) {
res.redirect('/payment-error');
}
});

// ตัวจัดการ Webhook
app.post('/webhooks/omise', (req, res) => {
const event = req.body;

if (event.key === 'charge.complete') {
const charge = event.data;

if (charge.source.type === 'fpx') {
if (charge.status === 'successful') {
updateOrderStatus(charge.metadata.order_id, 'paid');
sendConfirmation(charge.metadata.customer_email);
} else {
updateOrderStatus(charge.metadata.order_id, 'failed');
}
}
}

res.sendStatus(200);
});

app.listen(3000);

สนับสนุนการคืนเงิน

FPX รองรับการคืนเงินเต็มและบางส่วนภายใน6 เดือน:

// การคืนเงินแบบเต็ม
const fullRefund = await omise.charges.refund('chrg_test_...', {
amount: 10000
});

// การคืนเงินแบบบางส่วน
const partialRefund = await omise.charges.refund('chrg_test_...', {
amount: 5000 // คืนเงินครึ่งหนึ่ง
});
หน้าต่างการคืนเงิน

การคืนเงินได้รับการสนับสนุนภายใน 6 เดือนหลังจากธุรกรรมเดิม การคืนเงินแบบเต็มและบางส่วนได้รับการอนุญาต

ปัญหาทั่วไป & การแก้ไขปัญหา

ปัญหา: ธนาคารไม่พร้อมใช้งาน

สาเหตุ: ธนาคารของลูกค้าไม่พร้อมใช้งานชั่วคราวหรืออยู่ระหว่างการบำรุงรักษา

วิธีแก้ไข:

  • แสดงสถานะความพร้อมของธนาคารแบบเรียลไทม์ (ถ้า FPX ให้ไว้)
  • แสดงวิธีการชำระเงินอื่นๆ
  • ให้ข้อมูลเวลาหยุดให้บริการโดยประมาณ

ปัญหา: การหมดเวลาการชำระเงิน

สาเหตุ: ลูกค้าหยุดการชำระเงินที่หน้าอินเทอร์เน็ตแบงก์กิ้งของธนาคาร

วิธีแก้ไข:

// ตั้งค่าหมดเวลาที่สมเหตุสมผล
const TIMEOUT = 30 * 60 * 1000; // 30 นาที

setTimeout(() => {
if (!paymentConfirmed) {
showTimeoutMessage();
allowRetry();
}
}, TIMEOUT);

ปัญหา: เกินขีดจำกัดการทำธุรกรรม

ข้อผิดพลาด: จำนวนเงินเกินขีดจำกัดของธนาคาร

วิธีแก้ไข:

  • แสดงข้อมูลขีดจำกัดที่ชัดเจน (สูงสุด RM30,000)
  • เสนอการแบ่งออกเป็นธุรกรรมหลายรายการ
  • ให้วิธีการชำระเงินที่มีมูลค่าสูงเป็นทางเลือก

ปัญหา: ลูกค้าปิดเบราว์เซอร์

สาเหตุ: Return URI ไม่ได้เรียก

วิธีแก้ไข:

  • นำการจัดการ Webhook ไปใช้ (น่าเชื่อถือมากขึ้น)
  • ให้หน้าตรวจสอบสถานะคำสั่ง
  • ส่งอีเมลยืนยัน

การปฏิบัติที่ดีที่สุด

1. แสดงการเลือกธนาคาร

<div class="fpx-instructions">
<h3>ชำระเงินด้วย FPX Online Banking</h3>
<p>คุณจะสามารถเลือกจากธนาคารเหล่านี้:</p>
<ul class="bank-list">
<li>Maybank</li>
<li>CIMB ธนาคาร</li>
<li>Public ธนาคาร</li>
<li>RHB ธนาคาร</li>
<li>Hong Leong ธนาคาร</li>
<li>AmBank</li>
<li>และธนาคารอื่น ๆ อีก 13 แห่ง...</li>
</ul>
<p><strong>ข้อกำหนด:</strong></p>
<ul>
<li>เปิดใช้งานอินเทอร์เน็ตแบงก์กิ้งบนบัญชีของคุณ</li>
<li>ยอดเงินเพียงพอ</li>
<li>จำนวนการชำระเงิน: RM1 - RM30,000</li>
</ul>
</div>

2. รวบรวมที่อยู่อีเมล

// อีเมลไม่บังคับแต่แนะนำสำหรับใบเสร็จ
function validateCheckout(data) {
if (!data.email || !data.email.includes('@')) {
throw new Error('โปรดระบุที่อยู่อีเมลที่ถูกต้อง');
}

return true;
}

3. ตรวจสอบจำนวนเงิน

function validateFPXAmount(amount) {
const MIN = 100; // RM1.00
const MAX = 3000000; // RM30,000.00

if (amount < MIN) {
return 'จำนวนเงินขั้นต่ำคือ RM1.00';
}

if (amount > MAX) {
return 'จำนวนเงินสูงสุดคือ RM30,000.00';
}

return null; // ถูกต้อง
}

4. ใช้ Webhooks

// Webhook เป็นวิธีการแจ้งเตือนหลัก
app.post('/webhooks/omise', handleWebhook);

// การเรียกกลับเป็นสำรอง
app.get('/payment/callback', handleCallback);

5. จัดการการบำรุงรักษาธนาคาร

// ตรวจสอบหน้าต่างการบำรุงรักษาที่ทราบ
const MAINTENANCE_SCHEDULE = {
'maybank': { day: 'sunday', time: '00:00-06:00' },
'cimb': { day: 'sunday', time: '01:00-05:00' }
};

function checkMaintenanceWindow(bank) {
const now = new Date();
// ตรวจสอบว่าเวลาปัจจุบันอยู่ในหน้าต่างการบำรุงรักษา
// แสดงคำเตือนให้ลูกค้า
}

คำถามที่พบบ่อย

FPX คืออะไร?

FPX (Financial Process Exchange) เป็นเกตเวย์ชำระเงินธนาคารออนไลน์ของมาเลเซีย ที่ดำเนินการโดย PayNet ทำให้เชื่อมต่อธนาคารมาเลเซีย 19 แห่งขึ้นไปสำหรับการชำระเงินออนไลน์ทันที

ลูกค้าต้องลงทะเบียน FPX หรือไม่?

ไม่ ลูกค้าใช้บัญชีอินเทอร์เน็ตแบงก์กิ้งที่มีอยู่ของพวกเขา ไม่ต้องลงทะเบียน FPX แยกต่างหาก

ขีดจำกัดการทำธุรกรรมมีเท่าใด?
  • ขั้นต่ำ: RM1.00
  • สูงสุด: RM30,000 ต่อธุรกรรม
  • ขีดจำกัดรายวัน: แตกต่างกันไปตามธนาคาร (โดยทั่วไป RM30,000-RM100,000)
การชำระเงินต้องใช้เวลานานเท่าใด?

การชำระเงิน FPX ได้รับการประมวลผลแบบทันที แต่การชำระเงินไปยังบัญชีผู้ค้าโดยทั่วไปต้องใช้เวลา 1-3 วันทำการ ตรวจสอบแดชบอร์ด Omise เพื่อดูตารางเวลาการชำระเงิน

ฉันสามารถคืนเงินการชำระเงิน FPX ได้หรือไม่?

ใช่ FPX รองรับการคืนเงินแบบเต็มและบางส่วนภายใน 6 เดือนหลังจากธุรกรรมเดิม

จะเกิดอะไรขึ้นหากธนาคารของลูกค้าอยู่ระหว่างการบำรุงรักษา?

ธนาคารบางครั้งมีหน้าต่างการบำรุงรักษาตามกำหนด (โดยปกติคือเช้าวันอาทิตย์) ลูกค้าสามารถ:

  1. รอให้ธนาคารพร้อมใช้งาน
  2. ใช้ธนาคารอื่น
  3. เลือกวิธีการชำระเงินอื่น
FPX พร้อมใช้งาน 24/7 หรือไม่?

เกตเวย์ FPX พร้อมใช้งาน 24/7 แต่ธนาคารแต่ละแห่งอาจมีหน้าต่างการบำรุงรักษา (โดยปกติคือเช้าวันอาทิตย์) ธนาคารส่วนใหญ่พร้อมใช้งาน 24/7

การทดสอบ

โหมดทดสอบ

FPX สามารถทดสอบได้โดยใช้ API keys การทดสอบของคุณ ในโหมดทดสอบ:

ข้อมูลประจำตัวการทดสอบ:

  • ใช้ test API keys (skey_test_xxx)
  • สกุลเงิน: MYR (เรینจิตมาเลเซีย)
  • แนะนำให้ใช้ช่องอีเมลสำหรับการทดสอบ
  • ไม่ต้องมีบัญชีธนาคารจริง

การไหลของการทดสอบ:

  1. สร้างแหล่งที่มาและค่าใช้ด้วย test API keys
  2. ลูกค้าเปลี่ยนเส้นทางไป authorize_uri ของการทดสอบ
  3. หน้าการทดสอบจำลองการเลือกธนาคาร FPX และการให้สิทธิ์
  4. ใช้การดำเนินการแดชบอร์ด Omise เพื่อทำเครื่องหมายค่าใช้ว่าสำเร็จ/ล้มเหลว
  5. ตรวจสอบการจัดการ webhook และ return_uri

การเพิ่มประสิทธิภาพการทดสอบ:

// การทดสอบ FPX
const source = await omise.sources.create({
type: 'fpx',
amount: 10000, // RM100.00
currency: 'MYR',
email: 'customer@example.com'
});

const charge = await omise.charges.create({
amount: 10000,
currency: 'MYR',
source: source.id,
return_uri: 'https://example.com/callback'
});

console.log('URL การให้สิทธิ์ของการทดสอบ:', charge.authorize_uri);

สถานการณ์การทดสอบ:

  • การชำระเงินสำเร็จ: ดำเนินการตามลำดับการเปลี่ยนเส้นทางและการประมวลผลคำสั่ง
  • การชำระเงินล้มเหลว: ทดสอบการจัดการข้อผิดพลาดและข้อความผู้ใช้
  • ขีดจำกัดจำนวนเงิน: ทดสอบขั้นต่ำ RM1 และสูงสุด RM30,000
  • การเลือกธนาคาร: ทดสอบการไหลของธนาคารที่แตกต่างกัน
  • หมดเวลา: ทดสอบสถานการณ์การชำระเงินที่ถูกทิ้ง (ลูกค้าไม่สมบูรณ์)
  • Return URI: ตรวจสอบการส่งกลับที่เหมาะสมหลังการชำระเงิน
  • การส่งมอบ Webhook: ตรวจสอบทั้งหมด webhook เหตุการณ์ได้รับ

หมายเหตุสำคัญ:

  • โหมดทดสอบไม่เชื่อมต่อกับเซิร์ฟเวอร์ FPX หรือธนาคารจริง
  • ใช้แดชบอร์ดเพื่อจำลองการเปลี่ยนสถานะการชำระเงิน
  • ทดสอบการไหลของการเปลี่ยนเส้นทางแบบสมบูรณ์
  • ตรวจสอบการจัดการ webhook สำหรับสถานะค่าใช้ทั้งหมด
  • ทดสอบสถานการณ์ทั้งที่สำเร็จและล้มเหลว
  • ตรวจสอบการรวบรวมช่องอีเมล

สำหรับแนวทางการทดสอบที่ครอบคลุม โปรดดู เอกสารการทดสอบ

ทรัพยากรที่เกี่ยวข้อง

ขั้นตอนต่อไป

  1. สร้างแหล่งที่มา FPX
  2. นำการไหลของการเปลี่ยนเส้นทางไปใช้
  3. ตั้งค่าการจัดการ Webhook
  4. ทดสอบการไหลของการชำระเงิน
  5. ไปยังสด