AANI
Coming soon
This feature is only available in Middle East region and limited to certain acquirers.
This feature can only be used if your account has been enabled with the respective service.
Below flow describes the required steps and nexo message layouts for an AANI QR code payment.
For more information about AANI please refer to the official web page of AANI.
Sale / preauthorisation
Terminal (host) sends Acceptor Authorisation Request to IPG to request QR code.
Field | Presence | Value |
---|---|---|
MsgFctn | M | FAUQ |
Envt/Card/CardBrnd | M | AANI |
Envt/POI/GrpId | M | Gateway Store ID |
Envt/POI/Id/Id | M | Terminal ID |
Tx/TxCaptr | M | 'false' for preauthorisation | 'true' for sale |
Tx/TxTp | M | 'RESA' for preauthorisation | 'CRDP' for sale |
Tx/SvcAttr | C | IRES (only present for preauthorisation) |
Tx/TxDtls/AmtQlfr | M | 'RESD' for preauthorisation | 'ACTL' for sale |
Tx/TxDtls/TtlAmt | M | |
Tx/TxDtls/Ccy | M | Only AED is supported. |
Cntxt/PmtCntxt/CardPres | M | false |
Cntxt/PmtCntxt/CardhldrPres | M | true |
Cntxt/PmtCntxt/CardDataNtryMd | M | PHYS |
TxId | M | Transaction identifier assigned by terminal (TxDtTm + TxRef) |
CstmrDvc/Tp | M | 'qr_code_based' for QR code payment |
<?xml version="1.0" encoding="UTF-8"?>
<Document xmlns="urn:iso:std:iso:20022:tech:xsd:caaa.001.001.06">
<AccptrAuthstnReq>
<Hdr>
<MsgFctn>FAUQ</MsgFctn>
<PrtcolVrsn>5.0</PrtcolVrsn>
<XchgId>002</XchgId>
<CreDtTm>2025-03-07T09:31:12+01:00</CreDtTm>
<InitgPty>
<Id>66000001</Id>
<Tp>ACCP</Tp>
</InitgPty>
<RcptPty>
<Id>FDEL</Id>
<Tp>ACQR</Tp>
</RcptPty>
<Tracblt>
<RlayId>
<Id>TracePoint-1</Id>
<Tp>ACCP</Tp>
</RlayId>
<TracDtTmIn>2016-07-08T09:01:01.01+02:00</TracDtTmIn>
<TracDtTmOut>2016-07-08T09:01:01.02+02:00</TracDtTmOut>
</Tracblt>
</Hdr>
<AuthstnReq>
<Envt>
<Acqrr>
<Id>
<Id>FDEL</Id>
<Tp>ACQR</Tp>
</Id>
<ParamsVrsn>2016-05-07 08:00:00</ParamsVrsn>
</Acqrr>
<Mrchnt>
<Id>
<Id>12345678</Id>
<ShrtNm>12345678</ShrtNm>
</Id>
<CmonNm>Merchant Name 1</CmonNm>
<LctnAndCtct>
<PstlAdr>
<AdrLine>,Place de l'EtoileäöüßÄÖÜ 1,Paris,12345</AdrLine>
<TwnNm>Paris</TwnNm>
<Ctry>FR</Ctry>
</PstlAdr>
<AddtlCtctInf>11111111</AddtlCtctInf>
</LctnAndCtct>
</Mrchnt>
<POI>
<Id>
<Id>xxxxxx</Id>
</Id>
<GrpId>xxxxx</GrpId>
<Cpblties>
<CardRdngCpblties>CICC</CardRdngCpblties>
<CardRdngCpblties>MGST</CardRdngCpblties>
<CardRdngCpblties>PHYS</CardRdngCpblties>
<CrdhldrVrfctnCpblties>MNSG</CrdhldrVrfctnCpblties>
<CrdhldrVrfctnCpblties>FCPN</CrdhldrVrfctnCpblties>
<CrdhldrVrfctnCpblties>FEPN</CrdhldrVrfctnCpblties>
<CrdhldrVrfctnCpblties>NPIN</CrdhldrVrfctnCpblties>
<CrdhldrVrfctnCpblties>OTHR</CrdhldrVrfctnCpblties>
<PINLngthCpblties>12</PINLngthCpblties>
<ApprvlCdLngth>6</ApprvlCdLngth>
<MxScrptLngth>20</MxScrptLngth>
<CardCaptrCpbl>false</CardCaptrCpbl>
<OnLineCpblties>SMON</OnLineCpblties>
<MsgCpblties>
<Dstn>CDSP</Dstn>
<AvlblFrmt>TEXT</AvlblFrmt>
<NbOfLines>2</NbOfLines>
<LineWidth>20</LineWidth>
</MsgCpblties>
</Cpblties>
<Cmpnt>
<Tp>TERM</Tp>
<Id>
<ItmNb>1</ItmNb>
<PrvdrId>xxxxx</PrvdrId>
<Id>xxxx</Id>
<SrlNb>xxxx</SrlNb>
</Id>
<StdCmplc>
<Id>1234567</Id>
<Vrsn>1</Vrsn>
<Issr>GBIC</Issr>
</StdCmplc>
</Cmpnt>
<Cmpnt>
<Tp>APLI</Tp>
<Id>
<ItmNb>54712001</ItmNb>
<PrvdrId>xxx</PrvdrId>
</Id>
<Sts>
<VrsnNb>1.0</VrsnNb>
</Sts>
<StdCmplc>
<Id>SEPA-FAST</Id>
<Vrsn>3.0</Vrsn>
<Issr>CIR</Issr>
</StdCmplc>
</Cmpnt>
</POI>
<Card>
<CardBrnd>AANI</CardBrnd>
</Card>
<CstmrDvc>
<Tp>qr_code_based</Tp>
</CstmrDvc>
<Crdhldr>
<Lang>en</Lang>
</Crdhldr>
</Envt>
<Cntxt>
<PmtCntxt>
<CardPres>false</CardPres>
<CrdhldrPres>true</CrdhldrPres>
<AttndncCntxt>ATTD</AttndncCntxt>
<CardDataNtryMd>PHYS</CardDataNtryMd>
<FllbckInd>NFLB</FllbckInd>
</PmtCntxt>
</Cntxt>
<Tx>
<TxCaptr>true</TxCaptr>
<TxTp>CRDP</TxTp>
<MrchntCtgyCd>5541</MrchntCtgyCd>
<TxId>
<TxDtTm>2025-03-07T09:31:12+01:00</TxDtTm>
<TxRef>000043</TxRef>
</TxId>
<InitrTxId>250307093112004</InitrTxId>
<RcncltnId>250307</RcncltnId>
<TxDtls>
<Ccy>AED</Ccy>
<TtlAmt>200.20</TtlAmt>
<AmtQlfr>ACTL</AmtQlfr>
<OnLineRsn>ICCF</OnLineRsn>
</TxDtls>
</Tx>
</AuthstnReq>
</AccptrAuthstnReq>
</Document>
<?xml version="1.0" encoding="UTF-8"?>
<Document xmlns="urn:iso:std:iso:20022:tech:xsd:caaa.002.001.06">
<AccptrAuthstnRspn>
<Hdr>
<MsgFctn>FAUP</MsgFctn>
<PrtcolVrsn>6.0</PrtcolVrsn>
<XchgId>41</XchgId>
<CreDtTm>2025-05-05T18:14:35.821+02:00</CreDtTm>
<InitgPty>
<Id>xxxxx</Id>
</InitgPty>
<Tracblt>
<RlayId>
<Id>xxxxx</Id>
<Tp>ACCP</Tp>
</RlayId>
<TracDtTmIn>2025-05-05T20:14:33.662+04:00</TracDtTmIn>
<TracDtTmOut>2025-05-05T20:14:33.662+04:00</TracDtTmOut>
</Tracblt>
<Tracblt>
<RlayId>
<Id>xxxx</Id>
<Tp>ITAG</Tp>
</RlayId>
<TracDtTmIn>2025-05-05T18:14:35.108+02:00</TracDtTmIn>
<TracDtTmOut>2025-05-05T18:14:35.821+02:00</TracDtTmOut>
</Tracblt>
</Hdr>
<AuthstnRspn>
<Envt>
<AcqrrId>
<Id>FDEL</Id>
</AcqrrId>
<MrchntId>
<Id>xxxx</Id>
</MrchntId>
<POIId>
<Id>xxxxx</Id>
</POIId>
</Envt>
<Tx>
<TxId>
<TxDtTm>2025-05-05T20:14:33.662+04:00</TxDtTm>
<TxRef>xxxxxx</TxRef>
</TxId>
<RcptTxId>xxxxxx</RcptTxId>
<RcncltnId>1</RcncltnId>
<TxDtls>
<Ccy>AED</Ccy>
<TtlAmt>3.21</TtlAmt>
</TxDtls>
</Tx>
<TxRspn>
<AuthstnRslt>
<AuthstnNtty>
<Tp>CISS</Tp>
</AuthstnNtty>
<RspnToAuthstn>
<Rspn>APPR</Rspn>
<RspnRsn>200:SUCCESS</RspnRsn>
</RspnToAuthstn>
<AuthstnCd>000000</AuthstnCd>
<CmpltnReqrd>true</CmpltnReqrd>
</AuthstnRslt>
<TxVrfctnRslt>
<Mtd>MANU</Mtd>
<AddtlRslt>IPG:QR/DEFAULT/00020101021226110007IFxxxxxxx047011530378454043.215802AE5913AANI xxxx xxxxxxxxxxxx62310121IF265MQ#POJKh##10001#0802036304AA89</AddtlRslt>
</TxVrfctnRslt>
<Bal>
<Amt Ccy="AED">3.21</Amt>
</Bal>
<Actn>
<ActnTp>RQDT</ActnTp>
</Actn>
</TxRspn>
</AuthstnRspn>
</AccptrAuthstnRspn>
</Document>
IPG sends nexo Acceptor Authorisation Response incl. QR code string details to terminal (host)
Field | Presence | Value |
---|---|---|
MsgFctn | M | FAUP |
TxRspn/AuthstnRslt/AuthstnNtty/Tp | M | ITAG |
TxRspn/AuthstnRslt/RspnToAuthstn/Rspn | M | Response code + text |
TxRspn/AuthstnCd | M | 000000 |
TxRspn/CmpltnReqrd | M | false |
TxRspn/TxVrfctnRslt/Mtd | M | MANU |
TxRspn/TxVrfctnRslt/AddtlRslt | M | "IPG:QR/$TYPE$/$QR-code-payload$" with $TYPE$=DEFAULT &$QR-code-payload$=TLV string based on EMV standard following structure of UAEIPP Overlay service specification |
TxRspn/Bal | C | present for preauthorisations |
TxRspn/Actn/ActnTp | M | RQDT |
Tx/RcptTxId | M | Gateway Order ID |
Terminal builds the QR from NEXO response and displays it on the terminal screen
Customer scans QR code and completes the AANI payment on his mobile device
Once the terminal has displayed the QR code on the terminal screen, the terminal (host) starts pulling the status via Acceptor Authorisation Request (balance inquiry) from IPG.
The terminal should pull the status from IPG every 6 seconds, not earlier. The terminal (host) can decide for how long it pulls the status. Fiserv recommends a maximum period of 5 minutes.
Field | Presence | Value |
---|---|---|
MsgFctn | M | AUTQ |
Envt/POI/GrpId | M | Gateway Store ID |
Envt/POI/Id/Id | M | Terminal ID |
Cntxt/PmtCntxt/CardPres | M | false |
Cntxt/PmtCntxt/CardhldrPres | M | false |
CardDataNtryMd | M | PHYS |
Tx/TxTp | M | BALC |
TxCaptr | M | false |
TxDtls/TtlAmt | M | 0 |
TxDtls/Ccy | M | AED |
TxDtls/AmtQlfr | M | 'RESD' for preauthorization | 'ACTL' for sale |
TxId | M | Transaction identifier assigned by terminal (TxDtTm + TxRef) |
Tx/RcptTxId | C | Reference to original transaction. Alternatively, terminal can send SaleRefId |
IPG sends the status to terminal via nexo Acceptor Authorisation Response.
Field | Presence | Value |
---|---|---|
MsgFctn | M | AUTP |
CmpltnReqrd | M | false |
RspnToAuthstn/Rspn | M | Depending on the payment status: - Rspn ='APPR' if payment has been successfully completed- Rspn ='DECL' && ActnTp ='RQDT' if payment is still in waiting status. In this case it is expected that terminal continues to pull status from IPG.- Rspn ='DECL' if payment failed (e.g. customer has not completed the payment in app or merchant has deleted the QR code) |
OPTIONAL: If transaction type is preauthorization, then terminal (host) needs to complete the payment by sending a nexo Acceptor Completion Advice to the Gateway.
Field | Presence | Value |
---|---|---|
MsgFctn | M | FCMV |
Tx/TxCaptr | M | true |
Tx/SvcAttr | M | PRES |
Tx/TxTp | M | RESA |
Tx/TxDtls/TtlAmt | M | Completed amount - lower or equal to reserved amount |
Tx/TxDtls/Ccy | M | Only AED is supported. |
Tx/OrgnlTx/RcptTxId | C | Reference to original transaction. Alternatively, terminal can send SaleRefId |
TxSucss | M | true |
OPTIONAL: If the terminal (host) doesn't receive a successful response within the defined period, the customer cancels the payment, the customer hasn't scanned the QR code in time or there's any kind of malfunction on the terminal, then the terminal (host) should send an auto-void to IPG by using negative Acceptor Completion Advice with Tx/FailrRsn
.
Field | Presence | Value |
---|---|---|
Tx/OrgnlTx/RcptTxId | C | Reference to original transaction. Alternatively, terminal can send SaleRefId |
Tx/TxCaptr | M | true |
Tx/TxSucss | M | false |
Tx/TxTp | M | 'RESA' for preauthorization | 'CRDP' for sale |
Tx/FailrRsn | M | Depending on the scenario:FailrRsn ='TIMO' (timeout)FailrRsn ='CUCL' (customer cancellation)FailrRsn ='MALF' (malfunction) |
Reversal (void)
A reversal can be started similar to a standard reversal of credit card transaction by referencing to the original transaction. For the deletion of QR code as well as for the cancelation of a payment the request to the gateway is identical
Pre-requisite to perform a reversal
You must have given your consent within the AANI app by performing a special authentication. The gateway is not involved in this activity. For the deletion of a QR code, this pre-requisite is not applicable.
Example for technical reversal:
<?xml version="1.0" encoding="UTF-8"?>
<Document xmlns:AcceptorCompletionAdvice="urn:iso:std:iso:20022:tech:xsd:caaa.003.001.06" xmlns="urn:iso:std:iso:20022:tech:xsd:caaa.003.001.06" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<AccptrCmpltnAdvc>
<Hdr>
<MsgFctn>RVRA</MsgFctn>
<PrtcolVrsn>6.0</PrtcolVrsn>
<XchgId>xxxxxx</XchgId>
<CreDtTm>2025-04-18T10:33:12.751+04:00</CreDtTm>
<InitgPty>
<Id>xxxxx</Id>
</InitgPty>
</Hdr>
<CmpltnAdvc>
<Envt>
<Acqrr>
<Id>
<Id>1</Id>
</Id>
</Acqrr>
<Mrchnt>
<Id>
<Id>xxxx</Id>
</Id>
<CmonNm>xxxxx</CmonNm>
</Mrchnt>
<POI>
<Id>
<Id>xxxxxxx</Id>
</Id>
<GrpId>xxxxxxxxx</GrpId>
<Cpblties>
<CardRdngCpblties>PHYS</CardRdngCpblties>
<CardRdngCpblties>MGST</CardRdngCpblties>
<CardRdngCpblties>CICC</CardRdngCpblties>
<CardRdngCpblties>CTLS</CardRdngCpblties>
<CardRdngCpblties>ECTL</CardRdngCpblties>
<CrdhldrVrfctnCpblties>FCPN</CrdhldrVrfctnCpblties>
<CrdhldrVrfctnCpblties>NPIN</CrdhldrVrfctnCpblties>
<CrdhldrVrfctnCpblties>OTHR</CrdhldrVrfctnCpblties>
<CrdhldrVrfctnCpblties>FEPN</CrdhldrVrfctnCpblties>
<ApprvlCdLngth>6</ApprvlCdLngth>
<OnLineCpblties>SMON</OnLineCpblties>
<MsgCpblties>
<Dstn>MDSP</Dstn>
<AvlblFrmt>TEXT</AvlblFrmt>
<NbOfLines>4</NbOfLines>
<LineWidth>32</LineWidth>
<AvlblLang>en</AvlblLang>
<AvlblLang>fr</AvlblLang>
<AvlblLang>nl</AvlblLang>
<AvlblLang>de</AvlblLang>
<AvlblLang>sv</AvlblLang>
<AvlblLang>pl</AvlblLang>
<AvlblLang>cs</AvlblLang>
</MsgCpblties>
<MsgCpblties>
<Dstn>MRCP</Dstn>
<AvlblFrmt>TEXT</AvlblFrmt>
<NbOfLines>4</NbOfLines>
<LineWidth>32</LineWidth>
<AvlblLang>en</AvlblLang>
<AvlblLang>fr</AvlblLang>
<AvlblLang>nl</AvlblLang>
<AvlblLang>de</AvlblLang>
<AvlblLang>sv</AvlblLang>
<AvlblLang>pl</AvlblLang>
<AvlblLang>cs</AvlblLang>
</MsgCpblties>
</Cpblties>
</POI>
</Envt>
<Cntxt>
<PmtCntxt>
<CardPres>false</CardPres>
<CrdhldrPres>false</CrdhldrPres>
<CardDataNtryMd>PHYS</CardDataNtryMd>
</PmtCntxt>
</Cntxt>
<Tx>
<TxCaptr>true</TxCaptr>
<TxTp>CRDP</TxTp>
<MrchntCtgyCd>7011</MrchntCtgyCd>
<CstmrCnsnt>false</CstmrCnsnt>
<TxId>
<TxDtTm>2025-04-18T10:33:12.751+04:00</TxDtTm>
<TxRef>xxxxx</TxRef>
</TxId>
<OrgnlTx>
<SaleRefId>xxxxxxxxx</SaleRefId>
<TxId>
<TxDtTm>2025-04-18T10:33:12.751+04:00</TxDtTm>
<TxRef>xxxxx</TxRef>
</TxId>
<RcptTxId>xxxxxxx</RcptTxId>
</OrgnlTx>
<TxSucss>false</TxSucss>
<FailrRsn>CUCL</FailrRsn>
<TxDtls>
<Ccy>AED</Ccy>
<TtlAmt>0</TtlAmt>
<AmtQlfr>ACTL</AmtQlfr>
</TxDtls>
</Tx>
</CmpltnAdvc>
<SctyTrlr>
<CnttTp>AUTH</CnttTp>
<AuthntcdData>
<Rcpt>
<KEK>
<KEKId>
<KeyId>xxxxxx</KeyId>
<KeyVrsn>xxxxxx</KeyVrsn>
<DerivtnId>xxxxx=</DerivtnId>
</KEKId>
<KeyNcrptnAlgo>
<Algo>DKP9</Algo>
</KeyNcrptnAlgo>
<NcrptdKey>xxxxxx=</NcrptdKey>
</KEK>
</Rcpt>
<MACAlgo>
<Algo>MCCS</Algo>
</MACAlgo>
<NcpsltdCntt>
<CnttTp>DATA</CnttTp>
</NcpsltdCntt>
<MAC>xxxxxxx=</MAC>
</AuthntcdData>
</SctyTrlr>
</AccptrCmpltnAdvc>
</Document>
Return / credit
A reversal can be started similar to a standard return of a credit card transaction by referencing to the original transaction. No credit card is needed. Instead, for a return (linked refund) as well as for a credit (naked refund) the terminal will need to capture the mobile phone number of the customer as it is needed to identify the customer on AANI side.
For this purpose please send the following fields to the gateway.
Field | Presence | Value |
---|---|---|
Crdhldr/Id/Othr/Id | M | in format +9711743xxxx88 (starting with '+' symbol, no hyphens, no spaces) |
Crdhldr/Id/Othr/IdTp | M | Use value 'customerPhoneNumber' |
Pre-requisite to perform a linked refund
You must have given your consent within the AANI app by performing a special authentication. The gateway is not involved in this activity.
Updated about 14 hours ago