FPX (Financial Process Exchange)
ยอมรับการโอนเงินธนาคารออนไลน์ทันที จากธนาคารมาเลเซีย 19 แห่งขึ้นไปผ่าน FPX เกตเวย์การชำระเงินระหว่างธนาคารของมาเลเซีย โดยมีการนำมาใช้อย่างแพร่หลายทั่วทั้งประเทศ
ภาพรวม
FPX (Financial Process Exchange) เป็นเกตเวย์ชำระเงินธนาคารออนไลน์ของมาเลเซีย ที่ดำเนินการโดย PayNet ทำให้ลูกค้าสามารถชำระเงินจากบัญชีธนาคารผ่านอินเทอร์เน็ตแบงก์กิ้ง ซึ่งเป็นหน ึ่งในวิธีการชำระเงินที่ได้รับความนิยมมากที่สุดในประเทศมาเลเซียสำหรับการซื้อขายอิเล็กทรอนิกส์
คุณลักษณะหลัก:
- ✅ ธนาคาร 19 แห่งขึ้นไป - รองรับธนาคารมาเลเซียหลักทั้งหมด
- ✅ ระบบการสนับสนุนของชาติ - เกตเวย์ระหว่างธนาคารอย่างเป็นทางการของมาเลเซีย
- ✅ ยืนยันทันที - การประมวลผลการชำระเงินแบบเรียลไทม์
- ✅ ขีดจำกัดสูง - ได้ถึง RM30,000 ต่อธุรกรรม
- ✅ ไม่ต้องลงทะเบียน - ลูกค้าใช้อินเทอร์เน็ตแบงก์กิ้งที่มีอยู่
- ✅ น่าเชื่อถือ - ดำเนินการโดย PayNet (ธนาคารแห่งชาติมาเลเซีย)
ภูมิภาคที่รองรับ
| Region | Currency | Min Amount | Max Amount | API Version |
|---|---|---|---|---|
| Malaysia | MYR | RM1.00 | RM30,000.00 | 2017-11-02 |
ธนาคารที่รองรับ
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 ธนาคาร)
วิธีการทำงาน
ประสบการณ์ลูกค้า:
- ลูกค้าเลือก "FPX" ที่ชำระเงิน
- เปลี่ยนเส้นทางไปยังเกตเวย์ FPX
- เลือกธนาคารจากรายการ
- เปลี่ยนเส้นทางไปยังอินเทอร์เน็ตแบงก์กิ้งของธนาคารที่เลือก
- เข้าสู่ระบบด้วยข้อมูลประจำตัวอินเทอร์เน็ตแบงก์กิ้ง
- ตรวจสอบและอนุญาตการชำระเงิน
- กลับไปยังไซต์ผู้ค้า
เวลาทั่วไปในการทำให้สำเร็จ: 2-5 นาที
ตัวอย่างการไหลของการชำระเงิน
การเลือกธนาคารและการเข้าสู่ระบบ:

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

การให้สิทธิ์และการทำให้ธุรกรรมสมบูรณ์:
- ❽ ตรวจสอบรายละเอียด - ชื่อผู้ค้า จำนวนการชำระเงิน และหมายเลขอ้างอิงปรากฏ
- ❾ ตรวจสอบบัญชี - ยืนยันบัญชีแหล่งการชำระเงิน
- ❿ อนุญาตการชำระเงิน - คลิกปุ่มยืนยันเพื่ออนุมัติการโอน
- ⓫ กำลังประมวลผล - ธนาคารประมวลผลการโอนระหว่างธนาคารผ่าน FPX
- ⓬ ยืนยันความสำเร็จ - ข้อความเสร็จสิ้นการชำระเงินพร้อมหมายเลขธุรกรรม
- ⓭ กลับไปยังผู้ค้า - เปลี่ยนเส้นทางกลับไปยังหน้ายืนยันของผู้ค้า
การเพิ่มประสิทธิภาพ
ขั้นตอนที่ 1: สร้างแหล่งที่มา FPX
- cURL
- Node.js
- PHP
- Python
- Ruby
- Go
- Java
- C#
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"
const omise = require('omise')({
secretKey: 'skey_test_YOUR_SECRET_KEY'
});
const source = await omise.sources.create({
type: 'fpx',
amount: 10000, // MYR 100.00
currency: 'MYR',
email: 'customer@example.com' // ไม่บังคับแต่แนะนำ
});
<?php
$source = OmiseSource::create(array(
'type' => 'fpx',
'amount' => 10000,
'currency' => 'MYR',
'email' => 'customer@example.com'
));
?>
import omise
omise.api_secret = 'skey_test_YOUR_SECRET_KEY'
source = omise.Source.create(
type='fpx',
amount=10000,
currency='MYR',
email='customer@example.com'
)
require 'omise'
Omise.api_key = 'skey_test_YOUR_SECRET_KEY'
source = Omise::Source.create({
type: 'fpx',
amount: 10000,
currency: 'MYR',
email: 'customer@example.com'
})
source, err := client.Sources().Create(&operations.CreateSource{
Type: "fpx",
Amount: 10000,
Currency: "MYR",
Email: "customer@example.com",
})
Source source = client.sources().create(new Source.CreateParams()
.type("fpx")
.amount(10000L)
.currency("MYR")
.email("customer@example.com"));
var source = await client.Sources.Create(new CreateSourceRequest
{
Type = "fpx",
Amount = 10000,
Currency = "MYR",
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 เดือนหลังจากธุรกรรมเดิม การคืนเงินแบบเต็มและบางส่วนได้รับการอนุญาต