PayPay Open Payment API(OPA)は、様々なシナリオに対応した決済関連操作が設計されており、ユーザーへ快適な決済体験を提供します。 PayPay OPAクライアントとして登録されている場合、決済パートナーは下記の機能が使用可能になります。
本書では、PayPay決済パートナー向けに設計したWeb Cashier APIに焦点を当てます。
PayPay Open Payment APIでは、セキュリティ対策としてTLS 1.2以上の使用が必須となっております。TLS1.0およびTLS1.1では接続できませんのでご注意ください。
このフローでは、paypay Webページ/PayPay Appを立ち上げるためのコードを作成します。 ユーザーはPayPay Webページ(インストールされている場合はApp)を使用して決済を行います。 加盟店は、APIで支払ステータスの照会や、通知機能を利用し注文の処理を行うことが可能です。
PayPayからのリダイレクトがない場合に、Get Payment Detailsを用いて決済結果を確認する様、お願いいたします。 ユーザーがアプリを閉じた場合等、PayPayからのリダイレクトできない場合がございます。 この場合、PayPay決済済みに関わらず加盟店で未決済となり、ユーザーからの苦情につながる可能性があります。
ポーリング間隔は、2〜3秒程度として下さい。
このフローの詳細はこちらを参照してください。
PayPay OPAの利用を開始するには、事前に定められたプロセスに従ってPayPay加盟店の登録を行なってください。 このプロセスは 情報収集、手動検証、契約確認、およびクレデンシャル情報の発行から構成されます。
PayPayの加盟店として登録された後、以下の項目が設定されます。
これらの設定を管理するには、マーチャントパネルを使用するか、弊社営業担当までご連絡ください。
ユーザーからのPayPayアプリ、PayPayWeb画面への日本国外からのアクセスは制限されています。詳細については個別にご相談ください。
OPA API認証に関わることは全て API認証のページ にあります。
APIのリクエスト時に加盟店識別子をセットする必要があります。 加盟店識別子をセットするには2つの方法があります。
クエリの中にセットする:
?assumeMerchant={MerchantId}
HTTPヘッダにセットする:
X-ASSUME-MERCHANT: {MerchantId}
両方を指定した場合、クエリにセットしたパラメーターが優先されます。
PayPay OPAはhttpレスポンスステータスコードとOPAエラーコードを用いてリクエストの成功または失敗を返却します。 これらの情報を使用して、どのようなエラー対応をするべきかを判断できます。
PayPay OPAは以下のhttpレスポンスステータスコードを返します。
| Status | Code | Description |
|---|---|---|
| 200 | SUCCESS | Success |
| 202 | REQUEST_ACCEPTED | リクエストを受け付けました。 |
| 400 | INVALID_REQUEST_PARAMS | リクエスト時にセットされた情報に無効なデータが含まれています。例)サポートされていない通貨がセットされているなど。 |
| 401 | OP_OUT_OF_SCOPE | The operation is not permitted. |
| 400 | MISSING_REQUEST_PARAMS | 必要なパラメーターが設定されていません。 |
| 400 | INVALID_PARAMS | 設定されたパラメーターが無効です。 |
| 401 | UNAUTHORIZED | 有効なapi keyとsecretがセットされていません。 |
| 404 | OPA_CLIENT_NOT_FOUND | OPAクライアントが見つかりません。 |
| 429 | RATE_LIMIT | 流量制限エラー。 |
| 500 | SERVICE_ERROR | PayPayサービス側で問題が発生しました。 |
| 500 | INTERNAL_SERVER_ERROR | PayPayサービス側で問題が発生しました。 |
| 503 | MAINTENANCE_MODE | メンテナンス中です。 |
| Status | Code | Description |
|---|---|---|
| 400 | DUPLICATE_DYNAMIC_QR_REQUEST | Dynamic QR Codeのリクエストが重複しています。 |
| 400 | PRE_AUTH_CAPTURE_UNSUPPORTED_MERCHANT | この加盟店は PreAuth & Capture をサポートしていません。リクエストパラメータのisAuthorizationにtrueを指定した場合のみ発生する可能性があります。 |
| 400 | PRE_AUTH_CAPTURE_INVALID_EXPIRY_DATE | 有効期限日が最大許容有効期限日の許容限度を超えています。リクエストパラメータのisAuthorizationにtrueを指定した場合のみ発生する可能性があります。 |
| 400 | DYNAMIC_QR_BAD_REQUEST | リクエストヘッダー、クエリパラメータ、またはリクエストボディが不正です。 |
| Status | Code | Description |
|---|---|---|
| 400 | DYNAMIC_QR_BAD_REQUEST | リクエストヘッダー、クエリパラメータ、またはリクエストボディが不正です。 |
| 404 | DYNAMIC_QR_NOT_FOUND | 該当のQR codeが見つかりません。 |
| Status | Code | Description |
|---|---|---|
| 400 | DYNAMIC_QR_PAYMENT_NOT_FOUND | 指定された取引が見つかりません。このエラーは、QRコードが利用できなくなる、または指定されたmerchantPaymentIdで支払いが見つからない場合に返されます。このQRコードを用いて支払いがなされることはないため、支払いを再度試みる場合、加盟店は「Create a Code」APIを使用して別のDynamic QRコードを作成し直してください。 |
| 400 | DYNAMIC_QR_BAD_REQUEST | リクエストヘッダー、クエリパラメータ、またはリクエストボディが不正です。 |
| Status | Code | Description |
|---|---|---|
| 400 | ORDER_NOT_REVERSIBLE | このコードは、以下のいずれかの場合に返されます。 1) 対象注文のステータスが REFUNDED,EXPIRED, COMPLETED, または CANCELED のいずれかである場合。出荷売上以外の場合は注文のステータスが COMPLETEDであってもこのエラーコードは返されません。2) キャンセルウィンドウが過ぎた場合です。 |
| Status | Code | Description |
|---|---|---|
| 201 | USER_CONFIRMATION_REQUIRED | 増額ReAuthorize処理が開始しました。 |
| 400 | REAUTHORIZE_REJECTED | 1. オーダーのステータスがAUTHORIZEDでない時 2. オーダータイプがサポートされていない時 3. 指定された支払い方法がサポートされていない時 4. 同一のリクエストを受付済の時 |
| 400 | PAY_METHOD_INVALIDATED | 元の取引(Authorization)に使用された支払い方法が期限切れまたは無効の時。別の支払い方法を指定するようにユーザを誘導する必要があります。 |
| 400 | REAUTH_AMOUNT_UNCHANGED | ReAuthorizeの金額が同じ場合のエラー。 |
| 400 | REAUTH_MAX_LIMIT_EXCEEDED | ReAuthorizeの最大試行回数超過。最大試行回数は10回です。 |
| 400 | REAUTHORIZE_FAILED | オーダーのステータス更新に失敗しました。 |
| 404 | RESOURCE_NOT_FOUND | オーダーが存在しない。 |
| Status | Code | Description |
|---|---|---|
| 202 | USER_CONFIRMATION_REQUIRED | 増額キャプチャの実施にあたり、ユーザーに通知を送信しています。 |
| 400 | UNACCEPTABLE_OP | リクエストされた操作は現状では処理できません。例: 不審なユーザー |
| 400 | LIMIT_EXCEEDED | 支払い上限額を超えています。決済金額が事前承認された金額を超える場合、発生する可能性があります。 |
| 400 | USER_DEFINED_DAILY_LIMIT_EXCEEDED | ユーザ設定の支払い上限額(24時間)を超えています。決済金額が事前承認された金額を超える場合、発生する可能性があります。 |
| 400 | USER_DEFINED_MONTHLY_LIMIT_EXCEEDED | ユーザ設定の支払い上限額(30日)を超えています。決済金額が事前承認された金額を超える場合、発生する可能性があります。 |
| 400 | ALREADY_CAPTURED | 既に決済完了しています。 |
| 400 | CANCELED_USER | 対象のユーザーが存在しません。 |
| 400 | ORDER_EXPIRED | オーダーの有効期間がすぎています。 |
| 400 | ORDER_NOT_CAPTURABLE | Captureできない支払いです。 |
| 400 | REAUTHORIZATION_IN_PROGRESS | PayPayの処理と競合しています。 |
| 400 | TOO_CLOSE_TO_EXPIRY | リクエストが有効期限に近すぎるため、処理できません。 |
| 400 | NO_SUFFICIENT_FUND | ユーザーの残高が不足しているため決済ができません。 |
| 404 | RESOURCE_NOT_FOUND | オーダーが見つかりません。 |
| Status | Code | Description |
|---|---|---|
| 400 | ORDER_NOT_CANCELABLE | Revertできない支払いです。 |
| 400 | UNACCEPTABLE_OP | トランザクションエラーです。 |
| 404 | RESOURCE_NOT_FOUND | オーダーが見つかりません。 |
| Status | Code | Description |
|---|---|---|
| 400 | INVALID_PARAMS | 受信したパラメータが無効です。 |
| 400 | UNACCEPTABLE_OP | リクエストされた操作は現状では処理できません。例: 不審なユーザー |
| 400 | CANCELED_USER | 対象のユーザーが存在しません。 |
| 400 | THROTTLED_MULTIPLE_REFUND_REJECTED | 同様の処理が進行中のため、返金リクエストが拒否されました。1分後にリトライできます。 |
| 400 | REFUND_LIMIT_EXCEEDED | 返金の最大数に達しているため、処理できません。加盟店の複数回返金機能が有効化されている場合にのみ発生する可能性があります。 |
| 400 | REFUND_WINDOW_EXCEED | 返金可能な期間を超過しています。 返金対象の決済に使用されたPayPay商品券の有効期限が切れている場合、このエラーが返却されます。 |
| 401 | USER_STATE_IS_NOT_ACTIVE | ユーザーが無効な状態です。 |
| 403 | MERCHANT_MULTIPLE_REFUND_REJECTED | 加盟店の複数回返金機能が有効化されていません。 |
| 404 | NO_SUCH_REFUND_ORDER | 対象の返金が存在しません。 |
| 404 | RESOURCE_NOT_FOUND | オーダーが見つかりません。 |
| Status | Code | Description |
|---|---|---|
| 404 | NO_SUCH_REFUND_ORDER | 対象の返金が存在しません。 |
推奨されるタイムアウト設定は、各APIで指定されています。 最も重要なのは、支払いタイムアウトAPIで、読み取りタイムアウト値を30秒以上で設定してください。
タイムアウトが発生した場合、不明な支払いステータスとして扱ってください。
ステータスが不明な場合、下記のいずれかの方法で対処してください。
取引のステータスを照会するため、照会APIを使用してください。 PayPayで取引が失敗になっている、または存在しない場合は、元取引と同様のリクエストを再度行なってください。
キャンセルAPIを使用してください。 キャンセルAPIが提供されている場合は、取引をキャンセルすることもできます。 キャンセルが承認された後、元取引と同様のリクエストを再度行なってください。
基本的に、すべてのAPIレスポンスには X-REQUEST-ID がレスポンスヘッダーとして含まれます(一部例外を除きます)。
PayPayへお問い合わせの際は、このリクエストIDをご提示ください。
フォーマット: 英数字とハイフン(最大64文字)
例:
OPA45F681001AEF4605B2A50939F611F4B8
支払いのためのコードを作成します。作成したコードの有効期限は「expiryDate」に設定されます。
merchantPaymentIdは、加盟店側で一意になるように管理して下さい。
Timeout: 30s
コード作成
| merchantPaymentId required | string (MerchantPaymentId) <= 64 characters 加盟店発番のトランザクション毎に一意に特定できるトランザクションID |
required | object (MoneyAmount) |
| orderDescription | string <= 255 characters 注文内容の説明 (アプリでの表示を確認) |
Array of objects (MerchantOrderItem) | |
| codeType required | string 固定文字列「ORDER_QR」をセットしてください。 |
| storeInfo | string <= 255 characters 加盟店の店舗情報 |
| storeId | string (StoreId) <= 255 characters 加盟店に紐付く店舗ID |
| productType | string (ProductType) <= 255 characters PayPayシステムのプロダクトタイプ。
特定の加盟店以外はこのパラメータはオプションです。
特定のプロダクトタイプのみを使用するよう制限されている一部の加盟店の場合、プロダクトタイプを適切に設定する必要があります。 |
| terminalId | string <= 255 characters 店舗に紐付く端末ID |
| requestedAt | integer (EpochTime) エポックタイムスタンプ(秒単位) |
| redirectUrl | string 支払い完了後に開くページ/アプリのURL。これは、Web URLまたはアプリへのディープリンクを設定することができます。 |
| redirectType | string Enum: "WEB_LINK" "APP_DEEP_LINK" "WEBVIEW_IN_PAYPAY" リダイレクト先がウェブブラウザである場合は「WEB_LINK」、リダイレクト先が加盟店アプリである場合は「APP_DEEP_LINK」となります。「WEBVIEW_IN_PAYPAY」の利用は非推奨となりますが、PayPayアプリ内のWebviewで表示させることができます。ご利用の際はあらかじめ弊社にお問い合わせいただくようお願いいたします。(https://integration.paypay.ne.jp/hc/ja/requests/new) |
| userAgent | string (UserAgentQrCode) このパラメータを利用する際は、redirectTypeを WEBブラウザのUser agentを設定してください。このパラメーターを設定すると、PayPayアプリが起動し決済完了した後に起動するWEBブラウザを指定することが可能です。 この値は、javascriptのfunction navigator.userAgentを活用することで取得することができます。 このパラメータは、以下のWEBブラウザーをサポートします。(以下のWEBブラウザ以外が設定されると、ユーザのデフォルトブラウザがトランザクション後に起動されます。) ただし、シークレットモードやプライベートブラウズの場合、正しくリダイレクトできません。
また、このパラメータを指定しない場合にもユーザのデフォルトブラウザがトランザクション後に起動されます。 |
| isAuthorization | boolean デフォルトではfalseになります。先にユーザーの残高から決済金額をブロックして、後からキャプチャ(決済)する場合はtrueを設定してください。 |
| authorizationExpiry | integer <EpochTime> (AuthorizationExpiry) エポックタイムスタンプ(秒単位)。有効期限は、加盟店ごとに許可されている有効期間の範囲内で設定してください。 注: PAY_LATER_CCによるオーソリの場合の有効期間は、 ユーザーがPayPay(クレジット)をキャンセルしたなどの特別な状況下で短縮される可能性があります。 このような場合、PayPayはWebhook通知により、 加盟店のオーソリ期間が切れる前に有効期間の更新(短縮)を事前に加盟店に通知します (「トランザクションイベント > AUTHORIZED | Create a payment authorization 」セクションを参照)。 キャプチャーの失敗を避けるために、加盟店はこのようなイベントを受信した後、適切な処理を実装することをお勧めします。 |
| ipAddress |
{- "merchantPaymentId": "string",
- "amount": {
- "amount": 0,
- "currency": "JPY"
}, - "orderDescription": "string",
- "orderItems": [
- {
- "name": "string",
- "category": "string",
- "quantity": 1,
- "productId": "string",
- "unitPrice": {
- "amount": 0,
- "currency": "JPY"
}
}
], - "codeType": "string",
- "storeInfo": "string",
- "storeId": "string",
- "productType": "string",
- "terminalId": "string",
- "requestedAt": 1704112496,
- "redirectUrl": "string",
- "redirectType": "WEB_LINK",
- "userAgent": "string",
- "isAuthorization": true,
- "authorizationExpiry": 0,
- "ipAddress": "172.217.22.14"
}{- "resultInfo": {
- "code": "string",
- "message": "string",
- "codeId": "string"
}, - "data": {
- "codeId": "string",
- "url": "string",
- "deeplink": "string",
- "expiryDate": 0,
- "merchantPaymentId": "string",
- "amount": {
- "amount": 0,
- "currency": "JPY"
}, - "orderDescription": "string",
- "orderItems": [
- {
- "name": "string",
- "category": "string",
- "quantity": 1,
- "productId": "string",
- "unit_price": {
- "amount": 0,
- "currency": "JPY"
}
}
], - "codeType": "string",
- "storeInfo": "string",
- "storeId": "string",
- "productType": "string",
- "terminalId": "string",
- "requestedAt": 1704112496,
- "redirectUrl": "string",
- "redirectType": "WEB_LINK",
- "isAuthorization": true,
- "authorizationExpiry": 0
}
}決済の詳細を取得します。
Timeout: 15s
| merchantPaymentId required | string (MerchantPaymentIdSimple) <= 64 characters 加盟店発番のトランザクション毎に一意に特定できるトランザクションID |
{- "resultInfo": {
- "code": "string",
- "message": "string",
- "codeId": "string"
}, - "data": {
- "paymentId": "string",
- "status": "CREATED",
- "acceptedAt": 0,
- "refunds": {
- "data": [
- {
- "status": "CREATED",
- "acceptedAt": 0,
- "merchantRefundId": "string",
- "paymentId": "string",
- "amount": {
- "amount": 0,
- "currency": "JPY"
}, - "requestedAt": 1704112496,
- "reason": "string"
}
]
}, - "captures": {
- "data": [
- {
- "acceptedAt": 0,
- "merchantCaptureId": "string",
- "amount": {
- "amount": 0,
- "currency": "JPY"
}, - "orderDescription": "string",
- "requestedAt": 1704112496,
- "expiresAt": 0,
- "status": "USER_REQUESTED"
}
]
}, - "revert": {
- "acceptedAt": 0,
- "merchantRevertId": "string",
- "requestedAt": 1704112496,
- "reason": "string"
}, - "merchantPaymentId": "string",
- "amount": {
- "amount": 0,
- "currency": "JPY"
}, - "requestedAt": 1704112496,
- "expiresAt": 0,
- "canceledAt": 0,
- "storeId": "string",
- "terminalId": "string",
- "orderReceiptNumber": "string",
- "orderDescription": "string",
- "orderItems": [
- {
- "name": "string",
- "category": "string",
- "quantity": 1,
- "productId": "string",
- "unitPrice": {
- "amount": 0,
- "currency": "JPY"
}
}
], - "paymentMethods": [
- {
- "amount": {
- "amount": 0,
- "currency": "JPY"
}, - "type": "WALLET",
- "breakdown": {
- "points": [
- {
- "amount": 0,
- "type": "REGULAR"
}
]
}
}
]
}
}このAPIは、支払いのリクエスト中にクライアントが支払いのステータスを判断できない場合に使用します。 例えば、タイムアウトの状態になった場合や、レスポンスに支払いステータスが含まれていない場合などです。
このAPIを呼び出すことで、支払金額がユーザーのアカウントに戻ることを保証します。
Note: キャンセルはデフォルトで決済が発生した翌日の00:14:59 AMまで使用することができます。 翌日の00:15 AM以降の払い戻しはRefund a payment(返金)を使用してください。
orderTypeがREMITTANCEの場合はPayPayがリクエストを受け付けてから25分以内にキャンセルを行うことができます。
またorderTypeがREMITTANCEの場合はRefund a payment(返金)はご利用いただけません。
出荷売上の場合は、ステータスがAUTHORIZEDの場合に使用可能です。
支払いが完了してステータスがCOMPLETEDになるか、期限を過ぎてEXPIREDになると、使用できません。
タイムアウトエラーが発生した場合は、適切な間隔をあけて成功するまでリトライすることを推奨します。
Timeout: 15s
| merchantPaymentId required | string (MerchantPaymentIdSimple) <= 64 characters 加盟店発番のトランザクション毎に一意に特定できるトランザクションID |
{- "resultInfo": {
- "code": "string",
- "message": "string",
- "codeId": "string"
}, - "data": { }
}事前にユーザーの残高からブロックしていた決済金額をキャプチャ(決済)します。 増額キャプチャの場合、ユーザーに承諾を求める通知を送信します。
タイムアウトエラーが発生した場合は、リクエスト毎にmerchantCaptureIdを変え、適切な間隔をあけて成功するまでリトライすることを推奨します。
Timeout: 30s
| merchantPaymentId required | string (MerchantPaymentIdSimple) <= 64 characters 加盟店発番のトランザクション毎に一意に特定できるトランザクションID |
required | object (MoneyAmount) |
| merchantCaptureId required | string (MerchantCaptureId) <= 64 characters 加盟店発番のトランザクション毎にCaptureを一意に特定できるトランザクションID |
| requestedAt required | integer (EpochTime) エポックタイムスタンプ(秒単位) |
| orderDescription required | string <= 255 characters キャプチャの説明 |
{- "merchantPaymentId": "string",
- "amount": {
- "amount": 0,
- "currency": "JPY"
}, - "merchantCaptureId": "string",
- "requestedAt": 1704112496,
- "orderDescription": "string"
}{- "resultInfo": {
- "code": "string",
- "message": "string",
- "codeId": "string"
}, - "data": {
- "paymentId": "string",
- "status": "COMPLETED",
- "acceptedAt": 1704112496,
- "refunds": {
- "data": [
- {
- "status": "CREATED",
- "acceptedAt": 0,
- "merchantRefundId": "string",
- "paymentId": "string",
- "amount": {
- "amount": 0,
- "currency": "JPY"
}, - "requestedAt": 1704112496,
- "reason": "string"
}
]
}, - "captures": {
- "data": [
- {
- "acceptedAt": 0,
- "merchantCaptureId": "string",
- "amount": {
- "amount": 0,
- "currency": "JPY"
}, - "orderDescription": "string",
- "requestedAt": 1704112496,
- "status": "COMPLETED"
}
]
}, - "merchantPaymentId": "string",
- "userAuthorizationId": "string",
- "amount": {
- "amount": 0,
- "currency": "JPY"
}, - "requestedAt": 1704112496,
- "expiresAt": 0,
- "storeId": "string",
- "terminalId": "string",
- "orderReceiptNumber": "string",
- "orderDescription": "string",
- "orderItems": [
- {
- "name": "string",
- "category": "string",
- "quantity": 1,
- "productId": "string",
- "unitPrice": {
- "amount": 0,
- "currency": "JPY"
}
}
], - "assumeMerchant": "string",
- "paymentMethods": [
- {
- "amount": {
- "amount": 0,
- "currency": "JPY"
}, - "type": "WALLET",
- "breakdown": {
- "points": [
- {
- "amount": 0,
- "type": "REGULAR"
}
]
}
}
]
}
}このAPIは、ユーザーの残高から決済金額をブロックしている状態をキャンセルする場合に使用します。 例えば、注文のキャンセルが発生した場合等。
Timeout: 30s
Revert Authorized Order Request
| merchantRevertId required | string (MerchantRevertId) <= 64 characters 加盟店発番のトランザクション毎にRevertを一意に特定できるトランザクションID |
| paymentId required | string (PaymentId) <= 64 characters PayPay発番の決済取引ID |
| requestedAt required | integer (EpochTime) エポックタイムスタンプ(秒単位) |
| reason | string (Reason) <= 255 characters オプション |
{- "merchantRevertId": "string",
- "paymentId": "string",
- "requestedAt": 1704112496,
- "reason": "string"
}{- "resultInfo": {
- "code": "string",
- "message": "string",
- "codeId": "string"
}, - "data": {
- "status": "CANCELED",
- "acceptedAt": 1704112496,
- "paymentId": "string",
- "requestedAt": 1704112496,
- "reason": "string"
}
}ユーザーへ返金します。
返金の受付のみを行い、PayPay側の非同期処理にて返金を実施しています。
返金の結果については、Get refund detailsにてご確認下さい。
Timeout: 30s
返金
| merchantRefundId required | string (MerchantRefundId) <= 64 characters 加盟店発番のトランザクション毎に返金を一意に特定できるトランザクションID |
| paymentId required | string (PaymentId) <= 64 characters PayPay発番の決済取引ID |
required | object (MoneyAmount) |
| requestedAt required | integer (EpochTime) エポックタイムスタンプ(秒単位) |
| reason | string (Reason) <= 255 characters オプション |
{- "merchantRefundId": "string",
- "paymentId": "string",
- "amount": {
- "amount": 0,
- "currency": "JPY"
}, - "requestedAt": 1704112496,
- "reason": "string"
}{- "resultInfo": {
- "code": "string",
- "message": "string",
- "codeId": "string"
}, - "data": {
- "status": "CREATED",
- "acceptedAt": 0,
- "merchantRefundId": "string",
- "paymentId": "string",
- "amount": {
- "amount": 0,
- "currency": "JPY"
}, - "requestedAt": 1704112496,
- "reason": "string",
- "assumeMerchant": "string"
}
}返金の詳細を取得します。
複数の異なる paymentId (異なる決済トランザクションのID)に同じ merchantRefundId を使う場合、PayPayでは1つの merchantRefundId に対して複数の返金データが紐付けられます。
PayPayは merchantId と merchantRefundId と paymentId を返金トランザクションの詳細を特定するための固有なキー(idempotency-key)であるものとしています。
Timeout: 15s
| merchantRefundId required | string (MerchantRefundIdSimple) <= 64 characters 加盟店発番のトランザクション毎に返金を一意に特定できるトランザクションID |
| paymentId required | string (PaymentId) <= 64 characters PayPay発番の決済取引ID |
{- "resultInfo": {
- "code": "string",
- "message": "string",
- "codeId": "string"
}, - "data": {
- "status": "CREATED",
- "acceptedAt": 0,
- "merchantRefundId": "string",
- "paymentId": "string",
- "amount": {
- "amount": 0,
- "currency": "JPY"
}, - "requestedAt": 1704112496,
- "reason": "string"
}
}ユーザーがPayPayアプリからの通知を許可している場合、以下の内容の通知がユーザーへ配信されます。
| イベント | カテゴリ | メッセージ(例) |
|---|---|---|
| PayPay画面での決済処理 | Push通知 | 〇〇が注文を受け付けました。 注文が完了しなかった場合、YYYY/MM/DD hh:mmに返戻されます。 金額: ¥1,000 取引番号: xxxxxxxxxxxxxxxxxxxx |
| Update a payment authorization:API | Push通知 | 〇〇が支払い依頼金額を変更しました 注文が完了しなかった場合、YYYY/MM/DD hh:mmに返金されます 変更後の金額: ¥1,000 取引番号: xxxxxxxxxxxxxxxxxxxx |
| Capture a payment authorization:API | Push通知 | 〇〇への支払いが完了しました。 金額: ¥1,000 取引番号: xxxxxxxxxxxxxxxxxxxx |
| Revert a payment authorization:API | Push通知 | 支払い受付が〇〇によって取り消されました。 金額: ¥1,000 取引番号: xxxxxxxxxxxxxxxxxxxx |
| 増額の承認要求 | Push通知 | 〇〇から追加の支払いリクエストが届きました。 確認のうえお手続きください。 追加支払い金額: ¥1,000 取引番号: xxxxxxxxxxxxxxxxxxxx |
| 増額の承認要求 | アクションバー | 〇〇から追加の支払いリクエストが届きました |
| 残高ブロックの有効期限を超過 | Push通知 | 支払い受付が取り消されました。 金額: ¥1,000 取引番号: xxxxxxxxxxxxxxxxxxxx |
| Refund a payment:API | Push通知 | 〇〇から返金が行われました。 金額: ¥1,000 取引番号: xxxxxxxxxxxxxxxxxxxx |
| イベント | カテゴリ | メッセージ(例) |
|---|---|---|
| PayPay画面での決済処理(成功) | Push通知 | 取引が完了しました。 金額:100円 取引番号:xxxxxxxxxxxxxxxxxxxx 店舗名:テスト加盟店 |
| PayPay画面での決済処理(失敗) | Push通知 | 取引が失敗しました。 金額:100円 取引番号:xxxxxxxxxxxxxxxxxxxx 店舗名:テスト加盟店 |
| Refund a payment:API | Push通知 | 取引番号: xxxxxxxxxxxxxxxxxxxx 1,000円の返金が完了しました。 |
イベント毎の基本的なステータスの遷移と、WEBHOOK通知については下記の通りとなります。
| 実施処理 | 実施前 | 実施後 | WEBHOOK通知 |
|---|---|---|---|
| Create a Code:API | - | CREATED | 無し |
| PayPay画面での決済処理 | CREATED | AUTHORIZED | AUTHORIZED |
| Update a payment authorization:API | AUTHORIZED | AUTHORIZED | AUTHORIZED |
| Capture a payment authorization:API | AUTHORIZED | COMPLETED | COMPLETED |
| 残高ブロックの有効期限を超過 | AUTHORIZED | EXPIRED | EXPIRED |
| Revert a payment authorization:API | AUTHORIZED | CANCELED | CANCELED |
| Cancel a payment:API | AUTHORIZED | FAILED | 無し |
| Refund a payment:API | COMPLETED | REFUNDED | 無し |
| 実施処理 | 実施前 | 実施後 | WEBHOOK通知 |
|---|---|---|---|
| Create a Code:API | - | CREATED | 無し |
| PayPay画面での決済処理 | CREATED | COMPLETED | COMPLETED |
| Refund a payment:API | COMPLETED | REFUNDED | 無し |
| Cancel a payment:API | COMPLETED | FAILED | 無し |
PayPayは、アカウントでイベントが発生したときにアプリケーションに通知するWebhookを送信します。
通知を受信するためには、POSTメソッドを使用してクライアントにデータを送信するWebhook URLを設定する必要があります。
すべての通知データには、どのイベントが発生したかを判断するためにクライアントサービスで使用できるnotification_typeフィールドがあります。
Webhook処理が正常に終了した場合、200 OK のHTTPステータスコードを返してください。
レスポンスボディは必須ではないですが、"OK"など、簡単な文字列を返していただくことを推奨します。
セキュリティ上の問題から、通知受信において、クライアントによるPayPay IPアドレスのホワイトリスト登録を強く推奨します。
現在Webhookに送信されている通知について、以下もご一読ください。
この通知は、オーダーステータスがCOMPLETEDに変わった際に送信されます。
{
"notification_type": "Transaction",
"merchant_id": "123456789",
"store_id": "123456",
"pos_id": "123",
"order_id": "123456789123456",
"merchant_order_id": "A12345",
"authorized_at": "2020-03-13T13:35:30Z",
"expires_at": "2020-04-13T13:35:29Z",
"paid_at": "2020-04-13T13:35:29Z",
"order_amount": "12345",
"state": "COMPLETED"
}
この通知は、オーダーステータスがCANCELEDに変わった際に送信されます。
{
"notification_type": "Transaction",
"merchant_id": "123456789",
"store_id": "123456",
"pos_id": "123",
"order_id": "123456789123456",
"merchant_order_id": "A12345",
"authorized_at": "2020-03-13T13:35:30Z",
"expires_at": "2020-04-13T13:35:29Z",
"paid_at": null,
"order_amount": "12345",
"state": "CANCELED"
}
この通知は、オーダーステータスがEXPIREDに変わった際に送信されます。
{
"notification_type": "Transaction",
"merchant_id": "123456789",
"store_id": "123456",
"pos_id": "123",
"order_id": "123456789123456",
"merchant_order_id": "A12345",
"authorized_at": "2020-03-13T13:35:30Z",
"expires_at": "2020-04-13T13:35:29Z",
"paid_at": null,
"order_amount": "12345",
"state": "EXPIRED"
}
この通知は、ユーザーへの増額の承認要求が期限切れとなった際に送信されます。 増額の承認要求は、リクエストから6時間後に期限切れになります。
{
"notification_type": "Transaction",
"merchant_id": "123456789",
"store_id": "123456",
"pos_id": "123",
"order_id": "123456789123456",
"merchant_order_id": "A12345",
"authorized_at": "2020-03-13T13:35:30Z",
"expires_at": "2020-04-13T13:35:29Z",
"confirmation_expires_at": "2020-04-13T13:35:29Z",
"order_amount": "12345",
"reauth_request_id": "123456789",
"state": "AUTHORIZED"
}
この通知は、残高ブロックなしかつオーダーステータスがFAILEDに変わった際に送信されます。 エラーの種類によっては通知されない場合があります。
{
"notification_type": "Transaction",
"merchant_id": "123456789",
"store_id": "123456",
"pos_id": "123",
"order_id": "123456789123456",
"merchant_order_id": "A12345",
"order_amount": "12345",
"state": "FAILED"
}
| Category | Description | Note |
|---|---|---|
| ファイル連携方法 | Webhook | |
| ファイル名 | preauth_transaction_<merchant_id>_<from>_<to>_v2.csv | |
| ファイル作成単位 | 加盟店(merchant_id)単位 | |
| 実行サイクル (JST) | 日次処理 | PayPay側の取引日時が作成対象日の 00:00:00 – 23:59:59 の範囲 |
| 通知時間 (JST) | 毎日 1:30 から 10:00 の間 | |
| フォーマット | CSV | |
| ファイル取得可能期間 | 2時間程度 | |
| ファイル保持期間 | 1週間 | 加盟店障害などにより突合ファイルを取得できなかった場合に、PayPay側でwebhookを再送可能な期間となります。 再通知をご希望の際はお問い合わせください。 |
| 文字コード(ファイル本文) | Shift_JIS | |
| 文字コード(ファイル名) | UTF-8 | |
| 改行コード | CRLF |
| Category | Description | Note |
|---|---|---|
| ファイル連携方法 | Webhook | |
| ファイル名 | transaction_<merchant_id>_<from>_<to>_v2.csv | |
| ファイル作成単位 | 加盟店(merchant_id)単位 | |
| 実行サイクル (JST) | 日次処理 | PayPay側の取引日時が作成対象日の 00:00:00 – 23:59:59 の範囲 |
| 通知時間 (JST) | 毎日 1:30 から 10:00 の間 | |
| フォーマット | CSV | |
| ファイル取得可能期間 | 2時間程度 | |
| ファイル保持期間 | 1週間 | 加盟店障害などにより突合ファイルを取得できなかった場合に、PayPay側でwebhookを再送可能な期間となります。 再通知をご希望の際はお問い合わせください。 |
| 文字コード(ファイル本文) | Shift_JIS | |
| 文字コード(ファイル名) | UTF-8 | |
| 改行コード | CRLF |
| 項目名 | 取得元 | 備考 |
|---|---|---|
| orderId | paymentId | PayPayで採番された決済番号 |
| merchantId | merchant_id | PayPayで採番された加盟店識別子 |
| brandName | brandName | PayPayで管理しているブランド名 |
| storeId | storeId | リクエスト時にセットされたstoreId |
| storeName | storeName | PayPayで管理している店舗名 |
| terminalId | terminalId | リクエスト時にセットされたterminalId |
| transactionStatus | "AUTHORIZED" , "CANCELED" , "COMPLETED" , "EXPIRED", "FAILED", "REFUNDED" | PayPayで管理している取引データのステータス |
| acceptedAt | 下の別表に記載 | |
| amount | amount | 絶対値表記のみ |
| orderReceiptNumber | "" | 当機能では設定不可 |
| methodOfPayment | "wallet", "pay_later_cc", "point", "gift_voucher" | カンマ区切りの支払い方法。 |
| merchantPaymentId | 下の別表に記載 | 加盟店で採番された決済番号 |
| paymentDetails | [{"paymentMethod":"POINT", "amount":80, "breakdown":[{"type":"REGULAR", "amount":80}]}, {"paymentMethod":"WALLET", "amount":400}] | 支払い方法ごとの支払い金額です。 transactionStatusがCOMPLETEDとREFUNDEDの場合のみ提供されます。 |
merchantPaymentId、acceptedAtは、transactionStatus毎に値の取得元が変わるため、下記に記載します。
| transactionStatus | merchantPaymentId | acceptedAt |
|---|---|---|
| AUTHORIZED | merchantPaymentId | Create a payment authorization request: acceptedAt Update a payment authorization: acceptedAt Get payment details response: acceptedAt |
| CANCELED | merchantRevertId | Revert a payment authorization request: acceptedAt Get payment details response: revert.data.[].acceptedAt |
| COMPLETED | merchantCaptureId | Capture a payment authorization response: acceptedAt Get payment details response: captures.data.[].acceptedAt |
| EXPIRED | merchantPaymentId | Get payment details response: expiresAt |
| FAILED | merchantPaymentId | Get payment details response: failedAt |
| REFUNDED | merchantRefundId | Refund a payment response: acceptedAt Get payment details response: refunds.data.[].acceptedAt |
| 項目名 | 取得元 | 備考 |
|---|---|---|
| 決済番号 | paymentId | PayPayで採番された決済番号 |
| 加盟店ID | merchant_id | PayPayで採番された加盟店識別子 |
| 屋号 | brandName | PayPayで管理しているブランド名 |
| 店舗ID | storeId | リクエスト時にセットされたstoreId |
| 店舗名 | storeName | PayPayで管理している店舗名 |
| 端末番号/PosID | terminalId | リクエスト時にセットされたterminalId |
| 取引ステータス | "取引完了" , "取引失敗" , "返金完了" , "返金失敗" | PayPayで管理している取引データのステータス |
| 取引日時 | acceptedAt | |
| 取引金額 | amount | 返金の場合はマイナス記号あり |
| レシート番号 | "" | 当機能では設定不可 |
| 支払い方法 | "PayPay残高", "クレジットカード", "あと払い", "PayPayポイント", "PayPay商品券" | カンマ区切りの支払い方法。 |
| マーチャント決済ID | merchantPaymentId | 加盟店で採番された決済番号 |
| 支払い詳細 | [{"paymentMethod":"PayPayポイント", "amount":5, "breakdown":[{"type":"REGULAR", "amount":5}]}, {"paymentMethod":"PayPay残高", "amount":5}] | 支払い方法ごとの支払い金額です。 |
Webhookで通知されたpathからファイルを取得してください。
{
"notification_type":"file.created",
"notification_id": "<UUID>",
"fileType":"transaction_recon",
"path":"https://<server_path>/<filename>?parameters",
"requestedAt":"<epoch time>"
}
最新のFAQについてはこちらをご参照ください。
| ドキュメント更新日 | リリース日 | 種別 | セクション | 変更箇所 |
|---|---|---|---|---|
| 2022.08.23 | 2022.12.05 | Feature | Update a payment authorization | 1. エラーコードからHIGHER_AMOUNT_REAUTH_NOT_SUPPORTEDを削除しました。 2. 増額ReAuthorize処理と減額ReAuthorize処理のシーケンスフロー図を追加しました。 3. 増額ReAuthorizeリクエスト用にredirectUrl, redirectType, userAgentプロパティを追加しました。4. 増額ReAuthorizeリクエスト時のレスポンスコード:201を追加しました。 |
| 2022.09.10 | 2022.12.05 | Feature | Update a payment authorization | 1. USER_CONFIRMATION_REQUIREDのコードを08300104に変更しました。2. Update a payment authorization APIのUSER_CONFIRMATION_REQUIREDレスポンスからqrCodeId, deeplinkを削除しました。3. USER_CONFIRMATION_REQUIREDレスポンスから加盟店のリクエスト情報を削除しました。 |
| 2022.09.21 | 2022.12.05 | Feature | Update a payment authorization | 1. redirectTypeを「APP_DEEPLINK」から「APP_DEEP_LINK」に変更しました。 |
| 2022.10.27 | Released | Documentation Fix | Get payment details | 1. acceptedAtのDescriptionを変更しました。 |
| 2022.11.04 | 2022.12.05 | Feature | Update a payment authorization | 1. acceptedAtを200 OKレスポンスに追加 |
| 2023.03.10 | TBD | Documentation Fix | Update status code description | ORDER_NOT_REVERSIBLE ステータスコードの説明を更新 |
| 2023.03.24 | Released | Documentation Fix | 認証オブジェクトに必要なパラメータ | Request URIの説明を修正しました。 |
| 2023.03.30 | Released | Documentation Fix | 突合ファイル連携仕様 | 通知時間の説明を修正しました。 |
| 2023.04.03 | 2023.06.06 | Feature | Create a code | リクエストパラメータとレスポンスパラメータ productType を追加しました。 |
| 2023.04.13 | Released | Documentation Fix | 突合ファイル | 取引ステータス:"取引失敗"、transactionStatus: "FAILED"の場合、エラー原因によっては、突合ファイルに出力されない場合があることを追加しました。 |
| 2023.04.26 | 2023.06.12 | Feature | Get payment details, Update a payment authorization | レスポンスに paymentMethods を追加しました。 |
| 2023.06.16 | Released | Documentation Fix | Refund a payment | Refund a paymentの説明を変更しました。 |
| 2023.07.04 | Released | Documentation Fix | Create a Code, Get payment details, Capture a payment authorization | metadataの説明を変更しました。 |
| 2023.09.21 | Released | Documentation Fix | Update a payment authorization, Revert a payment authorization | RESOURCE_NOT_FOUNDコードを追加しました。 |
| 2023.11.15 | 2023.11.15 | Feature | Recon file | MethodOfPayment に支払いタイプ「POINT」/「PayPayポイント」を追加し、新しい列「paymentDetails」を追加しました。 |
| 2023.11.28 | TBD | Documentation Fix | Update status code description | ORDER_NOT_REVERSIBLE の説明を追記しました。 |
| 2023.12.19 | TBD | Feature | Get Refund details | リクエストのクエリパラメータ paymentId を追加し、説明を更新しました。 |
| 2024.02.20 | Released | Documentation Fix | Get payment Details, Create a Code APIs and Error Handling section | Get payment Details、Create a CodeのexpiryDateフィールドの説明を更新し、Get payment details APIのDYNAMIC_QR_PAYMENT_NOT_FOUNDエラーの説明を更新しました。 |
| 2024.03.12 | Released | Documentation Fix | Create a Code, Get payment details, Capture a payment authorization | metadataは廃止であることを追加しました。 |
| 2024.04.02 | TBD | Documentation Fix | Create a Code | Create a CodeのredirectUrl、redirectTypeの説明を変更しました。 |
| 2024.05.27 | Released | Documentation Fix | Create a Code | userAgentの説明を変更しました。 |
| 2024.06.14 | TBD | Feature | Get payment details | data.paymentMethods.typeにHIVEXを返却し得る値として追加しました。 |
| 2024.08.19 | 2024.08.19 | Feature | Cancel a payment. Error Handling | OrderTypeがREMITTANCEの場合のCancel a paymentの受付時間について説明を追加しました。 |
| 2024.09.05 | 2024.09.05 | Feature | Recon file | 取引明細ファイル(突合ファイル)に paymentDetails が記載される条件を追加しました。 |
| 2024.09.05 | TBD | Feature | Get payment details, Capture a payment authorization | レスポンスの paymentMethods 以下にフィールド breakdown を追加しました。 |
| 2024.09.05 | TBD | Feature | Recon file | breakdown を paymentDetails に追加しました。 |
| 2024.10.28 | Released | Documentation Fix | 突合ファイル連携仕様 | 突合ファイルのファイル名を更新しました。 |
| 2025.03.04 | TBD | Feature | Create a Code, Get payment details, Capture a payment authorization | metadataを削除しました。 |
| 2025.06.23 | TBD | Feature | Get payment details, Recon file | 利用可能な支払い方法にPayPay商品券を追加しました |
| 2025.07.22 | 2025.07.22 | Documentation Fix | Get refund details | Get refund detailsの説明を変更しました。 |