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

Touch 'n Go eWallet

รับชำระเงินจาก Touch 'n Go eWallet กระเป๋าเงินดิจิทัลที่ได้รับความนิยมสูงสุดของมาเลเซีย ที่มีผู้ใช้งานมากกว่า 17 ล้านรายและเครือข่ายผู้ค้าที่กว้างขวางทั่วประเทศ

ภาพรวม

สถิติผู้ใช้งาน

จำนวนผู้ใช้งานเป็นค่าประมาณและอิงจากข้อมูลที่เปิดเผยต่อสาธารณะ จำนวนผู้ใช้งานที่ใช้งานจริงอาจแตกต่างกัน

Touch 'n Go eWallet (TNG eWallet) เป็นแพลตฟอร์มการชำระเงินดิจิทัลชั้นนำของมาเลเซีย เดิมเป็นที่รู้จักสำหรับค่าทางด่วนและปัจจุบันได้ขยายเป็นกระเป๋าเงินดิจิทัลที่มีคุณสมบัติครบครัน ผู้ใช้สามารถชำระเงินด้วยยอดเงิน TNG eWallet เพื่อการทำธุรกรรมที่รวดเร็วและปลอดภัยทั้งออนไลน์และออฟไลน์

คุณสมบัติหลัก:

  • ผู้ใช้งานมากกว่า 17 ล้านราย - อีวอลเล็ตที่ได้รับความนิยมสูงสุดของมาเลเซีย
  • การยืนยันทันที - การประมวลผลการชำระเงินแบบเรียลไทม์
  • การยอมรับอย่างกว้างขวาง - ได้รับการยอมรับทุกที่ในมาเลเซีย
  • แบรนด์ที่ได้รับความไว้วางใจ - ส่วนหนึ่งของ Touch 'n Go Group
  • ไม่มีค่าธรรมเนียมการทำธุรกรรม - สำหรับลูกค้า
  • โปรแกรมรีวอร์ด - ผู้ใช้ได้รับคะแนน GO+

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

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

*วงเงินรายวันแตกต่างกันตามระดับการยืนยันกระเป๋าเงินของลูกค้า

ข้อจำกัดการทำธุรกรรมตามระดับการยืนยัน

ระดับการยืนยันต่อธุรกรรมวงเงินรายวันวงเงินรายเดือน
Lite (โทรศัพท์ + IC)RM1,500RM1,500RM10,000
Full (เชื่อมโยงธนาคาร)RM30,000RM30,000RM100,000

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

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

  1. ลูกค้าเลือก "Touch 'n Go eWallet" ที่หน้าชำระเงิน
  2. ถูกเปลี่ยนเส้นทางไปยังหน้าอนุญาต TNG
  3. เปิดแอป TNG eWallet (deep link)
  4. ตรวจสอบรายละเอียดการชำระเงิน
  5. ยืนยันตัวตนด้วย PIN 6 หลักหรือชีวมิติ
  6. ยืนยันการชำระเงิน
  7. กลับไปยังเว็บไซต์ผู้ค้า

เวลาในการดำเนินการโดยทั่วไป: 30 วินาที - 2 นาที

การนำไปใช้

ขั้นตอนที่ 1: สร้าง Touch 'n Go Source

curl https://api.omise.co/sources \
-u skey_test_YOUR_SECRET_KEY: \
-d "type=touch_n_go" \
-d "amount=15000" \
-d "currency=MYR"

Response:

{
"object": "source",
"id": "src_test_5rt6s9vah5lkvi1rh9c",
"type": "touch_n_go",
"flow": "redirect",
"amount": 15000,
"currency": "MYR"
}

ขั้นตอนที่ 2: สร้าง Charge

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

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

app.post('/checkout/touch-n-go', async (req, res) => {
try {
const { amount, order_id } = req.body;

// ตรวจสอบจำนวนเงิน
if (amount < 100 || amount > 3000000) {
return res.status(400).json({
error: 'Amount must be between RM1 and RM30,000'
});
}

// สร้าง source
const source = await omise.sources.create({
type: 'touch_n_go',
amount: amount,
currency: 'MYR'
});

// สร้าง charge
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
}
});

// Redirect ไปยัง Touch 'n Go
res.redirect(charge.authorize_uri);

} catch (error) {
console.error('Touch n Go error:', error);
res.status(500).json({ error: error.message });
}
});

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

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 === 'touch_n_go') {
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 server
const express = require('express');
const omise = require('omise')({
secretKey: process.env.OMISE_SECRET_KEY
});

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

app.post('/checkout/touch-n-go', async (req, res) => {
try {
const { amount, order_id } = req.body;

// ตรวจสอบจำนวนเงิน (RM1 - RM30,000)
if (amount < 100 || amount > 3000000) {
return res.status(400).json({
error: 'Amount must be between RM1 and RM30,000'
});
}

// สร้าง source
const source = await omise.sources.create({
type: 'touch_n_go',
amount: amount,
currency: 'MYR'
});

// สร้าง charge
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: 'touch_n_go'
}
});

// ส่งคืน authorization URL
res.json({
authorize_uri: charge.authorize_uri,
charge_id: charge.id
});

} catch (error) {
console.error('TNG error:', error);
res.status(500).json({ error: error.message });
}
});

// Callback handler
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 handler
app.post('/webhooks/omise', (req, res) => {
const event = req.body;

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

if (charge.source.type === 'touch_n_go') {
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);

การรองรับการยกเลิกและคืนเงิน

การยกเลิก Charges

Touch 'n Go รองรับการยกเลิกภายใน24 ชั่วโมง:

// ยกเลิกทันที (เต็มจำนวน)
const refund = await omise.charges.refund('chrg_test_...', {
amount: 15000
});

if (refund.voided) {
console.log('Charge was voided (within 24 hours)');
}

การคืนเงิน

คืนเงินเต็มจำนวนเท่านั้นภายใน30 วัน:

// คืนเงินเต็มจำนวนเท่านั้น
const refund = await omise.charges.refund('chrg_test_...', {
amount: 15000 // ต้องเป็นจำนวนเงินเต็ม
});
ไม่มีการคืนเงินบางส่วน

Touch 'n Go eWallet ไม่รองรับการคืนเงินบางส่วน อนุญาตเฉพาะการคืนเงินเต็มจำนวนภายใน 30 วันเท่านั้น

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

ปัญหา: ลูกค้าไม่มีแอป TNG eWallet

สาเหตุ: ลูกค้าเลือก Touch 'n Go แต่ไม่มีแอป

วิธีแก้ไข:

function checkMobile() {
if (!/Android|iPhone|iPad|iPod/i.test(navigator.userAgent)) {
alert('Touch n Go eWallet requires the mobile app. Please use a mobile device.');
return false;
}
return true;
}

ปัญหา: ยอดเงินไม่เพียงพอ

ข้อผิดพลาด: การชำระเงินถูกปฏิเสธ

วิธีแก้ไข:

if (charge.failure_code === 'insufficient_balance') {
showMessage('Insufficient TNG eWallet balance. Please reload your wallet.');
offerAlternativePayment();
}

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

วิธีแก้ไข:

const TIMEOUT = 15 * 60 * 1000; // 15 นาที

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

ปัญหา: ข้อผิดพลาดสกุลเงินที่แตกต่าง

สาเหตุ: Touch 'n Go รองรับเฉพาะ MYR

วิธีแก้ไข:

if (currency !== 'MYR') {
throw new Error('Touch n Go only supports MYR currency');
}

แนวทางปฏิบัติที่ดีที่สุด

1. แสดงคำแนะนำ

<div class="tng-instructions">
<h3>Pay with Touch 'n Go eWallet</h3>
<ol>
<li>Ensure you have TNG eWallet app installed</li>
<li>Check your wallet has sufficient balance</li>
<li>You'll be redirected to the TNG eWallet app</li>
<li>Enter your 6-digit PIN or use biometric</li>
<li>Confirm the payment</li>
</ol>
<p>Need to reload? Use online banking, credit card, or at retailers.</p>
</div>

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

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

if (amount < MIN) {
return 'Minimum amount is RM1.00';
}

if (amount > MAX) {
return 'Maximum amount is RM30,000.00';
}

return null;
}

3. ตัวเลือกเฉพาะมือถือ

// แสดง TNG บนมือถือเท่านั้น
if (/Android|iPhone|iPad|iPod/i.test(navigator.userAgent)) {
document.getElementById('tng-option').style.display = 'block';
} else {
document.getElementById('tng-option').style.display = 'none';
}

4. ใช้ Webhooks

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

// Callback คือสำรอง
app.get('/payment/callback', handleCallback);

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

Touch 'n Go eWallet คืออะไร?

Touch 'n Go eWallet คือกระเป๋าเงินดิจิทัลที่ได้รับความนิยมสูงสุดของมาเลเซียที่มีผู้ใช้งานมากกว่า 17 ล้านราย เดิมเป็นที่รู้จักสำหรับการชำระค่าทางด่วน ปัจจุบันเป็นอีวอลเล็ตที่มีคุณสมบัติครบครันที่ได้รับการยอมรับอย่างกว้างขวางทั่วมาเลเซีย

ลูกค้าจำเป็นต้องมีบัญชี TNG eWallet หรือไม่?

ใช่ ลูกค้าต้องติดตั้งแอป Touch 'n Go eWallet พร้อมบัญชีที่เปิดใช้งานและยอดเงินเพียงพอ

ข้อจำกัดการทำธุรกรรมคืออะไร?
  • ผู้ใช้ Lite: RM1 - RM1,500 ต่อธุรกรรม, รายวัน RM1,500
  • ผู้ใช้ Full: RM1 - RM30,000 ต่อธุรกรรม, รายวัน RM30,000

ลูกค้าสามารถอัพเกรดระดับการยืนยันในแอป

การชำระเงินใช้เวลานานเท่าไร?

การชำระเงิน Touch 'n Go eWallet โดยทั่วไปเกิดขึ้นภายใน 1-3 วันทำการ ตรวจสอบแดชบอร์ด Omise ของคุณสำหรับตารางการชำระเงิน

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

ได้ รองรับการคืนเงินเต็มจำนวนภายใน 30 วัน การคืนเงินบางส่วนไม่สามารถใช้ได้ สามารถยกเลิกได้ภายใน 24 ชั่วโมง

จะเกิดอะไรขึ้นหากลูกค้ามียอดเงินไม่เพียงพอ?

การชำระเงินจะถูกปฏิเสธ ลูกค้าสามารถเติมเงิน TNG eWallet ผ่าน:

  • ธนาคารออนไลน์
  • บัตรเครดิต/เดบิต
  • 7-Eleven, 99 Speedmart, MyNews
  • สถานี Petronas
  • ตู้ ATM
Touch 'n Go ทำงานบนเดสก์ท็อปหรือไม่?

ไม่ Touch 'n Go eWallet ต้องใช้แอปมือถือ ผู้ใช้เดสก์ท็อปควรเห็นวิธีการชำระเงินทางเลือก

การทดสอบ

โหมดทดสอบ

Touch 'n Go eWallet สามารถทดสอบได้โดยใช้ test API keys ของคุณ ในโหมดทดสอบ:

ข้อมูลรับรองการทดสอบ:

  • ใช้ test API keys (skey_test_xxx)
  • สกุลเงิน: MYR (ริงกิตมาเลเซีย)
  • ไม่ต้องมีบัญชี Touch 'n Go จริงสำหรับการทดสอบ

ขั้นตอนการทดสอบ:

  1. สร้าง source และ charge ด้วย test API keys
  2. ลูกค้า redirect ไปยัง test authorize_uri
  3. หน้า test จำลองการอนุญาต Touch 'n Go
  4. ใช้ Actions ของ Omise Dashboard เพื่อทำเครื่องหมาย charge เป็นสำเร็จ/ล้มเหลว
  5. ตรวจสอบการแจ้งเตือน webhook และ callbacks

การนำไปใช้การทดสอบ:

// ทดสอบการชำระเงิน Touch 'n Go
const source = await omise.sources.create({
type: 'touch_n_go',
amount: 5000, // RM50.00
currency: 'MYR'
});

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

console.log('Test authorize URL:', charge.authorize_uri);

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

  • การชำระเงินสำเร็จ: ตรวจสอบขั้นตอนการปฏิบัติตามคำสั่งซื้อ
  • การชำระเงินล้มเหลว: ทดสอบการจัดการข้อผิดพลาด
  • ข้อจำกัดจำนวนเงิน: ทดสอบขั้นต่ำ RM1 และจำนวนเงินต่างๆ
  • ขั้นตอนมือถือ: ทดสอบการเชื่อมโยงลึกไปยังแอป TNG
  • ยอดเงินไม่เพียงพอ: จำลองยอดเงินในกระเป๋าเงินต่ำ
  • หมดเวลา: ทดสอบสถานการณ์การชำระเงินที่ถูกละทิ้ง
  • การส่ง Webhook: ตรวจสอบเหตุการณ์ webhook ทั้งหมด

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

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

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

แหล่งข้อมูลที่เกี่ยวข้อง

ขั้นตอนถัดไป

  1. สร้าง Touch 'n Go source
  2. นำขั้นตอน redirect ไปใช้
  3. ตั้งค่า webhooks
  4. ทดสอบการรวม
  5. เริ่มใช้งานจริง