WeChat Pay MPM
รับชำระเงินแบบออฟไลน์ในร้านค้าผ่าน WeChat Pay โดยใช้โหมด Merchant-Presented Mode (MPM) ที่ลูกค้าสแกน QR Code ที่แสดงโดยร้านค้า ณ จุดชำระเงิน
สำหรับการชำระเงินออนไลน์ ดูที่ WeChat Pay สำหรับการสแกนบาร์โค้ดที่ลูกค้าแสดง ดูที่ WeChat Pay UPM
ภาพรวม
WeChat Pay Merchant-Presented Mode (MPM) หรือที่เรียกว่า "C scan B" (ลูกค้าสแกนร้านค้า) เป็นวิธีการชำระเงินแบบออฟไลน์ที่ร้านค้าสร้างและแสดง QR Code เฉพาะสำหรับแต่ละธุรกรรม จากนั้นลูกค้าสแกน QR Code นี้โดยใช้แอป WeChat เพื่อทำการชำระเงิน
รูปแบบนี้เหมาะสำหรับสภาพแวดล้อมร้านค้าปลีก ร้านอาหาร และจุดขายทางกายภาพใดๆ ที่ร้านค้าควบคุมกระบวนการชำระเงินและแสดง QR Code สำหรับการชำระเงินบนเครื่องเทอร์มินัล แท็บเล็ต หรือใบเสร็จที่พิมพ์
คุณสมบัติหลัก:
- ✅ ชำระเงินในร้าน - เหมาะสำหรับร้านค้าปลีก ร้านอาหาร และร้านค้าจริง
- ✅ ไม่ต้องติดตั้งแอปลูกค้า - ใช้งานได้กับแอป WeChat ที่มีอยู่ (ผู้ใช้ 1.3 พันล้านคนขึ้นไป)
- ✅ ชำร ะเงินรวดเร็ว - ลูกค้าสแกนและจ่ายได้ในไม่กี่วินาที
- ✅ ไม่ต้องใช้ฮาร์ดแวร์ - แสดง QR บนหน้าจอใดก็ได้หรือพิมพ์
- ✅ ข้ามพรมแดน - รับชำระเงินจากนักท่องเที่ยวชาวจีน
- ✅ รองรับออฟไลน์ - ใช้งานได้ในสภาพแวดล้อมที่ลูกค้ามีอินเทอร์เน็ตจำกัด
ภูมิภาคที่รองรับ
| ภูมิภาค | สกุลเงิน | จำนวนขั้นต่ำ | จำนวนสูงสุด | เวอร์ชัน API |
|---|---|---|---|---|
| ไทย | THB | 20.00 (2,000 สตางค์) | 150,000.00 (15,000,000 สตางค์) | 2017-11-02 |
หากต้องการเปิดใช้งาน WeChat Pay MPM ส่งอีเมลไปที่ support@omise.co เพื่อขอใช้งานฟีเจอร์นี้
WeChat Pay MPM มีคุณค่าอย่างยิ่งสำหรับร้านค้าที่มุ่งเป้าไปที่นักท่องเที่ยวชาวจีน ลูกค้าจ่ายเป็น CNY จากกระเป๋าเงิน WeChat และคุณได้รับการชำระเงินเป็น THB
วิธีการทำงาน
ขั้นตอนการชำระเงิน:
- ร้านค้าสร้างการเรียกเก็บเงินผ่าน Omise API ด้วยประเภทแหล่งที่มา
wechat_pay_mpm - QR Code แสดงบนเครื่องเทอร์มินัล POS แท็บเล็ต หรือพิมพ์ออกมา
- ลูกค้าเปิดแอป WeChat และไปที่ "Scan"
- ลูกค้าสแกน QR Code ที่ร้านค้าแสดง
- ลูกค้าตรวจสอบรายละเอียดธุรกรรมและยืนยันการชำระเงิน
- ร้านค้าได้รับการแจ้งเตือน Webhook ยืนยันการชำระเงิน
- ร้านค้าให้ใบเสร็จหรือการยืนยันแก่ลูกค้า
เวลาที่ใช้โดยทั่วไป: 30 วินาที - 2 นาที
การใช้งาน
ขั้นตอนที่ 1: สร้างการเรียกเก็บเงินพร้อม Source
สำหรับ WeChat Pay MPM คุณสามารถสร้าง source และ charge ในการเรียก API ครั้งเดียวหรือแยกกันได้
- cURL
- Node.js
- PHP
- Python
# Create source
curl https://api.omise.co/sources \
-u $OMISE_SECRET_KEY: \
-d "type=wechat_pay_mpm" \
-d "amount=150000" \
-d "currency=THB"
# Create charge with source
curl https://api.omise.co/charges \
-u $OMISE_SECRET_KEY: \
-d "amount=150000" \
-d "currency=THB" \
-d "source=src_test_xxx"
const omise = require('omise')({
secretKey: 'skey_test_YOUR_SECRET_KEY'
});
// Create source
const source = await omise.sources.create({
type: 'wechat_pay_mpm',
amount: 150000, // THB 1,500.00
currency: 'THB'
});
// Create charge
const charge = await omise.charges.create({
amount: 150000,
currency: 'THB',
source: source.id,
metadata: {
order_id: 'POS-2024-001',
terminal_id: 'TERMINAL-01'
}
});
console.log('QR Code URL:', charge.source.scannable_code.image.download_uri);
<?php
// Create source
$source = OmiseSource::create([
'type' => 'wechat_pay_mpm',
'amount' => 150000,
'currency' => 'THB'
]);
// Create charge
$charge = OmiseCharge::create([
'amount' => 150000,
'currency' => 'THB',
'source' => $source['id'],
'metadata' => [
'order_id' => 'POS-2024-001',
'terminal_id' => 'TERMINAL-01'
]
]);
$qrCodeUrl = $charge['source']['scannable_code']['image']['download_uri'];
?>
import omise
omise.api_secret = 'skey_test_YOUR_SECRET_KEY'
# Create source
source = omise.Source.create(
type='wechat_pay_mpm',
amount=150000,
currency='THB'
)
# Create charge
charge = omise.Charge.create(
amount=150000,
currency='THB',
source=source.id,
metadata={
'order_id': 'POS-2024-001',
'terminal_id': 'TERMINAL-01'
}
)
qr_code_url = charge.source.scannable_code.image.download_uri
Response:
{
"object": "charge",
"id": "chrg_test_5rt6s9vah5lkvi1rh9c",
"amount": 150000,
"currency": "THB",
"status": "pending",
"source": {
"object": "source",
"id": "src_test_5rt6s9vah5lkvi1rh9c",
"type": "wechat_pay_mpm",
"flow": "offline",
"amount": 150000,
"currency": "THB",
"scannable_code": {
"type": "qr",
"image": {
"download_uri": "https://api.omise.co/charges/chrg_test_.../documents/qr_code.png"
}
}
},
"expires_at": "2024-01-15T14:30:00Z"
}
ขั้นตอนที่ 2: แสดง QR Code บน POS
แสดง QR Code จาก charge.source.scannable_code.image.download_uri บน เครื่องเทอร์มินัล POS ของคุณ
// POS Terminal Display Logic
async function displayPaymentQR(orderId, amount) {
try {
// Create charge
const response = await fetch('/api/create-wechat-mpm-charge', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
order_id: orderId,
amount: amount
})
});
const data = await response.json();
// Display QR code on POS terminal
const qrDisplay = document.getElementById('pos-qr-display');
qrDisplay.innerHTML = `
<div class="payment-screen">
<h2>Scan to Pay with WeChat</h2>
<img src="${data.qr_code_url}" alt="WeChat Pay QR" />
<p class="amount">Amount: ฿${(amount / 100).toFixed(2)}</p>
<p class="timer">Expires in: <span id="countdown">2:00:00</span></p>
</div>
`;
// Start expiration countdown
startCountdown(data.expires_at, 'countdown');
// Start polling for payment status
pollPaymentStatus(data.charge_id);
} catch (error) {
showError('Failed to create payment. Please try again.');
}
}
ขั้นตอนที่ 3: จัดการการแจ้งเตือน Webhook
const express = require('express');
const app = express();
app.post('/webhooks/omise', express.json(), (req, res) => {
const event = req.body;
if (event.key === 'charge.complete') {
const charge = event.data;
if (charge.source.type === 'wechat_pay_mpm') {
if (charge.status === 'successful') {
// Payment successful
notifyPOSTerminal(charge.metadata.terminal_id, {
status: 'success',
charge_id: charge.id,
amount: charge.amount
});
// Print receipt
printReceipt(charge);
// Update order status
updateOrderStatus(charge.metadata.order_id, 'paid');
} else if (charge.status === 'failed') {
// Payment failed
notifyPOSTerminal(charge.metadata.terminal_id, {
status: 'failed',
failure_code: charge.failure_code,
failure_message: charge.failure_message
});
}
}
}
res.sendStatus(200);
});
การแสดง QR Code
ข้อกำหนดการแสดงผล
เพื่อประสิทธิภาพการสแกนที่ดีที่สุด ปฏิบัติตามแนวทางเหล่านี้:
| ข้อกำหนด | คำแนะนำ |
|---|---|
| ขนาดขั้นต่ำ | 3cm x 3cm (1.2" x 1.2") |
| ขนาดที่แนะนำ | 5cm x 5cm (2" x 2") หรือใหญ่กว่า |
| ความละเอียด | 300 DPI สำหรับการพิมพ์ |
| ความคมชัด | QR สีเข้มบนพื้นหลังสีขาว |
| พื้นที่ว่าง | ขอบสีขาวขั้นต่ำ 4 โมดูล |
ตัวอย่างเครื่องเทอร์มินัล POS
<style>
.wechat-mpm-display {
background: #fff;
padding: 30px;
text-align: center;
border-radius: 10px;
max-width: 400px;
margin: 0 auto;
}
.wechat-mpm-display .qr-container {
background: #fff;
padding: 20px;
border: 3px solid #09BB07;
border-radius: 8px;
display: inline-block;
margin: 20px 0;
}
.wechat-mpm-display .qr-code {
width: 200px;
height: 200px;
}
.wechat-mpm-display .amount {
font-size: 28px;
font-weight: bold;
color: #333;
}
.wechat-mpm-display .timer {
color: #666;
font-size: 16px;
}
.wechat-mpm-display .timer.warning {
color: #ff6600;
}
.wechat-mpm-display .timer.expired {
color: #ff0000;
}
.wechat-logo {
width: 50px;
height: 50px;
}
</style>
<div class="wechat-mpm-display">
<img src="/images/wechat-pay-logo.svg" class="wechat-logo" alt="WeChat Pay" />
<h2>Scan to Pay</h2>
<div class="qr-container">
<img id="qr-code" class="qr-code" src="" alt="WeChat Pay QR Code" />
</div>
<p class="amount">฿<span id="display-amount">1,500.00</span></p>
<p class="timer">Expires in: <span id="countdown">2:00:00</span></p>
<div class="instructions">
<p>1. Open WeChat</p>
<p>2. Tap "Discover" then "Scan"</p>
<p>3. Scan this QR code</p>
</div>
</div>
การกำหนดค่าวันหมดอายุ
โดยค่าเริ่มต้น การเรียกเก็บเงิน WeChat Pay MPM จะหมดอายุหลังจาก 2 ชั่วโมง คุณสามารถปรับแต่งเวลาหมดอายุได้เมื่อสร้าง source
การหมดอายุแบบกำหนดเอง
curl https://api.omise.co/sources \
-u $OMISE_SECRET_KEY: \
-d "type=wechat_pay_mpm" \
-d "amount=150000" \
-d "currency=THB" \
-d "expires_at=2024-01-15T15:00:00Z"
ขีดจำกัดการหมดอายุ
| การตั้งค่า | ค่า |
|---|---|
| ขั้นต่ำ | 1 นาที |
| สูงสุด | 2 ชั่วโมง |
| ค่าเริ่มต้น | 2 ชั่วโมง |