JioPay Non PCI DSS Integration Handbook v1.4.3
JioPay Non PCI DSS Integration Handbook v1.4.3
JioPay Non PCI DSS Integration Handbook v1.4.3
Integrate JioPay Direct and get paid by your users anytime and anywhere. Integrate once to solve your payment
acceptance problems and increase your online business.
JioPay Direct is a quick, easy and secure web-based integration to start accepting online payments from your
customers. We provide a seamless experience to your customers to complete payments using credit & debit
cards, UPI, net-banking and wallets.
Getting started
Well, the good news is that if you are reading this, you have already started!
This document will give you a quick understanding of the easy steps in which you can start accepting payment
online. The steps are broadly as follow:
With that background, let us take a quick look at the steps involved in integrations.
The following are the broad steps for integrating JioPay Direct services:
IMPORTANT NOTE:
Please do not hardcode the parameters. We might add few extra parameters to the response
as a part of our enhancements. However, the addition of parameters will not break the
existing functionality.
Also note that this document is intended only for the purpose of merchant integrations with
JioPay PG and is meant for merchant use only.
You will need to use the Client ID (clientId) & Client Secret (authenticateList.value) received from JioPay
(on your registered email address) in this call to get the App Access & App Identifier tokens which will be required
for calling all other services
You need to use the following end point for Authenticate API
POST https://pp-apig.jiomoney.com/jfs/v1/app/authenticate
Sample Request
Headers:
x-trace-id: 01c570cf-2bdf-49d0-a126-baec7038bbd1
Request Body:
{
"application": {
"clientId": "677e5aabb4180f4d9cf834c9d12b0b07"
},
"authenticateList": [
{
"mode": 22,
"value": "2656e2edd14e87v0b960fcf61d7a95df410e0a0b45700f38c49d9d81e71f55a4"
}
],
"scope": "SESSION",
"purpose": 2
}
Failure response:
{
"status":"FAILURE",
"error":{
"code":"30010",
"message":"Client Id is Inactive."
}
}
Parameter Description
Request Headers
x-trace- string You need to pass a unique identifier which can used for tracing the request. It can
id* be generated as UUID.
Response body
status string Status of the Authenticate call
error object Error details. (this will come up only in case of any error)
code* number Error code.
message string Error message.
session object Session object.
accessToken object Details of access token
tokenValue string This is the x-app-access-token which needs to be used in the rest of
the API calls (Intent, Status, IntentStatus, Refund)
expiresIn number Expiry time of access token (in seconds)
refreshToken object Details of refresh token
tokenValue string Refresh token value.
expiresIn number Expiry time of refresh token (in seconds)
appIdentifierToken string This is the x-appid-token which needs to be used in the rest of the
API calls (Intent, Status, IntentStatus, Refund)
Each transaction needs to be preceded with an intent to initiate the transaction. The Intent call will ensure that
details of the transaction like your order reference number (invoice) are securely exchanged over S2S calls and
that these details need not be exposed on browser based calls.
You need to use the following end point for Intent API
Sample Request
Headers:
x-trace-id: 01c570cf-2bdf-49d0-a126-baec7038bbd1,
x-app-access-token: 42385fb1-9039-4574-8d00-79ccd7f72935APPACCESS,
x-appid-token: wJdsd+2uKRDJRt8V+w0P6Y9n966FngiO0dLJ17ynuORnpubrPGuJk92y2RQkTlf7Py
Request Body:
{
"transaction": {
"idempotentKey": "$randomAlphaNum03",
"invoice": "JIO000$timestamp01",
"initiatingEntityTimestamp": "2023-04-20T18:17:32.324Z",
"initiatingEntity": {
"returnUrl": "https://psp-mandate-merchant-
sit.jiomoney.com:3003/merchantsimulator/pp/merchantstatus"
}
},
"amount": {
"netAmount": "1.23"
},
"payer": {
"externalId": "JIO1234",
"name": "test",
"email": "[email protected]",
"mobile": {
"number": "1234567890",
"countryCode": "91"
}
},
"payee": {
"merchantId": "100001000217999"
},
"checkout": {
"template": {
"id": "101"
},
"allowed": [
{
"rank": "1",
"methodType": "110",
"methodSubType": "582",
"cardType": [110,130,131]
Instead of “allowed” array, “notAllowed” array can be used inside “checkout” object, to restrict payments
modes:
"notAllowed": [
{
"methodType": "110",
"methodSubType": "582",
"cardType": [
110,
130,
131
]
}
]
Sample Response
Response body:
{
"transaction": {
"id": "10032311066145289000",
"originalId": "10032311066145289000",
"idempotentKey": "$randomAlphaNum03",
"initiatingEntityTimestamp": "2023-04-20T18:17:32.324Z",
"created": "2023-04-20T18:22:25.289Z",
"currency": 356,
"metadata": {
"x-appid-token": "AW6nGuFtestdummy9bOsm+nkonMckj1FPImL2pn8iUv9Mn7l8Mzu=",
Parameter Description
Request Headers
x-trace-id* string You need to pass a unique identifier which can used
for tracing the request. It can be generated as UUID.
x-app-access-token* string This is the (session.accessToken.tokenValue)
received in the response of the Authenticate call.
x-appid-token* string This is the (session.appIdentifierToken) received
in the response of the Authenticate call.
Request Body
transaction object
idempotentKey* number max length 36. This is a unique ID which you need
to generate to uniquely identify each request.
Response body
transaction object
id number This is unique Intent ID provided to you by JioPay for each
unique Intent API request. You will have to store this in your records to
fetch the details of transactions initiated using the Intent ID in case
of those transactions where the response is not received within the
expected timelines.
originalId number In case of Intent API, this value will be same as the Intent ID.
idempotentKey number the transaction.idempotentKey provided by you in the
request of Intent API
initiatingEntityTimestamp number timestamp as provided by you in the request of Intent API
created string Time (in ISO format) at which the intent was initiated
currency number ISO Currency Code
mode number defines the mode of the payment. The value will be 1 for online
payments.
1 – online / card not present
2 – card present
method object this is the object for type of transaction
type number defines the type of transaction
110 – PURCHASE
211 – REFUND
212 – UPI Intent
300 – INTENT
metadata object
x-appid-token string This is the token to pass in checkout page request which is
received in the response.
x-app-access-token string This is the token to pass in checkout page request which is
received in the response.
status string This provides the status of the intent.
INITIATED –Intent is initiated successfully.
You need to use the following end point for invoking the Checkout Page
POST https://pp-checkout.jiopay.com:8443
Parameter Description
string Pass the Merchant id (MID) provided by JioPay. This is a unique
mid*
identifier for your account.
S2S Callback
The S2S Callback will be sent to you once the transaction is successful or at the pre-defined closure time
for the intent. The default closure time for an intent is around 35 minutes.
If there is no successful transaction for the intent within the defined closure time, you will receive a failed
response in S2S.
You need to store the transaction ID (transactionList.transaction.id) received in the S2S Callback
in your records. You will need this to check the validate the browser response as well.
The response will contain an array (transactionList) of all transactions attempted for the Intent ID
(intentDetails.id). You will have to consider the transaction where the
transactionList.transaction.status is SUCCESS.
Sample Callback
Body:
{
"transactionList": [
{
"transaction": {
"id": "10232104375554549000",
"originalId": "10232104375554549000",
"idempotentKey": "iytfTDLj",
"initiatingEntityTimestamp": "2021-02-12T20:58:50.126Z",
"created": "2021-02-12T20:59:14.549Z",
"currency": 356,
"mode": 1,
"method": {
"type": 110,
"subType": 581
},
"status": "SUCCESS",
"application": 8006,
"livemode": true,
"initiatingEntity": {
"entityId": 2103,
"callbackUrl": "http://psp-mandate-merchant-
sit.jiomoney.com:3003/merchantsimulator",
"returnUrl": "http://psp-mandate-merchant-
sit.jiomoney.com:3003/merchantsimulator/pp/merchantstatus"
},
"invoice": "JIO0000001",
"responseTime": "2021-02-12T21:00:14.549Z",
"processorTransactionId": "U1230001833389",
"intentId": "10202104375530484000",
"referenceNumber": "190000028212"
},
"amount": {
"netAmount": 1.0,
"grossAmount": 1.0
},
"payer": {
"externalId": "test123",
"name": "test",
"email": "[email protected]",
"bankId": "1016",
"bankName": "Canara Bank",
Card Transaction
"payer":{
"externalId":"test123",
Parameter Description
transactionList object an array containing transaction list
transaction object the transaction object
id number unique transaction ID
originalId number same as the unique transaction ID
idempotentKey number idempotent key which has been generated by the checkout
page for each transaction
initiatingEntityTimestamp number the value which was provided in the request of Intent API
created string Time (in ISO format) at which the transaction was initiated.
currency number ISO Currency Code
failureCode string it will contain a code for the failure and will be present in
case the status is FAILED
failureMessage string it will contain the failure reason and will be present in case
the status is FAILED
mode number defines the mode of the payment. The value will be 1 for
online payments.
1 – online / card not present
2 – card present
method object This is the object for type of transaction and details of
payment method
type number defines the type of transaction
110 – PURCHASE
211 – REFUND
212 – UPI Intent (use with subtype 580)
300 – INTENT
invoice string This the same invoice value provided by you in the request
of Intent API
responseTime string this is for future use
amount object
netAmount number the netAmount provided by you in the request of Intent API
grossAmount number this is for future use
GET returnUrl?tid={transactionID}
If you have received the browser based response, however the record for the same is not available in your
backend, you will have to call the Status API using the tid (received in query parameter) to get the status of a
transaction.
Status API
This API is used to check the status of a transaction using the transaction ID (tid) received as a query parameter
in the browser response from the JioPay payment page after completion of a transaction.
Please use intentId from the response to match the same with your backend. The intentId is the
transaction.id which you would have received in the response of the Intent API.
You need to use the following end point for Status API
POST https://pp-apig.jiomoney.com/payments/jfs/v2/payments/status
Sample Request
Headers:
x-trace-id:01c570cf-2bdf-49d0-a126-baec7038bbd1,
x-app-access-token: 42385fb1-9039-4574-8d00-79ccd7f72935APPACCESS,
x-appid-token: wJdsd+2uKRDJRt8V+w0P6Y9n966FngiO0dLJ17ynuORnpubrPGuJk92y2RQkTlf7Py
Sample Response
Response body:
{
"transactionList": [
{
"transaction": {
"id": "10592102958465711000",
"originalId": "10592102958465711000",
"idempotentKey": "lvcFpTnr",
"initiatingEntityTimestamp": "2021-01-29T16:12:46.999Z",
"created": "2021-01-29T16:14:25.711Z",
"currency": 356,
"mode": 1,
"status": "SUCCESS",
"application": 8006,
"livemode": true,
"initiatingEntity": {
"returnUrl": "http://sit.jiomoney.com:3003/sit/merchantstatus"
},
"invoice": "JIO0000001",
"responseTime": "2021-01-29T16:15:25.711Z",
"processorTransactionId": "U1230001814107",
"intentId": "10592102958413022000",
"referenceNumber": "190000063821"
},
"amount": {
"netAmount": 1
},
"payer": {
"externalId": "test123",
"name": "test",
"email": "[email protected]",
"bankId": "2006",
"bankName": "Mobikwik"
},
"payee": {
"terminalId": "10232760",
"merchantId": "100001000217423",
"mobile": {
"countryCode": "+91",
"number": "8169619527"
}
}
}
]
}
Request Body
transactionId* string the transaction ID of the transaction for which you need to check the status
Response Body
The response body for Status API follows the same structure as the S2S Callback, except for the fact that it doesn’t
contain the intentDetails object. Please refer the S2S Callback parameter description.
You need to use the following end point for Refund API
POST https://pp-apig.jiomoney.com/payments/jfs/v1/refunds
Sample Request
Headers:
x-trace-id:01c570cf-2bdf-49d0-a126-baec7038bbd1,
x-app-access-token: 42385fb1-9039-4574-8d00-79ccd7f72935APPACCESS,
x-appid-token: wJdsd+2uKRDJRt8V+w0P6Y9n966FngiO0dLJ17ynuORnpubrPGuJk92y2
Request Body:
{
"transaction":{
"originalId":"10712031500413657000",
"idempotentKey":"1Bhtn6fxjW",
"invoice":"test",
"initiatingEntityTimestamp":"2020-11-10T02:13:56.604Z"
},
Sample Response
Response Body:
{
"transaction":{
"id":"10202104632378846000",
"originalId":"10712031500413657000",
"idempotentKey":"z4SGzjomw6",
"object":"refund",
"arrivalDate":"2021-02-15T09:00:08.846Z",
"initiatingEntityTimestamp":"2021-02-15T08:59:37.960Z",
"created":"2021-02-15T08:59:38.846Z",
"currency":356,
"livemode":true,
"mode":1,
"method":{
"type":211,
"subType":581
},
"captureMethod":1,
"status":"ACCEPTED",
"application":2103,
"initiatingEntity":{
"entityId":2103,
"callbackUrl":"http://localhost:9002/jfs/v1/plan"
},
"processingEntity":5151,
"invoice":"test",
"responseTime":"2021-02-15T09:00:38.846Z",
"processorTransactionId":"U1230001627396",
"referenceNumber":"190000004149"
},
"amount":{
"netAmount":0.02,
"grossAmount":0.02
}
}
Parameter Description
Request Headers
x-trace-id* string You need to pass a unique identifier which can used for tracing the request. It
can be generated as UUID.
Request Body
transaction Object
originalId* number transaction ID of the transaction to be refunded
idempotentKey* number max length 36. This is a unique ID which you need to generate
to uniquely identify each request.
invoice string the Order Id for the transaction. This can be same across more
than 1 transaction requests if the purchase is intended for the same
order/cart.
initiatingEntityTimestamp* number pass the timestamp in ISO format.
amount object
netAmount* number the amount to be refunded
}
Response Body
transaction object
id number transaction ID generated for the refund request
originalId number transaction ID which is to be refunded as provided by you in
the request of Refund API
idempotentKey number idempotent key which has been generated by JioPay for the
refund request
object string defines type of object. The value will be refund for this API.
arrivalDate string this is for future use
initiatingEntityTimestamp number the value which was provided in the request of Refund API
created string Time (in ISO format) at which the refund was initiated
currency number ISO Currency Code
livemode boolean the value for this will be set to true for all
intents/transactions/refund for now
mode number defines the mode of the payment. The value will be 1 for online
payments.
1 – online / card not present
2 – card present
method object This is the object for type of transaction and details of payment
method
You need to use the following end point for Refund API
POST https://pp-apig.jiomoney.com/payments/jfs/v1/payments/intentStatus
Sample Request
Headers:
x-trace-id:01c570cf-2bdf-49d0-a126-baec7038bbd1,
x-app-access-token: 42385fb1-9039-4574-8d00-79ccd7f72935APPACCESS,
x-appid-token: wJdsd+2uKRDJRt8V+w0P6Y9n966FngiO0dLJ17ynuORnpubrPGuJk92y2
Request Body:
{
"transactionId":"10202104375530484000"
}
Sample Response
Response Body:
{
"transactionList":[
{
"transaction":{
"id":"10232104375554549000",
"originalId":"10232104375554549000",
"idempotentKey":"iytfTDLj",
"initiatingEntityTimestamp":"2021-02-12T20:58:50.126Z",
"created":"2021-02-12T20:59:14.549Z",
"currency":356,
"mode":1,
"method":{
"type":110,
"subType":581
},
"status":"SUCCESS",
"application":8006,
"livemode":true,
"initiatingEntity":{
"entityId":2103,
"callbackUrl":"http://psp-mandate-merchant-
sit.jiomoney.com:3003/merchantsimulator",
Request Body
transactionId* string the Intent ID for which you need to check the status
Response Body
The response body for IntentStatus API follows the same structure as the S2S Callback. Please refer the S2S
Callback parameter description.
Error Codes
Error codes are captured in two ways for all the APIs.
{
"transaction": {
"id": "10862136337856047000",
"originalId": "10862136337856047000",
"idempotentKey": "autopay_card_preprocess_1640754056",
"object": "payment",
"arrivalDate": "2021-12-29T10:31:26.047Z",
"standingInstruction": {
"scheduledAt": "2021-12-29T10:30:55.837Z",
"uniqueMandateNumber": "1771787178074593792"
},
"initiatingEntityTimestamp": "2021-12-29T10:30:55.837Z",
"created": "2021-12-29T10:30:56.047Z",
"currency": 356,
The comprehensive list of error codes shall be shared as a separate file. The error codes follow the logic as
specified below:
Support
If you have any queries regarding the integration, raise a concern to [email protected]. For any kind of
merchant queries or complaints in production, please raise a concern to [email protected]
Production endpoints
Authenticate https://apig.jiomoney.com/jfs/v1/app/authenticate
Intent https://apig.jiomoney.com/payments/jfs/v1/payments/intent
Pre-process https://apig.jiomoney.com/payments/jfs/v1/mandate/preprocess
Execute https://apig.jiomoney.com/payments/jfs/v1/mandate/execute
Checkout Page https://checkout.jiopay.com/
PaymentStatus https://apig.jiomoney.com/payments/jfs/v2/payments/status
Refund https://apig.jiomoney.com/payments/jfs/v1/refunds
IntentStatus https://apig.jiomoney.com/payments/jfs/v1/payments/intentStatus