Huge News!Announcing our $40M Series B led by Abstract Ventures.Learn More
Socket
Sign inDemoInstall
Socket

paypayopa

Package Overview
Dependencies
Maintainers
2
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

paypayopa

PayPay OPA SDK

  • 1.7
  • Source
  • PyPI
  • Socket score

Maintainers
2

Paypay OPA SDK - Python

License PyPI Version FOSSA Status Build Status Coverage Status Language grade: Python Black Duck Security Risk Maintainability Quality Gate Status PyPI - Downloads Codacy Badge BCH compliance CII Best Practices

So you are a developer and want to start accepting payments using PayPay. PayPay's Payment SDK is the simplest way to achieve the integration. With PayPay's Payment SDK, you can build a custom Payment checkout process to suit your unique business needs and branding guidelines.

When to use QR Code Payments

QR Code flow is recommended normally in the following scenarios

  • Payment to happen on a Tablet
  • Payments on Vending Machines
  • Payment to happen on a TV Screen
  • Printing a QR Code for Bill Payment

Understanding the Payment Flow

Following diagram defines the flow for Dynamic QR Code.

We recommend that the merchant implements a Polling of the Get payment Details API with a 4-5 second interval in order to know the status of the transaction.

Let's get Started

Once you have understood the payment flow, before we start the integration make sure you have:

  • Registered for a PayPay developer/merchant Account
  • Get the API key and secret from the Developer Panel.
  • Use the sandbox API Keys to test out the integration

Install pip package

$ pip install paypayopa

Getting Started

You need to setup your key and secret using the following:

To work in production mode you need to specify your production API_KEY & API_SECRET along with a production_mode True boolean flag

import paypayopa

client = paypayopa.Client(auth=(API_KEY, API_SECRET),
                         production_mode=True)

client.set_assume_merchant("MERCHANT_ID")

or

To work in sandbox mode you need to specify your sandbox API_KEY & API_SECRET keys along with a False boolean flag or you could just omit the production_mode flag since it defaults to False if not specified

import paypayopa

client = paypayopa.Client(auth=(API_KEY, API_SECRET),
                         production_mode=False)

After setting up the client instance you can get the current PayPay SDK version using the following:

print(client.get_version())

Create a QR Code

In order to receive payments using this flow, first of all you will need to create a QR Code. Following are the important parameters that you can provide for this method:

FieldRequiredTypeDescription
merchantPaymentIdYesstring <= 64 charactersThe unique payment transaction id provided by merchant
amountYesinteger <= 11 charactersAmount the user has to Pay
codeTypeYesstring <= 64 charactersPlease pass the fixed value "ORDER_QR"
orderDescriptionNostring <= 255 charactersDescription of the Order, Click here to check how it will show up
isAuthorizationNobooleanBy default it will be false, please set true if the amount will be captured later (preauth and capture payment)

For details of all the request and response parameters , check our API Documentation guide

request = {
    "merchantPaymentId": "cb31bcc0-3b6c-46e0-9002-e5c4bb1e3d5f",
    "codeType": "ORDER_QR",
    "redirectUrl": "http://foobar.com",
    "redirectType":"WEB_LINK",
    "orderDescription":"Example - Mune Cake shop",
    "orderItems": [{
        "name": "Moon cake",
        "category": "pasteries",
        "quantity": 1,
        "productId": "67678",
        "unitPrice": {
            "amount": 1,
            "currency": "JPY",
        },
    }],
    "amount": {
        "amount": 1,
        "currency": "JPY",
    },
}

client.Code.create_qr_code(request)

Did you get a HTTP 201 response, if yes then you are all set for the next step.


Get Payment Details

Now that you have created a Code, the next step is to implement polling to get Payment Details. We recommend a 4-5 second interval between requests. Following are the important parameters that you can provide for this method:

FieldRequiredTypeDescription
merchantPaymentIdYesstring <= 64 charactersThe unique payment transaction id provided by merchant

Fetch a particular QR CODE payment details

client.Payment.get_payment_details("<merchantPaymentId>")

For details of all the request and response parameters , check our API Documentation guide On successful payment, the status in the response will change to COMPLETED In case of a Preauth for Payment, the status in the response will change to AUTHORIZED


Delete a QRCode

So you want to delete a Code that you have already generated. Following can be possible reasons to use this API:

  • User has cancelled the order
  • Ensuring race conditions don't come up in the form user has scanned the QR Code and not made the payment and in the meantime the order expires at your end

Following are the important parameters that you can provide for this method:

FieldRequiredTypeDescription
codeIdYesstringThis is given as a response in the Create a QR Code method
client.Code.delete_qr_code("<CodeID>")

For details of all the request and response parameters , check our API Documentation guide


Cancel a payment

So you want to cancel a Payment. In most cases this should not be needed for payment happening in this flow, however following can be a case when this might be needed.

  • Polling for Get Payment Details timeout, and you are uncertain of the status

Note: The Cancel API can be used until 00:14:59 AM the day after the Payment has happened. For 00:15 AM or later, please call the refund API to refund the payment.

Following are the important parameters that you can provide for this method:

FieldRequiredTypeDescription
merchantPaymentIdYesstring <= 64 charactersThe unique payment transaction id provided by merchant
client.Payment.cancel_payment("<merchantPaymentId>")

Refund a payment

So the user has decided to return the goods they have purchased and needs to be given a refund. Following are the important parameters that you can provide for this method:

FieldRequiredTypeDescription
merchantRefundIdYesstring <= 64 charactersThe unique refund transaction id provided by merchant
paymentIdYesstring <= 64 charactersThe payment transaction id provided by PayPay
amountYesinteger <= 11 charactersThe amount to be refunded
reasonNointeger <= 11 charactersThe reason for refund
refund_payment_details = {
    "assumeMerchant": "cb31bcc0-3b6c-46e0-9002-e5c4bb1e3d5f",
    "merchantRefundId": "3b6c-46e0-9002-e5c4bb1e3d5f",
    "paymentId": "456787656",
    "amount": {
        "amount": 1,
        "currency": "JPY"
    },
    "reason": "reason for refund"
}

client.Payment.refund_payment(refund_payment_details)

For details of all the request and response parameters , check our API Documentation guide. Please note that currently we only support 1 refund per order.


Capture a payment authorization

So you are implementing a PreAuth and Capture, and hence want to capture the payment later. In this case, please ensure you have passed isAuthorization as true in create a code method. Following are the important parameters that you can provide for this method:

FieldRequiredTypeDescription
merchantPaymentIdYesstring <= 64 charactersThe unique payment transaction id provided by merchant
merchantCaptureIdYesstring <= 64 charactersThe unique capture transaction id provided by merchant
amountYesinteger <= 11 charactersAmount to be captured
orderDescriptionYesstring <= 255 charactersDescription of the Capture for the user
request_payload = {
    "merchantPaymentId": "merchant_payment_id",
    "amount": {
        "amount": 1,
        "currency": "JPY"
    },
    "merchantCaptureId": "31bcc0-3b6c-46e0-9002",
    "orderDescription": "Example - Mune Cake shop",
}

client.Payment.capture_payment(request_payload)

For details of all the request and response parameters , check our API Documentation guide.


Revert a payment authorization

So the order has cancelled the order while the payment was still Authorized, please use the revert a payment authorization method to refund back to the user. Following are the important parameters that you can provide for this method:

FieldRequiredTypeDescription
merchantRevertIdYesstring <= 64 charactersThe unique revert transaction id provided by merchant
paymentIdYesstring <= 64 charactersThe payment transaction id provided by PayPay
reasonNostring <= 255 charactersReason for reverting the payment authorization
request_payload = {
    "merchantRevertId": "cb31bcc0-3b6c-46e0-9002-e5c4bb1e3d5f",
    "paymentId": "1585537300",
    "reason": "reason for refund",
}

client.Payment.revert_payment(request_payload)

For List of params refer to the API guide : https://www.paypay.ne.jp/opa/doc/v1.0/dynamicqrcode#operation/revertAuth


Fetch refund status and details

So you want to confirm the status of the refund, maybe because the request for the refund timed out when you were processing the same. Following are the important parameters that you can provide for this method:

FieldRequiredTypeDescription
merchantRefundIdYesstring <= 64 charactersThe unique refund transaction id provided by merchant
client.Payment.refund_status("<merchantRefundId>")

For details of all the request and response parameters , check our API Documentation guide.


When to use Native Payments

Native Payments is recommended normally in the following scenarios

  • If you want provide your customers with the easiest possible checkout
  • You have the security in place to ensure our mutual customers money is safe (We have a strict evaluation procedure to enforce the same)

Integrating Native Integration

Acquire User Authorization

First of all you need to acquire a user Authorization. Following diagram defines the flow to acquire a user authorization.

In order to acquire an authorization you need to create a JWT Token -

cliamrequiredtypedescription
issyesstringthe merchant name
expyesnumberThe expiration date of the authorization page URL. Set with epoch time stamp (seconds).
scopeyesstringdirect_debit
nonceyesstringwill be sent back with response for the client side validation
redirectUrlyesstringThe callback endpoint provided by client. Must be HTTPS, and its domain should be in the allowed authorization callback domains
referenceIdyesstringThe id used to identify the user in merchant system. It will be stored in the PayPay db for reconciliation purpose
deviceIdnostringThe user mobile phone device id. If it is provided, we can use it to verify the user and skip the SMS verification, so as to provide more fluent UX
phoneNumbernostringThe user mobile phone number
# Helper function to create a JWT Token for requesting user Authorization
client.encode_jwt(API_SECRET,
                redirectUrl = "https://example.com",
                deviceId = "qwertyuiopoiuytre54567",
                phoneNumber = 90999999999 )

Once the user has granted authorization, we will return the UserAuthorizationID as a part of the JWT Token in response/ webhook

# Retrieving userAuthorizationId from response JWT
client.decode_jwt(API_SECRET, token)
FieldRequiredTypeDescription
userAuthorizationIdyesstring <= 64 charactersThe PayPay user reference id returned by the user authorization flow
# Calling the method to unlink a Payment
response = client.User.unlink_user_athorization('userAuthorizationId')
# Printing if the method call was SUCCESS
print(response["resultInfo"]["code"])

Did you get SUCCESS in the print statement above, if yes then the API execution has happened correctly.

For details of all the request and response parameters , check our API Documentation guide.


Create a payment

In order to take a payment, you will need to send a request to us with the following parameters:

FieldRequiredTypeDescription
merchantPaymentIdYesstring <= 64 charactersThe unique payment transaction id provided by merchant
userAuthorizationIdYesstring <= 64 charactersThe PayPay user reference id returned by the user authorization flow
amountYesinteger <= 11 charactersAmount the user has to Pay
orderDescriptionNostring <= 255 charactersDescription of the Order, Click here to check how it will show up
# Creating the payload to create a Payment, additional parameters can be added basis the API Documentation
request = {
    "merchantPaymentId": "my_payment_id",
    "userAuthorizationId": "my_user_authorization_id",
    "amount": {"amount": 1, "currency": "JPY"},
    "orderDescription": "Mune's Favourite Cake",
}
# Calling the method to create a payment
response = client.Payment.create(request)
# Printing if the method call was SUCCESS, this does not mean the payment was a success
print(response["resultInfo"]["code"])

Did you get SUCCESS in the print statement above, if yes then the API execution has happened correctly.

For details of all the request and response parameters , check our API Documentation guide


Get Payment Details

Now that you have created a payment, in case the payment request timeout, you can call get payment details method to know the payment status. Following are the important parameters that you can provide for this method:

FieldRequiredTypeDescription
merchantPaymentIdYesstring <= 64 charactersThe unique payment transaction id provided by merchant
# Calling the method to get payment details
response = client.Payment.get_payment_details("<merchantPaymentId>")
# Printing if the method call was SUCCESS, this does not mean the payment was a success
print(response["resultInfo"]["code"])
# Printing if the transaction status for the code has COMPLETED/ AUTHORIZED
print(response["data"]["status"])

Did you get SUCCESS in the print statement above, if yes then the API execution has happen correctly.

On successful payment, the status in response["data"]["status"] will be COMPLETED For details of all the request and response parameters , check our API Documentation guide


Cancel a payment

So you want to cancel a Payment. In most cases this should not be needed for payment happening in this flow, however following can be a case when this might be needed.

  • Initial create payment timeout and you want to cancel the Payment
  • Get Payment Details timeout, and you are uncertain of the status

Note: The Cancel API can be used until 00:14:59 AM the day after the Payment has happened. For 00:15 AM or later, please call the refund API to refund the payment.

Following are the important parameters that you can provide for this method:

FieldRequiredTypeDescription
merchantPaymentIdYesstring <= 64 charactersThe unique payment transaction id provided by merchant
# Calling the method to cancel a Payment
response = client.Payment.cancel_payment("<merchantPaymentId>")
# Printing if the method call was SUCCESS
print(response["resultInfo"]["code"])

Did you get SUCCESS in the print statement above, if yes then the API execution has happend correctly.

For details of all the request and response parameters , check our API Documentation guide


Refund a payment

So the user has decided to return the goods they have purchased and needs to be giveb a refund. Following are the important parameters that you can provide for this method:

FieldRequiredTypeDescription
merchantRefundIdYesstring <= 64 charactersThe unique refund transaction id provided by merchant
paymentIdYesstring <= 64 charactersThe payment transaction id provided by PayPay
amountYesinteger <= 11 charactersThe amount to be refunded
reasonNointeger <= 11 charactersThe reason for refund
# Creating the payload to refund a Payment, additional parameters can be added based on the API Documentation
request = {
    "merchantRefundId": "merchant_refund_id",
    "paymentId": "paypay_payment_id",
    "amount": 1,
    "reason": "reason for refund",
}
# Calling the method to refund a Payment
response = client.Payment.refund_payment(request)
# Printing if the method call was SUCCESS
print(response["resultInfo"]["code"])

Did you get SUCCESS in the print statement above, if yes then the API execution has happened correctly.

For details of all the request and response parameters , check our API Documentation guide. Please note that currently we only support 1 refund per order.


Fetch refund status and details

So you want to confirm the status of the refund, maybe because the request for the refund timed out when you were processing the same. Following are the important parameters that you can provide for this method:

FieldRequiredTypeDescription
merchantRefundIdYesstring <= 64 charactersThe unique refund transaction id provided by merchant
# Calling the method to get Refund Details
response = client.Payment.refund_details("<merchantRefundId>")
# Printing if the method call was SUCCESS
print(response["resultInfo"]["code"])

Did you get SUCCESS in the print statement above, if yes then the API execution has happen correctly.

For details of all the request and response parameters , check our API Documentation guide.


Acquire User Authorization

So you want to confirm the status of the refund, maybe because the request for the refund timed out when you were processing the same. Following are the important parameters that you can provide for this method:

ClaimRequiredTypeDescription
scopesYesArray of stringItems Enum: 'direct_debit' 'cashback' 'get_balance' 'quick_pay' 'continuous_payments' 'merchant_topup' 'pending_payments' 'user_notification' 'user_topup' 'user_profile' 'preauth_capture_native' 'preauth_capture_transaction' 'push_notification' 'notification_center_ob' 'notification_center_ab' 'notification_center_tl' Scopes of the user authorization
nonceYesstringRandom generated string
redirectTypeNostringDefault: 'WEB_LINK' Enum: 'APP_DEEP_LINK' 'WEB_LINK' Parameter to decide whether to redirect to merchant app or merchant web application
redirectUrlYesstringThe callback endpoint provided by client. For 'WEB_LINK' it must be HTTPS, and its domain should be in the allowed authorization callback domains
referenceIdYesstringThe id used to identify the user in merchant system. It will be stored in the PayPay db for reconsilliation purpose
phoneNumberNostringThe user mobile phone number
deviceIdNostringThe user mobile phone device id. If it is provided, we can use it to verify the user and skip the SMS verification, so as to provide more fluent UX
userAgentNostringThe User agent of the web browser. When redirectType is 'WEB_LINK' this parameter is provided, on mobile devices PayPay tries to open the browser that the merchant website is using.
payload = {
  "scopes": [
    "direct_debit"
  ],
  "nonce": "rtyuhghj7989",
  "redirectType": "WEB_LINK",
  "redirectUrl": "www.example.com",
  "referenceId": "uioiugf789",
  "phoneNumber": "90999999999",
  "deviceId": "qwertyuiopoiuytre54567",
  "userAgent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36"
}

client.Account.create_qr_session(payload)

Once the user has granted authorization, we will return the UserAuthorizationID as a part of the JWT Token in response/ webhook

# Retrieving userAuthorizationId from response JWT
client.decode_jwt(API_SECRET, token)

Did you get SUCCESS in the print statement above, if yes then the API execution has happen correctly.

For details of all the request and response parameters , check our API Documentation guide.


Create a Payment Authorization

In order to create a payment authorization, you will need to send a request to us with the following parameters:

ClaimRequiredTypeDescription
merchantPaymentIdYesstring <= 64 charactersThe unique payment transaction id provided by merchant
userAuthorizationIdYesstring <= 64 charactersThe PayPay user reference id returned by the user authorization flow
amountYesinteger <= 11 charactersAmount the user has to Pay
requestedAtYesintegerEpoch timestamp in seconds
orderDescriptionYesstring <= 255 charactersDescription of the Capture for the user
# Creating the payload for a payment authorization request, additional parameters can be added basis the API Documentation
request_payload = {
    "merchantPaymentId": "merchant_payment_id",
    "userAuthorizationId": "user_authorization_id",
    "amount": {
      "amount": 26.00,
      "currency": "JPY"
    },
    "requestedAt": 5353454354,
    "orderReceiptNumber": "435435435",
    "orderDescription": "Mune's Favourite Cake",
  }

# Calling the method to create a payment authorization
client.Preauth.pre_authorize_create(request_payload)

Creating a Continuous Payment authorization

In order to acquire an authorization you need to create a JWT Token -

ClaimRequiredTypeDescription
scopesYesArray of stringItems Enum: 'direct_debit' 'cashback' 'get_balance' 'quick_pay' 'continuous_payments' 'merchant_topup' 'pending_payments' 'user_notification' 'user_topup' 'user_profile' 'preauth_capture_native' 'preauth_capture_transaction' 'push_notification' 'notification_center_ob' 'notification_center_ab' 'notification_center_tl' Scopes of the user authorization
nonceYesstringRandom generated string
redirectTypeNostringDefault: 'WEB_LINK' Enum: 'APP_DEEP_LINK' 'WEB_LINK' Parameter to decide whether to redirect to merchant app or merchant web application
redirectUrlYesstringThe callback endpoint provided by client. For 'WEB_LINK' it must be HTTPS, and its domain should be in the allowed authorization callback domains
referenceIdYesstringThe id used to identify the user in merchant system. It will be stored in the PayPay db for reconsilliation purpose
phoneNumberNostringThe user mobile phone number
deviceIdNostringThe user mobile phone device id. If it is provided, we can use it to verify the user and skip the SMS verification, so as to provide more fluent UX
userAgentNostringThe User agent of the web browser. When redirectType is 'WEB_LINK' this parameter is provided, on mobile devices PayPay tries to open the browser that the merchant website is using.
# Creating the payload for a payment authorization request, additional parameters can be added basis the API Documentation
request_payload = {
    "merchantPaymentId": "merchant_payment_id",
    "userAuthorizationId": "my_user_authorization_id",
    "orderDescription": "Mune's Favourite Cake",
    "amount": {
        "amount": 1,
        "currency": "JPY"
    }
}

# Calling the method to create a continuous payment authorization
client.Payment.create_continuous_payment(request_payload)

# Printing if the method call was SUCCESS, this does not mean the payment was a success
print(response["resultInfo"]["code"])

Creating a Pending Payment authorization

In order to acquire an authorization you need to create a JWT Token -

ClaimRequiredTypeDescription
merchantPaymentIdYesstring <= 64 charactersThe unique payment transaction id provided by merchant
userAuthorizationIdYesstring <= 64 charactersThe PayPay user reference id returned by the user authorization flow
amountYesinteger <= 11 charactersAmount the user has to Pay
requestedAtYesintegerEpoch timestamp in seconds
orderDescriptionYesstring <= 255 charactersDescription of the Capture for the user
# Creating the payload for a payment authorization request, additional parameters can be added basis the API Documentation
request_payload = {
  "merchantPaymentId": "merchant_payment_id",
  "userAuthorizationId": "my_user_authorization_id",
  "amount": {
    "amount": 1,
    "currency": "JPY"
  },
  "requestedAt": 1632123456,
  "expiryDate": None,
  "storeId": "001",
  "terminalId": "0042",
  "orderReceiptNumber": "0878",
  "orderDescription": "Example - Mune Cake shop",
    "orderItems": [{
        "name": "Moon cake",
        "category": "pasteries",
        "quantity": 1,
        "productId": "67678",
        "unitPrice": {
            "amount": 1,
            "currency": "JPY"
        }
    }],
  "metadata": {}
}

# Calling the method to create a continuous payment authorization
client.Pending.create_pending_payment(request_payload)

# Printing if the method call was SUCCESS, this does not mean the payment was a success
print(response["resultInfo"]["code"])

Did you get SUCCESS in the print statement above, if yes then the API execution has happen correctly.

On successful payment, the status in response["data"]["status"] will be COMPLETED For details of all the request and response parameters , check our API Documentation guide


Get Pending Payment Details

Now that you have created a pending payment, in case the payment request timeout, you can call get payment details method to know the payment status. Following are the important parameters that you can provide for this method:

FieldRequiredTypeDescription
merchantPaymentIdYesstring <= 64 charactersThe unique payment transaction id provided by merchant
# Calling the method to get payment details
response = client.Pending.get_payment_details("<merchantPaymentId>")
# Printing if the method call was SUCCESS, this does not mean the payment was a success
print(response["resultInfo"]["code"])
# Printing if the transaction status for the code has COMPLETED/ AUTHORIZED
print(response["data"]["status"])

Did you get SUCCESS in the print statement above, if yes then the API execution has happen correctly.

On successful payment, the status in response["data"]["status"] will be COMPLETED For details of all the request and response parameters , check our API Documentation guide


Cancel Pending Payment Details

FieldRequiredTypeDescription
merchantPaymentIdYesstring <= 64 charactersThe unique payment transaction id provided by merchant
# Calling the method to cancel pending payment
response = client.Pending.cancel_payment("<merchantPaymentId>")
# Printing if the method call was SUCCESS, this does not mean the payment was a success
print(response["resultInfo"]["code"])
# Printing if the transaction status for the code has COMPLETED/ AUTHORIZED
print(response["data"]["status"])

Did you get SUCCESS in the print statement above, if yes then the API execution has happen correctly.

On successful payment, the status in response["data"]["status"] will be COMPLETED For details of all the request and response parameters , check our API Documentation guide


Refund a Pending Payment

So the user has decided to return the goods they have purchased and needs to be given a refund. Following are the important parameters that you can provide for this method:

FieldRequiredTypeDescription
merchantRefundIdYesstring <= 64 charactersThe unique refund transaction id provided by merchant
paymentIdYesstring <= 64 charactersThe payment transaction id provided by PayPay
amountYesinteger <= 11 charactersThe amount to be refunded
reasonNointeger <= 11 charactersThe reason for refund
payload = {
    "assumeMerchant": "cb31bcc0-3b6c-46e0-9002-e5c4bb1e3d5f",
    "merchantRefundId": "3b6c-46e0-9002-e5c4bb1e3d5f",
    "paymentId": "456787656",
    "amount": {
        "amount": 1,
        "currency": "JPY"
    },
    "reason": "reason for refund"
}

client.Pending.refund_payment(refund_payment_details)

On successful payment, the status in response["data"]["status"] will be COMPLETED For details of all the request and response parameters , check our API Documentation guide


Cashback

Paypay Cashback API can give users some balance. If you use Cashback API, you should authorize paypay user to use create_qr_session sdk.

Give Cashback
FieldRequiredTypeDescription
merchantCashbackIdYesstring <= 64 charactersThe unique cashback transaction id provided by merchant
userAuthorizationIdYesstring <= 64 charactersThe paypay user reference id provided by PayPay
amountYesinteger <= 11 charactersThe amount to cashback
currencyYesstring"JPY"
requestedAtYesintegerEpoch timestamp in seconds
orderDescriptionNostring <= 255 charactersDescription of the order
walletTypeNostringWallet type
expiryDateNodateThe date on which the Cashback Expires
metadataNostringExtra information the merchant want to add
payload = {
    "merchantCashbackId": "ab31bcc0-3b6c-46e0-9002-e5c4bb1e3d5f",
    "userAuthorizationId": "3b6c-a7c9-9002-e5c4bb1e3d5f",
    "amount": {
        "amount": 100,
        "currency": "JPY"
    },
    "requestedAt": 1609749559,
    "orderDescription": "order description",
    "walletType": "PREPAID",
    "expiryDate": None,
    "metadata": ""
}
client.Cashback.give_cashback(payload)
Check Cashback Details
FieldRequiredTypeDescription
merchantCashbackIdYesstring <= 64 charactersThe unique cashback transaction id provided by merchant
merchant_cashback_id = "ab31bcc0-3b6c-46e0-9002-e5c4bb1e3d5f"
client.Cashback.check_give_cashback(merchant_cashback_id)
Reverse Cashback
FieldRequiredTypeDescription
merchantCashbackReversalIdYesstring <= 64 charactersThe unique reversal cashback transaction id provided by merchant
merchantCashbackIdYesstring <= 64 charactersThe unique cashback transaction id provided by merchant
amountYesinteger <= 11 charactersThe amount to cashback
currencyYesstring"JPY"
reasonNostring <= 255 charactersReason for reversing the cashback
metadataNostringExtra information the merchant want to add
payload = {
    "merchantCashbackReversalId": "e031bcc0-3b6c-9a7d-9002-e5c4cc1e3d5f",
    "merchantCashbackId": "ab31bcc0-3b6c-46e0-9002-e5c4bb1e3d5f",
    "amount": {
        "amount": 100,
        "currency": "JPY"
    },
    "requestedAt": 1609749559,
    "reason": "reversal reason",
    "metadata": {}
}
client.Cashback.reverse_cashback(payload)
Check Cashback Reversal Details
FieldRequiredTypeDescription
merchantCashbackReversalIdYesstring <= 64 charactersThe unique reversal cashback transaction id provided by merchant
merchantCashbackIdYesstring <= 64 charactersThe unique cashback transaction id provided by merchant
merchant_cashback_reversal_id = "e031bcc0-3b6c-9a7d-9002-e5c4cc1e3d5f"
merchant_cashback_id = "ab31bcc0-3b6c-46e0-9002-e5c4bb1e3d5f"
client.Cashback.check_reversal_cashback(merchant_cashback_reversal_id, merchant_cashback_id)

Get refund details of a Pending payment

So the user has decided to return the goods they have purchased and needs to be given a refund. Following are the important parameters that you can provide for this method:

FieldRequiredTypeDescription
merchantPaymentIdYesstring <= 64 charactersThe unique payment transaction id provided by merchant
# Calling the method to cancel pending payment
response = client.Pending.refund_details("<merchantPaymentId>")
# Printing if the method call was SUCCESS, this does not mean the payment was a success
print(response["resultInfo"]["code"])
# Printing if the transaction status for the code has COMPLETED/ AUTHORIZED
print(response["data"]["status"])

Did you get SUCCESS in the print statement above, if yes then the API execution has happen correctly.

On successful payment, the status in response["data"]["status"] will be COMPLETED For details of all the request and response parameters , check our API Documentation guide

Error Handling

PayPay uses HTTP response status codes and error code to indicate the success or failure of the requests. With this information, you can decide what error handling strategy to use. In general, PayPay returns the following http status codes.

HTTP 2xx

200 Everything works as expected.

201 The requested resource(e.g. dynamic QR code) was created.

202 Means the request is received, and will be processed sometime later.

HTTP 4xx

400 This status code indicates an error because the information provided in request is not able to be processed. The following OPA error code may be returned.

  • INVALID_PARAMS The information provided by the request contains invalid data. E.g. unsupported currency.

  • UNACCEPTABLE_OP The requested operation is not able to be processed due to the current condition. E.g. the transaction limit exceeded.

  • NO_SUFFICIENT_FUND There is no sufficient fund for the transaction.

401 This status code indicates an authorization error. The following OPA error code may be returned.

  • UNAUTHORIZED No valid api key and secret provided.

  • OP_OUT_OF_SCOPE The operation is not permitted.

404 This status code indicates that the requested resource is not existing in the system.

429 This status code indicates that the client sent too many requests in a specific period of time, and hit the rate limits. You should slow down the request sending or contact us to rise your limit.

HTTP 5xx

500

This status code indicates that something went wrong on the PayPay side. A few OPA error code could be returned.

  • TRANSACTION_FAILED This code means the transaction is failed on the PayPay side. You can create new transactions for the same purpose with reasonable backoff time.

  • INTERNAL_SERVER_ERROR This code means that something goes wrong, but we don't know exactly if the transaction has happened or not. It should be treated as unknown payment status.

502,503,504 Treated as unknown payment status.

Timeout

The recommended timeout setting is specified in each API. The most important one is for the payment creation api, where the read timeout should not be less than 30 seconds. When timeout happens, it should be treated as unknown payment status.

Handle unknown payment status

There are two ways to react with this situation:

  • Use the query api to query the transaction status. If the original transaction was failed or not found in PayPay, you can start a new transaction for the same purpose.
  • Or, you can cancel the transaction, if the cancel api is provided. After the cancellation is accepted, you can start a new transaction for the same purpose.

Response code list

Common response code

StatusCodeIdCodeMessage
20008100001SUCCESSSuccess
20208100001REQUEST_ACCEPTEDRequest accepted
40008100006INVALID_REQUEST_PARAMSInvalid request params
40108100023OP_OUT_OF_SCOPEThe operation is not permitted
40008100024MISSING_REQUEST_PARAMS
40108100016UNAUTHORIZEDUnauthorized request
40408100007OPA_CLIENT_NOT_FOUNDOPA Client not found
42908100998RATE_LIMITToo many requests
50008100026SERVICE_ERROR
50008101000INTERNAL_SERVER_ERRORSomething went wrong on PayPay service side
50308100999MAINTENANCE_MODESorry, we are down for scheduled maintenance

Create a QRCode

StatusCodeIdCodeMessage
40001652073DUPLICATE_DYNAMIC_QR_REQUESTDuplicate Dynamic QR request error
40000400060PRE_AUTH_CAPTURE_UNSUPPORTED_MERCHANTMerchant do not support
40000400061PRE_AUTH_CAPTURE_INVALID_EXPIRY_DATEProvided Expiry Date is above the allowed limit of Max allowed expiry days
40001650000DYNAMIC_QR_BAD_REQUESTDynamic QR bad request error

Get payment details

StatusCodeIdCodeMessage
40001652075DYNAMIC_QR_PAYMENT_NOT_FOUNDDynamic QR payment not found
40001650000DYNAMIC_QR_BAD_REQUESTDynamic QR bad request error

Delete a QRCode

StatusCodeIdCodeMessage
40001652074DYNAMIC_QR_ALREADY_PAIDDynamic QR already paid
40001650000DYNAMIC_QR_BAD_REQUESTDynamic QR bad request error
40401652072DYNAMIC_QR_NOT_FOUNDDynamic qr code not found

Cancel a Payment

StatusCodeIdCodeMessage
40000200044ORDER_NOT_REVERSIBLEOrder cannot be reversed
50000200034INTERNAL_SERVER_ERRORRequest timed out

Refund a payment

StatusCodeIdCodeMessage
40000200004INVALID_PARAMSInvalid parameters received
40000200013UNACCEPTABLE_OPOrder cannot be refunded
40000200014UNACCEPTABLE_OPMultiple refund not allowed
40000200015INVALID_PARAMSInvalid refund amount
40001103027CANCELED_USERCanceled user
40400200001RESOURCE_NOT_FOUNDOrder not found
50000200002TRANSACTION_FAILEDTransaction failed
50000200003TRANSACTION_FAILEDTransaction failed
50000800017TRANSACTION_FAILEDBalance exceeded
50000200034INTERNAL_SERVER_ERRORRequest timed out

Fetch refund status and details

StatusCodeIdCodeMessage
40400200018NO_SUCH_REFUND_ORDERRefund not found
50000200034INTERNAL_SERVER_ERRORRequest timed out

Capture a payment authorization

StatusCodeIdCodeMessage
20208300103USER_CONFIRMATION_REQUIREDUser confirmation required as requested amount is above allowed limit
40000400035UNACCEPTABLE_OPTotal transaction limit exceeds merchant limit
40000200039ALREADY_CAPTUREDCannot capture already captured acquiring order
40001103027CANCELED_USERCanceled user
40000400062HIGHER_CAPTURE_NOT_PERMITTEDMerchant not allowed to capture higher amount
40000200043ORDER_EXPIREDOrder cannot be captured or updated as it has already expired
40000200035ORDER_NOT_CAPTURABLEOrder is not capturable
40000200038REAUTHORIZATION_IN_PROGRESSOrder is being reauthorized
40000400064TOO_CLOSE_TO_EXPIRYOrder cannot be reauthorized as request is too close to expiry time

Revert a payment authorization

StatusCodeIdCodeMessage
40000200042ORDER_NOT_CANCELABLEOrder is not cancelable

License

FOSSA Status

Keywords

FAQs


Did you know?

Socket

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc