Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Info

See https://teamamadis.atlassian.net/wiki/pages/resumedraft.action?draftId=1713274934 on Amadis Wiki for more information about the Refund Service.

Initiate a Refund without Reference Data to an Original Transaction

Expand
titleBelow is an example of how to initiate a refund of 10.00.

Code Block
// Minimal parameter set
TlvTree paymentParams = TlvTree.Empty();

paymentParams.AddEnum(ArkosTags.SelectedService, PaymentServiceID.Refund);
// Amounts are in BCD. In most cases, all 3 amounts should be the same value.
paymentParams.AddBin(ArkosTags.TransactionAmount, new byte[] { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00 });
paymentParams.AddBin(ArkosTags.AmountAuthorised, new byte[] { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00 });
paymentParams.AddBin(ArkosTags.TransactionAmountBeforeAdjustment, new byte[] { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00 });

// The system needs to provide the Date and Time of this transaction, and the local TimeZone
Calendar cal = Calendar.getInstance();
int utcOffsetMinutes = cal.getTimeZone().getOffset(cal.getTimeInMillis()) / 1000 / 60;
byte[] utcOffset = new byte[2];
utcOffset[0] = (byte) (utcOffsetMinutes / 60);
utcOffset[1] = (byte) (utcOffsetMinutes % 60);
paymentParams.AddEMVDate(ArkosTags.TransactionDate, cal.get(Calendar.YEAR) % 100, cal.get(Calendar.MONTH) + 1, cal.get(Calendar.DAY_OF_MONTH));
paymentParams.AddEMVTime(ArkosTags.TransactionTime, cal.get(Calendar.HOUR), cal.get(Calendar.MINUTE), cal.get(Calendar.SECOND));
paymentParams.AddBin(ArkosTags.LocalTimezone, utcOffset);

paymentParams.AddAscii(ArkosTags.SelectedLanguage, "en");

// Call to the doPayment API, sending the Arkos configuration, and parameters as a byte Array
PaymentResult result = arkos.doPayment(configuration, paymentParams.AsBytes());

Initiate a Refund with a Reference

...

to an Original Transaction

When a Refund is performed, the sale system or the device control (eg. the MerchantApp) may provide Refund Reference Data as a reference to the original Service being refunded.

  • Refund Reference Data may be identical to the Reference Data of the original Service, but this is not mandatory and not checked.

  • Refund Reference Data is not used to retrieve the transaction data of the original Service, but it is stored in the transaction database for the Refund.

...

Refund Reference Data (optional) : DF59

Steps Taken For this Bulletin:

  • A Tag DF59(Refund Reference Data) was added to nexofast.h

  • Refund reference data has been included in the Original Transaction section of AcceptorAuth and CompletionAdvice.

As this tag is optional, a check is done on the latter. If the Tag is absent, the original transaction section is not included.

Below is an example derived from a refund of an original transaction.

...

Expand
titleBelow is an example of how to initiate a refund of 10.00 with Reference Data 1234567890 to an Original Transaction.

Code Block
// Minimal parameter set
TlvTree paymentParams = TlvTree.Empty();

paymentParams.AddEnum(ArkosTags.SelectedService, PaymentServiceID.Refund);
// Amounts are in BCD. In most cases, all 3 amounts should be the same value.
paymentParams.AddBin(ArkosTags.TransactionAmount, new byte[] { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00 });
paymentParams.AddBin(ArkosTags.AmountAuthorised, new byte[] { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00 });
paymentParams.AddBin(ArkosTags.TransactionAmountBeforeAdjustment, new byte[] { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00 });

// The system needs to provide the Date and Time of this transaction, and the local TimeZone
Calendar cal = Calendar.getInstance();
int utcOffsetMinutes = cal.getTimeZone().getOffset(cal.getTimeInMillis()) / 1000 / 60;
byte[] utcOffset = new byte[2];
utcOffset[0] = (byte) (utcOffsetMinutes / 60);
utcOffset[1] = (byte) (utcOffsetMinutes % 60);
paymentParams.AddEMVDate(ArkosTags.TransactionDate, cal.get(Calendar.YEAR) % 100, cal.get(Calendar.MONTH) + 1, cal.get(Calendar.DAY_OF_MONTH));
paymentParams.AddEMVTime(ArkosTags.TransactionTime, cal.get(Calendar.HOUR), cal.get(Calendar.MINUTE), cal.get(Calendar.SECOND));
paymentParams.AddBin(ArkosTags.LocalTimezone, utcOffset);

paymentParams.AddAscii(ArkosTags.SelectedLanguage, "en");

//Adding an original transaction with the reference data as a child of payment params
TlvTree originalTransaction = paymentParams.AddChild(ArkosTags.OriginalTransaction);
originalTransaction.AddEnum(ArkosTags.SelectedService, PaymentServiceID.Payment);
originalTransaction.AddEMVDate(ArkosTags.TransactionDate, cal.get(Calendar.YEAR) % 100, cal.get(Calendar.MONTH) + 1, cal.get(Calendar.DAY_OF_MONTH));
originalTransaction.AddEMVTime(ArkosTags.TransactionTime, cal.get(Calendar.HOUR), cal.get(Calendar.MINUTE), cal.get(Calendar.SECOND));
originalTransaction.AddBin(ArkosTags.LocalTimezone, utcOffset);
originalTransaction.AddAscii(ArkosTags.RefundReferenceData,"1234567890");

...


// Call to the doPayment API, sending the Arkos configuration, and parameters as a byte Array
PaymentResult result = arkos.doPayment(configuration, paymentParams.AsBytes());

  • As this tag is optional, a check is done on the latter. If the Tag is absent, the original transaction section is not included.

Expand
titleObtained XML :
Code Block
        <OrgnlTx>
          <TxId>
            <TxDtTm>2021-06-15T10:36:45.000+00:00</TxDtTm>
            <TxRef>1234567890</TxRef>
          </TxId>
          <TxTp>CRDP</TxTp>
          <CardDataNtryMd>DFLE</CardDataNtryMd>
        </OrgnlTx