TrueMoney QR
รับชำระเงินผ่าน QR Code แบบออฟไลน์จากผู้ใช้ TrueMoney กว่า 30 ล้านคนในประเทศไทย ลูกค้าสแกน QR Code ด้วยแอป TrueMoney และเลือกแหล่งเงินสำหรับชำระได้หลากหลายรูปแบบ
ภาพรวม
TrueMoney QR เป็นวิธีการชำระเงินแบบออฟไลน์ที่สร้าง QR Code ที่สแกนได้สำหรับให้ลูกค้าชำระเงินโดยใช้แอปมือถือ TrueMoney ต่างจากขั้นตอนการเปลี่ยนเส้นทาง (redirect) ลูกค้าจะทำการชำระเงินให้เสร็จสมบูรณ์บนโทรศัพท์ของตนเองโดยสแกน QR Code ที่แสดงบนเว็บไซต์หรือระบบขายหน้าร้านของคุณ
คุณสมบัติหลัก:
- ✅ การชำระเงินแบบออฟไลน์ - ไม่ต้องเปลี่ยนเส้นทาง ลูกค้าสแกน QR Code
- ✅ แหล่งเงินหลากหลาย - กระเป๋าเงิน บัตร บัญชีธนาคาร Pay Next
- ✅ ฐานผู้ใช้ขนาดใหญ่ - ผู้ใช้ TrueMoney กว่า 30 ล้านคนในประเทศไทย
- ✅ ยอดขั้นต่ำที่ยืดหยุ่น - ต่ำสุดที่ ฿0.01 สำหรับวิธีการชำระเงินส่วนใหญ่
- ✅ การโอนเงินรวดเร็ว - เร็วกว่าการธนาคารแบบดั้งเดิม
- ✅ รองรับระบบขายหน้าร้าน - ใช้งานได้ทั้งการชำระเงินในร้านและออนไลน์
ภูมิภาคที่รองรับ
| ภูมิภาค | สกุลเงิน | ยอดขั้นต่ำ | ยอดสูงสุด | หมายเหตุ |
|---|---|---|---|---|
| ประเทศไทย | THB | ฿0.01* | ฿50,000 | *ยอดขั้นต่ำแตกต่างกันตามแหล่งเงิน |
ยอดขั้นต่ำตามแหล่งเงิน
ลูกค้าสามารถเลือกวิธีการชำระเงินที่ต้องการเมื่อสแกน QR Code โดยแต่ละวิธีมีข้อกำหนดขั้นต่ำที่แตกต่างกัน:
| แหล่งเงิน | ยอดขั้นต่ำ | หมายเหตุ |
|---|---|---|
| ยอดเงินในกระเป๋า | ฿0.01 | เงินในกระเป๋า TrueMoney |
| บัตรเครดิต/เดบิต | ฿0.01 | การชำระด้วยบัตรผ่าน TrueMoney |
| Pay Next (ชำระเต็มจำนวน) | ฿0.01 | ซื้อเลย จ่ายภายหลัง (ยอดเต็ม) |
| Pay Next Extra (ชำระเต็มจำนวน) | ฿0.01 | ตัวเลือก BNPL แบบขยาย (ยอดเต็ม) |
| บัญชีธนาคาร | แตกต่างกันตามธนาคาร | ขั้นต่ำขึ้นอยู่กับธนาคารผู้ออกบัตร |
เมื่อลูกค้าสแกน QR Code พวกเขาจะเลือกแหล่งเงินสำหรับชำระเงินภายในแอป TrueMoney ร้านค้าไม่สามารถควบคุมได้ว่าลูกค้าจะเลือกแหล่งเงินใด โปรดตั้งค่ายอดธุรกรรมขั้นต่ำให้รองรับทุกแหล่งเงินหรือสื่อสารข้อกำหนดขั้นต่ำให้ชัดเจน
วิธีการทำงาน
ขั้นตอนการชำระเงิน

ประสบการณ์ของลูกค้า:
- ลูกค้าเลือก TrueMoney QR ที่หน้าชำระเงิน
- ร้านค้าแสดง QR Code บนหน้าจอ
- ลูกค้าเปิดแอป TrueMoney
- ลูกค้าสแกน QR Code
- ลูกค้าเลือกแหล่งเงินสำหรับชำระ (กระเป๋า/บัตร/ธนาคาร/Pay Next)
- ลูกค้าอนุมัติการชำระเงิน
- ยืนยันการชำระเงินเสร็จสมบูรณ์
การติดตั้งและใช้งาน
ขั้นตอนที่ 1: สร้าง Source ของ TrueMoney QR
- cURL
- Node.js
- PHP
- Python
curl https://api.omise.co/sources \
-u skey_test_YOUR_SECRET_KEY: \
-d "type=truemoney_qr" \
-d "amount=50000" \
-d "currency=THB"
const omise = require('omise')({
secretKey: 'skey_test_YOUR_SECRET_KEY'
});
const source = await omise.sources.create({
type: 'truemoney_qr',
amount: 50000, // THB 500.00
currency: 'THB'
});
<?php
$source = OmiseSource::create(array(
'type' => 'truemoney_qr',
'amount' => 50000,
'currency' => 'THB'
));
?>
import omise
omise.api_secret = 'skey_test_YOUR_SECRET_KEY'
source = omise.Source.create(
type='truemoney_qr',
amount=50000,
currency='THB'
)
การตอบกลับ:
{
"object": "source",
"id": "src_test_5rt6s9vah5lkvi1rh9c",
"type": "truemoney_qr",
"flow": "offline",
"amount": 50000,
"currency": "THB"
}
ขั้นตอนที่ 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"
การตอบกลับรวม QR Code:
{
"object": "charge",
"id": "chrg_test_5rt6s9vah5lkvi1rh9d",
"amount": 50000,
"currency": "THB",
"status": "pending",
"source": {
"object": "source",
"type": "truemoney_qr",
"flow": "offline",
"scannable_code": {
"object": "barcode",
"type": "qr",
"image": {
"download_uri": "https://api.omise.co/charges/chrg_test_.../documents/docu_test_.../downloads/..."
}
}
}
}
ขั้นตอนที่ 3: แสดง QR Code
app.post('/create-truemoney-qr-payment', async (req, res) => {
try {
const { amount, order_id } = req.body;
// Validate amount
if (amount < 1 || amount > 5000000) {
return res.status(400).json({
error: 'Amount must be between ฿0.01 and ฿50,000'
});
}
// Create source
const source = await omise.sources.create({
type: 'truemoney_qr',
amount: amount,
currency: 'THB'
});
// 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
}
});
// Get QR code image URL
const qrCodeUrl = charge.source.scannable_code.image.download_uri;
// Return to frontend
res.json({
charge_id: charge.id,
qr_code_url: qrCodeUrl,
amount: amount
});
} catch (error) {
console.error('TrueMoney QR payment error:', error);
res.status(500).json({ error: error.message });
}
});
การแสดงผลส่วนหน้า:
<div class="payment-container">
<h2>สแกนเพื่อชำระเงินด้วย TrueMoney</h2>
<div class="qr-code-container">
<img id="qrCode" src="" alt="TrueMoney QR Code" />
</div>
<p class="amount">ยอดชำระ: <strong>฿<span id="amount"></span></strong></p>
<div class="instructions">
<h3>วิธีการชำระเงิน:</h3>
<ol>
<li>เปิดแอป TrueMoney บนโทรศัพท์ของคุณ</li>
<li>แตะปุ่ม "สแกน QR"</li>
<li>สแกนโค้ดด้านบน</li>
<li>เลือกวิธีการชำระเงิน (กระเป๋า/บัตร/ธนาคาร/Pay Next)</li>
<li>อนุมัติการชำระเงิน</li>
</ol>
</div>
</div>
<script>
async function createPayment(amount, orderId) {
const response = await fetch('/create-truemoney-qr-payment', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ amount, order_id: orderId })
});
const data = await response.json();
// Display QR code
document.getElementById('qrCode').src = data.qr_code_url;
document.getElementById('amount').textContent = (data.amount / 100).toFixed(2);
// Start polling for payment status
pollPaymentStatus(data.charge_id);
}
async function pollPaymentStatus(chargeId) {
const interval = setInterval(async () => {
const response = await fetch(`/check-payment-status/${chargeId}`);
const data = await response.json();
if (data.status === 'successful') {
clearInterval(interval);
window.location.href = '/payment-success';
} else if (data.status === 'failed') {
clearInterval(interval);
window.location.href = '/payment-failed';
}
}, 3000); // Check every 3 seconds
}
</script>
ขั้นตอนที่ 4: จัดการ Webhook
app.post('/webhooks/omise', (req, res) => {
const event = req.body;
if (event.key === 'charge.complete' && event.data.source.type === 'truemoney_qr') {
const charge = event.data;
if (charge.status === 'successful') {
// Process order
processOrder(charge.metadata.order_id);
console.log(`TrueMoney QR payment successful: ${charge.id}`);
} else if (charge.status === 'failed') {
// Handle failure
handleFailedPayment(charge.metadata.order_id, charge.failure_message);
}
}
res.sendStatus(200);
});
ตัวอย่างกา รติดตั้งแบบสมบูรณ์
// Express.js server with TrueMoney QR
const express = require('express');
const omise = require('omise')({
secretKey: process.env.OMISE_SECRET_KEY
});
const app = express();
app.use(express.json());
// Create payment and get QR code
app.post('/checkout/truemoney-qr', async (req, res) => {
try {
const { amount, order_id } = req.body;
// Validate amount
if (amount < 1 || amount > 5000000) {
return res.status(400).json({
error: 'Amount must be between ฿0.01 and ฿50,000'
});
}
// Create source
const source = await omise.sources.create({
type: 'truemoney_qr',
amount: amount,
currency: 'THB'
});
// 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,
created_at: new Date().toISOString()
}
});
// Get QR code URL
const qrCodeUrl = charge.source.scannable_code.image.download_uri;
res.json({
success: true,
charge_id: charge.id,
qr_code_url: qrCodeUrl,
amount: amount
});
} catch (error) {
console.error('TrueMoney QR error:', error);
res.status(500).json({
success: false,
error: error.message
});
}
});
// Check payment status (for polling)
app.get('/check-payment-status/:chargeId', async (req, res) => {
try {
const charge = await omise.charges.retrieve(req.params.chargeId);
res.json({
status: charge.status,
paid: charge.paid,
amount: charge.amount
});
} catch (error) {
res.status(500).json({ error: error.message });
}
});
// Webhook handler (primary method)
app.post('/webhooks/omise', (req, res) => {
const event = req.body;
if (event.key === 'charge.complete') {
const charge = event.data;
if (charge.source.type === 'truemoney_qr') {
if (charge.status === 'successful') {
updateOrderStatus(charge.metadata.order_id, 'paid');
sendConfirmation(charge.metadata.order_id);
} else {
updateOrderStatus(charge.metadata.order_id, 'failed');
}
}
}
res.sendStatus(200);
});
app.listen(3000);
การยกเลิกและคืนเงิน
การยกเลิก Charge
TrueMoney QR รองรับการยกเลิกในวันเดียวกันเท่านั้น:
// Void same-day (full amount only)
const refund = await omise.charges.refund('chrg_test_...', {
amount: 50000 // Must be full amount
});
if (refund.voided) {
console.log('Charge was voided (same-day)');
}
การยกเลิกสามารถทำได้เฉพาะในวันเดียวกันที่สร้าง charge หลังเที่ยงคืนแล้วจะต้องใช้การคืนเงินแทน
การคืนเงิน
การคืนเงินสามารถทำได้ภายใน 30 วัน การรองรับแตกต่างกันตามแหล่งเงิน:
// Full refund (all payment methods)
const refund = await omise.charges.refund('chrg_test_...', {
amount: 50000 // Full amount
});
// Partial refund (Wallet, Bank Account, Pay Next)
const partialRefund = await omise.charges.refund('chrg_test_...', {
amount: 25000 // Half amount
});
การรองรับการคืนเงินตามแหล่งเงิน:
| วิธีการชำระเงิน | คืนเงินเต็มจำนวน | คืนเงินบางส่วน | ระยะเวลา |
|---|---|---|---|
| ยอดเงินในกระเป๋า |