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

ShopeePay

รับชำระเงินจาก ShopeePay กระเป๋าเงินดิจิทัลที่รวมเข้ากับแพลตฟอร์มอีคอมเมิร์ซชั้นนำของเอเชียตะวันออกเฉียงใต้ที่มีผู้ใช้งานมากกว่า 150 ล้านคน

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

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

รูปภาพแสดงการเดินทางของลูกค้า: การเลือกกระเป๋าเงิน การสแกน QR code การตรวจสอบสรุป และการยืนยันการชำระเงิน

ภาพรวม

ShopeePay คือกระเป๋าเงินการชำระเงินภายในระบบนิเวศแอป Shopee ซึ่งเป็นหนึ่งในแพลตฟอร์มอีคอมเมิร์ซที่ใหญ่ที่สุดของเอเชียตะวันออกเฉียงใต้ ผู้ใช้สามารถชำระเงินด้วยยอดเงิน ShopeePay สำหรับธุรกรรมที่รวดเร็วและปลอดภัยทั้งภายในและภายนอกแพลตฟอร์ม Shopee

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

  • เข้าถึงได้มาก - ผู้ใช้ Shopee ที่ใช้งานมากกว่า 150 ล้านคน
  • ยืนยันทันที - ประมวลผลการชำระเงินแบบเรียลไทม์
  • มือถือเป็นหลัก - ประสบการณ์การชำระเงินบนมือถือที่ราบรื่น
  • แพลตฟอร์มที่เชื่อถือได้ - ส่วนหนึ่งของ Sea Group (NYSE: SE)
  • ครอบคลุมภูมิภาค - พร้อมใช้งานในหลายประเทศ
  • รางวัลคืนเงิน - ผู้ใช้สะสม Shopee Coins

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

ภูมิภาคสกุลเงินจำนวนขั้นต่ำจำนวนสูงสุดวงเงินรายวัน
ประเทศไทยTHB฿20.00฿50,000฿200,000*
มาเลเซียMYRRM1.00RM1,500RM5,000*

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

วงเงินธุรกรรม

ประเทศไทย (THB)

ระดับการยืนยันตัวตนต่อธุรกรรมวงเงินรายวันวงเงินรายเดือน
พื้นฐาน (เฉพาะโทรศัพท์)฿50,000฿50,000฿200,000
พลัส (ยืนยันบัตรประชาชนแล้ว)฿50,000฿200,000฿500,000

มาเลเซีย (MYR)

ระดับการยืนยันตัวตนต่อธุรกรรมวงเงินรายวันวงเงินรายเดือน
พื้นฐาน (เฉพาะโทรศัพท์)RM1,500RM1,500RM3,000
พลัส (ยืนยันบัตรประชาชนแล้ว)RM1,500RM5,000RM10,000

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

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

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

เวลาในการทำรายการโดยเฉลี่ย: 1-2 นาที

การนำไปใช้

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

curl https://api.omise.co/sources \
-u skey_test_YOUR_SECRET_KEY: \
-d "type=shopeepay" \
-d "amount=25000" \
-d "currency=THB"

การตอบกลับ:

{
"object": "source",
"id": "src_test_5rt6s9vah5lkvi1rh9c",
"type": "shopeepay",
"flow": "redirect",
"amount": 25000,
"currency": "THB"
}

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

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

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

app.post('/checkout/shopeepay', async (req, res) => {
try {
const { amount, currency, order_id } = req.body;

// ตรวจสอบสกุลเงิน
if (!['THB', 'MYR'].includes(currency)) {
return res.status(400).json({
error: 'ShopeePay supports THB and MYR only'
});
}

// ตรวจสอบจำนวนเงินตามสกุลเงิน
const limits = {
THB: { min: 2000, max: 5000000 },
MYR: { min: 100, max: 150000 }
};

const { min, max } = limits[currency];
if (amount < min || amount > max) {
return res.status(400).json({
error: `Amount must be between ${min} and ${max} ${currency}`
});
}

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

// สร้าง charge
const charge = await omise.charges.create({
amount: amount,
currency: currency,
source: source.id,
return_uri: `${process.env.BASE_URL}/payment/callback`,
metadata: {
order_id: order_id
}
});

// เปลี่ยนเส้นทางไปยัง ShopeePay
res.redirect(charge.authorize_uri);

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

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

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 === 'shopeepay') {
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());

// วงเงินตามสกุลเงิน
const LIMITS = {
THB: { min: 2000, max: 5000000 },
MYR: { min: 100, max: 150000 }
};

app.post('/checkout/shopeepay', async (req, res) => {
try {
const { amount, currency, order_id } = req.body;

// ตรวจสอบสกุลเงิน
if (!['THB', 'MYR'].includes(currency)) {
return res.status(400).json({
error: 'ShopeePay only supports THB and MYR'
});
}

// ตรวจสอบจำนวนเงิน
const { min, max } = LIMITS[currency];
if (amount < min || amount > max) {
return res.status(400).json({
error: `Amount must be between ${min} and ${max} ${currency}`
});
}

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

// สร้าง charge
const charge = await omise.charges.create({
amount: amount,
currency: currency,
source: source.id,
return_uri: `${process.env.BASE_URL}/payment/callback`,
metadata: {
order_id: order_id,
payment_method: 'shopeepay'
}
});

// ส่งคืน URL การอนุญาต
res.json({
authorize_uri: charge.authorize_uri,
charge_id: charge.id
});

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

// ตัวจัดการ callback
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
app.post('/webhooks/omise', (req, res) => {
const event = req.body;

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

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

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

การยกเลิก Charge

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

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

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

การคืนเงิน

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

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

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

ปัญหาที่พบบ่อยและการแก้ไข

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

สาเหตุ: ลูกค้าเลือก ShopeePay แต่ไม่มีแอป Shopee

วิธีแก้:

function checkShopeeApp() {
if (!/Android|iPhone|iPad|iPod/i.test(navigator.userAgent)) {
alert('ShopeePay ต้องใช้แอปมือถือ Shopee โปรดใช้อุปกรณ์มือถือ');
return false;
}
return true;
}

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

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

วิธีแก้:

if (charge.failure_code === 'insufficient_balance') {
showMessage('ยอดเงิน ShopeePay ไม่เพียงพอ โปรดเติมเงินในแอป Shopee');
offerAlternativePayment();
}

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

วิธีแก้:

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

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

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

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

<div class="shopeepay-instructions">
<h3>ชำระเงินด้วย ShopeePay</h3>
<ol>
<li>ตรวจสอบให้แน่ใจว่าคุณได้ติดตั้งแอป Shopee แล้ว</li>
<li>ตรวจสอบว่ายอดเงิน ShopeePay ของคุณเพียงพอ</li>
<li>คุณจะถูกเปลี่ยนเส้นทางไปยังแอป Shopee</li>
<li>ยืนยันการชำระเงินด้วย PIN หรือไบโอเมตริกส์</li>
</ol>
<p>เติมเงินยอดเงิน ShopeePay ในแอป Shopee หากจำเป็น</p>
</div>

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

function validateAmount(amount, currency) {
const limits = {
THB: { min: 2000, max: 5000000, symbol: '฿' },
MYR: { min: 100, max: 150000, symbol: 'RM' }
};

const { min, max, symbol } = limits[currency];

if (amount < min) {
return `จำนวนเงินขั้นต่ำคือ ${symbol}${min / 100}`;
}

if (amount > max) {
return `จำนวนเงินสูงสุดคือ ${symbol}${max / 100}`;
}

return null;
}

3. การออกแบบมือถือเป็นหลัก

function isMobileDevice() {
return /Android|iPhone|iPad|iPod/i.test(navigator.userAgent);
}

if (!isMobileDevice()) {
// ซ่อนตัวเลือก ShopeePay บนเดสก์ท็อป
document.getElementById('shopeepay-option').style.display = 'none';
}

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

ประเทศใดบ้างที่รองรับ ShopeePay?

การชำระเงิน ShopeePay ผ่าน Omise ปัจจุบันพร้อมใช้งานในประเทศไทยและมาเลเซีย

ลูกค้าต้องมีบัญชี Shopee หรือไม่?

ใช่ ลูกค้าต้องติดตั้งแอป Shopee พร้อมกระเป๋าเงิน ShopeePay ที่เปิดใช้งานแล้ว

วงเงินธุรกรรมคือเท่าไร?
  • ประเทศไทย: ฿20 - ฿50,000 ต่อธุรกรรม
  • มาเลเซีย: RM1 - RM1,500 ต่อธุรกรรม

วงเงินรายวันและรายเดือนขึ้นอยู่กับระดับการยืนยันตัวตน

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

การชำระเงิน ShopeePay โดยทั่วไปเกิดขึ้นภายใน 1-3 วันทำการ

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

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

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

การชำระเงินจะถูกปฏิเสธ ลูกค้าสามารถเติมเงินยอดเงิน ShopeePay ผ่านบัตรเครดิต/เดบิต โอนเงินผ่านธนาคาร หรือที่ร้าน 7-Eleven (ประเทศไทย)

ShopeePay ทำงานบนเดสก์ท็อปหรือไม่?

ShopeePay ต้องใช้แอปมือถือ Shopee ดังนั้นจึงเป็นแบบมือถือเท่านั้น ผู้ใช้เดสก์ท็อปควรเห็นวิธีการชำระเงินทางเลือก

การทดสอบ

โหมดทดสอบ

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

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

  • ใช้ API key ทดสอบ (skey_test_xxx)
  • ทดสอบสกุลเงินที่รองรับทั้งหมด: THB, MYR
  • ไม่จำเป็นต้องมีบัญชี ShopeePay จริงสำหรับการทดสอบ

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

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

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

// ทดสอบ ShopeePay สำหรับทั้งสองประเทศ
const testConfigs = [
{ country: 'TH', currency: 'THB', amount: 2000 },
{ country: 'MY', currency: 'MYR', amount: 100 }
];

for (const config of testConfigs) {
const source = await omise.sources.create({
type: 'shopeepay',
amount: config.amount,
currency: config.currency
});

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

console.log(`Test ${config.country}:`, charge.authorize_uri);
}

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

  • การชำระเงินสำเร็จ: ขั้นตอนการเปลี่ยนเส้นทางและการประมวลผลคำสั่งซื้อให้เสร็จสิ้น
  • การชำระเงินล้มเหลว: ทดสอบการจัดการข้อผิดพลาดและข้อความของผู้ใช้
  • ทั้งสองประเทศ: ทดสอบประเทศไทย (THB) และมาเลเซีย (MYR) แยกกัน
  • การตรวจสอบจำนวนเงิน: ตรวจสอบวงเงินขั้นต่ำ/สูงสุดต่อสกุลเงิน
  • ขั้นตอนมือถือ: ทดสอบ deep link ไปยังแอป Shopee
  • การจัดการหมดเวลา: ทดสอบสถานการณ์การชำระเงินที่ถูกละทิ้ง
  • การส่ง Webhook: ตรวจสอบว่าได้รับเหตุการณ์ webhook ทั้งหมด

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

  • โหมดทดสอบไม่เชื่อมต่อกับเซิร์ฟเวอร์ Shopee จริง
  • ใช้แดชบอร์ดเพื่อจำลองการทำธุรกรรมให้เสร็จสิ้น
  • ทดสอบสกุลเงิน THB และ MYR ทั้งคู่ก่อนเริ่มใช้งานจริง
  • ตรวจสอบ webhook สำหรับสถานะ charge ทั้งหมด
  • ทดสอบขั้นตอนเฉพาะมือถือ (การสลับแอป, deep link)

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

ทรัพยากรที่เกี่ยวข้อง

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

  1. สร้าง source ของ ShopeePay
  2. นำขั้นตอนการเปลี่ยนเส้นทางไปใช้
  3. ตั้งค่า webhook
  4. ทดสอบการรวม
  5. เริ่มใช้งานจริง