Overview
The Visa Account Funding Transactions (AFT) feature allows a customer to “pull” funds from one Visa account and then use those funds to fund (deposit the funds into) another Visa account, or a non-Visa account.
- AFTs are available to AFT-enabled merchants for “domestic” and “non-domestic “transactions.
- Cashier supports AFTs for these BAI types: Wallet transfers (WT) and Fund Transfers (FT).
This guide describes how to implement AFT using Nuvei’s Server-to-Server REST platform.
REST Implementation
This topic describes the steps to integrate ATF into the standard Server-to-Server REST payment flow.
1. Perform the standard Server-to-Server REST integration steps up to the Payment step.
2. Perform the Payment step.
There are two possible flows for a /payment
request: 3DS or non-3DS.
Include the following recipientDetails
block and its parameters in the relevant /payment
request.
recipientDetails.firstName
– Destination account holder’s first name.recipientDetails.lastName
– Destination account holder’s last name.
For non-domestic AFTs, the merchant should include the following sender data:
Parameter Description | REST API Field | Requirements | Format |
---|---|---|---|
Sender first name | firstName under billingAddress | Required on non-domestic and Europe intra-EEA AFTs |
|
Sender last name | lastName under billingAddress |
||
Sender address | address under billingAddress |
|
|
Sender city | city under billingAddress |
|
|
Sender state | state under billingAddress | Required on non-domestic AFTs to/from US and Canada | ISO county/province/state/territory/union territory code |
Sender country | country under billingAddress | Required on non-domestic AFTs | 2-letter ISO country code |
Select the relevant flow:
- 3D-Secure v2 (which contains the “first”
/payment
request) - Non-3DS (without liability shift)
/payment
request:
Example of a Non-3DS /payment
Request Showing the recipientDetails
Block
{ "sessionToken":"<sessionToken from getSessionToken>", "merchantId":"<your merchantId>", "merchantSiteId":"<your merchantSiteId>", "clientRequestId":"<unique request ID in merchant system>", "amount":"200", "currency":"USD", "userTokenId":"<unique customer identifier in merchant system>", "clientUniqueId":"<unique transaction ID in merchant system>", "paymentOption":{ "card":{ "cardNumber":"4000027891380961", "cardHolderName":"John Smith", "expirationMonth":"12", "expirationYear":"2030", "CVV":"217" } }, "relatedTransactionId":"<transactionId returned from initPayment>", "billingAddress":{ "country":"US", "email":"john.smith@email.com" }, "deviceDetails":{ "ipAddress":"<customer's IP address>" }, "recipientDetails": { "firstName": "string", "lastName": "string" }, "timeStamp":"<YYYYMMDDHHmmss>", "checksum":"<calculated checksum>" }
The response of /payment
contains the isAFT
parameter, which indicates whether the transaction was processed as a Sale or an AFT transaction.
The response of /settleTransaction
and /refundTransaction
also contains isAFT
, which indicates whether the original payment transaction was processed as a Sale or an AFT transaction.
Example of a Non-3DS /payment
Response
{ "internalRequestId":691376548, "status":"SUCCESS", "errCode":0, "reason":"", "merchantId":"479748173730597238", "merchantSiteId":"204388", "version":"1.0", "clientRequestId":"20230612095910", "sessionToken":"4bb43678-9d50-46a9-8980-73e2658117ee", "orderId":"370540478", "isAFT":"True", "userTokenId":"asdadsw4", "paymentOption":{ "userPaymentOptionId":"91315468", "card":{ "ccCardNumber":"4****5032", "bin":"400002", "last4Digits":"5032", "ccExpMonth":"12", "ccExpYear":"25", "acquirerId":"19", "cvv2Reply":"", "avsCode":"", "cardType":"Credit", "cardBrand":"VISA", "issuerBankName":"River Valley Credit Union", "issuerCountry":"GB", "isPrepaid":"false", "threeD":{ } } }, "transactionStatus":"APPROVED", "gwErrorCode":0, "gwExtendedErrorCode":0, "issuerDeclineCode":"", "issuerDeclineReason":"", "transactionType":"Sale", "transactionId":"711000000023888533", "externalTransactionId":"", "authCode":"111407", "customData":"", "fraudDetails":{ "finalDecision":"Accept" }, "externalSchemeTransactionId":"", "orderTransactionId":1201801248 }
The system returns the following AFT-specific fields in the DMN:
isAFT
=True or FalserecipientFirstName
=RecFNamerecipientLastName
=RecLName
3. Continue with the next relevant Server-to-Server REST integration steps, according to the payment flow you are implementing.