継続課金 (1.0)

はじめに

PayPay Open Payment API(OPA)は、様々なシナリオに対応した決済関連操作が設計されており、ユーザーへ快適な決済体験を提供します。 本書では、PayPay決済パートナー向けに設計したContinuous Payments APIに焦点を当てます。

Continuous Paymentsは、サブスクリプションでの定期的な支払いを必要とするオンライン加盟店向けのAPIです。 シンプルなインテグレーションで、安全に定期的な支払いをユーザーへリクエストすることが可能です。

TLSの実装

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

加盟店を登録する

PayPay OPAの利用を開始するには、事前に定められたプロセスに従ってPayPay加盟店の登録を行なってください。

このプロセスは 情報収集、手動検証、契約確認、およびクレデンシャル情報の発行から構成されます。

PayPayの加盟店として登録された後、以下の項目が設定されます。

  • api keyとsecret
  • 許可された認可コールバックドメイン
  • ユーザー認可有効期間
  • Webhookエンドポイント
  • クライアントIPホワイトリスト

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

ユーザー認可を取得する

PayPayユーザーのウォレットから決済を回収できるようにするには、ユーザーの認可を明示的に取得する必要があります。

ユーザー認可を取得する方法については、 こちら をご参照ください。

また、SCOPEには"continuous_payments"を指定して下さい。

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 Request accepted
400 INVALID_REQUEST_PARAMS リクエストにより提供された情報に無効なデータが含まれています。例: サポートされていない通貨
401 OP_OUT_OF_SCOPE The operation is not permitted.
400 MISSING_REQUEST_PARAMS 設定されたパラメータが無効です。
401 UNAUTHORIZED 有効なapi keyとsecretが提供されていません。
404 OPA_CLIENT_NOT_FOUND OPAクライアントが見つかりません。
429 RATE_LIMIT リクエスト制限数超過。
500 SERVICE_ERROR サービスエラーが発生しました。
500 INTERNAL_SERVER_ERROR PayPayサービス側で問題が発生しました。
503 MAINTENANCE_MODE メンテナンス中です。

Create a continuous payment

Status Code Description
400 CC_LIMIT_EXCEEDED The credit card limit is exceeded.
400 PPC_BAD_REQUEST The paypay card process be issued something error.
400 PPC_EXPIRED PayPay card is expired.
400 PPC_LIMIT_EXCEEDED PayPay card limit is exceeded.
400 INVALID_PARAMS The requested operation is not able to be processed due to the current condition. E.g. the
transaction limit exceeded.
400 SUSPECTED_DUPLICATE_PAYMENT Similar transaction exist in a short time
400 UNACCEPTABLE_OP The requested operation is not able to be processed due to the current condition. E.g. the user is suspecious.
400 LIMIT_EXCEEDED The payment amount exceeded upper limit.
400 USER_DEFINED_DAILY_LIMIT_EXCEEDED The payment amount exceeded user 24 hours defined limit.
400 USER_DEFINED_MONTHLY_LIMIT_EXCEEDED The payment amount exceeded user 30 days defined limit.
400 NON_KYC_USER User has not completed KYC.
400 USER_DAILY_LIMIT_FOR_MERCHANT_EXCEEDED Payment amount exceeded merchant defined restriction.
400 NO_SUFFICIENT_FUND The user's balance is insufficient to make payment.
400 CANCELED_USER The user has canceled PayPay account.
401 USER_STATE_IS_NOT_ACTIVE The request cannot be accepted because the user status is Inactive.
401 INVALID_USER_AUTHORIZATION_ID The specified user authorization ID is invalid
401 EXPIRED_USER_AUTHORIZATION_ID The user authorization ID expired
404 RESOURCE_NOT_FOUND Order not found
500 TRANSACTION_FAILED This code means the transaciton is failed in PayPay side. You can create new transaction for the same purpose with reasonable backoff time.

以下のエラーはユーザーがKYC(本人確認)を完了していない場合に発生します。

Status Code Description
400 NON_KYC_USER ユーザーがKYCを完了していません。

以下のエラーは使用した支払い方法がCREDIT_CARDまたはPAY_LATER_CCの場合に発生します。

Status Code Description
400 CC_LIMIT_EXCEEDED クレジットカードの利用限度超過。
400 PPC_BAD_REQUEST PayPayカード処理に何らかのエラーが発生しました。
400 PPC_EXPIRED PayPayカードの有効期限が切れています。
400 PPC_LIMIT_EXCEEDED PayPayカード限度額超過。
429 INTERNAL_SERVICE_RATE_LIMIT リクエスト制限数超過。PayPay外部のシステムにおいて一定時間内の制限を超えたリクエストが行われた場合に発生します。時間を空けたのちmerchantPaymentIdを変更してリトライしてください。

Get payment details

Status Code Description
404 RESOURCE_NOT_FOUND Order not found

Cancel a payment

Status Code Description
400 ORDER_NOT_REVERSIBLE このコードは、以下のいずれかの場合に返されます。
1) 対象注文のステータスが REFUNDED,EXPIRED, COMPLETED, または CANCELED のいずれかである場合。
出荷売上以外の場合は注文のステータスがCOMPLETEDであってもこのエラーコードは返されません。
2) キャンセルウィンドウが過ぎた場合です。

Refund a payment

Status Code Description
400 UNACCEPTABLE_OP The requested operation is not able to be processed due to the current condition. E.g. the user is suspecious.
400 INVALID_PARAMS The requested operation is not able to be processed due to the current condition. E.g. the
transaction limit exceeded.
400 CANCELED_USER Target user does not exist.
400 THROTTLED_MULTIPLE_REFUND_REJECTED Rejected refund request as similar request is in progress, you can retry after 1 minute.
400 REFUND_LIMIT_EXCEEDED Order has reached maximum number of allowed refunds. This can only occur if the multiple refund feature is enabled for merchant.
400 REFUND_WINDOW_EXCEED Refund window exceeded.
401 USER_STATE_IS_NOT_ACTIVE The request cannot be accepted because the user status is Inactive.
403 MERCHANT_MULTIPLE_REFUND_REJECTED Merchant multiple refund not enabled.
404 NO_SUCH_REFUND_ORDER The specified refund payment could not be found.
404 RESOURCE_NOT_FOUND Order not found

Get refund details

Status Code Description
404 NO_SUCH_REFUND_ORDER Refund not found
Status Code Description
401 INVALID_USER_AUTHORIZATION_ID The specified user authorization ID is invalid.

Get user authorization status

Status Code Description
400 CANCELED_USER The user has canceled PayPay account.
401 INVALID_USER_AUTHORIZATION_ID The specified user authorization ID is invalid.

Get masked user profile

Status Code Description
401 INVALID_USER_AUTHORIZATION_ID The specified user authorization ID is invalid

Get payment methods

Status Code Description
400 NO_VALID_PAYMENT_METHOD User does not have any payment methods.

Timeout

推奨タイムアウト値は各APIで指定されています。 決済APIのタイムアウト値は30秒以下であってはいけません。 タイムアウトが発生した場合、それは状態が不明な決済として扱ってください。

状態が不明な決済の処理

この状況に対処する方法は2つあります。

  1. 取引の状況を照会するには、照会APIを使用してください。 PayPayにおいて元の取引が失敗になっているか存在しない場合は、同じ取引として新しいトランザクションを開始できます。

  2. キャンセルAPIが提供されている場合は、取引をキャンセルすることもできます。 キャンセルが承認された後、同じ取引として新しいトランザクションを開始できます。

OPAに関するその他のFAQについてはこちらをご覧ください。

ユーザー認可のステータス変更に伴うAPI実行結果

ユーザー認可のステータス変更に伴い、APIの実行に失敗する場合があります。 想定されるユーザー状態と、対応するAPI実行結果は下記の通りとなります。他APIにおいて、ステータス変更に伴うエラーは発生しません。


Get user authorization status

ユーザーの状態
ユーザー退会ユーザー認可の有効期限切れアプリ操作での認可解除
http status:400
Code="CANCELED_USER"
http status:200
data.expiresAt<現在日
http status:200
data.status="inactive"

Create a continuous payment、Get payment methods、Check user wallet balance、Get masked user profile

ユーザーの状態
ユーザー退会ユーザー認可の有効期限切れアプリ操作での認可解除
http status:401
Code="INVALID_USER_AUTHORIZATION_ID"
http status:401
Code="EXPIRED_USER_AUTHORIZATION_ID"
http status:401
Code="INVALID_USER_AUTHORIZATION_ID"
※2022/2/25までに退会したユーザーに対して上記APIを実行した場合、
 エラーコードは"VALIDATION_FAILED_EXCEPTION"となります。

Refund a payment

ユーザーの状態
ユーザー退会ユーザー認可の有効期限切れアプリ操作での認可解除
http status:400
Code="CANCELED_USER"
http status:200
Code="SUCCESS"
http status:200
Code="SUCCESS"

決済

決済・取消に関して

Create a continuous payment

Create a continuous payment and start the money transfer.

Timeout: 30s

Request Body schema: application/json

Payment

merchantPaymentId
required
string (MerchantPaymentId) <= 64 characters

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

userAuthorizationId
required
string (UserAuthorizationId) <= 64 characters

ユーザー認可フローによって返却されたPayPayユーザー認可ID

required
object (MoneyAmount)
requestedAt
required
integer (EpochTime)

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

storeId
string (StoreId) <= 255 characters

加盟店に紐付く店舗ID

terminalId
string <= 255 characters

端末を識別するためのID

orderReceiptNumber
string <= 255 characters

加盟店発番の注文番号

orderDescription
string <= 255 characters

取引の説明

Array of objects (MerchantOrderItem)
metadata
object

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

paymentMethodType
string (PaymentMethodType) <= 64 characters

以下の値を設定可能です:

  • "WALLET"
  • "PAY_LATER_CC"
    • オンライン決済でPayPay(クレジット)を受け付けている加盟店が利用可能
  • "CREDIT_CARD"
    • オンライン決済でクレジットカードを受け付けている加盟店が利用可能

加盟店はこのフィールドを使用して決済トランザクションで使用する支払い方法を指定します。

"PAY_LATER_CC", "WALLET", "CREDIT_CARD"が渡された場合、決済トランザクションにPayPay(クレジット), PayPay残高、クレジットカードが使用されます。
指定した支払い方法で決済が失敗した場合でも、支払いはフォールバックされません。

指定しなかった場合、決済処理の手順はPayPay側で以下のように決定されます。
ユーザーが支払いの優先順位を設定している場合、利用可能な支払い方法の中から優先順位に従って支払い処理が試行されます。
ユーザーが支払いの優先順位を設定していない場合、PayPay残高からの支払い処理を行います。

"POINT"は単独の支払い方法としてサポートされていません。

paymentMethodId
string (PaymentMethodId) <= 64 characters

paymentMethodTypeで指示した支払いを指定するために、paymentMethodIdはpaymentMethodTypeと共に使用します。 (特に、同一のpaymentMethodTypeで複数の支払い方法をユーザーが持つ可能性がある"CREDIT_CARD""PAY_LATER_CC"等で指定が必要です) "PAY_LATER_CC", "WALLET", "CREDIT_CARD"が渡された場合、決済トランザクションにPayPay(クレジット), PayPay残高、クレジットカードが使用されます。 この値はGet payment methods APIで取得できます。

paymentMethodTypeに"WALLET"を指定した場合は、paymentMethodIdを設定する必要はありません。

paymentMethodTypePAY_LATER_CCを指定した場合、paymentMethodIdを設定せずリクエストすることは可能ですが、その場合は最も古くPayPayに登録されたものが自動的に選択されます。

paymentMethodIdは、最大約20桁の数値を表す文字列として考えることができます。

productType
string (ProductType)
Enum: "VIRTUAL_BONUS_INVESTMENT" "PAY_LATER_REPAYMENT" "REAL_INVESTMENT"

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

onetimeUseCashback
string (OnetimeUseCashbackForCreatePayment)
Enum: "ENABLED" "DISABLED"

NOTE: このパラメータを利用するためにはonetime_use_cashbackスコープが必要です。

この決済トランザクションに限りユーザーのPayPayポイントを利用するかどうかを指定します。 例えば"ENABLED"を指定した場合、ユーザーのPayPayポイント利用設定が「貯める」となっていた場合でもPayPayは当該決済トランザクションに限りPayPayポイントを使用します。 同様に"DISABLED"を指定した場合、ユーザーのPayPayポイント利用設定が「支払いに使う」となっていた場合でもPayPayは当該決済トランザクションに限ってPayPayポイントを使用しません。 ただし、設定が「ポイント運用に自動追加」の場合はこのパラメータは無視されます。

このパラメータが指定されていない場合はユーザーのPayPayポイント利用設定に従って決済を試みます。

Responses

Request samples

Content type
application/json
{
  • "merchantPaymentId": "string",
  • "userAuthorizationId": "string",
  • "amount": {
    },
  • "requestedAt": 1704112496,
  • "storeId": "string",
  • "terminalId": "string",
  • "orderReceiptNumber": "string",
  • "orderDescription": "string",
  • "orderItems": [
    ],
  • "metadata": { },
  • "paymentMethodType": "string",
  • "paymentMethodId": "string",
  • "productType": "VIRTUAL_BONUS_INVESTMENT",
  • "onetimeUseCashback": "ENABLED"
}

Response samples

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

Get payment details

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

Timeout: 15s

path Parameters
merchantPaymentId
required
string (MerchantPaymentIdSimple) <= 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(返金)を使用してください。

orderTypeがREMITTANCEの場合はPayPayがリクエストを受け付けてから25分以内にキャンセルを行うことができます。
またorderTypeがREMITTANCEの場合はRefund a payment(返金)はご利用いただけません。

出荷売上の場合は、ステータスがAUTHORIZEDの場合に使用可能です。
支払いが完了してステータスがCOMPLETEDになるか、期限を過ぎてEXPIREDになると、使用できません。

Timeout: 15s

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

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

Responses

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-2) <= 64 characters

PayPay発番の決済取引ID

required
object (MoneyAmount)
requestedAt
required
integer (EpochTime)

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

reason
string (Reason) <= 255 characters

オプション

Responses

Request samples

Content type
application/json
{
  • "merchantRefundId": "string",
  • "paymentId": "string",
  • "amount": {
    },
  • "requestedAt": 1704112496,
  • "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-2) <= 64 characters

PayPay発番の決済取引ID

Responses

Response samples

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

Get payment methods

決済トランザクションの中で、支払いの前にユーザーが利用可能な支払い方法を取得できます。

このAPIはユーザーが利用可能なPaymentMethodTypeとPaymentMethodIdを返します。支払い方法にはPayPay(クレジット)(PayPay(クレジット)についてはこちら)、またはクレジットカードが含まれます。ウォレットは決済APIでPaymentMethodIdを指定する必要がないため、このAPIでは返しません。

このAPIは、アカウントリンク時にget_balanceスコープによって残高情報を見る権限がユーザーに付与されているときに限って、walletInfoを返します。

ユーザーが複数のPayPayカードをPayPayアプリに登録している場合(paymentMethodTypePAY_LATER_CCのもの)、このAPIは登録されたPayPayカードをそのグレードの高い順・登録日の早い順に全て返却します。

タイムアウト: 30秒

query Parameters
userAuthorizationId
required
string (UserAuthorizationId-2) <= 64 characters

ユーザー認可フローによって返却されたPayPayユーザー認可ID

productType
string (ProductTypeForPaymentMethodsMixin)
Enum: "VIRTUAL_BONUS_INVESTMENT" "PAY_LATER_REPAYMENT" "REAL_INVESTMENT"

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

Responses

Response samples

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

ウォレット

Check user wallet balance

ユーザーが支払いをするための十分な残高があるかを確認します。

Timeout: 15s

query Parameters
userAuthorizationId
required
string (UserAuthorizationId) <= 64 characters

ユーザー認可フローによって返却されたPayPayユーザー認可ID

amount
required
integer
currency
required
string
Value: "JPY"
productType
string (ProductType)
Enum: "VIRTUAL_BONUS_INVESTMENT" "PAY_LATER_REPAYMENT" "REAL_INVESTMENT"

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

onetimeUseCashback
string (OnetimeUseCashbackForGetBalance)
Enum: "ENABLED" "DISABLED"
Example: onetimeUseCashback=ENABLED

NOTE: このパラメータを利用するためにはonetime_use_cashbackスコープが必要です。

照会する残高にユーザーのPayPayポイントを含めるか否かを指定します。 例えば"ENABLED"を指定した場合、ユーザーのPayPayポイント利用設定が「貯める」となっていた場合でもPayPayポイントを含めた残高で計算します。 同様に"DISABLED"を指定した場合、ユーザーのPayPayポイント利用設定が「支払いに使う」となっていた場合でもPayPayポイントを除いた残高で計算します。 ただし、設定が「ポイント運用に自動追加」の場合はこのパラメータは無視されます。

このパラメータが指定されていない場合はユーザーのPayPayポイント利用設定に従って計算します。

Responses

Response samples

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

ユーザー

ユーザー管理に関して

Unlink user

クライアントからユーザーのリンクを解除します。

タイムアウト: 15秒

path Parameters
userAuthorizationId
required
string (UserAuthorizationId-2) <= 64 characters

ユーザー認可フローによって返却されたPayPayユーザー認可ID

Responses

Response samples

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

Get user authorization status

ユーザー認可状態を取得します。

Timeout: 15s

path Parameters
userAuthorizationId
required
string (UserAuthorizationId) <= 64 characters

ユーザー認可フローによって返却されたPayPayユーザー認可ID

Responses

Response samples

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

Get masked user profile

マスクされたユーザーの電話番号を取得します。

query Parameters
userAuthorizationId
required
string (UserAuthorizationId-2) <= 64 characters

ユーザー認可フローによって返却されたPayPayユーザー認可ID

Responses

Response samples

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

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

ユーザーがPayPayアプリからの通知を許可している場合、以下の内容の通知がユーザーへ配信されます。.

Push通知

イベント カテゴリ メッセージ(例)
Create a payment:API(成功) Push通知 取引が完了しました。
金額:1000円
取引番号:xxxxxxxxxxxxxxxxxxxx
店舗名:テスト加盟店
Refund a payment:API Push通知 取引番号: xxxxxxxxxxxxxxxxxxxx
1000円の返金が完了しました。
残高不足 アプリ内通知 PayPay残高が不足しているためお支払いが失敗しました。PayPay残高にチャージするか他のお支払い方法を選択してください。
Create a payment:API(失敗) Push通知 取引が失敗しました。
金額:1000円
取引番号:xxxxxxxxxxxxxxxxxxxx
店舗名:テスト加盟店

基本的なステータスの遷移

イベント毎の基本的なステータスの遷移と、WEBHOOK通知については下記の通りとなります。

実施処理 実施前 実施後
Create a continuous payment:API - COMPLETED
Create a continuous payment:API - FAILED
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アドレスのホワイトリスト登録することを強く推奨します。 PayPay IPアドレスについては以下FAQをご覧ください。 https://integration.paypay.ne.jp/hc/ja/articles/4414062832143

カスタマーイベント

ユーザー状態の変化に関連するイベント

customer.authroization.succeeded

この通知は、クライアントがユーザーの認可を正常に取得した場合に送信されます。

{
  "notification_type": "customer.authroization.succeeded",
  "notification_id": "evt_aXnbdeFt2Ke",
  "createdAt": "1349654313",
  "referenceId": "yyyy",
  "nonce": "12345",
  "scopes": "continuous_payments",
  "userAuthorizationId": "xxxxx",
  "profileIdentifier": "*******5678",
  "expiry": 1234567  // the authorization id expiration epoch timestamp in seconds
}

customer.authroization.failed

この通知は、クライアントがユーザーの認可の取得に失敗した場合に送信されます。

{
  "notification_type": "customer.authroization.failed",
  "notification_id": "evt_aXnbdeFt2Ke",
  "createdAt": "1349654313",
  "referenceId": "yyyy",
  "nonce": "12345",
  "result": "declined",  // or bad_request
  "reason": "invalid scope"
}

Payloadのresult(結果)は、リクエストがユーザーによって拒否された場合はdeclined(拒否された)、 リクエストに無効な情報がある場合はbad_request(不正な要求)のいずれかになります。

customer.authroization.revoked

この通知は、ユーザーがPayPayアプリから、認可を取り消した場合に送信されます。

{
  "notification_type": "customer.authroization.revoked",
  "notification_id": "evt_aXnbdeFt2Ke",
  "createdAt": "1349654313",
  "userAuthorizationId": "xxxxx",
  "referenceId": "yyyy"
}

customer.authroization.extended

この通知は、ユーザー認可の期限がPayPayによって延長された場合に送信されます。

支払いの実施/認可の取得をした場合にユーザー認可の期限を延長します。 これにより、ユーザー操作による認可の取得を減らすことができるため、ユーザーへの負担を減らすことができます。

{
    "notification_type": "customer.authroization.extended",
    "notification_id": "evt_aXnbdeFt2Ke",
    "createdAt": "1349654313",
    "scopes": "continuous_payments",
    "userAuthorizationId": "xxxxx",
    "expiry": 1234567  // 秒単位の認証ID有効期限エポックタイムスタンプ
}

customer.authroization.canceled

この通知は、ユーザーが退会した時に送信されます。

サンプル・イベント:

{
  "notification_type": "customer.authroization.canceled",
  "notification_id": "evt_aXnbdeFt2Ke",
  "createdAt": "1349654313",
  "userAuthorizationId": "xxxxx"
}

突合ファイル(取引詳細)

PayPayでは取引明細ファイル(突合ファイル)を日次の処理で生成し、Webhookで通知します。

突合ファイル連携仕様

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

ファイルレイアウト

Key Value from Note
決済番号 order_id PayPayで採番された決済番号
加盟店ID merchant_id PayPayで採番された加盟店ID
屋号 brandName PayPayで管理しているブランド名
店舗ID storeId リクエスト時にセットされたstoreId
店舗名 storeName PayPayで管理している店舗名
端末番号 / Pos ID terminalId リクエスト時にセットされたterminalId
取引ステータス "取引完了", "取引失敗", "返金完了", "返金失敗" PayPayで管理している取引データのステータス
取引日時 acceptedAt
取引金額 amount 取消の場合はマイナス記号あり
レシート番号 orderReceiptNumber レシート番号
支払い方法 "PayPay残高", "クレジットカード", "あと払い", "PayPayポイント" カンマ区切りの支払い方法。
マーチャント決済ID merchantPaymentId 加盟店で採番された決済番号
支払い詳細 [{"paymentMethod":"PayPayポイント", "amount":5, "breakdown":[{"type":"REGULAR", "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.09.07 2022.12.07 Feature Create a continuous payment リクエストパラメータ "paymentMethodType" の説明を更新
2022.10.19 2022.10.27 Feature Create a continuous payment 新しいエラーコードUSER_DAILY_LIMIT_FOR_MERCHANT_EXCEEDEDを追加しました。
2022.11.17 2022.12.02 Feature Create a continuous payment リクエストパラメータ productType を追加しました。
2022.12.17 2023.01.31 Feature Create a continuous payment Create a Continuous PaymentとGet payment detailsエンドポイントについてacceptedAtの説明を更新
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.13 Released Documentation Fix 突合ファイル 取引ステータス:"取引失敗"の場合、エラー原因によっては、突合ファイルに出力されない場合があることを追加しました。
2023.04.26 2023.06.12 Feature Create a continuous payment, Get payment details レスポンスに paymentMethods を追加しました。
2023.06.16 Released Documentation Fix Refund a payment Refund a paymentの説明を変更しました。
2023.07.04 Released Documentation Fix Create a continuous payment, Get payment details metadataの説明を変更しました。
2023.08.01 Released Documentation Fix Create a continuous payment, Get payment details acceptedAtの説明を変更しました。
2023.09.01 2023.09.12 Feature Create a continuous payment, Get user wallet balance, Check user wallet balance onetimeUseCashbackパラメータを追加しました。
2023.09.08 2023.10.05 Feature Get payment methods Get Payment Methods APIのレスポンスに新しいフィールドmembershipを追加しました。
2023.11.06 2023.12.04 Feature Create a continuous payment, Get payment details paymentMethods.typePOINTを追加しました。
2023.11.15 2023.12.04 Feature Recon file MethodOfPayment に支払いタイプ「POINT」を追加し、新しい列「paymentDetails」を追加しました。
2023.12.19 TBD Feature Get Refund details リクエストのクエリパラメータ paymentId を追加し、説明を更新しました。
2024.03.12 Released Documentation Fix Create a continuous payment, Get payment details metadataは廃止であることを追加しました。
2024.04.08 TBD Feature Create a continuous payment PaymentMethodIdを平文でも許容するように変更しました。
2024.04.19 TBD Feature Create a continuous payment paymentMethodTypeに"PAY_LATER_CC"を指定した場合は、paymentMethodIdを設定する必要はありません。
2024.08.19 2024.08.19 Feature Cancel a payment. Error Handling OrderTypeがREMITTANCEの場合のCancel a paymentの受付時間について説明を追加しました。
2024.09.05 TBD Feature Get payment details レスポンスの paymentMethods 以下にフィールド breakdown を追加しました。
2024.09.05 TBD Feature Recon file breakdownpaymentDetails に追加しました。