Touch 'n Go eWallet
รับชำระเงินจาก Touch 'n Go eWallet กระเป๋าเงินดิจิทัลที่ได้รับความนิยมสูงสุดของมาเลเซีย ที่มีผู้ใช้งานมากกว่า 17 ล้านรายและเครือข่ายผู้ค้าที่กว้างขวางทั่วประเทศ
ภาพรวม
จำนวนผู้ใช้งานเป็นค่าประมาณและอิงจากข้อมูลที่เปิดเผยต่อสาธารณะ จำนวนผู้ใช้งานที่ใช้งานจริงอาจแตกต่างกัน
Touch 'n Go eWallet (TNG eWallet) เป็นแพลตฟอร์มการชำระเงินดิจิทัลชั้นนำของมาเลเซีย เดิมเป็นที่รู้จักสำหรับค่าทางด่วนและปัจจุบันได้ขยายเป็นกระเป๋าเงินดิจิทัลที่มีคุณสมบัติครบครัน ผู้ใช้สามารถชำระเงินด้วยยอดเงิน TNG eWallet เพื่อการทำธุรกรรมที่รวดเร็วและปลอดภัยทั้งออนไลน์และออฟไลน์
คุณสมบัติหลัก:
- ✅ ผู้ใช้งานมากกว่า 17 ล้านราย - อีวอลเล็ตที่ได้รับความนิยมสูงสุดของมาเลเซีย
- ✅ การยืนยันทันที - การประมวลผลการชำระเงินแบบเรียลไทม์
- ✅ การยอมรับอย่างกว้างขวาง - ได้รับการยอมรับทุกที่ในมาเลเซีย
- ✅ แบรนด์ที่ได้รับความไว้วางใจ - ส่วนหนึ่งของ Touch 'n Go Group
- ✅ ไม่มีค่าธรรมเนียมการทำธุรกรรม - สำหรับลูกค้า
- ✅ โปรแกรมรีวอร์ด - ผู้ใช้ได้รับคะแนน GO+
ภูมิภาคที่รองรับ
| Region | Currency | Min Amount | Max Amount | API Version |
|---|---|---|---|---|
| Malaysia | MYR | RM1.00 | RM9,999.99 | 2017-11-02 |
ข้อจำกัดการทำธุรกรรมตามระดับการยืนยัน
| ระดับการยืนยัน | ต่อธุรกรรม | วงเงินรายวัน | วงเงินรายเดือน |
|---|---|---|---|
| Lite (โทรศัพท์ + IC) | RM1,500 | RM1,500 | RM10,000 |
| Full (เชื่อมโยงธนาคาร) | RM30,000 | RM30,000 | RM100,000 |
วิธีการทำงาน
ประสบการณ์ของลูกค้า:
- ลูกค้าเลือก "Touch 'n Go eWallet" ที่หน้าชำระเงิน
- ถูกเปลี่ยนเส้นทางไปยังหน้าอนุญาต TNG
- เปิดแอป TNG eWallet (deep link)
- ตรวจสอบรายละเอียดการชำระเงิน
- ยืนยันตัวตนด้วย PIN 6 หลักหรือชีวมิติ
- ยืนยันการชำระเงิน
- กลับไปยังเว็บไซต์ผู้ค้า
เวลาในการดำเนินการโดยทั่วไป: 30 วินาที - 2 นาที
การนำไปใช้
ขั้นตอนที่ 1: สร้าง Touch 'n Go Source
- cURL
- Node.js
- PHP
- Python
- Ruby
- Go
- Java
- C#
curl https://api.omise.co/sources \
-u skey_test_YOUR_SECRET_KEY: \
-d "type=touch_n_go" \
-d "amount=15000" \
-d "currency=MYR"
const omise = require('omise')({
secretKey: 'skey_test_YOUR_SECRET_KEY'
});
const source = await omise.sources.create({
type: 'touch_n_go',
amount: 15000, // MYR 150.00
currency: 'MYR'
});
<?php
$source = OmiseSource::create(array(
'type' => 'touch_n_go',
'amount' => 15000,
'currency' => 'MYR'
));
?>
import omise
omise.api_secret = 'skey_test_YOUR_SECRET_KEY'
source = omise.Source.create(
type='touch_n_go',
amount=15000,
currency='MYR'
)
require 'omise'
Omise.api_key = 'skey_test_YOUR_SECRET_KEY'
source = Omise::Source.create({
type: 'touch_n_go',
amount: 15000,
currency: 'MYR'
})
source, err := client.Sources().Create(&operations.CreateSource{
Type: "touch_n_go",
Amount: 15000,
Currency: "MYR",
})
Source source = client.sources().create(new Source.CreateParams()
.type("touch_n_go")
.amount(15000L)
.currency("MYR"));
var source = await client.Sources.Create(new CreateSourceRequest
{
Type = "touch_n_go",
Amount = 15000,
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>