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

TrueMoney Wallet

รับชำระเงินออนไลน์จากหนึ่งใน e-wallet ที่ได้รับความนิยมมากที่สุดในไทย มีผู้ใช้งานมากกว่า 30 ล้านคน ลูกค้าจะถูก redirect ไปกรอกเบอร์โทรศัพท์และยืนยันตัวตนด้วย OTP

ตัวเลือกการชำระเงิน TrueMoney อื่นๆ
  • การเปลี่ยนเส้นทางแบบแอปต่อแอป: สำหรับแอปมือถือที่มี deep link ไปยัง TrueMoney ดู TrueMoney Jump App
  • การชำระเงินด้วย QR code: สำหรับการชำระเงินแบบออฟไลน์ผ่าน QR code ดู TrueMoney QR

หน้านี้อธิบายเกี่ยวกับขั้นตอนการ redirect แบบออนไลน์ที่ใช้ OTP

ขั้นตอนการชำระเงิน

TrueMoney Payment Flow

ภาพด้านบนแสดงขั้นตอนการชำระเงินแบบ redirect ที่สมบูรณ์โดยใช้การยืนยันตัวตนด้วย OTP (one-time password)

ภาพรวม

สถิติผู้ใช้

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

TrueMoney Wallet เป็นโซลูชันการชำระเงินผ่านมือถือชั้นนำในไทย มีผู้ใช้งานมากกว่า 30 ล้านคน กระเป๋าเงินนี้ช่วยให้ลูกค้าสามารถชำระเงินโดยใช้หมายเลขโทรศัพท์มือถือพร้อมการยืนยันตัวตนด้วย OTP เพื่อความปลอดภัยที่เพิ่มขึ้น

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

  • ฐานผู้ใช้ขนาดใหญ่ - ผู้ใช้งานมากกว่า 30 ล้านคนในไทย
  • ขั้นตอนที่เรียบง่าย - หมายเลขโทรศัพท์ + การยืนยันตัวตนด้วย OTP
  • การชำระบัญชีที่รวดเร็ว - เร็วกว่าธนาคารแบบดั้งเดิม
  • มือถือเป็นหลัก - ปรับแต่งสำหรับผู้ใช้สมาร์ทโฟน
  • แบรนด์ที่เชื่อถือได้ - เป็นส่วนหนึ่งของ Ascend Group (กลุ่มซีพี)

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

RegionCurrencyMin AmountMax AmountAPI Version
ThailandTHB฿20.00฿100,000.002017-11-02

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

ระดับการยืนยันตัวตนต่อรายการวงเงินต่อวันวงเงินต่อเดือน
Basic (เบอร์โทรศัพท์อย่างเดียว)฿100,000฿40,000฿200,000
Plus (บัตรประชาชน)฿100,000฿100,000฿500,000
Premium (บัญชีธนาคาร)฿100,000฿200,000ไม่จำกัด

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

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

  1. ลูกค้าเลือก TrueMoney ที่หน้าชำระเงิน
  2. กรอกหมายเลขโทรศัพท์มือถือ
  3. รับ OTP ผ่าน SMS
  4. กรอก OTP เพื่ออนุมัติ
  5. ยืนยันจำนวนเงินที่ชำระ
  6. กลับไปยังเว็บไซต์ผู้ค้า

การใช้งาน

ขั้นตอนที่ 1: สร้าง TrueMoney Source

curl https://api.omise.co/sources \
-u skey_test_YOUR_SECRET_KEY: \
-d "type=truemoney" \
-d "amount=50000" \
-d "currency=THB" \
-d "phone_number=+66876543210"

ผลลัพธ์:

{
"object": "source",
"id": "src_test_5rt6s9vah5lkvi1rh9c",
"type": "truemoney",
"flow": "redirect",
"amount": 50000,
"currency": "THB",
"phone_number": "+66876543210"
}

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

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

ขั้นตอนที่ 3: Redirect ลูกค้า

app.post('/create-truemoney-payment', async (req, res) => {
// Create source
const source = await omise.sources.create({
type: 'truemoney',
amount: req.body.amount,
currency: 'THB',
phone_number: req.body.phone_number
});

// Create charge
const charge = await omise.charges.create({
amount: req.body.amount,
currency: 'THB',
source: source.id,
return_uri: 'https://yourdomain.com/payment/callback',
metadata: {
order_id: req.body.order_id
}
});

// Redirect customer
res.redirect(charge.authorize_uri);
});

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

app.get('/payment/callback', async (req, res) => {
const chargeId = req.query.charge_id;

// Retrieve charge status
const charge = await omise.charges.retrieve(chargeId);

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

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

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

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

if (charge.status === 'successful') {
processOrder(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());

// Checkout page
app.post('/checkout/truemoney', async (req, res) => {
try {
const { amount, phone_number, order_id } = req.body;

// Validate phone number format
if (!/^\+66\d{9}$/.test(phone_number)) {
return res.status(400).json({
error: 'Invalid phone number. Use format: +66876543210'
});
}

// Check amount limits
if (amount < 2000 || amount > 10000000) {
return res.status(400).json({
error: 'Amount must be between ฿20 and ฿100,000'
});
}

// Create source
const source = await omise.sources.create({
type: 'truemoney',
amount: amount,
currency: 'THB',
phone_number: phone_number
});

// Create charge
const charge = await omise.charges.create({
amount: amount,
currency: 'THB',
source: source.id,
return_uri: `${process.env.BASE_URL}/payment/callback`,
metadata: {
order_id: order_id,
customer_phone: phone_number
}
});

// Return authorization URL
res.json({
authorize_uri: charge.authorize_uri,
charge_id: charge.id
});

} catch (error) {
console.error('TrueMoney payment 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 === 'truemoney') {
if (charge.status === 'successful') {
// Process order
updateOrderStatus(charge.metadata.order_id, 'paid');
sendConfirmation(charge.metadata.customer_phone);
} else {
// Handle failure
updateOrderStatus(charge.metadata.order_id, 'failed');
}
}
}

res.sendStatus(200);
});

app.listen(3000);

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

การยกเลิก Charge

TrueMoney รองรับการยกเลิกภายใน 24 ชั่วโมง หลังจากสร้าง charge:

// Void immediately (full or partial)
const refund = await omise.charges.refund('chrg_test_...', {
amount: 50000 // Full amount
});

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

การคืนเงิน

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

// Full refund only
const refund = await omise.charges.refund('chrg_test_...', {
amount: 50000 // Must be full amount
});
ไม่มีการคืนเงินบางส่วน

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

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

ปัญหา: "หมายเลขโทรศัพท์ไม่ถูกต้อง"

สาเหตุ:

  • รูปแบบไม่ถูกต้อง
  • ไม่มีรหัสประเทศ
  • หมายเลขต่างประเทศ

วิธีแก้:

function validateThaiPhone(phone) {
// Accept formats: +66876543210, 0876543210
let normalized = phone.replace(/\s/g, '');

if (normalized.startsWith('0')) {
normalized = '+66' + normalized.substring(1);
}

if (!/^\+66\d{9}$/.test(normalized)) {
throw new Error('Invalid Thai phone number');
}

return normalized;
}

ปัญหา: ลูกค้าเกินวงเงินต่อวัน

ข้อผิดพลาด: รายการถูกปฏิเสธ

วิธีแก้:

  • ลูกค้าต้องอัปเกรดการยืนยันตัวตนบัญชี TrueMoney
  • แบ่งการชำระเงินเป็นหลายวัน
  • ใช้วิธีการชำระเงินทางเลือก

ปัญหา: การชำระเงินค้างนานเกินไป

สาเหตุ: ลูกค้าไม่ได้ทำการยืนยัน OTP ให้เสร็จสิ้น

วิธีแก้:

  • ตั้งค่าหมดเวลา 15-20 นาที
  • อนุญาตให้ลูกค้าลองใหม่ด้วย charge ใหม่
  • แสดงคำแนะนำที่ชัดเจน

ปัญหา: Return URI ไม่ถูกเรียก

สาเหตุ: ลูกค้าปิดเบราว์เซอร์

วิธีแก้:

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

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

1. ตรวจสอบหมายเลขโทรศัพท์

const phoneRegex = /^\+66[0-9]{9}$/;

if (!phoneRegex.test(phoneNumber)) {
return res.status(400).json({
error: 'Please enter a valid Thai phone number (e.g., +66876543210)'
});
}

2. แสดงคำแนะนำที่ชัดเจน

<div class="truemoney-instructions">
<h3>ชำระเงินด้วย TrueMoney Wallet</h3>
<ol>
<li>กรอกหมายเลขโทรศัพท์ที่ลงทะเบียนกับ TrueMoney</li>
<li>คุณจะได้รับ OTP ผ่าน SMS</li>
<li>กรอก OTP เพื่ออนุมัติการชำระเงิน</li>
<li>ยืนยันจำนวนเงิน</li>
</ol>
<p>ตรวจสอบให้แน่ใจว่าคุณมียอดเงินเพียงพอใน TrueMoney Wallet ของคุณ</p>
</div>

3. จัดการหมดเวลา

// Set reasonable timeout
setTimeout(() => {
if (!paymentConfirmed) {
showTimeoutMessage();
allowRetry();
}
}, 15 * 60 * 1000); // 15 minutes

4. ใช้ Webhook

อย่าพึ่งพา redirect callback เพียงอย่างเดียว:

// Webhook is more reliable
app.post('/webhooks/omise', handleWebhook);

// Callback is backup
app.get('/payment/callback', handleCallback);

5. จัดให้มีการสนับสนุนลูกค้า

metadata: {
order_id: orderId,
customer_phone: phoneNumber,
customer_email: email,
support_ticket: ticketId
}

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

TrueMoney Wallet คืออะไร?

TrueMoney Wallet เป็นแอปพลิเคชันการชำระเงินผ่านมือถือในไทย มีผู้ใช้งานมากกว่า 30 ล้านคน ลูกค้าสามารถเติมเงินเข้ากระเป๋าเงินและชำระเงินโดยใช้หมายเลขโทรศัพท์พร้อมการยืนยันตัวตนด้วย OTP

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

ใช่ ลูกค้าต้องมีบัญชี TrueMoney Wallet อยู่แล้ว พวกเขาสามารถดาวน์โหลดแอปและลงทะเบียนด้วยหมายเลขโทรศัพท์ไทย

ค่าธรรมเนียมการทำรายการเป็นเท่าไร?

ตรวจสอบแดชบอร์ด Omise ของคุณสำหรับอัตราปัจจุบัน ค่าธรรมเนียม e-wallet โดยทั่วไปต่ำกว่าบัตรเครดิต

การชำระบัญชีใช้เวลานานเท่าไร?

การชำระบัญชีโดยทั่วไปเร็วกว่าบัตรเครดิต ตรวจสอบกับฝ่ายสนับสนุน Omise สำหรับไทม์ไลน์เฉพาะ

ลูกค้าต่างชาติสามารถใช้ TrueMoney ได้หรือไม่?

TrueMoney มีเฉพาะสำหรับลูกค้าในไทยที่มีหมายเลขโทรศัพท์ไทยและบัญชีธนาคารไทยเท่านั้น

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

การชำระเงินจะล้มเหลว ลูกค้าสามารถเติมเงิน TrueMoney Wallet ผ่าน:

  • ร้าน 7-Eleven
  • โอนเงินผ่านธนาคาร
  • บัตรเครดิต/เดบิต
  • ตู้ TrueMoney

จากนั้นลองทำรายการใหม่

การทดสอบ

โหมดทดสอบ

TrueMoney Wallet สามารถทดสอบในโหมดทดสอบโดยใช้ API key ทดสอบของคุณ ในโหมดทดสอบ:

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

  • ใช้รูปแบบหมายเลขโทรศัพท์ไทยที่ถูกต้อง (+66XXXXXXXXX)
  • charge ทดสอบจะไม่หักเงินจากบัญชีลูกค้าจริง
  • ข้อมูลทดสอบทั้งหมดใช้ API key ทดสอบ (skey_test_xxx)

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

  1. สร้าง source และ charge โดยใช้ API key ทดสอบ
  2. คุณจะได้รับ authorize_uri สำหรับ redirect
  3. ในโหมดทดสอบ ทำเครื่องหมาย charge เป็นสำเร็จ/ล้มเหลวด้วยตนเองในแดชบอร์ด
  4. webhook จะถูกทริกเกอร์ตามการเปลี่ยนแปลงสถานะ

การทดสอบการเปลี่ยนแปลงสถานะ:

// Create test charge
const charge = await omise.charges.create({
amount: 50000,
currency: 'THB',
source: testSourceId,
return_uri: 'https://example.com/callback'
});

// In test mode, use Omise Dashboard to:
// 1. Navigate to the charge
// 2. Use "Actions" menu to mark as successful or failed
// 3. Verify webhook handling

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

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

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

  • QR code ในโหมดทดสอบจะ redirect แต่จะไม่เชื่อมต่อกับเซิร์ฟเวอร์ TrueMoney จริง
  • ใช้แดชบอร์ดเพื่อจำลองการทำรายการเสร็จสิ้น
  • ทดสอบการจัดการ webhook เสมอก่อนเปิดใช้งานจริง
  • ตรวจสอบข้อจำกัดจำนวนเงินและลอจิกการตรวจสอบ

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

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

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

  1. สร้าง TrueMoney source
  2. ใช้งาน redirect flow
  3. ตั้งค่าการจัดการ webhook
  4. ทดสอบขั้นตอนการชำระเงิน
  5. เปิดใช้งานจริง