PayPay
รับชำระเงินจาก PayPay ผู้ใช้งานมากกว่า 60 ล้านรายในประเทศญี่ปุ่น แพลตฟอร์ม QR code payment ชั้นนำของประเทศที่มีอัตราการใช้งานสูงสุดในบรรดาโซลูชันการชำระเงินมือถือของญี่ปุ่น
ภาพรวม
จำนวนผู้ใช้งานเป็นค่าประมาณและอิงจากข้อมูลที่เปิดเผยต่อสาธารณะ จำนวนผู้ใช้งานที่ใช้งานจริงอาจแตกต่างกัน
PayPay เป็นบริการชำระเงินไร้เงินสดขนาดใหญ่ที่สุดของญี่ปุ่นที่มีผู้ใช้งานกว่า 60 ล้านราย (เกือบครึ่งหนึ่งของประชากรญี่ปุ่น) ก่อตั้งขึ้นในปี 2018 เป็นการร่วมทุนระหว่าง SoftBank และ Yahoo Japan PayPay ได้กลายมาเป็นผู้นำตลาดอย่างรวดเร็วผ่านแคมเปญคืนเงินอย่างมากและการยอมรับจากผู้ค้าอย่างแพร่หลาย ซึ่งจำเป็นสำหรับธุรกิจใด ๆ ที่มุ่งเป้าไปยังผู้บริโภคญี่ปุ่น
คุณสมบัติหลัก:
- ✅ ผู้ใช้งานมากกว่า 60 ล้านราย - แอปพลิเคชันชำระเงินชั้นนำของญี่ปุ่น
- ✅ สถานที่มากกว่า 4.4 ล้าน - ยอมรับได้ทั่วประเทศ
- ✅ ไม่มีค่าธรรมเนียมสำหรับลูกค้า - ใช้งานได้ฟรีสำหรับการชำระเงิน
- ✅ ยื นยันทันที - การประมวลผลการชำระเงินแบบเรียลไทม์
- ✅ โปรแกรมรีวอร์ด - ได้รับ PayPay Bonus points สำหรับการซื้อ
- ✅ แหล่งเงินหลายแหล่ง - ธนาคาร บัตรเครดิต ร้านสะดวกซื้อ
ภูมิภาคที่รองรับ
| Region | Currency | Min Amount | Max Amount | API Version |
|---|---|---|---|---|
| Japan | JPY | ¥100 | ¥1,000,000 | 2017-11-02 |
วิธีการทำงาน
ประสบการณ์ของลูกค้า:
- ลูกค้าเลือก "PayPay" ที่หน้าชำระเงิน
- ถูกเปลี่ยนเส้นทางไปยังหน้าชำระเงิน PayPay
- เปิดแอป PayPay โดยอัตโนมัติ (บนมือถือ)
- ตรวจสอบรายละเอียดการท ำธุรกรรม
- ยืนยันตัวตนหากจำเป็น (PIN หรือชีวมิติ)
- ยืนยันการชำระเงินด้วยการแตะครั้งเดียว
- ได้รับ PayPay Bonus points
- กลับไปยังเว็บไซต์ผู้ค้า
เวลาในการดำเนินการโดยทั่วไป: 30-90 วินาที
การนำไปใช้
ขั้นตอนที่ 1: สร้าง PayPay Source
- cURL
- Node.js
- PHP
- Python
- Ruby
- Go
- Java
- C#
curl https://api.omise.co/sources \
-u skey_test_YOUR_SECRET_KEY: \
-d "type=paypay" \
-d "amount=100000" \
-d "currency=JPY"
const omise = require('omise')({
secretKey: 'skey_test_YOUR_SECRET_KEY'
});
const source = await omise.sources.create({
type: 'paypay',
amount: 100000, // ¥100,000
currency: 'JPY'
});
<?php
$source = OmiseSource::create(array(
'type' => 'paypay',
'amount' => 100000,
'currency' => 'JPY'
));
?>
import omise
omise.api_secret = 'skey_test_YOUR_SECRET_KEY'
source = omise.Source.create(
type='paypay',
amount=100000,
currency='JPY'
)
require 'omise'
Omise.api_key = 'skey_test_YOUR_SECRET_KEY'
source = Omise::Source.create({
type: 'paypay',
amount: 100000,
currency: 'JPY'
})
source, err := client.Sources().Create(&operations.CreateSource{
Type: "paypay",
Amount: 100000,
Currency: "JPY",
})
Source source = client.sources().create(new Source.CreateParams()
.type("paypay")
.amount(100000L)
.currency("JPY"));
var source = await client.Sources.Create(new CreateSourceRequest
{
Type = "paypay",
Amount = 100000,
Currency = "JPY"
});
การตอบสนอง:
{
"object": "source",
"id": "src_test_5rt6s9vah5lkvi1rh9c",
"type": "paypay",
"flow": "redirect",
"amount": 100000,
"currency": "JPY"
}
ขั้นตอนที่ 2: สร้าง Charge
curl https://api.omise.co/charges \
-u skey_test_YOUR_SECRET_KEY: \
-d "amount=100000" \
-d "currency=JPY" \
-d "source=src_test_5rt6s9vah5lkvi1rh9c" \
-d "return_uri=https://yourdomain.com/payment/callback"
ขั้นตอนที่ 3: เปลี่ยนเส้นทางลูกค้า
app.post('/checkout/paypay', async (req, res) => {
try {
const { amount, order_id, customer_email } = req.body;
// Validate amount (¥100 - ¥500,000)
if (amount < 100 || amount > 500000) {
return res.status(400).json({
error: 'Amount must be between ¥100 and ¥500,000'
});
}
// Create source
const source = await omise.sources.create({
type: 'paypay',
amount: amount,
currency: 'JPY'
});
// Create charge
const charge = await omise.charges.create({
amount: amount,
currency: 'JPY',
source: source.id,
return_uri: `${process.env.BASE_URL}/payment/callback`,
metadata: {
order_id: order_id,
customer_email: customer_email
}
});
// Redirect to PayPay
res.redirect(charge.authorize_uri);
} catch (error) {
console.error('PayPay 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 === 'paypay') {
const charge = event.data;
if (charge.status === 'successful') {
processOrder(charge.metadata.order_id);
sendConfirmationEmail(charge.metadata.customer_email);
// Log successful payment
console.log(`PayPay payment successful: ${charge.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());
app.post('/checkout/paypay', async (req, res) => {
try {
const { amount, order_id, customer_email, customer_name } = req.body;
// Validate amount (¥100 - ¥500,000)
if (amount < 100 || amount > 500000) {
return res.status(400).json({
error: 'Amount must be between ¥100 and ¥500,000'
});
}
// Calculate estimated PayPay Bonus points (example: 0.5%)
const estimatedBonus = Math.floor(amount * 0.005);
// Create source
const source = await omise.sources.create({
type: 'paypay',
amount: amount,
currency: 'JPY'
});
// Create charge
const charge = await omise.charges.create({
amount: amount,
currency: 'JPY',
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: 'paypay',
estimated_bonus: estimatedBonus
}
});
// Return authorization URL
res.json({
authorize_uri: charge.authorize_uri,
charge_id: charge.id,
estimated_bonus: estimatedBonus
});
} catch (error) {
console.error('PayPay 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') {
const bonus = charge.metadata.estimated_bonus || 0;
res.redirect(`/order-success?order=${charge.metadata.order_id}&bonus=${bonus}`);
} 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 === 'paypay') {
if (charge.status === 'successful') {
updateOrderStatus(charge.metadata.order_id, 'paid');
sendConfirmation(charge.metadata.customer_email, {
amount: charge.amount,
bonus: charge.metadata.estimated_bonus
});
console.log(`PayPay payment successful: ${charge.id}`);
} else {
updateOrderStatus(charge.metadata.order_id, 'failed');
console.log(`PayPay payment failed: ${charge.id}`);
}
}
}
res.sendStatus(200);
});
// Helper functions
async function updateOrderStatus(orderId, status) {
await db.orders.update({ id: orderId }, { status: status });
}
async function sendConfirmation(email, details) {
// Send email confirmation with PayPay Bonus info
}
app.listen(3000);
การสนับสนุนการคืนเงิน
PayPay รองรับ การคืนเงินเต็มและบางส่วน ภายใน 60 วัน:
// Full refund
const fullRefund = await omise.charges.refund('chrg_test_...', {
amount: 100000
});
// Partial refund
const partialRefund = await omise.charges.refund('chrg_test_...', {
amount: 50000 // Half refund
});
- การคืนเงินจะประมวลผลภายใน 1-2 วันทำการ
- ลูกค้าได้รับคืนเงินในยอดคงเหลือ PayPay
- ปรับ PayPay Bonus points โดยอัตโนมัติ
- รองรับภายใน 60 วันนับจากการทำธุรกรรมดั้งเดิม
วงเวลาการคืนเงินและนโยบายอาจมีการเปลี่ยนแปลง ตรวจสอบความสามารถในการคืนเงินปัจจุบันผ่านเอกสาร Omise API หรือแดชบอร์ดผู้ค้าของคุณเสมอ
ปัญหาทั่วไปและการแก้ไขปัญหา
ปัญหา: แอป PayPay ไม่ติดตั้ง
สาเหตุ: ลูกค้าไม่มีแอป PayPay ติดตั้ง
วิธีแก้:
function checkPayPayApp() {
const isMobile = /Android|iPhone|iPad|iPod/i.test(navigator.userAgent);
if (isMobile) {
return `
<div class="paypay-app-check">
<p>PayPay app is required for payment.</p>
<div class="download-links">
<a href="https://play.google.com/store/apps/details?id=jp.ne.paypay.android.app">
<img src="/images/google-play-badge-jp.png" alt="Google Playで入手">
</a>
<a href="https://apps.apple.com/jp/app/paypay/id1435783608">
<img src="/images/app-store-badge-jp.png" alt="App Storeからダウンロード">
</a>
</div>
</div>
`;
}
}
ปัญหา: ยอดคงเหลือไม่เพียงพอ
สาเหตุ: ยอดคงเหลือ PayPay ของลูกค้าต่ำเกินไปและไม่ม ีวิธีการชำระเงินสำรอง
วิธีแก้:
<div class="paypay-balance-info">
<h3>PayPayの残高が不足しています</h3>
<p>以下の方法でチャージしてください:</p>
<ul class="charge-methods">
<li>🏦 <strong>銀行口座</strong> - リアルタイムチャージ</li>
<li>🏧 <strong>セブン銀行ATM</strong> - 現金チャージ</li>
<li>🏪 <strong>ローソン</strong> - レジでチャージ</li>
<li>💳 <strong>クレジットカード</strong> - 登録して自動チャージ</li>
<li>👥 <strong>PayPay残高の送受信</strong> - 友達から受け取る</li>
</ul>
<p class="amount-needed">必要金額: <strong>¥{{amount}}</strong></p>
</div>