3RI payments

Last changes: 01-25-2024

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.  

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.

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"
}

2. SmartPay provides a Checkout Token that the merchant webshop uses to render SmartPay Widget. 

3. The customer securely submits their payment information via the initialized SmartPay Widget designed for Partial/split shipment flow.  

4. SmartPay returns the Deal reference (which will be used to authorize subsequent shipments). 

5. Merchant calls SmartPay Capture API method with the amount of the 1st shipment. 

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.00, 
        "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", 
        "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" 
                } 
            } 
        ] 
    } 
} 

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", 
        "deal": { 
            "amount": 100, 
            "dealReference": "Ok5BsJWjwDYrzhBBDqgYy", 
            "typeCode": "3RIPSS" 
        } 
    } 
} 

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

Path:

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" 
} 

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" 
} 

Process Flow – Delayed shipment

2. SmartPay provides a Checkout Token that the merchant webshop uses to render SmartPay Widget. 

3. The customer securely submits their payment information via the initialized SmartPay Widget. 

4. 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.

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

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.