Pay-easy
Accept payments via Pay-easy, Japan's standardized payment service allowing customers to pay through ATMs or online banking at any participating bank.
Overviewโ
Pay-easy is a Japanese payment service that enables customers to pay bills and make purchases through ATMs or internet banking. It's widely trusted and used by over 50 million Japanese consumers for utility bills, taxes, and online shopping.
Key Features:
- โ Multi-bank - Works with all major Japanese banks
- โ 50M+ users - Wide adoption across Japan
- โ ATM or online - Flexible payment channels
- โ Trusted - Backed by major Japanese banks
- โ 24/7 availability - Pay anytime
- โ ๏ธ No refunds - Refunds not supported via API
Supported Banksโ
Pay-easy works with virtually all Japanese banks including:
Major Banks:
- Mizuho Bank (ใฟใใป้่ก)
- MUFG Bank (ไธ่ฑUFJ้่ก)
- Sumitomo Mitsui Banking Corporation (ไธไบไฝๅ้่ก)
- Japan Post Bank (ใใใกใ้่ก)
- Resona Bank (ใใใช้่ก)
And 1,000+ other banks, credit unions, and online banks.
| Region | Currency | Min Amount | Max Amount | Settlement |
|---|---|---|---|---|
| Japan | JPY | ยฅ1 | ยฅ999,999 | 1-3 days |
How It Worksโ
Customer Experience:
Option 1: ATM Payment
- Customer receives Pay-easy code
- Goes to any bank ATM
- Selects "Pay-easy" (ใใคใธใผ)
- Entersๅ็ดๆฉ้ข็ชๅท (billing organization code)
- Enters customer number and confirmation number
- Inserts cash or uses bank card
- Receives receipt
Option 2: Online Banking
- Customer logs into internet banking
- Selects "Pay-easy" payment
- Enters payment code information
- Confirms payment
- Receives confirmation
Typical completion time: 1-24 hours (depends on customer action)
Implementationโ
Create Pay-easy Sourceโ
- Node.js
- PHP
- Python
const omise = require('omise')({
secretKey: 'skey_test_YOUR_SECRET_KEY'
});
// Create Pay-easy source
const source = await omise.sources.create({
type: 'pay_easy',
amount: 100000, // ยฅ100,000
currency: 'JPY'
});
// Payment code details
console.log('Payment Code:', source.references.payment_code);
console.log('Expires at:', source.references.expires_at);
// Create charge
const charge = await omise.charges.create({
amount: 100000,
currency: 'JPY',
source: source.id,
metadata: {
order_id: 'ORD-12345'
}
});
// Display payment instructions to customer
<?php
$source = OmiseSource::create(array(
'type' => 'pay_easy',
'amount' => 100000,
'currency' => 'JPY'
));
$paymentCode = $source['references']['payment_code'];
$expiresAt = $source['references']['expires_at'];
$charge = OmiseCharge::create(array(
'amount' => 100000,
'currency' => 'JPY',
'source' => $source['id']
));
?>
import omise
omise.api_secret = 'skey_test_YOUR_SECRET_KEY'
source = omise.Source.create(
type='pay_easy',
amount=100000,
currency='JPY'
)
payment_code = source.references['payment_code']
expires_at = source.references['expires_at']
charge = omise.Charge.create(
amount=100000,
currency='JPY',
source=source.id
)
Display Payment Instructionsโ
<div class="pay-easy-instructions">
<h2>ใๆฏๆใๆนๆณ (Pay-easy Payment)</h2>
<div class="payment-code">
<h3>ใๆฏๆใๆ
ๅ ฑ</h3>
<table>
<tr>
<th>ๅ็ดๆฉ้ข็ชๅท</th>
<td>{{ billing_code }}</td>
</tr>
<tr>
<th>ใๅฎขๆง็ชๅท</th>
<td>{{ customer_number }}</td>
</tr>
<tr>
<th>็ขบ่ช็ชๅท</th>
<td>{{ confirmation_number }}</td>
</tr>
<tr>
<th>ใๆฏๆใ้้ก</th>
<td>ยฅ{{ amount }}</td>
</tr>
<tr>
<th>ใๆฏๆใๆ้</th>
<td>{{ expiry_date }}</td>
</tr>
</table>
</div>
<div class="payment-methods">
<div class="method">
<h4>ATMใงใฎใๆฏๆใ</h4>
<ol>
<li>ใ่ฟใใฎ้่กATMใธ</li>
<li>ใ็จ้ใปๆ้ๆ่พผใใพใใฏใใใคใธใผใใ้ธๆ</li>
<li>ไธ่จใฎ็ชๅทใๅ
ฅๅ</li>
<li>ๅ
ๅฎนใ็ขบ่ชใใฆๆฏๆใ</li>
<li>ใฌใทใผใใๅใๅใ</li>
</ol>
</div>
<div class="method">
<h4>ใใใใใณใญใณใฐใงใฎใๆฏๆใ</h4>
<ol>
<li>ใๅฉ็จใฎ้่กใฎใใใใใณใญใณใฐใซใญใฐใคใณ</li>
<li>ใ็จ้ใปๆ้ๆ่พผใใพใใฏใใใคใธใผใใ้ธๆ</li>
<li>ไธ่จใฎ็ชๅทใๅ
ฅๅ</li>
<li>ๅ
ๅฎนใ็ขบ่ชใใฆๆฏๆใ</li>
<li>็ขบ่ชใกใผใซใๅไฟก</li>
</ol>
</div>
</div>
<div class="supported-banks">
<h4>ใๅฉ็จๅฏ่ฝใช้่ๆฉ้ข</h4>
<p>ๅ
จๅฝใฎใใคใธใผๅฏพๅฟ้่ๆฉ้ข๏ผ้ฝๅธ้่กใๅฐๆน้่กใไฟก็จ้ๅบซใใใใกใ้่กใชใฉ๏ผ</p>
</div>
</div>
<style>
.payment-code {
background: #f5f5f5;
padding: 20px;
border-radius: 8px;
margin: 20px 0;
}
.payment-code table {
width: 100%;
border-collapse: collapse;
}
.payment-code th {
text-align: left;
padding: 10px;
font-weight: bold;
width: 40%;
}
.payment-code td {
padding: 10px;
font-size: 18px;
font-family: monospace;
}
</style>
Handle Webhook Confirmationโ
app.post('/webhooks/omise', async (req, res) => {
const event = req.body;
if (event.key === 'charge.complete') {
const charge = event.data;
if (charge.source.type === 'pay_easy') {
if (charge.status === 'successful') {
// Customer paid - now ship order
await shipOrder(charge.metadata.order_id);
await sendConfirmation(charge.metadata.customer_email);
} else if (charge.status === 'expired') {
// Payment expired - cancel order
await cancelOrder(charge.metadata.order_id);
}
}
}
res.sendStatus(200);
});