PayFacto API v2.1.1 (Secure Payment) - Android - App-to-App - Main

PayFacto API v2.1.1 (Secure Payment) - Android - App-to-App - Main

PayFacto API v2.1.1 (Secure Payment) - Android - App-to-App - Main
Implementation Guide

Enable your Android POS application to launch and control the PayFacto Secure Payment application on PAX devices using Android Intents to process credit, debit, cash, and admin transactions without any REST API calls.

API Version: v2.1.1   |   Last updated: 2026-05-29

1

Prerequisites

Credentials

πŸ“±

PayFacto Payment Application

The PayFacto payment application must be installed and active on the target PAX Android device. This specification is available on software version string PF_PAYDROID_100 and beyond. Contact your PayFacto representative to provision the application.

πŸͺ

Terminal ID (TID) & Merchant ID (MID)

Assigned during merchant onboarding. Retrievable at runtime via the ASKAPPINFO intent (see Section 3, Step 1). Sent from unlocked payment application only.

Third-party accounts

🌐

PAX Technology Android Device

A supported PAX Android terminal with the PayFacto payment application installed. Contact your PayFacto account manager to confirm device compatibility.

Environment setup

βš™οΈ

Android Development Environment

Android Studio targeting a minimum SDK version compatible with the PAX device OS. No additional libraries or SDKs required β€” this integration uses the standard Android Intent API only.

ℹ️

Copyright

This document is proprietary to PayFacto and has been provided on a confidential and restricted basis.
This document provides details that are essential to PayFacto business and are proprietary.
PayFacto is providing this document with the express understanding that it will be held in confidence.
Any use, display, reproduction, disclosure or dissemination, by any method now known or later developed, of this material or the information contained herein, in whole or in part, without the prior written consent of PayFacto is strictly prohibited.
PayFacto logo is registered trademark of PayFacto Inc. and may not be copied, imitated or used, in whole or in part, without prior written permission. All other trademarks, registered trademarks, product names, and logos identified or mentioned herein are the property of their respective owners

⚠️

Disclaimer

Information provided in this document describes capabilities available at the time of this document was developed, and information available from industry payment schemes and card associations.
The document is intended to be used as a guideline and PayFacto accepts no liability for any errors or omissions in this document.
PayFacto is bound by the rules and regulations of the payment schemes and card associations available at the time of producing this document and described in the document.

🚫

Non-Disclosure Agreement (NDA)

A Non-Disclosure Agreement must be executed between PayFacto Inc. and the intended audience of this document.

2

How It Works

This document is intended for customers and third parties wishing to control the PayFacto payment application running on a PAX Android device using an Android Intent (App to App). The document contains the functional message specifications for a Point of Sale (POS) software to process credit card, debit card and admin transactions. This specifications is available on software version string PF_PAYDROID_100 and beyond.

3

Step-by-Step Implementation

1

PayFacto Application Information Request

To call the PayFacto payment application, a developer needs to create an Android intent.

Java
Intent intent = new Intent("com.payfacto.terminal.payment.PAYMENT_ACTIVITY");

More extra data is needed to complete the intent:

Extra String Label Description Possible values Value Description
"ASKAPPINFO" Ask for information True True is the only valid value to be passed here

Code example:

Java
try {
Intent intent = new Intent("com.payfacto.terminal.payment.PAYMENT_ACTIVITY");
intent.putExtra("ASKAPPINFO", true);

startActivityForResult(intent, 1);
Toast.makeText(getApplicationContext(), "Success",Toast.LENGTH_SHORT).show();
}catch(Exception e){
Toast.makeText(getApplicationContext(), "Fail",Toast.LENGTH_SHORT).show();
}

PayFacto Application Information Response

Use this piece of code as a reference. Some values will only be sent if the terminal is not locked.

Java
            String value;
if (data != null ) {
boolean isBlock = data.getBooleanExtra("BLOCK", false);
value += "BLOCK = " + isBlock + "\n";
if (!isBlock) {
value += "TID = " + data.getStringExtra("TID") + "\n";
}
value += "LANG = " + data.getStringExtra("LANG") + "\n";
value += "THEME (is dark theme)= " + data.getBooleanExtra("THEME", false) + "\n";
value += "PAYSOFTSTRING = " + data.getStringExtra("PAYSOFTSTRING") + "\n";
}

List of extra data receive:

Extra data on activity result Description
"BLOCK" Boolean value, if true, this means the terminal is locked
"TID" Terminal ID, sent from unlocked payment application
"MID" Merchant ID, sent from unlocked payment application
"PWDSALT" Salt used to hash all passwords (merchant, admin, and clerk), sent from unlocked payment application
"LANG" Merchant language on payment application (EN, FR)
"PAYSOFTSTRING" PayFacto payment software string
"AUTOSETTLETIME" First auto settle time set in payment app
"MERCHANTNAME" Merchant name
"MERCHANTSTREETADDRESS" Merchant address
"MERCHANTCITYPROV" Merchant city and province
2

Transactions to PayFacto Application

To call the PayFacto payment application, a developer needs to create an Android intent.

Java
Intent intent = new Intent("com.payfacto.terminal.payment.PAYMENT_ACTIVITY");

More extra data is needed to complete the intent:

Extra String Label Description Possible values Value Description
TRANSACTION Transaction type to be processed "SALE" Purchase/Sale
"REFUND" Refund
"081" Settlement
"AUTOSETTLE" Auto settlement
"005" Credit preauthorization
"002" Forced post
"001" Verify credit account
"015" Completion of a previous preauthorization
"VOID" Void of a previous transaction. Using invoice, sequence number or idempotency. Priority is sequence number > invoice > idempotency
"COMPLWOPA" Completion of a preauthorization without using data from a previous preauthorization
"CASH" Cash
"REPRINT" Reprint a transaction. Using invoice number, sequence number or idempotency is possible. If no invoice, sequence number or idempotency is sent, the last transaction process will be reprint. If no transaction found return -4 in terminal error code Priority is sequence number > invoice > idempotency
"REPORT" To print detailed or summary reports without doing a settlement.
"TRXDATA" Return all data of transaction. Using invoice number, sequence number or idempotency is possible. If no invoice, sequence number or idempotency is sent, the last transaction process will be reprint. If no transaction found return -4 in terminal error code Priority is sequence number > invoice > idempotency
"REPRINTSETTLEMENT" Reprint the latest settlement printed
"REPRINTDETAIL" Reprint the latest detail report printed
"REPRINTSUMMARY" Reprint the latest summary report printed
"CONNECTIONTEST" Test internet connection Result return in terminalErrorCode 0 = success 1 = connectivity issue 2 = internet issue 3 = Payfacto issue
"AMOUNT" Total amount of the transaction including the tax "0" When using a 001 transaction type
"1000" Any positive value without decimal sign
"TIP" Tip amount added to a purchase/sale transaction. If tip value is added on the request and the payment application tip feature is disabled, it will be automatically enabled. "100" Any possible value without decimal sign. A negative value will be considered as 0 tip amount.
"TAXAMOUNT" The Tax amount, included in the "AMOUNT" Field. Must be lower than the "AMOUNT" field "200" Any positive value without decimal sign. If the tax amount is not numeric or the amount is below 0 or higher than the AMOUNT field it will return the error code -2 in terminalerrorcode
"INVOICE" Invoice number used for transaction processing. For the Completion and Void the invoice is used to recover the previous transaction to complete or void. "123456" Max length of 6, alphanumerical. If the value was previously used on an authorized transaction still in the open batch for the terminal, a response code of -4 will be returned
"IDEMPOTENCY_KEY" UUID as String "550e8400-e29b-41d4-a716-446655440000" Unique key of the transaction. (optional) Use to search or void a transaction with the idempotency key. For transaction type: VOID, TRXDATA, REPRINT (optional)
"CLERK" Operator ID used for the transaction "001" Max length 3, numerical value. The ID must exist in the PayFacto payment application clerk management.
"AUTHCODE" Mandatory on forced post transactions "12345678" Max length of 8 alphanumerical value.
"API" Mandatory unique value to be passed on each intent "API" Unique value to be set for this label
"MERCHLANG" Merchant language to be used "F" For French
"E" For English
"ORIGINALAMOUNT" Mandatory original amount used on completion without preauthorization "100" Any positive value without decimal sign
"PRINTDETAIL" If the auto settlement will print the detail report true boolean value, false is the default value if not receive, true if the detail report is printed
"PRINTSUMMARY" If the auto settlement will print the summary report true boolean value, false is the default value if not receive, true if the summary report is printed
"SEQ" Transaction number "150e8430-e29b-41f4-a716-446655440010" UUID of the transaction number for void, completion or reprint
"SETTINGTIP" If the tip will be activated "1" The tip will be activated
"0" The tip will be deactivated
Any other value No change will be made to the tip settings
"SETTINGCASHBACK" If the cashback will be activated "1" The cashback will be activated
"0" The cashback will be deactivated
Any other value No change will be made to the tip settings
"SETTINGPRINTECR" If the printing will be enable "1" Printing will be activated
"0" Printing will be deactivated
Any other value No change will be made to the tip settings
"SETTINGCASHORCARD" If the card or cash option will be enable on sale transaction "1" Cash or card option will be enable
"0" Cash or card option will be disable
Any other value No change will be made to the cash or card option
"DISABLEGIFT" Setting to disable transaction to be paid via gift card. Default value is false. true, false True will disable the gift option in the card reader screen
"REPORTTYPE" To print detailed report, summary report or both for the REPORT transaction. "1" Print summary report
"2" Print detailed report
"3" Print both

If one the the field above is missing or invalid, a response will be receive in the result data intent as the "TERMINALERRORCODE" extra data as a int.

The intent need to be call with the startActivityForResult function. ex: startActivityForResult(intent, 0);

Code example:

Java
try {
Intent intent = new Intent("com.payfacto.terminal.payment.PAYMENT_ACTIVITY");

switch ((int)spinner.getSelectedItemId()){
case 0:
intent.putExtra("TRANSACTION", "SALE");
break;
case 1:
intent.putExtra("TRANSACTION", "REFUND");
break;
case 2:
intent.putExtra("TRANSACTION", "005");
break;
case 3:
intent.putExtra("TRANSACTION", "002");
break;
case 4:
intent.putExtra("TRANSACTION", "015");
break;
case 5:
intent.putExtra("TRANSACTION", "VOID");
break;
case 6:
intent.putExtra("TRANSACTION", "081");
break;
case 7:
intent.putExtra("TRANSACTION", "001");
break;
case 8:
intent.putExtra("TRANSACTION", "COMPLWOPA");
break;
case 9:
intent.putExtra("TRANSACTION", "CASH");
break;
case 10:
intent.putExtra("TRANSACTION", "080");
break;
case 11:
intent.putExtra("TRANSACTION", "AUTOSETTLE");
break;
default:
intent.putExtra("TRANSACTION", "SALE");
}


switch ((int)spinnerLanguage.getSelectedItemId()) {
case 0:
intent.putExtra("MERCHLANG", "E");
break;
case 1:
intent.putExtra("MERCHLANG", "F");
break;
}

intent.putExtra("AMOUNT", etAmount.getText().toString());
intent.putExtra("TIP", etTip.getText().toString());
intent.putExtra("ORIGINALAMOUNT", etOriginalAmount.getText().toString());
intent.putExtra("INVOICE", etInvoice.getText().toString());
intent.putExtra("CLERK", etClerk.getText().toString());
intent.putExtra("AUTHCODE", etAuthCode.getText().toString());
intent.putExtra("PRINTDETAIL", swPrintDetail.isChecked());
intent.putExtra("PRINTSUMMARY", swPrintSummary.isChecked());
intent.putExtra("SENDHOST", swSendHost.isChecked());
intent.putExtra("SEQ", etSequence.getText().toString()); // for VOIDS and COMPLETION only

startActivityForResult(intent, 0);

Toast.makeText(getApplicationContext(), "Success",Toast.LENGTH_SHORT).show();
}catch(Exception e){
Toast.makeText(getApplicationContext(), "Fail",Toast.LENGTH_SHORT).show();
}
3

POS Delivered receipts

If the calling application (Assumed to be a POS) wants to support E-Receipt options, the Secure Payment application can facilitate this.

Configure the application

The following settings allow a POS to be able configure this:

  1. Ensure that Receipt delivery method is set to POS delivered
  2. Enabling physical copy printing:
    1. If the device does not have a printer you will see only one Print option. If the POS supports printing, this setting can be turned on. The POS will be responsible for formatting the receipt based on the data returned.
    2. If the device has a printer the Secure Payment application will handle the printing.
  3. Digital copies (E-Receipts).
    1. Under Digital copy setting Email to be on will show the option for a customer to enter their email address.
    2. Under Digital copy setting SMS to be on will show the option for a customer to enter their phone number. Country codes are currently not an option. It is assumed to be a Canada or US phone number with country code +1.
    3. Under Digital copy setting QR Code to be on will show the option for a customer to scan a QR code to receive their receipt. The Secure Payment application does not show a QR code to the customer. This feature is to facilitate it such that the POS can generate and show one.

Handling the response

For a calling application to handle the receipt selection, the response Intent will contain the following fields:

  • RECEIPT_DECISION
  • CUSTOMER_EMAIL
  • CUSTOMER_PHONE_NUMBER
  • CUSTOMER_PHONE_COUNTRY_CODE

Screenshots on enabling POS Delivered receipts

Receipt options screen. Ensure POS delivered is on.

Customer receipt prompt options - Device has printer.

Customer receipt prompt options - Device has no printer

4

Testing

ℹ️

This integration runs on a physical PAX device β€” there is no sandbox URL. Use Training Mode on the device for safe testing. When training mode is active, TRAININGMODE = true is returned in every transaction result and no real funds are moved.

Examples of calls to the PayFacto payment application

Purchase

Java
  Intent intent = new Intent("com.payfacto.terminal.payment.PAYMENT_ACTIVITY");

intent.putExtra("TRANSACTION", "SALE");
intent.putExtra("AMOUNT", "100"); // 1.00$
intent.putExtra("INVOICE", "654321123456");
//intent.putExtra("CLERK", etClerk.getText().toString()); // only if clerks are enabled and clerk exist in list.
intent.putExtra("API", "API");

startActivityForResult(intent, 0);

Purchase with tip

Java
  Intent intent = new Intent("com.payfacto.terminal.payment.PAYMENT_ACTIVITY");

intent.putExtra("TRANSACTION", "SALE");
intent.putExtra("AMOUNT", "100"); // 1.00$
intent.putExtra("TIP", "100"); // this will enable tip processing in the payment application, even if it was disabled.
intent.putExtra("INVOICE", "654321123456");
//intent.putExtra("CLERK", etClerk.getText().toString()); // only if clerks are enabled and clerk exist in list.
intent.putExtra("API", "API");

startActivityForResult(intent, 0);

Refund

Java
  Intent intent = new Intent("com.payfacto.terminal.payment.PAYMENT_ACTIVITY");

intent.putExtra("TRANSACTION", "REFUND");
intent.putExtra("AMOUNT", "100"); // 1.00$
intent.putExtra("INVOICE", "654321123456");
//intent.putExtra("CLERK", etClerk.getText().toString()); // only if clerks are enabled and clerk exist in list.
intent.putExtra("API", "API");

startActivityForResult(intent, 0);

Void

Java
  Intent intent = new Intent("com.payfacto.terminal.payment.PAYMENT_ACTIVITY");

intent.putExtra("TRANSACTION", "VOID");
intent.putExtra("SEQ", "150e8430-e29b-41f4-a716-446655440010"); // existing transaction sequence number required here
//intent.putExtra("CLERK", etClerk.getText().toString()); // only if clerks are enabled and clerk exist in list.
intent.putExtra("API", "API");

startActivityForResult(intent, 0);

Verify Account

Java
  Intent intent = new Intent("com.payfacto.terminal.payment.PAYMENT_ACTIVITY");

intent.putExtra("TRANSACTION", "001");
intent.putExtra("INVOICE", "654321123456");
//intent.putExtra("CLERK", etClerk.getText().toString()); // only if clerks are enabled and clerk exist in list.
intent.putExtra("API", "API");

startActivityForResult(intent, 0);

Pre-authorization

Java
  Intent intent = new Intent("com.payfacto.terminal.payment.PAYMENT_ACTIVITY");

intent.putExtra("TRANSACTION", "005");
intent.putExtra("AMOUNT", "100");
intent.putExtra("INVOICE", "654321123456");
//intent.putExtra("CLERK", etClerk.getText().toString()); // only if clerks are enabled and clerk exist in list.
intent.putExtra("API", "API");

startActivityForResult(intent, 0);

Pre-authorization completion

Java
  Intent intent = new Intent("com.payfacto.terminal.payment.PAYMENT_ACTIVITY");

intent.putExtra("TRANSACTION", "015");
intent.putExtra("SEQ", "285"); // existing preauthorization transaction sequence required here
intent.putExtra("AMOUNT", "50"); // amount of completion, this example = 0.50$
//intent.putExtra("CLERK", etClerk.getText().toString()); // only if clerks are enabled and clerk exist in list.
intent.putExtra("API", "API");

startActivityForResult(intent, 0);

Force post

Java
  Intent intent = new Intent("com.payfacto.terminal.payment.PAYMENT_ACTIVITY");

intent.putExtra("TRANSACTION", "002");
intent.putExtra("AMOUNT", "100"); // 1.00$
intent.putExtra("AUTHCODE", "12345678");
intent.putExtra("INVOICE", "654321123456");
//intent.putExtra("CLERK", etClerk.getText().toString()); // only if clerks are enabled and clerk exist in list.
intent.putExtra("API", "API");

startActivityForResult(intent, 0);

Settlement

Java
  Intent intent = new Intent("com.payfacto.terminal.payment.PAYMENT_ACTIVITY");

intent.putExtra("TRANSACTION", "081");
//intent.putExtra("CLERK", etClerk.getText().toString()); // only if clerks are enabled and clerk exist in list.
intent.putExtra("API", "API");

startActivityForResult(intent, 0);

Auto Settlement

Java
  Intent intent = new Intent("com.payfacto.terminal.payment.PAYMENT_ACTIVITY");

intent.putExtra("TRANSACTION", "AUTOSETTLE");
intent.putExtra("PRINTDETAIL", true);
intent.putExtra("PRINTSUMMARY", true);
//intent.putExtra("CLERK", etClerk.getText().toString()); // only if clerks are enabled and clerk exist in list.
intent.putExtra("API", "API");

startActivityForResult(intent, 0);

Report

Java
Intent intent = new Intent("com.payfacto.terminal.payment.PAYMENT_ACTIVITY");

intent.putExtra("TRANSACTION", "REPORT");
intent.putExtra("REPORTTYPE", "1"); //This will print a summary report
intent.putExtra("API", "API");

startActivityForResult(intent, 0);
5

Error Handling

On the onActivityResult(int requestCode, int resultCode, Intent data) The Intent data will contain the return value as extra all in String value. If there is a problem with the data sent to the application, an error code will be sent back into the "TERMINALERRORCODE" extraData, other wise, "RSPCODE" will be the response code from the switch.

Value of the error code if application reject:

Error code value Description
-1 No extra data
-2 Amount, Invoice or idempotency key sent is invalid
-3 Transaction type is invalid
-4 Invoice sent is already used or do not exist for completion/void
-5 Invoice number is already voided
-6 Clerk is not on the terminal
-7 Authorization code is invalid
-8 Battery is too low (less than 8%)
-9 Original amount invalid
-10 Tip amount invalid
-11 DataCandy transaction
-12 Network error
-14 transaction didn't finish as expected, all data will still be return of the transaction status if any. For example a transaction can be approved and for some reason didn't end properly. The intent result will contain "TERMINALERRORCODE=-14" and "RSPCODE=000"
-15 Termlink not installed
-16 Transaction in progress
-17 Idempotency re-use
-18 Idempotency waiting for response
-100 BroadPos error, not able to connect to termlink app
120 Terminal is block and cannot perform a transaction. A host download is needed most likely
200 Tip screen cancelled by user
206 Card reader cancelled by user
207 Cashback screen cancelled by user
212 Select account screen cancelled by user
237 Manual entry cancelled by user
240 Enter PIN cancelled by user
267 Cash or card screen cancelled by user
268 Confirm void cancelled by user
269 Confirm completion cancelled by user
300 Tip screen timed out
306 Card reader timed out
307 Cashback screen timed out
312 Select account screen timed out
335 Manual entry timed out
338 Enter PIN timed out
351 Cash or card screen timed out
352 Confirm void timed out
353 Confirm completion timed out
277 Gift increment swipe cancelled by user
278 Gift increment manual entry cancelled by user
279 Gift redemption swipe cancelled by user
280 Gift redemption manual entry cancelled by user
372 Gift increment swipe timed out
373 Gift increment manual entry timed out
374 Gift redemption swipe timed out
375 Gift redemption manual entry timed out

List of extra data receive:

Extra data on activity result Description Note
"TERMINALERRORCODE" Terminal error code
"RSPCODE" Response code "000" = approved "05" = Declined empty mean it was cancelled
"AUTHCODE" Authorization code
"BATCHNBR" Batch number
"SEQNBR" Transaction number UUID of the transaction number
"INVNBR" Invoice number
"IDEMPOTENCY_KEY" Idempotency key of the transaction UUID as String
"TIMESTAMP" Timestamp
"ISSUERCARDTYPE" Issuer card type Visa = "VISA" MasterCard = "MASTERCARD" Amex = "AMEX" Discover = "DISCOVER" Diners = "DINERS" JCB = "JCB" Cash = "CASH" Interac = "INTERAC"
"CARDTYPE" Cardtype (C for Credit, D for Debit)
"MASKEDCARDNBR" Masked card number
"EXPDATE" Expiration date of the card
"ENTRYMODE" Entry mode "D" = EMV Contact "F" = Fallback "M" = Manual entry "C" = Contactless "S" = Swipe
"APPLABEL" Application label use.
"AID" Application identification number
"TVR" Terminal verification result
"TSI" Transaction Status Indicator
"CVM" CVM result
"ARQC" Tag 9f26 application cryptogram
"AUTHRESULT" Auhtorization result -1 = null 0 = TC, offline approved 1 = AAC offlline declined 2 = ARQC online required
"ISDEBIT" Transaction is debit or not, boolean value
"ACTTYPE" account type of the transaction, 1 for checking, 2 for saving, string value
"AMOUNT" Transaction amount
"TIP" Tip amount
"CASHBACK" Cashback amount
"FEES" Fees amount
"APPVERS" Application version
"TERMID" Terminal ID
"TRXRSLTSTR" Transaction result in String value
"TRXDATE" Transaction date
"TRXTIME" Transaction time
"MERCHNAME" Merchant name
"MERCHSTRADR" Merchant street address
"MERCHCITYPROV" Merchant city and province
"EXTRADISP" Extra data to display on receipt
"CLERKID" Clerk Id
"CUSTLANG" Customer language
"RECEIPT" Receipt as plain text that can be used to print text
"TRAININGMODE" Training mode True if training mode active
"AUTOSETTLETIME" First auto settle time set in payment app. Null if no time is set. The time is in milliseconds, use it to get the hour and minutes of the settlement time.
"RECEIPT_DECISION" The decision made by the customer when asked if they want a receipt One of the following: DECLINED - Meaning that the customer does not want a receipt. TIMEOUT - The screen timed out and no selection was made. QR_CODE - The QR code option was selected. The Secure Payment application does not display a QR code. It would be up to the calling application to handle this. EMAIL - The Email option was selected. The Secure Payment application does not send the email. It would be up to the calling application to handle this. SMS - The SMS option was selected. The Secure Payment application does not send the SMS message. It would be up to the calling application to handle this. PRINT - The print option was selected but the Secure Payment application cannot print it due to not having a printer. TERMINAL_PRINTED - The print option was selected and the Secure Payment application has handled the printing already.
"CUSTOMER_EMAIL" The email address that the customer has entered in on the Secure Payment application after selecting Email for their customer receipt. Maximum length: 255 The email address returned here is validated to be well-formed.
"CUSTOMER_PHONE_NUMBER" The phone number that the customer has entered in on the Secure Payment application after selecting Sms for their customer receipt. For Canada & US numbers: Maximum length: 10 Example: If the phone number entered was 123 456 7890, the returned format would be: 1234567890 For other countries. Minimum length: 3 Maximum length: 12 Terminal does not validate the format. The phone number returned does not include country code.
"CUSTOMER_PHONE_COUNTRY_CODE" The country code that the customer has selected in the Secure Payment application after selecting Sms for their customer receipt. Maximum length: 6 The country code returned only contains digits ie. +1 β†’ 1 +44 β†’ 44 +44-1481 β†’ 441481

Additional values from the settlement transaction only:

Extra data on activity result Description
"BATCHNBR" Settlement batch number
"SETTPREVAMOUNT" Settlement previous batch settled amount
"SETTRESPCODE" Settlement response code
"SETTAMOUNT" Settlement total amount
"SETTDATETIME" Settlement date time
"SETTCOUNT" Settlement total count
"SETTAMEXCOUNT" Settlement American Express count
"SETTAMEXTOTAL" Settlement American Express total amount
"SETTDISCCOUNT" Settlement Discover count
"SETTDISCTOTAL" Settlement Discover total amount
"SETTJCBCOUNT" Settlement JCB count
"SETTJCBTOTAL" Settlement JCB total amount
"SETTINTERACCOUNT" Settlement Interac count
"SETTINTERACTOTAL" Settlement Interac total amount
"SETTMASTERCOUNT" Settlement MasterCard count
"SETTMASTERTOTAL" Settlement MasterCard total amount
"SETTVISACOUNT" Settlement Visa count
"SETTVISATOTAL" Settlement Visa total amount
Java
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);

String value = "";
if (data != null )
{
value += "TERMINALERRORCODE = " + data.getIntExtra("TERMINALERRORCODE", 0) + "\n";
value += "MERCHNAME = " + data.getStringExtra("MERCHNAME") + "\n";
value += "MERCHSTRADR = " + data.getStringExtra("MERCHSTRADR") + "\n";
value += "MERCHCITYPROV = " + data.getStringExtra("MERCHCITYPROV") + "\n";
value += "EXTRADISP = " + data.getStringExtra("EXTRADISP") + "\n";
value += "TERMID = " + data.getStringExtra("TERMID") + "\n";
value += "TRXDATE = " + data.getStringExtra("TRXDATE") + "\n";
value += "TRXTIME = " + data.getStringExtra("TRXTIME") + "\n";
value += "RSPCODE = " + data.getStringExtra("RSPCODE") + "\n";
value += "AUTHCODE = " + data.getStringExtra("AUTHCODE") + "\n";
value += "BATCHNBR = " + data.getStringExtra("BATCHNBR") + "\n";
value += "SEQNBR = " + data.getStringExtra("SEQNBR") + "\n";
value += "INVNBR = " + data.getStringExtra("INVNBR") + "\n";
value += "TIMESTAMP = " + data.getStringExtra("TIMESTAMP") + "\n";
value += "ISSUERCARDTYPE = " + data.getStringExtra("ISSUERCARDTYPE") + "\n";
value += "CARDTYPE = " + data.getStringExtra("CARDTYPE") + "\n";
value += "MASKEDCARDNBR = " + data.getStringExtra("MASKEDCARDNBR") + "\n";
value += "EXPDATE = " + data.getStringExtra("EXPDATE") + "\n";
value += "ENTRYMODE = " + data.getStringExtra("ENTRYMODE") + "\n";
value += "APPLABEL = " + data.getStringExtra("APPLABEL") + "\n";
value += "AID = " + data.getStringExtra("AID") + "\n";
value += "TVR = " + data.getStringExtra("TVR") + "\n";
value += "TSI = " + data.getStringExtra("TSI") + "\n";
value += "AMOUNT = " + data.getStringExtra("AMOUNT") + "\n";
value += "TIP = " + data.getStringExtra("TIP") + "\n";
value += "CASHBACK = " + data.getStringExtra("CASHBACK") + "\n";
value += "FEES = " + data.getStringExtra("FEES") + "\n";
value += "APPVERS = " + data.getStringExtra("APPVERS") + "\n";
value += "TRXRSLTSTR = " + data.getStringExtra("TRXRSLTSTR") + "\n";
value += "CLERKID = " + data.getStringExtra("CLERKID") + "\n";
value += "ACTTYPE = " + data.getStringExtra("ACTTYPE") + "\n";
value += "CUSTLANG = " + data.getStringExtra("CUSTLANG") + "\n";
value += "ISDEBIT = " + (data.getBooleanExtra("ISDEBIT", false) ? "true" : "false" )+ "\n";
value += "TRAININGMODE = " + data.getBooleanExtra("TRAININGMODE", false) + "\n";
value += "AUTOSETTLETIME = " + data.getStringExtra("AUTOSETTLETIME") + "\n";

//SETTLEMENT
value += "SETTBATCH = " + data.getStringExtra("SETTBATCH") + "\n";
value += "SETTPREVAMOUNT = " + data.getStringExtra("SETTPREVAMOUNT") + "\n";
value += "SETTRESPCODE = " + data.getStringExtra("SETTRESPCODE") + "\n";
value += "SETTAMOUNT = " + data.getStringExtra("SETTAMOUNT") + "\n";
value += "SETTDATETIME = " + data.getStringExtra("SETTDATETIME") + "\n";
value += "SETTTOTAL = " + data.getStringExtra("SETTTOTAL") + "\n";
value += "SETTAMEXCOUNT = " + data.getStringExtra("SETTAMEXCOUNT") + "\n";
value += "SETTAMEXTOTAL = " + data.getStringExtra("SETTAMEXTOTAL") + "\n";
value += "SETTDISCCOUNT = " + data.getStringExtra("SETTDISCCOUNT") + "\n";
value += "SETTDISCTOTAL = " + data.getStringExtra("SETTDISCTOTAL") + "\n";
value += "SETTJCBCOUNT = " + data.getStringExtra("SETTJCBCOUNT") + "\n";
value += "SETTJCBTOTAL = " + data.getStringExtra("SETTJCBTOTAL") + "\n";
value += "SETTINTERACCOUNT = " + data.getStringExtra("SETTINTERACCOUNT") + "\n";
value += "SETTINTERACTOTAL = " + data.getStringExtra("SETTINTERACTOTAL") + "\n";
value += "SETTMASTERCOUNT = " + data.getStringExtra("SETTMASTERCOUNT") + "\n";
value += "SETTMASTERTOTAL = " + data.getStringExtra("SETTMASTERTOTAL") + "\n";
value += "SETTVISACOUNT = " + data.getStringExtra("SETTVISACOUNT") + "\n";
value += "SETTVISATOTAL = " + data.getStringExtra("SETTVISATOTAL") + "\n";
}

AlertDialog alertDialog = new AlertDialog.Builder(MainActivity.this).create();
alertDialog.setTitle("Alert");
alertDialog.setMessage(value);
alertDialog.setButton(AlertDialog.BUTTON_NEUTRAL, "OK",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
alertDialog.show();

((TextView)findViewById(R.id.textView)).setText( "Response code = " + String.format("%03d",resultCode));

}
6

Go-Live Checklist

⚠️

Complete every item below in Training Mode before going live. Incomplete integrations may result in failed transactions or unhandled error states.

Device & application configuration

☐

PayFacto payment application installed on all production PAX devices with software version string PF_PAYDROID_100 and beyond (verify via ASKAPPINFO β†’ PAYSOFTSTRING).

☐

Terminal is unlocked: BLOCK = false confirmed via ASKAPPINFO on each production device.

☐

Training Mode is disabled: TRAININGMODE = false verified in a live transaction result before processing real payments.

Integration & error handling

☐

POS UI disables the payment button immediately after calling startActivityForResult() to prevent duplicate intents (TERMINALERRORCODE = -16).

☐

All negative TERMINALERRORCODE values and user cancellation/timeout codes (200–375) are handled with appropriate operator-facing messages.

☐

TERMINALERRORCODE = -14 handled: all extras are logged and RSPCODE is checked because the transaction may still be approved.

E-receipts (if POS Delivered is configured)

☐

Receipt delivery method set to POS delivered and only the intended Digital copy options (Email, SMS, QR Code) are enabled.

☐

All RECEIPT_DECISION values handled, including CUSTOMER_PHONE_COUNTRY_CODE for international SMS.

Testing sign-off

☐

All test scenarios in Section 4 produce the expected results in Training Mode.

☐

Error handling from Section 5 has been tested end-to-end and surfaces appropriate messages to the operator.

☐

A PayFacto Solutions Engineer has reviewed the integration and confirmed production readiness.

7

ANDROID

Android Intent Parameter Reference

Complete list of all intent extras for requests and responses, including types and constraints.

API Reference

πŸ“–

Error Code Index

Complete list of all API error codes, meanings, and resolution steps.

Reference

πŸ“–

POS-Delivered E-Receipts Guide

Configure and handle customer receipt delivery options (Email, SMS, QR Code) from your POS application.

Integration Guide

πŸ›Ÿ

Contact Support

Open a ticket with the PayFacto Solutions Engineering team for integration assistance.

Support