Skip to main content

3RI payments

Version 2.2 of EMV 3DS Specification introduces 3RI payments that enables merchants to obtain authentication data (CAVV, ECI) in the absence of the cardholder for previously authenticated transactions. 3RI Payments can be used to enable merchants to effectively manage some complex payment use cases such as delayed and partial/split shipments.

IMPORTANT

Partial/split shipments and Delayed shipments are available only for credit cards.

Partial/split shipments

Partial or split shipment is a use case where some ordered products on the merchants web shop are not all available at the time of purchase/placing the order and the merchant decides to ship them separately. The cardholder would authenticate the total amount of the purchase, and the merchant would authorize and capture the amount of the first shipment while the cardholder is still in session. The merchant can authorize subsequent shipments by using MIT transactions.

Delayed shipments

Delayed shipment is a use case where merchant receives an order from a customer that will be fulfilled in a single shipment. The merchant knows that the goods could not be delivered within 7 days or there is an unexpected delay preventing the delivery within 7 days from the initial authorization. For both cases, the merchant can capture the transactions after 7 days from the authorization and up to maximum of 90 days. In this case, the amount of the order is known and not expected to change.

info

If the capture is triggered within 7 days for the delayed shipment, the transaction will automatically be processed as a regular transaction, and not 3RI.

Example use cases

  • pre-order of a product or a service
  • item temporarily out of stock

Process Flow – Partial/split shipment

1st shipment / CIT flow

  1. In the CIT flow for the first shipment, the merchant calls Create Checkout API and provides the total amount of the shipment/purchase (e.g. 100 €) as part of the Deal object and the amount of the 1st shipment (e.g. 70 €) which will be charged to the customer immediately as part of the payment object. Create Checkout is called for a one-off guest payment (without the Customer Account ID specified) or for an existing customer (with the Customer Account ID specified), alongside the secret Merchant Key which authorizes the request.

Create checkout request

Path:

POST {Base URL}/payment/creation

Header:

Content-Type: application/json
Accept-Language: en-US
{ 
"merchantKey": "9cc8b7e5-9fa8-46bc-b2c1-0dd1493e88aa",
"customerAccountId": "Test-fdkhjshkfjshjk",
"payment": {
"currencyCode": "EUR",
"amount": 50.00,
"description": "SMP-Transaction-01"
},
"deal": {
"typeCode": "3RIPSS",
"amount": 100.00
},
"billingAddress": {
"addressLine1": "Leopoldstrasse",
"number": "244",
"city": "Munich",
"postCode": "80807",
"countryCode": "DE"
},
"shippingAddress": {
"addressLine1": "Leopoldstrasse",
"number": "244",
"city": "Munich",
"postCode": "80807",
"countryCode": "DE"
},
"consumer": {
"emailAddress": "hells.fssrfs@mail.com",
"gender": "f",
"lastName": "Hells",
"firstName": "Butcher",
"middleName": "fon",
"title": "Mrs",
"culture": "en-en",
"dateOfBirth": "2000-01-01",
"mobilePhone": "015xx22-2135466",
"taxId": "00745948504594"
},

}

Create checkout response

Status Code:

200 (OK)

Header:

Content-Type: application/json
Accept-Language: en-US
{
"transactionId": "11c64134-910a-47c5-a24c-c9171f6d23c8",
"checkoutToken": "w8PIFOlK6sdf410ZAAQZQ2TmdpK2xYVgj1PD3LJNGeXI3Bastj9b1NVEKSUfmPAf",
"paymentStatus": "CREATED",
"requestTime": "2024-01-23T09:20:22.550Z"
}
  1. SmartPay provides a Checkout Token that the merchant webshop uses to render SmartPay Widget.
  2. The customer securely submits their payment information via the initialized SmartPay Widget designed for Partial/split shipment flow.
  3. SmartPay returns the Deal reference (which will be used to authorize subsequent shipments).
  4. Merchant calls SmartPay Capture API method with the amount of the 1st shipment.
info

It is possible to use Partial/split shipments with auto-capture functionality.

Capture request

Path:

POST {Base URL}/payment/capture

Header:

Content-Type: application/json
Accept-Language: en-US
{
"transactionId": "11c64134-910a-47c5-a24c-c9171f6d23c8",
"merchantKey": "9cc8b7e5-9fa8-46bc-b2c1-0dd1493e88aa",
"modifiedAmount": {
"amount": 50,
"currencyCode": "EUR",
"description": "SMP-Transaction-01"
},
"modificationId": "{{$guid}}"
}

Capture response

Status Code:

200 (OK)

Header:

Content-Type: application/json
Accept-Language: en-US
{
"description": "SMP-Transaction-01",
"creationDate": "2024-01-23T09:20:22.511Z",
"lastStatusDate": "2024-01-23T09:25:06.653Z",
"paymentStatus": "CAPTURED",
"reconciliationReferenceId": "ieK6OFHguFsGNNTWFojlr",
"transactionOverview": {
"transactionId": "11c64134-910a-47c5-a24c-c9171f6d23c8",
"paymentMethod": "VISA",
"customerAccountId": "Test",
"amount": 50,
"currencyCode": "EUR",
"mit": false,
"deal": {
"amount": 100,
"dealReference": "Ok5BsJWjwDYrzhBBDqgYy",
"typeCode": "3RIPSS"
}
},
"modification": {
"modificationData": {
"type": "CAPTURE",
"modificationId": "sava68d156ca-a953-431a-84a2-fb90fa2c0a05",
"reconciliationReferenceId": "ieK6OFHguFsGNNTWFojlr"
},
"creationDate": "2024-01-23T09:25:05.743Z",
"modificationAmount": {
"amount": 50,
"currencyCode": "EUR",
"description": "SMP-Transaction-01"
},
"status": "CAPTURED",
"lastStatusDate": "2024-01-23T09:25:06.653Z",
"statusHistory": [
{
"status": "CAPTURE_PENDING",
"statusDate": "2024-01-23T09:25:05.743Z",
"modificationAmount": {
"amount": 50,
"currencyCode": "EUR",
"description": "SMP-Transaction-01"
}
},
{
"status": "CAPTURED",
"statusDate": "2024-01-23T09:25:06.653Z",
"modificationAmount": {
"amount": 50,
"currencyCode": "EUR",
"description": "SMP-Transaction-01"
}
}
]
}
}

Capture is only necessary if you don't have auto-capture enabled.

Get Status request

Path:

GET https://{Base URL}/payment/status/11c64134-910a-47c5-a24c-c9171f6d23c8

Header:

Content-Type: application/json
Accept-Language: en-US

Get Status response

Status Code:

200 (OK)

Header:

Content-Type: application/json
Accept-Language: en-US
{
"description": "SMP-Transaction-01",
"paymentStatus": "CAPTURED",
"creationDate": "2024-01-23T09:20:22.511Z",
"statusHistory": [
{
"status": "CREATED",
"statusDate": "2024-01-23T09:20:22.512Z",
"modificationAmount": {
"currencyCode": "EUR",
"description": "SMP-Transaction-01",
"amount": 50
}
},
{
"status": "AUTHORIZATION_INITIALIZED",
"statusDate": "2024-01-23T09:21:11.038Z",
"modificationAmount": {
"description": "SMP-Transaction-01",
"amount": 50,
"storedPaymentOptionReference": "8ac7a49f8ce96ce5018ce970b1f908e5",
"currencyCode": "EUR",
"option": "VISA"
}
},
{
"status": "AUTHORIZATION_COMPLETED",
"statusDate": "2024-01-23T09:21:19.478Z",
"modificationAmount": {
"description": "SMP-Transaction-01",
"amount": 50,
"storedPaymentOptionReference": "8ac7a49f8ce96ce5018ce970b1f908e5",
"currencyCode": "EUR",
"option": "VISA"
}
},
{
"status": "CAPTURE_PENDING",
"statusDate": "2024-01-23T09:25:05.743Z",
"modificationAmount": {
"currencyCode": "EUR",
"description": "sdaads",
"amount": 50
}
},
{
"status": "CAPTURED",
"statusDate": "2024-01-23T09:25:06.653Z",
"modificationAmount": {
"currencyCode": "EUR",
"description": "SMP-Transaction-01",
"amount": 50
}
}
],
"modifications": [
{
"modificationData": {
"type": "CAPTURE",
"modificationId": "68d156ca-a953-431a-84a2-fb90fa2c0a05",
"reconciliationReferenceId": "ieK6OFHguFsGNNTWFojlr"
},
"creationDate": "2024-01-23T09:25:05.743Z",
"modificationAmount": {
"currencyCode": "EUR",
"description": "SMP-Transaction-01",
"amount": 50
},
"status": "CAPTURED",
"lastStatusDate": "2024-01-23T09:25:06.653Z",
"statusHistory": [
{
"status": "CAPTURE_PENDING",
"statusDate": "2024-01-23T09:25:05.743Z",
"modificationAmount": {
"currencyCode": "EUR",
"description": "SMP-Transaction-01",
"amount": 50
}
},
{
"status": "CAPTURED",
"statusDate": "2024-01-23T09:25:06.653Z",
"modificationAmount": {
"currencyCode": "EUR",
"description": "SMP-Transaction-01",
"amount": 50
}
}
]
}
],
"lastStatusDate": "2024-01-23T09:25:06.653Z",
"reconciliationReferenceId": "ieK6OFHguFsGNNTWFojlr",
"transactionOverview": {
"transactionId": "11c64134-910a-47c5-a24c-c9171f6d23c8",
"paymentMethod": "VISA",
"customerAccountId": "Test",
"amount": 50,
"currencyCode": "EUR",
"mit": false,
"deal": {
"amount": 100,
"dealReference": "Ok5BsJWjwDYrzhBBDqgYy",
"typeCode": "3RIPSS"
}
}
}
info

Get status API is needed to obtain the deal reference only in case auto capture is enabled.

Subsequent shipments (2nd, 3rd etc.) / MIT Flow

  1. Once the goods are ready to be shipped (e.g. 2nd or 3rd shipment etc.), the merchant calls the authorization for merchant-initiated transaction (MIT) with the corresponding deal ID and amount.
  2. Once the authorization was successful the merchant calls Capture API to capture the amount of the authorized amount.

Create MIT request

Path:

POST {Base URL}/payment/mit

Header:

Content-Type: application/json
Accept-Language: en-US
{
"merchantKey": "9cc8b7e5-9fa8-46bc-b2c1-0dd1493e88aa",
"modificationId": "{{$guid}}",
"customerAccountId": "Test",
"payment": {
"currencyCode": "EUR",
"amount": 10.11,
"description": "Purchase MIT"
},
"consumer": {
"emailAddress": "hells.fssrfs@mail.com ",
"customerGroupId": "VIP",
"gender": "m",
"lastName": "Hells",
"firstName": "Butcher",
"middleName": "fon",
"title": "Mr",
"culture": "de-de",
"dateOfBirth": "2000-01-01",
"mobilePhone": "015xx22-2135466",
"isBusinessUser": false,
"taxId": "00745948504594"
},
"billingAddress": {
"address": "Leopoldstrasse",
"number": "244",
"city": "Munich",
"postCode": "80807",
"countryCode": "DE"
},
"deal": {
"dealReference": "Ok5BsJWjwDYrzhBBDqgYy"
}
}

Create MIT response

Status Code:

200 (OK)

Header:

Content-Type: application/json
Accept-Language: en-US
{
"description": "Purchase MIT",
"paymentStatus": "AUTHORIZATION_COMPLETED",
"creationDate": "2024-01-23T09:29:04.011Z",
"lastStatusDate": "2024-01-23T09:29:07.145Z",
"transactionOverview": {
"transactionId": "5f3d871b-a494-4f1b-ad80-2b31fb248387",
"customerAccountId": "Test",
"amount": 10.11,
"currencyCode": "EUR",
"mit": true,
"deal": {
"dealReference": "Ok5BsJWjwDYrzhBBDqgYy"
}
},
"reconciliationReferenceId": "QF1YLd7kAPirzVQikI53t",
"modificationId": "239125d5-298d-4ec1-83ed-247375f20a26"
}
important

The total amount of all subsequent MIT shipments cannot exceed the full amount of the deal (e.g. if the total amount is 100€, 1st shipment is 50€ and 2nd shipment is 20€, the maximum allowed amount of subsequent shipments is 30€).

Process Flow – Delayed shipment

  1. In the CIT flow for the delayed shipment, the merchant calls Create Checkout API and provides the information that the deal will be delayed via the Deal object. In case of the delayed shipment, the dealAmount of the shipment/purchase is not mandatory. Create Checkout is called for a one-off guest payment (without the Customer Account ID specified) or for an existing customer (with the Customer Account ID specified), alongside the secret Merchant Key which authorizes the request.

Create checkout request

Path:

POST {Base URL}/payment/creation

Header:

Content-Type: application/json
Accept-Language: en-US
{ 
"merchantKey": "9cc8b7e5-9fa8-46bc-b2c1-0dd1493e88aa",
"customerAccountId": "Test",
"payment": {
"currencyCode": "EUR",
"amount": 50.00,
"description": "SMP-Transaction-01"
},
"deal": {
"typeCode": "3RIDS"
},
"billingAddress": {
"addressLine1": "Leopoldstrasse",
"number": "244",
"city": "Munich",
"postCode": "80807",
"countryCode": "DE"
},
"shippingAddress": {
"addressLine1": "Leopoldstrasse",
"number": "244",
"city": "Munich",
"postCode": "80807",
"countryCode": "DE"
},
"consumer": {
"emailAddress": "hells.fssrfs@mail.com ",
"gender": "f",
"lastName": "Hells",
"firstName": "Butcher",
"middleName": "fon",
"title": "Mrs",
"culture": "en-en",
"dateOfBirth": "2000-01-01",
"mobilePhone": "015xx22-2135466",
"taxId": "00745948504594"
},
}

Create checkout response

Status Code:

200 (OK)

Header:

Content-Type: application/json
Accept-Language: en-US
{
"transactionId": "eef74740-d6b3-49c1-81d1-7b3a36696a8d",
"checkoutToken": "wqllvxhdImwumFVRWLIb1i37612cvluhEZqbxqhD0ezVKelaIcbyl3cTF87oiX67",
"paymentStatus": "CREATED",
"requestTime": "2024-01-23T09:38:44.502Z"
}
  1. SmartPay provides a Checkout Token that the merchant webshop uses to render SmartPay Widget.
  2. The customer securely submits their payment information via the initialized SmartPay Widget.
  3. Afterwards, when the shipment is due (maximum within 90 days from the initial authorization), the Capture Transaction API method is called, and appropriate message is displayed. In case the capture was successful, the merchant can ship the goods to the customer. In case the capture failed, an appropriate error message is displayed i.e. failed capture would indicate that the cardholder's bank has declined the payment.
important

It is not possible to use 3RI delayed shipment with auto-capture functionality.

important

Capture must be triggered within 90 days of the initial authorization.

SmartPay Widget design

Our SmartPay SDKs are made up of light-weight libraries which allows to securely collect payment option details. This approach maintains a SAQ-A compliant payment-form solution while enabling you to build forward compatible web or mobile experiences which seamlessly combine your corporate identity with the required functionalities whilst adding some additional ancillary functions to ease integration.

Example of the SmartPay Widget design for the 3RI use cases for Guest Payment

Registered User Widget

Example of the SmartPay Widget design for 3RI use cases for the existing users (Payment credential vault)

The customer can select one of the existing stored cards to complete the payment or use a new card. Guest Payment Widget

info

The customer can use “Save payment info to pay faster next time". This option is only possible for technical account payments i.e. where customerID is provided. The newly stored card can be used also for other payments by the customer.