動的ユーザスキャン (1.1)

はじめに

PayPay Open Payment API(OPA)は、様々なシナリオに対応した決済関連操作が設計されており、ユーザーへ快適な決済体験を提供します。 PayPay OPAクライアントとして登録されている場合、決済パートナーは下記の機能が使用可能になります。

  • PayPayユーザーのウォレットから直接支払い金額を引き落とし、決済を完了させる
  • 動的なQRコードを作成し、PayPayアプリで決済を完了させる
  • スムーズな決済を行うため事前にユーザーの認可を取得し、決済フローを確立する
  • PayPayキャッシャーページとWebアプリケーションを統合し、決済を完了させる
  • PayPay OPAが提供する様々なAPIを使用し、独自の決済エクスペリエンスの構築

本書では、PayPay決済パートナー向けに設計したDynamic QR Code APIに焦点を当てます。

TLSの実装

PayPay Open Payment APIでは、セキュリティ対策としてTLS 1.2以上の使用が必須となっております。TLS1.0およびTLS1.1では接続できませんのでご注意ください。

Dynamic QR Code のフロー

このフローでは、加盟店がユーザーに提示するQRコードを作成します。 その後、ユーザーはPayPayアプリを用いてQRコードをスキャンし、支払を行います。 加盟店は、APIで支払ステータスの照会や、通知機能を利用し注文の処理を行うことが可能です。 ポーリング間隔は、2〜3秒程度として下さい。

フローの詳細はこちらを参照してください。

加盟店を登録する

PayPay OPAの利用を開始するには、事前に定められたプロセスに従ってPayPay加盟店の登録を行なってください。 このプロセスは 情報収集、手動検証、契約確認、およびクレデンシャル情報の発行から構成されます。 PayPayの加盟店として登録された後、以下の項目が設定されます。

  • api key と apiKeySecret
  • webhookの通知先となるエンドポイント
  • クライアントIPのホワイトリスト
  • 加盟店識別子(エージェントクライアントの場合)

これらの設定を管理するには、マーチャントパネルを使用するか、弊社営業担当までご連絡ください。

ユーザーからのPayPayアプリ、PayPayWeb画面への日本国外からのアクセスは制限されています。詳細については個別にご相談ください。

API認証

本ドキュメントに記載されているAPIは、HMAC方式での認証が必要です。 HMAC方式での認証の実装においては、認証オブジェクト生成に対してすべてのリクエストを考慮します。

認証オブジェクトに必要なパラメータ

Value Description Example
API Key PayPayから発行されたAPI Key APIKeyGenerated
API Key secret PayPayから発行されたAPI Key secret APIKeySecretGenerated
Request URI リクエストURL path /v2/codes
Request method HTTPメソッド POST
Epoch 現在のエポックタイムスタンプ(秒単位),
Note : サーバー時刻との差が2分未満である必要があります。
1579843452
Nonce ランダムに生成された文字列。
Note : 任意の文字列、length 8を推奨。
acd028
Request body リクエストで渡されるbody。

{"sampleRequestBodyKey1":"sampleRequestBodyValue1","sampleRequestBodyKey2":"sampleRequestBodyValue2"}

Request content type リクエストヘッダーで渡されるコンテンツタイプ。 application/json;charset=UTF-8;
hash (MD5(Request body, Request content type)) リクエストの本文とコンテンツタイプのハッシュ。以下に記載されているStep1で生成されます。 1j0FnY4flNp5CtIKa7x9MQ==

これらから生成されるサンプルHMAC Authヘッダーは以下の通りです。

hmac OPA-Auth:APIKeyGenerated:NW1jKIMnzR7tEhMWtcJcaef+nFVBt7jjAGcVuxHhchc=:acd028:1579843452:1j0FnY4flNp5CtIKa7x9MQ==

HMAC authヘッダーの生成ステップ

Step 1: MD5アルゴリズムを使用してbodyとcontent-typeをハッシュ化する

サンプルコード

private String requestBody;
private String contentType;

MessageDigest md = MessageDigest.getInstance("MD5");
md.update(contentType.getBytes(StandardCharsets.UTF_8));
md.update(requestBody.getBytes(StandardCharsets.UTF_8));
String hash = new String(
          Base64.getEncoder().encode(md.digest()),
          StandardCharsets.UTF_8);

Note : HTTP GETメソッドの場合など、リクエストの本文がない場合、MD5を生成する必要はありません。代わりに、hashには"empty"がセットされます。

Step 2: HMAC-SHA256でハッシュ化される文字列を生成します。

リクエストの署名には、以下のパラメータが必要です。

private String requestUrl; //Only the request URI Example: "/v2/codes/payments/dynamic-qr-test-00002"
private String httpMethod;
private String nonce; //Random string
private String epoch;
private String contentType;
private String hash; //Output of step 1
private static final String DELIMITER = "\n";

byte[] hmacData = new StringBuilder()
                    .append(requestUrl)
                    .append(DELIMITER)
                    .append(httpMethod)
                    .append(DELIMITER)
                    .append(nonce)
                    .append(DELIMITER)
                    .append(epoch)
                    .append(DELIMITER)
                    .append(contentType)
                    .append(DELIMITER)
                    .append(hash != null ? hash : "")
                    .toString()
                    .getBytes(StandardCharsets.UTF_8);

Note : HTTP GETメソッドの場合など、リクエストの本文がない場合、content-typeおよびhashには"empty"がセットされます。

Step 3 : Step2で生成された値と、Key secretを使用してHMACオブジェクトを生成します。

public final String toBase64HmacString() {
    private String apiKeySecret;
    private byte[] dataToSign; //Output from step 2
    try {
      SecretKeySpec signingKey = new SecretKeySpec(apiKeySecret.getBytes(StandardCharsets.UTF_8),
          "HmacSHA256");
      Mac sha256HMAC = Mac.getInstance("HmacSHA256");
      sha256HMAC.init(signingKey);
      byte[] rawHmac = sha256HMAC.doFinal(dataToSign);
      return java.util.Base64.getEncoder().encodeToString(rawHmac);
    } catch (GeneralSecurityException e) {
      LOGGER.error("Unexpected error while creating hash: " + e.getMessage());
      throw new IllegalArgumentException(e);
    }
  }

Step 4 : ヘッダーオブジェクトを生成します。

String authHeader = "hmac OPA-Auth:" + api-key +
":" + macData + ":" + nonce + ":" + epoch + ":" + hash;

Note: macDataはStep3で生成された値を使用してください。また、nonceとepochは、Step2で使用した値を渡す必要があります。

HTTP GETメソッドの場合などリクエストの本文がない場合、hash値は"empty"となるため、ヘッダーオブジェクトは下記の通りとなります。

String authHeader = "hmac OPA-Auth:" + api-key +
":" + macData + ":" + nonce + ":" + epoch + ":empty";

authHeaderの値を、HttpHeader.AUTHORIZATIONにセットして渡してください。
PayPay側で渡ってきたデータをデコードし、SHA256( "key"、requestParams)を再作成します。 再作成したmacDataとヘッダーで渡ってきた値が一致しているかを検証します。

リクエスト時に加盟店(ブランド)を指定する

APIのリクエスト時に加盟店識別子をセットする必要があります。 加盟店識別子をセットするには2つの方法があります。

クエリの中にセットする:

?assumeMerchant={MerchantId}

HTTPヘッダにセットする:

X-ASSUME-MERCHANT: {MerchantId}

両方を指定した場合、クエリにセットしたパラメーターが優先されます。

エラー処理

PayPay OPAはhttpレスポンスステータスコードとOPAエラーコードを用いてリクエストの成功または失敗を返却します。 これらの情報を使用して、どのようなエラー対応をするべきかを判断できます。 PayPay OPAは以下のhttpレスポンスステータスコードを返します。

レスポンスコード一覧

各API共通レスポンスコード

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 メンテナンス中です。

Create a QRCode

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 リクエストヘッダー、クエリパラメータ、またはリクエストボディが不正です。

Delete a QRCode

Status Code Description
400 DYNAMIC_QR_BAD_REQUEST リクエストヘッダー、クエリパラメータ、またはリクエストボディが不正です。
404 DYNAMIC_QR_NOT_FOUND 該当のQR codeが見つかりません。

Get payment details

Status Code Description
400 DYNAMIC_QR_PAYMENT_NOT_FOUND 指定された取引が見つかりません。このエラーは、QRコードが利用できなくなる、または指定されたmerchantPaymentIdで支払いが見つからない場合に返されます。このQRコードを用いて支払いがなされることはないため、支払いを再度試みる場合、加盟店は「Create a QRCode」APIを使用して別のDynamic QRコードを作成し直してください。
400 DYNAMIC_QR_BAD_REQUEST リクエストヘッダー、クエリパラメータ、またはリクエストボディが不正です。

Cancel a payment

Status Code Description
400 ORDER_NOT_REVERSIBLE 以下の場合にこのコードを返します。
1) 対象オーダーのステータスが REFUNDED, EXPIRED, COMPLETED, CANCELED の場合。ネイティブペイメント(isAuthorizationtrueを指定しないケース)のケースではCOMPLETEDを除く
2) キャンセル期間を過ぎた場合。ネイティブペイメントのケースでは決済翌日00:15を過ぎた場合

Update a payment authorization

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 オーダーが存在しない。

Capture a payment authorization

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 オーダーが見つかりません。

Revert a payment authorization

Status Code Description
400 ORDER_NOT_CANCELABLE Revertできない支払いです。
404 RESOURCE_NOT_FOUND オーダーが見つかりません。

Refund a payment

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 返金可能な期間を超過しています。
401 USER_STATE_IS_NOT_ACTIVE ユーザーが無効な状態です。
403 MERCHANT_MULTIPLE_REFUND_REJECTED 加盟店の複数回返金機能が有効化されていません。
404 NO_SUCH_REFUND_ORDER 対象の返金が存在しません。
404 RESOURCE_NOT_FOUND オーダーが見つかりません。

Get refund details

Status Code Description
404 NO_SUCH_REFUND_ORDER 対象の返金が存在しません。

タイムアウト

推奨されるタイムアウト設定は、各APIで指定されています。 最も重要なのは、支払いタイムアウトAPIで、読み取りタイムアウト値を30秒以上で設定してください。

タイムアウトが発生した場合、不明な支払いステータスとして扱ってください。

ステータスが不明な決済の処理

ステータスが不明な場合、下記のいずれかの方法で対処してください。

  1. 取引のステータスを照会するため、照会APIを使用してください。 PayPayで取引が失敗になっている、または存在しない場合は、元取引と同様のリクエストを再度行なってください。

  2. キャンセルAPIを使用してください。 キャンセルAPIが提供されている場合は、取引をキャンセルすることもできます。 キャンセルが承認された後、元取引と同様のリクエストを再度行なってください。

決済

決済に関して

Create a QRCode

動的なQRコードを作成し、ユーザーから支払を受けます。作成したQRコードの有効期限は「expiryDate」に設定されます。
merchantPaymentIdは、加盟店側で一意になるように管理して下さい。

Timeout: 30s

Request Body schema: application/json

QRCode

merchantPaymentId
required
string (MerchantPaymentId) <= 64 characters

加盟店発番のトランザクション毎に一意に特定できるトランザクションID
同じmerchantPaymentIdを指定した場合は、前回の結果が返却されます。

required
object (MoneyAmount)
orderDescription
string <= 255 characters
Array of objects (MerchantOrderItem)
metadata
object

このパラメータは廃止となりました。
下位互換性のために項目が残されていますが、将来のリリースでは削除される予定です。

codeType
required
string
Value: "ORDER_QR"
storeInfo
string <= 255 characters

加盟店の店舗情報

storeId
string <= 255 characters

加盟店に紐付く店舗ID

productType
string (ProductType) <= 255 characters

PayPayシステムのプロダクトタイプ。 特定の加盟店以外はこのパラメータはオプションです。 特定のプロダクトタイプのみを使用するよう制限されている一部の加盟店の場合、プロダクトタイプを適切に設定する必要があります。
例:VIRTUAL_BONUS_INVESTMENT, PAY_LATER_REPAYMENT, REAL_INVESTMENT

terminalId
string <= 255 characters

店舗に紐付く端末ID

requestedAt
integer (EpochTime)

エポックタイムスタンプ(秒単位)

isAuthorization
boolean

デフォルトではfalseになります。先にユーザーの残高から決済金額をブロックして、後からキャプチャ(決済)する場合はtrueを設定してください。

authorizationExpiry
integer <EpochTime> (AuthorizationExpiry)

エポックタイムスタンプ(秒単位)。有効期限は、加盟店ごとに許可されている有効期間の範囲内で設定してください。

注: PAY_LATER_CCによるオーソリの場合の有効期間は、 ユーザーがPayPay(クレジット)をキャンセルしたなどの特別な状況下で短縮される可能性があります。 このような場合、PayPayはWebhook通知により、 加盟店のオーソリ期間が切れる前に有効期間の更新(短縮)を事前に加盟店に通知します (「トランザクションイベント > AUTHORIZED | Create a payment authorization 」セクションを参照)。 キャプチャーの失敗を避けるために、加盟店はこのようなイベントを受信した後、適切な処理を実装することをお勧めします。

Responses

Request samples

Content type
application/json
{
  • "merchantPaymentId": "string",
  • "amount": {
    },
  • "orderDescription": "string",
  • "orderItems": [
    ],
  • "metadata": { },
  • "codeType": "ORDER_QR",
  • "storeInfo": "string",
  • "storeId": "string",
  • "productType": "string",
  • "terminalId": "string",
  • "requestedAt": 0,
  • "isAuthorization": true,
  • "authorizationExpiry": 0
}

Response samples

Content type
application/json
{
  • "resultInfo": {
    },
  • "data": {
    }
}

Delete a QRCode

作成したQRコードを削除します。

Timeout: 15s

Responses

Response samples

Content type
application/json
{
  • "resultInfo": {
    },
  • "data": {
    }
}

Get payment details

決済の詳細を取得します。

Timeout: 15s

path Parameters
merchantPaymentId
required
string (schemas-MerchantPaymentId) <= 64 characters

加盟店発番のトランザクション毎に一意に特定できるトランザクションID

Responses

Response samples

Content type
application/json
{
  • "resultInfo": {
    },
  • "data": {
    }
}

Cancel a payment

このAPIは、支払いのリクエスト中にクライアントが支払いのステータスを判断できない場合に使用します。 例えば、タイムアウトの状態になった場合や、レスポンスに支払いステータスが含まれていない場合などです。

このAPIを呼び出すことで、支払金額がユーザーのアカウントに戻ることを保証します。


Note: キャンセルは決済が発生した翌日の00:14:59 AMまで使用することができます。
翌日の00:15 AM以降の払い戻しはRefund a payment(返金)を使用してください。
ステータスがAUTHORIZEDの場合は、いつでも使用できます。
支払いが完了してステータスがCOMPLETEDになるか、期限を過ぎてEXPIREDになると、使用できません。

Timeout: 15s

path Parameters
merchantPaymentId
required
string (MerchantPaymentIdSimple) <= 64 characters

加盟店発番のトランザクション毎に一意に特定できるトランザクションID

Responses

Response samples

Content type
application/json
{
  • "resultInfo": {
    },
  • "data": { }
}

Update a payment authorization

このAPIは事前にユーザーの残高からブロックしていた決済金額を同じ決済手段で変更するために使用されます。

APIのコール中に、新しい AUTHORIZED イベントWebHookが発動し、トランザクションのステータスは AUTHORIZED のまま保持されます。

減額Reauthorize処理がコールされた場合、正常処理の場合に200を返し処理は完了します。

増額ReAuthorize処理が開始されると、このAPIは201: ユーザーへの再認証要求完了を返します。

突合ファイルの中では、同じオーダーIDのAUTHORIZEDトランザクションが複数存在します。突合ファイルの概要は下記です。

orderId merchantId brandName storeId terminalId transactionStatus acceptedAt amount orderReceiptNumber methodOfPayment merchantPaymentId paymentDetails
xx123456 yy08181 〇〇加盟店 1234567 0 COMPLETED 2020-01-30T10:53:25+09:00 480 000-0001 wallet, point 000-0001 [{"paymentMethod":"POINT", "amount":80}, {"paymentMethod":"wallet", “amount":400}]
xx123456 yy08181 〇〇加盟店 1234567 0 REFUNDED 2020-01-30T16:53:25+09:00 -480 000-0001 wallet refund_000-0001 [{"paymentMethod":"wallet", “amount":-480}]
xx567890 yy08181 〇〇加盟店 1234567 0 AUTHORIZED 2020-01-30T13:31:43+09:00 2924 000-0005 wallet 000-0005 [{"paymentMethod":"wallet", “amount":2924}]
xx567890 yy08181 〇〇加盟店 1234567 0 AUTHORIZED 2020-01-31T13:50:43+09:00 1000 000-0005 wallet 000-0005 [{"paymentMethod":"wallet", “amount":1000}]

タイムアウト: 30秒

Request Body schema: application/json

Reauthorize

requestId
required
string (RequestId) <= 255 characters

加盟店によるReAuthを識別するための一意のID

paymentId
required
string (PaymentId) <= 64 characters

PayPay発番の決済取引ID

required
object (MoneyAmount)
requestedAt
integer (schemas-EpochTime)

Epoch timestamp in seconds

merchantComment
string (MerchantComment) <= 255 characters

ReAuthが必要とされる理由。渡されるとPost Transaction画面に表示される

redirectUrl
string (RedirectUrlRequest)

再認証成功後にPayPayがリダイレクトするUrl。増額ReAuthorizeのリクエストでは必須です。

redirectType
string (RedirectTypeRequest)
Enum: "APP_DEEP_LINK" "WEB_LINK"

再認証成功後のリダイレクトタイプ。増額ReAuthorizeのリクエストでは必須です。

userAgent
string (UserAgentRequest)

ブラウザのユーザーエージェント文字列。増額ReAuthorizeのリクエストでは必須です。

Responses

Request samples

Content type
application/json
{
  • "requestId": "string",
  • "paymentId": "string",
  • "updatedAmount": {
    },
  • "requestedAt": 0,
  • "merchantComment": "string",
  • "redirectUrl": "string",
  • "redirectType": "APP_DEEP_LINK",
  • "userAgent": "string"
}

Response samples

Content type
application/json
{
  • "resultInfo": {
    },
  • "data": {
    }
}

Capture a payment authorization

事前にユーザーの残高からブロックしていた決済金額をキャプチャ(決済)します。
増額キャプチャの場合、ユーザーに承諾を求める通知を送信します。

Timeout: 30s

Request Body schema: application/json
merchantPaymentId
required
string (schemas-MerchantPaymentId) <= 64 characters

加盟店発番のトランザクション毎に一意に特定できるトランザクションID

required
object (MoneyAmount)
merchantCaptureId
required
string (schemas-MerchantCaptureId) <= 64 characters

加盟店発番のトランザクション毎にCaptureを一意に特定できるトランザクションID

requestedAt
required
integer (EpochTime)

エポックタイムスタンプ(秒単位)

orderDescription
required
string <= 255 characters

キャプチャの説明

Responses

Request samples

Content type
application/json
{
  • "merchantPaymentId": "string",
  • "amount": {
    },
  • "merchantCaptureId": "string",
  • "requestedAt": 0,
  • "orderDescription": "string"
}

Response samples

Content type
application/json
{
  • "resultInfo": {
    },
  • "data": {
    }
}

Revert a payment authorization

このAPIは、ユーザーの残高から決済金額をブロックしている状態をキャンセルする場合に使用します。
例えば、注文のキャンセルが発生した場合等。

Timeout: 30s

Request Body schema: application/json

Revert Authorized Order Request

merchantRevertId
required
string (MerchantRevertId) <= 64 characters

加盟店発番のトランザクション毎にRevertを一意に特定できるトランザクションID

paymentId
required
string (schemas-PaymentId) <= 64 characters

PayPay発番の決済トランザクションID

requestedAt
required
integer (EpochTime)

エポックタイムスタンプ(秒単位)

reason
string (schemas-Reason) <= 255 characters

オプション

Responses

Request samples

Content type
application/json
{
  • "merchantRevertId": "string",
  • "paymentId": "string",
  • "requestedAt": 0,
  • "reason": "string"
}

Response samples

Content type
application/json
{
  • "resultInfo": {
    },
  • "data": {
    }
}

Refund a payment

ユーザーへ返金します。
返金の受付のみを行い、PayPay側の非同期処理にて返金を実施しています。
返金の結果については、Get refund detailsにてご確認下さい。

Timeout: 30s

Request Body schema: application/json

返金

merchantRefundId
required
string (MerchantRefundId) <= 64 characters

加盟店発番のトランザクション毎に返金を一意に特定できるトランザクションID
複数回の返金を行う場合は、返金トランザクションごとに一意なmerchantRefundIdを設定。
複数回の返金時に、同じmerchantRefundIdを指定した場合は、前回の結果が返却されます。

paymentId
required
string (PaymentId) <= 64 characters

PayPay発番の決済取引ID

required
object (MoneyAmount)
requestedAt
required
integer (EpochTime)

エポックタイムスタンプ(秒単位)

reason
string <= 255 characters

オプション (最大長は255バイト)

Responses

Request samples

Content type
application/json
{
  • "merchantRefundId": "string",
  • "paymentId": "string",
  • "amount": {
    },
  • "requestedAt": 0,
  • "reason": "string"
}

Response samples

Content type
application/json
{
  • "resultInfo": {
    },
  • "data": {
    }
}

Get refund details

GET Refund Details APIの任意のリクエストクエリパラメータ paymentId: POST Refund APIにおいて、同じ merchantRefundId を複数の異なる paymentId に使う場合のみに渡す必要があります。

複数の異なる paymentId (異なる決済トランザクションのID)に同じ merchantRefundId を使う場合、PayPayでは1つの merchantRefundId に対して複数の返金データが紐付けられます。
PayPayは merchantIdmerchantRefundIdpaymentId を返金トランザクションの詳細を特定するための固有なキー(idempotency-key)であるものとしています。
1つの merchantRefundId に複数の paymentId が紐付けられる場合、merchantRefundId に加えて paymentId をリクエストパラメータに追加することにより固有の返金トランザクションが返されます。本ケースで paymentId を追加しない場合、最新の返金トランザクションが返されます。

Timeout: 15s

path Parameters
merchantRefundId
required
string (MerchantRefundIdSimple) <= 64 characters

加盟店発番のトランザクション毎に返金を一意に特定できるトランザクションID

query Parameters
paymentId
string (PaymentId) <= 64 characters

PayPay発番の決済取引ID

Responses

Response samples

Content type
application/json
{
  • "resultInfo": {
    },
  • "data": {
    }
}

決済判定について

決済APIのGetPaymentDetailsや後述のWebhook(トランザクションイベント)の結果を元に、決済結果を判定ください。

イベント発生時のユーザーへの通知

ユーザーが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 QRCode: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 QRCode:API - CREATED 無し
PayPay画面での決済処理 CREATED COMPLETED COMPLETED
Refund a payment:API COMPLETED REFUNDED 無し
Cancel a payment:API COMPLETED FAILED 無し

Webhookの設定

PayPayは、アカウントでイベントが発生したときにアプリケーションに通知するWebhookを送信します。 通知を受信するためには、POSTメソッドを使用してクライアントにデータを送信するWebhook URLを設定する必要があります。 すべての通知データには、どのイベントが発生したかを判断するためにクライアントサービスで使用できるnotification_typeフィールドがあります。

Webhook処理が正常に終了した場合、200 OK のHTTPステータスコードを返してください。 レスポンスボディは必須ではないですが、"OK"など、簡単な文字列を返していただくことを推奨します。

セキュリティ上の問題から、通知受信において、クライアントによるPayPay IPアドレスのホワイトリスト登録を強く推奨します。

現在Webhookに送信されている通知について、以下もご一読ください。

トランザクションイベント

トランザクションのステータスが変更になった際、Webhookで通知します。

AUTHORIZED | Create a payment authorization

この通知は、以下の2つのケースで発生します。

  1. 支払い承認が正常に作成された場合。
  2. PayLater 側で制御不能な事象が発生し、支払承認の有効期限が予期せず短縮された場合(PAY_LATER_CC のオーソリにのみ適用可能)。

ケース 2 の場合、更新された有効期限がペイロードに含まれます。 マーチャントはこのようなイベントの発生後、キャプチャ失敗を回避するために適切な処理を実装する必要があります。

{
  "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": "AUTHORIZED"
}

AUTHORIZED | Update a payment authorization

この通知は、ReAuthorize処理が成功した際に送信されます。

{
  "notification_type": "Transaction",
  "merchant_id": "123456789",
  "store_id": "123456",
  "pos_id": "123",
  "order_id": "123456789123456",
  "merchant_order_id": "",
  "authorized_at": "2020-03-13T13:35:30Z",
  "expires_at": "2020-04-13T13:35:29Z",
  "paid_at": null,
  "order_amount": 12345,
  "reauth_request_id": "123456789",
  "state": "AUTHORIZED"
}

COMPLETED

この通知は、オーダーステータスが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

この通知は、オーダーステータスが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

この通知は、オーダーステータスが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"
}

EXPIRED_USER_CONFIRMATION

この通知は、ユーザーへの増額の承認要求が期限切れとなった際に送信されます。 増額の承認要求は、リクエストから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

この通知は、残高ブロックなしかつオーダーステータスが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"
}

突合ファイル

PayPayでは取引明細ファイル(突合ファイル)を日次の処理で生成し、Webhookで通知します。
取引ステータス: "取引失敗" 、transactionStatus: "FAILED"の場合、エラー原因によっては、突合ファイルに出力されない場合があります。
突合ファイルに取引データが出力されない例は以下となります。
・ユーザーの利用限度額超過による取引失敗
・1回の決済上限額超過による取引失敗

突合ファイル連携仕様

残高ブロックありの場合

Category Description Note
ファイル連携方法 Webhook
ファイル名 preauth_transaction_<merchant_id>_<from>_<to>.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>.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で管理している取引データのステータス
transactionStatus: "FAILED"の場合、エラー原因によっては、突合ファイルに出力されない場合があります。
突合ファイルに取引データが出力されない例は以下となります。
・ユーザーの利用限度額超過による取引失敗
・1回の決済上限額超過による取引失敗
acceptedAt 下の別表に記載
amount amount 絶対値表記のみ
orderReceiptNumber "" 当機能では設定不可
methodOfPayment "wallet", "pay_later_cc", "point" カンマ区切りの支払い方法。
merchantPaymentId 下の別表に記載 加盟店で採番された決済番号
paymentDetails [{"paymentMethod":"POINT", "amount":80}, {"paymentMethod":"WALLET", “amount":400}] 支払い方法ごとの支払い金額です。

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

Sampleファイルをダウンロード

残高ブロックなしの場合

項目名 取得元 備考
決済番号 paymentId PayPayで採番された決済番号
加盟店ID merchant_id PayPayで採番された加盟店識別子
屋号 brandName PayPayで管理しているブランド名
店舗ID storeId リクエスト時にセットされたstoreId
店舗名 storeName PayPayで管理している店舗名
端末番号/PosID terminalId リクエスト時にセットされたterminalId
取引ステータス ”取引完了” , ”取引失敗” , "返金完了" , "返金失敗" PayPayで管理している取引データのステータス
取引ステータス: "取引失敗" の場合、エラー原因によっては、突合ファイルに出力されない場合があります。
突合ファイルに取引データが出力されない例は以下となります。
・ユーザーの利用限度額超過による取引失敗
・1回の決済上限額超過による取引失敗
取引日時 acceptedAt
取引金額 amount 返金の場合はマイナス記号あり
レシート番号 ”” 当機能では設定不可
支払い方法 "PayPay残高", "クレジットカード", "あと払い", "PayPayポイント" カンマ区切りの支払い方法。
マーチャント決済ID merchantPaymentId 加盟店で採番された決済番号
支払い詳細 [{"paymentMethod":"PayPayポイント", "amount":5}, {"paymentMethod":"PayPay残高", "amount":5}] 支払い方法ごとの支払い金額です。

Sampleファイルをダウンロード

Webhookでの通知

Webhookで通知されたpathからファイルを取得してください。

{
  "notification_type":"file.created",
  "notification_id": "<UUID>",
  "fileType":"transaction_recon",
  "path":"https://<server_path>/<filename>?parameters",
  "requestedAt":"<epoch time>"
}

FAQ

最新の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 QRCode, 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.10.10 Released Documentation Fix エラー処理 新しいエラーコードPAY_METHOD_INVALIDATEDを追加しました。
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 QRCode APIs and Error Handling section Get payment Details、Create a QRCodeのexpiryDateフィールドの説明を更新し、Get payment details APIのDYNAMIC_QR_PAYMENT_NOT_FOUNDエラーの説明を更新しました。
2024.03.12 Released Documentation Fix Create a QRCode, Get payment details metadataは廃止であることを追加しました。