DvPayLite Deep Linking Integration

Version History

DateVersionDetails
01/06/23 1.0.0

Initial release

19/06/23 1.0.1

Architecture diagram revised, and AndroidManifest.xml added.

28/06/23 1.0.2

Tip Adjust API added

14/07/23 1.0.3

Added Preauth and Ticket in transaction API

07/11/23 1.0.4

Updates: Device detail API, Get TPN API, Status check API, and enhancements to existing APIs.

21/11/23 1.0.5

Updates: Debugging signing configurations updated for terminal use, and Administrative Txn API added.

26/04/24 1.0.6

Updates: Added information on 3rd party app installation in P terminals.

13/09/24 1.0.7

Updates: Request tags for payment type and receipt type updated in the performTransaction API.

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 a merchant and get the TPN to integrate and test with the sandbox environment.

TPN

It is a 12-digit Numeric code that is assigned to the merchant.

1. Setup developer environment

Android Studio IDE: developer android.com (opens in a new tab)

2. Develop Android Application

Create a new Android project or use the existing project and configure the below build.gradle and setting.gradle snippet code into the project.

3. Configure Gradle

Add below lines in build.gradle of your project

com.denovo:invoke-dvpay-lite:1.1.9.7

Add below lines in AndroidManifest.xml of your project

<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" />

To obtain the library file containing the access key and secret key required for integration, please Contact devsupport@denovosystem.com. Make sure to CC your Dejavoo representative when sending your request.

Add below lines in build.gradle of your project for running the application with signature(for P3 and P5 test devices).

To download the kozen.jks file, simply click on the highlighted text that reads kozen.jks

signingConfigs {
      debug {
            storeFile file(“kozen.jks”)
            storePassword “kozen”
            keyAlias “xc-buildsrv”
keyPassword “kozen”
v1SigningEnabled true
v2SigningEnabled true
}
     }
buildTypes {
    debug {
        signingConfig signingConfigs.debug
        …….
        }
    }

Install DvPayLite Application

Please make sure the DvPayLite application is used and installed on the payment terminal. If not please do install the application and proceed further integration. Version Control and Changes

  • Non-breaking changes: We will be adding new functionality and bug fixes to the API over time. You should expect to see new endpoints or new attributes for existing objects. Such changes will not result in a new API version. Please make sure that your code can handle new attributes gracefully. Also, please make sure your code does not depend on the order in which records are returned unless it is explicitly stated in this documentation.
  • Breaking changes: We intend to maintain the current API version for the foreseeable future. If and when we decide to add functionality that breaks the contract of the current API, we will publish it with a new version number, to keep the existing API functionality backward compatible.

High-level flow

The following is a high-level flow to communicate with the DvPayLite Application.

DvPayimage-1.png

Initialize the Application

To invoke the DvPayLite Application, the developer needs to initialize the application in an Invoking app with the set of lines below.

activityResultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) 
{ result: ActivityResult ->
 
intentApplication.handleResultCallBack(result)
 
}
 
intentApplication = IntentApplication(requireContext())

Device Register API

Device register API is used to download the terminal configuration and merchant configuration data from the backend application and import it into the DvPayLite application.

Request Parameters:

FieldTypeDescriptionExample
tpn * string It’s a Unique 12-digit code. This value is unique for each merchant.123456789012
applicationType * string The application type is used to identify the applicationDVPAYLITE

Response Details:

  1. onTerminalAdded
FieldDescriptionExample
message It’s a Unique 12 digit code. This value is unique for each merchant.Terminal Added Successfully
isValidTPN Indicates whether the TPN is validtrue
assignedBuildNumber Build number assigned to this transaction or request(Empty in this case)
  1. onTerminalAddFailed
FieldDescriptionExample
error_code Error code indicating the type of error15
error_message Message describing the errorTPN is not Configured

Snippet code

jsonRequest = {“tpn”:”123456789012”, “applicationType”:”DVPAYLITE”}
InvokeApp.intentApplication.setTerminalAddListener(object : TerminalAddListener {
 
override fun onApplicationLaunched(addTerminal: JSONObject?) {
 
//application launched success json data
 
}
 
override fun onApplicationLaunchFailed(errorResult: JSONObject) {
 
//application launched failed json data
 
}
 
override fun onTerminalAdded(terminalResult: JSONObject?) {
 
//Terminal added json data
 
}
 
override fun onTerminalAddFailed(errorResult: JSONObject) {
 
//Terminal add failed json data
 
}
 
})
 
InvokeApp.intentApplication.addTerminal(jsonRequest, InvokeApp.activityResultLauncher)

Perform Transaction API

This API is used to invoke the DvPayLite application to perform the transaction. It supports SALE, REFUND, VOID, PRE AUTH, and TICKET transaction types.

Note: For pin-based transactions, Keys to be injected in the terminal. To inject the keys in terminal, please contact developer support team at devsupport@denovosystem.com

Request Parameters:

FieldTypeDescriptionExample
type * string Transaction type should be any one of the following [SALE, REFUND, VOID, PRE_AUTH, TICKET]SALE
paymentType * string Payment Type [CREDIT,DEBIT,EBT_Food,EBT_Cash] CREDIT
amount * string Transaction Amount10.00
tip * string Transaction Tip Amount (Applicable only for sale and ticket) 1.00
applicationType * string The application type is used to identify the applicationDVPAYLITE
refId * string Transaction reference id (Should be unique for sale, refund, and Pre_Auth and should be original sale ref id for void and pre_auth refund for ticket)1234567890
receiptType * string Type of receipt Possible Options - [Merchant, Customer, Both, No]Merchant

Response Details

FieldDescriptionExample
authCode Authorization code received from the payment processorDSC058
LTaxAmount Local Tax Amount2.40
STaxAmount State Tax Amount1.20
extData Extended data related to the transaction (e.g., partial approval info, void status){"dueAmnt":"0.00","approvedAmnt":"","isPartialApprovalTxn":false,"voided":"false"}
cardHolderName Name of the cardholderSteve Rogers
batchNo Batch number associated with the transaction444
card_type Type of card used for the transaction (e.g., VISA, MASTER, DISCOVER)JCB
merchant Data to be printed on Merchant receipt along with the format and alignment in xml format. [ C - center, R- Right, L- Left, N- Normal, B- Bold]
customer Data to be printed on Customer receipt along with the format and alignment in xml format. [ C - center, R- Right, L- Left]
expDate Expiry date of the card12/25
emvTVR EMV Terminal Verification Results0000008000
emvTC EMV Transaction CertificateF23A1C0D45678910
emvTSI EMV Transaction Status IndicatorE800
emvAppName EMV Application Name (for chip card transactions)VISA CREDIT
emvAID EMV Application Identifier (for chip card transactions)A0000000041010
date Transaction date2024-10-01
disclaimer Statement acknowledging the cardholder’s receipt of goods and agreeing to cardholder obligationsCardholder acknowledges receipt of goods
fee Custom fee associated with the transaction0.62
iPOSToken Token generated for the transaction (used for tracking and security)FDBD45C65D2CCB28BE42BAF72D1D7F13A6894F146D70AD17
invoice_no Invoice number associated with the transaction2
last_4_digits Last 4 digits of the card number5859
mask_pan Masked Primary Account Number (PAN)3530145859
pinMode PIN mode used in the transaction. [0 = no PIN, 1 = PIN verified]0
refId Reference ID for tracking the transactionwhich received in the requestDL305734142454
respCode Response code from the payment processor [00 - Success, and remaining all failures]00
respMsg Response message from the payment processor for the transactionAPPROVAL DSC058
rrn Retrieval Reference Number (used for tracking in case of disputes)427510500684
sign Customer signature in the string format of Base64 encoding (if captured electronically)
status Status of the transactionApproved
time Time of the transaction06:28:39
tipAmount Amount of tip added to the transaction3.60
tipLine Whether the tip line was included in the receipt [0 = no, 1 = yes]0
totalAmount Total amount including base amount, tax, tip, and fees19.82
transId Transaction ID (unique identifier for the transaction)000004
transaction_id Same as transId, used interchangeably000004
transaction_title Title of the transaction (e.g., SALE, REFUND)SALE
transaction_mode Mode of the transaction [1 - Swipe, 2 - Chip, 3- Contactless, 4 - Manual]1
transaction_type Numeric type for the transaction [1 - Credit, 2 - Debit, 3 - EBT, 6 - Gift]1
amount_paid Total amount paid for the goods or services as Base Amount12.00

Snippet code

jsonRequest = {“type”:”SALE”, “amount”:”10.00”, “tip”:”1.00”, “applicationType”:”DVPAYLITE”, “refId”:”1234567890”}
 
InvokeApp.intentApplication.setTransactionListener(object : TransactionListener {
 
override fun onApplicationLaunched(result: JSONObject?) {
 
//application launched success json data
 
}
 
override fun onApplicationLaunchFailed(errorResult: JSONObject) {
 
//application launched failed json data
 
}
 
override fun onTransactionSuccess(transactionResult: JSONObject?) {
 
//Transaction Success json data
 
}
 
override fun onTransactionFailed(errorResult: JSONObject) {
 
//Transaction Failed json data
 
}
 
})
 
InvokeApp.intentApplication.performTransaction(jsonRequest, InvokeApp.activityResultLauncher)

Batch Settlement API

A batch is a group of transactions that have been processed but have yet to be settled. When a transaction is approved, it is added to the batch. When a batch hasn’t been settled yet, it is called an open batch, and transactions in the batch can still be voided and reversed if needed.

Request Parameters:

FieldTypeDescriptionExample
type * string Transaction type [SETTLE] SETTLE
applicationType * string The application type is used to identify the applicationDVPAYLITE

Response Details

FieldDescriptionExample
assignedBuildNumber Build number assigned to this transaction or request(Empty in this case)
TPN Terminal Processing Number (unique identifier for the terminal)132423805864
resultCode Result code indicating the outcome of the transaction0 (Success)
message Message corresponding to the resultCodeSuccess
ExtData Extended data with details about the batch settlementApp=DvPayLite, ResultCode=0, BatchNum=443, Rsp=BATCH SETTLED, Status=GB,TipAmt=39.60, TotalAmt=218.06, SHFee=6.86, NumTrans=2
Receipt Receipt information in formatted string (customer and terminal data, transaction totals, etc.)Date: 2024/10/02, Time: 06:28:39, Terminal: 132423805864, Merchant: 888000003338, Batch#: 443, Status: GB, etc.
TransReport Report summarizing transactions in the batchApp=DvPayLite, TrnsCnt=2, SaleAmt=218.06, ReturnAmt=0.0, VoidAmt=0.0, AuthAmt=0.0, TicketAmt=0.0, TotalAmt=218.06
HostResponseCode Response code from the host indicating the success of batch settlemen00
HostResponseMessage Message from the host confirming the settlement statusBATCH SETTLED
isValidTPN Indicates whether the TPN is validtrue
message Overall message or outcome of the batch processBatch settled successfully

Snippet code

settleReq = {“type”:”SETTLE”, “applicationType”:”DVPAYLITE”} InvokeApp.intentApplication.setSettlementListener(object :
 
SettlementListener {
 
override fun onSettlementFailed(p0: JSONObject) {
 
//Settlement failed json data
 
}
 
override fun onSettlementSuccess(p0: JSONObject) {
 
//Settlement success json data
 
}
 
})
 
InvokeApp.intentApplication.settleBatch(settleReq, InvokeApp.activityResultLauncher)

Tip Adjust API

This API is used to perform a tip adjustment on a sale transaction.

Note: Tip adjust is allowed only for credit transactions by processors. It is not allowed for any other transactions.

Request Parameters:

FieldTypeDescriptionExample
Type * string Transaction type [TIP ADJUST]TIP ADJUST
Amount * string Transaction Amount of original sale base transaction10.00
Tip * string Transaction Tip Amount1.00
Application type * string The application type is used to identify the application.DVPAYLITE
refId * string Transaction reference id of original sale transaction1234567890

Response Details:

Same as Perform Transaction API

Snippet code

jsonRequest = {“type”:”TIP ADJUST”, “amount”:”10.00”, “tip”:”1.00”, “applicationType”:”DVPAYLITE”, “refId”:”1234567890”}
 
InvokeApp.intentApplication.setTransactionListener(object : TransactionListener {
 
override fun onApplicationLaunched(result: JSONObject?) {
 
//application launched success json data
 
}
 
override fun onApplicationLaunchFailed(errorResult: JSONObject) {
 
//application launched failed json data
 
}
 
override fun onTransactionSuccess(transactionResult: JSONObject?) {
 
//Transaction Success json data
 
}
 
override fun onTransactionFailed(errorResult: JSONObject) {
 
//Transaction Failed json data
 
}
 
})
 
InvokeApp.intentApplication.performTipAdjust(jsonRequest, InvokeApp.activityResultLauncher)

Get TPN API

This API is used to get a device TPN.

Request Parameters:

FieldTypeDescriptionExample
applicationType * string Application type is used to identify the application.DVPAYLITE

Response Details

FieldDescriptionExample
message Application type is used to identify the application.DvPayLiteTPN
TPN Terminal Processing Number (unique identifier for the terminal)132423805864

Snippet code

jsonRequest = {“applicationType”:”DVPAYLITE”}
 
InvokeApp.intentApplication.setGetTPNListener(object : GetTPNListener {
 
override fun onApplicationLaunched(response: JSONObject?) {
 
//application launched success json data
 
}
 
override fun onApplicationLaunchFailed(response: JSONObject?) {
 
//application launched failed json data
 
}
 
override fun onGetTPN(response: JSONObject?) {
 
//Success json data
 
}
 
override fun onTPNFailed(response: JSONObject?) {
 
// Failed json data
}
})
 
InvokeApp.intentApplication.getTPN(jsonRequest, activityResultLauncher)

Device detail API

This API is used to obtain details of the device.

Request Parameters:

FieldTypeDescriptionExample
applicationType * string Application type is used to identify the application.DVPAYLITE

Response Details

FieldDescriptionExample
model Model of the deviceP3
manufacture Manufacturer of the deviceKozen
sNo Serial number of the deviceB1791E1XL8080062
TPN Terminal Processing Number (unique identifier for the terminal)132423805864
respCode Response code indicating the outcome of the request00
respMessage Message corresponding to the response codeSuccess

Snippet code

jsonRequest = {“applicationType”:”DVPAYLITE”}
 
InvokeApp.intentApplication.setGetDeviceListener(object : GetDeviceListener {
 
override fun onApplicationLaunched(response: JSONObject?) {
 
//application launched success json data
 
}
 
override fun onApplicationLaunchFailed(response: JSONObject?) {
 
//application launched failed json data
 
}
 
override fun onGetDevice(p0: JSONObject?) {
 
// Success json data
 
}
 
override fun onGetDeviceFailed(p0: JSONObject?) {
 
// Failure json data
 
}
 
})
 
InvokeApp.intentApplication.getDevice(jsonRequest, activityResultLauncher)

Status Check API

This API is used to get current transaction status.

Request Parameters:

FieldTypeDescriptionExample
refId * string Transaction reference id of original sale transaction1234567890
type * string Type of the transaction [STATUS]STATUS
applicationType * string Application type is used to identify the application.DVPAYLITE

Response Details

Same as Perform Transaction API

Snippet code

jsonRequest = {“type”:” STATUS”, “applicationType”:”DVPAYLITE”,“refId”:”1234567890”}
 
InvokeApp.intentApplication.setTransactionListener(object :TransactionListener {
 
override fun onApplicationLaunched(result: JSONObject?) {
 
//application launched success json data
 
}
 
override fun onApplicationLaunchFailed(errorResult: JSONObject) {
 
//application launched failed json data
 
}
 
override fun onTransactionSuccess(transactionResult: JSONObject?) {
 
//Transaction Success json data
 
}
 
override fun onTransactionFailed(errorResult: JSONObject) {
 
//Transaction Failed json data
 
}
 
})
 
InvokeApp.intentApplication.performTransaction (jsonRequest, activityResultLauncher)

Administrative Txn API

This API is used to get card number.

Note: For this to work, administrative transaction type to be enabled in STEAM ->edit parameters -> Under transaction tab

Request Parameters:

FieldTypeDescriptionExample
type * string Type of the transaction [ADMINISTRATIVE_TXN]ADMINISTRATIVE_TXN
applicationType * string The application type is used to identify the applicationDVPAYLITE

Snippet code

jsonRequest = {“type”:” ADMINISTRATIVE_TXN”, “applicationType”:”DVPAYLITE”}
 
InvokeApp.intentApplication.setTransactionListener(object :TransactionListener {
 
 
            override fun onApplicationLaunched(result: JSONObject?) {
                //application launched success json data  
            }
 
            override fun onApplicationLaunchFailed(errorResult: JSONObject) {
                //application launched failed json data
            }
 
            override fun onTransactionSuccess(transactionResult: JSONObject?) {
                //Transaction Success json data           
            }
 
            override fun onTransactionFailed(errorResult: JSONObject) {
                //Transaction Failed json data             
            }
        })
 
     InvokeApp.intentApplication.performTransaction (jsonRequest, activityResultLauncher)

Go Live Requirements

Following are the Go Live Activities:

  • Set up production terminal with DvPayLite app
  • Replace Production environment SDK versions in the application build gradle.

3rd party app installation in terminals

  • All the 3rd party apps integrating with DvPayLite deep-linking will be hosted in our market application which will come as default app in the firmware provided in the production terminal. To host the application in the market app, we require the below details.
  1. APK that should be hosted.
  2. Package name of application
  3. App name to display
  4. App icon to display
  • Once the application is hosted in a market app, the app can be downloaded from there in terminals and also can be updated by hosting newer applications. This can be tested on test environments and can be uploaded for production environments.

Help

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