Table Of contents

Introduction

iPOS systems is a Fintech payment company partnering with resellers across the globe. Our
family of terminals, payment gateway services, and innovative software solutions help facilitate
card payments and manage sales.

As a boutique software developer providing ISOs and ISVs with innovative hardware and
software solutions, we take pride in servicing the industry’s needs and requirements while
maintaining affordability and ensuring first-class customer support. Our solutions
include Dejavoo terminal hardware, DeNovo cloud point of sale (POS) solutions, SPIn semiintegrated EMV payments, and iPOSpays payment gateway.

Please watch the video at the conclusion of this document for reference.

Purpose

The purpose of this document is to provide Invoking application solution to access by other
applications to accept the payments.

Overview

This section provides an overview of the Invoking App Deep Linking implementation guide for
iOS app developers.
Invoking App is an iOS application which will be used to accept the payments on iPOS Go App.
In designing the API, our goal was to make it simple, intuitive, and predictable. We do our best
to adhere to common open and widely accepted standards, including WRAPPER CLASS for
access, JSON format for the data and Basic Authentication and Authorisation.
Use this guide to complete the technical integrations.

Prerequisites

Before you get started with your implementation, read the integration overview to learn about
integration and required configuration.

Request TPN

Please contact the business entity to onboard as merchant and get the TPN to integrate and test
with the sandbox environment.

TPN

It’s a 12digit Numeric code that is assigned to merchant

Setup developer environment

XCODE IDE:
https://developer.apple.com/xcode/

Mobile Setup:

To access iPOSgo in the test environment, instruct the user to log in with a sandbox account. To get sandbox URL and credentials, contact support@dejavoosystems.com

Develop iOS Application

Create a new iOS project or use the existing project and configure the below snippet code into
the project.

Configure the URL Scheme
1. Invoke App Setup
2. iPosGo! Setup
Configure the SDK

Install the Applications

To install Invoke App and iPosGo!! Application via link.
I’ll create a diawi Link for testing purposes using this url to obtain the UDID for your device. I
can now share the source file of the invoke application so that you can see how it is
implemented.

https://get.udid.io/

TPN Register

TPN register is used to download the parameters to configure the merchant configuration data
from the backend application portal.

To access the SDK Reader wrapper class, import DeepLinking, and initiate an instance of the class as follows:

import DeepLinking

Request Parameters:

Parameter 

Name Description 

Sample 

tpn

It’s a Unique 12digit code. This value is unique for each merchant.

123456789012

applicationType

Application type is used to identify the application. 

“”

Snippet code:

tpn”:”123456789012” // input 

//Create a variable to access the methods

    var deepLinkVariable = Wrapper()

deepLinkVariable.makeARequestBasedOnTPN(tpnNo: tpn, delegate: self)

  (i.e) jsonRequest = {“tpn”:”123456789012”, “appType_Key”:”IPosGo!”} 

Delegate is to handle the two scenario’s one is success and failure case as to be followed  

// it helps to open the iPosGo! App to give the input  

    func didReceiveResponse(success: URL?) {

        if UIApplication.shared.canOpenURL(success!) {

            UIApplication.shared.open(success!, options: [:]) { result in

                print(“>>>Bool”,result)

            }

        } else {

            txtResponse.text = “”

            showAlert(alertMessage: “App Not Installed in the Device!”)

        }

    }

Perform Transactions

This api is used to invoke applications to perform the transaction.  

It supports SALE, REFUND, VOID, PRE-AUTH & TICKET transaction types.

  • SALE, REFUND, PREAUTH
Request Parameters:

Parameter Name 

Type

Description 

Sample Value

*type 

String

Transaction type  

[SALE, REFUND, PREAUTH]

sale

*amount 

String

Transaction Amount 

10.00

Snippet code:

“Type”:”sale”, “Amount”:”10.00” // input  

 

//Create a variable to access the methods

    var deepLinkVariable = Wrapper()

deepLinkVariable..makeARequestBasedOnTransactionTypes(type: Type, Amount: Amount, delegate: self)  

(i.e) jsonRequest = {“type”:”sale”, “amount”:”10.00”}  

Delegate is to handle the two scenario’s one is success and failure case as to be followed  

// it helps to open the iPosGo! App to give the input  

    func didReceiveResponse(sucess: URL?) {

        if UIApplication.shared.canOpenURL(sucess!) {

            UIApplication.shared.open(sucess!, options: [:]) { result in

                print(“>>>Bool”,result)

            }

        } else {

            txtResponse.text = “”

            showAlert(alertMessage: “App Not Installed in the Device!”)

        }

    }

  • VOID, TICKET

Request parameters

Parameter Name 

Type

Description 

Sample Value

*type

string

Transaction type  

[VOID, TICKET]

ticket

*rrn

string

Its Unique identifier to track the transaction from TXN response

1234567890

Snippet code:

“Type”:”void”, “rrn”:”1234567890” // input  

 

//Create a variable to access the methods

var deepLinkVariable = Wrapper()

deepLinkVariable.makeARequestBasedOnTransactionTypes(type: Type, Amount: rrn, delegate: self)  

(i.e) jsonRequest = {“type”:”void”,  “rrn”:”1234567890”}  

Delegate is to handle the two scenario’s one is success and failure case as to be followed  

// it helps to open the iPosGo! App to give the input  

    func didReceiveResponse(sucess: URL?) {

        if UIApplication.shared.canOpenURL(sucess!) {

            UIApplication.shared.open(sucess!, options: [:]) { result in

                print(“>>>Bool”,result)

            }

        } else {

            txtResponse.text = “”

            showAlert(alertMessage: “App Not Installed in the Device!”)

        }

    }

  • BATCH

Request parameters 

Parameter Name 

Type

Description 

Sample Value

*type

string

Transaction type  

[BATCH/ SETTLEMENTS]

batch

*amount

string

Transaction Amount 

“”

Snippet code:

“Type”:”batch”, “amount”:”” // input  


//Create a variable to access the methods

    var deepLinkVariable = Wrapper()



deepLinkVariable.makeARequestBasedOnTransactionTypes(type: Type, Amount :””, delegate: self)  

(i.e) jsonRequest = {“type”:”batch”,  “amount”:””}  

Delegate is to handle the two scenario’s one is success and failure case as to be followed  

// it helps to open the iPosGo! App to give the input  

    func didReceiveResponse(sucess: URL?) {

        if UIApplication.shared.canOpenURL(sucess!) {

            UIApplication.shared.open(sucess!, options: [:]) { result in

                print(“>>>Bool”,result)

            }

        } else {

            txtResponse.text = “”

            showAlert(alertMessage: “App Not Installed in the Device!”)

        }

    }

Transaction Response

iPosGo! Call back the result in Invoke like this. You can fetch the details. 

{  [“Card”: {

  AID = A000000025010801;

  Label = AMEX;

  MaskedPan = 3767522012;

}, “BaseAmt”: [“Amt”: “100”, “Label”: “Amount”], “TxDetail”: {

  DateNTime = 20240515191215;

  Tpn = 544424127175;

  TraceNo = 1;

}, “BaseFee”: [“Amt”: “5”, “Label”: “BaseFee”], “Tax2”: [“Amt”: “21”, “Label”: “Tax2”], “surveyAns”: “1”, “Currency”: “840”, “Tip”: [“Amt”: “20”, “Label”: “Tip”], “Tax1”: [“Amt”: “11”, “Label”: “Tax1”], “Response”: {

  AppCode = AXS802;

  BatchNo = 63;

  CardType = CREDIT;

  DTxId = 03430717348412717520240515191215;

  HTxId = 000000321000803;

  InvoiceNo = 5;

  RespCode = 00;

  RespMsg = “APPROVAL AXS802 “;

  Rrn = 413613500098;

  TxRefNo = 034307173484;

}]

“Date” : “03.09.2023”  

}

Transaction Response Details:

Parameter name 

Type

Description 

Sample

*Rrn

string

It’s a Unique code. Just to tracks the TXN status 

123456789012

*DTxId

String 

It’s a Unique code.Its TXN hash key 

39676826774069372420240510183738

*Label

String 

Its Card type 

VISA, AMEX

*MaskedPan

String 

Last few digit of card number 

3767522012

*DateNTime

String 

TXN date and time 

20240515191215

*Tpn

String

Device unique Identifier 

544424127175

*TraceNo

String

Its unique code to track the TXN 

1

*CardType

String

Card type of the TXN 

CREDIT / DEBIT 

*HTxId

String 

It’s a Unique code. Just to tracks the TXN’s

000000321000803

*TxRefNo

String

It’s a Unique code. Just to tracks the TXN’s

034307173484

*DateNTime

String

It’s specify the date and time on TXN’s

20240515191215

*AppCode

String

It’s a unique code

AXS802

*RespCode

String 

It’s a unique code to represent a success data

00

*RespMsg

String

It’s a response message for success

APPROVAL AXS802 

*BatchNo

String

 

63

*InvoiceNo

String

 

5

*AID

String

 

A000000025010801

Amt

String

It’s a base amount

5

Label

String



Amount

Tax2

Amt

String

It’s an amount of State Tax

21

Tax2

Label

String

 

Tax2

Tax1

Amt

String

It’s an amount of Local Tax

11

Tax1

Label

String

 

Tax1

Tip

Amt

String

It’s an amount of given by the Tip

20

Tip

Label

String

 

Tip

Fee

Amt

String

It’s an amount of given by the mentioned Fee

9

Fee 

Label

String

 

Custom Fee

surveyAns

String

 

1

Currency

String

It’s a currency code

840

Payment session error:

enum PaymentSessionError: String {

      

    case notAllowed = “Account not allowed.”

    case backgroundRequestNotAllowed = “Background request not allowed.”

    case unsupported = “Unsupported hardware or a problem with the device”

    case osVersionNotSupported = “Please update your app to the latest iOS version.”

    case modelNotSupported = “Current device doesn’t support NFC.”

    case networkError = “Please check your network settings and try again.”

    case networkAuthenticationError = “An authentication error occurred during the server connection.”

    case serviceConnectionError = “Internal service is unavailable.”

    case notReady = “Please try the session again to resolve the issue.”

    case emptyReaderToken = “The token is empty, making it invalid.”

    case prepareExpired = “Please reinitiate the session to try again”

    case tokenExpired = “Token Expired.”

    case readerMemoryFull = “The card reader is busy.”

    case accountNotLinked = “Accept the Terms and Conditions using a valid Apple ID.”

    case accountAlreadyLinked = “Terms and Conditions have already been accepted.”

    case accountLinkingFailed = “The system couldn’t link or relink the merchant using the provided Apple ID.”

    case accountLinkingRequiresiCloudSignIn = “Please accept the Terms and Conditions on your device while signed into iCloud”

    case accountLinkingCancelled = “The linking or relinking operation has been canceled.”

    case merchantBlocked = “The merchant is blocked”

    case invalidMerchant = “The merchant is invalid or unknown”

    case somethingWentWrong = “”

    

    //PaymentCardReaderSession ReadError

    case cardReadFailed = “The reader was unable to read a card”

    case invalidAmount = “Amount must be positive and contain less than 10 digits.”

    case invalidCurrencyCode = “Currency code in the request must follow the ISO 4217 standard.”

    case nfcDisabled = “The user needs to enable their NFC”

    case noReaderSession = “No reader session is available or the session isn’t ready.”

    case passcodeDisabled = “Passcode disabled. Please set a security passcode on your device.”

    case paymentCardDeclined = “The payment card declined the transaction.”

    case paymentReadFailed = “An internal failure prevented the read operation.”

    case pinCancelled =  “The current PIN capture was canceled, thereby canceling any ongoing read operation.”

    case pinNotAllowed = “The time window for capturing a PIN after a card read has expired.”

    case pinEntryFailed = “An error occurred when capturing the PIN.”

    case pinEntryTimeout = “The ongoing PIN capture was not completed within the given time.”

    case pinTokenInvalid = “An error that indicates an invalid PIN token.”

    case readFromBackgroundError = “Read operations aren’t allowed when an app is running in the background.”

    case readNotAllowed = “This error usually occurs when there’s an entitlement issue.”

    case readNotAllowedDuringCall = “Read operations aren’t allowed during a phone call.”

    case readerServiceConnectionError = “The session wasn’t able to connect the system UI or other services”

    case readerServiceError = “Reader service internal state issue occurred.”

    case readerSessionAuthenticationError = “An authentication error occurred while refreshing reader session”

    case readerSessionBusy = “The reader is busy with another session.”

    case readerSessionExpired = “The reader session expired and couldn’t refresh due to other state changes.”

    case readerSessionNetworkError = “Network error occurred that prevented a reader session refresh.”

    case readerTokenExpired = “The configuration token for the reader session expired.”

    case vasReadFail = “Error occurred when reading a loyalty pass.”    

    case invalidReaderToken = “Invalid reader token”

    case prepareFailed = “Prepare session failed”

     

    //Custom error message

    case entitlementIssue = “Please check the tap on phone entitlement configuration.”

    case environmentIssue = “The token key environment is not acceptable.”

    case deviceSupportTapOnPay = “Device Supports Tap to Pay”

    case deviceUnSupportTapOnPay = “Your current device does not support NFC.”

    case readerSessionCleanUp = “Reader session cleaned up”

}



Video For Reference

iPOSgo! Deep Linking Demo Video.

Support

Email us directly at devsupport@denovosystem.com with any questions or suggestions.

Frequently Asked Questions:

General Questions:

Q: What kind of business is Dejavoo and what services do they offer?

A:  Dejavoo is a Fintech payment company partnering with resellers across the globe. Our family of terminals, payment gateway services, and innovative software solutions help facilitate card payments and manage sales.

As a boutique software developer providing ISOs and ISVs with innovative hardware and software solutions, we take pride in servicing the industry’s needs and requirements while maintaining affordability and ensuring first-class customer support. Our solutions include Dejavoo terminal hardware, DeNovo cloud point of sale (POS) solutions, SPIn semi-integrated EMV payments, and iPOSpays payment gateway.

Q: How can I contact Dejavoo?

A: You can reach us via email at [devsupport@denovosystem.com] or through our contact form on our website [https://dejavoo.io/company/contact/]

Technical Support

Q: How do I start the Integration Process ?

A: You should go through our integration documentation to start the process.

Q: How can I create a TPN for myself? 

A: You should reach out to our support team for further assistance.

Q: Could you please share the OTP for the testing TPN? 

A: You should refer to the portal for your respective logins. 

Steam – EditParameters – One Time Passcode

Q: What iOS versions are supported for the Deeplinking library?

A: Supported devices 

Tap to Pay on iPhone requires:

An iPhone XS or later running iOS 16.0 or later in the United States.

An iPhone XS or later running iOS 16.4 or later in Australia and the United Kingdom.

An iPhone XS or later running iOS 17.0 or later in France and the Netherlands.

We recommend asking your users to update to the latest iOS version for the best performance.

Note:

Tap to Pay won’t work on beta releases of iOS.

Q: How can they resolve the integrity error that appears when trying to install the app?

A: As mentioned in our integration documentation, you can provide UDIDs for testing the devices to resolve this issue.

Q: Why does the app crash when importing our SDK?

A: As mentioned in our integration documentation, after dragging and dropping our SDK into your project, you must enable the “Embed & Sign” in Xcode’s general settings.

Q: How can I disable the tip and tax in my TPN ?

A: You should refer to the portal for your respective logins. 

Steam – Edit Parameter – Tip & Taxes – set as No

Q: Why is an MPIN required for certain transactions?

A: This is a custom password created specifically for you. For more details about your login credentials, please refer to the portal.

Steam – Edit Parameter – Miscellaneous – Manager Password

Q: In development mode on the UAT version, what type of Apple account should I be logged into on my testing device?

A: Using a UAT version, you can use a Sandbox Account on your testing device to proceed.

Q: What best practices can help prevent “invalid reader token” error?

A: If the JWT token has expired, it throws an error. In case TPN accepts the terms and conditions on another device, this occurs.

Q: Can I integrate Adjust Tip?

A: No, In iOS you cannot make an adjust tip.

Q: Can I use the ‘Send Link’ and ‘QR Code’ features in the UAT environment?

A: Yes, you can use all the payment types in the UAT environment.

Q: Why does a “Permission Denied” alert appear, stating “You are trying to access sensitive data,” when doing the key-in?

A: For security reasons, we can restrict screen recording and screenshots while processing the key-in payment.