PayPay
日本で6000万人以上のPayPayユーザーからの支払いを受け付けます。日本のモバイル決済ソリューションの中で最も高い普及率を誇る、国内で最も主要なQRコード決済プラットフォームです。
概要
ユーザー統計
ユーザー数は概算であり、公開されている情報に基づいています。実際のアクティブユーザー数は異なる場合があります。
PayPayは、SoftBankとYahoo Japanの合弁事業として2018年に開始された、6000万人以上のユーザー(日本の人口のほぼ半分)を持つ日本最大のキャッシュレス決済サービスです。積極的なキャッシュバックキャンペーンと広範な加盟店の採用により、PayPayは急速に市場リーダーとなり、日本の消費者をターゲットとするビジネスにとって不可欠なものとなっています。
主な機能:
- ✅ 6000万人以上のユーザー - 日本を代表する決済アプリの1つ
- ✅ 440万店舗以上 - 全国で利用可能
- ✅ 顧客手数料無料 - 支払いに無料で使用
- ✅ 即時確認 - リアルタイム決済処理
- ✅ リワードプログラム - 購入時にPayPayボーナスポイント
- ✅ 複数の入金源 - 銀行、クレジットカード、コンビニ
サポートされている地域
| 地域 | 通貨 | 最小金額 | 最大金額 | 1日の制限 |
|---|---|---|---|---|
| 日本 | JPY | ¥100 | ¥500,000 | 入金源により異なります* |
*1日の制限は顧客の入金源と確認レベルによって異なります:
- PayPay残高: 1日最大¥500,000(確認済みユーザー)
- 連携銀行口座: 1日最大¥500,000
- クレジットカード: カードの制限に従います
仕組み
顧客体験:
- 顧客がチェックアウト時に「PayPay」を選択
- PayPay支払いページにリダイレクト
- PayPayアプリが自動的に開く(モバイル)
- 取引詳細を確認
- 必要に応じて認証(PINまたは生体認証)
- ワンタップで支払いを確認
- PayPayボーナスポイントを獲得
- マーチャントウェブサイトに戻る
通常の完了時間: 30-90秒
実装
ステップ1: PayPayソースの作成
- 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: チャージの作成
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;
// 金額を検証(¥100 - ¥500,000)
if (amount < 100 || amount > 500000) {
return res.status(400).json({
error: '金額は¥100から¥500,000の間である必要があります'
});
}
// ソースを作成
const source = await omise.sources.create({
type: 'paypay',
amount: amount,
currency: 'JPY'
});
// チャージを作成
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
}
});
// 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);
// 成功した支払いをログ
console.log(`PayPay payment successful: ${charge.id}`);
} else if (charge.status === 'failed') {
handleFailedPayment(charge.metadata.order_id);
}
}
res.sendStatus(200);
});
完全な実装例
// Express.jsサーバー
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;
// 金額を検証(¥100 - ¥500,000)
if (amount < 100 || amount > 500000) {
return res.status(400).json({
error: '