Postman testing
The following videos walk through how recurring payments work using our Postman collection, to help your integration.
Initiate and use a new recurring payment
Video outline
-
Prerequisites
- You need to be able to send the 3DS2 mandatory parameters (BrowserInfo & IpAddress)
-
User registration [0:23]
- Register a user
- Register the user’s card
-
Recurring registration [2:26]
- Register a recurring payment
- Response from the registration object [3:21]
-
Payment processing
- Execute a pay-in with the end user present (CIT) [3:50]
- Response from the pay-in object [4:30]
- Check the status of the recurring pay-in [4:59]
- Check the status of the registration [5:31]
- Execute a pay-in in the absence of the end user (MIT) [6:01]
- Response from the pay-in object [6:28]
- Check the status of the registration [6:54]
Migrate an existing recurring payment
-
Recurring registration
-
Payment processing
- Successful migration [1:05]
- Execute a pay-in in the absence of the end user (MIT)
- Response (Status: SUCCESS) [1:31]
- Check the status of the registration [1:50]
- Unsuccessful migration [2:20]
- Execute a pay-in in the absence of the end user (MIT)
- Response (Status: FAILED) [2:42]
- Check the status of the registration [3:06]
Cards
To test this functionality in the sandbox, you can use the cards presented here. We recommend using the card simulating a challenge flow.
Mocks
A specific set of mocks has been put in place to simulate errors that can occur when working with recurring objects.
This mock can be used by creating a Recurring PayIn Registration object (using the POST …/recurringpayinregistrations
endpoint) with specific values for the following parameters:
FirstTransactionDebitedFunds.Amount
– 33501 (to test a CIT)NextTransactionDebitedFunds.Amount
– 33501 (to test a MIT)Billing.Address.Addressline2
– Select one of the codes in the table below to obtain the corresponding use case.
Once your recurring registration object is created, you’ll need to post the desired recurring payin with the resgistration’s RecurringPayinRegistrationId
value to generate the error:
- Create a Recurring PayIn CIT –
POST …/payins/recurring/card/direct
- Create a Recurring PayIn MIT –
POST …/payins/recurring/card/direct
Use case | Mock code for Billing Address line 2 | Returned ResultCode | Returned result message |
---|---|---|---|
To simulate a failed payin | 01100 | 101101 | Transaction refused by the bank (Do not honor) |
To simulate a failed payin due a reached card limit | 01116 | 101199 | Transaction refused by the bank (card limit reached) |
To simulate a failed payin due to an inactive card | 01125 | 101106 | The card is inactive |
To simulate a re-authentication request from a bank (during an MIT) | 01131 | 101305 | Soft decline |
To simulate a failed SCA (during a CIT) | 03022 | 101301 | Secure mode: 3DS authentication has failed |
Example of Recurring PayIn Registration for mock CIT:
{
"AuthorId" : {{USER_ID_BUYER}},
"CardID" : {{cardID}},
"CreditedUserId" : {{USER_ID_BUYER}},
"CreditedWalletId" : {{BUYER_WALLET_ID}},
"Migration": false,
"FirstTransactionDebitedFunds" : {
"Currency" : "EUR",
"Amount" : 33501
},
"FirstTransactionFees" : {
"Currency" : "EUR",
"Amount" : 0
},
"Billing" : {
"FirstName": "Jane",
"LastName": "Doe",
"Address": {
"AddressLine1": "1 Mangopay Street",
"AddressLine2": "01131",
"City": "Paris",
"Region": "Ile de France",
"PostalCode": "75001",
"Country": "FR"
}
},
"Shipping" : {
"FirstName": "Jane",
"LastName": "Doe",
"Address": {
"AddressLine1": "1 Mangopay Street",
"AddressLine2": "The Loop",
"City": "Paris",
"Region": "Ile de France",
"PostalCode": "75001",
"Country": "FR"
}
}
}
Example of Recurring PayIn Registration for mock MIT:
{
"AuthorId" : {{USER_ID_BUYER}},
"CardID" : {{cardID}},
"CreditedUserId" : {{USER_ID_BUYER}},
"CreditedWalletId" : {{BUYER_WALLET_ID}},
"Migration": false,
"FirstTransactionDebitedFunds" : {
"Currency" : "EUR",
"Amount" : 4000
},
"FirstTransactionFees" : {
"Currency" : "EUR",
"Amount" : 0
},
"Billing" : {
"FirstName": "Jane",
"LastName": "Doe",
"Address": {
"AddressLine1": "1 Mangopay Street",
"AddressLine2": "01100",
"City": "Paris",
"Region": "Ile de France",
"PostalCode": "75001",
"Country": "FR"
}
},
"Shipping" : {
"FirstName": "Jane",
"LastName": "Doe",
"Address": {
"AddressLine1": "1 Mangopay Street",
"AddressLine2": "The Loop",
"City": "Paris",
"Region": "Ile de France",
"PostalCode": "75001",
"Country": "FR"
}
},
"NextTransactionDebitedFunds" : {
"Currency" : "EUR",
"Amount" : 33501
},
"NextTransactionFees" : {
"Currency" : "EUR",
"Amount" : 0
}
}
Worked examples
Create a Recurring PayIn Registration
This call shows how to register a recurring payment for a subscription (CLASSIC_SUBSCRIPTION), which contains all information from the beginning. This information therefore cannot be modified during the recurrence. For more information, please see the introduction.
POST /recurringpayinregistrations
{
"AuthorId" : {{USER_ID_BUYER}},
"CardID" : {{cardID}},
"CreditedUserId" : {{USER_ID_BUYER}},
"CreditedWalletId" : {{BUYER_WALLET_ID}},
"FirstTransactionDebitedFunds" : {
"Currency" : "EUR",
"Amount" : 6010
},
"FirstTransactionFees" : {
"Currency" : "EUR",
"Amount" : 0
},
"Billing" : {
"FirstName": "Recurring",
"LastName": "Payment",
"Address": {
"AddressLine1": "1 Mangopay Street",
"AddressLine2": "The Loop",
"City": "Paris",
"Region": "Ile de France",
"PostalCode": "75001",
"Country": "FR"
}
},
"Shipping" : {
"FirstName": "Recurring",
"LastName": "Payment",
"Address": {
"AddressLine1": "1 Mangopay Street",
"AddressLine2": "The Loop",
"City": "Paris",
"Region": "Ile de France",
"PostalCode": "75001",
"Country": "FR"
}
},
"EndDate" : 1704013755,
"Frequency" : "MONTHLY",
"FixedNextAmount" : true,
"FractionedPayment" : false,
"NextTransactionDebitedFunds" : {
"Currency" : "EUR",
"Amount" : 5525
},
"NextTransactionFees" : {
"Currency" : "EUR",
"Amount" : 0
}
}
Response
{
"Id": "6647993",
"Status": "CREATED",
"CurrentState": {
"PayinsLinked": 0,
"CumulatedDebitedAmount": {
"Currency": "EUR",
"Amount": 0
},
"CumulatedFeesAmount": {
"Currency": "EUR",
"Amount": 0
},
"LastPayinId": null
},
"RecurringType": "CLASSIC_SUBSCRIPTION",
"TotalAmount": {
"Currency": "EUR",
"Amount": 166235
},
"CycleNumber": 30,
"AuthorId": "6647989",
"CardId": "6647992",
"CreditedUserId": "6647989",
"CreditedWalletId": "6647990",
"Billing": {
"FirstName": "Recurring",
"LastName": "Payment",
"Address": {
"AddressLine1": "1 Mangopay Street",
"AddressLine2": "The Loop",
"City": "Paris",
"Region": "Ile de France",
"PostalCode": "75001",
"Country": "FR"
}
},
"Shipping": {
"FirstName": "Recurring",
"LastName": "Payment",
"Address": {
"AddressLine1": "1 Mangopay Street",
"AddressLine2": "The Loop",
"City": "Paris",
"Region": "Ile de France",
"PostalCode": "75001",
"Country": "FR"
}
},
"EndDate": 1704013755,
"Frequency": "Monthly",
"FixedNextAmount": true,
"FractionedPayment": false,
"FreeCycles": 0,
"FirstTransactionDebitedFunds": {
"Currency": "EUR",
"Amount": 6010
},
"FirstTransactionFees": {
"Currency": "EUR",
"Amount": 0
},
"NextTransactionDebitedFunds": {
"Currency": "EUR",
"Amount": 5525
},
"NextTransactionFees": {
"Currency": "EUR",
"Amount": 0
},
"Migration": false
}
Create a Recurring PayIn - CIT
POST /payins/recurring/card/direct
{
"RecurringPayinRegistrationId" : {{RecurringID}},
"StatementDescriptor" : "test",
"Tag" : "CIT test",
"SecureModeReturnURL": "http://www.my-site.com/returnURL",
"IpAddress": "2001:0620:0000:0000:0211:24FF:FE80:C12C",
"BrowserInfo": {
"AcceptHeader": "application/json,text/javascript,*/*;q=0.01<",
"JavaEnabled": true,
"Language": "fr",
"ColorDepth": 32,
"ScreenHeight": 667,
"ScreenWidth": 375,
"TimeZoneOffset": "-120",
"UserAgent": "Mozilla/5.0 (iPhone; CPU iPhone OS 13_6_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148",
"JavascriptEnabled": true
}
}
Response
{
"Id": "6647994",
"Tag": "CIT test",
"CreationDate": 1626796618,
"AuthorId": "6647989",
"CreditedUserId": "6647989",
"DebitedFunds": {
"Currency": "EUR",
"Amount": 6010
},
"CreditedFunds": {
"Currency": "EUR",
"Amount": 6010
},
"Fees": {
"Currency": "EUR",
"Amount": 0
},
"Status": "CREATED",
"ResultCode": null,
"ResultMessage": null,
"ExecutionDate": null,
"Type": "PAYIN",
"Nature": "REGULAR",
"CreditedWalletId": "6647990",
"DebitedWalletId": null,
"PaymentType": "CARD",
"ExecutionType": "DIRECT",
"SecureMode": null,
"CardId": "6647992",
"SecureModeReturnURL": "http://www.my-site.com/returnURL",
"SecureModeRedirectURL": "http://www.my-site.com/returnURL",
"SecureModeNeeded": true,
"Culture": null,
"SecurityInfo": {
"AVSResult": "NO_CHECK"
},
"StatementDescriptor": "test",
"BrowserInfo": {
"AcceptHeader": "application/json,text/javascript,*/*;q=0.01<",
"JavaEnabled": true,
"Language": "fr",
"ColorDepth": 32,
"ScreenHeight": 667,
"ScreenWidth": 375,
"TimeZoneOffset": -120,
"UserAgent": "Mozilla/5.0 (iPhone; CPU iPhone OS 13_6_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148",
"JavascriptEnabled": true
},
"IpAddress": "2001:0620:0000:0000:0211:24FF:FE80:C12C",
"Billing": {
"FirstName": "Recurring",
"LastName": "Payment",
"Address": {
"AddressLine1": "1 Mangopay Street",
"AddressLine2": "The Loop",
"City": "Paris",
"Region": "Ile de France",
"PostalCode": "75001",
"Country": "FR"
}
},
"Shipping": {
"FirstName": "Recurring",
"LastName": "Payment",
"Address": {
"AddressLine1": "1 Mangopay Street",
"AddressLine2": "The Loop",
"City": "Paris",
"Region": "Ile de France",
"PostalCode": "75001",
"Country": "FR"
}
},
"Requested3DSVersion": null,
"Applied3DSVersion": "V2_1",
"RecurringPayinRegistrationId": "6647993"
}
Create a Recurring PayIn - MIT
In the body of this call it is not necessary to enter the amount to be debited, as it is already present in the parameter NextTransactionDebitedFunds
of the registration object.
POST /payins/recurring/card/direct
{
"RecurringPayinRegistrationId" : {{RecurringID}},
"StatementDescriptor" : "test",
"Tag" : "MIT test"
}
Response
{
"Id": "6647996",
"Tag": "MIT test",
"CreationDate": 1626796997,
"AuthorId": "6647989",
"CreditedUserId": "6647989",
"DebitedFunds": {
"Currency": "EUR",
"Amount": 5525
},
"CreditedFunds": {
"Currency": "EUR",
"Amount": 5525
},
"Fees": {
"Currency": "EUR",
"Amount": 0
},
"Status": "SUCCEEDED",
"ResultCode": "000000",
"ResultMessage": "Success",
"ExecutionDate": 1626796999,
"Type": "PAYIN",
"Nature": "REGULAR",
"CreditedWalletId": "6647990",
"DebitedWalletId": null,
"PaymentType": "CARD",
"ExecutionType": "DIRECT",
"SecureMode": null,
"CardId": "6647992",
"SecureModeReturnURL": null,
"SecureModeRedirectURL": null,
"SecureModeNeeded": false,
"Culture": null,
"SecurityInfo": {
"AVSResult": "NO_CHECK"
},
"StatementDescriptor": "test",
"BrowserInfo": null,
"IpAddress": null,
"Billing": {
"FirstName": "Recurring",
"LastName": "Payment",
"Address": {
"AddressLine1": "1 Mangopay Street",
"AddressLine2": "The Loop",
"City": "Paris",
"Region": "Ile de France",
"PostalCode": "75001",
"Country": "FR"
}
},
"Shipping": {
"FirstName": "Recurring",
"LastName": "Payment",
"Address": {
"AddressLine1": "1 Mangopay Street",
"AddressLine2": "The Loop",
"City": "Paris",
"Region": "Ile de France",
"PostalCode": "75001",
"Country": "FR"
}
},
"Requested3DSVersion": null,
"Applied3DSVersion": "V2_1",
"RecurringPayinRegistrationId": "6647993"
}
View a Recurring PayIn Registration
GET /recurringpayinregistrations/{RecurringPayinRegistrationId}
{
"Id": "6647993",
"Status": "IN_PROGRESS",
"CurrentState": {
"PayinsLinked": 2,
"CumulatedDebitedAmount": {
"Currency": "EUR",
"Amount": 11535
},
"CumulatedFeesAmount": {
"Currency": "EUR",
"Amount": 0
},
"LastPayinId": "6647996"
},
"RecurringType": "CLASSIC_SUBSCRIPTION",
"TotalAmount": {
"Currency": "EUR",
"Amount": 166235
},
"CycleNumber": 30,
"AuthorId": "6647989",
"CardId": "6647992",
"CreditedUserId": "6647989",
"CreditedWalletId": "6647990",
"Billing": {
"FirstName": "Recurring",
"LastName": "Payment",
"Address": {
"AddressLine1": "1 Mangopay Street",
"AddressLine2": "The Loop",
"City": "Paris",
"Region": "Ile de France",
"PostalCode": "75001",
"Country": "FR"
}
},
"Shipping": {
"FirstName": "Recurring",
"LastName": "Payment",
"Address": {
"AddressLine1": "1 Mangopay Street",
"AddressLine2": "The Loop",
"City": "Paris",
"Region": "Ile de France",
"PostalCode": "75001",
"Country": "FR"
}
},
"EndDate": 1704013755,
"Frequency": "Monthly",
"FixedNextAmount": true,
"FractionedPayment": false,
"FreeCycles": 0,
"FirstTransactionDebitedFunds": {
"Currency": "EUR",
"Amount": 6010
},
"FirstTransactionFees": {
"Currency": "EUR",
"Amount": 0
},
"NextTransactionDebitedFunds": {
"Currency": "EUR",
"Amount": 5525
},
"NextTransactionFees": {
"Currency": "EUR",
"Amount": 0
},
"Migration": false
}
Update a Recurring PayIn Registration
In the body of this call, it is simply necessary to send the elements you wish to modify. The response will show the entire item with the modification requested.
In this example, the card is modified. Therefore, the status of the object changes to AUTHENTICATION_NEEDED as the end user (who cannot change) must authenticate the new card.
To do this, you will have to use the CIT pay-in mid-recurrence. If not already present in the object, the DebitedFunds
must be sent with the amount to be debited.
PUT /recurringpayinregistrations/{RecurringPayinRegistrationId}
{
"CardId" :{{NewcardID}}
}
Response
{
"Id": "6647993",
"Status": "AUTHENTICATION_NEEDED",
"CurrentState": {
"PayinsLinked": 2,
"CumulatedDebitedAmount": {
"Currency": "EUR",
"Amount": 11535
},
"CumulatedFeesAmount": {
"Currency": "EUR",
"Amount": 0
},
"LastPayinId": "6647996"
},
"RecurringType": "CLASSIC_SUBSCRIPTION",
"TotalAmount": {
"Currency": "EUR",
"Amount": 166235
},
"CycleNumber": 30,
"AuthorId": "6647989",
"CardId": "6647998",
"CreditedUserId": "6647989",
"CreditedWalletId": "6647990",
"Billing": {
"FirstName": "Recurring",
"LastName": "Payment",
"Address": {
"AddressLine1": "1 Mangopay Street",
"AddressLine2": "The Loop",
"City": "Paris",
"Region": "Ile de France",
"PostalCode": "75001",
"Country": "FR"
}
},
"Shipping": {
"FirstName": "Recurring",
"LastName": "Payment",
"Address": {
"AddressLine1": "1 Mangopay Street",
"AddressLine2": "The Loop",
"City": "Paris",
"Region": "Ile de France",
"PostalCode": "75001",
"Country": "FR"
}
},
"EndDate": 1704013755,
"Frequency": "Monthly",
"FixedNextAmount": true,
"FractionedPayment": false,
"FreeCycles": 0,
"FirstTransactionDebitedFunds": {
"Currency": "EUR",
"Amount": 6010
},
"FirstTransactionFees": {
"Currency": "EUR",
"Amount": 0
},
"NextTransactionDebitedFunds": {
"Currency": "EUR",
"Amount": 5525
},
"NextTransactionFees": {
"Currency": "EUR",
"Amount": 0
},
"Migration": false
}