You are currently viewing the documentation for version

Introduction

Welcome iOS Developers

The Handpoint iOS SDK provides a simple application programming interface for the Handpoint card readers.

The Handpoint SDK for iOS includes:

  • Heft Library:The core library and its interface
  • HeftSimulatorLibrary: A version of the library which simulates card reader behaviour
  • Docs: Integration manual for the Handpoint SDK

Please note that before submitting an app to the Apple App store a MFi hardware request has to be submitted to Apple, to be able to use an external accessory. Please fill our this form before submitting your app to the App store and we will get back to you. If you have any questions, contact us for more details.

version 3.0.2

Get the SDK

Getting started

Files in iOS SDK

  • HandpointAll.h: As a developer, you only need to #import this header file into your classes.
  • libheft.a: The SDK library.
  • CmdIds.h
  • FinanceResponseInfo.h
  • HapiRemoteService.h
  • HeftClient.h
  • HeftDiscovery.h
  • HeftDiscoveryDelegate.h
  • HeftManager.h
  • HeftRemoteDevice.h
  • HeftStatusReportDelegate.h
  • LogInfo.h
  • ResponseInfo.h
  • ScannerDisabledResponseInfo.h
  • ScannerEventResponseInfo.h

The SDK also includes a simulator, a library configured to simulate a card reader - intended for early development of an user interface. To use it, just link the libheft.a file in the HeftSimulatorLibrary folder, instead of the actual SDK library.

Development settings for the SDK

  • Dependencies:The Heft library depends on the Security, ExternalAccessory and libc++.dylib frameworks included with the iOS SDK. These frameworks and the libheft.a SDK library itself need to be linked to your project for the Handpoint interface to work properly.
  • Communication protocol: Your application needs to support the card reader communication protocol. For this reason, the com.datecs.pinpad string needs to be added to the Supported external accessory protocols in the .plist file:
  • 
        <key>UISupportedExternalAccessoryProtocols</key>
        <array>
            <string>com.datecs.pinpad</string>
        </array>
                
  • Background mode support: Your application needs to support connection to external devices when in the background. For this reason, in the "Capabilities" section of the project settings, the Background Modes profile needs to be ON, and the External accessory communication option must be checked. This is equivalent to adding the following entry in the .plist file:
  • 
        <key>UIBackgroundModes</key>
        <array>
            <string>external-accesory</string>
        </array>
                
  • C++ linker flag: A part of the library is written in c++ therefore the -lc++ linker flag needs to be set. Add it under "Other Linker Flags" under the "Linking" section of your projects settings "Build Settings" tab.
  • Other settings: To prevent the warning: "file was built for archive which is not the architecture being linked (armv7s)", set Build Active Architecture Only to YES.

Usage summary

Any application using the Handpoint SDK should follow these steps:

  1. Define a class that implements the HeftDiscoveryDelegate protocol.
    This class defines the behavior of the app when discovery related events are received from the SDK.
  2. Define a class that implements the HeftStatusReportDelegate protocol (it can be the same as above).
    This class defines the behavior of the app when connection and transaction related events are received from the SDK.
  3. Get a reference to the HeftManager singleton and assign your HeftDiscoveryDelegate instance as delegate.
  4. If device is available through BT connection, start the discovery process by calling the startDiscovery function of the HeftManager and recover a list of the discovered devices by calling the connectedCardReaders function of the HeftManager.
  5. If device is using a Lightning connector (HiPro devices), recover the device by directly calling the connectedCardReaders function of the HeftManager.
  6. Connect to a device by calling the clientForDevice function of the HeftManager.
  7. If connection is successful, the didConnect function of the HeftStatusReportDelegate instance will be invoked.
  8. From this point, make transactions and have fun!

`

Usage details

  1. Define a class that implements the HeftDiscoveryDelegate protocol.
    This class will define the behavior of the application when discovery related events are received from the SDK.
  2. 
        @interface MyDiscoveryDelegate () <HeftDiscoveryDelegate>
        @implementation MyDiscoveryDelegate
               
  3. Define a class that implements the HeftStatusReportDelegate protocol (it can be the same as above).
    This class will define the behavior of the application when connection and transaction related events are received from the SDK.
  4. 
        @interface MyStatusReportDelegate () <HeftStatusReportDelegate>
        @implementation MyStatusReportDelegate
               
  5. Get a reference to the HeftManager singleton in SDK by calling the sharedManager class method.
    Assign your HeftDiscoveryDelegate instance as delegate of the manager.
  6. 
        MyDiscoveryDelegate* myDiscoveryDelegate = [[alloc MyDiscoveryDelegate] init];
        HeftManager* manager = [HeftManager sharedManager];
        manager.delegate = myDiscoveryDelegate;
                
  7. If device is available through BT connection, start the discovery process by calling the startDiscovery function of the HeftManager.

    
        [manager startDiscovery];
                    

    When a device is selected by the user in the “Select device” popup window, the didFindAccessoryDevice function of the HeftDiscoveryDelegate is invoked.

    
        - (void)didFindAccessoryDevice:(HeftRemoteDevice*)newDevice
        {
            NSLog(@"Found new device");
            //Connect to found device or store it for later
        } 
                    

    When the discovery process is finished, the didDiscoverFinished function of the HeftDiscoveryDelegate instance will be invoked. Recover a list of all the discovered devices by calling the connectedCardReaders function of the HeftManager.

    
        - (void)didDiscoverFinished
        {
            NSMutableDictionary *discoveredDevices = [self.manager connectedCardReaders];
        }
                    
  8. If device is using a Lightning connection (HiPro devices), skip the previous step and recover the device by directly calling the connectedCardReaders function of the HeftManager.
  9. 
        HeftRemoteDevice *lightningDevice = [self.manager connectedCardReaders firstObject];
                
  10. Connect to a device by calling the clientForDevice function of the HeftManager.

    Expected parameters of this function are:

    • A discovered device (HeftRemoteDevice object).
    • A shared secret. The shared secret is a unique identifier. It is a used to link a merchant with his readers. Each one of your merchants will be assigned a different shared secret so it needs to be a configurable value in your application or backend. If you received a development kit with a card reader, our support team probably sent you a shared secret via email already.
    • A HeftStatusReportDelegate instance, which will be notified of all the events related with the device.
  11. 
        // Declare the shared secret (below SS is an example, please put the one sent by our support team)
        NSString *sharedSecret =@"0102030405060708091011121314151617181920212223242526272829303132";
        // Connect to reader
        [manager clientForDevice:device
                 sharedSecret:mySharedSecret
                 delegate:myStatusReportDelegate];
                
  12. If connection is successful, the didConnect function of the HeftStatusReportDelegate instance will be invoked. Function receives as parameter a HeftClient object, whose reference must be stored since it is the communication bridge to the device we have connected to.
  13. 
        - (void)didConnect:(id <HeftClient>)client
        {
            self.heftClient = client;
        }
                
  14. Once connected to the card reader, transactions can be started through the HeftClient object. For example, the next code starts a sale of 100 GBP:
  15. 
        [self.heftClient saleWithAmount:100 currency:@"GBP" cardholder:YES];
                
  16. When a transaction has been initiated (f.ex saleWithAmount), the HeftClient alerts the HeftStatusReportDelegate object by invoking responseStatus during the process and responceFinanceStatus when the process has finished.
  17. 
        - (void)responseStatus:(id<ResponseInfo>)info
        {
            NSLog(@"responseStatus:");
            NSLog(info.status);
            NSLog(info.xml.description);
        }
        
        - (void)responseFinanceStatus:(id<FinanceResponseInfo>)info
        {
            NSLog(@"responseFinanceStatus:");
            NSLog(info.status);
            NSLog(info.customerReceipt);
            NSLog(info.xml.description);
        }
                
  18. In case you are using the SDK simulator, the behavior changes according to the amount of the transaction:

    Amount Behavior
    1000 Declined transaction
    2000 User Cancelled
    3000 Signature Requested
    Other amount Approved transaction

Processing Payments Simulation

Your test payments are sent against a test server on the Handpoint side which simulates the behavior of an acquiring bank. Funds are not moved and sensitive data from the card is fully encrypted. You can use trigger amounts to generate some specific responses from our server:
Sale amounts
Amount Behaviour
37.79 Issuer response code = 01 (Refer to issuer)
37.84 Issuer response code = 05 (Not authorized)
37.93 Issuer response code = 04 (Pick up card)
37.57 Request is partially approved
37.68 Request timeout

SDK integration example

HandpointModule.h

            
#import "HandpointAll.h"

@interface HandpointModule : NSObject <HeftDiscoveryDelegate, HeftStatusReportDelegate>

- (instancetype)initWithSharedSecret:(NSString *)sharedSecret;

- (void)saleWithAmount:(NSInteger)amount
                currency:(NSString *)currency;

- (void)refundWithAmount:(NSInteger)amount
                currency:(NSString *)currency;

- (void)saleReversalWithAmount:(NSInteger)amount
                        currency:(NSString *)currency
            originalTransactionID:(NSString *)originalTransactionID;

- (void)refundReversalWithAmount:(NSInteger)amount
                        currency:(NSString *)currency
            originalTransactionID:(NSString *)originalTransactionID;

- (void)connectToAddress:(NSString *)address;

- (void)setLogLevel:(eLogLevel)logLevel;

- (void)getDeviceLogs;

- (void)getPendingTransaction;

- (void)update;

- (void)listDevices;

@end 
            
        

HandpointModule.m

            
#import "<Foundation/Foundation.h>"
#import "HandpointModule.h"
#import "HeftRemoteDevice+SendableDevice.h"
#import "SDKEvent.h"
#import "ConnectionStatus.h"
#import "Currency.h"
#import "CDVInvokedUrlCommand+Arguments.h"
#import "StatusInfo.h"
#import "TransactionResult.h"

typedef NS_ENUM(NSInteger, ConnectionStatus)
{
    ConnectionStatusNotConfigured,
    ConnectionStatusConnected,
    ConnectionStatusConnecting,
    ConnectionStatusDisconnected,
    ConnectionStatusDisconnecting,
    ConnectionStatusInitializing
};

@interface HandpointModule ()

@property (nonatomic) HeftManager* manager;
@property (nonatomic, strong) id<HeftClient> api;
@property (nonatomic) NSString *ssk;
@property (nonatomic) HeftRemoteDevice* preferredDevice;
@property (nonatomic) NSString *eventHandlerCallbackId;
@property (nonatomic) NSMutableDictionary *devices;

@end

@implementation HandpointModule

- (instancetype)initWithSharedSecret:(NSString *)sharedSecret
{
    NSLog(@"\n\tpluginInitialize");
    self.manager = [HeftManager sharedManager];
    self.manager.delegate = self;
    self.devices = [@{} mutableCopy];
    
    [self fillDevicesFromConnectedCardReaders];
    
    self.ssk = sharedSecret;
}

- (void)saleWithAmount:(NSInteger)amount
                currency:(NSString *)currency
{
    BOOL result = [self.api saleWithAmount:amount
                                    currency:currency
                                cardholder:YES];

    if (result == false)
    {
        //Do something
    }
}

- (void)refundWithAmount:(NSInteger)amount
                currency:(NSString *)currency
{
    BOOL result = [self.api refundWithAmount:amount
                                    currency:currency
                                    cardholder:YES]

    if (result == false)
    {
        //Do something
    }
}

- (void)saleReversalWithAmount:(NSInteger)amount
                        currency:(NSString *)currency
            originalTransactionID:(NSString *)originalTransactionID
{
    BOOL result = [self.api saleVoidWithAmount:amount
                                        currency:currency
                                    cardholder:YES
                                    transaction:originalTransactionID];

    if (result == false)
    {
        //Do something
    }
}

- (void)refundReversalWithAmount:(NSInteger)amount
                        currency:(NSString *)currency
            originalTransactionID:(NSString *)originalTransactionID
{
    BOOL result = [self.api refundVoidWithAmount:amount
                                    currency:currency
                                cardholder:YES
                                transaction:originalTransactionID];

    if (result == false)
    {
        //Do something
    }
}

#pragma mark - Device Management

- (void)connectToAddress:(NSString *)address
{
    HeftRemoteDevice *remoteDevice = self.devices[address];

    if (remoteDevice)
    {
        BOOL isRemoteDeviceSameAsPreferred = self.preferredDevice &&
                [self.preferredDevice.address isEqualToString:remoteDevice.address];

        // If we are already connected to this device, update shared secret
        if (self.api && isRemoteDeviceSameAsPreferred)
        {
            // Already connected to device
        }
        else
        {
            self.preferredDevice = remoteDevice;

            [self.manager clientForDevice:remoteDevice
                                sharedSecret:self.ssk
                                    delegate:self];
        }

        [self connectionStatusChanged:ConnectionStatusConnecting];
    }
    else
    {
        NSLog(@"Can't connect. No device available. Have you searched?");
    }
}
    
- (void)setLogLevel:(eLogLevel)logLevel
{
    [self.api logSetLevel:logLevel];
}

- (void)getDeviceLogs
{
    [self.api logGetInfo];
}

- (void)getPendingTransaction
{
    BOOL success = NO;

    if ([self.api isTransactionResultPending])
    {
        success = [self.api retrievePendingTransaction];
    }

    if (success)
    {
        //...
    }
    else
    {
        //...
    }
}

- (void)update
{
    [self.api financeInit];
}

- (void)listDevices
{
    NSArray* devices = [self.manager connectedCardReaders];

    /**
        * A device can have four levels of connection: unpaired, paired,
        * connected and connected in the SDK.
        *
        * Due to the nature of the iOS ExternalAccessory framework,
        * devices that are already connected at an iOS level will not appear in a normal search,
        * as they already appear through the "connectedCardReaders" array in the manager
        * (Yeah, I know)
        *
        * So the "if" takes care of differentiating those two cases
        *
        * If we have device(s) connected we just go for those, otherwise, search.
        */

    if(devices.count)
    {
        //We have device(s) already connected, we skip the search.
        for (HeftRemoteDevice *device in devices)
        {
            [self addDevice:device];
        }

        [self didDiscoverFinished];
    }
    else
    {
        //We search and wait...
        [self.manager startDiscovery];
    }
}

# pragma mark - Callbacks
    
- (void)didFindAccessoryDevice:(HeftRemoteDevice*)newDevice
{
    [self addDevice:newDevice];
}

- (void)didLostAccessoryDevice:(HeftRemoteDevice *)oldDevice
{
    [self removeDevice:oldDevice];
    
    if(self.preferredDevice && self.preferredDevice.address == oldDevice.address)
    {
        [self connectionStatusChanged:ConnectionStatusDisconnected];
        
        self.preferredDevice = nil;
    }
}

- (void)didDiscoverFinished
{
    [self fillDevicesFromConnectedCardReaders];

    for (NSString *key in [self.devices allKeys])
    {
        HeftRemoteDevice *device = self.devices[key];
        
        if ([device.address isEqualToString:<my_saved_mac_address>])
        {
            //Do something with the device if it's the same one you expect.
            break;
        }
    }
}

- (void)didConnect:(id <HeftClient>)client
{
    if(client)
    {
        self.api = client;
        
        [self connectionStatusChanged:ConnectionStatusConnected];
    }
}

- (void)connectionStatusChanged:(ConnectionStatus)status
{
    //Here you get notified of connection status changes
}

- (NSString *)stringFromConnectionStatus:(ConnectionStatus)status
{
    switch(status)
    {
        case ConnectionStatusNotConfigured:
            return @"NotConfigured";
        case ConnectionStatusConnected:
            return @"Connected";
        case ConnectionStatusConnecting:
            return @"Connecting";
        case ConnectionStatusDisconnected:
            return @"Disconnected";
        case ConnectionStatusDisconnecting:
            return @"Diconnecting";
        case ConnectionStatusInitializing:
            return @"Initializing";
    }
}

- (void)responseStatus:(id <ResponseInfo>)info
{
    //Here you'll get status updates during the transaction
}

- (void)responseError:(id <ResponseInfo>)info
{
    //Here if something went wrong
}

- (void)responseFinanceStatus:(id <FinanceResponseInfo>)info
{
    //Here's the result of your transaction
}

- (void)responseLogInfo:(id <LogInfo>)info
{
    NSLog(@"\n\tresponseLogInfo: %@", info.status);
}

- (void)requestSignature:(NSString *)receipt
{
    [self.api acceptSignature:YES];
}

- (void)addDevice:(HeftRemoteDevice *)device
{
    self.devices[device.address] = device;
}

- (void)removeDevice:(HeftRemoteDevice *)device
{
    if (self.devices[device.address])
    {
        [self.devices removeObjectForKey:device.address];
    }
}

- (void)fillDevicesFromConnectedCardReaders
{
    for (HeftRemoteDevice *device in [self.manager connectedCardReaders])
    {
        [self addDevice:device];
    }
}
    
@end
            
        

Device management

Client for device (NSString)

method Available since 1.3.1

clientForDevice

Creates a HeftClient object. If a connection is successful the HeftClient object is returned in the didConnect event. All transactions are done using the heftClient.

Parameters

Parameter Notes
device *
NSInteger
The device to connect to.
sharedSecret *
NSString*
Shared secret only known by the merchant and Handpoint.
aDelegate *
BOOL
The HeftStatusReportDelegate for the HeftClient to report to.


Events invoked

didConnect
Called when a connection to specified device was created.

Returns

Boolean
YES if operation starts successfully

Code example

//clientForDevice:sharedSecretString:delegate:
//Creates a HeftClient object(connection to device)
NSString* sharedSecret = @"0102030405060708091011121314151617181920212223242526272829303132";
-(void)connectToFirstCardReaderWith:(NSString*)sharedSecret;
{
	//Try to connect to first device in devices array
	[heftManager clientForDevice:[[heftManager devicesCopy] objectAtIndex:0] sharedSecretString:sharedSecret delegate:self];
	//Client calls the didConnect delegate function if successful 
}

Enable scanner

method Available since 1.3.1

enableScanner

Places the card reader in a scan mode. Only if the card reader supports it. To cancel/stop scan mode call the cancel method of the heft client.

Parameters

Parameter Notes
multiScan
Boolean
Yes [default] to activate multiScan mode - No to activate singleScan mode. Multi-scan mode allows the user to scan until scan operation is canceled or timeout occurs, single-scan mode is active until one scan has occurred then it disables the scan mode.
buttonMode
Boolean
Yes [default] if buttonMode is on - No otherwise. If button mode is on then the operator needs to press the scan buttons to activate the scanner(during scan mode).
timeoutSeconds
NSInteger
0 [default] - card reader will determine when scanning should time out. x - the scanner will time out if x seconds of inactivity occur.


Events invoked

responseScannerEvent:
Called to inform that a scan has been performed, several calls can be expected. Several calls to this method happen after a scan action has been performed to inform about scan information operation. The info object contains scanCode, status and a dictionary (xml).

Code example

//enableScanner:multiScan:buttonMode:timeoutSeconds
//Places the card reader in a scan only mode. 
//To cancel/stop scan mode call cancel function.
-(IBAction)startScan 
{
	[heftClient enableScanner];
}
-(IBAction)startMultiScan
{
	[heftClient enableScannerWithMultiScan:YES];
}

Disable scanner

method Available since 1.3.1

disableScanner

Disables the scanner if possible

Events invoked

responseScannerDisabled:
Called to inform that a scan has been performed, several calls can be expected. Several calls to this method happen after a scan action has been performed to inform about scan information operation. The info object contains scanCode, status and a dictionary (xml).

Code example

//disableScanner
//Disable the scanner
	-(IBAction)disableScanner
{
[heftClient disableScanner];
}

Get SDK version

method Available since 1.3.1

getSDKVersion

Returns the current SDK version number in string format

Code example

//getSDKVersion
//Log SDK version number
	NSLOG(@"SDK version: %@", [heftManager getSDKVersion];

Get SDK build number

method Available since 1.3.1

getSDKBuildNumber

Returns the current SDK build number in string format

Code example

//getSDKBuildNumber
//Log SDK build number
	NSLOG(@"SDK build: %@", [heftManager getSDKBuildNumber];

Events

responseScannerDisabled

method Available since 1.3.1

responseScannerDisabled

Called to notify that the scanner has been disabled.

Parameters

Parameter Notes
info *
ScannerDisabledResponseInfo
The info object contains information about the scanner operation.


Code example

//responseScannerDisabled:
//Called to notify that the scanner has been disabled. 
-(void)responseScannerDisabled:(id<ScannerDisabledResponseInfo>)info
{
	NSLog(info.status);
}

Objects

ScannerDisabledResponseInfo

object Available since 1.3.1

ScannerDisabledResponseInfo

The info object contains information about the scanner operation.

Properties

Property Description
statusCode
int
A numerical representation of the status.
status
Status as NSString
Financial transaction status message.
xml
XML as NSDictionary
Feedback with xml details about transaction from the card reader.

Process details

The following table contains result codes that can occur in the COMMAND response STATUS field (see section 1.3 above).

In addition the following table contains the text information presented in the <StatusMessage> field that is part of the <FinancialTransactionResponse> Xml response object.

All values are in hex in the following table.

Status ID Value <StatusMessage> Details
EFT_SUCCESS 0001 One of the following: "" (an empty string) "AUTH CODE #" "REFUND ACCEPTED" "REVERSAL ACCEPTED" Operation completed successfully. No further actions required.
EFT_INVALID_DATA 0002 "Invalid data" Invalid COMMAND request object, from the POS App, at the start of an operation. Please retry the operation. If the issue persists please contact technical support and provide card reader logs.
EFT_PROCESSING_ERROR 0003 "Processing error" An unexpected error occurred during processing. Please retry the operation. If the issue persists please contact technical support and provide card reader logs.
EFT_COMMAND_NOT_ALLOWED 0004 "Command not allowed" The card reader is currently busy processing another command. Please retry the operation once the current operation has completed.
EFT_NOT_INITIALISED 0005 "Device is not initialized" The current operation can’t be completed because there is a pending software update that must be applied before processing can continue. Please retry the operation after the card reader has restarted itself.
EFT_CONNECT_TIMEOUT 0006 "Connection time out detected" The back end connection timed out during an update. Please retry the operation. If the issue persists please contact technical support and provide card reader logs.
EFT_CONNECT_ERROR 0007 "Connection error" It was not possible to establish a connection to the back end system during an update operation. Please retry the operation. If the issue persists please contact technical support and provide card reader logs.
EFT_SENDING_ERROR 0008 "Send error" A failure was detected during communication with the back end system. If a SALE or a REFUND transaction was in progress when this occurred then you MUST contact technical support and verify whether the transaction went through or not. If you fail to do so then you may be liable for any costs incurred due to any double charges. Note: You may be asked to provide the card reader logs. Once verified please retry the operation.
EFT_RECEIVING_ERROR 0009 "Receiving error" A failure was detected during communication with the back end system. If a SALE or a REFUND transaction was in progress when this occurred then you MUST contact technical support and verify whether the transaction went through or not. If you fail to do so then you may be liable for any costs incurred due to any double charges. Note: You may be asked to provide the card reader logs. Once verified please retry the operation.
EFT_NO_DATA_AVAILABLE 000A "No data available" The POS App is trying to fetch the card reader log file but there is no data stored in the log file. If logs are required then please set the log level to an appropriate value and retry the operation.
EFT_TRANS_NOT_ALLOWED 000B "Transaction not allowed" <Currently not used>
EFT_UNSUPPORTED_CURRENCY 000C "Currency not supported" A currency has been selected that the card reader has not been configured for. Please select the correct currency and retry the operation. Alternatively, please contact technical support and ask for the specific currency to be supported.
EFT_NO_HOST_AVAILABLE 000D "No host configuration found" An update was initiated but the card reader could not find any host information for the back end system, even though it otherwise contains valid configuration. This is indicative of an invalid <hostBlock> block with in the <HostList> block in this device configuration, which was placed on the card reader during a previous update. Please contact technical support and provide card reader logs and ask for a replacement device. The card reader will be unable to update itself and must be replaced.
EFT_CARD_READER_ERROR 000E "Card reader error" Error detected in the chip reader or the magnetic stripe reader. Please retry the operation. If the issue persists please contact technical support and provide them with the card reader logs as well as asking for a replacement reader.
EFT_CARD_READING_FAILED 000F "Failed to read card data" The card reader could not read any data from the card. Please retry the operation. If the issue persists the card may be faulty, please try another card. If the issue still persists the card reader may require replacement, please contact technical support.
EFT_INVALID_CARD 0010 "INVALID CARD" The card reader detected invalid card data. Please retry the operation. If the issue persists the card may be faulty, please try another card. If the issue still persists the card reader may require replacement, please contact technical support.
EFT_INPUT_TIMEOUT 0011 "Timeout waiting for user input" The card reader timed out while waiting for a user action. No further actions required.
EFT_USER_CANCELLED 0012 "TRANSACTION VOID" "User cancelled the transaction" The current operation was cancelled by card holder. No further actions required.
EFT_SHARED_SECRET_INVALID 001D "Shared Secret invalid" The card reader believes that the POS App has an incorrect shared secret. No financial operations will be possible (e.g. SALE, REFUND). Please type the correct shared secret into the POS App or contact technical support for further assistance.
EFT_SHARED_SECRET_AUTH 001E "Authenticating POS" The card reader is about to challenge the POS App for a correct shared secret. No further actions are required.
  REPORT STATUS SPECIFIC
EFT_INVALID_SIGNATURE 0013 "TRANSACTION VOID" The merchant indicated that the signature provided by the card holder was invalid. No further actions are required.
EFT_WAITING_CARD 0014 "Waiting for card" The card reader is waiting for a card to be inserted into the chip reader or for a card to be swiped (only applies to card readers with external MSR). Insert or swipe a card to continue with the transaction.
EFT_CARD_INSERTED 0015 "Card detected" <Currently not used>
EFT_APPLICATION_SELECTION 0016 "Waiting for application selection" The card reader is waiting for the card holder to select a card application to be used for the transaction. The card holder must select an application for use (e.g. VISA, MASTERCARD, etc.) and should then press either the OK button to continue. Press the C/Cancel button to abort the transaction.
EFT_APPLICATION_CONFIRMATION 0017 "Waiting for application confirmation" The card reader is waiting for the card holder to confirm that the displayed card application should be used for the transaction. The card holder should press either the OK or the C/Cancel button.
EFT_AMOUNT_VALIDATION 0018 "Waiting for amount validation" The card reader is waiting for the card holder to confirm that the amount presented is correct. The card holder should press either the OK or the C/Cancel button.
EFT_PIN_INPUT 0019 "Waiting for PIN entry" The card reader is waiting for the card holder to enter his/her PIN. The card holder should enter his PIN and then press the OK button to continue. For PIN bypass press the OK button without entering any PIN digits (this will trigger signature fallback). Press the C/Cancel button to abort the transaction. Note: It is not possible to cancel this operation from the POS App.
EFT_MANUAL_CARD_INPUT 001A "Waiting for manual card data" <Currently not used>
EFT_WAITING_CARD_REMOVAL 001B "Waiting for card removal" A card was detected in the card reader at the start of a transaction, presumably left there from a previous transaction. Please remove the card and restart the operation.
EFT_TIP_INPUT 001C "Waiting for gratuity" The card reader is waiting for the card holder to enter/confirm tip/gratuity information.
EFT_WAITING_SIGNATURE 001F "Waiting for signature" The card reader is waiting for confirmation from the merchant that the card holder signature is valid. The merchant should press either the Accepted or Declined/Cancel in the POS App. Pressing Cancel or OK on the card reader will not have any effect.
EFT_WAITING_HOST_CONNECT 0020 "Connecting to host" The card reader is establishing a connection to the back end system. No further actions are required.
EFT_WAITING_HOST_SEND 0021 "Sending data to host" The card reader is sending data to the back end system. No further actions are required.
EFT_WAITING_HOST_RECEIVE 0022 "Waiting for data from host" The card reader is waiting for data from to the back end system. No further actions are required.
EFT_WAITING_HOST_DISCONNECT 0023 "Disconnecting from host" The card reader is disconnecting from the back end system. No further actions are required.
EFT_PIN_INPUT_COMPLETED 0024 "PIN entry completed" PIN entry has been completed. No further actions required.
EFT_POS_CANCELLED 0025 "TRANSACTION VOID" The current operation was cancelled by merchant. No further actions required.
EFT_REQUEST_INVALID 0026 "Request invalid" Card not allowed with this transaction type.
EFT_CARD_CANCELLED 0027 "TRANSACTION VOID" The chip on the card cancelled the transaction. No further actions required.
EFT_CARD_BLOCKED 0028 "CARD BLOCKED" The card used in the transaction is blocked. Please retry the transaction with a non-blocked card.
EFT_REQUEST_AUTH_TIMEOUT 0029 "Request for authorisation timed out" Indicates that the card reader detected a communication failure between itself and the back end system during the authorization phase. Please make sure the phone/pc has an internet connection and then retry the operation. If the problem persists then please contact technical support. Note: You may be asked to provide the card reader logs.
EFT_REQUEST_PAYMENT_TIMEOUT 002A "Request for payment timed out" Indicates that the card reader detected a communication failure between itself and the back end system during the payments phase. Please make sure the phone/pc has an internet connection and then retry the operation. If the problem persists then please contact technical support. Note: You may be asked to provide the card reader logs.
EFT_RESPONSE_AUTH_TIMEOUT 002B "Response to authorisation request timed out" Indicates that the card reader detected a communication failure between itself and the back end system during the authorization phase. Please make sure the phone/pc has an internet connection and then retry the operation. If the problem persists then please contact technical support. Note: You may be asked to provide the card reader logs.
EFT_RESPONSE_PAYMENT_TIMEOUT 002C "Response to payment request timed out" Indicates that the card reader detected a communication failure between itself and the back end system during the payments phase. You MUST contact technical support and verify whether the transaction went through or not. If you fail to do so then you may be liable for any costs incurred due to any double charges.   Note: You may be asked to provide the card reader logs. Once you have verified that the transaction did not go through then please make sure the phone/pc has an internet connection and then retry the operation.
EFT_ICC_CARD_SWIPED 002D "Please insert card in chip reader" <Currently not used>
EFT_REMOVE_CARD 002E "Remove the card from the reader" <Currently not used>
EFT_SCANNER_IS_NOT_SUPPORTED 002F "This device does not have a scanner" Bar-code scanner hardware is not present on this card reader. No further actions are required.
EFT_SCANNER_EVENT 0030 "" Bar-code data was just read with the bar-code scanner and returned to the POS App. No further actions are required.
EFT_BATTERY_TOO_LOW 0031 "Operation cancelled, the battery is too low. Please charge." An operation was started, but the battery charge level is too low to complete the operation. Please recharge the card reader.
EFT_ACCOUNT_TYPE_SELECTION 0032 "Waiting for account type selection" The card reader is waiting for the card holder to choose an account type for the transaction (i.e. default, credit, cheque/debit or savings).