KakaoPay
ยอมรับการชำระเงินจาก KakaoPay ในสิงคโปร์และประเทศไทย กระเป๋าดิจิทัลที่บูรณาการซึ่งรองรับตลาดในหลายประเทศในเอเชียตะวันออกเฉียงใต้
ภาพรวม
KakaoPay เป็นบริการชำระเงินผ่านกระเป๋าดิจิทัลที่ดำเนินการในสิงคโปร์และประเทศไทย ซึ่งให้ลูกค้าได้มีตัวเลือกการชำระเงินบนมือถือที่สะดวกสบายรวมเข้ากับแพลตฟอร์มอีคอมเมิร์ซ
คุณ สมบัติหลัก:
- ✅ หลายภูมิภาค - พร้อมใช้งานในสิงคโปร์และประเทศไทย
- ✅ การยืนยันที่รวดเร็ว - การตรวจสอบการชำระเงินเกือบแบบเรียลไทม์ (โดยปกติภายในไม่กี่วินาที)
- ✅ เพิ่มประสิทธิภาพสำหรับมือถือ - ประสบการณ์สมาร์ทโฟนที่ราบรื่น
- ✅ ชำระเงินได้อย่างรวดเร็ว - การยืนยันการชำระเงินแบบรวดเร็ว
- ✅ เน้นอีคอมเมิร์ซ - ได้รับความนิยมสำหรับการช้อปปิ้งออนไลน์
ภูมิภาคที่รองรับ
| Region | Currency | Min Amount | Max Amount | API Version |
|---|---|---|---|---|
| Singapore | SGD | $1.00 | $20,000.00 | 2017-11-02 |
| Thailand | THB | ฿20.00 | ฿150,000.00 | 2017-11-02 |
วิธีการทำงาน
ประสบการณ์ของลูกค้า:
- ลูกค้าเลือก KakaoPay ที่ชำระเงิน
- เปลี่ยนเส้นทางไปยังหน้าการยืนยันตัวตน KakaoPay
- แอป KakaoTalk เปิดโดยอัตโนมัติ (deep link)
- ลูกค้าตรวจสอบการชำระเงินใน KakaoTalk
- ยืนยันด้วยรหัสผ่าน/ชีวมิติ/รูปแบบ
- กลับไปยังไซต์ของผู้ค้า
- ได้รับการแจ้งเตือนการชำระเงินใน KakaoTalk
เวลาเสร็จสิ้นทั่วไป: 30-90 วินาที
ตัวอย่างการไหลของการชำระเงิน
การไหลการชำระเงินบนมือถือ:

ประสบการณ์มือถ ือที่เร็วสายฟ้า:
- ❶ เลือก KakaoPay - ลูกค้าเลือก KakaoPay ที่ชำระเงิน
- ❷ KakaoTalk เปิด - Deep link เปิดแอป KakaoTalk ทันที
- ❸ พร้อมชำระเงิน - รายละเอียดธุรกรรมปรากฏใน KakaoTalk
- ❹ ตรวจสอบรายละเอียด - แสดงชื่อผู้ค้าและจำนวนเงินที่ชำระ
- ❺ ตรวจสอบความถูกต้อง - ยืนยันด้วยรหัสผ่าน รูปแบบ หรือชีวมิติ
- ❻ ชำระเงินเสร็จสิ้น - การประมวลผลแบบทันที (เร็วที่สุดในเอเชีย - 20-40 วินาที)
- ❼ การแจ้งเตือน - ข้อความยืนยันการชำระเงินใน KakaoTalk
- ❽ กลับไป - การเปลี่ยนเส้นทางโดยอัตโนมัติไปยังผู้ค้า
การไหลการชำระเงินบนเดสก์ท็อป:

วิธีโค้ด QR สำหรับผู้ใช้เดสก์ท็อป:
- ❶ เลือก KakaoPay - ลูกค้าเลือก KakaoPay บนเดสก์ท็อป
- ❷ สร้างโค้ด QR - ระบบสร้างโค้ด QR สำหรับการชำระเงิน KakaoPay
- ❸ แสดงโค้ด QR - โค้ด QR แสดงให้เห็นอย่างชัดเจนบนหน้าจอ
- ❹ เปิด KakaoTalk - ลูกค้าเปิด KakaoTalk บนมือถือ
- ❺ สแกน QR - ใช้สแกนเนอร์ QR ในตัวของ KakaoTalk
- ❻ โหลดการชำระเงิน - รายละเอียดธุรกรรมเติมโดยอัตโนมัติในแอป
- ❼ ตรวจสอบความถูกต้อง - ยืนยันชีวมิติหรือรหัสผ่านอย่างรวดเร็ว
- ❽ สำเร็จ - ชำระเงินแล้ว เดสก์ท็อปแสดงการยืนยัน
การใช้งาน
ขั้นตอนที่ 1: สร้าง KakaoPay Source
- cURL
- Node.js
- PHP
- Python
- Ruby
- Go
curl https://api.omise.co/sources \
-u skey_test_YOUR_SECRET_KEY: \
-d "type=kakaopay" \
-d "amount=1000000" \
-d "currency=KRW"
const omise = require('omise')({
secretKey: 'skey_test_YOUR_SECRET_KEY'
});
const source = await omise.sources.create({
type: 'kakaopay',
amount: 1000000, // ₩10,000
currency: 'KRW'
});
console.log('KakaoPay source:', source.id);
<?php
$source = OmiseSource::create(array(
'type' => 'kakaopay',
'amount' => 1000000,
'currency' => 'KRW'
));
?>
import omise
omise.api_secret = 'skey_test_YOUR_SECRET_KEY'
source = omise.Source.create(
type='kakaopay',
amount=1000000,
currency='KRW'
)
require 'omise'
Omise.api_key = 'skey_test_YOUR_SECRET_KEY'
source = Omise::Source.create({
type: 'kakaopay',
amount: 1000000,
currency: 'KRW'
})
source, err := client.Sources().Create(&operations.CreateSource{
Type: "kakaopay",
Amount: 1000000,
Currency: "KRW",
})
การตอบสนอง:
{
"object": "source",
"id": "src_test_5rt6s9vah5lkvi1rh9c",
"type": "kakaopay",
"flow": "redirect",
"amount": 1000000,
"currency": "KRW"
}
ขั้นตอนที่ 2: สร้าง Charge และเปลี่ยนเส้นทาง
app.post('/checkout/kakaopay', async (req, res) => {
try {
const { amount, order_id, customer_email, customer_name } = req.body;
// Validate amount
if (amount < 10000) { // ₩100 minimum
return res.status(400).json({
error: 'Minimum amount is ₩100'
});
}
if (amount > 1000000000) { // ₩10,000,000 maximum
return res.status(400).json({
error: 'Maximum amount is ₩10,000,000'
});
}
// Create source
const source = await omise.sources.create({
type: 'kakaopay',
amount: amount,
currency: 'KRW'
});
// Create charge
const charge = await omise.charges.create({
amount: amount,
currency: 'KRW',
source: source.id,
return_uri: `${process.env.BASE_URL}/payment/callback`,
metadata: {
order_id: order_id,
customer_email: customer_email,
customer_name: customer_name,
payment_method: 'kakaopay'
}
});
// Redirect to KakaoPay
res.redirect(charge.authorize_uri);
} catch (error) {
console.error('KakaoPay error:', error);
res.status(500).json({ error: error.message });
}
});
ขั้นตอนที่ 3: จัดการ Return 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') {
await processOrder(charge.metadata.order_id);
res.redirect(`/order-success?order=${charge.metadata.order_id}`);
} else if (charge.status === 'failed') {
res.redirect(`/payment-failed?reason=${charge.failure_message}`);
} else {
res.redirect('/payment-pending');
}
} catch (error) {
res.redirect('/payment-error');
}
});
ขั้นตอนที่ 4: จัดการ Webhook
app.post('/webhooks/omise', async (req, res) => {
const event = req.body;
if (event.key === 'charge.complete') {
const charge = event.data;
if (charge.source.type === 'kakaopay') {
if (charge.status === 'successful') {
await fulfillOrder(charge.metadata.order_id);
await sendConfirmationEmail(charge.metadata.customer_email);
} else if (charge.status === 'failed') {
await handleFailedPayment(charge.metadata.order_id);
}
}
}
res.sendStatus(200);
});
ตัวอย่างการใช้งานที่สมบูรณ์
const express = require('express');
const omise = require('omise')({
secretKey: process.env.OMISE_SECRET_KEY
});
const app = express();
app.use(express.json());
// KakaoPay configuration
const KAKAOPAY_CONFIG = {
currency: 'KRW',
minAmount: 10000, // ₩100
maxAmount: 1000000000, // ₩10,000,000
displayName: 'KakaoPay',
timeout: 10 * 60 * 1000 // 10 minutes
};
// Create KakaoPay payment
app.post('/checkout/kakaopay', async (req, res) => {
try {
const { amount, order_id, customer_email, customer_name, customer_phone } = req.body;
// Validate currency
if (req.body.currency && req.body.currency !== 'KRW') {
return res.status(400).json({
error: 'KakaoPay only supports KRW currency'
});
}
// Validate amount
if (amount < KAKAOPAY_CONFIG.minAmount) {
return res.status(400).json({
error: `Minimum amount is ₩${KAKAOPAY_CONFIG.minAmount / 100}`
});
}
if (amount > KAKAOPAY_CONFIG.maxAmount) {
return res.status(400).json({
error: `Maximum amount is ₩${KAKAOPAY_CONFIG.maxAmount / 100}`
});
}
// Create source
const source = await omise.sources.create({
type: 'kakaopay',
amount: amount,
currency: KAKAOPAY_CONFIG.currency
});
// Create charge
const charge = await omise.charges.create({
amount: amount,
currency: KAKAOPAY_CONFIG.currency,
source: source.id,
return_uri: `${process.env.BASE_URL}/payment/callback`,
metadata: {
order_id: order_id,
customer_email: customer_email,
customer_name: customer_name,
customer_phone: customer_phone,
payment_method: 'kakaopay'
}
});
// Log for tracking
console.log(`KakaoPay payment initiated: ${charge.id} for order ${order_id}`);
// Return authorization URL
res.json({
authorize_uri: charge.authorize_uri,
charge_id: charge.id
});
} catch (error) {
console.error('KakaoPay error:', error);
res.status(500).json({ error: error.message });
}
});
// Payment callback
app.get('/payment/callback', async (req, res) => {
try {
const charge = await omise.charges.retrieve(req.query.charge_id);
if (charge.status === 'successful') {
res.redirect(`/order-confirmation?order=${charge.metadata.order_id}`);
} else {
res.redirect(`/payment-failed?charge=${req.query.charge_id}`);
}
} catch (error) {
res.redirect('/payment-error');
}
});
// Webhook handler
app.post('/webhooks/omise', async (req, res) => {
const event = req.body;
if (event.key === 'charge.complete' && event.data.source.type === 'kakaopay') {
const charge = event.data;
if (charge.status === 'successful') {
await fulfillOrder(charge.metadata.order_id);
await sendReceipt(charge.metadata.customer_email, charge);
console.log(`KakaoPay payment successful: ${charge.id}`);
} else {
await cancelOrder(charge.metadata.order_id);
console.log(`KakaoPay payment failed: ${charge.id}`);
}
}
res.sendStatus(200);
});
app.listen(3000);
การรองรับการคืนเงิน
KakaoPay รองรับ การคืนเงินแบบเต็มและบางส่วน ภายใน 365 วัน:
// Full refund
const fullRefund = await omise.charges.refund('chrg_test_...', {
amount: 1000000 // Full amount
});
// Partial refund
const partialRefund = await omise.charges.refund('chrg_test_...', {
amount: 500000 // Partial amount
});
console.log('Refund status:', fullRefund.status);
การประมวลผล Refund
การคืนเงินจะประมวลผลกลับไปยังบัญชี KakaoPay ของลูกค้าภายใน 3-5 วันทำการ