All pages
Powered by GitBook
1 of 1

Loading...

EMV Transaction Flow

Flow Chart

Sample Flow Code: C#

// #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.
    }
}

Sample Flow Code: Android (Java)

Sample Flow Code: iOS

// #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].
    .
}