
EMV Transaction Flow
Last updated
// #1
MTSCRA m_SCRA = new MTSCRA();
// Delegate the MTSCRA Events. m_SCRA.OnDisplayMessageRequest += OnDisplayMessageRequest;
.
// Assign parameters.
byte timeLimit = 0x3C;
byte cardType = 0x07;
byte option = 0x00;
byte[] amount = new
byte[] { 0x00, 0x00, 0x00, 0x00, 0x15, 0x00 };
byte transactionType = 0x00; // Purchase
byte[] cashBack = new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
byte[] currencyCode = new byte[] { 0x08, 0x40 };
byte reportingOption = 0x02; // All Status Changes
// Start transaction.
long result = m_SCRA.startTransaction(
timeLimit,
cardType,
option,
amount,
transactionType,
cashBack,
currentCode,
reportingOption);// #2
protected void OnDisplayMessageRequest(obj sender, byte[] data)
{
String message;
// Get the message.
if (data != NULL)
{
message = System.Text.Encoding.UTF8.GetString(data);
}
// A data size of 0 is an instruction to clear the display.
if (data.Length == 0)
{
// Clear the display.
}
}// #3
protected void OnUserSelectionRequest(object sender, byte[] data)
{
/* data[0] – selection type
data[1] – timeout
data[2..n] – remainder contains zero-terminated string items */
// display/retrieve user selection.
.
// set status and selection result.
m_SCRA.setUserSelectionResult(status, selection);
}// #4
protected void OnARQCReceived(object sender, byte[] data)
{
/* data[0..1] – ARQC length
data[2..n] – remainder contains the ARQC TLV object */
// #4a Forward ARQC to Processor.
/* An application function to forward the ARQC
to a Processor for approval. */
proccesorResponse = sendARQCToProcesor(data);
/* No need to send ARQC Response if transaction option
had enabled Quick Chip mode. */
if (isQuickChipEnabled())
{
return;
}
// #4b Set Acquirer Response.
// An application function to build Acquirer Response.
byte[] response = buildAcquirerResponse(processorResponse);
// Set Acquirer Response.
m_SCRA.setAcquirerResponse(response);
}// #5
protected void OnDisplayMessageRequest(obj sender, byte[] data)
{
String message;
// Get the message.
if (data != NULL)
{
message = System.Text.Encoding.UTF8.GetString(data);
}
// A data size of 0 is an instruction to clear the display.
if (data.Length == 0)
{
// Clear the display.
}
}// #6
protected void OnTransactionResult(obj sender, byte[] data)
{
/* data[0] – Signature Required
data[1..2] – Batch Data length
data[3..n] – remainder contains the Batch Data TLV object */
// Parse the TLV from data[].
.
// Abstract Approval status from TLV tag “DFDF1A”.
.
// Abstract Signature Required status from TLV tag data[0].
.
}
// #1
m_MTSCRA = new MTSCRA(this, m_scraHandler);
// Assign parameters.
byte timeLimit = 0x3C;
byte cardType = 0x07;
byte option = 0x00;
byte[] amount = new byte[] { 0x00, 0x00, 0x00, 0x00, 0x15, 0x00 };
byte transactionType = 0x00; // Purchase
byte[] cashBack = new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
byte[] currencyCode = new byte[] { 0x08, 0x40 };
byte reportingOption = 0x02; // All Status Changes
// Start transaction.
m_MTSCRA.startTransaction(
timeLimit,
cardType,
option,
amount,
transactionType,
cashBack,
currencyCode,
reportingOption);
int result = m_MTSCRA.getResultCode();// #2
protected void onDisplayMessageRequest(byte[] data)
{
String message;
// Get the message.
if (data != NULL)
{
message = TLVParser.getTextString(data, 0);
}
// A data size of 0 is an instruction to clear the UI display.
if (data.Length == 0)
{
// Clear the display.
}
}// #3
protected void onUserSelectionRequest(byte[] data)
{
/* data[0] – selection type
data[1] – timeout
data[2..n] – remainder contains user selection strings delimited by “\0”.
*/
// display/retrieve status and user selection.
byte status;
byte selection;
.
.
// set status and selection result.
m_MTSCRA.setUserSelectionResult(status, selection);
}// #4
protected void onARQCReceived(byte[] data)
{
/* data[0..1] – ARQC length
data[2..n] – remainder contains the ARQC TLV object */
// #4a Forward ARQC to Processor.
/* An application function to forward the ARQC
to a Processor for approval. */
proccesorResponse = sendARQCToProcesor(data);
/* No need to send ARQC Response if transaction option had enabled Quick Chip mode. */
if (isQuickChipEnabled())
{
return;
}
// #4b Set Acquirer Response.
// An application function to build Acquirer Response.
byte[] response = buildAcquirerResponse(processorResponse);
// Set Acquirer Response.
m_MTSCRA.setAcquirerResponse(response);
}// #5
protected void onDisplayMessageRequest(byte[] data)
{
String message;
// Get the message.
if (data != NULL)
{
message = TLVParser.getTextString(data, 0);
}
// A data size of 0 is an instruction to clear the UI display.
if (data.Length == 0)
{
// Clear the display.
}
}// #6
protected void onTransactionResult(byte[] data)
{
/* data[0] – Signature Required
data[1..2] – Batch Data length
data[3..n] – remainder contains the Batch Data TLV object */
// Parse the TLV from data.
.
// Abstract Approval status from TLV tag “DFDF1A”.
.
// Abstract Signature Required status from TLV tag data[0].
.
}// #1
self.mtSCRALib = [[MTSCRA new];
// Delegate the MTSCRA Events.
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onDisplayMessageRequest:) name:@" onDisplayMessageRequest" withObject:obj];
.
.
// Assign parameters.
Byte timeLimit = 0x3C;
Byte cardType = 0x07;
Byte option = 0x00;
Byte amount[6] = { 0x00, 0x00, 0x00, 0x00, 0x15, 0x00 };
Byte transactionType = 0x00; // Purchase
Byte cashBack[6] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
Byte currencyCode[2] = { 0x08, 0x40 };
Byte reportingOption = 0x02; // All Status Changes
// Start transaction.
[self.mtSCRALib startTransaction:timeLimit cardType:cardType
option:option amount:amount transactionType:transactionType
cashBack:cashBack currencyCode:currencyCode
reportingOption:reportingOption];// #2
-(void)OnDisplayMessageRequest:(NSData *)data
{
// Get the message.
NSString* message = [HexUtil stringFromHexString:[self
getHexString:data]];
// A data size of 0 is an instruction to clear the display.
if (message.Length == 0)
{
// Clear the display.
}
}// #3
-(void)OnUserSelectionRequest:(NSData *)data
{
/* data[0] – selection type
data[1] – timeout
data[2..n] – remainder contains zero-terminated string items */
// display/retrieve user selection.
.
// set status and selection result.
[self.mtSCRALib.setUserSelectionResult:(Byte)status
selection(Byte)userSelection];
}// #4
-(void)OnARQCReceived:(NSData *)data
{
/* data[0..1] – ARQC length
data[2..n] – remainder contains the ARQC TLV object */
// #4a Forward ARQC to Processor.
/* An application function to forward the ARQC
to a Processor for approval. */
proccesorResponse = sendARQCToProcesor(data);
/* No need to send ARQC Response if transaction option
had enabled Quick Chip mode. */
if (isQuickChipEnabled())
{
return;
}
// #4b Set Acquirer Response.
// An application function to build Acquirer Response.
NSData* response = buildAcquirerResponse(processorResponse);
// Set Acquirer Response.
[self.mtSCRALib.setAcquirerResponse:(unsigned char *)response
length:(int)response.length];
}// #5
-(void)OnDisplayMessageRequest:(NSData *)data
{
// Get the message.
NSString* message = [HexUtil stringFromHexString:[self
getHexString:data]];
// A data size of 0 is an instruction to clear the display.
if (message.Length == 0)
{
// Clear the display.
}
}// #6
-(void)OnTransactionResult:(NSData *)data
{
/* data[0] – Signature Required
data[1..2] – Batch Data length
data[3..n] – remainder contains the Batch Data TLV object */
// Parse the TLV from data[].
.
// Abstract Approval status from TLV tag “DFDF1A”.
.
// Abstract Signature Required status from TLV tag data[0].
.
}