Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Sola’s payment gateway supports Donor-Advised Fund (DAF) cards, enabling secure and compliant charitable transactions through various DAF programs, including DonorsFund, OJC, Pledger, and others. Donors can use their DAF-linked cards to initiate charitable contributions, while organizations integrating with Sola can benefit from automated routing and handling based on card type. This streamlines the donation process while ensuring alignment with each DAF provider’s policies.
xCommand = grant:Recommendation
The Grant:Recommendation API call is used to initiate a grant request from a donor’s DAF account to a specific charitable organization. Once submitted, Sola automatically determines the appropriate DAF provider based on the card used and forwards the grant recommendation accordingly.
xCommand = grant:Void
The Grant:Void API call is used to cancel a previously submitted grant recommendation. This function is essential for handling donor corrections, duplicate submissions, or other administrative scenarios. Upon invocation, the request is routed to the appropriate DAF program to halt the grant in accordance with that provider's cancellation policies.
xSoftwareVersion
Yes
Version number of your software
[xversioncredentials]
x3dsActionCode
Yes
This is retrieved from the 3ds Verify Handler
SUCCESS
xCavv
Yes
This is retrieved from the 3ds Verify Handler
AAIBBYNoEwAAACcKhAJkdQAAAAA=
xEci
Yes
This is retrieved from the 3ds Verify Handler
05
xRefNum
Yes
This is retrieved from the 3ds Verify Handler
10583643601
x3dsAuthenticationStatus
Yes
This is retrieved from the 3ds Verify Handler
Y
x3dsSignatureVerificationStatus
Yes
This is retrieved from the 3ds Verify Handler
Y
Variable
Required
Description
Sample Data
xKey
Yes
Your Cardknox API key
[xkeycredentials]
xVersion
Yes
Gateway API Version. The current version is 5.0.0.
5.0.0
xSoftwareName
Yes
Name of your software
[xsoftwarecredentials]
{
"xResult": "A",
"xStatus": "Approved",
"xError": "",
"xErrorCode": "00000",
"xRefNum": "10583643601",
"xRefNumCurrent": "10583264625",
"xExp": "1234",
"xAuthCode": "75294A",
"xBatch": "5128394",
"xAvsResultCode": "NNN",
"xAvsResult": "Address: No Match & 5 Digit Zip: No Match",
"xCvvResultCode": "M",
"xCvvResult": "Match",
"xAuthAmount": "7.00",
"xMaskedCardNumber": "4xxxxxxxxxxx2503",
"xCardType": "Visa",
"xName": "John Doe",
"xToken": "q712m7h271g035n799pn1605q16757m8",
"xMID": "xxxxxxxxxx9999",
"xTID": "xxxxx6789",
"xCurrency": "USD",
"xDate": "7/11/2025 9:59:11 AM",
"xEntryMethod": "Keyed",
"xEnrolled": "Y",
"xCAVV": "AAIBBYNoEwAAACcKhAJkdQAAAAA=",
"xEciFlag": "05",
"x3DSID": "8ebb5b87-4d74-4b56-a0d0-075c6a37ab85",
"xReviewed": "Y"
}The Sola API enables developers to process payments using the Sola gateway. Systems integrating with the Sola API can submit API calls using various commands. The API supports many payment methods, including credit cards, ACH, EBT, and gift cards.
To begin building your API integration, create an account for a Sola sandbox — our secure testing environment that mimics the production environment. After signing up, you’ll be able to create user credentials for the Sola Merchant Portal. Once you log in to the Portal, you’ll be able to generate an API key from the Settings menu. Watch our Key Management video or follow the instructions below to obtain a key.
Sign in to the Sola Merchant Portal.
Select "Account Settings" from the navigation bar.
Select "Keys" from the sub-menu.
Click "Create a Key" in the top-right corner.
It is critical to copy your key and save it in a secure location, as you won’t be able to obtain the key again.
We recommend using iFields in conjunction with the Transaction API for added security. Sola iFields is an iFrames solution that keeps sensitive card data away from merchant servers while granting you complete control over form layout and design. to learn more about iFields.
The Sola iFields solution utilizes iFrames in which the user enters their credit card and/or ACH information and then uses JavaScript to generate SUTs (single-use tokens) for processing. These features allow the website to remain secure and out-of-scope for PCI compliance while allowing the developer to customize the page layout and design fully.
This API has Cross-Origin Resource Sharing (CORS) restrictions in place to enhance security. Requests made directly from a web browser client (e.g., JavaScript running in the browser) will be blocked.
Allowed Origins This API only accepts requests from server-side origins. Ensure that your requests originate from a server to successfully interact with the API.
The endpoint section defines the details for accessing and interacting with the Sola transaction API.
Method: Always use GET for health checks.
Protocol: Secure communication is enforced using https://
Environment: Specifies the targeted environment for the check, such as x1, x2, or b1. The primary environment is x1, with x2 and b1 available as backups.
Domain: The base URL is always cardknox.com
Paths: The endpoint path for health checks is /status
Method: Always use POST for transaction requests.
Protocol: Secure communication is enforced using https://
Environment: The primary environment is x1, with x2 and b1 available as backups.
Domain: The base URL is always cardknox.com
Paths/Formats: Various paths are supported based on data format requirements:
/gatewayform for form data
/gatewayjson for JSON data
/gatewayxml for XML data
The endpoints can be found in the following child pages by navigating to the appropriate page:
Transactions
Can't find what you're looking for? Please contact .
Choose the desired key type (API or iFields), description (software, etc.), and permissions.
Click "Create and View" and copy your key.
cc:adjust
cc:save
cc:avsonly
cc:postauth
cc:credit
cc:refund
cc:voidrefund
cc:voidrelease
cc:void
check:sale
check:credit
check:save
check:void
check:refund
check:voidrefund
ebtfs:sale
ebtfs:credit
ebtfs:balance
ebtfs:voucher
ebtcb:sale
ebtcb:cash
ebtcb:balance
ebtw:sale
ebtw:balance
ebtw:void
gift:issue
gift:redeem
gift:balance
gift:activate
gift:deactivate
fraud:submit
Method
Protocol
Environment
Domain
Path
Example URL
GET
https
x1 (primary) x2 (backup) b1 (backup)
cardknox.com
status
https://x1.cardknox.com/status
Method
Protocol
Environment
Domain
Path
Example URL
POST
https
x1 (primary) x2 (backup) b1 (backup)
cardknox.com
gatewayform gatewayjson gatewayxml
https://x1.cardknox.com/gatewayjson
cc:sale
cc:authonly
cc:capture
No payment integration is too complex.
Sola Payments is a complete payment platform that you can tailor to your ambition. Delivered with step-by-step support to power you forward from day one.
This integration allows developers to build fully custom payment pages while keeping card data secure. iFields generates single-use tokens (SUT) for each transaction, which is then submitted via the Transaction API for processing.
Key Benefits:
Full control over the user interface and payment experience.
Secure handling of card data, as sensitive information never touches your servers.
Flexible API integration that aligns with your system workflows.
Sola generates tokenized card representations (xToken) that can be safely stored in your database and used for card-on-file or recurring transactions. Ideal for: Platforms with existing customer records that trigger payments programmatically via API.
Create customers, payment methods, and recurring schedules directly within Sola. Sola returns identifiers for customers, payment methods, and schedules, which can be used for card on file transactions or to set up automated schedules that will run independently in the Sola gateway. Ideal for: Systems without a customer database or when you prefer Sola to run recurring billing logic.
CloudIM enables seamless integration with Sola devices via a cloud-based API, eliminating the need for physical connections, drivers, or local SDKs. Once the device is connected to the merchant’s network, you can process transactions using simple REST API calls.
Key Benefits:
No local SDKs, drivers, or complicated setup required.
Works over the cloud, allowing remote device management.
Simplifies card-present transaction handling while maintaining PCI compliance.
Sola’s PayFac API lets marketplaces and multi-merchant platforms onboard and manage sub-merchants under a single master account. Create sub-merchants programmatically, set account- or transaction-level fees, and automate revenue sharing.
Key Benefits:
API-driven sub-merchant creation and management.
Route fees to your master account per transaction or account.
Full visibility and reporting across all sub-merchants.
Across all Sola's products we use a key (xKey) to identify on what account to process a specific transaction. Each Sola product doc will guide you where to set the xKey (for example: in the body of the request along with all other parameters, in the request header as “Authorization”, in the app settings etc.). You will have a unique xKey for and production accounts.
Transaction response
Transaction responses contain valuable information that you can utilize. The most important one is xResult; this will inform your system if the transaction was approved or declined. xAuthAmount will indicate how much was actually authorized by the bank, so it is a good idea to make sure that it matches the requested amount. By default, transactions will only approve for the full amount. If the full amount is not available, the transaction will be declined. Every transaction will receive a unique xRefnum that is used to identify this unique transaction. It is helpful during troubleshooting and is also used in case of a follow-up transaction (void refund, etc.). It is a good idea to display this xRefNum to the user and add it to receipts. You can find a full list of available response parameters .
Logs
A Vendor ID is a unique identifier associated with your vendor account. This feature is useful when you will be processing payments across multiple Sola accounts. It allows for specific settings to be configured on your vendor account, and these settings will be applied on transactions that include your Vendor ID in the transaction request. When using this feature, It is optimal to include your vendor ID across all transactions that you process on the Sola gateway.
Our support team can enable your vendor account and provide you with the ID.
To use Vendor settings, include the xVendorID = {yourvendorid} in the transactions request.
iFields key: Use a single iFields key across all your accounts.
Tokenization: Tokens can be used across accounts.
Licenses: Unlimited device licenses
Tokenization is the process of replacing sensitive payment data with a non-sensitive algorithm-generated string called a token (xToken). Each time you send a card or bank account number with a transaction, the response will include a token represented by xToken.
As a merchant’s significantly increases when storing sensitive data, the best practice is to store the token in your database rather than sensitive data. You use the token for follow-up transactions.
With this approach, sensitive data will not be at risk if a data breach occurs on your local system.
Sola references the payment information on our servers associated with the token sent and processes the transaction. A new token will be returned on every new transaction processed.
You can reuse the original token multiple times. However, you should use the new returned token in the following scenarios:
If the card has a new expiration date.
If a response flag indicates, the card was updated/modified.
A token only stores the data sent with a transaction that is necessary to process future transactions. It does not store general customer information such as billing and contact information.
As an example, for a credit card transaction, only the credit card number, expiration date, street address, and zip code (which can be required for Address Verification System (AVS) validation) are stored with the token.
To generate a token for a payment method without processing a transaction, use the save command.
For credit card transactions: cc:save.
For check transactions: check:save.
The Sola Gateway automatically blocks a transaction considered a “duplicate” of another transaction based on certain identifying features and if the transactions are within 10 minutes (default timeframe) of each other.
The transaction will error with a message of: Duplicate Transaction
Identifying Features:
Key
Credit Card Number
Transaction Amount
Invoice Number
You can allow the transaction to go through by changing any of the above. Alternatively, you can pass through "xAllowDuplicate = True" in the transaction request.
You can set xDuplicateWindow with the number of minutes on a transaction request to override the default 10-minute timeframe of the duplicate checker.
Each day, all captured transactions are added to a batch file. Once the batch cutoff time is reached (determined by the processing bank), Sola automatically “batches out”, which sends the related transactions to the bank for settlement. A batch report is available in the Sola portal.
Transactions that are submitted to the Sola API will return a response with one or more of the fields below. Below are the standard parameters and their values. The field names in parentheses are the fields for the reporting API.
A sandbox account is used to simulate transactions as if it is in production. It is designed to act exactly like a production account. However, there can sometimes be unique account setups where the production account won't match the sandbox account exactly to a T. Therefore, we recommend that you do all your testing in the sandbox account and then doing one final test when going live and swapping out your sandbox key with your production key.
Test credit card and account numbers are available for testing and development. You can use any valid card number to submit transactions while using a sandbox account. The card will not actually be charged as long as you are using your sandbox key. To avoid your system unintentionally going live while still configured with your sandbox credentials, transactions in the sandbox account are limited to $10. You can bypass that limit by using the below numbers.
The Sola gateway does not require developers to go through a certification process. We do provide a process to self-certify if developers choose to do so. You can download the Sola.
Declines
When a payment fails, you will get a xResult of D or E. Typically, you would simply want to display the failure notification to the user and show them the xError in the response that may, at times, contain helpful information to identify the reason for the decline. You can choose to allow the user to try another card. There is no need to handle different error messages or error codes specifically.
Duplicates
It is a good idea to pass in a unique xInvoice with each transaction that is sent for processing so Sola can try to catch unintentional duplicate payments. You can also give the user an option to intentionally process a duplicate payment by incrementing the invoice number or adding xAllowDuplicate=true to the transaction request. You can see more about duplicate payment handling here.
Check Account Number
Check Routing Number
Most common error codes: 00000 = Approved 01332 = Duplicate Transaction 1334 = Declined Transaction 01479 = Invalid Card
xRefNum
Sola transaction reference number
Note: xRefnum is always returned regardless of the outcome of the transaction
Note: xRefnum can be a 64-bit number and should be stored as BIGINT, Long, Int64 or String
xInvoice
Invoice number
xExp
The card expiration number
xAuthCode (xResponseAuthCode)
Authorization code, for approved transactions only
xBatch (xResponseBatch)
Batch into which the transaction will settle
xAvsResultCode (xResponseAVSCode)
The Address Verification Service (AVS) response code
YYY = Address: Match & 5 Digit Zip: Match NYZ = Address: No Match & 5 Digit Zip: Match YNA = Address: Match & 5 Digit Zip: No Match NNN = Address: No Match & 5 Digit Zip: No Match XXU = Address Information not verified for domestic transaction YYX = Address: Match & 9 Digit Zip: Match NYW = Address: No Match & 9 Digit Zip: Match XXR = Retry / System Unavailable XXS = Service Not Supported XXW = Card Number Not On File XXE = Address Verification Not Allowed For Card Type XXG = Global Non-AVS participant YYG = International Address: Match & Zip: Not Compatible GGG = International Address: Match & Zip: Match YGG = International Address: Not Compatible & Zip: Match
Alternative Responses
AvsResultCodexAvsResultYAddress: Match & 5 Digit Zip: MatchZNo Match & 5 Digit Zip: MatchAAddress: Match & 5 Digit Zip: No MatchNAddress: No Match & 5 Digit Zip: No MatchXAddress: Match & 9 Digit Zip: MatchWAddress: No Match & 9 Digit Zip: MatchRRetry / System UnavailableSService Not Supported
xAvsResult
AVS verbiage
See AVS result code
xCvvResultCode (xResponseCVVCode)
Card code verification (CCV) response code
M = Match N = No Match P = Not Processed S = Should be on card, but not so indicated U = Issuer Not Certified X = No Response from Association
xCvvResult
CVV verbiage
See CVV result code
xAuthAmount (xAmount)
The total amount authorized, inclusive of tax and tip (if applicable)
xMaskedCardNumber
A masked version of the credit card used for the transaction
xCardType
Type of credit card used for the transaction
Unknown EBT GiftCard Amex Visa MasterCard Discover Diners JCB DonorsFund OJC Pledger
xName
Name of cardholder
John
xToken
Token returned for use with future transaction
gh3hpn46mp0g785915gn7h79q502976n
xCurrency
Currency that the transaction was processed in
USD
xEntryMethod
Transaction method
Keyed EMV Swipe
xDate
Date and time the transaction was processed
1/1/2020 10:00:00 AM
xRefnumCurrent
Current reference number
Used for troubleshooting purposes only. Returned when using a command that modifies an existing transaction, such as cc:void, cc:capture, or cc:adjust.
xReviewed
This will be returned only if account is configured to return this response field.
Y = Transaction was authenticated by 3ds. If authentication was submitted to the bank, the merchant will have chargeback protection.
P = Transaction was authenticated by 3ds. If authentication was submitted to the bank, the merchant may not have chargeback protection.
N =Transaction was not able to achieve 3ds authentication. If authentication was submitted to the bank, the merchant may not have chargeback protection.
F = The 3ds authentication process completed but the bank response indicated that the results were invalid. The merchant will not have fraud chargeback protection.
x3dsSubmitted
This indicates if the bank request included 3ds data elements.
1 = The bank request included 3ds data elements.
(xStatus)
The ACH status that you receive in webhooks
0 (Pending)
20 (Rejected)
5 (Cancelled)
6 (Awaiting Response)
14 (Chargeback)
16 (Settled)
18 (Returned)
19 (Hold)
xIssuerResponseCode
This code received from the card association / issuer will be returned when available.
EBT
6004861944321111844
Pledger
6599973548556861
DonorsFund
6599993776775348
OJC
6900664467242419
999999999
021000021 (any valid routing number)
(AllowPartialAuth must be set to True)
xAmount
AuthAmount
7.5
1.5
7.23
1.23
7.31
Response delayed 30 seconds
Try Again
7.32
Response delayed 30 seconds
Try Again
7.29
xCVV
CVV Result
CVV Result Code
123
M
Match
1234
M
Match
111111111
YYX
Address: Match & 9 Digit Zip: Match
111
99999
YNA
Address: Match & 5 Digit Zip: No Match
999
111111111
NYW
Address: No Match & 9 Digit Zip: Match
999
11111
NYZ
Address: No Match & 5 Digit Zip: Match
888
88888
XXR
Retry / System Unavailable
777
77777
XXU
Address Information not verified for domestic transaction
666
66666
XXS
Service Not Supported
AvsResultCode
xAvsResult
Y
Address: Match & 5 Digit Zip: Match
Z
No Match & 5 Digit Zip: Match
A
Address: Match & 5 Digit Zip: No Match
N
Address: No Match & 5 Digit Zip: No Match
X
Field Name
Description
Sample values
xResult (xGatewayResult)
Single character code indicating if the transaction was Approved or not. A = Approved E = Error D = Declined
A E D
xStatus (xResponseResult)
Verbiage indicating if the transaction was approved or not.
Approved Error Declined
xError (xResponseError)
Error message, if applicable
See error code
xErrorCode
Visa
4444333322221111
Visa
4111111111111111
Mastercard
5454545454545454
Discover
6011208703331119
American Express
xName
Response
Decline
Declined
9.91
Declined
9.92
xStreet
xZip
AvsResultCode
xAvsResult
111
11111
YYY
Address: Match & 5 Digit Zip: Match
999
99999
NNN
Address: No Match & 5 Digit Zip: No Match
Error code
370276000431054
Gateway Error
111
This page contains the API documentation for Fraud Submit transactions, in conjunction with FraudWatch. For more information regarding account access, navigate to the Transaction API parent page.
POST fraud:submit
xCommand = fraud:submit
The Submit command is used in conjunction with a valid FraudWatch account to submit e-commerce transactions for a fraud verification check.
Response delayed 30 seconds
Approved
xDescription
Behavior
Response
Delay
Response delayed 30 seconds
Approved
Timeout
Response delayed 30 seconds
Try Again
Timeout_Extended
Response delayed 120 seconds
Try Again
111
M
Match
1111
M
Match
222
N
No Match
2222
N
No Match
555
P
Not Processed
444
S
Should be on card, but not so indicated
8888
U
Issuer Not Certified
7777
X
No Response from Association
Address: Match & 9 Digit Zip: Match
W
Address: No Match & 9 Digit Zip: Match
R
Retry / System Unavailable
S
Service Not Supported
xSoftwareVersion*
String
Version number of your software
xCommand*
String
Sola transaction type
xAmount*
String
The total amount of the transaction, inclusive of tax and tip if applicable. This the total amount of the transaction
xCustom01
String
20 custom fields are available for custom data such as customer comments, etc. Use xCustom01 through xCustom20
xInvoice*
String
The merchant’s invoice number for the transaction. xInvoice is recommended when available for improved duplicate handling
xIP*
String
The customer’s IP address. Typically used for fraud detection
xEmail*
String
The customer’s email address
xBillFirstName*
String
The customer’s first name for their billing profile
xBillLastName*
String
The customer’s last name for their billing profile
xBillStreet*
String
The customer’s street address for their billing profile
xBillCity*
String
The customer’s city for their billing profile
xBillState*
String
The customer’s state for their billing profile
xBillZip*
String
The customer’s zip code for their billing profile
xBillPhone*
String
The customer’s phone number for their billing profile
xShipFirstName*
String
The customer’s first name for their shipping profile
xShipLastName*
String
The customer’s last/family name for their shipping profile
xShipStreet*
String
The customer’s street address for their shipping profile
xShipCity*
String
The customer’s city for their shipping profile
xShipState*
String
The customer’s state for their shipping profile
xShipZip*
String
The customer’s zip code for their shipping profile
xShipPhone*
String
The customer’s phone number for their shipping profile
xGatewayRefNum*
String
Transaction RefNum received from gateway for FraudWatch verification
xGatewayResult*
String
Transaction status received from gateway for FraudWatch verification (Approved/Declined/Error)
xGatewayCVV*
String
CVV for FraudWatch verification
xGatewayAVS*
String
Street address for FraudWatch verification
xOrderType*
String
Specifies if the order origin is internet OR phone for FraudWatch verification
xExistingCustomer*
String
Yes/No value indicating if the customer is a repeat customer
xShipEmail*
String
The ShipTo email address
xOrderID
String
Unique order number for FraudWatch verification
xExistingCustomer
String
Yes/No value indicating if customer is a repeat customer
xAllowDuplicate
String
By default, Sola rejects duplicate transactions within 10 minutes of the original transaction. This command overrides that safeguard. True/False allowed.
xName
String
The cardholder’s name
xTax
String
The tax portion that is included in the total transaction amount (xAmount)
xTip
String
The tip portion that is included in the total transaction amount (xAmount)
xPONum
String
The merchant’s purchase order number for the transaction
xDescription
String
Additional data that is optionally passed along for reporting
xShipMiddleName
String
The customer’s middle name for their shipping profile
xBillMiddleName
String
The customer’s middle name for their billing profile
xBillStreet2
String
The customer’s second line street address for their billing profile
xShipStreet2
String
The customer’s second line street address for their shipping profile
xShipCountry
String
The customer's country code for their shipping profile
xBillCountry
String
The custom's country code for their billing profile
xBillMobile
String
The customer’s mobile phone number for their billing profile
xGatewayError
String
Transaction RefNum received from gateway for FraudWatch verification
xComments
String
Additional data that is optionally passed along to the receipt
xFax
String
The customer’s fax number.
xOrderItems
String
Summary of products ordered
xCustomerComments
String
Comments submitted by customer along with order
xShipMethod
String
The shipping carrier/service used
xShipAmount
String
The total cost of shipping charges
xCardNum*
String
Masked Card number with BIN and last 4 digits exposed
xKey*
String
Your Sola API key.
xVersion*
String
Gateway API version. The current version is 5.0.0.
xSoftwareName*
String
Name of your software
{
"xCardNum": "4444333322221111",
"xKey": "[xkeycredentials]",
"xVersion": "4.5.9",
"xSoftwareName": "YourSoftwareName",
"xSoftwareVersion": "1.0.0",
"xCommand": "fraud:submit",
"xToken": "61h72mmh68phn9q233634ph3g54p1499m69qhp4816pn528h84",
"xCustom01": "Register01",
"xExp": "12/25",
"xCVV": "945",
"xStreet": "123 Any Street Apt 4b Anytown, NY",
"xZip": "12345",
"xMagstripe": "%B4444333322221111^TEST CARD/VISA^4912101123456789?;4444333322221111=4912101123456789?",
"xName": "John Doe",
"xAuthCode": "T4321A",
"xDUKPT": "%B4444333322221111^TEST CARD/VISA^4912101123456789?;444433",
"xTax": "2.00",
"xTip": "2.00",
"xRefNum": "81234568",
"xInvoice": "123456A",
"xPONum": "123456B",
"xComments": "This is a comment",
"xDescription": "This is a description",
"xIP": "1.2.3.4",
"xEmail": "[email protected]",
"xFax": "1234567890",
"xBillFirstName": "John",
"xBillMiddleName": "Max",
"xBillLastName": "Doe",
"xBillCompany": "Acme",
"xBillStreet": "123 Any Street",
"xBillStreet2": "Apt 4b",
"xBillCity": "Anytown",
"xBillState": "NY",
"xBillZip": "12345",
"xBillCountry": "USA",
"xBillPhone": "8005551212",
"xBillMobile": "8005551111",
"xShipFirstName": "John",
"xShipMiddleName": "Max",
"xShipLastName": "Doe",
"xShipCompany": "Acme",
"xShipStreet": "123 Any Street",
"xShipStreet2": "Apt 4b",
"xShipCity": "Anytown",
"xShipState": "NY",
"xShipZip": "12345",
"xShipCountry": "USA",
"xShipPhone": "8005551212",
"xShipMobile": "8005551111",
"xMICR": "t021000021t 123456789o _2542",
"xRouting": "021202337",
"xGatewayRefNum": "852585258",
"xGatewayResult": "Approved",
"xGatewayError": "845455484",
"xGatewayCVV": "M",
"xGatewayAVS": "YYY",
"xOrderType": "Internet",
"xOrderID": "12356",
"xExistingCustomer": "TRUE",
"xOrderItems": "Sony Digital Camera",
"xCustomerComments": "Please ship as soon as possible",
"xShipMethod": "UPS Ground",
"xShipAmount": "29.99",
"xShipEmail": "[email protected]",
"xAllowDuplicate": "TRUE"
}Only sandbox keys may be used when submitting accounts
The Signature.Token field is not required
Navigate to Gateway Settings > Payment Methods
Click on “Configure Apple Pay“
Apple Pay Hosted Checkout is our simple integration that enables online Apple Pay processing through the Sola gateway. This landing page contains all of the links and references needed for setting up and maintaining Apple Pay Hosted Checkout. Please reference the Initial Setup and Apple Pay Hosted Checkout Resources sections below.
Sola gateway emulators translate third-party payment gateway APIs into the Cardknox/Sola gateway API. This allows transactions to be routed through the existing gateway to Sola without having to build a full integration using the Sola API.
Sola offers gateway emulators for Authorize.Net and USAePay.
To use gateway emulators, you will need to enter in your Sola key and change the gateway URL to Sola's gateway emulator URL.
Endpoint URL: https://x1.cardknox.com/authorize
Use your Sola key as the login ID and transaction key.
API Login ID: First half of Sola key
Transaction Key: Second half of Sola key
Split Your Key:
Split your key by using the tool here.
Endpoint URL: https://x1.cardknox.com/gate
Use your Cardknox key as the UMkey.
Endpoint URL: https://x1.cardknox.com/paytrace
The following pages can be found by viewing the navigation bar on the left side of the screen.
Contact [email protected]
This page contains all API documentation for Check (ACH), and ACH-Q transactions. For more information regarding account access, navigate to the Transaction API parent page.
Sola provides ACH and ACHQ processing for the transactions listed below (with exception of VoidRefund, which there is only ACHQ processing for). For more information regarding ACHQ, refer to the ACHQ or contact Sola support.
Note: The use of check/ACH transactions requires compliance with Nacha regulations, including the requirement to capture a physical or electronic signature from the customer. Please ensure your integration meets these compliance standards.
POST check:sale
xCommand = check:Sale
The Check Sale command debits funds from a customer’s checking or savings account using one of the following options:
The merchant must have a supported Check/ACH processing account to use either of these options.
POST check:save
xCommand = check:Save
The Save command is used to send account information and request a token from Sola but does not submit the transaction for processing. The response returns a token that references the account information. A token at minimum references the account and routing number, but if other data is sent—such as billing address—that will be associated with the token as well.
POST check:adjust
You can use the Adjust command to update certain fields on a transaction, such as xOrderID. This action will not reprocess the transaction; it will only update the information. Any non-required field can be adjusted.
POST check:void
xCommand = check:Void
The Void command voids a check transaction that is pending being sent to the bank, typically at the end of each day.
POST check:refund
xCommand = check:Refund
The Refund command is used to refund the full amount of a previously settled check transaction, using xRefNum. Partial check refund isn’t supported.
POST check:VoidRefund
xCommand = check:VoidRefund
The VoidRefund within the ACHQ tooling is used void a check transaction that is pending being sent to the bank, typically at the end of each day. It also issues a refund. Partial refunds are also supported.
A: It typically takes 2-3 days.
A: There are a few ways to get the status. Via email, webhook, the Sola Portal, or by pulling a report using our reporting API.
A: You should get back the following status codes (xStatus) from Sola:
0 (Pending)
20 (Rejected)
5 (Cancelled)
6 (Awaiting Response)
The daily emails may contain more information.
A: Sola only returns tokens on check transactions that contain the routing and account number. In the event only check images and MICR were submitted, the token is not returned since it can’t be reused on subsequent transactions.
3-D (Three-Domain) Secure is an e-commerce security protocol that adds a layer of protection to the checkout process by authenticating the cardholder's identity in real-time — resulting in a reduced rate of fraud and fraud-related chargebacks. Authenticated transactions are very unlikely to be fraudulent, and they cannot be disputed by the cardholder as fraudulent.
While the original 3DS technology effectively reduced rates of fraud, it also introduced friction to the checkout experience because customers were often redirected to their issuing bank’s website to verify their identity. Additionally, the original 3DS is not compatible with mobile payments since it was developed before mobile payment usage became mainstream.
To address the drawbacks of 3DS, EMVco developed 3-D Secure 2.0 in 2016. The updated technology improves upon the original 3DS in several key ways:
Utilizes a Greater Number of Data Points to Authenticate Transactions 3DS2 relies upon a much greater number of transaction-specific data points than the original 3DS, which improves the reliability of authentication and limits customer involvement.
Embedded, Frictionless Authentication In the event that the customer does have to verify their identity, they will no longer be redirected to a third-party page — instead, they can verify their identity with a passcode or biometric scan right from the checkout page.
Compatible With Mobile Commerce The new 3-D Secure offers support for iOS and Android SDKs so that merchants can provide a seamless and secure mobile checkout experience.
Click-To-Pay Hosted Checkout is our simple integration that enables online Click-To-Pay processing through the Sola gateway. This landing page contains all of the links and references needed for setting up and maintaining Click-To-Pay Checkout Experience.
Please reference the Initial Setup and Click-To-Pay Resources sections below.
There are three possible scenario:
New User In this case Click-To-Pay Experience will be presented as a button
Recognized User Consumer’s cards will be displayed
Recognized Device An email screen to identify the consumer and load his cards
The following pages can be found by viewing the navigation bar on the left side of the screen.
In this section we will describe the new Apple Pay features supported by Sola. Please note that every feature is supported starting with certain iOS version. This means that if you requesting a feature (Recurring for example) and it requires iOS 15.4 - Apple Pay button will be shown on consumer devices with iOS 15.4+
Address Validation
Support Recurring
Support Subscription - For subscriptions you have to follow
In order to take advantage of any new feature Sola supports, you need to request it through endpoint. The requiredFeatures object contains features from the list.
Apple Pay Request example
The following files need to be publicly accessible on the third-party’s website:
Host a publicly accessible file named assetlinks.json on the /well-known/assetlinks.json route with the following content:
Host a file named apple-app-site-association on the /well-known/apple-app-site-association route with the following content:
note: file should not have an extension
The Sola API gives you the ability to generate Quick Response (QR) codes that link to a custom PaymentSITE with pre-filled fields. Running a Sola API call for Sola PaymentSITE will return a QR code that can be used within point-of-sale applications or displayed on signage or reciepts that customers can scan.
Answer: As of the v2.6.1912.1301-beta, you can specify an event to trigger a callback-based on events in the iField using the function addIfieldCallback (event, callback). This callback will receive some data about events in the iField, such as whether the card number and/or CVV are valid. The card number validation is based on minimum and maximum lengths and whether it passes the Luhn check. The CVV validation is based on the length, depending on the card issuer.
You can use a callback to prevent the call to get tokens. We recommend you perform the least client-side validation necessary because a mistake in the validation logic could prevent a transaction from being processed when it would otherwise have been approved. See the iField Key Pressed Callback section in the iFields documentation for an example of a callback being used to change the iField style based on whether the data in it is valid.
Answer: You can generate an API directly from your Merchant Portal Settings, please see Key Managment in the Sola Merchant Portal guide for more information.
Answer: Sola supports a wide variety of terminals and card readers from manufacturers such as IDTech, Verifone, and more. See the complete list at Supported EMV Equipment.
Answer: Sola closes batches automatically, so there is no need for you to manually close a batch. Learn more about Sola batch processing at Batch Processing.
Answer: You can do this by setting the xCustReceipt field to True along with the transaction request to send a receipt to the customer via the email address specified in the xEmail field.
Answer: Yes, there is a Sola plugin for Magento 2 that connects to Sola directly. See Magento Payment Gateway for more information about the Sola Magento 2 plugin.
Answer: Yes. You can do this by setting up Magento 1 with the Authorize.Net AIM option available in the Magento settings and then changing the endpoint URL to Sola.
Answer: Sola Mobile is an app you can download to your mobile device to securely accept credit card transactions on your Sola account.
Answer: No, not at this time. We are working toward achieving this goal in 2024.
Answer: Sola iFields technology uses iframe fields to replace credit card and CVV data on the website and sends the card information directly to Sola. Since sensitive card information bypasses the merchant’s server, this solution enables merchants to remain out of PCI scope. In addition, this Sola solution allows developers to fully customize how payment forms are designed. Learn more about Sola iFields technology at Sola iFields.
Answer: Yes, Sola has several terminals that support near-field communication (NFC) technology for contactless payments. See the complete list of EMV terminals.
Point Google Pay to Test Environment (in your init Google Pay function set environment to GPEnvironment.test)
Let Sola representative know that you want to use Google Pay Test environment for your Sandbox account.
Your real card won’t be charged, the transaction will run against test Visa card 4111…1111.
A: The maximum amount for test transaction allowed by Sola is $10
Only compatible with Windows operating systems.
Supported Devices: All Sola-supported devices
Benefits:
Works with all Sola-supported devices.
Limitations:
Compatible only with Windows and Mac.
Installation on Mac can be challenging.
Requires the BBPOS application to be installed and actively running in the background.
Supported Devices: PAX A77, A35, A80, A920, and A920 Pro
Benefits:
API-driven integration with minimal setup.
No installation required for operation.
Limitations:
Supports a limited range of devices.
Some commands and features are not yet fully supported.
Supported Devices: ID Tech Augusta and VP8300
Benefits:
Simple integration through API.
Plug-and-play devices for quick setup.
Limitations:
Only supports a limited number of devices.
Lacks support for PIN entry.
Augusta does not support tap functionality.
Only supported in the US



Sola Account Updater identifies customer cards that have expired or are inactive, and then obtains the new card information from the bank. This information is returned to Sola within 10 days of the initial request, at which point it is stored and applied towards any subsequent transactions that are attempted using the previous card (using either the actual data or a Cardknox token).
When a subsequent transaction is processed using updated card information, Sola will indicate this by including xIsUpdatedCard = True in the transaction responses. The data returned in xMaskedCardNumber and xExp will also reflect the updated information, when applicable.
Because Account Updater does not provide updated card information instantaneously, we recommend that Merchants wait 5-10 days before retrying a declined transaction in order to ensure that the updated card information is available. In the case of a recurring payment, note that declined recurring payments are retried once a day for 5 consecutive days, and it's very likely that updated card information will be received and successfully retried within this timeframe.
When a transaction utilizes Account updater, this is indicated in the reporting in the xCardSource field (as xIsUpdatedCard = True).
xCardSource = incoming represents transactions processed with original card data.
xCardSource = account represents transactions that were processed using updated card info from Account Updater.
Feature
Feature Code
Address Validation
Support Recurring
Support Subscription
[
{
"relation":[
"delegate_permission/common.handle_all_urls"
],
"target":{
"namespace":"android_app",
"package_name":"com.gateway.cardknox.android",
"sha256_cert_fingerprints":[
"6A:2D:20:86:D4:4C:46:33:44:6A:41:35:4D:A4:91:20:82:1A:38:8E:63:05:C5:4F:CC:EC:94:36:3F:F9:35:E3"
]
}
}
]APRequiredFeatures.address_validationAPRequiredFeatures.support_recurringAPRequiredFeatures.support_subscriptioninitAP: function() {
return {
buttonOptions: this.buttonOptions,
merchantIdentifier: "<your merchant>",
..................................
requiredFeatures: [APRequiredFeatures.address_validation, APRequiredFeatures.support_recurring],
..................................
requiredBillingContactFields: ['postalAddress', 'name', 'phone', 'email'],
requiredShippingContactFields: ['postalAddress', 'name', 'phone', 'email'],
};
}{
"applinks": {
"apps": [],
"details": [
{
"appID": "QCP4TQ46S6.com.gateway.cardknox.iosapp",
"paths": [ "/transaction/*"]
}
]
}
}xCommand*
String
Sola transaction type
xAmount*
String
The total amount of the transaction, inclusive of tax and tip if applicable.
xRouting*
String
The check ABA routing number
xAccount*
String
The check account number
xName*
String
Name on account
xToken
String
The Sola token that references a previously used payment method. When using a token, xCardNum xExp and xMagstripe should not be used.
xCustom01
String
20 custom fields are available for custom data, such as customer comments, etc. Use xCustom01 through xCustom20.
xTax
String
The tax portion that is included in the total transaction amount (xAmount)
xTip
String
The tip portion that is included in the total transaction amount (xAmount)
xInvoice
String
The merchant’s invoice number for the transaction. xInvoice is recommended when available for improved duplicate handling.
xPONum
String
The merchant’s purchase order number for the transaction
xComments
String
Additional data optionally passed along to the receipt
xDescription
String
Additional data optionally passed along for reporting
xIP
String
The customer’s IP address. Typically used for fraud detection
xEmail
String
The customer’s email address
xFax
String
The customer’s fax number
xBillFirstName
String
The customer’s first name for their billing profile
xBillMiddleName
String
The customer’s middle name or initial for their billing profile
xBillLastName
String
The customer’s last/family name for their billing profile
xBillCompany
String
The customer’s company name for their billing profile
xBillStreet
String
The customer’s street address for their billing profile
xBillStreet2
String
The customer’s street address 2nd line for their billing profile
xBillCity
String
The customer’s city for their billing profile
xBillState
String
The customer’s state for their billing profile
xBillZip
String
The customer’s zip code for their billing profile
xBillCountry
String
The customer’s country for their billing profile
xBillPhone
String
The customer’s phone number for their billing profile
xShipFirstName
String
The customer’s first name for their shipping profile
xShipMiddleName
String
The customer’s middle name or initial for their shipping profile
xShipLastName
String
The customer’s last/family name for their shipping profile
xShipCompany
String
The customer’s company name for their shipping profile
xShipStreet
String
The customer’s street address for their shipping profile
xShipStreet2
String
The customer’s street address 2nd line for their shipping profile
xShipCity
String
The customer’s city for their shipping profile
xShipState
String
The customer’s state for their shipping profile
xShipZip
String
The customer’s zip code for their shipping profile
xShipCountry
String
The customer’s country for their shipping profile
xShipPhone
String
The customer’s phone number for their shipping profile
xShipMobile
String
The customer’s mobile number for their shipping profile
xMICR
String
The routing, account and check number data from the bottom of a check in MICR (Magnetic Ink Character Recognition) format, typically generated by a check scanner
xCheckNum
String
The check number
xCheckImageFront
String
The front image of the check, in Base 64 encoded image format.
xCheckImageRear
String
The back image of the check, in Base 64 encoded image format.
xOrderID
String
Unique order number for FraudWatch verification
xExistingCustomer
String
Yes/No value indicating if the customer is a repeat customer
xAllowDuplicate
String
By default, Sola rejects duplicate transactions within 10 minutes of the original transaction. This command overrides that safeguard. True/False allowed.
xCustReceipt
String
True/False value indicating if the email address specified in xemail should receive a receipt containing the transaction details
xCurrency
String
Used to specify an alternate currency. Only applicable for accounts that are using Multi-Currency Conversion (MCC). For accounts that are natively in a foreign currency, the currency does not need to be specified. ().
xBillMobile
String
The customer’s mobile number for their billing profile
xAccountType
String
Type of account: Checking or Savings
xTimeoutSeconds
String
Configurable amount of seconds in which the request will wait for a response.
xPaymentOrigin
String
Origin of payment.
Possible values:
"Internet" (denoting web transactions)
"SignatureOriginal" (denoting transactions with physical signature)
xSoftwareVersion*
String
Version number of your software
xAccount*
String
The check account number
xVersion*
String
Gateway API version. The current version is 5.0.0
xKey*
String
Your Sola API key.
xCustom01
String
20 custom fields are available for custom data, such as customer comments, etc. Use xCustom01 through xCustom20.
xIP
String
The customer’s IP address. Typically used for fraud detection.
xMICR
String
The routing, account, and check number data from the bottom of a check in MICR (Magnetic Ink Character Recognition) format, typically generated by a check scanner
xAllowDuplicate
String
By default, Sola rejects duplicate transactions within 10 minutes of the original transaction. This command overrides that safeguard. True/False allowed.
String
The total amount of the transaction, inclusive of tax and tip if applicable. This the total amount of the transaction.
xRefNum*
String
Used to reference a previous transaction when doing a follow-up transaction; typically a refund, void, or capture. (Note: xRefnum can be a 64-bit number and should be stored as BIGINT, Long, Int64 or String). *The xRefNum from the related authorization is required when submitting an Adjust transaction.
xCustom01 – xCustom03
String
Custom fields available for custom data, such as customer comments, etc.
xStreet
String
The billing street address of the cardholder
xZip
String
The billing zip code of the cardholder
xName
String
The cardholder’s name
xDescription
String
Additional data optionally passed along for reporting
xOrderID
String
Unique Order Number for FraudWatch verification
xTip
String
The tip portion that is included in the total transaction amount (xAmount)
xTax
String
The tax portion that is included in the total transaction amount (xAmount)
xSignature
String
The Base 64 encoded customer signature
xInvoice
String
The merchant’s invoice number for the transaction. xInvoice is recommended when available for improved duplicate handling
xCommand*
String
Sola transaction type
xRefNum*
String
Used to reference a previous transaction when processing a follow-up transaction; typically a refund, void, or capture. (Note: xRefnum can be a 64-bit number and should be stored as BIGINT, Long, Int64 or String).
xCustom01
String
20 custom fields are available for custom data, such as customer comments, etc. Use xCustom01 through xCustom20.
xIP
String
The customer’s IP address. Typically used for fraud detection.
xCommand*
String
Sola transaction type
xRefNum*
String
Used to reference a previous transaction when processing a follow-up transaction; typically a refund, void, or capture. (Note: xRefnum can be a 64-bit number and should be stored as BIGINT, Long, Int64 or String)
xAmount*
String
The total amount of the transaction, inclusive of tax and tip if applicable. This the total amount of the transaction.
xCustom01
String
20 custom fields are available for custom data, such as customer comments, etc. Use xCustom01 through xCustom20.
xIP
String
The customer’s IP address. Typically used for fraud detection.
xAllowDuplicate
String
By default, Sola rejects duplicate transactions within 10 minutes of the original transaction. This command overrides that safeguard. True/False allowed.
xCustReceipt
String
True/False value indicating if the email address specified in xemail should receive a receipt containing the transaction details.
xTimeoutSeconds
String
Configurable amount of seconds in which the request will wait for a response.
xAccount*
String
The check account number
xVersion*
String
Gateway API version. The current version is 5.0.0
xKey*
String
Your Sola API key.
xBillState*
String
Company Billing State
xBillCity*
String
Company Billing City
xBillStreet*
String
Company Street Address
xBillCompany*
String
Required if xCheckType = Business
xBillZip*
String
Company Billing Zip
xBillPhone*
String
Company Phone Number
xEmail*
String
Company Email
xCheckType*
String
Check Type (Business, Personal)
xName
String
The cardholder’s name. One of xName, xBillFirstName, or xBillLastName are required.
xCustom01
String
20 custom fields are available for custom data, such as customer comments, etc. Use xCustom01 through xCustom20.
xIP
String
The customer’s IP address. Typically used for fraud detection.
xMICR
String
The routing, account, and check number data from the bottom of a check in MICR (Magnetic Ink Character Recognition) format, typically generated by a check scanner
xAllowDuplicate
String
By default, Sola rejects duplicate transactions within 10 minutes of the original transaction. This command overrides that safeguard. True/False allowed.
16 (Settled)
18 (Returned)
19 (Hold)
xKey*
String
Your Sola API key.
xVersion*
String
Gateway API version. The current version is 5.0.0
xSoftwareName*
String
Name of your software
xSoftwareVersion*
String
Version number of your software
xCommand*
String
Sola transaction type
xRouting*
String
The check ABA routing number
xName*
String
The cardholder’s name
xSoftwareName*
String
Name of your software
xKey*
String
Your Sola API key
xVersion*
String
Gateway API Version. The current version is 5.0.0.
xCommand*
String
Sola transaction type
xSoftwareName*
String
Name of your software
xSoftwareVersion*
String
Version number of your software
xKey*
String
Your Sola API key.
xVersion*
String
Gateway API version. The current version is 5.0.0
xSoftwareName*
String
Name of your software
xSoftwareVersion*
String
Version number of your software
xKey*
String
Your Sola API key.
xVersion*
String
Gateway API version. The current version is 5.0.0
xSoftwareName*
String
Name of your software
xSoftwareVersion*
String
Version number of your software
xCommand*
String
Sola transaction type
xRouting*
String
The check ABA routing number
xSoftwareName*
String
Name of your software
xSoftwareVersion*
String
Version number of your software
xAmount*
Create a QR code for merchants Sola/Cardknox PaymentSITEs
Type
URL
Test
Production
URL
Type
GET
Parameters
URL (required)
This is expecting a [paymentSITE name] URL
Sample Request
/create??[xfield=value]&[xfield=value]
Method
Call Required
Description
enableGooglePay
Yes
You can provide either All, One or None of the parameters for enableGooglePay call.
amountField specified - in this case Google Pay total amount will be automatically updated whenever amount has changed
amountField is not specified - in this case it’s up to you to provide the correct amount for Google Pay. One of the ways to do it is to call window.ckGooglePay.updateAmount manually.
iframeField
Enable Google Pay example
Our WooCommerce plugin is an easy integration that allows users to accept payments online through their WooCommerce online site.
Go to the checkout page.
Select Credit Card (or the title that was specified for Sola in the settings page).
Select "use a new payment method."
Enter the card data.
Select "save to account" if you would like to save the card for future use.
Select the card you would like to use.
Select "place order."
Select my account > payment methods.
Click "add payment method."
Enter card data.
Click "add payment method."
Add payment method image:
Select my account > payment methods.
Click "delete" on the right of the payment method.
Delete payment method:
Select subscription item.
Pay the same as with a regular transaction.
Go to my account > select subscriptions.
Click "view" on the subscription.
Apply modifications.
Edit subscription image:
This will refund the transaction. You can specify the amount to refund. Refund images:
If the plugin is set to not capture the transaction, this will capture the transaction.
If the plugin is set to not capture the transaction, this will capture the transaction.
If the order is not yet captured, this will void the auth only transaction.
If the order is not yet captured, this will void the auth only transaction.
Change order status image:
Process Renewal: Charge the subscription instead of waiting.
Add / Update Token Manually: Click on the pencil near "payment details."
Update the token masked card number and card type.
The Magento Sola plugin will allow you to charge credit cards via the Sola gateway. Sola enables credit card payments for both customers on the storefront and for merchants in the Admin portal. The plugin supports Authorize Only, Capture, Void, Cancel, and Refund transactions. As a merchant, your web servers remain out of scope of the transaction, keeping card data secure and simplifying PCI compliance.
{
"xKey": "[xkeycredentials]",
"xVersion": "4.5.9",
"xSoftwareName": "YourSoftwareName",
"xSoftwareVersion": "1.0.0",
"xCommand": "check:sale",
"xAmount": "35.00",
"xToken": "61h72mmh68phn9q233634ph3g54p1499m69qhp4816pn528h84",
"xCustom01": "Register01",
"xRouting": "123456789",
"xAccount": "123456789",
"xAccountType": "Checking",
"xName": "John Doe",
"xTax": "2.00",
"xTip": "2.00",
"xInvoice": "123456A",
"xPONum": "123456B",
"xComments": "This is a comment",
"xDescription": "This is a description",
"xIP": "1.2.3.4",
"xEmail": "[email protected]",
"xFax": "1234567890",
"xBillFirstName": "John",
"xBillMiddleName": "Max",
"xBillLastName": "Doe",
"xBillCompany": "Acme",
"xBillStreet": "123 Any Street",
"xBillStreet2": "Apt 4b",
"xBillCity": "Anytown",
"xBillState": "NY",
"xBillZip": "12345",
"xBillCountry": "USA",
"xBillPhone": "8005551212",
"xBillMobile": "8005551111",
"xShipFirstName": "John",
"xShipMiddleName": "Max",
"xShipLastName": "Doe",
"xShipCompany": "Acme",
"xShipStreet": "123 Any Street",
"xShipStreet2": "Apt 4b",
"xShipCity": "Anytown",
"xShipState": "NY",
"xShipZip": "11111",
"xShipCountry": "USA",
"xShipPhone": "8005551212",
"xShipMobile": "8005551111",
"xMICR": "t021000021t 123456789o _2542",
"xCheckNum": "999",
"xCheckImageFront": "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEASABIAAD/2wBDAAYEBAQFBAYFBQYJBgUGCQsIBgYICwwKCgsKCgwQDAwMDAwMEAwODxAPDgwTExQUExMcGxsbHCAgICAgICAgICD/2wBDAQcHBw0MDRgQEBgaFREVGiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICD/w",
"xCheckImageRear": "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEASABIAAD/2wBDAAYEBAQFBAYFBQYJBgUGCQsIBgYICwwKCgsKCgwQDAwMDAwMEAwODxAPDgwTExQUExMcGxsbHCAgICAgICAgICD/2wBDAQcHBw0MDRgQEBgaFREVGiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICD/w",
"xOrderID": "12356",
"xExistingCustomer": "TRUE",
"xAllowDuplicate": "TRUE",
"xCustReceipt": "TRUE",
"xCurrency": "USD",
"xTimeoutSeconds": "10",
"xPaymentOrigin": "Internet"
}{
"xKey": "[xkeycredentials]",
"xVersion": "4.5.9",
"xSoftwareName": "YourSoftwareName",
"xSoftwareVersion": "1.0.0",
"xCommand": "check.save",
"xCustom01": "Register01",
"xRouting": "123456789",
"xAccount": "123456789",
"xName": "John Doe",
"xIP": "1.2.3.4",
"xMICR": "t021000021t 123456789o _2542",
"xAllowDuplicate": "TRUE"
}{
"xKey": "[xkeycredentials]",
"xVersion": "4.5.9",
"xSoftwareName": "YourSoftwareName",
"xSoftwareVersion": "1.0.0",
"xCommand": "cc:adjust",
"xAmount": "35.00",
"xCustom01": "Register01",
"xCustom02": "Register01",
"xCustom03": "Register01",
"xStreet": "123 Main Street",
"xZip": "12345",
"xRefNum": "81234568",
"xName": "John Doe",
"xDescription": "This is a description",
"OrderID": "123456",
"xTip": "1.05",
"xTax": "1.05",
"xSignature": "aGVsbG8gaG93IGFyZSB5b3UK",
"xInvoice": "123456A"
}{
"xResult": "A",
"xStatus": "Approved",
"xError": "",
"xErrorCode": "00000",
"xRefNum": "10000016879",
"xInvoice": "1234567",
"xRefNumCurrent": "10000016886",
"xDate": "7/11/2022 4:06:11 PM"
}{
"xKey": "[xkeycredentials]",
"xVersion": "4.5.9",
"xSoftwareName": "YourSoftwareName",
"xSoftwareVersion": "1.0.0",
"xCommand": "check.void",
"xCustom01": "Register01",
"xRefNum": "81726356",
"xIP": "1.1.1.1"
}{
"xKey": "[xkeycredentials]",
"xVersion": "4.5.9",
"xSoftwareName": "YourSoftwareName",
"xSoftwareVersion": "1.0.0",
"xCommand": "check.refund",
"xAmount": "9.99",
"xCustom01": "Register01",
"xRefNum": "81726356",
"xIP": "1.1.1.1",
"xAllowDuplicate": "TRUE",
"xCustReceipt": "FALSE",
"xTimeoutSeconds": "10"
}SCIS (NS Retail)
Create an account with Sola (live or sandbox).
Obtain your token and transaction key.
Request a NetSuite license (create a sandbox account here).
Provide Sola with your NetSuite ID ([email protected]). Sola will share the bundle with you.
Note: Only NetSuite administrators can install this bundle.
Find and install the “xPayment” (and xPayment beta) bundle in the “Search & Install Bundles“ section.
The following video demonstrates these steps:
Q: How do I add credit card information and save it?
A: To store a customer’s credit card with their record:
Open the customer record and click the Transactions tab.
In the Payments section, click the plus sign ( + ) next to the PE Store Payment field.
On the PE Stored Payment pop-up, fill in the required fields.
Click the Save button on the pop-up to save and close the pop-up.
Select the PE Get Authorization checkbox.
Click the Save button at the bottom of the screen.
The following video demonstrates these steps:
Q: How do I perform a sales order (PreAuth/AuthOnly/Capture)?
A: To process a sales order:
Open the customer record and click the Transactions tab.
In the Items section, add as many items as necessary.
In the Payment section, type in the credit card information.
Select the PE Get Authorization checkbox.
Click the Save button. At the top of the screen, the system displays a message that confirms the transaction was saved. Below this is the message "Pending Approval."
Click the Approve button. The system displays the message "Pending Fulfillment."
Click the Fulfill button. The system displays the Item Fulfillment screen.
Under the text "To Be Generated," click the Save button. At the top of the screen, the system displays a message that confirms the transaction was saved.
Click the Bill button. The system displays the Cash Sale screen.
Under the text "To Be Generated," click the Save button.
The following video demonstrates these steps:
Q: How do I process a cash sale?
A: To process a cash transaction:
Open the customer record and click the Transactions tab.
In the Items section, add as many items as necessary.
In the Billing section, enter information in the following fields - Payment Method - Expires - Name on Card
Type the card number into the PE Credit Card Number field.
Click the Save button.
The following video demonstrates these steps:
Q: How do I process a cash refund?
A: Open the cash refund transaction that needs to be refunded. In the upper left of the screen, click the Refund button.
The following video demonstrates this step:
Q: How do I process a customer deposit?
A: To process a customer deposit:
Open the Customer Deposit screen.
In the Customer field, choose the customer.
Type in an amount in the Payment Amount field.
In the PE Stored Payment field, select the payment method.
Click the Save button. At the top of the screen, the system displays a message that confirms the transaction was saved.
The following video demonstrates these steps:
Q: How do I process a customer payment?
A: To process a customer payment for an invoice:
Open the invoice for which you will accept payment.
Click the Accept button. NetSuite opens the Payment screen.
Scroll down to the Payment Method section.
In the PE Payment Method field, select the payment method.
Click the Save button. At the top of the screen, the system displays a message that confirms the transaction was saved.
The following video demonstrates these steps:
iframeField is not specified - it’s value will be calculated based on data-ifields-id attribute. In this case it must be set to “igp“: data-ifields-id="igp".
Initializes and enables Google Pay Button. Takes EnableGooglePayParams object
updateAmount
Conditional
Updates amount on Google Sheet.
Name
Type
Required
Description
amountField
String|Object
No
Field containing amount. Could be either name of the field (String) or field itself (Object)
iframeField
String|Object
No
Field containing iframe with Google Pay button. Could be either name of the field (String) or field itself (Object)
Let's define a helper object with all necessary components:
Let’s enable Click-To-Pay for the website:
document.addEventListener("DOMContentLoaded", function(event) {
.....
ckClick2Pay.enableClickToPay({
environment: c2pEnvironment.sandbox,
externalClientId: "<Your externalClientId>",
click2payContainer: "click2payContainer",
onPaymentPrefill: click2payRequest.paymentPrefill,
onPaymentSuccess: click2payRequest.paymentSuccess,
onPaymentError: click2payRequest.paymentCallback,
onPaymentCancel: click2payRequest.paymentCallback,
onButtonLoaded: click2payRequest.cpButtonLoaded
});
.....
}To see the full solution please click here.
ckGooglePay.enableGooglePay({amountField: 'amount'});const click2payRequest = {
paymentPrefill: function(){
const result = {
merchantRequestId: "Merchant defined request ID",
currencyCode: "USD",
description: "...corp Product",
orderId: "Merchant defined order ID",
promoCode: "Merchant defined promo code",
subtotal: roundTo(getAmount(), 2),
shippingHandling: "2.00",
tax: "2.00",
discount: "1.00",
giftWrap: "2.00",
misc: "1.00",
setTotal: function() {
this.total = roundTo(
roundToNumber(this.subtotal, 2)
+ roundToNumber(this.shippingHandling, 2)
+ roundToNumber(this.tax, 2)
+ roundToNumber(this.giftWrap, 2)
+ roundToNumber(this.misc, 2)
- roundToNumber(this.discount, 2)
, 2);
delete this.setTotal;
return this;
},
}.setTotal();
logDebug({
label: "paymentPrefill",
data: result
});
return result;
},
authorize: function(payload) {
return new Promise(function (resolve, reject) {
var xhr = new XMLHttpRequest();
xhr.open("POST", "https://<your domain>/<path to handle authorization>");
xhr.onload = function () {
if (this.status >= 200 && this.status < 300) {
resolve(xhr.response);
} else {
reject({
status: this.status,
statusText: xhr.statusText
});
}
};
xhr.onerror = function () {
reject({
status: this.status,
statusText: xhr.statusText
});
};
xhr.setRequestHeader("Content-Type", "application/json");
xhr.send(JSON.stringify(payload));
});
},
paymentSuccess: async function(clickToPayResponse) {
return new Promise((resolve, reject) => {
try {
const response = await this.authorize(clickToPayResponse);
console.log(response);
const resp = JSON.parse(response);
if (!resp)
throw "Invalid response: "+ response;
if (resp.xError) {
throw resp;
}
resolve(response);
} catch (err) {
console.error("paymentSuccess error.", JSON.stringify(err));
reject(err);
}
});
},a
paymentCallback: function (clickToPayResponse) {
click2payRequest.setPayload(clickToPayResponse);
},
cpButtonLoaded: function(resp) {
if (!resp) return;
if (resp.status === iStatus.success) {
showHide("click2payContainer", true);
} else if (resp.reason) {
console.log(resp.reason);
}
},
setPayload: function (value) {
document.getElementById('c2p-payload').value = JSON.stringify(value, null, 2);
showHide("divC2PPayload", value);
}
}Install the plugin from https://marketplace.magento.com/cardknox-cardknox.html .
To install the Sola plugin:
Unzip the folder to app/code/CardknoxDevelopment/Cardknox (create the directories if needed)
Run the below commands in the Magento root directory (bash).
Enable the module
Optionally flush the cache
Navigate to Stores > Configuration > Payment Methods > Sola which will bring you to the configuration page (see below).
Item
Description
Enabled
This enables the Sola / Cardknox Module. Set to ‘Yes’ to enable Sola payments.
Title
Name of payment method. This will appear to users when selecting a payment method. We recommend selecting ‘Credit Card.’
Vault Enabled
This enables the customer to save cards for later use on the site.
Vault Title
Name of vault payment method. This will appear to users when selecting a card on file. We recommend selecting ‘Stored Cards.’
Sola Transaction Key
Your Sola API transaction Key.
Item
Description
Item
Description
Enabled
This enables Sola Google Pay . Set to ‘Yes’ to enable Google Pay. Please ensure that your Sola account is configured for Google Pay. Please contact to confirm
Title
Name of payment method. This will appear to users when selecting a payment method. We recommend selecting ‘Google Pay’
Merchant Name
Enter the merchant name (DBA)
Environment
Sets the Google Pay environment. This must match the environment set on the Sola account. Please contact to confirm
GooglePay Payment Action
Sets the transaction payment mode. If ‘Authorize’ is selected, all transactions will need to be captured when invoicing an order.
Item
Description
Item
Description
Enabled
This enables Sola Apple Pay. Set to ‘Yes’ to enable Apple Pay. Please ensure that your Sola account is configured for Apple Pay. Please contact to confirm
Title
Name of payment method. This will appear to users when selecting a payment method. We recommend selecting ‘Apple Pay’
Merchant Identifier
The default value is merchant.cardknox.com
Environment
Sets the Apple Pay environment.
Apple Pay Button Style
This sets the Apple Pay button style
Select Credit Card as the payment method in the Payment & Shipping Information section (see Title in the Configuration Options section of this document).
If ‘Authorize’ is selected as the Payment Action in the Sola module settings (see Payment Actions in the Configuration Options section of this page), select ‘Capture Online’ to capture the transaction before submitting the invoice. Please note that previously voided transactions cannot be captured and will result in an error.
Use ‘Void’ to cancel transactions on orders that have not yet been invoiced. This is only available if ‘Authorize’ is selected as the Payment Action in the Sola module settings (see Payment Actions in the Configuration Options section of this document). Once an order has been invoiced, use ‘Credit Memo’ to refund the transaction.
Please note that ‘Void’ cancels the credit card transaction but does not cancel the order. To cancel the order as well, see the Cancel section below.
Use Cancel to void an un-captured transaction and cancel the associated order.
Issue a Credit Memo to refund an order that has already been invoiced.
Sola transaction reference numbers can be found in the Transaction History section of any order page and are listed as Transaction ID. This can be useful when viewing your transactions on the Sola Gateway portal or when contacting Sola Support regarding specific transactions.
The SDK is distributed as an .aar
SDK expects to be provided the androidx.cardview package externally, such as via the gradle rule implementation 'androidx.cardview:cardview:1.0.0'
App launch specifics:
AndroidManifest.xml file registers a mono.MonoRuntimeProvider ContentProvider, responsible for loading the Mono runtime on app launch
Supported architectures:
arm64-v8a
armeabi-v7a
Package name is cardknox.payments.sdk
To start:
Add the obtained aar file to your Android Studio project, for example into the app module libs folder; and register the .aar in the app's build.gradle
Provide the androidx.cardview dependency either explicitly or as a transitive dependency of some other package, such as com.google.android.material
To capture the SDK Logcat logs, filter with the following tag:
(Cardknox_DroidSDKLogger|IDT_Event)
To submit a cc:sale transaction type, first initiate the request.
Next, specify the basic parameters, transaction-specific parameters, and device settings.
Once this is done, initiate the transaction.
MyResponse will contain the transaction response information, xResult "A" will indicate that the transaction was approved, "E" or "D" will indicate that it was not approved, and xError will contain the reason.
To submit a cc:sale transaction type, first initiate the request.
Next, specify the basic parameters, transaction-specific parameters, and device settings.
Once this is done, initiate the transaction.
MyResponse will contain the transaction response information, xResult "A" will indicate that the transaction was approved, "E" or "D" will indicate that it was not approved, and xError will contain the reason.
To submit a cc:void transaction type, first initiate the request.
Next, specify the basic parameters and transaction-specific parameters.
Once this is done, initiate the transaction.
MyResponse will contain the transaction response information, xResult "A" will indicate that the transaction was approved, "E" or "D" will indicate that it was not approved, and xError will contain the reason.
To submit a cc:refund transaction type, first initiate the request.
Next, specify the basic parameters and transaction-specific parameters.
Once this is done, initiate the transaction.
MyResponse will contain the transaction response information, xResult "A" will indicate that the transaction was approved, "E" or "D" will indicate that it was not approved, and xError will contain the reason.
To submit a cc:credit transaction type, first initiate the request.
Next, specify the basic parameters, transaction specific-parameters, and device settings.
Once this is done, initiate the transaction.
MyResponse will contain the transaction response information, xResult "A" will indicate that the transaction was approved, "E" or "D" will indicate that it was not approved, and xError will contain the reason.
To submit a cc:authonly transaction type, first initiate the request.
Next, specify the basic parameters, transaction-specific parameters, and device settings.
Once this is done, initiate the transaction.
MyResponse will contain the transaction response information, xResult "A" will indicate that the transaction was approved, "E" or "D" will indicate that it was not approved, and xError will contain the reason.
To submit a cc:capture transaction type, first initiate the request.
Next, specify the basic parameters and transaction-specific parameters.
Once this is done, initiate the transaction.
MyResponse will contain the transaction response information, xResult "A" will indicate that the transaction was approved, "E" or "D" will indicate that it was not approved, and xError will contain the reason.
To submit a GetSignature transaction type, first initiate the request.
Next, specify the basic parameters and device settings.
Once this is done, initiate the transaction.
MySignature will contain the transaction signature.
To submit a Device_ShowWelcomeScreen transaction type, first initiate the request.
Next, specify the basic parameters and device settings.
Once this is done, initiate the transaction.
MySignature will contain the transaction signature.
To submit a ebtfs:sale transaction type, first initiate the request.
Next, specify the basic parameters, transaction-specific parameters, and device settings.
Once this is done, initiate the transaction.
MyResponse will contain the transaction response information, xResult "A" will indicate that the transaction was approved, "E" or "D" will indicate that it was not approved, and xError will contain the reason.
To submit a ebtfs:credit transaction type, first initiate the request.
Next, specify the basic parameters, transaction-specific parameters, and device settings.
Once this is done, initiate the transaction.
MyResponse will contain the transaction response information, xResult "A" will indicate that the transaction was approved, "E" or "D" will indicate that it was not approved, and xError will contain the reason.
To submit a ebtfs:balance transaction type, first initiate the request.
Next, specify the basic parameters, transaction-specific parameters, and device settings.
Once this is done, initiate the transaction.
MyResponse will contain the transaction response information, xResult "A" will indicate that the transaction was approved, "E" or "D" will indicate that it was not approved, and xError will contain the reason.
To submit a Device_ShowItems transaction type, first initiate the request.
Next, specify the basic parameters, transaction-specific parameters, and device settings.
Once this is done, initiate the transaction.
The items will be shown to the user on the pin pad.
To submit a cc:encrypt transaction type, first initiate the request.
Next, specify the basic parameters, transaction-specific parameters, and device settings.
Once this is done, initiate the transaction.
MyResponse will contain the transaction response information, xResult ”S” will indicate that the request was processed successfully, and xEncryptedPayload will contain the encrypted card number. Once the system is back online submit a cc:sale (in scope) transaction or via API using the encrypted card number as xMagstripe there is no need to submit an expiration date since it is included with the encrypted card number.
PaymentSITE is a hosted payment page that can be integrated into a merchant’s system to process payments. Upon accessing the PaymentSITE, either where it is embedded or via a standalone URL, the customer can enter their payment details and any other relevant information like their name, address, and phone number. PaymentSITE tokenizes all card data and keeps the merchant out of scope for PCI compliance.
The most popular form integration flow for developers is to build their own secure form with for the user to enter their information, and then submit the transaction via our . By doing so, the developer maintains full control over the UI and behavior of the integration. When using a PaymentSITE, the developer gives up much control and is limited to whatever is supported by PaymentSITE.
The advantage of PaymentSITE is that it is a quicker and easier implementation since the developer does not need to build the secure payment form and API calls directly. In addition, the user can utilize PaymentSITE’s built-in features and customizations without the developer needing to do additional work.
php bin/magento module:enable CardknoxDevelopment_Cardknox --clear-static-content
php bin/magento setup:upgrade
php bin/magento setup:di:compile
php bin/magento setup:static-content:deployphp bin/magento cache:clean
php bin/magento cache:flushdependencies {
implementation fileTree(dir: 'libs', include: ['Cardknox.Payments.SDK.aar'])
// Option 1: explicitly provide the androidx.cardview dependency for the SDK
implementation 'androidx.cardview:cardview:1.0.0'
// Option 2: implicitly provide the androidx.cardview dependency via the google.material package
implementation 'com.google.android.material:material:1.5.0'
}Sola Token Key
Your Sola token key (iFields key).
Debug
Logs transaction data for troubleshooting purposes.
Payment Action
Sets the transaction payment mode. If ‘Authorize’ is selected, all transactions will need to be captured when invoicing an order.
Enable Split Capture For Credit Card
When Payment action is set to Authorize, this will allow you to split capture when capturing (invoicing) a transaction.
Payment from Applicable Countries
Select ‘Specific Countries’ to only allow payment from the ‘Payment From Specific Countries’ whitelist.
Payment from Specific Countries
Select countries you wish to whitelist.
Sola Gateway Endpoint
Sola URL to which transactions are routed (this setting should not be modified unless advised to do so by Sola Support).
Google reCAPTCHA V2 Enable
This enables Google reCAPTCHA V2
Google API Key V2
Your Google reCaptcha Site Key V2
Google API Secret Key V2
Your Google reCaptcha Secret key V2
Sort Order
Priority of Sola in list of payment methods.
Enable Split Capture For GooglePay
When Payment action is set to Authorize, this will allow you to split capture when capturing (invoicing) a transaction.
Button Style
This sets the Google Pay button style
Payment from Applicable Countries
Select ‘Specific Countries’ to only allow payment from the ‘Payment From Specific Countries’ whitelist.
Payment from Specific Countries
Select countries you wish to whitelist.
Sort Order
Priority of Google Pay in list of payment methods.
Apple Pay Button Style
This sets the Apple Pay button style
Payment Action
Sets the transaction payment mode. If ‘Authorize’ is selected, all transactions will need to be captured when invoicing an order.
Payment from Applicable Countries
Select ‘Specific Countries’ to only allow payment from the ‘Payment From Specific Countries’ whitelist.
Payment from Specific Countries
Select countries you wish to whitelist.
Sort Order
Priority of Apple Pay in list of payment methods
The PaymentSite can be configured to process various different payment types: Sale , AuthOnly , and Save. For more details on what each of these commands is used for see Transaction API
The PaymentSite is implemented so that when the user is ready to pay, they are redirected out of the merchants system, to the PaymentSite to enter their payment information.
When the user is ready to pay, the PaymentSite is opened in an iFrame in the merchants system.
Most fields that are on the PaymentSite (besides the sensitive payment details) can be pre-populated by the merchants system before the user is directed to the page. This can be done by specifying the “key” and “values” of those fields separated by the “&” symbol in the URL query string. The “key“ value needs to match exactly the html “name“ element of the field; you can find that by inspecting the page using the developer tools of a browser. You can also look at the Transaction API by transaction type to find most fields.
Example: https://secure.cardknox.com/cardknoxexternaldemodev?xamount=100&xinvoice=232144234
Here is a list of specific settings fields that can be set in the query string in addition to the above.
Settings
xRedirectURL
This is the URL that the page will be redirected after the user submits the payment and the transaction is approved. If this is not specified, the user will stay on the PaymentSITE page and receive a message that the payment went through successfully.
xRedirectURL_NotApproved
This is the URL that the page will be redirected after the user submits the payment and the transaction is not approved. If this is not specified, the user will stay on the PaymentSITE page and receive a message that the payment did not go through, and they will be able to try again
xPostUrl
This is the URL the webhook will be sent to after the user submits the payment.
Redirect
Typically, after the transaction is completed by the user, the PaymentSite will automatically redirect the user back to the merchants system. There are two ways how to specify the redirect URL
Set the Redirect URL in the Cardknox PaymentSite backend settings
Set the xRedirectURL parameter in the query string when directing the user to the PaymentSITE.
The redirect will return the response parameter in the redirect quarry string. For a full list of response fields see Response parameters
Example: https://www.cardknox.com/?xCurrency=USD&xDate=6%2F29%2F2020%204%3A26%3A47%20PM&xResult=A&xStatus=Approved&xErrorCode=00000&xAuthCode=09379A&xAuthAmount=1.03&xRefNum=341260411&xToken=0p3q5479g1g3h2p34g5763008044gg0p&xBatch=5128197&xMID=xxxxxxxxxx9999&xTID=xxxxx6789&xAvsResult=Address%3A%20No%20Match%20&5_Digit_Zip%3A_No_Match&xAvsResultCode=NNN&xCvvResult=No%20CVV%20data%20available&xMaskedCardNumber=4xxxxxxxxxxx1111&xName=t%20test&xExp=0620&xCardType=Visa&xEntryMethod=Keyed&xCustom10=Payment%20Site
Webhook
The merchant's site can be notified of transaction responses via webhook notifications. This can be implemented in one of several ways:
Utilize account webhooks to receive webhooks for any transaction that is processed on an account
Set the webhook URL in the Sola PaymentSite backend settings
Set the xPostUrl the parameter in the query string when directing the user to the PaymentSITE.

PaymentEngine.xTransaction.Request MyRequest = new PaymentEngine.xTransaction.Request();MyRequest.xKey = "Your_Test_Key";
MyRequest.xVersion = "4.5.8";
MyRequest.xSoftwareName = "My Software";
MyRequest.xSoftwareVersion = "My Software Version 1.0";
MyRequest.xCommand = "cc:sale";
MyRequest.xAmount = 1.23m;
MyRequest.EnableDeviceInsertSwipeTap = True
MyRequest.Settings.Device_Set("Verifone_Mx915.4", "COM9", "115200", "N", "8");PaymentEngine.xTransaction.Response MyResponse = MyRequest.ProcessOutOfScope();PaymentEngine.xTransaction.Request MyRequest = new PaymentEngine.xTransaction.Request()MyRequest.xKey = "Your_Test_Key";
MyRequest.xVersion = "4.5.8";
MyRequest.xSoftwareName = "My Software";
MyRequest.xSoftwareVersion = "My Software Version 1.0";
MyRequest.xCommand = "cc:sale";
MyRequest.xAmount = 1.23m;
MyRequest.xCardNum = "4444333322221111";
MyRequest.xExp = "1022";PaymentEngine.xTransaction.Response MyResponse = MyRequest.Process();PaymentEngine.xTransaction.Request MyRequest = new PaymentEngine.xTransaction.Request();MyRequest.xKey = "Your_Test_Key";
MyRequest.xVersion = "4.5.8";
MyRequest.xSoftwareName = "My Software";
MyRequest.xSoftwareVersion = "My Software Version 1.0";
MyRequest.xCommand = "cc:void";
MyRequest.xRefNum = "123456789";PaymentEngine.xTransaction.Response MyResponse = MyRequest.Process();PaymentEngine.xTransaction.Request MyRequest = new PaymentEngine.xTransaction.Request();MyRequest.xKey = "Your_Test_Key";
MyRequest.xVersion = "4.5.8";
MyRequest.xSoftwareName = "My Software";
MyRequest.xSoftwareVersion = "My Software Version 1.0";
MyRequest.xCommand = "cc:refund";
MyRequest.xRefNum = "123456789";PaymentEngine.xTransaction.Response MyResponse = MyRequest.Process();PaymentEngine.xTransaction.Request MyRequest = new PaymentEngine.xTransaction.Request();MyRequest.xKey = "Your_Test_Key";
MyRequest.xVersion = "4.5.8";
MyRequest.xSoftwareName = "My Software";
MyRequest.xSoftwareVersion = "My Software Version 1.0";
MyRequest.xCommand = "cc:credit";
MyRequest.xAmount = 1.23m;
MyRequest.EnableDeviceInsertSwipeTap = True
MyRequest.Settings.Device_Set("Verifone_Mx915.4", "COM9", "115200", "N", "8");PaymentEngine.xTransaction.Response MyResponse =
MyRequest.ProcessOutOfScope();PaymentEngine.xTransaction.Request MyRequest = new PaymentEngine.xTransaction.Request();MyRequest.xKey = "Your_Test_Key";
MyRequest.xVersion = "4.5.8";
MyRequest.xSoftwareName = "My Software";
MyRequest.xSoftwareVersion = "My Software Version 1.0";
MyRequest.xCommand = "cc:authonly";
MyRequest.xAmount = 1.23m;
MyRequest.EnableDeviceInsertSwipeTap = True
MyRequest.Settings.Device_Set("Verifone_Mx915.4", "COM9", "115200", "N", "8");PaymentEngine.xTransaction.Response MyResponse = MyRequest.ProcessOutOfScope();PaymentEngine.xTransaction.Request MyRequest = new PaymentEngine.xTransaction.Request();MyRequest.xKey = "Your_Test_Key";
MyRequest.xVersion = "4.5.8";
MyRequest.xSoftwareName = "My Software";
MyRequest.xSoftwareVersion = "My Software Version 1.0";
MyRequest.xCommand = "cc:capture";
MyRequest.xRefNum = "123456789"PaymentEngine.xTransaction.Response MyResponse = MyRequest.Process();PaymentEngine.xTransaction.Request MyRequest = new PaymentEngine.xTransaction.Request();MyRequest.xKey = "Your_Test_Key";
MyRequest.xVersion = "4.5.8";
MyRequest.xSoftwareName = "My Software";
MyRequest.xSoftwareVersion = "My Software Version 1.0";
MyRequest.Settings.Device_Set("Verifone_Mx915.4", "COM9", "115200", "N", "8");string MySignature = MyRequest.GetSignature();PaymentEngine.xTransaction.Request MyRequest = new PaymentEngine.xTransaction.Request();MyRequest.xKey = "Your_Test_Key";
MyRequest.xVersion = "4.5.8";
MyRequest.xSoftwareName = "My Software";
MyRequest.xSoftwareVersion = "My Software Version 1.0";
MyRequest.Settings.Device_Set("Verifone_Mx915.4", "COM9", "115200", "N", "8");TransRequest.Device_ShowWelcomeScreen();PaymentEngine.xTransaction.Request MyRequest = new PaymentEngine.xTransaction.Request();MyRequest.xKey = "Your_Test_Key";
MyRequest.xVersion = "4.5.8";
MyRequest.xSoftwareName = "My Software";
MyRequest.xSoftwareVersion = "My Software Version 1.0";
MyRequest.xCommand = "ebtfs:sale";
MyRequest.xAmount = 1.23m;
MyRequest.EnableDeviceInsertSwipeTap = True
MyRequest.Settings.Device_Set("Verifone_Mx915.4", "COM9", "115200", "N", "8");PaymentEngine.xTransaction.Response MyResponse = MyRequest.ProcessOutOfScope();PaymentEngine.xTransaction.Request MyRequest = new PaymentEngine.xTransaction.Request();MyRequest.xKey = "Your_Test_Key";
MyRequest.xVersion = "4.5.8";
MyRequest.xSoftwareName = "My Software";
MyRequest.xSoftwareVersion = "My Software Version 1.0";
MyRequest.xCommand = "ebtfs:credit";
MyRequest.xAmount = 1.23m;
MyRequest.EnableDeviceInsertSwipeTap = True
MyRequest.Settings.Device_Set("Verifone_Mx915.4", "COM9", "115200", "N", "8");PaymentEngine.xTransaction.Response MyResponse = MyRequest.ProcessOutOfScope();PaymentEngine.xTransaction.Request MyRequest = new PaymentEngine.xTransaction.Request();MyRequest.xKey = "Your_Test_Key";
MyRequest.xVersion = "4.5.8";
MyRequest.xSoftwareName = "My Software";
MyRequest.xSoftwareVersion = "My Software Version 1.0";
MyRequest.xCommand = "cc:balance";
MyRequest.xAmount = 1.23m;
MyRequest.EnableDeviceInsertSwipeTap = True
MyRequest.Settings.Device_Set("Verifone_Mx915.4", "COM9", "115200", "N", "8");PaymentEngine.xTransaction.Response MyResponse = MyRequest.ProcessOutOfScope();PaymentEngine.xTransaction.Request MyRequest = new PaymentEngine.xTransaction.Request();MyRequest.xKey = "Your_Test_Key";
MyRequest.xVersion = "4.5.8";
MyRequest.xSoftwareName = "My Software";
MyRequest.xSoftwareVersion = "My Software Version 1.0";
TransRequest.xTax = 1.26m;
TransRequest.xAmount = 19.23m;
MyRequest.EnableDeviceInsertSwipeTap = True
MyRequest.Settings.Device_Set("Verifone_Mx915.4", "COM9", "115200", "N", "8");TransRequest.UpdateItems("json", "[{'xdescription':'ItemABC','xupc':558,'xqty':3,'xunit':'EA','xunitprice':'5.99'}]");
TransRequest.Device_ShowItems();PaymentEngine.xTransaction.Request MyRequest = new PaymentEngine.xTransaction.Request();MyRequest.xKey = "Your_Test_Key";
MyRequest.xVersion = "4.5.8";
MyRequest.xSoftwareName = "My Software";
MyRequest.xSoftwareVersion = "My Software Version 1.0";
MyRequest.xCommand = "cc:encrypt";
MyRequest.EnableDeviceInsertSwipeTap = True
MyRequest.Settings.Device_Set("Verifone_Mx915.4", "COM9", "115200", "N", "8");PaymentEngine.xTransaction.Response MyResponse = MyRequest.ProcessOutOfScope();This is a response object that's returned by Google after a payer approves payment
merchantOrderId
String
No
This is a response object that's returned by Google after a payer approves payment
payload
Yes
This is a response object that's returned by Google after a payer approves payment
Yes
A unique identifier for this payment
token
String
Yes
An object containing the encrypted payment data. This is the object that needs to be Base64 Encoded and sent to gateway as xCardNum
Name
Type
Always exists
Description
status
String
Yes
Contains all transaction data. For more details please click on the link
amount
Decimal
Yes
This is a response object that's returned by Google after a payer approves payment
merchantRequestId
String
Name
Type
Always exists
Description
transactionId
String
Yes
A unique identifier for this payment
externalClientId
String
Yes
Information about the card used in the transaction.
encryptionKey
No
String
Step 1: Check the latest stable iFields version here: https://cdn.cardknox.com/ifields/versions.htm
Step 2: Add the ifields.js file after the <head> tag on your website:
<script src=https://cdn.cardknox.com/ifields/**ifields-version-number**/ifields.min.js></script>
Step 1: Add the following iFrame JS snippet inside the <body> where Merchant Agreement is desired.
Make sure you have an attribute data-ifields-id="agreement" as part of <iframe> tag
<iframe id="agreement" class="agreement" data-ifields-id="agreement" src="https://cdn.cardknox.com/ifields/**ifields-version-number**/agreement.htm"></iframe>
Step 2: Create JavaScript function to handle Agreement API callback
For response object reference refer here: Agreement Response
Step 3: Enable Customer Agreement to get the token
There are two ways to get the token:
Asynchronously (a callback will be performed once the customer agrees to Terms and Conditions)
Just add enableAgreement call when the document is loaded (autoAgree the parameter is set to true):
Synchronously (Explicitly calling getToken function for example on Submit)
Add enableAgreement call when the document is loaded (autoAgree the parameter is set to false):
In your Submit function add the following code:
The object holding the response with token from Agreement API.
Name
Type
Description
status
There are 2 possible cases:
Agreement was accepted and Token was obtained status=iStatus.success
Agreement wasn’t accepted or an error occurred obtaining the token: status=iStatus.error
statusText
String
When status=iStatus.error this field will be populated with the reason
token
String
When status=iStatus.success this field will be populated with token
Follow the installation instructions:
The default download location is C:\Program Files (x86)\Retail Hero\RMH POS\Extensions\PaymentEngineRMH
In the POS Manager Setup > Financial > Tender Types:
A type with the description “Credit Card” is required.
For Gift Card, a type with the description “Gift Card” is required.
Add the Custom POS buttons (see below)
Restart the POS.
In the POS Manager Setup > Hardware > Custom POS Buttons
For Settings Management, add a custom button with the following information:
Style : Internal Command
Caption : Settings
Command: CustomActionCommand "paymentenginemanager65b4fe30-6fa4-4e71-af5b-71c9c1a07802"
There should be two options:
Change Key: This allows changing the xKey stored in the database.
Change Settings: This allows modifying the settings.
Changing the key from the settings window will update the xKey stored in the database.
For Gift Card:Balance, add a custom button with the following command:
Style: Internal Command
Caption: Gift Balance
Command: CustomActionCommand "giftcardgetbalancee62227dd-ee9b-41b0-8390-161226f95436"
Step 1: Configure or create EBTFS and EBTCB as tender types
EBT Tender
Open the store Store Operations Manager and go to Financial > Tender Types.
If “EBTFS” is listed as an existing tender type, select it, click on Properties, and continue to the next step. If it is not listed:
Click New
Set Description: “EBT Food Stamp”
Set Tender Code: EBTFS
For tender type, select “Food Stamp”
EBT Cash Tender
Open the store Store Operations Manager and go to Financial > Tender Types.
If “EBTCB” is listed as an existing tender type, select it, click on Properties, and continue to the next step. If it is not listed:
Click New
Set Description: “EBT Cash Benefit”
Set Tender Code: EBTCB
For tender type, select “Debit Card”
Step 2: Setting EBT Balance Custom Button
EBT Balance Command
For EBT Balance, add a custom button with the following information:
Style: Internal Command
Caption: EBT Balance
Command: CustomActionCommand ebtBalance_0586D912-FC34-401B-A55E-0B977C7F47B0
To display receipt of payments made with Sola extension supported tender types (Credit/Debit card, EBT, Gift etc.), the application uses RMH's Tender.Data property to populate the custom receipt data string for these mentioned tender types. To display this value on the receipt, the property should be included in the tender iteration block.
Receipt will show in POS as shown below. The highlighted area is Tender.Data value.
Sales receipts can show card info with balances for EBT and gift cards. The details can be displayed at the highlighted area.
To display Balance, AuthCode of RMH plugin uses the Tender.Data2 variable. which can be used in receipt file as below.
The highlighted block for including Tender.Data2 is added just below the the "Tendered" line. This will print the additional tender details (card number, auth code, balance) for each tender if it contains additional details (such as custom payment methods like Credit Card, EBT, or Gift Card).
A sample receipt is shown below, which shows tender details. The receipt below shows a split payment example, containing a credit card and EBT payment. The credit card transaction displays Card Number and Auth Code. The EBT payment displays Card Number, Auth Code and the remaining balance on the card.
NOTE: Tender.Data2 is not limited to EBT. It can contain additional details for other Cardknox payment methods such as EBTFS, Gift Card, and more.
Sola's batch processing tool allows you to process a large volume of transactions in a single batch, all at once. Batches can be processed for a single account or multiple accounts.
x = Incrementing Sequence Number
Numbers can be skipped but they must always be greater than the previous file.
Files with older or invalid sequence numbers are ignored.
Sequence Number Max Value = 999999999 (9 digits).
KVP = URL Encoded Key-Value-Pair
Sample: xName=John%20Smith&xAmount=1
Note: Ensure that all values are URL encoded.
Client uploads Request/REQUEST_X.KVP
Client uploads Request/PROCESS_X.KVP
Batch process is triggered when Request/PROCESS_X.KVP is received
Gateway saves Response/RESPONSE_X.KVP
Gateway saves Response/COMPLETE_X.KVP
Client polls and parses Response/COMPLETE_X.KVP
If xStatus=Success, then client downloads and parses Response/RESPONSE_X.KVP
Filename Format: REQUEST_X.KVP
Each line contains an individual transaction in KVP format. Any transaction that can be executed via the standard API can be submitted in the Request Data File.
Required Variables:
File Formats
Filename Format: PROCESS_X.KVP Required Variables:
File Formats
Filename Format: RESPONSE_X.KVP
Each line contains an individual response in KVP format.
Required Variables:
File Formats
Filename Format: COMPLETE_X.KVP
Required Variables:
Create a Merchant ID.
Navigate to .
Click on Identifiers.
Sola accounts can be configured to send notifications, known as webhooks, to a designated URL each time a transaction is processed on the account. These webhooks are sent as a series of key-value pairs, encoded in a POST request, and contain all the necessary information to identify the transaction and its status. The information included in these webhooks can be customized to fit your needs, and a complete list of available fields can be found in the "" section. The webhook and can be enabled in the .
See example below:
{
"status": "success",
"amount": 6,
"merchantRequestId": "Merchant defined request ID",
"merchantOrderId": "Merchant defined order ID",
"payload": {
"transactionId": "1947120568389887601",
"externalClientId": "test123",
"encryptionKey": "Pqdjv842Nv...8q14l",
"token": "FPA6TTy0q457.....tCf+tqH5/ruIQ1Iz4FI9hE5NBD+EM="
}
}function handleAgreementResponse(response) {
let msg = null;
if (!response) {
msg = "Failed to load token. No Response";
} else if (response.status !== iStatus.success) {
msg = "Failed to load token. "+response.statusText || "No Error description available";
} else if (!response.token) {
msg = "Failed to load token. No Token available";
} else {
msg = response.token;
}
setTimeout(() => {alert(msg)}, 10);
}document.addEventListener("DOMContentLoaded", function(event) {
................
ckCustomerAgreement.enableAgreement({
iframeField: 'agreement',
xKey: '<Your ifields xKey>',
autoAgree: true,
callbackName: 'handleAgreementResponse'
});
................
}document.addEventListener("DOMContentLoaded", function(event) {
................
ckCustomerAgreement.enableAgreement({
iframeField: 'agreement',
xKey: '<Your ifields xKey>',
autoAgree: false
});
................
}ckCustomerAgreement.getToken()
.then(resp => {
handleAgreementResponse(resp);
})
.catch(err => {
console.error("Agreement Token Error", exMsg(err));
handleAgreementResponse(err);
});const iStatus = {
success: 100,
unsupported: -100,
error: -200
}



Client deletes all files from Response folder
xKey=&xSubmittedCount=500&xFormat=KVP&xSequenceNumber=99999
xKey=&xSubmittedCount=500&xFormat=KVP&xSequenceNumber=9999 9&xResult=&xStatus=&xError=&xProcessedCount=
Value
Description
Sample Data
xIndex
The zero-based index number of each row.
xIndex=0&xSequenceNumber=99999&xKey=&xVersion=&xSoftwareNa me=&xSoftwareVersion=&xCommand=&xCardNum=&xExp=&xName=& xAmount=
xSequenceNumber
Must match the Incrementing Sequence Number in the file name.
xIndex=0&xSequenceNumber=99999&xKey=&xVersion=&xSoftwareNa me=&xSoftwareVersion=&xCommand=&xCardNum=&xExp=&xName=& xAmount=
Standard API request variables
See iFields.
xIndex=0&xSequenceNumber=99999&xKey=&xVersion=&xSoftwareNa me=&xSoftwareVersion=&xCommand=&xCardNum=&xExp=&xName=& xAmount=
Value
Description
Sample Data
xKey
Batch upload credential (not the merchant credential).
xKey=&xSubmittedCount=500&xFormat=KVP&xSequenceNumber=99999
xSubmittedCount
Count of transactions in the Request File.
xKey=&xSubmittedCount=500&xFormat=KVP&xSequenceNumber=99999
xFormat
KVP.
xKey=&xSubmittedCount=500&xFormat=KVP&xSequenceNumber=99999
xSequenceNumber
Value
Description
Sample Data
xIndex
Corresponds to the xIndex in the request.
xIndex=0&xSequenceNumber=99999&xResult=&xStatus=&xError=&xRe fNum=&xAuthCode=&xAuthAmount=&xToken=&xMaskedCardNumber= &xInvoice=
xSequenceNumber
Corresponds to the xSequenceNumber in the request.
xIndex=0&xSequenceNumber=99999&xResult=&xStatus=&xError=&xRe fNum=&xAuthCode=&xAuthAmount=&xToken=&xMaskedCardNumber= &xInvoice=
Standard API response variables
See API Docs.
xIndex=0&xSequenceNumber=99999&xResult=&xStatus=&xError=&xRe fNum=&xAuthCode=&xAuthAmount=&xToken=&xMaskedCardNumber= &xInvoice=
Value
Description
Sample Data
xResult
Status of the batch upload process.
Success/Error value.
xKey=&xSubmittedCount=500&xFormat=KVP&xSequenceNumber=9999 9&xResult=&xStatus=&xError=&xProcessedCount=
xStatus
Status of the batch upload process.
Success/Error value.
xKey=&xSubmittedCount=500&xFormat=KVP&xSequenceNumber=9999 9&xResult=&xStatus=&xError=&xProcessedCount=
xError
If xStatus = Error, this variable contains the error message.
xKey=&xSubmittedCount=500&xFormat=KVP&xSequenceNumber=9999 9&xResult=&xStatus=&xError=&xProcessedCount=
xProcessedCount
Must match the incrementing sequence number in the file name
Count of the processed transactions.
CC:Sale
xAmount
0.01
xResponseResult
Approved
xMaskedCardNumber
4xxxxxxxxxxx1111
xExp
1020
xCardType
Visa
xToken
7h39p8qp6hq2pgqp76mgg2qnq7npp3g5
xSoftwareName
KnockKnox
xSourceKey
Cardknox Support Key
xResponseBatch
6358090
xMerchantID
8663
xMerchantName
Cardknox Support
Raw Content
For security purposes and to prevent DDoS attacks, a pin can be set up when configuring the webhook. Sola will generate a hash and it will be included in the webhook header as "ck-signature". To validate the authenticity of a webhook on the recipient's end, follow the steps below to generate a hash and compare it to the "ck-signature". If your hash matches the "ck-signature" it confirms that the webhook originated from Sola.
URL Decode Data: URL decode the webhook data.
Normalize Key Case: Convert all parameter keys to lowercase to ensure case-insensitive sorting.
Sort Data Alphabetically: Sort the parameters alphabetically by their keys.
Extract Values: Extract the values from the sorted parameters.
Concatenate Values with PIN: Combine the extracted values with the webhook pin at the end.
Hash Concatenated String Using MD5: Apply the MD5 hashing algorithm to the concatenated string.
Pin Rules
The pin can only be AlphaNumeric
The pin must be at least 15 characters long
Form values
xEnteredDate
9/3/2021 9:28:22 AM
xRefNum
506918667
xCommand
xEnteredDate=9%2f3%2f2021+9%3a28%3a22+AM&xRefNum=506918667&xCommand=CC%3aSale&xAmount=0.01&xResponseResult=Approved&xMaskedCardNumber=4xxxxxxxxxxx1111&xExp=1020&xCardType=Visa&xToken=7h39p8qp6hq2pgqp76mgg2qnq7npp3g5&xSoftwareName=KnockKnox&xSourceKey=Cardknox+Support+Key&xResponseBatch=6358090&xMerchantID=8663&xMerchantName=Cardknox+SupportThe SDK is distributed as a .framework
.framework contains the CardknoxPaymentsSDK binary and ObjectiveC .h headers describing the SDK API
The CardknoxPaymentsSDK does not contain bitcode and cannot be integrated with applications that require bitcode
.framework only supports arm64 64-bit architecture for device builds. Simulator targets are not supported.
SDK minimum deployment target is 14.0
Obtain and place the downloaded .framework file to the root of your project (for example, alongside the xcodeproj file):
Open the General under the application Target. Find the Frameworks, Libraries, and Embedded Content section. Click on the + icon for adding a framework to the project.
+ icon opens the dialog screen for adding framework. On dialog click on Add Other dropbox, which opens a menu. On the menu click on Add files....
Add files... opens Choose frameworks and libraries to add dialog. On dialog find the root folder of the project and select CardknoxPaymentsSDK.framework file.
After adding the framework, the CardknoxPaymentsSDK.framework must be in the Frameworks, Libraries, and Embedded Content section. Pay attention to the value in the Embed column. The value must be Embed & Sign.
Also after adding the framework, the CardknoxPaymentsSDK.framework must be in Link Binary With Libraries and Embed Frameworks sections. Link Binary With Libraries and Embed Frameworks sections are in the Build Phases tab, under the application Target.
The goal is to reference the libSkiaSharp.framework. It can be found in the CardknoxPaymentsSDK.framework/Frameworks folder. Repeat the same steps for libSkiaSharp.framework integration.
The Cardknox SDK doesn’t support bitcode. To disable Bitcode, follow these steps:
Click on your application target. Choose Build Settings > All
Set the Enable Bitcode option to No in the Build Options section
The CardknoxPaymentsSDK framework contains an Info.plist file which contains various key/value pairs that are required by the framework, for example, it defines a NSBluetoothAlwaysUsageDescription key with a value similar to “Bluetooth is required to find, connect to and transfer data between a card reader and the app"
The application that is using the CardknoxPaymentsSDK framework also defines an Info.plist file with its own key/value pairs
The goal is to merge the framework Info.plist file with the application Info.plist in order to avoid runtime errors in the CardknoxPaymentsSDK framework code due to missing key/values. XCode doesn't perform any merges automatically.
Note that if there are identical keys present in the application Info.plist and in the framework Info.plist files, such as the NSBluetoothAlwaysUsageDescription key; the value defined in the application Info.plist for that key will have priority during the merge; making it easy to override values in the framework Info.plist
To merge the two files, define a Run Script step in the XCode application Target's Build Phases section and run the PlistBuddy tool, as following:
Add a new Run Script step to Build Phases
Globalization File
The SDK contains a file icudt.dat. This file is used by the dotnet runtime to configure globalization. Our SDK is using the en-US culture to format currency symbols, amount delimiters, etc.. This means the SDK is “culture sensitive” or “culture variant”.
dotnet runtime will look for the icudt.dat file in the “main bundle” which is the Swift app where the SDK is a guest. Therefor our goal is to copy the icudt.dat into the final application archive in XCode, whenever the app builds.
Define a new Run Script phase for your application Target in XCode
Input the following code:
This section shows how to use the CardknoxPaymentsSDK in Swift code. For Swift applications, an umbrella header needs to be created and referenced by your application Target in order to properly embed the framework into your app. To create the umbrella header, follow the steps:
Create a new header file in the Target folder via File menu > New... > File from Template... Choose Header File option; for example, the name might be: iOS.Swift.SampleApp-Bridging-Header.h
Clear all text in the header file
Add #import "CardknoxPaymentsSDK/CardknoxPaymentsSDK.h" into the header file.
Navigate to your target’s Build Settings > All.
Find the Objective-C Bridging Header option in the Swift Compiler - General section, and set its value to be the relative path to the header file. For example, an application target named iOS.Swift.SampleApp will have iOS.Swift.SampleApp/iOS.Swift.SampleApp-Bridging-Header.h path specified. The assumption here is that the header file is in the Target folder, alongside the Info.plist file.
Click on the plus sign next to Identifiers.
Choose Merchant IDs and click Continue
Follow the instructions to Register a Merchant ID.
Register your domain for Apple Pay on the Web.
If you are not using Apple Pay on the Web, skip this step.
On Apple Developer Page, under the list of merchants, click on the one you just created.
Scroll down to Merchant Domains and click Add Domain.
Follow the instructions to register your domain.
Generate Merchant ID Certificate.
Navigate to your Sola Merchant Portal
Open AccountSettings > Payment Methods > Configure Apple Pay
Click Register for Apple Pay using your own Certificate
Download csr file and generate Merchant Certificate based on that csr.
Click Download Certificate from Apple and save it locally
Create an Apple Pay Payment Processing Certificate.
Continue on Merchant Portal by uploading Merchant Certificate from Apple.
Download Payment Processing csr
Under Apple Pay Payment Processing Certificate, click on Create Certificate.
Click on Choose File, select CSR file and continue.
You are now ready to process Apple Pay transactions!
Q: What Apple Pay related fields are necessary to be sent on a gateway transaction request? A:
xCardNum containing a base-64 encoded ApplePay encrypted token block (paymentData.data)
xDigitalWalletType set to “ApplePay”
Q: Can a POST or GET be used interchangeably to submit the request?
A: No, due to the size of the data, this request must be submitted to Sola Gateway via a POST.
Q: I received an error “Invalid payment data format“ on the transaction response. What might be the issue?
A: The Apple Pay payload in the xCardNum field was not a valid base-64 block.
Q: I received an error “Transaction amount does not match the amount provided“ on the transaction response. What might be the issue?
A: The amount sent in via the xAmount parameter does not match the amount retrieved from the payload provided by Apple Pay.
Q: I received error “PaymentDataType <?> not supported for ApplePay“ on the transaction response. What might be the issue?
A: We currently only support 3DSecure data type. This covers all areas aside from China.
Q: How can I be sure that an Apple Pay transaction is secure?
A: Sola will validate the signature on the Apple Pay request to ensure that the request is properly signed using Apple Pay certificates and that the request has not been tampered with. If this validation fails, the transaction will be rejected.
Q: What will the xEntryMethod be for an Apple Pay transaction?
A: The xEntryMethod will be set to DigitalWallet.




For the Full Response example click here
paymentData use example
An object returned from onPaymentAuthorize ajax call - typically a Gateway Response An example of PaymentComplete Response returned by iFields is below:
The Sola bundle for NetSuite is an easy integration that allows users to accept payments via the Sola gateway directly within NetSuite. This plugin also supports the secure storage of customer payment methods for future transactions.
An existing Sola account (live or sandbox) with a token and transaction key.
Provide Sola with your NetSuite ID by emailing it to . We will enable the bundle for your NetSuite ID and enable the license for NetSuite on your Sola account.
Navigate to Customization > Suite Bundler > Search & Install Bundles.
Search and install the ‘xPayment’ bundle (you can also install ‘xPayment Beta’ for additional features).
Navigate to Setup > Company > PE Merchant Account to create a new PE merchant account record.
Name: Name of the merchant account.
PE Transaction Key: API key.
Add the “PE” fields to the forms that accept payments (cash sale, cash refund, customer deposit, customer payment, customer refund, sales order). Make sure to hide the NetSuite fields that the plugin is replacing.
Step 3: Upload Existing Customer Card Use a regular .CSV upload and map the fields to PE Stored Credit Card.
Step 4: Use a Card Reader To use the card reader, select the PE Credit Card Number field, then swipe or insert the card to populate the field with the card data.
Step 5: Test the Installation From Sola, request a sandbox account with a token and transaction key. Follow the installation steps above to perform the setup.
What to Test:
Approved transaction
Declined transaction
Ensure that all scripts are running by creating a transaction and adding a stored payment.
Verify that the Sola log shows the transaction history.
NetSuite recommends that administrators installing a bundle test that bundle using a NetSuite sandbox account.
Roles and Permissions
Make sure the roles using this plugin have permission for the following:
Transaction Logs: Saved Search and Audience (Roles and Employees) need to be set for all users using this bundle (Transaction logs > Edit > Audience).
Accounting lists need at least View rights (Role > Permissions > Setup > Accounting lists ).
Customers need at least View rights (Role > Permissions > Lists > Customers).
User Procedures
Add a Stored Card to a Customer
In the customer record, select Financials > PE Stored Card.
Select the new PE Stored Card button.
You can also add a new card to a transaction screen that has the PE Stored Card field. Check the plus symbol (+) to add a new card.
How the Plugin Pulls Customer Billing and Shipping Values
The plugin retrieves customer billing and shipping values from various locations in a specific order of preference. The order is as follows:
From the current record itself. If the Bill To or Ship To values are set, they are used. (Exception: a customer payment with a single applied invoice. See Note below.)
If the current record doesn’t have the Bill To or Ship To values set, then the plugin pulls the values from the parent record (if one exists).
If no parent record exists, or the parent record does not have the values set, the plugin pulls the values from the address list on the customer record:
Note: For customer payments with a single applied invoice, the plugin pulls the values from the applied invoice first. If the values are not set on the applied invoice (or if multiple invoices are applied), the plugin pulls the values from the address list on the customer record.
Use SuiteBundler to update when a new version is available. SuiteBundler capabilities may change over time; verify the current SuiteBundler features as described in the NetSuite Help Center topic, Updating Bundles in the Bundle Repository.
Use SuiteBundler to uninstall the bundle completely. Note that this completely removes all history of Sola payments.
Uninstalling this bundle should generally follow the steps provided in the NetSuite Help Center topic, Uninstalling Bundles into Your NetSuite Account. The SuiteBundler capabilities may change over time; review this help topic to verify the current behavior of uninstalling bundles.
Sola's Split Capture feature enables merchants to capture multiple payments for a single authorization-only transaction. This functionality is ideal for e-commerce merchants who ship out orders in increments, as they have the ability to capture several portions of the authorization as each shipment goes out.
The benefits of Split Capture are as follows:
Ability to Confirm Available Funds for the Entire Order Amount Rather than having to process multiple authorizations and captures, merchants can run a single authorization to confirm there are funds available before capturing several portions of the total amount.
Improve Record Keeping and Account Reconciliations Using Split Capture helps merchants to ensure that payments more accurately reflect shipments. Invoices and records are more organized, and the account reconciliation process is that much simpler.
Customer Satisfaction Customers appreciate that they’re only getting charged for shipments that have actually shipped out.
A standard authonly command is executed for the amount to be authorized with no additional flags.
For the best merchant experience, it is recommended that the transaction include xRequireSplitCapturable=1, which ensures that the transaction can be split captured. If the flag is sent in on the authorization and the account is not set up to support split capture, the transaction errors with, “Split capture not supported.“ This flag is only supported on cc:authonly transactions.
If the authorization can be split captured (i.e., the engine and account setup support split captures), then the authonly response includes IsSplitCapturable=1.
[Optional] flag to require that authorization is able to be split captured before processing the authorization
For a single cc:authonly, many cc:splitcapture commands can be executed. Each cc:splitcapturemust specify the amount of the original authorized amount to be captured. The authorization is updated with the ClearedAmount (amount that was successfully captured) and the ClearedCount (count of successful split capture transactions).
Reference number of the authonly transaction.
The user has the option to close an authonly transaction so that additional transactions cannot be processed for the authorization.
Once the auth has been closed:
The status of the auth would be set to AuthCloseTransaction.
In the transaction details of the auth, canceled would be set to true.
An auth that was already closed would be blocked.
The close command should only be used to close an authorization that has already been split captured. If a merchant wants to close an authorization that has not been split captured yet, the authorization should be voided.
An auth can not be voided/voidrefunded if it was split captured or closed.
"Authorization was split captured. Issue refund on split capture transaction."
A split capture transaction can not be voided.
Refunding an authonly transaction:
If the authonly was not captured/split captured or closed, refund would be blocked.
“Refund not allowed on non-captured auth. Issue void.”
VoidRefund
AuthOnly Transaction
If transaction has not been split captured, it will be processed as a void.
If transaction has been split captured, this will be blocked.
The following fields can be requested on all standard report types. See for more reportable fields.
Report:auth will only display authorizations that have not been closed. It will display authorizations that have been split captured.
When you build integrations for different POS devices, there are three distinct types of credit card processing flows. Read on to better understand each integration method.
Payment Engine → Cardknox Gateway → Bank The credit card device is used to obtain card information, but the transaction flows from Payment Engine to the Cardknox Gateway and then to the bank.
# Define source and destination paths
FRAMEWORK_NAME="CardknoxPaymentsSDK"
ICU_FILE_NAME="icudt.dat"
SRC_PATH="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/${FRAMEWORK_NAME}.framework/${ICU_FILE_NAME}"
DST_PATH="${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/${ICU_FILE_NAME}"
echo "Copying ${ICU_FILE_NAME} from ${SRC_PATH} to ${DST_PATH}"
# Check if file exists
if [ -f "$SRC_PATH" ]; then
cp "$SRC_PATH" "$DST_PATH"
echo "✅ Successfully copied ${ICU_FILE_NAME} to main bundle"
else
echo "❌ ICU file not found at: ${SRC_PATH}"
exit 1
fi{ "paymentData": { "version": "EC_v1", "data":
"nts4o1EdIF9GA7Yy3GbdJamkPJNu66nMtPBk6hcp4N4/12v7LrEf/xsaFE5NRH9jEMQ93KJME2f9ZnQo9rRNK0ZLwYEQ7mynlsRvQY1gtvgEAhZMarGfOrBFSLIS5gC3tWM4hRn+ELfu9U3vv3sg+h4Ci611TeFvwZK5E4tbQ7Q6V66kN2sJSGjGcqzCoao6WXCOHhyhWy53c24OqK6Bz77RGhM+PtMfBNGREKzwKATnS1PHhA1mPUGysBIUWc2qWNRDxVm0XqlH/aBndQankLNbUetWFNHrJDhRsiEvdVwIZfUG2E+HtkQLV80Q2OCcnSmNSl/uoLCetvd7zM9w0OUXGUQ3qP/LvtAiyUXJBDZ8TUQVyNV/qac9zsjHIDvP2EiwSgdJXO+ns1s=",
"signature":
"MIAGCSqGSIb3DQEHAqCAMIACAQExDzANBglghkgBZQMEAgEFADCABgkqhkiG9w0BBwEAAKCAMIID4zCCA4igAwIBAgIITDBBSVGdVDYwCgYIKoZIzj0EAwIwejEuMCwGA1UEAwwlQXBwbGUgQXBwbGljYXRpb24gSW50ZWdyYXRpb24gQ0EgLSBHMzEmMCQGA1UECwwdQXBwbGUgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxEzARBgNVBAoMCkFwcGxlIEluYy4xCzAJBgNVBAYTAlVTMB4XDTE5MDUxODAxMzI1N1oXDTI0MDUxNjAxMzI1N1owXzElMCMGA1UEAwwcZWNjLXNtcC1icm9rZXItc2lnbl9VQzQtUFJPRDEUMBIGA1UECwwLaU9TIFN5c3RlbXMxEzARBgNVBAoMCkFwcGxlIEluYy4xCzAJBgNVBAYTAlVTMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEwhV37evWx7Ihj2jdcJChIY3HsL1vLCg9hGCV2Ur0pUEbg0IO2BHzQH6DMx8cVMP36zIg1rrV1O/0komJPnwPE6OCAhEwggINMAwGA1UdEwEB/wQCMAAwHwYDVR0jBBgwFoAUI/JJxE+T5O8n5sT2KGw/orv9LkswRQYIKwYBBQUHAQEEOTA3MDUGCCsGAQUFBzABhilodHRwOi8vb2NzcC5hcHBsZS5jb20vb2NzcDA0LWFwcGxlYWljYTMwMjCCAR0GA1UdIASCARQwggEQMIIBDAYJKoZIhvdjZAUBMIH+MIHDBggrBgEFBQcCAjCBtgyBs1JlbGlhbmNlIG9uIHRoaXMgY2VydGlmaWNhdGUgYnkgYW55IHBhcnR5IGFzc3VtZXMgYWNjZXB0YW5jZSBvZiB0aGUgdGhlbiBhcHBsaWNhYmxlIHN0YW5kYXJkIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHVzZSwgY2VydGlmaWNhdGUgcG9saWN5IGFuZCBjZXJ0aWZpY2F0aW9uIHByYWN0aWNlIHN0YXRlbWVudHMuMDYGCCsGAQUFBwIBFipodHRwOi8vd3d3LmFwcGxlLmNvbS9jZXJ0aWZpY2F0ZWF1dGhvcml0eS8wNAYDVR0fBC0wKzApoCegJYYjaHR0cDovL2NybC5hcHBsZS5jb20vYXBwbGVhaWNhMy5jcmwwHQYDVR0OBBYEFJRX22/VdIGGiYl2L35XhQfnm1gkMA4GA1UdDwEB/wQEAwIHgDAPBgkqhkiG92NkBh0EAgUAMAoGCCqGSM49BAMCA0kAMEYCIQC+CVcf5x4ec1tV5a+stMcv60RfMBhSIsclEAK2Hr1vVQIhANGLNQpd1t1usXRgNbEess6Hz6Pmr2y9g4CJDcgs3apjMIIC7jCCAnWgAwIBAgIISW0vvzqY2pcwCgYIKoZIzj0EAwIwZzEbMBkGA1UEAwwSQXBwbGUgUm9vdCBDQSAtIEczMSYwJAYDVQQLDB1BcHBsZSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTETMBEGA1UECgwKQXBwbGUgSW5jLjELMAkGA1UEBhMCVVMwHhcNMTQwNTA2MjM0NjMwWhcNMjkwNTA2MjM0NjMwWjB6MS4wLAYDVQQDDCVBcHBsZSBBcHBsaWNhdGlvbiBJbnRlZ3JhdGlvbiBDQSAtIEczMSYwJAYDVQQLDB1BcHBsZSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTETMBEGA1UECgwKQXBwbGUgSW5jLjELMAkGA1UEBhMCVVMwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATwFxGEGddkhdUaXiWBB3bogKLv3nuuTeCN/EuT4TNW1WZbNa4i0Jd2DSJOe7oI/XYXzojLdrtmcL7I6CmE/1RFo4H3MIH0MEYGCCsGAQUFBwEBBDowODA2BggrBgEFBQcwAYYqaHR0cDovL29jc3AuYXBwbGUuY29tL29jc3AwNC1hcHBsZXJvb3RjYWczMB0GA1UdDgQWBBQj8knET5Pk7yfmxPYobD+iu/0uSzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFLuw3qFYM4iapIqZ3r6966/ayySrMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly9jcmwuYXBwbGUuY29tL2FwcGxlcm9vdGNhZzMuY3JsMA4GA1UdDwEB/wQEAwIBBjAQBgoqhkiG92NkBgIOBAIFADAKBggqhkjOPQQDAgNnADBkAjA6z3KDURaZsYb7NcNWymK/9Bft2Q91TaKOvvGcgV5Ct4n4mPebWZ+Y1UENj53pwv4CMDIt1UQhsKMFd2xd8zg7kGf9F3wsIW2WT8ZyaYISb1T4en0bmcubCYkhYQaZDwmSHQAAMYIBizCCAYcCAQEwgYYwejEuMCwGA1UEAwwlQXBwbGUgQXBwbGljYXRpb24gSW50ZWdyYXRpb24gQ0EgLSBHMzEmMCQGA1UECwwdQXBwbGUgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxEzARBgNVBAoMCkFwcGxlIEluYy4xCzAJBgNVBAYTAlVTAghMMEFJUZ1UNjANBglghkgBZQMEAgEFAKCBlTAYBgkqhkiG9w0BCQMxCwYJKoZIhvcNAQcBMBwGCSqGSIb3DQEJBTEPFw0yMDA5MzAwMjU2NDBaMCoGCSqGSIb3DQEJNDEdMBswDQYJYIZIAWUDBAIBBQChCgYIKoZIzj0EAwIwLwYJKoZIhvcNAQkEMSIEIPKm5f38JoEhydyPKo4cCyfCY+KXfKty3kQAuOrUfUMwMAoGCCqGSM49BAMCBEYwRAIgBZZO6LSzs93DKgw/NpvqUevggniTod0T5zMJUzM2TKUCIFLyN1mYe1b4ANNQEMpYMr2D+CCnh86iARbZ1ue4iQVGAAAAAAAA",
"header": { "ephemeralPublicKey": "MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE4jfJmg6VGIGFnlUX2mw/0REAQHdlCqXOfFAfwrurQh9WM9EBjcsmjwl5KDBH5yuVeG2sW4uXFlqQkSoWJDnxig==", "publicKeyHash": "XvufuWpJGfsSOrPWpbBwoyjrrRT3ByIFOijzGdeI8Ho=", "transactionId":
"0969a45481176c0e86f6ad43914de68e41d33ce95db1e1169d7cd3274d757b49", "applicationData": null }, "paymentMethod": { "displayName": "MasterCard 0492", "network": "MasterCard", "type": "credit" }, "transactionIdentifier": "0969A45481176C0E86F6AD43914DE68E41D33CE95DB1E1169D7CD3274D757B49" } }"Auth can no longer be closed"
A voided auth would be blocked.
"Cannot close voided auth"
Additional split captures would be blocked.
Voids and refunds on the auth would be blocked.
Void: "Authorization was closed and can no longer be voided."
Refund: "Refund not allowed. Issue refund on split capture transaction."
“Refund not allowed. Issue refund on split capture transaction.”
Refunding a split capture transaction:
Transaction will be processed as a refund.
Field
Value
xCommand
cc:authonly
xRequireSplitCapturable
[Optional] flag to require that authorization will be able to be split captured before processing the authorization
xAmount
Amount to be authorized
Field
Value
xCommand
cc:splitcapture
xRefnum
Reference number of the authonly transaction.
xAmount
Amount to be split captured
Field
Value
xCommand
cc:authclose
xRefnum
Reference number of the authonly transaction.
Field
Value
xClearedCount
Count of cleared split capture transactions on original auth.
xClearedAmount
Amount that has been split captured on original auth.
xIsSplitCapturable
Specifies whether or not the auth can be split captured.

Yes
This is a response object that's returned by Apple after a payer approves payment.
Yes
A unique identifier for this payment
Name
Type
Always exists
Description
billingContact
No
Contains all transaction data. For more details please click on the link.
shippingContact
No
This is a response object that's returned by Apple after a payer approves payment.
token
Name
Type
Always exists
Description
paymentData
JSON
Yes
An object containing the encrypted payment data. This is the object that needs to be Base64 Encoded and sent to gateway as xCardNum.
paymentMethod
Yes
Information about the card used in the transaction.
transactionIdentifier
PaymentToken
String
var reqGateway = new
{
.........
xcardnum = Convert.ToBase64String(Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(req.paymentData)))
.........
};{
"xResult": "A",
"xStatus": "Approved",
"xError": "",
"xErrorCode": "00000",
"xRefNum": "481244058",
"xExp": "0424",
"xAuthCode": "OK8853",
"xBatch": "6332569",
"xAvsResultCode": "YYY",
"xAvsResult": "Address: Match & 5 Digit Zip: Match",
"xCvvResultCode": "S",
"xCvvResult": "Should be On card but Not so indicated",
"xAuthAmount": "1.12",
"xMaskedCardNumber": "5xxxxxxxxxxx6344",
"xCardType": "MasterCard",
"xName": "Test Applepay",
"xToken": "34q9h58n68qh24p7719m76m0nhm013hh",
"xMID": "xxxxxxxxxxx0661",
"xTID": "xxxx0003",
"xDate": "7/13/2021 7:18:02 PM",
"xAuthNetwork": "3",
"xEntryMethod": "Keyed",
"xCAVV": "ALyaPlPZZIgIADhFniB+AoABFA==",
"xEciFlag": "01"
}<!-- Use the following src for the script on your form and replace ****version**** with the desired version: src="https://cdn.cardknox.com/ifields/****version****/ifields.min.js" -->
<script src="ifields.min.js"></script>
<script type="text/javascript">
document.addEventListener("DOMContentLoaded", function(event) {
ckClick2Pay.enableClickToPay({
environment: c2pEnvironment.sandbox,
externalClientId: "<Your externalClientId>",
click2payContainer: "click2payContainer",
onPaymentPrefill: click2payRequest.paymentPrefill,
onPaymentSuccess: click2payRequest.paymentSuccess,
onPaymentError: click2payRequest.paymentCallback,
onPaymentCancel: click2payRequest.paymentCallback,
onButtonLoaded: click2payRequest.cpButtonLoaded
});
});
const click2payRequest = {
paymentPrefill: function(){
const result = {
merchantRequestId: "Merchant defined request ID",
currencyCode: "USD",
description: "...corp Product",
orderId: "Merchant defined order ID",
promoCode: "Merchant defined promo code",
subtotal: roundTo(getAmount(), 2),
shippingHandling: "2.00",
tax: "2.00",
discount: "1.00",
giftWrap: "2.00",
misc: "1.00",
setTotal: function() {
this.total = roundTo(
roundToNumber(this.subtotal, 2)
+ roundToNumber(this.shippingHandling, 2)
+ roundToNumber(this.tax, 2)
+ roundToNumber(this.giftWrap, 2)
+ roundToNumber(this.misc, 2)
- roundToNumber(this.discount, 2)
, 2);
delete this.setTotal;
return this;
},
}.setTotal();
logDebug({
label: "paymentPrefill",
data: result
});
return result;
},
authorize: function(payload) {
return new Promise(function (resolve, reject) {
var xhr = new XMLHttpRequest();
xhr.open("POST", "https://<your domain>/<path to handle authorization>");
xhr.onload = function () {
if (this.status >= 200 && this.status < 300) {
resolve(xhr.response);
} else {
reject({
status: this.status,
statusText: xhr.statusText
});
}
};
xhr.onerror = function () {
reject({
status: this.status,
statusText: xhr.statusText
});
};
xhr.setRequestHeader("Content-Type", "application/json");
xhr.send(JSON.stringify(payload));
});
},
paymentSuccess: async function(clickToPayResponse) {
return new Promise((resolve, reject) => {
try {
const response = await this.authorize(clickToPayResponse);
console.log(response);
const resp = JSON.parse(response);
if (!resp)
throw "Invalid response: "+ response;
if (resp.xError) {
throw resp;
}
resolve(response);
} catch (err) {
console.error("paymentSuccess error.", JSON.stringify(err));
reject(err);
}
});
},
paymentCallback: function (clickToPayResponse) {
click2payRequest.setPayload(clickToPayResponse);
},
cpButtonLoaded: function(resp) {
if (!resp) return;
if (resp.status === iStatus.success) {
showHide("click2payContainer", true);
} else if (resp.reason) {
console.log(resp.reason);
}
},
setPayload: function (value) {
document.getElementById('c2p-payload').value = JSON.stringify(value, null, 2);
showHide("divC2PPayload", value);
}
};
function showHide(elem, toShow) {
if (typeof(elem) === "string") {
elem = document.getElementById(elem);
}
if (elem) {
toShow ? elem.classList.remove("hidden") : elem.classList.add("hidden");
}
}
function getAmount () {
return roundToNumber(document.getElementById("amount").value || "0", 2);
}
</script>
<style>
body {
margin: 10px;
}
div.main {
width: 350px;
}
.c2p {
display: block;
border: 0;
width: 260px;
margin-bottom: 0;
}
.c2p .txt-signin{
width: 90% !important;
}
input {
border: 1px solid black;
font-size: 14px;
padding: 3px;
width: 250px;
margin-bottom: 12px;
}
.hidden {
display: none;
}
textarea {
border: 1px solid black;
width: 100%;
}
</style>
</head>
<body>
<div class="main">
<form id="payment-form" method="POST">
<input id="amount" name="xAmount" placeholder="Amount" type="number" inputmode="decimal"></input>
<br/>
<div id="click2payContainer" class="c2p hidden">
<br/>
</div>
<br/>
<div id="divC2PPayload" class="hidden">
<label id="lbc2pPayload">Click-To-Pay Payload: </label>
<br />
<textarea id="c2p-payload" rows="10" readonly="true"></textarea>
<br/>
</div>
</form>
</div>
</body> Make sure that the Run Script step is the last step, below other steps (Compile Sources, Embed Frameworks, etc.). You can reposition steps by dragging up and down:
Expand the Run Script step
Delete the Type a script... contents of the input box and add the following command
/usr/libexec/PlistBuddy -c "merge CardknoxPaymentsSDK.framework/Info.plist" "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}"











PE Void When Canceled: Voids the Sola transaction if a NetSuite transaction is voided.
PE Accept ACH: Accept ACH payments with Sola. Note: The merchant account needs to be set up for ACH as well.
PE Allow Undeposited Funds: This allows the system to accept a payment in the Undeposited Funds account. Note: Make sure to change all credit card types to ‘Group with Undeposited Funds’ (Setup > Accounting > Accounting Lists > Card Type > Edit > Account Tab > Group with Undeposited Funds).
PE Void Transaction When Declined: Automatically void the NetSuite transaction If a Sola transaction gets declined or fails.
Note: Only use this setting if the 'PE Require Charge Button' setting is unchecked.
PE Require Charge Button Transaction: does not process if the 'PE PROCESS TRANSACTION' button was not selected. Note: This does not apply to sales orders or transactions in edit mode.
PE Send Record Type ID: Send the record type and ID of the record along with transaction to the gateway as the 'xCustom01' field.
PE Description Field ID: NetSuite Field ID to send along with the transaction to the gateway as the ‘xDescription’ field. If this field is empty, or the field is not found on the form that submits the transaction, the system does not send a description as part of the transaction.
Navigate to Setup > Accounting > Accounting preferences
Void Transactions Using Reversing Journals: Enable this setting.
Perform an Authorize Only transaction (only needed by sales order).
PE Retry Transaction
Try charging the card again.
PE Merchant Account
The name of the merchant account that should be used. It defaults to the first merchant account created.
PE Charge Card
The button that the merchant needs to select for the transaction to process. It should be renamed on the refund form to PE Refund Card.
Make sure that other users in NetSuite have access to the bundle and that the scripts run.
PE Payment Logs need at least Create rights (Role > Permissions > Custom Record).
PE Stored Credit Card needs Edit rights (Role > Permissions > Custom Record).
The default billing and shipping addresses are used if they are set.
If the defaults are not set, the first address is used.
Name
Description
PE Stored Credit Card
The payment method saved with the customer.
PE Credit Card Number
The credit card number.
PE CVV Code
The security code of the credit card.
PE Account Number
The ACH account number (only needed if ACH is enabled).
PE Routing Number
The ACH routing number (only needed if ACH is enabled).
PE Get Authorization
The POS software communicates the intended transaction to Payment Engine.
Payment Engine prompts the user for their card information via the credit card device.
The credit card device transfers transaction data to Payment Engine.
Payment Engine transfers transaction data to the Cardknox gateway.
The Cardknox gateway transfers transaction data to the bank for processing.
The bank communicates the transaction response (approval or decline) to the Cardknox gateway.
The Cardknox gateway communicates the bank’s transaction response to Payment Engine.
Payment Engine communicates the bank's transaction response to the POS software.
Payment Engine → Credit Card Device → Cardknox Gateway → Bank The credit card device plays an active role in the transaction flow, with the transaction passing from Payment Engine, to the device, to the Cardknox Gateway, and then to the bank.
The POS software communicates the intended transaction to Payment Engine.
Payment Engine communicates the intended transaction to the credit card device.
The credit card device prompts the user for their card information.
The credit card device transfers transaction data to the Cardknox gateway.
The Cardknox gateway transfers transaction data to the bank for processing.
The bank communicates the transaction response (approval or decline) to the Cardknox gateway.
The Cardknox gateway communicates the bank’s transaction response to the credit card device.
The credit card device communicates the bank’s transaction response to Payment Engine.
Payment Engine communicates the bank’s transaction response to the POS software.
Payment Engine → Credit Card Device → Bank The transaction flows directly from Payment Engine to the credit card device and then to the bank. As in the first two flows, Sola is still involved in the reporting and integration processes.
The POS software communicates the intended transaction to Payment Engine.
Payment Engine communicates the intended transaction to the credit card device.
The credit card device prompts the user for their card information.
The credit card device transfers transaction data to the bank for processing.
The bank communicates the transaction response (approval or decline) to the credit card device.
The credit card device provides the bank’s transaction response to Payment Engine.
Payment Engine communicates the bank's transaction response to the POS software.
Payment Engine notifies the Sola gateway of the transaction so that the data is recorded in the Merchant’s Sola account.
Supported devices:
All Sola supported devices
Benefits:
Supports all Sola devices
Limitations:
Only supported on Windows
Supported devices:
All Sola supported devices
Benefits:
Supports all Sola devices
Limitations:
Only supported on Windows and Mac (The installation on Mac can be difficult)
Requires the BBPOS application to be installed and needs to run in the background all the time
Supported devices:
ID Tech Augusta and VP8300
Benefits:
Minimal integration
Plug n Play Devices
Limitations:
Supports a limited number of devices
Does not support PIN entry
Augusta does not support tap
The US Only


The .NET Payment Engine SDK provides an easy way for developers to integrate card-present and card-not-present payment processing into their .NET projects. Our SDK is designed with user-friendly payment functions and compatibility with a broad range of payment hardware, removing the need for complicated device integration. With this SDK, you can easily incorporate its advanced payment processing capabilities into your .NET projects, streamlining your payment processing experience.
Download & Run
Download the .
Right-click the file and Run as Administrator.
Enter Software Name
Your SDK files are now downloaded to the specified location. Reference the following DLLs in your project: PaymentEngine, xCore, xCore.Forms, NLog, and Newtonsoft.Json.
(For SDK files with checksum )
This guide explains how to initiate credit card transactions using the Cardknox SDK. Transactions can be processed in-scope or out-of-scope, depending on whether the SDK needs to collect sensitive cardholder information.
Instantiate a new PaymentEngine.xTransaction.Request object. This object will hold all transaction parameters and settings
Before submitting a transaction, you must set the required and optional parameters. These include:
Basic SDK parameters: xKey, xVersion, xSoftwareName, xSoftwareVersion.
Transaction-specific parameters: xCommand, xAmount, xInvoice, etc.
Parameter information is documented in the sections below.
The Cardknox SDK provides two methods for processing transactions:
Out-of-Scope Transactions (ProcessOutOfScope)
Use this method when the SDK must collect sensitive card data directly from the cardholder. The SDK securely captures the information via a pop-up window or a card-present device (e.g., Verifone terminal for swipes, taps, or chip insertions) and submits the transaction to the Cardknox gateway.
In-Scope Transactions (Process)
Use this method when card data is already available in your system or for non-interactive transactions such as voids, refunds, or card-on-file payments. No user input or device interaction is required; the SDK submits the transaction directly to the Cardknox gateway.
After processing, the SDK returns the transaction response data to the calling method. This object contains all transaction details returned by the gateway, including status, approval code, and error messages.
For definitions see
Ensure the Payment Engine DLLs are downloaded and referenced in the project. These include PaymentEngine, xCore, xCore.Forms, NLog, and Newtonsoft.Json.
Ensure that the Payment Engine DLLs architecture (x86, x64, AnyCPU) matches your project build settings.
Ensure that the Payment Engine DLLs .NET version matches your project framework version.
You can set the transactions to use a backup host in case there is an issue with the gateway. See Transaction Specific>ActivateBackupGatewayURL. You can sign up for status updates at
Click to view Transaction Workflows.
Our sample application supports some of the basic transaction workflows; more will be added in the future. The application is intended to show you how our SDK works.
Device Name
Pax devices start with Pax_ and end with .3 (example: Pax_s300.3)
S300 S920 A60 A80 A920 PX5 PX7 D210 D220 A35
Verifone devices start with Verifone_ and end with .4 (example: Verifone_MX915.4)
P400 P200 M400 E285 MX915 MX925 VX805 MX850 MX860 MX870 MX880
VeriFone driver download:
Ingenico ISC and IPP devices start with Ingenico_ and end with .6 (example: Ingenico_iSC480.6)
IPP320 IPP350 ISC250 ISC350
Ingenico ICT and Tetra devices start with Ingenico_ and end with .2 (example: Ingenico_iCT250.2)
ICT250 Desk5000 Move5000
ID TECH devices start with IDTech_ and end with .12 (example: IDTech_VP6300.12)
VP6300 VP6800
USB These settings should match what is set for the device in device manager:
COM Port (default: COM9)
Baud rate (default: 115200)
Parity (default: N)
Data Bits (default: 8)
IP These settings should match what the device is set to.
IP Port
Port (default: pax10009 verifone9001 ingenico9999)
This is currently only supported for the Mx915 and Mx925. You can add xAmount and xTax to the request before “Device_ShowItems“ so the user can see the total amount and tax of their order. This runs on a separate thread within the application.
This is currently only supported on certain VeriFone devices.
This is currently only supported on certain Verifone devices.





When prompted, type: paymentengine
Select SDK Specifications
Choose (Defaults are preselected):
Release Type (Stable/Beta/Alpha)
Program Version
OS Version
.NET Version
Download Location
Click Next.
Download the SDK
Click Start and wait for the files to download.
Click Next once the download is complete.
Click Finish.
Device settings (if using a physical device): EnableDeviceInsertSwipeTap, Device_Set etc.
My app
xSoftwareVersion
Yes
Version number of your software
1.0.0
xAllowDuplicate
No
By default, Sola rejects duplicate transactions within 10 minutes of the original transaction. This command overrides that safeguard.
True/False allowed.
True
RequireAVS
No
Requires the user to enter their street address and ZIP Code (only affects keyed transactions).
True/False allowed.
True
RequireCVV
No
Requires the user to enter CVV (only affects keyed transactions).
True/False allowed.
True
ActivateBackupGatewayURL
No
Set transactions to use the backup host for the next half hour.
ActivateBackupGatewayURL(“x2“) Options are x2 or b1
DeactivateBackupGatewayURL
No
Set transactions to use the regular host going forward
DeactivateBackupGatewayURL()
Settings.EnableOfflineTransactions
No*
Required for offline transactions (cc:encrypt)
Enable offline transactions. Offline transactions are initiated with the cc:encrypt command
True
EnableTipPrompt
No
Prompts the user on the device to add a tip to the transaction. This functionality is only available when the device is enabled. The response to the transaction will include two parameters: "xTip" (the tip amount) and "xAuthAmount" (the final authorized amount on the card, including the tip amount).
True
TipPromptOption
No
To configure the tip percentage options shown to the user when the "EnableTipPrompt" feature is enabled, you can use the "TipPromptOption" setting. You can specify four options, separated by commas. You may include a “c” as one of the options, which allows the user to enter a custom tip amount when selecting that option and/or “0“ to have a “No Tip“ option as well. To enable fixed dollar amounts, include a "$" next to the number for the fixed dollar. For example, if you want to show tip options of 5%, 10%, a fixed $1 tip option, and a custom amount, you can set the "Tip Prompt Option" as "5,10,$1, c". This will present these five options to the user when they are prompted to add a tip to the transaction.
5,10,$1, c
True
Form_Timeout
No
Sets the number of milliseconds that the request should time out after. This should typically be set to at least 2 minutes (120,000) so it does not interrupt a transaction in progress.
120000
Form_BackColor
No
Set form background color
Drawing.Color.Agua
Form_Height
No
Set form height
500
Form_Width
No
Set form width
500
True
ShowMenu_DeviceKeyedEntry
No
Adds the DeviceKeyedEntry option on the form for the cashier to toggle.
True
string MySignature = TransRequest.GetSignatureAndSaveToFile(“Signature.png”);
True
StoredAccount_CustomerPin = “2222”
bool FirmwareUpdateAvailable = TransRequest.Device_FirmwareUpdateAvailable();
Device_UpdateFirmware
No
Update the device Firmware.
Device_UpdateFirmware();
True
EnableKeyedEntry
No
To disable keyed entry, set to False.
True/False allowed.
True
ExitFormOnDeviceError
No
To return control to the calling application after any device error, set to True.
True/False allowed.
True
EnableSilentMode
No
To enable silent mode and prevent the payment screen from showing, set to True.
True/False allowed.
True
EnableAmountConfirmationPrompt
No
Prompts the user to confirm the transaction amount.
True/False allowed.
True
Device_TryShowWelcomeScreen();
Device_PromptForEmail
Prompt the user for their email address.
Device_PromptForEmail();
Device_PromptForPhone_JSON
Prompt the user for their phone number.
Device_PromptForPhone_JSON();
Device_PromptForZip
Prompt the user for their ZIP code.
Device_PromptForZip();
Function
Description
Sample Data
ProcessOutOfScope
Process an out-of-scope transaction
ProcessOutOfScope();
Process
Process an in-scope transaction
Process();
Name
Required
Description
Sample Data
xKey
Yes
Sola account key
SolaSupport_Test
xVersion
Yes
Gateway version
4.5.8
xSoftwareName
Yes
Name
Required
Description
Sample Data
xCommand
Yes
Sola transaction type
cc:Sale
xAmount
Yes
Total amount of the transaction, including tax and tip, if applicable.
3.0
xTax
No
Name
Required
Description
Sample Data
ExitFormIfApproved
No
Returns control to the calling application if the transaction is approved.
True/False allowed.
True
ExitFormIfNotApproved
No
Returns control to the calling application if the transaction is not approved.
True/False allowed.
True
ExitFormOnDeviceError
No
Name
Required
Description
Sample Data
EnableDeviceInsertSwipeTap
No
Enables the use of a credit card device for card-present transactions.
True/False allowed.
True
Device_Set
No*
Required if EnableDeviceInsertSwipeTap is set to True.
Sets specific device parameters.
Device_Set(“Verifone_Mx915.4”, “COM11”, “115200”, “N”, “8”); IP: “Verifone_Mx915.4”, “10.166.110.101”, “9001”
EnableDeviceKeyedEntry
No
Cancel()
Cancel ongoing function
Cancel("Transaction canceled")
Name
Description
Sample Data
EnableDeviceSignature
Prompt for signature after the transaction is approved.
True/False allowed.
True
EnableDeviceSignature_MinAmount
Prompt for signature only if xAmount is greater than the amount set here.
EnableDeviceSignature must be set.
5
GetSignature
Manually prompts for signature post transaction.
string MySignature = TransRequest.GetSignature();
GetSignatureAndSaveToFile
Name
Required
Description
Sample Data
Settings.Printer_Name
No
Sends the transaction receipt to the printer.
Adobe PDF
Settings.Receipt_Merchant_Disabled
No
To disable the merchant receipt, set this to True.
True/False allowed.
True
Settings.Receipt_Customer_Disabled
No
Name
Required
Description
Sample Data
EnableStoredAccount
No
Enables the stored account option.
Card number and expiration date are required, and a token can also be used.
True/False allowed.
True
StoredAccount_Message
No*
Required if EnableStoredAccount is set to True.
Displays the message to show on the form for the user to select the stored account.
StoredAccount_Message = “Alt + &W – Use Stored Card {1}”;
StoredAccount_CustomerPin
No
Name
Description
Sample Data
UpdateItems
Specify the items to show during the transaction (JSON or XML).
TransRequest.UpdateItems(“json”, “[{‘xdescription’:’ItemABC’,’xupc’:558,’xqty’:3,’xunit’:’EA’,’xunitprice’:’5.99′}]”);
Device_ShowItems
Show the items that were specified in “UpdateItems”.
TransRequest.Device_ShowItems();
Name
Required
Description
Sample Data
Device_OsUpdateAvailable
No
Checks if there is an available device OS update.
bool OsUpdateAvailable = TransRequest.Device_OsUpdateAvailable();
Device_UpdateOS
No
Update the device OS.
Device_UpdateOS();
Device_FirmwareUpdateAvailable
No
Name
Required
Description
Sample Data
EnableMultipleKeys
No
Enable multiple keys on a computer so that Initialization will not be required when switching keys.
True/False allowed.
True
EnableCashback
No
Prompts the user if they want cash back.
True/False allowed.
True
ShowKeyPad
No
Name
Description
Sample Data
Device_ShowMessage
Show form with message of up to 4 lines. An exception will be thrown if the device does not support it.
Device_ShowMessage(“Hello” ,”Welcome”,”Sola”,”Thank you!”);
Device_TryShowMessage
Show form with message of up to 4 lines. This returns a boolean indicating if it was successful or not.
Device_TryShowMessage(“Hello” ,”Welcome”,”Sola”,”Thank you!”);
Device_ShowWelcomeScreen
Show the welcome screen on the device. An exception will be thrown if the device does not support it.
Device_ShowWelcomeScreen();
Device_TryShowWelcomeScreen
Name of your software
Tax amount of the transaction. The xTax amount is included in the xAmount.
Returns control to the calling application after any device error.
True/False allowed.
Allows the user to key in their card number on the credit card device. EnableDeviceInsertSwipeTap cannot be set to True in the same request.
Manually prompts for signature post transaction and saves it to a file. You can pass through a string to display a message when prompting.
To disable the customer receipt, set this to True.
True/False allowed.
Asks the user for their account PIN.
The PIN will be whatever value is set here.
Checks if there is an available device Firmware update.
If the merchant’s system is touch enabled, set to True to display an on-screen keypad.
True/False allowed.
Show the welcome screen on the device. This returns a boolean indicating if it was successful or not.


This document references all the features and an Android integration guide for Sola Tap to Pay.
We’ll cover:
Tap to Pay Application Overview
How do you install the Tap to Pay application on your Android device?
How to integrate a third-party merchant application with the Sola Tap to Pay application
This document is for Android developers looking to integrate the Sola Tap to Pay Helper application into their existing Android mobile app or web application.
Tap to Pay allows merchants to accept payments using their mobile devices without an external terminal. Tap to Pay is a service application that will work only if the transaction is requested from other third-party merchant applications.
It offers deep link identities to third-party merchant applications to seamlessly integrate to fulfill their payment needs.
Requirements:
Operating system of Android OS 10(Q) or later
An Android device with NFC capabilities
An Android device that is not rooted
Android Device Settings:
Enable the Tap to Pay Feature:
Open the Sola .
Navigate to Settings -> Device Configuration
Select Tap to Pay.
Download the Tap to Pay Helper application from the .
The deep linking feature allows a third-party application to use a predefined URL to open up the pre-installed Tap to Pay Helper mobile application to process a payment transaction.
The Tap to Pay Helper app will use the “xRedirectUrl” parameter to deliver the transaction results to the third-party application. Results are provided as query parameters, appended onto the value provided by the xRedirectUrl parameter.
The Tap to Pay Helper application's predefined URL is:
cardknox://tap.cardknox.com/transaction
Tap to Pay Helper mobile application supports three (3) different transaction workflows.
Encrypted Payload – The third-party application will request the encrypted payload from the Tap to Pay helper application. To complete the transaction, send the server-side payload and other returned data to the Sola API. (see server-side transaction example)
Single Use Token (SUT) – The merchant application will request a “Single Use Token” instead of the encrypted payload from the Tap to Pay helper application. Then, send the SUT and other returned data to the Sola API to complete the transaction.
Complete Transaction – With this workflow, the Tap to Pay helper application processes the complete transaction and returns the gateway response to the third-party application.
Two types of parameters are supported by the Tap to Pay helper application.
Transaction API Specific – Use any Sola API parameters in the deep-link request. . However, the below API parameters must be carefully designed to achieve the desired transaction result using the Tap to Pay helper.
Tap to Pay Development/Debugging Parameters – These are defined to troubleshoot issues quickly during the development phase.
The following is the list of Tap to Pay specific parameters that can be passed, along with the BBPOS Specific parameters, by the third-party merchant application in the deep link query string.
All ‘debugging’ parameters are optional.
Third-party merchant app developers can form URLs based on different transaction needs. Tap to Pay helper app will not cache any third-party request in the mobile application storage, and it's entirely driven by the transaction request passed through the deep link request.
Example of a deep link URL:
cardknox://tap.cardknox.com/transaction?xRedirectURL=mechant://pos.merchant.com/&xKey=XXXXXW23243HHDFJ&xEmail[email protected]&xAmount=12.00&xTip=1.0&xCommand=cc:sale&
Note that the above URL is corresponding to the “Complete Transaction” workflow since xKey is provided
Example of a deep link request, corresponding to the transaction response:
mechant://pos.merchant.com?xResult=D&xStatus=Declined&xError=Invalid%20Chip&xRefNum=102304545&xErrorCode=2034
The below response parameters and their explanations in the context of Tap to Pay helper.
You can refer to the for other response parameter definitions.
When running the server-side call to Sola, you must use the standard required API parameters. Reference the for a list of parameters.
Additionally, the following parameters are required:
Once the deep link URL is formed, you can create an intent using the formed deep link URL and start the activity using the intent.
Thus Tap to Pay Helper application will be launched and start the workflow. Once the requested operations are complete, the result will be returned using the xRedirectUrl as well.
Here’s an example snippet of code to invoke the creation:
Let's define a helper object with all necessary components:
Object with necessary properties to initialize Google Pay:
For more information please refer to object
Google Pay iField:
Let’s enable Google Pay for the website:
document.addEventListener("DOMContentLoaded", function(event) {
.....
ckGooglePay.enableGooglePay({amountField: 'amount'});
.....
}For more information please refer to Google Pay Control Object
To see the full solution please click here.
function initGP() {
return {
merchantInfo: gpRequest.merchantInfo,
buttonOptions: gpRequest.buttonOptions,
onGetTransactionInfo: "gpRequest.onGetTransactionInfo",
environment: gpRequest.environment,
billingParameters: gpRequest.billingParams,
shippingParameters: {
emailRequired: gpRequest.shippingParams.emailRequired,
onGetShippingCosts: "gpRequest.shippingParams.onGetShippingCosts",
onGetShippingOptions: "gpRequest.shippingParams.onGetShippingOptions"
},
onBeforeProcessPayment: "gpRequest.onBeforeProcessPayment",
onProcessPayment: "gpRequest.onProcessPayment",
onPaymentCanceled: "gpRequest.onPaymentCanceled",
onGPButtonLoaded: "gpButtonLoaded"
};
}window.gpRequest = {
environment: GPEnvironment.test,
merchantInfo: {
merchantName: "Example Merchant"
},
buttonOptions: {
buttonSizeMode: GPButtonSizeMode.fill
},
billingParams: {
billingAddressRequired: true,
billingAddressFormat: GPBillingAddressFormat.full
},
shippingParams: {
emailRequired: true,
onGetShippingCosts: function (shippingData) {
logDebug({
label: "onGetShippingCosts",
data: shippingData
});
return {
"shipping-001": "0.00",
"shipping-002": "1.99",
"shipping-003": "10.00"
}
},
onGetShippingOptions: function (shippingData) {
logDebug({
label: "onGetShippingOptions",
data: shippingData
});
let selectedOptionid = "shipping-001";
if (shippingData && shippingData.shippingOptionData && shippingData.shippingOptionData.id !== "shipping_option_unselected") {
selectedOptionid = shippingData.shippingOptionData.id;
}
return {
defaultSelectedOptionId: selectedOptionid,
shippingOptions: [
{
"id": "shipping-001",
"label": "Free: Standard shipping",
"description": "Free Shipping delivered in 5 business days."
},
{
"id": "shipping-002",
"label": "$1.99: Standard shipping",
"description": "Standard shipping delivered in 3 business days."
},
{
"id": "shipping-003",
"label": "$10: Express shipping",
"description": "Express shipping delivered in 1 business day."
},
]
};
}
},
onGetTransactionInfo: function () {
let amt = getAmount();
return {
displayItems: [
{
label: "Subtotal",
type: "SUBTOTAL",
price: amt.toString(),
},
{
label: "Tax",
type: "TAX",
price: (0.1 * amt).toString(),
}
],
countryCode: 'US',
currencyCode: "USD",
totalPriceStatus: "FINAL",
totalPrice: (1.1 * amt).toString(),
totalPriceLabel: "Total"
}
},
onBeforeProcessPayment: function () {
return new Promise(function (resolve, reject) {
try {
//Do some validation here
resolve(iStatus.success);
} catch (err) {
reject(err);
}
});
},
onProcessPayment: function (paymentResponse) {
return new Promise(function (resolve, reject) {
try {
// show returned data in developer console for debugging
console.log("paymentResponse", JSON.stringify(paymentResponse));
paymentToken = paymentResponse.paymentData.paymentMethodData.tokenizationData.token;
console.log("paymentToken", paymentToken);
const amt = (paymentResponse && paymentResponse.transactionInfo && paymentResponse.transactionInfo.totalPrice) || 0;
try {
if (amt <= 0) {
throw "Payment is not authorized. Invalid amount. Amount must be greater than 0";
}
authorizeGPay(paymentResponse)
.then((resp) => {
gpRequest.handleResponse(resp);
setGPPayload(JSON.stringify(paymentResponse, null, 2));
resolve(resp);
})
.catch((rej) => {
console.error("Payment is not authorized", JSON.stringify(rej));
setGPPayload("");
setTimeout(function () { alert("Payment is not authorized. Please check the logs") }, 500);
reject(rej);
});
} catch (err) {
const emsg = JSON.stringify(err);
console.error(emsg);
setTimeout(function () { alert(emsg) }, 500);
reject({error: err});
}
} catch (err) {
reject(err);
}
});
},
onPaymentCanceled: function(respCanceled) {
setTimeout(function () { alert("Payment was canceled") }, 500);
},
handleResponse: function (resp) {
const respObj = JSON.parse(resp);
if (respObj) {
if (respObj.xError) {
setTimeout(function () { alert(`There was a problem with your order (${respObj.xRefNum})!`) }, 500);
} else
setTimeout(function () { alert(`Thank you for your order (${respObj.xRefNum})!`) }, 500);
}
},
};<style>
......
iframe {
border: 0 solid black;
width: 600px;
height: 28px;
padding: 0px;
margin-bottom: 5px;
}
iframe.gp {
display: block;
border: 0;
width: 250px;
height: 45px;
padding: 0px;
margin: 0px;
}
.hidden {
display: none;
}
.....
</style>
<body>
<form id="payment-form" method="POST">
.....
<input id="amountId" name="xAmount" placeholder="Amount"></input>
.....
<iframe id="igp" class="gp hidden" data-ifields-id="igp" data-ifields-oninit="initGP" src="igp.htm"
allowpaymentrequest
sandbox="allow-popups allow-modals allow-scripts allow-same-origin"
title="GPay checkout page">
</iframe>
.....
</form>
</body> Enable NFC and Contactless Payments settings
Disable Developer Options and USB Debugging settings
Enable “Tap to Pay” within the Device Configuration settings within the Sola Mobile App
Install the Tap to Pay Helper App:
When prompted, install the Tap to Pay Helper app.
Activate Tap to Pay:
Once the Tap to Pay helper app is installed, return to the Sola App and enable Tap to Pay.
=True&useSTG=True&xAllowPartialAuth=trueParameters
Required
Possible Values
Description
xCommand
Yes
cc:encrypt
If you send the xCommand value as cc:encrypt, the Tap to Pay helper will use the ‘Encrypted Payload’ workflow and return the encrypted payload in the transaction response.
xRedirectURL
Yes
A valid URL scheme defined inside the third-party application to receive transaction responses from the ‘Tap to Pay’ helper application
Parameters
Required
Possible Values
Description
xCommand
Yes
cc:singleusetoken
If you send the xCommand value as cc:singleusetoken, the Tap to Pay helper will use the “Single Use Token (SUT)” workflow and return the SUT in the transaction response.
xRedirectURL
Yes
A valid URL scheme defined inside the third-party application to receive transaction responses from the ‘Tap to Pay’ helper application
Parameters
Required
Possible Values
Description
xCommand
Yes
cc:sale, cc:save, cc:authonly, cc:credit
Sola transaction type
xKey
Yes
Your Sola API key
xRedirectURL
Yes
A valid URL scheme defined inside the third-party application to receive transaction responses from the ‘Tap to Pay’ helper application
Parameter
Description
xRedirectURL
A valid URL scheme defined inside the third-party application to receive transaction responses from the ‘Tap to Pay’ helper application
xCommand
This parameter is utilized to indicate the specific type of transaction that needs to be executed (cc:sale, cc:refund, cc:void, etc.).
One caveat is that this must be defined as cc:encrypt for the ‘Encrypted Payload’ workflow or cc:singleusetoken for the ‘Single-Use-Token’ workflow.
For the ‘Complete Transaction’ workflow, you can pass the usual Sola-specific xCommand values.
Parameter
Description
Possible Values
Default Value
debug
Set to TRUE to display logs in the Tap to Pay helper application.
TRUE/FALSE
FALSE
useSTG
This enables a staging gateway environment. Applicable only for ‘Complete Transaction’ workflow.
TRUE/FALSE
FALSE
doNotRedirect
Disables the redirect URL and displays the results/logs within the Tap to Pay helper app.
TRUE/FALSE
FALSE
Parameter
Description
xEncryptedPayload
This will contain the encrypted payload or single-use token if the transaction workflow is requested as an ‘encrypted payload’ or ‘single-use token’.
xSerialNumber
This will contain the rock value, that’s needed to perform the gateway request when the workflow is requested as ‘Encrypted Payload’ or ‘Single-Use-Token’.
xStatus
This will be a success or error when the workflow is requested as ‘Encrypted payload’ or ‘Single-Use-Token’. Containing the standard Sola gateway response values.
xCommand
Parameter
Description
Example
xSerialNumber
The serial number value returned from the payload.
alP4n4-_92UPrgVI
xMobileTapType
Must equal to ‘TapToPhoneApp’
TapToPhoneApp
xEMVData
Pass the value of the returned encrypted payload (xEncryptedPayload).
AAABBgAAABgAAAAAAAABHgAAAIYAAAEeAQAAAAH_htzImhOJfEQlhxhrJsYZttThXPsWFZgUTYwxmxqaxdOXYnCvfoATExUgJb…
Use: iStatus.success
Use: c2pEnvironment.sandbox
Use: c2pReviewAction.pay
The Main object that contains all the information necessary to communicate with Click-To-Pay API.
Name
Type
Required
Description
environment
Yes
Can be either
c2pEnvironment.sandbox or
c2pEnvironment.production
externalClientId
String
Yes
ID assigned to your merchant by Click-To-Pay Registration
click2payContainer
Name
Type
Description
status
There are be 3 possible cases:
Click-To-Pay Button loaded successfully: status = iStatus.success
An error occurred while loading Click-To-Pay Button: status = iStatus.error
reason
String
If Click-To-Pay Button failed to load this field will be populated with the reason.
Server Endpoint Creation
API Integration
Client-Side Integration
Adding Reference to iFields
Adding iFrame and JavaScript objects for the Google Pay button
Enabling Google Pay
A server endpoint is needed in order to accept the Google Payload from Hosted Checkout.
Step 1: Create an endpoint and method for API Integration on your server side that takes the Google Payload and makes a call to Sola.
Below are the steps to integrate Google Pay with the Sola API:
Once the consumer confirms the payment, Google Pay API generates a token in the form of a JSON string.
Integration Steps:
Encode that token with Base64 encoding.
Set xCardNum field to the encoded token above.
Set xDigitalWalletType to GooglePay.
Set the remaining required fields:
xAmount to transactionInfo.totalPrice - this is the consumer-approved amount from the Google Pay payment sheet.
xCommand - Set to one of the values that start with cc: like cc:sale, cc:auth
For more details, please contact your Sola Representative.
Step 1: Add the iFields .js file after the <head> tag on your payment page:
Step 1: Add the following iFrame JS snippet inside the <body> where the Google Pay button is desired.
Make sure you have an attribute data-ifields-id="igp" as part of <iframe> tag
Make sure you have an attribute data-ifields-oninit="gpRequest.initGP" as part of <iframe> tag where “gpRequest.initGP“ is a function name that initializes a Google Pay Object
Step 2: Create JavaScript object that holds all of the properties/methods required to process Google Pay.
Step 3: Implement desired callbacks.
For the list of available callbacks, please refer to Google Pay Object.
The two main functions below need to be implemented (the rest are optional):
onGetTransactionInfo: calculates the total amount based on the charge amount, fees, taxes, shipping costs, etc.
onProcessPayment - a callback that will be called after the consumer pays and Google returns a token with all other requested consumer information like billing address, shipping address, etc. This is where you need to make an ajax call to your server with the Google Payload. The sample for making an ajax call please see below.
Sample Code for making Ajax Call:
Step 4: Create JavaScript function that will initialize iFields.
Make sure that the iFrame attributedata-ifields-oninit has the name of this function.
The initGP() function above returns Google Pay Object.
window.ckGooglePay object - controls initialization of Google Pay button.
Method
Call Required
Description
enableGooglePay
Yes
Initializes and enables Google Pay Button. Takes object
updateAmount
Conditional
Updates amount on Google Sheet.
You can provide either All, One or None of the parameters for enableGooglePay call.
amountField specified - in this case, the Google Pay total amount will be automatically updated whenever the amount has changed.
amountField is not specified - in this case, it’s up to you to provide the correct amount for Google Pay. One of the ways to do it is to call window.ckGooglePay.updateAmount manually.
iframeField specified - this value will be used to communicate, with Google Pay button.
This option is especially helpful for Angular clients using shadow DOM.
iframeField is not specified - its value will be calculated based on data-ifields-id attribute.
In this case, it must be set to “igp“: data-ifields-id="igp".
Name
Type
Required
Description
amountField
String|Object
No
Field containing amount.
Could be either the name of the field (String) or the
field itself (Object)
iframeField
String|Object
No
Field containing iFrame with Google Pay button. Could be either the name of the field (String) or the field itself (Object)
ckGooglePay.enableGooglePay({amountField: 'amount'});
Check out the Google Pay FAQ page here.
For additional questions, contact [email protected]
Contents
Set up Apple Pay Merchant ID
Sola supports two solutions to help you set up your Apple Pay Merchant ID:
- A simple solution where Sola handles all communications with Apple and takes care of all certificates.
- in this case it will be your responsibility for mainlining account, domain and certificates up to date with Apple.
Step 1: Add the iFields.js file after the <head> tag on your payment page:
Step 1: Add the following JS snippet inside the <body> where the Apple Pay button is desired.
Step 2: Create JavaScript object that holds all of the properties/methods required to process Apple Pay.
Step 3: Implement desired callbacks.
For the list of available callbacks, please refer to .
There are three main callbacks that must be implemented (the rest are optional):
onGetTransactionInfo - calculates the total amount based on the charge amount, fees, taxes, shipping costs, etc.
onValidateMerchant - a callback to be called to validate the Apple Pay Merchant.
Sample Code for Making Ajax Call:
Step 4: Create JavaScript function that will initialize iFields.
initAP function above returns .
window.ckApplePay object - controls initialization of Apple Pay button
A server endpoint is needed in order to accept the Apple Payload from Hosted Checkout.
Step 1: Create an endpoint and method for API Integration on your server side that takes an object containing total transaction amount and and makes a call to Sola. Sample Object:
Below are the steps to integrate Apple Pay with the Sola API:
Once the consumer confirms the payment, Apple Pay API generates an in the form of a JSON string.
Integration Steps:
Extract the paymentData from the payload.
Encode it with Base64 encoding.
Set xCardNum field to the encoded value above.
Set
Sample Request:
For more details, please contact your Sola Representative.
Contact
The Sola solution for browser-based POS systems (BBPOS) is a tray application that runs in the background of your computer. It acts as a local server, allowing a POS application operating out of a browser to accept chip-based EMV (Europay, MasterCard, Visa) payments while remaining out of PCI scope. Our BBPOS solution supports all major terminals including PAX, Verifone, and, Ingenico, and ID TECH. See for a full list of our supported devices.
{
"xKey": "dxxxcaxaxfxxfxxxxxxdxxcxcxfaax",
"xCommand": "cc:sale",
"xVersion": "4.5.9",
"xSoftwareVersion": "1.0.12",
"xAmount": "1.08",
"xSoftwareName": "My Application ",
"xEMVdata": "AAABBgAAABgAAAAAAAABHgAAAIYAAAEeAQAAAAH_htzImhOJfEQlhxhrJsYZttThXPsWFZgUTYwxmjxPBLLhkxwPcVZACZGDIntDDasmtAxxBWxxn_eAxlUbNxxAxxWtR",
"xSerialNumber": "alN4n4-_92UPrgVI",
"xMobileTapType": "TapToPhoneApp"
}Uri myAction = Uri.parse(deepLinkUrl);
// deepLinkUrl must be a string variable holding the deep link URL with all required parameters.
Intent intent = new Intent (Intent.ACTION_VIEW);
intent.setData (myAction);
startActivity(intent);const iStatus = {
success: 100,
unsupported: -100,
error: -200
}const c2pEnvironment = {
sandbox: 0,
production: 1
}const c2pReviewAction = {
pay: "PAY",
continue: "CONTINUE"
}onCPButtonLoaded: function(resp) {
if (!resp) return;
if (resp.status === iStatus.success) {
showHide("click2payContainer", true);
} else if (resp.reason) {
console.log(resp.reason);
}
}onPaymentPrefill: function(){
const result = {
merchantRequestId: "Merchant defined request ID",
currencyCode: "USD",
description: "...corp Product",
orderId: "Merchant defined order ID",
promoCode: "Merchant defined promo code",
subtotal: roundTo(getAmount(), 2),
shippingHandling: "2.00",
tax: "2.00",
discount: "1.00",
giftWrap: "2.00",
misc: "1.00",
setTotal: function() {
this.total = roundTo(
roundToNumber(this.subtotal, 2)
+ roundToNumber(this.shippingHandling, 2)
+ roundToNumber(this.tax, 2)
+ roundToNumber(this.giftWrap, 2)
+ roundToNumber(this.misc, 2)
- roundToNumber(this.discount, 2)
, 2);
delete this.setTotal;
return this;
}
}.setTotal();
return result;
}onPaymentValidate: function () {
return new Promise(function (resolve, reject) {
try {
//Do some validation here
resolve(iStatus.success);
} catch (err) {
reject(err);
}
});
}onPaymentSuccess: async function(clickToPayResponse) {
return new Promise((resolve, reject) => {
try {
const response = await this.authorize(clickToPayResponse);
console.log(response);
const resp = JSON.parse(response);
if (!resp)
throw "Invalid response: "+ response;
if (resp.xError) {
throw resp;
}
resolve(response);
} catch (err) {
console.error("paymentSuccess error.", JSON.stringify(err));
reject(err);
}
});
}onPaymentCancel: function (payload) {
logError("Click-To-Pay Cancelled", payload);
//Do some custom logic here
}onPaymentCancel: function (payload) {
logError("Click-To-Pay Error", payload);
//Do some custom logic here
}<script src=https://cdn.cardknox.com/ifields/**ifields-version-number**/ifields.min.js></script><iframe id="igp" class="gp hidden"
data-ifields-id="igp" data-ifields-oninit="gpRequest.initGP"
src=https://cdn.cardknox.com/ifields/**ifields-version-number**/igp.htm
allowpaymentrequest sandbox="allow-popups allow-modals allow-scripts allow-same-origin
allow-forms allow-popups-to-escape-sandbox allow-top-navigation">
</iframe>window.gpRequest = {
merchantInfo: {
merchantName: "Example Merchant"
},
buttonOptions: {
buttonSizeMode: GPButtonSizeMode.fill
},
billingParams: {
//phoneNumberRequired: true,
emailRequired: true,
billingAddressRequired: true,
billingAddressFormat: GPBillingAddressFormat.full
}}initGP: function authorizeGPay(googlePayload) {
return new Promise(function (resolve, reject) {
var xhr = new XMLHttpRequest();
xhr.open("POST", https://yourserver.com/your-endpoint);
xhr.onload = function () {
if (this.status >= 200 && this.status < 300) {
resolve(xhr.response);
} else {
reject({
status: this.status,
statusText: xhr.statusText
});
}
};
xhr.onerror = function () {
reject({
status: this.status,
statusText: xhr.statusText
});
};
xhr.setRequestHeader("Content-Type", "application/json");
xhr.send(JSON.stringify(googlePayload));
});
}function initGP() {
return {
merchantInfo: gpRequest.merchantInfo,
buttonOptions: gpRequest.buttonOptions,
onGetTransactionInfo: "gpRequest.onGetTransactionInfo",
environment: gpRequest.environment,
billingParameters: gpRequest.billingParams,
shippingParameters: {
emailRequired: gpRequest.shippingParams.emailRequired,
onGetShippingCosts: "gpRequest.shippingParams.onGetShippingCosts",
onGetShippingOptions: "gpRequest.shippingParams.onGetShippingOptions"
},
onBeforeProcessPayment: "gpRequest.onBeforeProcessPayment",
onProcessPayment: "gpRequest.onProcessPayment",
onPaymentCanceled: "gpRequest.onPaymentCanceled",
onGPButtonLoaded: "gpButtonLoaded"
};
}String
Yes
ID of the main div that will host the Click-To-Pay experience
mainCssClass
String
No
Default: c2p-def
To override default styling, use
this field to provide the name of your
own css class
displayWaitScreenAfterCheckout
Boolean
No
Default: true
After checkout Click-To-Pay control
will be automatically reloaded.
This controls if “Wait“ screen is set
during that operation
reviewAction
No
Default: c2pReviewAction.pay
Controls final Button caption
consumer clicks to make the payment
onButtonLoaded
Function
No
A callback function to be called when Click-To-Pay button is loaded. Accepts an object of type CPButtonLoadedResult Please click here for the sample code
onPaymentPrefill
Function
Yes
A callback function that returns the final price and tax calculations. Please click here for the sample code
onPaymentValidate
Function
No
A callback function to be called before Payment is made. Usually used to make custom validations before the payment. Please click here for the sample code
onPaymentSuccess
Function
Yes
A callback function to be called when Click-To-Pay Payment is authorized for the completion of the transaction. This function accepts a parameter of ClickToPayResponse. Please click here for the sample code
onPaymentCancel
Function
No
A callback function to be called when user cancels. Please click here for the sample code
onPaymentError
Function
No
A callback function to be called when payment errors out. Please click here for the sample code
xBillFirstName
xBillLastName
xBillStreet if available
xBillCity if available
xBillState if available
xBillZip
amountField is not specified - in this case, it’s up to you to provide the correct amount for Apple Pay. One of the ways to do it is to call window.ckApplePay.updateAmount manually.
xDigitalWalletTypeSet the remaining required fields:
xAmount the Transaction Amount.
xCommand - Set to one of the values that starts with cc: like cc:sale, cc:auth, etc.
xBillFirstName
xBillLastName
xBillStreet
xBillCity
xBillState
xBillZip
Method
Call Required
Description
enableApplePay
Yes
Initializes and enables Apple Pay Button. Takes EnableApplePayParams object.
updateAmount
Conditional
Updates amount on Apple Sheet.
Name
Type
Required
Description
initFunction
String|Object
Yes
Either function name or function itself to initialize Apple Pay
amountField
String|Object
No
Field containing amount. Could be either the name of the field (String) or the field itself (Object)
<script src=https://cdn.cardknox.com/ifields/**ifields-version-number**/ifields.min.js></script><div id="ap-container">
</div>window.apRequest = {
buttonOptions: {
buttonContainer: "ap-container",
buttonColor: APButtonColor.black,
buttonType: APButtonType.pay
},
..............
initAP: function() {
return {
buttonOptions: this.buttonOptions,
merchantIdentifier: "<Your Apple Merchant Identifier provided by Cardknox>",
requiredBillingContactFields: ['postalAddress', 'name', 'phone', 'email'],
requiredShippingContactFields: ['postalAddress', 'name', 'phone', 'email'],
onGetTransactionInfo: "apRequest.onGetTransactionInfo",
onValidateMerchant: "apRequest.onValidateMerchant",
onPaymentAuthorize: "apRequest.onPaymentAuthorize",
onPaymentComplete: "apRequest.onPaymentComplete",
onAPButtonLoaded: "apRequest.apButtonLoaded",
isDebug: true
};
}
}validateApplePayMerchant: function (url) {
return new Promise(function (resolve, reject) {
try {
var xhr = new XMLHttpRequest();
xhr.open('POST', "https://api.cardknox.com/applepay/validate");
xhr.onload = function () {
if (this.status >= 200 && this.status < 300) {
resolve(xhr.response);
} else {
reject({
status: this.status,
statusText: xhr.response
});
}
};
xhr.onerror = function () {
reject({
status: this.status,
statusText: xhr.statusText
});
};
xhr.setRequestHeader("Content-Type", "application/json");
xhr.send(JSON.stringify({ validationUrl: url}));
} catch (err) {
setTimeout(function () { alert("getApplePaySession error: " + exMsg(err)) }, 100);
}
});
},
authorize: function(applePayload, totalAmount) {
return new Promise(function (resolve, reject) {
var xhr = new XMLHttpRequest();
xhr.open("POST", "https://<your domain>/<path to handle authorization>");
xhr.onload = function () {
if (this.status >= 200 && this.status < 300) {
resolve(xhr.response);
} else {
reject({
status: this.status,
statusText: xhr.statusText
});
}
};
xhr.onerror = function () {
reject({
status: this.status,
statusText: xhr.statusText
});
};
const data = {
amount: totalAmount,
payload: applePayload
};
xhr.setRequestHeader("Content-Type", "application/json");
xhr.send(JSON.stringify(data));
});
}initAP: function() {
return {
buttonOptions: this.buttonOptions,
merchantIdentifier: "merchant.cardknoxdev.com",
requiredBillingContactFields: ['postalAddress', 'name', 'phone', 'email'],
requiredShippingContactFields: ['postalAddress', 'name', 'phone', 'email'],
onGetTransactionInfo: "apRequest.onGetTransactionInfo",
onGetShippingMethods: "apRequest.onGetShippingMethods",
onShippingContactSelected: "apRequest.onShippingContactSelected",
onShippingMethodSelected: "apRequest.onShippingMethodSelected",
onPaymentMethodSelected: "apRequest.onPaymentMethodSelected",
onValidateMerchant: "apRequest.onValidateMerchant",
onPaymentAuthorize: "apRequest.onPaymentAuthorize",
onPaymentComplete: "apRequest.onPaymentComplete",
onAPButtonLoaded: "apRequest.apButtonLoaded",
isDebug: true
};
}ckApplePay.enableApplePay({
initFunction: 'apRequest.initAP',
amountField: 'amount'
});const req = {
amount: 1.45,
payload: <Payload from Apple Response>
}public async Task<IActionResult> Authorize(AuthorizeRequest req)
{
var reqGateway = new
{
xKey = "Your xKey",
xAmount = (decimal)req.amount,
xCommand = "cc:sale",
xVersion = "4.5.4",
xSoftwareName= "Your Software Name",
xSoftwareVersion = "Your Software Version",
xBillFirstName = req.paymentResponse.billingContact.givenName,
xBillLastName = req.paymentResponse.billingContact.familyName,
xBillStreet = req.paymentResponse.billingContact.addressLines[0],
xBillCity = req.paymentResponse.billingContact.locality,
xBillState = req.paymentResponse.billingContact.administrativeArea,
xBillZip = req.paymentResponse.billingContact.postalCode,
xShipFirstName = req.paymentResponse.shippingContact.givenName,
xShipLastName = req.paymentResponse.shippingContact.familyName,
xShipStreet = req.paymentResponse.shippingContact.addressLines[0],
xShipCity = req.paymentResponse.shippingContact.locality,
xShipState = req.paymentResponse.shippingContact.administrativeArea,
xShipZip = req.paymentResponse.shippingContact.postalCode,
xdigitalwallettype = "applepay",
xcardnum = Convert.ToBase64String(Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(req.payload.token.paymentData)))
};
var respMsg = "";
using (var http = new HttpClient())
{
var resp = await http.PostAsJsonAsync("https://x1.cardknox.com/gatewayJSON", reqGateway);
respMsg = await resp.Content.ReadAsStringAsync();
.....
}
.....
} To configure the BBPOS application:
Download and install Sola BBPOS (PaymentEngineExt) from the provided link. BBPOS download
Follow the installation prompts.
When asked for the "Software name," enter "BBPOS."
Provide your Sola key when prompted.
BBPOS will now run in the background and can be found in the system tray
The POS sends an HTTP POST request containing transaction information, such as the transaction amount, to the local host https://localemv.com:8887. Note: Transaction details should be in URL encoded Key-Value Pairs (KVP).
Our BBPOS application receives the request and communicates with either the terminal or a pop-up window on the screen.
The customer inserts their credit card into the terminal or keys the card number into the pop-up window.
The transaction data is transmitted to the Sola gateway for authorization.
When the transaction is complete, our BBPOS application sends back the transaction authorization details to your browser in the HTTP response through a redirect URL or AJAX. Transaction results are returned in the HTTP response in KVP format unless otherwise using xResponseFormat. See the Transaction Settings Table for more information.
To cancel a currently processing transaction, send xCancel=1 to host .
You can find available and required commands and parameters at . See the Custom Device Commands Table for BBPOS specific commands.
The transaction can be redirected to a URL specified in xRedirectURL. See the Transaction Settings Table for more information.
Go to for a sample implementation using a redirect.
Go to for a sample implementation using AJAX.
You can configure transaction setting in the application setting file (right-click on Payment Engine in the system tray and choose options), or in a transaction request. In the case of a conflict, settings that are applied in the transaction request will override settings applied in the setting file. Use 1 and 0 for Boolean variables.
Settings File Name
Transaction Request Name
Parameter Description
xKey
xKey
Sola API key
DeviceName
xDeviceName
Name of device (see list of device names )
DeviceCOMPort
xDeviceComPort
USB COM port assigned to device
DeviceBaud
These commands can be used to transport custom data to or from the device. They should be sent in the xCommand variable. These are standalone commands and are not used during a transaction. Appropriate device variables (xDeviceName, xIP, etc.) must be sent in. For commands that expect a payload, send in the payload as an xDeviceData variable.
Command Name
Description
Device_ShowWelcomeScreen
Displays welcome screen on the device
Device_SendData
Sends data to device. Does not expect a response.
Device_GetData
Requests data from device
Device_GetFormEvent
Requests form data from the device
Device_GetSignature
Displays signature prompt on device. Returns Base64 encoded string. xDeviceData can be used to specify a location where signature will be stored as PNG file. xSignatureMessage can be used to display a signature message.
(Note: in order to use the test site, you will need to first download and run our application.)
Use the following integration when you are offline or cannot reach Cardknox:
Send the following command to BBPOS (https://localemv.com:8887) to initiate an offline transaction on the device xCommand=cc:encrypt
Complete the transaction on the device or on the Payment Engine form
If successful, you should receive a response as follows:
"xCardNum": "4444330000001111;enc_1_1_Yu2tZUHL2ucliZwKaq5NMKBY5QDArSh8BcroZg4qT6sc39O8fLgRlBxVMQH1jpv+42s9IFTu2cSEi73j6qgtaLkQ5O8gZ2sPBgWnWjDjg6hvYeDJBBTjKh/ms6h6hAhgrfMD+3+ibgrt7OT2Ks2KHQ==_TThACh9hOhTiKte+qU9jRke7f08aAnrsNqjuToWyuP2onSh/ksQN5JOn3yWF2ECMIIrM/uT1MeC3HZxojDV+XDa7+4qJiuKgRh2yyNyAooBtyAh63IzhYd7gaIosEb2U7laOO5d6Zt2HJ4+br7P9hHIEbvElYH2O7uIaQN004c1pki1cJcs0n1ugPLvPpFwUMaUOYUi7z0RuEwX+n/bc9bLHyvYQAt1vo+Z0xteVifT/B0PrNLmGbpElRnwRNpf4koSV05HH363NH/Y4Yu2rnZnCjtOzn1NCPWkt41fUqiVTF1f9ZWCvU7iWR2cLd61Q7OwuT2VLP/c0WnMRbPXDEg==?", "xResult": "S", "xStatus": "Success", "xCommand": "cc:encrypt", "xAuthAmount": "1.99", "xSignatureRequired": "True", "xTransactionMode": "Unknown Entry Mode", "CVM": "Signature" }
Store the xCardnum data locally until you have a connection, and then submit the data as xCardnum or xMagStripe
xCardNum data needs to be URL encoded Key-Value Pairs (KVP)
Our simple iFields integration enables online Click-To-Pay processing through the Sola gateway. This document details the steps necessary to integrate Click-To-Pay with your site.
Contents
Register for Click-To-Pay: See [insert link here]
Step 1: Add the iFields.js file after the <head> tag on your payment page:
Step 1: Add the following JS snippet inside the <body> where the Click-To-Pay button is desired.
Step 2: Create JavaScript object that holds all of the properties/methods required to process Click-To-Pay.
For a full sample code please refer to
Step 3: Implement desired callbacks.
For the list of available callbacks, please refer to object.
There are two main callbacks that must be implemented (the rest are optional):
onPaymentPrefill - calculates total amount and sets transaction information.
onPaymentSuccess - a callback that will be called after the consumer pays and Click-To-Pay returns a payload with all of the requested consumer information. This is where you need to make an ajax call to your server with the payload. The sample for making an ajax call is below:
Sample Code for Making Ajax Call:
For full integration code, please refer to
window.ckClickToPay object - controls initialization of Click-To-Pay button
A server endpoint is needed in order to accept the Click-To-Pay Payload from your website.
Step 1: Create an endpoint and method for API Integration on your server side that takes a Click-To-Pay Payload and makes a call to Sola.
For full list of Returned Parameters, please refer to Click-To-Pay Response Reference
This section assumes that you already know how to integrate other payments with .
Below are the steps to integrate Click-To-Pay with the Sola API:
Once the consumer confirms the payment, Click-To-Pay API generates a in the form of a JSON string.
Integration Steps:
Set the required fields:
xDigitalWalletType to ClickToPay
xClickToPayTransactionId to clickToPayResponse.payload.transactionId
xClickToPayExternalClientId to clickToPayResponse.payload.externalClientId
Sample Request:
For more details, please contact your Sola Representative.
Contact
Our component for the Angular framework simplifies the iFields integration process. This integration allows you to build forms with secure payment fields, giving you the ability to design and customize the look and feel of your payment and checkout flows without having to worry about PCI compliance.
Sandbox: To request a Sandbox account, please reach out to [email protected].
iFields: Fields
A sandbox or live account is required to use this component.
There are 2 basic inputs required to get this up and running:
There are three types of payment data that iFields supports:
Credit Card
CVV
ACH
The possible values for this property are:
card
CVV
ACH
These can be imported from the component.
Pass your to the component in the account input like this:
Events:
There are 2 lifecycle events and 7 user events.
Is emitted when the iFrame has loaded.
1 <cardknox-ifields (load)="onLoad"></cardknox-ifields>
Is emitted when a token is received from the iField.
1 <cardknox-ifields (token)="onToken"></cardknox-ifields>
User events are events passed along from iFields when the user interacts with it.
The available events are:
click
dblclick
focus
blur
* the submit event works slightly differently, see below.
Aside from submit, the above events can be collected on a single event update. This is not recommended as it will cause an unnecessary amount of function calls. Instead, subscribe only to the events you want to act on.
The event is in e.data. The data also contains the event so you can subscribe to multiple events with a single function and a switch statement, like this:
This event is triggered when the user submits the form from within the iFrame.
This event works differently from other user events.
This event is only emitted if prop options.autoSubmit is true. (this is the default).
Subscribing to update will not, work as mentioned above.
The data passed along with this event is slightly different (see below).
It is also possible to have the component automatically submit the form for you when submit is triggered from the iFrame. If autoSubmitFormId is set on the options prop, the component will call submit on the element with that ID. This is useful for smaller applications relying on the form element to handle submission.
There is also an error event that can be subscribed to.
There are 3 actions available on this component as well:
focusIfield
This action will set the focus to the iField when called.
clearIfield
This action will clear the data from the iField when called.
getToken
This action will load the token for the iField when called.
iFields Version:
xDeviceComBaud
Device baud rate
DeviceParity
xDeviceComParity
Device parity
DeviceDataBits
xDeviceComDataBits
Device data bit
DeviceIP
xDeviceIPAddress
IP address assigned to device
DevicePort
xDeviceIPPort
IP port assigned to device
Device_Timeout
xDeviceTimeOut
Set amount of time to wait from transaction
RequireAVS
xRequireAVS
Forces user to enter cardholder to enter AVS info for keyed transactions (Windows Only)
RequireCVV
xRequireCVV
Forces user to enter cardholder to enter card CVV for keyed transactions (Windows Only)
EnableDeviceInsertSwipeTap
xEnableDeviceSwipe
Enables device transactions
RequirePin
xRequirePin
Requires a PIN for debit enabled cards
RequireSignature
xRequireSignature
Requires a signature
EnableWelcomeScreen
xEnableWelcomeScreen
If set to false, will disable device welcome screen
PrinterName
N/A
Sets printer to which receipts will be sent
ExitFormIfApproved
xExitFormIfApproved
Exits payment form after transaction approval without user interaction (Windows only)
ExitFormIfNotApproved
xExitFormIfNotApproved
Exits payment form after transaction decline without user interaction (Windows Only)
ExitFormOnDeviceError
xExitFormOnDeviceError
Exits payment form after transaction error without user interaction (Windows Only)
EnableSilentMode
xEnableSilentMode
Payment form will not appear. Transaction will be handled solely on device.
EnableKeyedEntry
xEnableKeyedEntry
Disables keyed transaction on payment form, but does show form. Transaction will be handled solely on device.
EnableAmountConfirmationPrompt
xEnableAmountConfirmationPrompt
The device will prompt for a confirmation with the amount,
N/A
xResponseFormat
Specifies response format. Available formats are KVP, JSON, XML.
N/A
xRedirectURL
Species a URL to which user will be redirected to upon completion of the transaction.
CloseApplicationOnSessionEnd
N/A
Closes the application and prevents the application from running when screen is locked
Device_ShowItems
Show the items during a transaction.
Required fields xSerializationType=JSON, xAmount and xData with items in JSON format. Ex [{'xdescription':'Apples','xqty':1,'xunitprice':'.40'}, {'xdescription':'Oranges','xqty':2,'xunitprice':'.50'}]
Device_GetSignatureData
Device_GetScreenshot
Device_Download

xClickToPayEncryptionKey to clickToPayResponse.payload.encryptionKey
xCardNum to clickToPayResponse.payload.token
xAmount to clickToPayResponse.amount
xCommand - Set to one of the values that starts with cc: like cc:sale, cc:auth, etc.
xKey to "Your xKey"
xVersion = "4.5.9"
xSoftwareName to “Your Software Name"
xSoftwareVersion to "Your Software Version"
Method
Call Required
Description
enableClickToPay
Yes
Initializes and enables Click-To-Pay Button.
Name
Type
Required
Description
initParameters
Object
Yes
Object that contains initialization parameters for Click-To-Pay
Let's define a helper object with all necessary components:
Let’s enable Apple Pay for the website:
document.addEventListener("DOMContentLoaded", function(event) {
.....
ckApplePay.enableApplePay({
initFunction: 'apRequest.initAP',
amountField: 'amount'
});
.....
}To see the full solution please click here.
<script src=https://cdn.cardknox.com/ifields/**ifields-version-number**/ifields.min.js></script><div id="click2payContainer">
</div> const click2payRequest = {
paymentPrefill: function(){
const result = {
merchantRequestId: "Merchant defined request ID",
currencyCode: "USD",
description: "...corp Product",
orderId: "Merchant defined order ID",
promoCode: "Merchant defined promo code",
subtotal: roundTo(getAmount(), 2),
shippingHandling: "2.00",
tax: "2.00",
discount: "1.00",
giftWrap: "2.00",
misc: "1.00",
setTotal: function() {
this.total = roundTo(
roundToNumber(this.subtotal, 2)
+ roundToNumber(this.shippingHandling, 2)
+ roundToNumber(this.tax, 2)
+ roundToNumber(this.giftWrap, 2)
+ roundToNumber(this.misc, 2)
- roundToNumber(this.discount, 2)
, 2);
delete this.setTotal;
return this;
},
}.setTotal();
logDebug({
label: "paymentPrefill",
data: result
});
return result;
},
paymentCallback: function (payload) {
click2payRequest.setPayload(payload);
},
setPayload: function (value) {
document.getElementById('c2p-payload').value = JSON.stringify(value, null, 2);
showHide("divC2PPayload", value);
}
}onPaymentSuccess: function(clickToPayResponse) {
return new Promise(function (resolve, reject) {
var xhr = new XMLHttpRequest();
xhr.open("POST", "https://<your domain>/<path to handle authorization>");
xhr.onload = function () {
if (this.status >= 200 && this.status < 300) {
resolve(xhr.response);
} else {
reject({
status: this.status,
statusText: xhr.statusText
});
}
};
xhr.onerror = function () {
reject({
status: this.status,
statusText: xhr.statusText
});
};
xhr.setRequestHeader("Content-Type", "application/json");
xhr.send(JSON.stringify(clickToPayResponse));
});
}ckClick2Pay.enableClickToPay({
environment: c2pEnvironment.sandbox,
externalClientId: "<Your externalClientId>",
click2payContainer: "click2payContainer",
onPaymentPrefill: click2payRequest.paymentPrefill,
onPaymentSuccess: click2payRequest.paymentCallback
}); public async Task<IActionResult> Authorize(clickToPayResponse resp)
{
var reqGateway = new
{
xKey = "Your xKey",
xDigitalWalletType = "ClickToPay",
xAmount = (decimal)resp.amount,
xClickToPayTransactionId = resp.payload.transactionId,
xClickToPayExternalClientId = resp.payload.externalClientId,
xClickToPayEncryptionKey = resp.payload.encryptionKey,
xCardNum = resp.payload.token,
xCommand = "cc:sale",
xVersion = "4.5.8",
xSoftwareName= "Your Software Name",
xSoftwareVersion = "Your Software Version"
};
var respMsg = "";
using (var http = new HttpClient())
{
var resp = await http.PostAsJsonAsync("https://x1.cardknox.com/gatewayJSON", reqGateway);
respMsg = await resp.Content.ReadAsStringAsync();
.....
}
.....
} window.apRequest = {
buttonOptions: {
buttonContainer: "ap-container",
buttonColor: APButtonColor.black,
buttonType: APButtonType.pay
},
totalAmount: null,
taxAmt: null,
shippingMethod: null,
creditType: null,
getTransactionInfo: function (taxAmt, shippingMethod, creditType) {
try {
this.shippingMethod = shippingMethod || this.shippingMethod || {
"label": "Free Shipping",
"amount": "0.00",
"type": "final"
};
this.taxAmt = roundToNumber(taxAmt, 4) || this.taxAmt || 0.07;
this.creditType = creditType || this.creditType;
const amt = getAmount();
const lineItems = [
{
"label": "Subtotal",
"type": "final",
"amount": amt
},
this.shippingMethod
];
if (this.creditType === "credit") {
lineItems.push({
"label": "Credit Card Fee",
"amount": roundTo(0.0275*amt, 2),
"type": "final"
});
}
lineItems.push({
"label": "Estimated Tax",
"amount": roundTo(this.taxAmt*amt, 2),
"type": "final"
});
let totalAmt = 0;
lineItems.forEach((item) => {
totalAmt += parseFloat(item.amount)||0;
});
totalAmt = roundTo(totalAmt, 2);
this.totalAmount = totalAmt;
return {
'lineItems': lineItems,
total: {
type: 'final',
label: 'Total',
amount: totalAmt,
}
};
} catch (err) {
console.error("getTransactionInfo error ", exMsg(err));
}
},
onGetTransactionInfo: function () {
try {
return this.getTransactionInfo();
} catch (err) {
console.error("onGetTransactionInfo error ", exMsg(err));
}
},
onGetShippingMethods: function() {
return [
{
label: 'Free Shipping',
amount: '0.00',
identifier: 'free',
detail: 'Delivers in five business days',
},
{
label: 'Express Shipping',
amount: '5.00',
identifier: 'express',
detail: 'Delivers in two business days',
},
];
},
onShippingContactSelected: function(shippingContact) {
const self = this;
return new Promise((resolve, reject) => {
try {
console.log("shippingContact", JSON.stringify(shippingContact));
let taxAmt = 0.1;
const newShippingMethods = [
{
label: 'Free Shipping',
amount: '0.00',
identifier: 'free',
detail: 'Delivers in five business days',
}
];
if (shippingContact && shippingContact.administrativeArea) {
if (shippingContact.administrativeArea === "NY") {
taxAmt = 0.0875;
newShippingMethods.push(
{
label: 'Overnight Shipping',
amount: '10.00',
identifier: 'overnight',
detail: 'Delivers in one business days',
}
);
} else if (shippingContact.administrativeArea === "NJ") {
taxAmt = 0.07;
newShippingMethods.push(
{
label: 'Express Shipping',
amount: '5.00',
identifier: 'express',
detail: 'Delivers in two business days',
}
);
}
}
const resp = self.getTransactionInfo(taxAmt, newShippingMethods[0]);
resp.shippingMethods = newShippingMethods;
resolve(resp);
} catch (err) {
const apErr = {
code: "-101",
contactField: "",
message: exMsg(err)
}
console.error("onShippingContactSelected error.", exMsg(err));
reject({errors: [err]});
}
})
},
onShippingMethodSelected: function(shippingMethod) {
const self = this;
return new Promise(function (resolve, reject) {
try {
console.log("shippingMethod", JSON.stringify(shippingMethod));
const resp = self.getTransactionInfo(null, shippingMethod);
resolve(resp);
} catch (err) {
const apErr = {
code: "-102",
contactField: "",
message: exMsg(err)
}
console.error("onShippingMethodSelected error.", exMsg(err));
reject({errors: [err]});
}
})
},
onPaymentMethodSelected: function(paymentMethod) {
const self = this;
return new Promise((resolve, reject) => {
try {
console.log("paymentMethod", JSON.stringify(paymentMethod));
const resp = self.getTransactionInfo(null, null, paymentMethod.type);
resolve(resp);
} catch (err) {
const apErr = {
code: "-102",
contactField: "",
message: exMsg(err)
}
console.error("onPaymentMethodSelected error.", exMsg(err));
reject({errors: [err]});
}
})
},
validateApplePayMerchant: function () {
return new Promise((resolve, reject) => {
try {
var xhr = new XMLHttpRequest();
xhr.open("POST", "https://api.cardknox.com/applepay/validate");
xhr.onload = function () {
if (this.status >= 200 && this.status < 300) {
console.log("validateApplePayMerchant", JSON.stringify(xhr.response));
resolve(xhr.response);
} else {
console.error("validateApplePayMerchant", JSON.stringify(xhr.response), this.status);
reject({
status: this.status,
statusText: xhr.response
});
}
};
xhr.onerror = function () {
console.error("validateApplePayMerchant", xhr.statusText, this.status);
reject({
status: this.status,
statusText: xhr.statusText
});
};
xhr.setRequestHeader("Content-Type", "application/json");
xhr.send();
} catch (err) {
setTimeout(function () { console.log("getApplePaySession error: " + exMsg(err)) }, 100);
}
});
},
onValidateMerchant: function() {
return new Promise((resolve, reject) => {
try {
this.validateApplePayMerchant()
.then((response) => {
try {
console.log(response);
resolve(response);
} catch (err) {
console.error("validateApplePayMerchant exception.", JSON.stringify(err));
reject(err);
}
})
.catch((err) => {
console.error("validateApplePayMerchant error.", JSON.stringify(err));
reject(err);
});
} catch (err) {
console.error("onValidateMerchant error.", JSON.stringify(err));
reject(err);
}
});
},
authorize: function(applePayload, totalAmount) {
return new Promise(function (resolve, reject) {
var xhr = new XMLHttpRequest();
xhr.open("POST", "https://<your domain>/<path to handle authorization>");
xhr.onload = function () {
if (this.status >= 200 && this.status < 300) {
resolve(xhr.response);
} else {
reject({
status: this.status,
statusText: xhr.statusText
});
}
};
xhr.onerror = function () {
reject({
status: this.status,
statusText: xhr.statusText
});
};
const data = {
amount: totalAmount,
payload: applePayload
};
xhr.setRequestHeader("Content-Type", "application/json");
xhr.send(JSON.stringify(data));
});
},
onPaymentAuthorize: function(applePayload) {
return new Promise((resolve, reject) => {
try {
this.authorize(applePayload, this.totalAmount)
.then((response) => {
try {
console.log(response);
const resp = JSON.parse(response);
if (!resp)
throw "Invalid response: "+ response;
if (resp.xError) {
throw resp;
}
resolve(response);
} catch (err) {
throw err;
// reject(err);
}
})
.catch((err) => {
console.error("authorizeAPay error.", JSON.stringify(err));
apRequest.handleAPError(err);
reject(err);
});
} catch (err) {
console.error("onPaymentAuthorize error.", JSON.stringify(err));
apRequest.handleAPError(err);
reject(err);
}
});
},
onPaymentComplete: function(paymentComplete) {
if (paymentComplete.response) { //Success
const resp = JSON.parse(paymentComplete.response);
if (resp.xRefNum) {
setTimeout(function(){ console.log("Thank you for your order:("+resp.xRefNum+")")}, 100);
} else {
setTimeout(function(){ console.log("Thank you for your order.")}, 100);
}
} else if (paymentComplete.error) {
console.error("onPaymentComplete", exMsg(paymentComplete.error));
handleAPError(paymentComplete.error);
}
},
handleAPError: function(err) {
if (err && err.xRefNum) {
setTimeout(function(){ alert("There was a problem with your order:("+err.xRefNum+")")}, 100);
} else {
setTimeout(function(){ alert("There was a problem with your order:"+exMsg(err))}, 100);
}
},
initAP: function() {
return {
buttonOptions: this.buttonOptions,
merchantIdentifier: "<Your Apple Merchant ID>",
requiredBillingContactFields: ['postalAddress', 'name', 'phone', 'email'],
requiredShippingContactFields: ['postalAddress', 'name', 'phone', 'email'],
onGetTransactionInfo: "apRequest.onGetTransactionInfo",
onGetShippingMethods: "apRequest.onGetShippingMethods",
onShippingContactSelected: "apRequest.onShippingContactSelected",
onShippingMethodSelected: "apRequest.onShippingMethodSelected",
onPaymentMethodSelected: "apRequest.onPaymentMethodSelected",
onValidateMerchant: "apRequest.onValidateMerchant",
onPaymentAuthorize: "apRequest.onPaymentAuthorize",
onPaymentComplete: "apRequest.onPaymentComplete",
onAPButtonLoaded: "apRequest.apButtonLoaded",
isDebug: true
};
},
apButtonLoaded: function(resp) {
if (!resp) return;
if (resp.status === iStatus.success) {
showHide(this.buttonOptions.buttonContainer, true);
showHide("lbAPPayload", true);
} else if (resp.reason) {
console.log(resp.reason);
}
}
}input
change
submit*
threeDS
issuer
String
Card issuer
For cvv iField only
Turn on capturing a submit event triggered from within the iFrame. Default is true.
autoSubmitFormId
String
If autoSubmit is true, the ID of a form element can be set and the component will trigger submit on the form when submit is triggered in the iFrame.
placeholder
String
Text to be used as placeholder text for the input field.
iFieldstyle
Object
A style object to be used to style the iFields input element. This object is assigned to HTMLElement.style.
The transaction amount
month
Number
The 2-digit card expiration month
year
Number
The 2-digit card expiration year
The transaction amount
month
Number
The 2-digit card expiration month
year
Number
The 2-digit card expiration year
Name
Type
Description
Valid values
type
String
iFields type
card
cvv
ach
account
options
Name
Type
Description
xKey
String
iFields key
xSoftwareName
String
Software name
xSoftwareVersion
String
Software version
Name
Type
Description
enableLogging
Boolean
Turn iField logs to the console on and off
autoFormat
Boolean
Turn iField auto-formatting on and off. This is only used for iFields of card type. See autoFormatSeparator
autoFormatSeparator
String
A string to be used to auto-format card numbers when autoFormat is turned on. The default value is " " (space).
autoSubmit
Name
Type
Description
enable3DS
Boolean
Turn 3DSecure on and off
waitForResponse
Boolean
Determine whether iFields should wait for a response from 3DSecure before getting the token
waitForResponseTimeout
Number
The 3DSecure response timeout in milli-seconds. The default value is 2000 (2 seconds).
amount
Name
Type
Description
enable3DS
Boolean
Turn 3DSecure on and off
waitForResponse
Boolean
Determine whether iFields should wait for a response from 3DSecure before getting the token
waitForResponseTimeout
Number
The 3DSecure response timeout in milli-seconds. The default value is 2000 (2 seconds).
amount
Name
Type
Description
result
String
This will always have the value of error
errorMessage
String
Contains the error message
xTokenType
String
Either card, cvv, or ach
Boolean
Number
Number
<cardknox-ifields [type]="CARD"></cardknox-ifields> import { ACH_TYPE, CARD_TYPE, CVV_TYPE, AngularIfieldsComponent } from '@cardknox/angular-ifields';
/**...*/
CARD = CARD_TYPE;<cardknox-ifields [account]="account"></cardknox-ifields>
/**...*/
account = {
xKey: '{Your iFields key}',
xSoftwareName: '{The name of your app}',
xSoftwareVersion: '{Your app's version}'
}<cardknox-ifields (update)="onUpdate($event)"></cardknox-ifields>
/**...*/
onUpdate({ data }) {
switch (data.event) {
case 'input':
console.log("input event received");
break;
case 'click':
console.log("click event received");
break;
}
}<form id="form">
<cardknox-ifields [options]="options"></cardknox-ifields>
</form>
/**...*/
options = {
autoSubmit: true,
autoSubmitFormId: 'form'
}<form id="form">
<cardknox-ifields [options]="options"></cardknox-ifields>
</form>
/**...*/
options = {
autoSubmit: true,
autoSubmitFormId: 'form'
}<cardknox-ifields #card></cardknox-ifields>
@ViewChild('card') cardIfield?: AngularIfieldsComponent;
this.cardIfield.focusIfield();
this.cardIfield.clearIfield();
this.cardIfield.getToken();POST gift:issue
xCommand = gift:issue
The Issue command is used to issue funds to a Sola gift card.
xCardNum*
String
The customer card number. *Alternatively, xToken xMagStripe or SUT can be used.
xKey*
String
Your Sola API key.
xVersion*
String
Gateway API version. The current version is 5.0.0.
xSoftwareName*
String
Name of your software
POST gift:redeem
xCommand = gift:redeem
The Redeem command is used to debit funds from a Sola gift card.
xCardNum*
String
The customer card number. *Alternatively, xToken xMagStripe or SUT can be used.
xKey*
String
Your Sola API key.
xVersion*
String
Gateway API version. The current version is 5.0.0.
xSoftwareName*
String
Name of your software
POST gift:balance
xCommand = gift:balance
The Balance command is used to check the available balance on a Sola gift card.
xCardNum*
String
The customer card number. *Alternatively, xToken xMagStripe or SUT can be used.
xKey*
String
Your Sola API key.
xVersion*
String
Gateway API version. The current version is 5.0.0.
xSoftwareName*
String
Name of your software
POST gift:activate
xCommand = gift:activate
The Activate command is used to activate a Sola gift card.
xCardNum*
String
The customer card number. *Alternatively, xToken, xMagStripe or SUT can be used.
xKey*
String
Your Sola API key.
xVersion*
String
Gateway API version. The current version is 5.0.0.
xSoftwareName*
String
Name of your software
POST gift:deactivate
xCommand = gift:deactivate
The Deactivate command is used to deactivate a Sola gift card.(note: you can still check the balance of the gift card even after it has been deactivated).
xCardNum*
String
The customer card number. *Alternatively, xToken, xMagStripe or SUT can be used.
xKey*
String
Your Sola API key.
xVersion*
String
Gateway API version. The current version is 5.0.0.
xSoftwareName*
String
Name of your software
Overview
CloudIM (CIM) enables seamless integration with Sola devices via cloud-based APIs, eliminating the need for physical connections, drivers, or local SDKs. This setup allows you to manage transactions remotely using simple REST API calls once the device is connected to the merchant’s network (either via LAN or Wi-Fi).
Currently, only credit card transactions (swipe, tap, and dip) are supported. Debit, EBT, and gift cards are not supported at this time.
Supported commands are:
cc:sale
cc:authonly
cc:credit
Step-by-Step Quick Start
Sign Up: Create a Sola account
Authentication: Use the API Key from the merchant dashboard.
Create Device: Before initiating transactions, you need a Device ID. Follow the instructions below to create and obtain the device ID.
Make Your First API Call: Start by making a simple
Create API Key
Once registered, your API Key will be available in your Sola account dashboard.
Portal > Sola Account Settings > Keys > Create a Key -
Once the API Key is obtained, include it in the Authorization header of all requests.
Required: Currently CloudIM is only available for certain Pax A series devices (A77, A35, A80, A920 and A920 Pro).
To start initiating transactions, you need a Device ID. Here’s how you can get the device ID and ensure that your device is ready:
Step 1: Check Device Status
Before initiating any transactions, ensure that CloudIM is running on the device.
Check for the "Running…" Notification: Swipe down from the top of the terminal to verify that the CloudIM service is active. If you don’t see the "Running..." notification, reboot the terminal.
Wait for a minute until the notification appears indicating that CloudIM is up and running.
Step 2: Create Device
Once CloudIM is running, you need to create a Device ID. To do this, send a POST request to the /v1/Device endpoint. This requires the device’s serial number, device make, and a friendly name (a name of your choosing for easier reference).
Endpoint: POST /v1/Device
Required parameters: Serial number, device make, friendly name.
Example Request:
Response:
Step 3: Verify Device Status
Now that you have a Device ID, you can check the device’s status using the GET /v1/Device/{xDeviceId} endpoint.
Endpoint: GET /v1/Device/{xDeviceId}
Status: The response will indicate whether the device is CONNECTED or DISCONNECTED. You can only initiate transactions once the device status is CONNECTED.
Example Request:
Response:
Once your device is connected and ready to go, you can start processing transactions. The transaction flow involves the following key steps:
Step 1: Initiate the Transaction
You will initiate the transaction via the [POST] /v1/Session/initiate API. This request starts the transaction on the terminal, which then requests the card details from the user.
CloudIM currently only supports the following parameters, additional parameters will be supported in the future:
Endpoint: POST /v1/Session/initiate
Example Request:
Response:
Step 2: Process the Transaction on the Terminal
The terminal will now prompt for the card information (swipe, tap, or dip).
The terminal processes the transaction and sends back an approved, timeout, or error response to the API.
Step 3: Poll for the Session Status
After initiating the transaction, the POS system will need to ping the API to get the transaction status.
The possible status results are:
INITIATING - Before the session is acknowledged by the device
PROCESSING - Acknowledged and in progress
COMPLETED - Completed successfully
TIMEOUT - Timeout
Endpoint: GET /v1/Session/{xSessionId}
Example Request:
Response (for an approved transaction):
Step 4: Retrieve Additional Transaction Details (Optional)
After the transaction has been completed successfully, you can retrieve additional details from the Gateway Reporting API using the xRefNum provided.
This section describes the common schemas used in the Sola API. These schemas define the structure of the request and response payloads for key API endpoints such as device management, session initiation, and transaction result retrieval.
In the Sola API, schemas are used for both request and response bodies. When interacting with various endpoints such as device management, session initiation, and transaction result retrieval, you will often need to send data in the formats described in the schemas above. Similarly, the responses you receive from the API will follow the structures defined in these schemas, helping you to parse and process the returned data accordingly.
By following these schema definitions, developers can ensure that they send and receive data in the correct format, which reduces errors and improves the overall experience when integrating with the Sola API.
A. Device Schema
The Device Schema represents the structure of a device object used within the system. Devices are registered on the platform and are assigned unique device IDs to facilitate transactions.
Request Payload (For device creation):
When creating a device, you need to provide the device’s serial number, make, and a friendly name.
Response Example:
The API will respond with a unique device ID and the status of the device.
xDeviceId: Unique identifier for the device.
xDeviceSerialNumber: Serial number of the device.
xDeviceMake: The manufacturer or model of the device.
xDeviceFriendlyName: A custom name for the device.
B. Session Schema
The Session Schema is used when initiating a transaction. It tracks the session ID and associated details such as the transaction type, amount, and status.
Request Payload (For session initiation):
When initiating a transaction, you need to provide the device ID, transaction type, and amount.
Response Example:
The API responds with the session ID and status of the initiated transaction.
xSessionId: A unique identifier for the session.
xDeviceId: The ID of the device associated with this session.
xTransactionType: The type of transaction (e.g., cc:sale, cc:credit).
xAmount: The amount of the transaction.
C. Transaction Result Schema
The Transaction Result Schema is used when retrieving the details of a completed transaction. It includes the transaction status, reference number, and other relevant details.
Response Example (Transaction Result):
After polling the session status, you can retrieve the transaction details.
xRefNum: Cross-reference number used for reports and follow-up transactions.
xTransactionType: The type of transaction (e.g., cc:sale, cc:credit).
xAmount: The total amount processed in the transaction.
xStatus: The status of the transaction (e.g., "approved", "declined").
D. Error Response Schema
In the event of an error, the API will return an error message describing what went wrong. The structure of an error response is as follows:
Error Response Example:
Common error codes might include:
INVALID_REQUEST: Missing required fields or invalid data.
UNAUTHORIZED: Invalid or expired API key.
DEVICE_NOT_FOUND: The device ID provided does not exist in the system.
TRANSACTION_FAILED: The transaction could not be processed.
If you encounter issues, the following steps can help you troubleshoot effectively:
Invalid API Key
If you receive an Authentication error, make sure the API Key is still valid.
Device Not Responding
Ensure the device is connected to the internet.
Restart the app or reboot the terminal.
If the problem persists, contact support with the necessary details (e.g., device serial number, connection status).
Device Status Not CONNECTED
If the device status is not CONNECTED, ensure the device is correctly registered and the Cloud IM app is installed and active.
Session Not Completing
If the transaction session does not complete, check the terminal for errors, and ensure it is connected to the internet. Review the session logs for more details.
Q. How do I activate Cloud IM on my terminal? A. Cloud IM starts up automatically when the terminal is booted. No user action is required.
Q. How do connect my Pax device to the network? A. You can tap the 4 corners of a the device while turned on to access the device. Password is todays date MMDDYYYY, exit the apps settings. Then choose appropriate wifi or CIM network from your android device settings.
Q. How do I know if Cloud IM is running? A. Look for the "Running..." notification at the top of the terminal screen. If it’s not there even after waiting a few minutes, reboot the terminal.
Q. My device is not responding. What should I do? A. Ensure the device is connected to the internet. If it is, reboot the terminal. If issues persist, contact support.
Q. Where can I find the Swagger API docs? A.
{
"xCardNum": "4444333322221111",
"xKey": "[xkeycredentials]",
"xVersion": "4.5.9",
"xSoftwareName": "YourSoftwareName",
"xSoftwareVersion": "1.0.0",
"xCommand": "gift:issue",
"xAmount": "35.00",
"xToken": "61h72mmh68phn9q233634ph3g54p1499m69qhp4816pn528h84",
"xCustom01": "Register01",
"xExp": "12/25",
"xCVV": "945",
"xStreet": "123 Any Street Apt 4b Anytown, NY",
"xZip": "12345",
"xMagstripe": "%B4444333322221111^TEST CARD/VISA^4912101123456789?;4444333322221111=4912101123456789?",
"xName": "John Doe",
"xDUKPT": "%B4444333322221111^TEST CARD/VISA^4912101123456789?;444433",
"xTax": "2.00",
"xTip": "2.00",
"xInvoice": "123456A",
"xPONum": "123456B",
"xComments": "This is a comment",
"xDescription": "This is a description",
"xIP": "1.2.3.4",
"xEmail": "[email protected]",
"xFax": "1234567890",
"xBillFirstName": "John",
"xBillMiddleName": "Max",
"xBillLastName": "Doe",
"xBillCompany": "Acme",
"xBillStreet": "123 Any Street",
"xBillStreet2": "Apt 4b",
"xBillCity": "Anytown",
"xBillState": "NY",
"xBillZip": "12345",
"xBillCountry": "USA",
"xBillPhone": "8005551212",
"xBillMobile": "8005551111",
"xShipFirstName": "John",
"xShipMiddleName": "Max",
"xShipLastName": "Doe",
"xShipCompany": "Acme",
"xShipStreet": "123 Any Street",
"xShipStreet2": "Apt 4b",
"xShipCity": "Anytown",
"xShipState": "NY",
"xShipZip": "12345",
"xShipCountry": "USA",
"xShipPhone": "8005551212",
"xShipMobile": "8005551111",
"xOrderID": "12356",
"xExistingCustomer": "TRUE",
"xAllowDuplicate": "TRUE",
"xTimeoutSeconds": "10"
}{
"xCardNum": "4444333322221111",
"xKey": "[xkeycredentials]",
"xVersion": "4.5.9",
"xSoftwareName": "YourSoftwareName",
"xSoftwareVersion": "1.0.0",
"xCommand": "gift:redeem",
"xAmount": "35.00",
"xToken": "61h72mmh68phn9q233634ph3g54p1499m69qhp4816pn528h84",
"xCustom01": "Register01",
"xExp": "12/25",
"xCVV": "945",
"xStreet": "123 Any Street Apt 4b Anytown, NY",
"xZip": "12345",
"xMagstripe": "%B4444333322221111^TEST CARD/VISA^4912101123456789?;4444333322221111=4912101123456789?",
"xName": "John Doe",
"xDUKPT": "%B4444333322221111^TEST CARD/VISA^4912101123456789?;444433",
"xTax": "2.00",
"xTip": "2.00",
"xInvoice": "123456A",
"xPONum": "123456B",
"xComments": "This is a comment",
"xDescription": "This is a description",
"xIP": "1.2.3.4",
"xEmail": "[email protected]",
"xFax": "1234567890",
"xBillFirstName": "John",
"xBillMiddleName": "Max",
"xBillLastName": "Doe",
"xBillCompany": "Acme",
"xBillStreet": "123 Any Street",
"xBillStreet2": "Apt 4b",
"xBillCity": "Anytown",
"xBillState": "NY",
"xBillZip": "12345",
"xBillCountry": "USA",
"xBillPhone": "8005551212",
"xBillMobile": "8005551111",
"xShipFirstName": "John",
"xShipMiddleName": "Max",
"xShipLastName": "Doe",
"xShipCompany": "Acme",
"xShipStreet": "123 Any Street",
"xShipStreet2": "Apt 4b",
"xShipCity": "Anytown",
"xShipState": "NY",
"xShipZip": "12345",
"xShipCountry": "USA",
"xShipPhone": "8005551212",
"xShipMobile": "8005551111",
"xOrderID": "12356",
"xExistingCustomer": "TRUE",
"xAllowDuplicate": "TRUE",
"xTimeoutSeconds": "10"
}{
"xCardNum": "4444333322221111",
"xKey": "[xkeycredentials]",
"xVersion": "4.5.9",
"xSoftwareName": "YourSoftwareName",
"xSoftwareVersion": "1.0.0",
"xCommand": "gift:balance",
"xToken": "61h72mmh68phn9q233634ph3g54p1499m69qhp4816pn528h84",
"xCustom01": "Register01",
"xExp": "12/25",
"xCVV": "945",
"xStreet": "123 Any Street Apt 4b Anytown, NY",
"xZip": "12345",
"xMagstripe": "%B4444333322221111^TEST CARD/VISA^4912101123456789?;4444333322221111=4912101123456789?",
"xName": "John Doe",
"xAuthCode": "T4321A",
"xDUKPT": "%B4444333322221111^TEST CARD/VISA^4912101123456789?;444433",
"xTax": "2.00",
"xTip": "2.00",
"xRefNum": "81234568",
"xInvoice": "123456A",
"xPONum": "123456B",
"xComments": "This is a comment",
"xDescription": "This is a description",
"xIP": "1.2.3.4",
"xEmail": "[email protected]",
"xFax": "1234567890",
"xBillFirstName": "John",
"xBillMiddleName": "Max",
"xBillLastName": "Doe",
"xBillCompany": "Acme",
"xBillStreet": "123 Any Street",
"xBillStreet2": "Apt 4b",
"xBillCity": "Anytown",
"xBillState": "NY",
"xBillZip": "12345",
"xBillCountry": "USA",
"xBillPhone": "8005551212",
"xBillMobile": "8005551111",
"xShipFirstName": "John",
"xShipMiddleName": "Max",
"xShipLastName": "Doe",
"xShipCompany": "Acme",
"xShipStreet": "123 Any Street",
"xShipStreet2": "Apt 4b",
"xShipCity": "Anytown",
"xShipState": "NY",
"xShipZip": "12345",
"xShipCountry": "USA",
"xShipPhone": "8005551212",
"xShipMobile": "8005551111",
"xMICR": "t021000021t 123456789o _2542",
"xRouting": "021202337",
"xGatewayRefNum": "852585258",
"xGatewayResult": "Approved",
"xGatewayError": "845455484",
"xGatewayCVV": "M",
"xGatewayAVS": "YYY",
"xOrderType": "Internet",
"xOrderID": "12356",
"xExistingCustomer": "TRUE",
"xOrderItems": "Sony Digital Camera",
"xCustomerComments": "Please ship as soon as possible",
"xShipMethod": "UPS Ground",
"xShipAmount": "29.99",
"xShipEmail": "[email protected]",
"xAllowDuplicate": "TRUE"
}{
"xCardNum": "4444333322221111",
"xKey": "[xkeycredentials]",
"xVersion": "4.5.9",
"xSoftwareName": "YourSoftwareName",
"xSoftwareVersion": "1.0.0",
"xCommand": "gift:activate"
}{
"xCardNum": "4444333322221111",
"xKey": "[xkeycredentials]",
"xVersion": "4.5.9",
"xSoftwareName": "YourSoftwareName",
"xSoftwareVersion": "1.0.0",
"xCommand": "gift:deactivate"
}xSoftwareVersion*
String
Version number of your software
xCommand*
String
Sola transaction type
xCustom01*
String
20 custom fields are available for custom data, such as customer comments, etc. Use xCustom01 through xCustom20.
xAmount*
String
The total amount of the transaction, inclusive of tax and tip if applicable. This the total amount of the transaction.
xToken
String
The Sola token that references a previously used payment card. When using this variable, xCardNumand xMagstripe should not be used maximum 50 alphanumeric characters).
xMagstripe
String
The magstripe data of a credit card. Magstripe data includes the card number and expiration date. When using this command, xCardNum xExp and xToken should not be used. Encryptedcard data can also be sent using xMagstripe
xName
String
The cardholder’s name
xTax
String
The tax portion that is included in the total transaction amount (xAmount)
xTip
String
The tip portion that is included in the total transaction amount (xAmount)
xInvoice
String
The merchant’s invoice number for the transaction. xInvoice is recommended when available for improved duplicate handling.
xPONum
String
The merchant’s purchase order number for the transaction
xComments
String
Additional data that is optionally passed along to the receipt
xDescription
String
Additional data that is optionally passed along for reporting
xIP
String
The customer’s IP address. Typically used for fraud detection.
xEmail
String
The customer’s email address
xFax
String
The customer’s fax number
xBillFirstName
String
The customer’s first name for their billing profile
xBillMiddleName
String
The customer’s middle name or initial for their billing profile
xBillLastName
String
The customer’s last/family name for their billing profile
xBillCompany
String
The customer’s company name for their billing profile
xBillStreet
String
The customer’s street address for their billing profile
xBillStreet2
String
The customer’s street address 2nd line for their billing profile
xBillCity
String
The customer’s city for their billing profile
xBillState
String
The customer’s state for their billing profile
xBillZip
String
The customer’s zip code for their billing profile
xBillCountry
String
The customer’s country for their billing profile
xBillPhone
String
The customer’s phone number for their billing profile
xBillMobile
String
The customer’s mobile number for their billing profile
xShipFirstName
String
The customer’s first name for their shipping profile
xShipMiddleName
String
The customer’s middle name or initial for their shipping profile
xShipLastName
String
The customer’s last/family name for their shipping profile
xShipCompany
String
The customer’s company name for their shipping profile
xShipStreet
String
The customer’s street address for their shipping profile
xShipStreet2
String
The customer’s street address 2nd line for their shipping profile
xShipCity
String
The customer’s city for their shipping profile
xShipState
String
The customer’s state for their shipping profile
xShipZip
String
The customer’s zip code for their shipping profile
xShipCountry
String
The customer’s country for their shipping profile
xShipPhone
String
The customer’s phone number for their shipping profile
xShipMobile
String
The customer’s mobile number for their shipping profile
xAllowDuplicate
String
By default, Sola rejects duplicate transactions within 10 minutes of the original transaction. This command overrides that safeguard. True/False allowed.
xOrderID
String
Unique order number for FraudWatch verification
xExistingCustomer
String
Yes/No value indicating if the customer is a repeat customer
xExp
String
Gift card expiration number. Format: MMYY. For sandbox accounts, use any date in the future. *Required and available only when xCardNum is used.
xCVV
String
3-digit code from the back of the card (for Amex, 4-digit code from the front of the card)
xStreet
String
The billing street address of the cardholder
xZip
String
The billing zip code of the cardholder
xDUKPT
String
The DUK/PT key for PIN debit and EBT transactions.The first 16 characters are the encrypted PIN block, followed by the 6 character long Key Set Identifier (KSID). The remaining characters are the PIN pad serial number and transaction counter.
xTimeoutSeconds
String
Configurable amount of seconds in which the request will wait for a response.
xSoftwareVersion*
String
Version number of your software
xCommand*
String
Sola transaction type
xAmount*
String
The total amount of the transaction, inclusive of tax and tip if applicable. This the total amount of the transaction.
xCustom01*
String
20 custom fields are available for custom data, such as customer comments, etc. Use xCustom01 through xCustom20.
xToken
String
The Sola token that references a previously used card. When using a variable, xCardNumand xMagstripe should no be used (maximum 50 alphanumeric characters).
xMagstripe
String
The magstripe data of a credit card. Magstripe data includes the card number and expiration date. When using this command, xCardNum xExp and xToken should not be used. Encrypted Card data can also be sent using xMagstripe.
xName
String
The cardholder’s name
xTax
String
The tax portion that is included in the total transaction amount (xAmount)
xTip
String
The tip portion that is included in the total transaction amount (xAmount)
xInvoice
String
The merchant’s invoice number for the transaction. xInvoice is recommended when available for improved duplicate handling.
xPONum
String
The merchant’s purchase order number for the transaction
xComments
String
Additional data that is optionally passed along to the receipt
xDescription
String
Additional data that is optionally passed along for reporting
xIP
String
The customer’s IP address. Typically used for fraud detection.
xEmail
String
The customer’s email address
xFax
String
The customer’s fax number
xBillFirstName
String
The customer’s first name for their billing profile
xBillMiddleName
String
The customer’s middle name or initial for their billing profile
xBillLastName
String
The customer’s last/family name for their billing profile
xBillCompany
String
The customer’s company name for their billing profile
xBillStreet
String
The customer’s street address for their billing profile
xBillStreet2
String
The customer’s street address 2nd line for their billing profile
xBillCity
String
The customer’s city for their billing profile
xBillState
String
The customer’s state for their billing profile
xBillZip
String
The customer’s zip code for their billing profile
xBillCountry
String
The customer’s country for their billing profile
xBillPhone
String
The customer’s phone number for their billing profile
xBillMobile
String
The customer’s mobile number for their billing profile
xShipFirstName
String
The customer’s first name for their shipping profile
xShipMiddleName
String
The customer’s middle name or initial for their shipping profile
xShipLastName
String
The customer’s last/family name for their shipping profile
xShipCompany
String
The customer’s company name for their shipping profile
xShipStreet
String
The customer’s street address for their shipping profile
xShipStreet2
String
The customer’s street address 2nd line for their shipping profile
xShipCity
String
The customer’s city for their shipping profile
xShipState
String
The customer’s state for their shipping profile
xShipZip
String
The customer’s zip code for their shipping profile
xShipCountry
String
The customer’s country for their shipping profile
xShipPhone
String
The customer’s phone number for their shipping profile
xShipMobile
String
The customer’s mobile number for their shipping profile
xAllowDuplicate
String
By default, Sola rejects duplicate transactions within 10 minutes of the original transaction. This command overrides that safeguard. True/False allowed.
xOrderID
String
Unique order number for FraudWatch verification
xExistingCustomer
String
Yes/No value indicating if the customer is a repeat customer
xExp
String
Gift card expiration number. Format: MMYY. For sandbox accounts, use any date in the future. *Required and available only when xCardNum is used.
xCVV
String
3-digit code from the back of the card (for Amex, 4-digit code from the front of the card).
xStreet
String
The billing street address of the cardholder
xZip
String
The billing zip code of the cardholder
xDUKPT
String
The DUK/PT key for PIN debit and EBT transactions.The first 16 characters are the encrypted PIN block, followed by the 6 character long Key Set Identifier (KSID). The remaining characters are the PIN pad serial number and transaction counter.
xTimeoutSeconds
String
Configurable amount of seconds in which the request will wait for a response.
xSoftwareVersion*
String
Version number of your software
xCommand*
String
Sola transaction type
xToken
String
The Sola token that references a previously used payment method. When using a token, xCardNum xExp and xMagstripe should not be used.
xMagstripe
String
The magstripe data of a credit card. Magstripe data includes the card number and expiration date. When using this command, xCardNum xExp and xToken should not be used. Encrypted card data can also be sent using xMagstripe.
xName
String
The cardholder’s name
xTax
String
The tax portion that is included in the total transaction amount (xAmount)
xTip
String
The tip portion that is included in the total transaction amount (xAmount)
xInvoice
String
The merchant’s invoice number for the transaction. xInvoice is recommended when available for improved duplicate handling.
xPONum
String
The merchant’s purchase order number for the transaction
xComments
String
Additional data that is optionally passed along to the receipt
xDescription
String
Additional data that is optionally passed along for reporting
xIP
String
The customer’s IP address. Typically used for fraud detection
xEmail
String
The customer’s email address
xFax
String
The customer’s fax number
xBillFirstName
String
The customer’s first name for their billing profile
xBillMiddleName
String
The customer’s middle name or initial for their billing profile
xBillLastName
String
The customer’s last/family name for their billing profile
xBillCompany
String
The customer’s company name for their billing profile
xBillStreet
String
The customer’s street address for their billing profile
xBillStreet2
String
The customer’s street address 2nd line for their billing profile
xBillCity
String
The customer’s city for their billing profile
xBillState
String
The customer’s state for their billing profile
xBillZip
String
The customer’s zip code for their billing profile
xBillCountry
String
The customer’s country for their billing profile
xBillPhone
String
The customer’s phone number for their billing profile
xBillMobile
String
The customer’s mobile number for their billing profile
xShipFirstName
String
The customer’s first name for their shipping profile
xShipMiddleName
String
The customer’s middle name or initial for their shipping profile
xShipLastName
String
The customer’s last/family name for their shipping profile
xShipCompany
String
The customer’s company name for their shipping profile
xShipStreet
String
The customer’s street address for their shipping profile
xShipStreet2
String
The customer’s street address 2nd line for their shipping profile
xShipCity
String
The customer’s city for their shipping profile
xShipState
String
The customer’s state for their shipping profile
xShipZip
String
The customer’s zip code for their shipping profile
xShipCountry
String
The customer’s country for their shipping profile
xShipPhone
String
The customer’s phone number for their shipping profile
xShipMobile
String
The customer’s mobile number for their shipping profile
xAllowDuplicate
String
By default, Sola rejects duplicate transactions within 10 minutes of the original transaction. This command overrides that safeguard. True/False allowed.
xOrderID
String
Unique order number for FraudWatch verification
xExistingCustomer
String
Yes/No value indicating if the customer is a repeat customer
xExp
String
The card expiration number. Format: MMYY. For sandbox test transactions, use any date in the future. *xExp is required when sending in xCardnum and cannot be used with xMagstripe.
xCVV
String
3-digit code from the back of the card (for Amex, 4-digit code from the front of the card).
xStreet
String
The billing street address of the cardholder
xZip
String
The billing zip code of the cardholder
xDUKPT
String
The DUK/PT key for PIN debit and EBT transactions.The first 16 characters are the encrypted PIN block, followed by the 6 character long Key Set Identifier (KSID). The remaining characters are the PIN pad serial number and transaction counter.
Custom01
String
20 custom fields are available for custom data, such as customer comments, etc. Use xCustom01 through xCustom20.
xAuthCode
String
xAuthCode is a verification number provided by the issuing bank to be used with the cc:postauth command
xRefNum
String
Used to reference a previous transaction when processing a follow-up transaction, typically a refund, void, or capture. (Note: xRefnum can be a 64-bit number and should be stored as BIGINT, Long, Int64 or String).
xMICR
String
The routing, account, and check number data from the bottom of a check in MICR (Magnetic Ink Character Recognition) format, typically generated by a check scanner
xRouting
String
The check ABA routing number
xGatewayRefNum
String
Transaction RefNum received from gateway for FraudWatch verification
xGatewayResult
String
Transaction status received from gateway for FraudWatch verification (Approved/Declined/Error)
xGatewayError
String
Transaction RefNum received from gateway for FraudWatch verification.
xGatewayCVV
String
CVV for for FraudWatch verification.
xOrderType
String
Specifies if the order origin is internet OR phone for FraudWatch verification
xGatewayAVS
String
Street address for FraudWatch verification
xOrderItems
String
Summary of products ordered
xCustomerComments
String
Comments submitted by thecustomer along with the order
xShipMethod
String
The shipping carrier/service used
xShipAmount
String
The total cost of shipping charges
xShipEmail
String
The ShipTo email address
xSoftwareVersion*
String
Version number of your software
xCommand*
String
Sola transaction type
xSoftwareVersion*
String
Version number of your software
xCommand*
String
Sola transaction type
POST /paymentsTest in Swagger UI: Use Swagger UI to test the API directly in your browser. This is a quick way to familiarize yourself with the API and see how it responds.
String
A unique identifier for the transaction, defined by the merchant.
Any unique string Note: This field only supports up to 32 characters.
xInvoice
No
String
Invoice number associated with the transaction.
Any alphanumeric string Note: This field supports 20 characters
xSoftwareName
Yes
String
Name of the software initiating the transaction.
e.g., "My Software"
xSoftwareVersion
Yes
String
Version of the software initiating the transaction.
e.g., "1.0.0"
xStreet
No
String
Cardholder's billing street address.
e.g., "123 Main St.”
xTip
No
Numeric
Tip amount to be added to the transaction.
e.g., "1.00”
xZip
No
String
Cardholder's billing ZIP or postal code.
e.g., "12345”
API_CANCELLED - Cancel API call
ERROR - Other error (Including decline)
xStatus: The current state of the device (e.g., "CONNECTED", "DISCONNECTED").
xStatus: The current status of the session (e.g., "IN_PROGRESS", "COMPLETED").
xResponseCode: The response code from the payment processor (e.g., "00" for success).
xRefNum: Cross-reference number for reporting and future use.
xApprovalCode: The authorization code returned from the payment processor.
xDate: The date and time when the transaction was completed.
Session_not_found: The session ID is incorrect.
xAmount
Yes
Numeric
The total amount to be charged, including any tips.
e.g., "10.00"
xCommand
Yes
String
Specifies the transaction type to execute.
cc:sale, cc:authonly, cc:credit
xEnableTipPrompt
No
Boolean
Enables tip prompt on the device during the transaction.
true, false
xExternalRequestId
Yes
POST <https://device.cardknox.com/v1/Device>
Content-Type: application/json
Authorization: API Key
{
"xDeviceserialNumber": "1234567890",
"xDeviceMake": "pax",
"xDeviceFriendlyName": "Terminal 1"
}{
"xDeviceId": "16fbd30d7-2e86-4ddc-8e52-442e9332be0e",
"xRefnum": "cim111003924",
"xResult": "S"
}GET <https://device.cardknox.com/v1/Device/xDeviceId123>
Authorization: API Key{
"xDeviceId": "xDeviceId123",
"xDeviceName": "Terminal 1",
"xStatus": "CONNECTED"
}POST <https://device.cardknox.com/v1/Session/initiate>
Content-Type: application/json
Authorization: API Key
{
"xPayload": {
"xCommand": "cc:sale",
"xAmount": "0.01",
"xEnableTipPrompt": true,
"xExternalRequestId": "1234654",
"xSoftwareName": "MySoftware",
"xSoftwareVersion": "1.0.0",
},
"xDeviceId": "1ac25fc88-da3a-44ba-9b8f-0db642613cb7"
}{
"xSessionId": "session111004629",
"xRefnum": "cim111004629",
"xResult": "S"
}GET <https://device.cardknox.com/v1/Session/session12345>
Authorization: API Key{
"xSessionStatus": "COMPLETED",
"xGatewayRefnum": "10204219792",
"xGatewayStatus": "Approved",
"xTransactionResult": {},
"xRefnum": "cim111008282",
"xResult": "S"
}{
"xDeviceSerialNumber": "SN987654321",
"xDeviceMake": "PAX",
"xDeviceFriendlyName": "POS-Terminal-01"
}{
"xDeviceId": "12345",
"xDeviceSerialNumber": "SN987654321",
"xDeviceMake": "PAX",
"xDeviceFriendlyName": "POS-Terminal-01",
"xStatus": "CONNECTED"
}{
"xDeviceId": "12345",
"xTransactionType": "cc:sale",
"xAmount": 100.00
}{
"xSessionId": "abc123",
"xDeviceId": "12345",
"xTransactionType": "cc:sale",
"xAmount": 100.00,
"xStatus": "IN_PROGRESS",
"xResponseCode": "00",
"xRefNum": "X123456789"
}{
"xError": "dynamic error code",
"xRefnum": "cim123456",
"xResult": "E"
}iFields is a Sola technology that integrates into your payment forms, giving you the ability to design and customize the look and feel of your payment and checkout flows without having to worry about PCI compliance.
Payment forms that leverage iFields technology keep sensitive card data away from merchant servers, keeping you outside of PCI compliance territory. Information that's entered into the standard card number and CVV input fields are sent directly to the Sola gateway via iframes. The gateway immediately returns SUTs (single-use tokens, also referred to as payment nonces) in place of the card and CVV numbers, that are used by the server-side code for processing the transaction. Here is an example of how the iframes work, and the SUTs they return.
Let's get started by understanding the difference between how card information flows through an API-only integration versus one that utilizes iFields.
The customer enters the credit card information into an <input> field on the website checkout page, submitting the data to the website server.
The server sends an HTTP POST request with the transaction information to the Sola gateway for processing using the Sola API.
Sola sends the response back through the server, which forwards it and displays it on the website.
See for more information about request methods.
The customer enters the credit card information into an <iframe> field on the website checkout page, submitting the data to Cardknox CDN.
Sola CDN returns the single-use token (SUT) into a hidden <input> field of the website checkout page, which submits the data to the website server.
The server sends an HTTP POST request with the transaction information to the Sola gateway for processing using the Sola API with the SUT as xCardNum.
See for more information about tokenization.
To use iFields, you’ll need two Sola keys: 1. Your iFields key, which is the public-facing key used in the Javascript 2. Your private Sola merchant key
The Sola iFields key (public-facing key) is for the client-side transaction. The Sola transaction key is for the server-side transaction.
Important note
The iFields solution accomplishes the goal of generating a SUT in place of the card number that will then be sent to your server. A transaction cannot be processed with iFields alone. Once your server obtains the SUT, you'll need to use our Transaction API to send a server-side command to process a transaction. The card number SUT should be sent as "xCardNum" and the CVV SUT should be sent as "xCVV".
See for the server-side commands.
If you use one of the following frameworks, you can set up the iFields integration more easily:
Find the latest version of iFields at:
Add the Cardknox JS file after the <head> tag on your payment page:
Then, add the setAccount() function with the three required parameters which should be called on page load:
In addition to the standard fields necessary for non-sensitive card data, the html should include four additional fields for the form; two fields for the credit card number; and two for the CVV. The first set of fields are iFrame fields to collect the sensitive information, and the second set are hidden input fields that are populated with the SUTs once they are returned by the gateway.
Adding the fields:
First, add these three fields to your form to collect the sensitive card data:
Attention: Be sure to replace the **ifields-version-number** text with the appropriate iFields version number. Get the latest version of iFields at .
Next, add the following two fields that will be populated with the SUTs once the gateway returns them:
Finally, add this field for error handling:
Full Sample HTML:
Attach an event listener to submit event of the form (in our example #payment-form) that contains the following:
A call to the getTokens() function that will pass in a callback to receive the SUTs and populate the hidden fields with them, and then submit the form with all the transaction details to your server-side code for processing. For a full list of server-side calls, see our .
(Available starting in version 2.14)
Enhance your payment security and protect against fraud by enabling 3D Secure Authentication (3DS) in your iFields integration. This requires both client-side and handling.
Call the enable3DS() function during page load to initialize 3DS. This function takes two required parameters:
Function: enable3DS(environment, verifyHandler)
Parameters:
verifyHandler Callback
When the 3DS challenge popup completes, the verifyHandler function is triggered with these parameters:
Sample code:
See code how to finalize the transaction.
After submitting a payment to the , the response will include an xResult value that indicates the status:
A, E, or D — Transaction complete. No further 3DS action is needed.
V — A 3DS challenge is required. You must initiate the challenge step by calling verify3DS().
In a case where the xResult is V, 3D Secure authentication must be completed through a challenge popup. To proceed, call the verify3DS() function and pass the entire transaction response object.
verify3DS(transactionResponse)Sample Code:
Added in version 2.2
A style can be set for each iFields by calling the setIfieldStyle() function and passing in the data-ifields-id value (card-number or cvv) and the JSON with the styles to set.
Each field can be given its own style or use a shared variable to set them all to look the same.
Parameters:
Sample Code:
Added in version 2.2 You can clear the data inside an iFields by calling clearIfield(ifieldName).
Parameters:
Sample Code:
Added in version 2.3
You can allow auto-formatting of the data in the card number field by calling enableAutoFormat(separator).
Parameters:
Sample Code:
Added in version 2.3 You can set focus on an iFields. A common use case for this is if you want the iframes to be focused after page load.
Paramaters:
Sample Code:
Added in version 2.3
You can create a reaction to the changing of data in the iFields as the user types by registering a callback using addiFieldKeyPressCallback(callbackFunction). The callback function can accept a parameter that passes in a JSON object. That object contains non-sensitive information about the data contained in the iFields, such as the validity of the card number/CVV; the length of the data entered; the issuer of the entered card number; and which iFields last had text entered into it. This function can be called multiple times to add multiple callbacks.
Parameters:
Sample Code:
Developers who use multiple keys in their software can eliminate the need to collect a new iFields key from each merchant by using the Vendor ID feature.
Once this feature is enabled by a Sola Support team, the developer is free to use the same iFields key for all transactions. They just need to add an extra parameter to all transactions using the SUTs that were generated with the global iFields key.
The Vendor ID can also be configured to supply a default Software Name.
Sample Code:
The Sola Account Boarding API gives ISV partners the ability to board PayFac accounts directly through their system, rather than from the Partner Portal. Using the Account Boarding API, ISVs can build a form within their system for collecting all the necessary merchant data to onboard Sola Go accounts. Once the ISV submits the application via the API, it is passed along to Sola for instant approval.
This page outlines the configuration process for integrating with Sola's Account Boarding API.
Sola sends the response back through the server, which forwards and displays it on the website. Sola gateway includes an xToken in the response, enabling the merchant to use the xToken to send in any future transactions for that customer.
Parameter
Description
iFields key
Your iFields key Use the iFields key that matches the account that you will submit the transaction to. Ensure you are using the correct key as this does not get validated on the front end. Attention: Do NOT use your API key here, as it will be exposed.
Software name
Name of your software
Software version
Version number of your software
Parameter
Type
Description
Required?
environment
String
Use staging for testing or production for live implementations.
Y
verifyHandler
Function
Callback function that handles the 3DS result and sends it to your server. Your server should finalize the transaction by submitting the 3DS result to our API. See server-side code.
Y
Parameter
Description
x3dsActionCode
The 3DS action code result.
xCavv
Cardholder Authentication Verification Value.
xEci
Electronic Commerce Indicator.
xRefNum
Transaction reference number.
x3dsAuthenticationStatus
Status of the authentication attempt.
x3dsSignatureVerificationStatus
Result of the digital signature verification.
Parameter
Type
Description
transactionResponse
Object
The full transaction response from your initial server-side request.
Parameter
Description
Required?
iFieldName
The name of the iFields to style (valid names are ‘card-number’ or ‘cvv’).
Y
Parameter
Description
Required?
ifieldName
The name of the iFields to style (valid names are ‘card-number’ or ‘cvv’).
Y
Parameter
Description
Required?
Separator
This is the separation character to place between number groups. The default separator is a space. Only a single character should be passed in as the separator.
N
Parameter
Description
Required?
iFieldName
The name of the iFields to style (valid names are ‘card-number’ or ‘cvv’).
Y
Parameter
Description
Required?
callbackFunction
The function to call after the text in an iFields is changed.
Y
Parameter
Description
Sample
xVendorId
The parameter that tells the gateway which developer is performing the transaction. If the value matches the account of the iFields key, the gateway will allow the transaction to work even though the API and iFields keys are from different accounts.
123456
Visualize and interact with the API using Swagger UI. Please note that only sandbox keys may be used when submitting accounts and the Signature.Token field is not required.
Description: The GetTierNames endpoint gives a list of available tiers that can be passed along to the SubmitGoApp request.
Method: POST
Input: JSON
Parameter
Type
Description
Required
ApiKey
String
Authentication credentials
True
Parameter
Description
status
Success
Error
refnum
error
Error Code
Error Message
tiers
List of available tiers
Sample Success Response:
Sample Error Response:
Description:
The SubmitGoApp endpoint validates the request and generates an application if the account associated with the API key is authorized to board Sola Go accounts. If it is a Sandbox request, the equipment will be created immediately.
Method: POST
Input: JSON
Parameter
Type
Description
Required
ApiKey
String
Authentication Key
True
TierName
String
Name of tier
True
CorporateName
String
Click here for more information on how to obtain tokens.
BankingDetails
Field Name
Description
BankName
String, Required
RoutingNumber
String, Required, must be a valid 9-digit routing number
AccountNumber
String, Required, numeric value between 6 and 17 characters
SignerDetails
Field Name
Description
SSN
String, Required
DateOfBirth
Date, Required, minimum age is 18
FirstName
String, Required
LastName
String, Required
Address
Address, Required
Address
Field Name
Description
StreetAddress
String, Required
City
String, Required
State
String, Required, 2 digit state code
Zip
String, Required, 5 digits
Country
String, Optional
Signature
Field Name
Description
Token
Token from the terms and conditions confirmation, Required
For production accounts, it must be set to a valid value
Sample Request
Parameter
Description
Status
Success
Error
Refnum
Error
Error Code
Error Messages - List of errors
AppId
Sample Success Response
Sample Error Response:
Navigating through a sea of technical terms, phrases, and acronyms can be confusing, even for someone familiar with the payment processing industry. Here is a list of some of the most commonly used payment processing terms to help you.
A B C D E F G H I K L M N O P S T V Z #
A unique sequence of numbers assigned to a cardholder account that identifies the issuer and type of financial transaction card.
A tool that, in conjunction with tokenization, automatically keeps credit cards in the Sola data vault updated to ensure subsequent transactions are not declined.
Automated Clearing House – Electronic network used to transfer money and payment information between bank accounts. See for more information.
A licensed member that maintains the merchant relationship and acquires the data relating to a transaction from the merchant or card acceptor and submits that data into interchange, either directly or indirectly.
Automatic Funds Transfer – A transaction in which funds are securely transferred from one bank account to another via electronic or telecommunications technology.
Anti-Money Laundering – A set of laws, regulations, and procedures intended to prevent criminals from disguising illegally obtained funds as legitimate income. See KYC for more information.
A yearly fee charged by some independent sales organizations (ISOs) and acquirers to maintain a merchant’s account. This is also called a renewal fee, subscription fee, or membership fee.
Application Programming Interface – A technological interface or communication protocol between a client and a server intended to simplify the building of client-side software. See for more information.
Automated Teller Machine – An unattended, magnetic stripe-reading or EMV (Europay, Mastercard®, and Visa®) chip-enabled terminal that dispenses cash, accepts deposits and loan payments, enables a bank customer to order transfers among accounts, and make account inquiries.
A process defined in operations regulations whereby a transaction is approved by or on behalf of an issuer; commonly understood to be receiving of a sales validation by the merchant, telephone, or authorization terminal.
A code notifying you that you have obtained the authorization for a specific card transaction.
Address Verification System – Also referred to as Address Verification Service, AVS is a system used to verify whether the billing address given by the customer matches the credit card used for the transaction. This system checks the billing address of the credit card provided by the user with the address on file at the credit card company. If a merchant chooses not to use AVS, Visa and Mastercard will not support their transactions and will charge an additional percentage on those sales.
Sola feature that enables the AVS response to occur before the authorization so that if the transaction is declined, there is no temporary hold on the customer’s card.
A debit or credit card issued by an issuing bank. Also referred to as “bankcard.”
A collection of credit card transactions saved for submitting at one time, usually each day. Merchants who do not have real-time verification systems must submit their transactions manually through a point-of-sale (POS) terminal. Batch fees are charged to encourage a merchant to submit his or her transactions at one time, rather than throughout the day.
Browser-Based POS – Sola application that allows a POS running in a browser to accept EMV payments while remaining out of PCI scope.
The interval between periodic billings for goods sold or services rendered, typically sent on a monthly basis.
Bank Identification Number – The first 6 digits of a credit or debit card number. Also referred to as Issuer Identification Number (IIN)
A payment card industry governing body that sets rules and interchange rates. Visa, Mastercard, Discover, and American Express are the four largest card associations in North America.
The customer to whom a card has been issued, or the individual authorized to use the card.
A chargeback occurs when a cardholder disputes a credit card transaction with his or her credit card issuer. The card issuer initiates a chargeback against the merchant account. The amount of the disputed transaction is immediately withdrawn from the merchant’s bank account, and the merchant has 10 days in which to dispute the chargeback with supporting documentation such as proof of purchase, customer signature, proof of delivery, etc. A chargeback is ultimately decided and resolved by the card association. A chargeback fee is usually assessed to the merchant on top of the actual transaction. See also Retrieval request.
A bill of exchange or draft on a bank drawn against deposited funds to pay a specified sum of money to a specified entity (e.g., a person or business) on demand. A check is considered cash and is negotiable when endorsed.
The collection of funds on which a check is drawn and payment of those funds to the holder of the check.
The process of exchanging financial transaction details between an acquirer and an issuer to facilitate posting of a cardholder’s account and reconciliation of a customer’s settlement position.
Funds represented by checks or drafts that pass between banks through the Federal Reserve system.
Card Not Present – A transaction made with a payment card in which the customer does not physically present the card to the merchant at the time of the transaction. Examples include online, mobile, and MOTO transactions.
A voice authorization code that you might initiate when you suspect a card is stolen or counterfeit, or when a customer is acting suspiciously.
A payment method that uses near field communication (NFC) technology to enable purchases using an NFC-enabled EMV chip card, or other payment-enabled device such as a mobile phone, at the point of sale without having physical contact with the payment terminal. See NFC for more information.
A refund or return of goods by a consumer to the merchant.
A transaction card bearing an account number assigned to a cardholder with a credit limit that can be used to purchase goods and services and to obtain cash disbursements on credit. The cardholder is subsequently billed by an issuer for repayment of the credit extended at once or on an installment basis.
Merchant services providers that handle the details of processing credit card transactions between merchants, issuing banks, and merchant account providers. Also referred to as “third-party processors.”
The process by which the transaction currency is converted into the currency of settlement or the currency of the issuer for the purpose of facilitating transaction authorization, clearing, and settlement reporting. The currency of transaction is determined by the acquirer; the currency of the issuer is the preferred currency used by the issuer, and most often, the currency in which the cardholder will be billed.
Card Verification Value – Security feature used with card-not-present transactions. The CVV is a 3- or 4-digit code either printed or embossed on a credit or debit card. Also known as Card Security Code (CSC). Issuer variations:
• American Express, Discover – CID • Mastercard – CVC,CVC2 • Visa – CVV, CVV2
Dynamic Currency Conversion – A credit card processing solution that allows merchants to offer international customers the choice to pay with Visa and Mastercard in either their local currency, or the merchant’s base currency.
The exchange rate includes a 3% margin which is displayed on the receipt along with the conversion. By paying in their local currency, tourists and business travelers can make informed decisions about their purchases and feel confident knowing the exact amount they are paying. In addition, cardholders have the choice of opting out and paying without converting the sale to avoid being charged international fees when their issuer does not charge. Revenue split is available to merchant.
A transaction card used to initiate a debit transaction. In general, these transactions are used primarily to purchase goods and services and to obtain cash, for which the cardholder’s asset account is debited by the issuer.
Fees based on the debit network that issues the debit card. Debit fees are comprised of network fees and transaction fees, and usually consist of a flat fee and a statement fee.
Sola feature that enables a transaction to be re-routed to an alternate processor if the transaction was initially declined.
A consumer account set up to allow e-commerce transactions through a particular credit card processing system. Before the consumer can make a purchase, he or she must first establish an account with the credit card processor, who provides an identification number and password. The consumer can then make purchases at any Web site that supports the digital wallet system.
The rate charged to a merchant for payment processing services on debit and credit card transactions.
Electronic Benefits Transfer – An electronic system used in the United States that allows state welfare departments to issue benefits via a magnetically encoded payment card. See for more information.
The buying and selling of goods and services, or the transmitting of funds or data, over an electronic network, primarily the Internet. These business transactions occur either as business-to-business (B2B), business-to-consumer (B2C), consumer-to-consumer, or consumer-to-business.
Electronic draft capture – A system in which the transaction data is captured at the merchant location for processing and storage.
Electronic funds transfer – A paperless transfer of funds initiated from a terminal, computer, telephone instrument, or magnetic tape.
Europay, MasterCard and Visa – EMV is a global standard created by Europay, Mastercard, and Visa for authenticating payment card transactions. See for more information.
A credit or debit card with an embedded microchip and associated technology designed to enable secure payments at compatible point-of-sale terminals. Also referred to as “chip card,” “PIN-and-chip,” and “smart card.” See for more information.
Enterprise Resource Planning – Software application used to integrate all of the processes needed to run a company with a single system.
WIC (Women, Infants, and Children) – WIC is a federal grant program designed to provide supplemental nutritious food and nutrition education to low-income pregnant, breastfeeding, and non-breastfeeding postpartum women, and to infants and children up to age five who are found to be at nutritional risk. An eWIC card is WIC’s electronic payment card issued to participants in the program used to obtain nutrition benefits. See also “EBT card.” See for more information.
A bank that, along with its branches, is one of 12 banks that make up the Federal Reserve System. The role of each Federal Reserve Bank is to monitor the commercial and savings banks in its region to ensure that they follow Federal Reserve Board regulations. The reserve banks act as depositories for member banks in their regions, providing money transfer and other services.
An institution that collects funds from the public to place in financial assets such as stocks, bonds, money market instruments, bank deposits, or loans. Depository institutions such as banks, savings and loans, credit unions, and savings banks, pay interest on deposits and invest the deposit money mostly in loans.
A specific dollar limit used to determine which card transactions you must authorize. For example, if your business has a floor limit of $1,000, you must get authorization for any transaction over that amount. Note: All airline, telephone, and mail order transactions must be authorized, even if the amount is under your floor limit.
A wrongful or criminal deceptive activity used to obtain money, assets, or other property.
Option that enables a merchant the flexibility to process transactions under their own merchant account. The Sola gateway-only option also offers pre-processing functions such as fraud screening and processor routing.
A portion of the revenue from a merchant’s credit card transactions held in reserve by the merchant account provider to cover possible disputed charges, chargeback fees, and other expenses. Also referred to as a “reserve.” After a predetermined time, holdbacks are turned over to the merchant. Note: merchant account providers almost never pay interest on holdbacks.
A Sola technology solution that integrates into your payment forms, enabling you to design and customize the look and feel of your payment and checkout flows. You can process transactions without having sensitive card data touch your server, keeping you out of PCI scope.
Sola's proprietary Interchange Qualification Monitoring (IQM) technology that gathers transaction data and routes every transaction to the payment processing platform that can process the payment for the lowest cost.
The fee that the card association charges the merchant to get the funds into the merchant’s bank (acquiring bank) and to get the billing information to the cardholder’s bank (issuing bank). Interchange fees are determined based on credit card regulations and how the appropriate data is captured, including card swipe or dip, address, and electronic signature as needed. These fees are also based on the timeliness of the settlement of transactions.
Independent Sales Organization – A company that sells credit card processing services independently from a financial firm or bank, allowing a business to accept credit card payments.
The member bank that enters into a contractual agreement with card associations to issue cards.
The bank that maintains the consumer’s credit card account and which must pay out to the merchant’s account in a credit card purchase. The issuing bank bills the customer for the debt.
Independent Software Vendor – An individual or organization that develops, markets, and sells software products that run on third-party software and hardware platforms.
Interactive Voice Response – Technology that allows a computer to interact with humans through the use of voice and dual tone multi-frequency (DTMF) signal input using a touch tone keypad. In telecommunications, IVR allows customers to interact with a company’s host system via a telephone keypad or by speech recognition. See for more information.
Know Your Customer – The process of a business identifying and verifying the identity of its clients and assessing their suitability, along with the potential risks of illegal intentions towards the business relationship. The term is also used to refer to the bank regulations and anti-money laundering regulations which govern these activities.
A rewards program a merchant offers to its customers who meet certain criteria, such as making frequent purchases.
The magnetically encoded stripe on the bank card that contains information pertinent to the cardholder account. The physical and magnetic characteristics of the magnetic stripe are specified in ISO Standards 7810, 7811, and 7813.
A device that reads information recorded on the magnetic stripe of a card. Also known as a “card swipe reader.”
Multi Currency Pricing – An e-commerce solution that converts the merchant’s base currency into the customer’s foreign currency. Merchants are funded in US currency at a guaranteed rate without any fluctuation risk.
An institution that participates in the programs offered by card associations such as issuers and acquirers.
A retailer, or any other person, firm, or corporation that (pursuant to a merchant agreement) agrees to accept credit cards, debit cards, or both, when properly presented.
A specialized bank-approved and issued account to process credit card transactions. It is one of three parts needed to accept credit cards. The other required parts are a local bank checking account (to deposit funds) and a processing solution (to access the merchant account) such as a terminal or gateway.
A bank that has entered into an agreement with a merchant to accept deposits generated by bank card transactions; also referred to as the “acquirer” or “acquiring bank.”
The number that a financial institution assigns to a merchant to identify the business.
Payment made with a mobile payment application using a mobile device such as a smartphone or tablet. Examples include Apple Pay, Cash App, Google Pay, Venmo, and Zelle.
The minimum amount in fees and percentages charged by a merchant services provider in a given month. If account activity does not generate the monthly minimum, the account holder must make up the difference.
The discount rate charged by the merchant account provider for credit card transactions in which the actual credit card was not available to the merchant. MOTO discount rates are generally higher than swipe discount rates to account for the increased chance of fraud or nonpayment.
Near Field Communication – A set of communication protocols that enable two electronic devices, one of which is usually a portable device such as a smartphone, to establish communication by bringing them within 1 to 2 inches of each other.
Technical solution enabling a merchant to accept cashless payments across all channels, including online, in-store, mobile, e-wallet, and MOTO.
Payment Facilitator – Merchant service provider that simplifies the merchant account enrollment process by enabling a business to sign up as a sub-merchant under the payment facilitator’s merchant account.
A service provider that allows merchants to process mobile or e-commerce payments. Payment aggregators enable businesses to accept credit and debit card payments without setting up a merchant account through a bank.
Payment Card Industry Data Security Standard – The PCI information security standard for organizations that handle branded credit cards from the major card issuers.
The PCI Standard is mandated by the card brands but is administered by the Payment Card Industry Security Standards Council (PCI SSC). The standard was created to increase controls around cardholder data to reduce credit card fraud. Validation of compliance is performed annually or quarterly, either by an external Qualified Security Assessor (QSA) or by a firm specific Internal Security Assessor (ISA) that creates a Report on Compliance for organizations handling large volumes of transactions, or by Self-Assessment Questionnaire (SAQ) for companies handling smaller volumes.
A set of requirements developed by the PCI SSC to ensure that companies that store, transmit, or process credit card data comply with the highest standards of security. Within the PCI DSS standards, there are 4 levels of PCI compliance. These levels are based on the annual number of transactions for any given merchant.
PCI DSS Level 1 is the highest level of compliance and is defined as follows:
Processing greater than 6 million Mastercard or Visa transactions annually, OR, A merchant that has experienced an attack resulting in compromised card data, OR, A merchant deemed Level 1 by a card association
Payment Card Industry Security Standards Council – Global forum that brings together payments industry stakeholders to develop and drive adoption of data security standards and resources for safe payments worldwide.
The code that transmits a customer’s order to and from a merchant’s bank’s transaction-authorizing agent, usually a merchant account provider. See also “real-time processing.” See for more information about the Sola payment gateway.
A company that provides code and/or software for an e-commerce site enabling it to transfer information from its shopping cart to the acquiring bank, and on through the rest of the credit card transaction process. See also “payment gateway.”
Personal Identification Number – A four-to-twelve character secret code that allows an issuer to positively authenticate the cardholder for the purpose of approving an ATM or terminal machine transaction occurring at a point-of-interaction device.
Secure PIN debit card processing feature which results in the lowest processing fees.
A software component, also called an extension, that adds a specific feature to an existing program to enable customization.
Point of Sale – A location where a transaction takes place between a merchant and a customer when a product or service is purchased, commonly using a point-of-sale system to complete the transaction. POS can also refer to point-of-sale hardware and software, such as electronic cash register systems, touch-screen displays, barcode scanners, and receipt printers.
A device that allows a customer to swipe, tap, or insert a credit card to make a charge. Also known as a “terminal machine.” See for more information.
A 6-digit alphanumeric string of characters that form part of a postal address in Canada that follows the province or territory abbreviation.
A device, software, or virtual product that allows a merchant to connect to a merchant account. Without a processing solution like a credit card terminal, there would be no way to verify, approve, and deposit credit card transactions.
Payment Service Provider – A company that combines the functions of both a payment gateway and a payment processor, and can connect to multiple acquiring and payment networks.
Point-to-Point Encryption – a security standard created by the Payment Card Industry (PCI) to ensure payment card data remains secure from the beginning to the end of the transaction process.
The process of having a customer’s credit card information validated and processed automatically and in real-time. The credit card will be charged and the money will be deposited into your bank account all automatically.
A hardcopy document representing a transaction that took place at the point of sale, with a description that usually includes the transaction date, merchant name/location, primary account number, amount, and reference number.
Regularly occurring charges for maintaining a merchant account. Recurring fees include the discount rate, transaction fees, statement fee, and monthly minimum.
Regularly scheduled customer payments that occur over time at specific intervals, such as daily, weekly, monthly, quarterly, or annually.
Money returned to a customer in exchange for the return of purchased goods or services, or when the purchased goods or services were unsatisfactory or unfulfilled.
See “Holdback.”
A retrieval request occurs when a cardholder cannot remember a credit card transaction, or when the bank wants order information. The card issuer initiates the retrieval request, and the merchant has 10 days to respond with the order information or the retrieval request will turn into a chargeback. Retrieval requests usually include a fee issued against the merchant.
A 9-digit number established by the American Bankers Association (ABA) used to identify a bank or financial institution when clearing funds or processing checks. Also referred to as a routing transit number.
Software Development Kit – A collection of software used for developing applications for a specific device or operating system. SDKs typically include a compiler, which is used to create applications from source code files, and an integrated development environment (IDE) enabling a developer to write source code, fix program errors, and edit a program’s graphical user interface (GUI). See for more information.
Secure Socket Layer – A system for encrypting data sent over the Internet, including e-commerce transactions and passwords. With SSL, client and server computers exchange public keys, allowing them to encode and decode their communication.
The process by which merchant and cardholder banks exchange financial data and value resulting from sales transactions, cash disbursements, and merchandise credits.
Fees charged for establishing a merchant account, including application fees, software licensing fees, and equipment purchases.
A payment transaction card that contains an embedded computer chip (either a memory chip or a microprocessor) that stores and transmits data. This data is usually associated with either value, information, or both and is stored and processed within the card’s chip.
A transaction card, such as a gift card or prepaid card, containing a computer chip that can store electronic “money.” Unlike a credit card, a stored-value card can only spend out the dollar amount its owner has already put into the card account. It is similar in function to a prepaid calling card but is available for all purchases.
A recurring payment that occurs on a regular, fixed schedule. Examples include memberships, charitable donations, and rent.
The discount rate charged by a merchant account provider for transactions in which a credit card is available for inspection by the merchant. Swipe discount rates are generally lower than MOTO discount rates because the merchant can match signatures and perform other checks for fraud or misuse.
An exchange or transfer of goods, services, or funds between a customer and a merchant.
The date on which a cardholder effects a card purchase of goods, services, or other things of value, or effects a cash disbursement.
A charge for each credit card transaction, collected by the merchant account provider or ISO.
A process that replaces sensitive cardholder data with a string of unique characters to safeguard payment card information during a transaction.
Value Added Reseller – A company that adds features or services to an existing product, then resells it (usually to end-users) as an integrated product or complete turnkey solution.
Identifies a transaction canceled by a merchant before it settles through a customer’s payment card account.
A 5- to 9-digit numeric code used by the United States Postal Service (USPS) to identify a particular postal delivery area in the United States. The 9-digit code is referred to as “ZIP+4” with the last 4 digits identifying a specific delivery route within a delivery area.
A set of fraud prevention protocols that enables a real-time, secure, information-sharing connection between merchants, payment networks, and financial institutions to authenticate customers more accurately and reduce fraud in card-not-present transactions. Each card network (Visa, Mastercard, American Express, and Discover) has their own version of 3-D Secure.
3D Secure version 2.0 improvements over version 1.0: Stronger authentication methods – Biometric and risk-based authentication methods replace static passwords
Improved customer experience – No need to enter a password or complete a sign-up form
Browser-based and in-application support for more devices – Enables mobile, in-app, and digital wallet payment applications
<script src="https://cdn.cardknox.com/ifields/**ifields-version-number**/ifields.min.js" />setAccount("iFields key", "Software name", "Software version")<iframe data-ifields-id="ach" data-ifields-placeholder="Checking Account Number" src="https://cdn.cardknox.com/ifields/**ifields-version-number**/ifield.htm"></iframe>
<iframe data-ifields-id="card-number" data-ifields-placeholder="Card Number" src="https://cdn.cardknox.com/ifields/**ifields-version-number**/ifield.htm"></iframe>
<iframe data-ifields-id="cvv" data-ifields-placeholder="CVV" src="https://cdn.cardknox.com/ifields/**ifields-version-number**/ifield.htm" ></iframe><input name="xACH" data-ifields-id="ach-token" type="hidden" />
<input name="xCVV" type="hidden" data-ifields-id="cvv-token" />
<input name="xCardNum" type="hidden" data-ifields-id="card-number-token" /><label data-ifields-id="card-data-error" style="color: red;"></label><head>
<script src="https://cdn.cardknox.com/ifields/**ifields-version-number**/ifields.min.js" />
</head>
<body>
<form id=”payment-form”>
<iframe data-ifields-id="ach" data-ifields-placeholder="Checking Account Number" src="https://cdn.cardknox.com/ifields/**ifields-version-number**/ifield.htm"></iframe>
<input data-ifields-id="ach-token" name="xACH" type="hidden" />
<iframe data-ifields-id="card-number" data-ifields-placeholder="Card Number" src="https://cdn.cardknox.com/ifields/**ifields-version-number**/ifield.htm"></iframe>
<input data-ifields-id="card-number-token" name="xCardNum" type="hidden" >
<iframe data-ifields-id="cvv" data-ifields-placeholder="CVV" src="https://cdn.cardknox.com/ifields/**ifields-version-number**/ifield.htm" ></iframe>
<input data-ifields-id="cvv-token" name="xCVV" type="hidden" >
<!--And a field for all errors from the iFields-->
<label id="transaction-status"></label>
<label data-ifields-id="card-data-error" style="color: red;"></label>
<!--Submit button-->
<input id="submit-btn" type="submit" value="Submit">
</form>
</body>setAccount("your-public-facing-key", "your-software-name", "0.1.2");
document.getElementById('payment-form').addEventListener('submit', function(e){
e.preventDefault();
var submitBtn = document.getElementById('submit-btn');
submitBtn.disabled = true;
getTokens(
function() {
document.getElementById('payment-form').submit();
},
function() { //onError
submitBtn.disabled = false;
},
30000, //30 second timeout
);
});// Enable 3D Secure (3DS)
enable3DS('staging', verifyHandler); // or 'production'
function verifyHandler(x3dsActionCode, xCavv, xEci, xRefNum, x3dsAuthenticationStatus, x3dsSignatureVerificationStatus) {
// Prepare authentication result data
const postData = {
x3dsActionCode,
xCavv,
xEci,
xRefNum,
x3dsAuthenticationStatus,
x3dsSignatureVerificationStatus
};
// Send to your server and finalize the transaction
}if (transactionResponse.xResult === 'V') {
// Triggers the 3DS challenge popup
verify3DS(transactionResponse);
} else {
// No additional 3DS action needed
console.log("Transaction complete.");
}let style = {
border: '1px solid black',
font-size: '14px',
padding: '3px',
width: '250px'
};
setIfieldStyle('card-number', style);
setIfieldStyle('cvv', style);cleariField(‘cvv’);enableAutoFormatting(‘-‘); will show 4444-3333-2222-1111focusIfield(‘card-number’);addIfieldKeyPressCallback(function(data) {
console.log('card number is ' + (data.cardNumberIsValid ? 'valid' : 'invalid');
});addIfieldKeyPressCallback(function(data) {
setIfieldStyle('card-number', data.cardNumberFormattedLength <= 0 ? defaultStyle : data.cardNumberIsValid ? validStyle : invalidStyle);
if (data.lastIfieldChanged === 'cvv'){
setIfieldStyle('cvv', data.issuer === 'unknown' || data.cvvLength <= 0 ? defaultStyle : data.cvvIsValid ? validStyle : invalidStyle);
} else if (data.lastIfieldChanged === 'card-number') {
if (data.issuer === 'unknown' || data.cvvLength <= 0) {
setIfieldStyle('cvv', defaultStyle);
} else if (data.issuer === 'amex'){
setIfieldStyle('cvv', data.cvvLength === 4 ? validStyle : invalidStyle);
} else {
setIfieldStyle('cvv', data.cvvLength === 3 ? validStyle : invalidStyle);
}
} else if (data.lastIfieldChanged === 'ach') {
setIfieldStyle('ach', data.achLength === 0 ? defaultStyle : data.achIsValid ? validStyle : invalidStyle);
}
});{
"xCommand": "cc:sale",
"xSoftwareVersion": "1.0.0",
"xVersion": "5.0.0",
"xSoftwareName": "Cardknox Test",
"xKey": "test1",
"xAmount": "1",
"xCardnum": "4000000000001111;sut_02_1_cc_visa_keyed_01_20230417T134931Z_7200_hf-jrfg-2_e949b687b122457da8513f81d175ced2_e9b71c6bf1125748a6362ae90f28ed9f5024bedf438a7c3046ec1a1ccd226958",
"xCvv": "xxx;sut_xx_x_cvv_xx_xxxxxxxxTxxxxxxZ_xxxx_hf-jrfg-x_xxcxbfxaxxxxxxxcxxxxaxexxxxefxac_bbxxfxdxecaxxcxxexxxxxxxxaxdxxxxcdxxxfxxxfaxxfxxxxxxdcaxxxaxxbax",
"xExp": "1234",
"xVendorId": "123456"
}{
"apiKey": "0d48f767f1d34d088ae59a214fe11e25"
}{
"tiers": [
"123_tier1",
"123_tier2"
],
"refnum": "brd258465289",
"status": "Success"
}{
"refnum": "brd258465289",
"status": "Error",
"error": {
"errorCode": "AccessDenied",
"errorMessages": [
"Access Denied"
]
}
}{
"apiKey": "{{API_KEY}}",
"tierName": "{{TIER}}",
"corporateName": "Acme Corp",
"dbaName": "Acme Corporation",
"annualCreditCardSales": "80000",
"monthlySalesVolume": 1000,
"highTicket": 500,
"averageTicket": 250,
"ownershipType": "corporation",
"businessStartDate": "2005-08-01",
"agentName": "John Smith",
"agentEmail": "[email protected]",
"website": "http://www.acmecorporation.com/",
"taxId": "225555555",
"businessEmail": "[email protected]",
"businessPhone": "800-555-1212",
"businessAddress": {
"streetAddress": "1213 Main Street",
"city": "Anytown",
"state": "AL",
"zip": "11111",
"country": "United States"
},
"mailingAddress": {
"streetAddress": "1213 Main Street",
"city": "Anytown",
"state": "AL",
"zip": "11111",
"country": "United States"
},
"productSold": "Convenience Goods",
"bankingInformation": {
"bankName": "Chase",
"routingNumber": "021000021",
"accountNumber": "454545454545"
},
"secondaryBankingInformation": {
"bankName": "Chase",
"routingNumber": "121122676",
"accountNumber": "898989898989"
},
"signerInformationList": [
{
"ssn": "115668989",
"dateOfBirth": "1955-07-14",
"firstName": "Robert",
"lastName": "Brown",
"address": {
"streetAddress": "1213 Main Street",
"city": "Anytown",
"state": "AL",
"zip": "11111",
"country": "United States"
},
"ownershipPercentage": 100,
"title": "Owner",
"ownerCellPhone": "222-333-4444"
}
],
"signature": {
"token": ""
}
}{
"appId": 9854,
"refnum": "brd221002160",
"status": "Success"
}{
"status": "Error",
"error": {
"errorCode": "BadRequest",
"errorMessages": [
"BusinessAddress.State: The State field is required.",
"SignerInformationList[0].SSN: The SSN field is required."
]
}
}Business’s legal name
True
DBAName
String
Business’s DBA Name, if no DBA default to CorporateName
True
AnnualCreditCardSales
Number
Credit card sales for the last full year
False
OwnershipType
Enum
Ownership structure
Valid values are:
SoleProprietor
Partnership
Corporation
SoleOwnership
LLC
NonProfit
True
BusinessStartDate
Date
Start date of the business in YYYY-MM-DD format
True
AgentName
String
Full name of primary agent
False
AgentEmail
String
Email address of primary agent
False
Website
String
Business website *Required field if Ecommerce tier is being used
False
TaxId
String
Business EIN / Tax Identification Number
True
BusinessEmail
String
Business email address
True
BusinessPhone
String
Business phone number (format: 000-000-0000)
True
BusinessAddress
Object
Object containing business address fields
True
MailingAddress
Object
Object containing business mailing address fields
True
ProductSold
String
Short description of product sold
True
BankingInformation
Object
Object containing banking information including bank name, routing number, and account number
True
SecondaryBankingInformation
Object
Object containing banking information including bank name, routing number, and account number
False
SignerInformationList
Object
Object containing signer information
True
Signature
Object
Signature Object contains the Token string. Token is from the terms and conditions confirmation.
For production accounts, it must be set to a valid value.
True
AverageTicket
Number
Average value of each sale
True
MonthlySalesVolume
Number
Credit card sales for the last full month
True
HighTicket
Number
Largest ticket size
True
OwnershipPercentage
Decimal, Required
Title
String, Required
Valid Values:
Treasurer
Owner
Partner
CEO
Secretary
Director
Other
Sole Proprieter
OwnerCellPhone
String, Required (format: 000-000-0000)
The Sola Reporting API enables you to generate transaction reports based on specified parameters, such as date ranges. Reports can be created for single accounts or multiple accounts.
Base URL:
Sola reporting API allows you to send the data in FormData and JSON formats. Add to the base URL any of the following formats to indicate which format you are sending it as:
Method: POST The Cardknox gateway requires the POST method to be used for enhanced security. We do not support the GET method.
Submit the first request.
If xRecordsReturned equals xReportingMaxTransactions, submit another report request and adjust the beginning date and time according to the last transaction returned.
Available filtering options include the following:
Required Parameters
For date-based reports, you can filter results using the following operators for any of the reporting fields:
To customize the transaction parameters included in a generated report, you can utilize the "xFields" parameter and specify the desired field names. Refer to the available parameters listed .
Available report types include the following:
xCommand: Report:Approved
The Report:Approved command returns the following transactions:
CC:Sale
CC:Capture
CC:PostAuth
CC:Save
The Report:Approved command does not return authorization-only transactions that have not been captured.
Required Parameters
xCommand: Report:Declined
The Report:Declined command returns the following transactions:
CC:Sale
CC:AuthOnly
CC:Capture
CC:PostAuth
Required Parameters
xCommand: ReportAuth
The Report:Auth command returns the following transaction:
CC:AuthOnly
The ReportAuth command only returns approved authorizations.
Required Parameters
xCommand: Report:All
The Report:All command returns the following transactions:
CC:Sale
CC:AuthOnly
CC:Capture
CC:PostAuth
Required Parameters
Optional Field: xBatch:[batch#]to get only the transactions of a specific batch.
xCommand: Report:Deposit
The Report:Deposit command will only return valid responses for accounts that have ongoing ACHQ activity. The Deposit ID given as a parameter must be an ACHQ deposit ID and the values shown in the response are only pertaining to ACHQ transaction activity.
The Report:Deposit command returns the following values:
Deposit Id
Deposit Date
Total Amount
Transactions
Required Parameters
*Either xDepositId or xBeginDate and xEndDate are required.
Single transaction
report:transaction
xCommand: Report:Transaction
Required Parameters
report:transactions
xCommand: Report:Transactions
Required Parameters
xCommand: Report:Related
Required Parameters
xCommand: Report:GiftApproved
Required Parameters
Response Fields
xCommand: Report:GiftSummary
Required Parameters
Response Fields
xCommand: Report:Liability
Required Parameters
Response Fields
Obtain batch summary by date
report:batch
xCommand: Report:Batch
Required Parameters
You can use the Reporting API feature to send a receipt for a completed transaction.
Use the following Sola URL:
This Object contains Google Pay response.


Samples: report:all, report:approved
Use for fields that do not include your search string, but sometimes also include other information.
xCardLastFour=a!4444
an
Not In
Shows results that don’t have the value you enter.
xBillPhone=an212
as
Ends With
Use when you know what your value starts with.
xName=asJane
ae
Ends With
Use when you know what your value ends with.
xEmail=aeOrg
CC:Credit
CC:Refund
CC:Save
CC:Credit
CC:Refund
CC:Save
CC:Credit
CC:Refund
Refnum
Amount
Version number of your software
The current version is 4.5.8
xFields
Optional. If not used, returns all fields
Version number of your software
The current version is 4.5.8
xFields
Optional. If not used, returns all fields
xCommand
Transaction type
Report:Transaction
xRefnum
Reference number
xEmail
Email address of receipt destination
Parameter
Description
Comment
xKey
Credential
Max Size: 250 Alphanumeric Characters
Parameter
Description
Comment
xVersion
Gateway API version
The current version is 5.0.0
xSoftwareName
The name of your software
xSoftwareVersion
Version number of your software
2.1
xCommand
xReturnDownloadURL
A boolean flag indicating if response should include xReportURL to use for downloading the results instead of xReportData.
If you are running reports that are returning more than 5MB of data we recommend that you use this parameter. The URL returned is valid for 5 minutes.
FormData
/report
JSON
/reportjson
Parameter
Description
Sample Value
xgetnewest
Returns the most recent transactions in the requested date range
True/False
xmaxrecords
Sets the maximum number of records to return on the report
Integer value between 1 – 1000*
If the date range on the report is within 24 hours you can request up to 5000 transactions
Parameter
Operator
Description
Example
ai
In
Use for an exact match.
xBillCountry=aiCanada
a=
Like
Use for fields that include your search string, but sometimes also include other information.
xAmount=a=40
a!
Parameter
Description
Sample Value
xFields
Specify parameters to be returned in the report.
xrefnum, xcommand, xname, xmaskedcardnumber, xtoken, xamount, xentereddate, xresponseresult
Parameter
Description
Sample Value
xBeginDate
Transaction begin date in YYYY-MM-DD or YYYY-MM-DD HH:MM:SS format
2020-01-01
2019-08-15 09:00:00
xEndDate
Transaction end date in YYYY-MM-DD or YYYY-MM-DD HH:MM:SS format
2019-10-31
2020-06-30 12:00:00
Parameter
Description
Sample Value
xBeginDate
Transaction begin date in YYYY-MM-DD or YYYY-MM-DD HH:MM:SS format
2020-01-01
2019-08-15 09:00:00
xEndDate
Transaction end date in YYYY-MM-DD or YYYY-MM-DD HH:MM:SS format
2019-10-31
2020-06-30 12:00:00
Parameter
Description
Sample Value
xBeginDate
Transaction begin date in YYYY-MM-DD or YYYY-MM-DD HH:MM:SS format
2020-01-01
2019-08-15 09:00:00
xEndDate
Transaction end date in YYYY-MM-DD or YYYY-MM-DD HH:MM:SS format
2019-10-31
2020-06-30 12:00:00
Parameter
Description
Sample Value
xBeginDate
Transaction begin date in YYYY-MM-DD or YYYY-MM-DD HH:MM:SS format
2020-01-01
2019-08-15 09:00:00
xEndDate
Transaction end date in YYYY-MM-DD or YYYY-MM-DD HH:MM:SS format
2019-10-31
2020-06-30 12:00:00
Parameter
Description
Sample Value
xSecondaryKeys
Run a report for secondary accounts.
For multiple account keys, you can include comma-separated values.
Bread_Butter_xxxdxxxecbxxxxaxxxdbexxx, Other_Account_xxxxfxxxexxfxxxfxbxxx, Yet_Another_Account_xxxbexaxxddxxbabbxexcxxxafxfexx
Parameter
Description
Sample Value
xDepositId*
xBeginDate*
Begin date in YYYY-MM-DD or YYYY-MM-DD HH:MM:SS format
2020-01-01
2019-08-15 09:00:00
xEnd Date*
End date in YYYY-MM-DD or YYYY-MM-DD HH:MM:SS format
2019-10-31
2020-06-30 12:00:00
Parameter
Description
Sample Value
xRefnum
Reference number
Multiple reference numbers are comma delimited.
This value is required only if you do not enter an Invoice number.
r10000001
r10000001,r2000001,r3000001
Parameter
Description
Sample Value
xRefnum
Reference number
Multiple reference numbers are comma delimited.
This value is required only if you do not enter an Invoice number.
r10000001
r10000001,r2000001,r3000001
xInvoice
Invoice number
Multiple invoice numbers are comma delimited.
This value is required only if you do not enter a Reference number.
1234
1234,5678,9012
Parameter
Description
Sample Value
xRefnum
Reference number
Multiple reference numbers are comma delimited.
This value is required only if you do not enter an Invoice number.
r10000001
r10000001,r2000001,r3000001
xKey
Your Sola API key
Max Size: 250 Alphanumeric Characters
xCommand
Sola transaction type
Report:GiftApproved
xBeginDate
Beginning date of range
2020-01-01
2019-08-15 09:00:00
xEndDate
Ending date of range
2020-01-01
2019-08-15 09:00:00
xSoftwareName
Name of your software
[xsoftwarecredentials]
xResult
“A”
xStatus
“Approved”
xError
““
xRefNum
"10000016875"
xRecordsReturned
“20”
xReportData
xKey
Your Sola API key
[xkeycredentials]
xCommand
Sola transaction type
Report:GiftSummary
xBeginDate
Beginning date of range
2020-01-01
2019-08-15 09:00:00
xEndDate
Ending date of range
2020-01-01
2019-08-15 09:00:00
xSoftwareName
Name of your software
[xsoftwarecredentials]
xResult
“A”
xStatus
“Approved”
xError
““
xRefNum
"10000016875"
xRecordsReturned
“20”
xReportData
xKey
Your Sola API key
[xkeycredentials]
xCommand
Sola transaction type
Report:Liability
xSoftwareName
Name of your software
[xsoftwarecredentials]
xSoftwareVersion
Version number of your software
The current version is 4.5.8
Parameter
Example
xResult
“A”
xStatus
“Approved”
xError
““
xRefNum
"10000016875"
xRecordsReturned
“20”
xReportData
Parameter
Description
Sample Value
xBeginDate
Begin date in YYYY-MM-DD or YYYY-MM-DD HH:MM:SS format
2020-01-01
2019-08-15 09:00:00
xEndDate
End date in YYYY-MM-DD or YYYY-MM-DD HH:MM:SS format
2019-10-31
2020-06-30 12:00:00
Parameter
Description
Comments
xKey
Credential
Max Size: 250 Alphanumeric Characters
xVersion
Gateway API version
The current version is 4.5.8
xSoftwareName
The name of your software
xSoftwareVersion
Transaction type
Not Like
xSoftwareVersion
xSoftwareVersion
Version number of your software
Yes
ISO 4217 alphabetic currency code.
totalPriceStatus
String
Yes
Set to FINAL
totalPrice
String
Yes
Total amount consumer should be charged. This is a sum of all DisplayItems
transactionId
String
Yes
A unique ID that identifies a transaction attempt. Can be passed on the Request through
Yes
From Google documentation: The monetary value of the cart item with an optional decimal precision of two decimal places. Negative values are allowed.
status
String
Yes
From Google documentation: The following variables define price variance:
FINAL
PENDING
Default to FINAL if not provided
Yes
From Google documentation: Data about the selected payment method
email
String
No
Email address, if emailRequired is set to true in the request
shippingOptionData
No
From Google documentation: The selected shipping option in the payment sheet.
shippingAddress
No
Shipping address, if shippingAddressRequired is set to true in the request
No
From Google documentation: Payment tokenization data for the selected payment method.
type
String
Yes
Will be always set to CARD
Yes
From Google documentation:
This object provides information about the validation performed on the returned payment data if assuranceDetailsRequired is set to true on the request.
billingAddress
Address
No
From Google documentation:
The billing address associated with the provided payment method, if billingAddressRequired is set to true in the request
From Google documentation:
A telephone number, if phoneNumberRequired is set to true in the request
address1
FULL
From Google documentation: The first line of the address.
address2
FULL
From Google documentation: The second line of the address.
address3
FULL
From Google documentation: The third line of the address.
locality
FULL
From Google documentation: City, town, neighborhood, or suburb.
administrativeArea
FULL
From Google documentation: A country subdivision, such as a state or province.
sortingCode
FULL
From Google documentation: The sorting code.
Name
Type
Always exists
Description
transactionInfo
Yes
Contains all transaction data. For more details please click on the link
paymentData
Yes
This is a response object that's returned by Google after a payer approves payment
Name
Type
Always exists
Description
displayItems
DisplayItem
Yes
Array of line items describing the charge. For more details please click on the link
countryCode
String
Yes
ISO 3166-1 alpha-2 country code
currencyCode
Name
Type
Always exists
Description
label
String
Yes
From Google documentation: The label to be displayed for the given option
type
String
Yes
From Google documentation: Type of displayed line item:
LINE_ITEM
SUBTOTAL
price
Name
Type
Always exists
Description
apiVersion
Number
Yes
From Google documentation: Major API version
apiVersionMinor
Number
Yes
From Google documentation: Minor API version
paymentMethodData
Name
Type
Always exists
Description
id
String
Yes
Id of the selected Shipping Option
Name
Type
Always exists
Description
description
String
Yes
From Google documentation: User-facing message to describe the payment method that funds this transaction.
info
Yes
From Google documentation: Data about the selected payment method
tokenizationData
Name
Type
Always exists
Description
cardNetwork
String
Yes
From Google documentation: The payment card network of the selected payment.
cardDetails
String
Yes
From Google documentation: The details about the card. This value is commonly the last four digits of the selected payment account number.
assuranceDetails
Name
Type
Always exists
Description
type
String
Yes
Will be always set to PAYMENT_GATEWAY
token
String
No
A JSON object string that contains a chargeable token issued by Google
Name
Address format
Description
name
MIN
From Google documentation: The full name of the addressee.
postalCode
MIN
From Google documentation: The postal or ZIP code.
countryCode
MIN
From Google documentation: ISO 3166-1 alpha-2 country code.
phoneNumber
String
String
String
MIN
"transactionInfo": {
"displayItems": [
{
"label": "Subtotal",
"type": "SUBTOTAL",
"price": "2"
},
{
"label": "Tax",
"type": "TAX",
"price": "0.2"
},
{
"type": "LINE_ITEM",
"label": "Shipping cost",
"price": "0.00",
"status": "FINAL"
}
],
"countryCode": "US",
"currencyCode": "USD",
"totalPriceStatus": "FINAL",
"totalPrice": "2.2",
"totalPriceLabel": "Total",
"transactionId": "1200640e-5ed3-45d3-870b-5491d5af8248"
}{
"apiVersion": 2,
"apiVersionMinor": 0,
"paymentMethodData": {
"type": "CARD",
"description": "Visa •••• 1234",
"info": {
"cardNetwork": "VISA",
"cardDetails": "1234"
},
"tokenizationData": {
"type": "PAYMENT_GATEWAY",
"token": "examplePaymentMethodToken"
}
}
}{
"name": "John Doe",
"address1": "c/o Google LLC",
"address2": "1600 Amphitheatre Pkwy",
"address3": "Building 40",
"locality": "Mountain View",
"administrativeArea": "CA",
"countryCode": "US",
"postalCode": "94043",
"sortingCode": ""
}{
"transactionInfo": {
"displayItems": [
{
"label": "Subtotal",
"type": "SUBTOTAL",
"price": "2"
},
{
"label": "Tax",
"type": "TAX",
"price": "0.2"
},
{
"type": "LINE_ITEM",
"label": "Shipping cost",
"price": "0.00",
"status": "FINAL"
}
],
"countryCode": "US",
"currencyCode": "USD",
"totalPriceStatus": "FINAL",
"totalPrice": "2.2",
"totalPriceLabel": "Total",
"transactionId": "aff9e1-3209-4b2c-8037-120d2c0d"
},
"paymentData": {
"apiVersionMinor": 0,
"apiVersion": 2,
"paymentMethodData": {
"description": "Mastercard •••• 1771",
"tokenizationData": {
"type": "PAYMENT_GATEWAY",
"token": "{\"signature\":\"MEUCI+slJGaKBHZmphgIgJ8GKHlrPKnQcObF/lGfYjDmt1pu3kzPOYoBmdjdUFvw\\u003d\",\"intermediateSigningKey\":{\"signedKey\":\"{\\\"keyValue\\\":\\\"MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQca0NVUE0gp/9xbueVNmy1o+NTcInbX/9ZN0QbXr8mng\\\\u003d\\\\u003d\\\",\\\"keyExpiration\\\":\\\"1614913712991\\\"}\",\"signatures\":[\"MEUCIQDb6d5nYqcL57Q09DPDrDKWxMgIgKaiLAEfdwNwG7S6nMvX1gRvQ\\u003d\"]},\"protocolVersion\":\"ECv2\",\"signedMessage\":\"{\\\"encryptedMessage\\\":\\\"9gmVUfk1Jua03felBqSUY4yXwzDzlhSHE2jm4VHDgsQ3xnzjQrlTAiyM87dP+8Cx9cks6SbrrK6vyWR7WmrPFhOaNFlulCvn9fI213ofHjRz7ebP71IFRCpgjeqG+nMQJXY8zjkhwXkUJTtOJ4SpXV7ByLyIXb/UJU7pg3O1m3Tl1zpe8C+hLQpKvAIZSAwEl4EBRafbcE33JyuV7RNLMlAerlELsGPUm0c04mM11vF3vdBVfgiyvVw5pJD2Gk/DX7fHdrUpPnzRt5ZoFU0jWZq/8rsj57cEzR+MK2MJVZE014D7iB8+7qcFjJ5H6Tdc/DCsyO5XDVp3Lu5aWZrIqJ6b9BkNPGiCDrV1OKRngc4OYPIGj7OrP7nQgIeU97EYT2xLzqWnfZ/PNCtj89mvT9mKp8y7V6eCJmK8BJsH9MLH08olwGo9pcU7Av2OXo837qUkcCxrkDrYh+wSbqS4p1SyoqgW+2BR+2zRoXU/\\\",\\\"ephemeralPublicKey\\\":\\\"BAAqw+C7aP+Z6KL2HLiP5J7Y/gEWpLQedowh7+r/7taxfNbNuC4\\\\u003d\\\",\\\"tag\\\":\\\"jkqoAh5l16mzlpmqVzpFx/k64\\\\u003d\\\"}\"}"
},
"type": "CARD",
"info": {
"cardNetwork": "MASTERCARD",
"cardDetails": "1771",
"billingAddress": {
"address3": "",
"sortingCode": "",
"address2": "",
"countryCode": "US",
"address1": "123 Main Street",
"postalCode": "07103",
"name": "John Smith",
"locality": "Newark",
"administrativeArea": "NJ"
}
}
},
"shippingOptionData": {
"id": "shipping-001"
},
"shippingAddress": {
"address3": "",
"sortingCode": "",
"address2": "",
"countryCode": "US",
"address1": "123 Main Street",
"postalCode": "10601",
"name": "Test Test",
"locality": "White Plains",
"administrativeArea": "NY"
},
"email": "[email protected]"
}
}Coming soon.
Example 1:
Example 2:
Example 1:
Example 2:
To submit a <xCommand> request, first configure the SDK with:
an xKey value obtained from Cardknox
a software name value; a short name for your application
a software version value; the current version of your software
a version value; the current Cardknox Gateway version 4.5.9
Create a Cardknox SDK object. A good place is the “view appear” method. This object will be used to create “request” objects.
Register the “view appear” method with the “body” parameter
Destroy the Cardknox SDK object to free resources when SDK will no longer be used:
Next, create a transaction parameters object:
Specify the required parameters:
CHANGE <xCommand>
Specify the additional parameters for the <xCommand> transaction type:
If selected Transaction type is cc:sale, cc:credit, cc:authonly
If selected Transaction type is cc:capture
Specify optional parameters, if any:
Create a request object, check if the request object is valid, initiate a transaction & process the response:
To submit a <xCommand> request, first configure the SDK with:
an xKey value obtained from Cardknox
a software name value; a short name for your application
a software version value; the current version of your software
a version value; the current Cardknox Gateway version 4.5.9
Create a Cardknox SDK object. A good place is the “view appear” method. This object will be used to create “request” objects.
Destroy the Cardknox SDK object to free resources when SDK will no longer be used:
Next, create a transaction parameters object:
Specify the required parameters:
CHANGE <xCommand>
Specify the additional parameters for the <xCommand> transaction type:
If selected Transaction type is cc:sale, cc:credit, cc:authonly
If selected Transaction type is cc:capture
Specify optional parameters, if any:
Create a request object, check if the request object is valid, initiate a transaction & process the response:
To submit a <xCommand> request, first configure the SDK with:
an xKey value obtained from Cardknox
a software name value; a short name for your application
a software version value; the current version of your software
a version value; the current Cardknox Gateway version 4.5.9
Create a Cardknox SDK object. A good place is the “view appear” method. This object will be used to create “request” objects.
Destroy the Cardknox SDK object to free resources when SDK will no longer be used:
Next, create a transaction parameters object:
Specify the required parameters:
CHANGE <xCommand>
Specify the additional parameters for the <xCommand> transaction type:
If selected Transaction type is cc:sale, cc:credit, cc:authonly
If selected Transaction type is cc:capture
Specify optional parameters, if any:
Create a request object, check if the request object is valid, initiate a transaction & process the response:
To submit a <xCommand> request, first configure the SDK with:
an xKey value obtained from Cardknox
a software name value; a short name for your application
a software version value; the current version of your software
a version value; the current Cardknox Gateway version 4.5.9
Create a Cardknox SDK object. A good place is the “view appear” method. This object will be used to create “request” objects.
Register the “view appear” method with the “body” parameterde
Destroy the Cardknox SDK object to free resources when SDK will no longer be used:
Define a Publisher object that will deliver processed Transaction results in a Notification:
Define a Publisher object that will deliver Notifications about various card reader event taking place in the SDK:
Define a method to run when the SDK processes a transaction and sends the processing results back:
Afterwards, subscribe the method to receive results back from the SDK:
SDK works with a card reader to accept a card. Various card reader events can happen during processing. Define a method to run whenever a new card reader event happens:
Afterwards, subscribe the method to be notified about card reader events:
Next, create a transaction parameters object:
Specify the required parameters:
CHANGE <xCommand> to value from Transaction Type dropdown
Specify optional parameters, if any:
Create a request object, check if the request object is valid, initiate a transaction & process the response:
To submit a <xCommand> request, first configure the SDK with:
an xKey value obtained from Cardknox
a software name value; a short name for your application
a software version value; the current version of your software
a version value; the current Cardknox Gateway version 4.5.9
Create a Cardknox SDK object. A good place is the “view appear” method. This object will be used to create “request” objects.
Destroy the Cardknox SDK object to free resources when SDK will no longer be used:
Define a method to run when the SDK processes a transaction and sends the processing results back:
Afterwards, subscribe the method to receive results back from the SDK:
SDK works with a card reader to accept a card. Various card reader events can happen during processing. Define a method to run whenever a new card reader event happens:
Afterwards, subscribe the method to be notified about card reader events:
Next, create a transaction parameters object:
Specify the required parameters:
CHANGE <xCommand> to value from Transaction Type dropdown
Specify optional parameters, if any:
Create a request object, check if the request object is valid, initiate a transaction & process the response:
To submit a <xCommand> request, first configure the SDK with:
an xKey value obtained from Cardknox
a software name value; a short name for your application
a software version value; the current version of your software
a version value; the current Cardknox Gateway version 4.5.9
Create a Cardknox SDK object. A good place is the “view appear” method. This object will be used to create “request” objects.
Destroy the Cardknox SDK object to free resources when SDK will no longer be used:
Define a method to run when the SDK processes a transaction and sends the processing results back:
Afterwards, subscribe the method to receive results back from the SDK:
SDK works with a card reader to accept a card. Various card reader events can happen during processing. Define a method to run whenever a new card reader event happens:
Afterwards, subscribe the method to be notified about card reader events:
Next, create a transaction parameters object:
Specify the required parameters:
CHANGE <xCommand> to value from Transaction Type dropdown
Specify optional parameters, if any:
Create a request object, check if the request object is valid, initiate a transaction & process the response:
Example 1 sets xCardNum & xExpDate into the parameters object as those 2 are required by the cc:sale command. Therefor example 1 has the Specify the additional parameters for the "cc:sale" transaction type: sample code
To submit a cc:sale request, first configure the SDK with:
an xKey value obtained from Cardknox
a software name value; a short name for your application
a software version value; the current version of your software, if any
a version value; the current Cardknox Gateway version 4.5.9
Create a Cardknox SDK object. A good place is the “view appear” method. This object will be used to create “request” objects.
Destroy the Cardknox SDK object to free resources when SDK will no longer be used:
Next, create a transaction parameters object:
Specify the required parameters:
[VARIES] REQUIRED FOR IN SCOPE CC:SALE
Specify the additional parameters for the “cc:sale” transaction type:
Specify optional parameters, if any:
Create a request object, check if the request object is valid, initiate a transaction & process the response:
Example 2 sets the xRefNum value required by the cc:refund command. Therefor example 2 has Specify the additional parameters for the "cc:refund" transaction type:
To submit a cc:sale request, first configure the SDK with:
an xKey value obtained from Cardknox
a software name value; a short name for your application
a software version value; the current version of your software, if any
a version value; the current Cardknox Gateway version 4.5.9
Create a Cardknox SDK object. A good place is the “view appear” method. This object will be used to create “request” objects.
Destroy the Cardknox SDK object to free resources when SDK will no longer be used:
Next, create a transaction parameters object:
Specify the required parameters:
[VARIES] REQUIRED FOR IN SCOPE CC:REFUND
Specify the additional parameters for the “cc:refund” transaction type:
Specify optional parameters, if any:
Create a request object, check if the request object is valid, initiate a transaction & process the response:
To submit a cc:sale request, first configure the SDK with:
an xKey value obtained from Cardknox
a software name value; a short name for your application
a software version value; the current version of your software, if any
a version value; the current Cardknox Gateway version 4.5.9
Create a Cardknox SDK object. A good place is the “view appear” method. This object will be used to create “request” objects.
Destroy the Cardknox SDK object to free resources when SDK will no longer be used:
Define a method to run when the SDK processes a transaction and sends the processing results back:
Afterwards, subscribe the method to receive results back from the SDK:
SDK works with a card reader to accept a card. Various card reader events can happen during processing. Define a method to run whenever a new card reader event happens:
Afterwards, subscribe the method to be notified about card reader events:
Next, create a transaction parameters object:
Specify the required parameters:
Specify optional parameters, if any:
Create a request object, check if the request object is valid, initiate a transaction & process the response:
To submit a cc:sale request, first configure the SDK with:
an xKey value obtained from Cardknox
a software name value; a short name for your application
a software version value; the current version of your software, if any
a version value; the current Cardknox Gateway version 4.5.9
Create a Cardknox SDK object. A good place is the “view appear” method. This object will be used to create “request” objects.
Destroy the Cardknox SDK object to free resources when SDK will no longer be used:
Define a method to run when the SDK processes a transaction and sends the processing results back:
Afterwards, subscribe the method to receive results back from the SDK:
SDK works with a card reader to accept a card. Various card reader events can happen during processing. Define a method to run whenever a new card reader event happens:
Afterwards, subscribe the method to be notified about card reader events:
Next, create a transaction parameters object:
Specify the required parameters:
Specify optional parameters, if any:
Create a request object, check if the request object is valid, initiate a transaction & process the response:
Deep link feature allows a third-party (in further text referred to as a Developer) to use a predefined URL to open up the pre-installed Sola mobile application in order to process a transaction.
The Developer provides a number of required query parameters alongside any optional query parameters.
The Sola app will use xRedirectURL with the required parameter to deliver the results of the processed transaction back to the caller. Results are provided as query parameters, appended onto the value provided by the xRedirectURL parameter. This is a GET request.
A list of phrases, words, and synonyms that appear in this document; along with their meaning
Sola API
Refers to the Sola Transaction API, which can be found at
Command
A combination of a Payment type and a Transaction type, delimited by a semicolon. For example, cc:sale denotes a Credit Card Payment type and a sale transaction type.
Payment type
A type of payment, such as Credit Card (further abbreviated as “cc”), Check (further abbreviated as “check”). More payment types can be found on the Sola API site.
Transaction type
A type of transaction; such as Sale, AuthOnly, Capture etc. More transaction types can be found on the Sola API site.
Bare minimum, to integrate a mobile application capable of reacting to deep links with a website, is that the website should implement the logic that does the following:
Checks whether the application is installed on the mobile device or not.
If it’s not installed, the user is taken to the respective app store (AppStore for iOS or Google Play Store for Android).
if the software is installed, the target application is started.
Points 2 and 3 differ in the URLs that need to be invoked in order to achieve the described result (take the user to an app store or open the target application). Mobile browsers don’t offer an out-of-the-box API to detect if an application is installed on the device or not. As such, point 1 is the responsibility of the Developer to implement. This document assumes that the Sola app is preinstalled on a mobile device during the integration.
The Sola mobile app can be installed here:
a) Android:
b) iOS:
The Sola app predefined URL is:
dck://app.cardknox.com/transaction
A Developer can use the predefined URL to open the Sola app in 2 ways:
Manually, by navigating to a predefined URL through a browser on a mobile device.
By having a website with an HTML element that can handle URLs and specifying the predefined URL on that HTML element.
Android only -
adbtool can be used to deep link into the app with the following code:
A developer is required to pass in a couple of required parameters. These required parameters are first URL decoded and then validated by the application. Optionally, a number of optional parameters can be passed in in order to prefil the transaction process form:
Example URL with all the required parameters and no optional parameters
Validation is performed on the required and optional arguments. A failing required parameters validation results in an error screen displaying which one of the required arguments is missing or is invalid.
Optional arguments are also validated, but the application will not present an error screen describing which optional parameter failed the validation. For example, the app expects the xCVV optional parameter to be an int. The app will read a query parameter named xCVV and try to convert its value to an int. Passing a double might break the conversion to an int, in which case 0 is used as the int default value.
Validation is done in 3 steps, where each step yields a different user interface:
The xRedirectURL is invalid - User is presented with a UI that indicates that the xRedirectURL is missing or the provided value is not a valid URL.
At least one of the required parameters is invalid - User is presented with a UI that indicates which parameter failed validation.
All required parameters are valid - User is presented with a UI to process a transaction.
Response URL invoked by the app when only the xRedirectURL required parameter is supplied.
Response URL invoked by the app when the xRedirectURL and xKey required parameters are supplied. Note that supplying the xCommandparameter here will not make the app validate the xCommand parameter as it’s being validated after xAmount.
Response URL invoked by the app when the xRedirectURL, xKey and xAmount required parameters are supplied.
The Sola app supports two user interfaces for transaction processing - one form interface (further abbreviated as “keyed screen”) and one card reader interface (further abbreviated as “swipe screen”).
Keyed screen allows processing with a card number, expiration date, cvv and other card specific information.
Swipe screen allows bluetooth pairing to a physical VP3300 card reader device, and transaction processing with card reader data readings; either with a card swipe (MSR / magnetic stripe cards) or by using the card with a chip (EMV card). The EMV card can be either tapped onto (“contactless”) or inserted into (“contact”) the VP3300 reader.
The app supports two optional query parameters to control which one, or both, of the two interfaces will be available once the app is invoked with a deep link:
EnableDeviceInsertSwipeTap
controls the availability of the swipe screen
value type: boolean
When the parameter values are not parseable to an expected value type, the app treats the parameter as not being provided at all
Presence of query parameters in the deep link URL and their value controls which user interfaces should be presented, as per the following mapping:
Mapping between the presence and value of EnableDeviceInsertSwipeTap and EnableKeyedEntry query parameters. Note that “-” symbol means “the parameter was not present in the URL”. Symbol “x” means that the UI is available.
When both keyed and swipe user interfaces are available, each one contains an UI element to navigate to the other interface
The user interface provides a button to process a transaction. The required parameters on the UI are the card number, expiration date, and the amount. The amount parameter is passed in through the URL. Expiration date defaults to the current month in the current year. The card number has to be typed in or provided as an optional argument with the xCardNum query parameter.
After the transaction is processed, two things can happen:
Transaction is approved - User will see a summary of the processed transaction. User has an option to click “Done” or “Signature.” Clicking on the “Done” button opens the mobile device browser with the URL specified by the xRedirectURL parameter. Transaction details are converted into key/value pairs and appended as a query string onto the xRedirectURL value. This is a GET request.
Transaction resulted in an error - User will not see the processed transaction summary. User will see the error message about what went wrong in a popup. User has an option to send the response back to xRedirectURL by clicking on any of the 2 Send buttons.
A successful transaction URL encoded response sent to the xRedirectURL
A erroneous transaction URL encoded response sent to the xRedirectURL
After the app sends the response back to the caller (by opening up the xRedirectURL in the mobile browser), the app’s UI is replaced with a full screen image displaying the Sola logo:
When the user taps Cancel in the application, a DeepLink cancellation is processed.
//Request
System.Collections.Specialized.NameValueCollection
MyPost = new System.Collections.Specialized.NameValueCollection();
MyPost.Add("xKey", ""); // Credential
MyPost.Add("xVersion", "4.5.5"); // API version
MyPost.Add("xSoftwareName", My.Application.Info.Title); // Name of your software
MyPost.Add("xSoftwareVersion", My.Application.Info.Version.ToString); // Version of your software
MyPost.Add("xCommand", "cc:sale");
MyPost.Add("xCardNum", "");
MyPost.Add("xExp", "");
MyPost.Add("xName", "");
MyPost.Add("xAmount", "");
MyPost.Add("xAccount", "");
MyPost.Add("xMagstripe", "");
MyPost.Add("xToken", "");
MyPost.Add("xCustom01", "");
MyPost.Add("xCVV", "");
MyPost.Add("xStreet", "");
MyPost.Add("xZip", "");
MyPost.Add("xBillFirstName", "");
MyPost.Add("xBillMiddleName", "");
MyPost.Add("xBillLastName", "");
MyPost.Add("xBillCompany", "");
MyPost.Add("xBillStreet", "");
MyPost.Add("xBillStreet2", "");
MyPost.Add("xBillCity", "");
MyPost.Add("xBillZip", "");
MyPost.Add("xBillCountry", "");
MyPost.Add("xBillPhone", "");
MyPost.Add("xBillMobile", "");
MyPost.Add("xShipFirstName", "");
MyPost.Add("xShipMiddleName", "");
MyPost.Add("xShipLastName", "");
MyPost.Add("xShipCompany", "");
MyPost.Add("xShipStreet", "");
MyPost.Add("xShipStreet2", "");
MyPost.Add("xShipCity", "");
MyPost.Add("xShipState", "");
MyPost.Add("xShipZip", "");
MyPost.Add("xShipCountry", "");
MyPost.Add("xShipPhone", "");
MyPost.Add("xShipMobile", "");
MyPost.Add("xRefNum", "");
MyPost.Add("xAuthCode", "");
MyPost.Add("xIP", "");
MyPost.Add("xRouting", "");
MyPost.Add("xCardpresent", "");
MyPost.Add("xDUKPT", "");
MyPost.Add("xTax", "");
MyPost.Add("xTip", "");
MyPost.Add("xInvoice", "");
MyPost.Add("xPONum", "");
MyPost.Add("xComments", "");
MyPost.Add("xDescription", "");
MyPost.Add("xEmail", "");
MyPost.Add("xFax", "");
MyPost.Add("xBillState", "");
MyPost.Add("xAllowPartialAuth", "");
MyPost.Add("xRxAmount", "");
MyPost.Add("xDentalAmount", "");
MyPost.Add("xVisionAmount", "");
MyPost.Add("xTransitAmount", "");
MyPost.Add("xCopayAmount", "");
MyPost.Add("xClinicalAmount", "");
MyPost.Add("xOrderID", "");
MyPost.Add("xExistingCustomer", "");
MyPost.Add("xAllowDuplicate", "");
MyPost.Add("xMICR", "");
MyPost.Add("xCheckNum", "");
MyPost.Add("xCheckImageFront", "");
MyPost.Add("xCheckImageBack", "");
MyPost.Add("xVoucherApproval", "");
MyPost.Add("xVoucherSerial", "");
MyPost.Add("xGatewayRefNum", "");
MyPost.Add("xGatewayResult", "");
MyPost.Add("xGatewayError", "");
MyPost.Add("xGatewayCVV", "");
MyPost.Add("xGatewayAVS", "");
MyPost.Add("xOrderItems", "");
MyPost.Add("xOrderType", "");
MyPost.Add("xCustomerComments", "");
MyPost.Add("xShipMethod", "");
MyPost.Add("xShipAmount", "");
System.Net.WebClient MyClient = new System.Net.WebClient();
string MyResponse = System.Text.UTF8Encoding.ASCII.GetString(MyClient.UploadValues("https://x1.cardknox.com/gateway", MyPost));
// Response
System.Collections.Specialized.NameValueCollection MyResponseData = System.Web.HttpUtility.ParseQueryString(MyResponse); // If necessary, add reference to System.Web
string MyResult = "";
if (MyResponseData.AllKeys.Contains("xResult"))
MyResult = MyResponseData["xResult"];
string MyStatus = "";
if (MyResponseData.AllKeys.Contains("xStatus"))
MyStatus = MyResponseData["xStatus"];
string MyError = "";
if (MyResponseData.AllKeys.Contains("xError"))
MyError = MyResponseData["xError"];
string MyRefNum = "";
if (MyResponseData.AllKeys.Contains("xRefNum"))
MyRefNum = MyResponseData["xRefNum"];public void postData()
{
// Create a new HttpClient and Post Header Java/Android
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("https://x1.cardknox.com/gateway");
try
{
// Add your data
List nameValuePairs = new ArrayList(9);
nameValuePairs.add(new BasicNameValuePair("xKey", "")); // Credential
nameValuePairs.add(new BasicNameValuePair("xVersion", "4.5.5")); // API Version
nameValuePairs.add(new BasicNameValuePair("xSoftwareName", "")); // Name of your software
nameValuePairs.add(new BasicNameValuePair("xSoftwareVersion", "")); // Version of your software
nameValuePairs.add(new BasicNameValuePair("xCommand", "cc:sale"));
nameValuePairs.add(new BasicNameValuePair("xCardNum", ""));
nameValuePairs.add(new BasicNameValuePair("xExp", ""));
nameValuePairs.add(new BasicNameValuePair("xName", ""));
nameValuePairs.add(new BasicNameValuePair("xAmount", ""));
nameValuePairs.add(new BasicNameValuePair("xAccount", ""));
nameValuePairs.add(new BasicNameValuePair("xMagstripe", ""));
nameValuePairs.add(new BasicNameValuePair("xToken", ""));
nameValuePairs.add(new BasicNameValuePair("xCustom01", ""));
nameValuePairs.add(new BasicNameValuePair("xCVV", ""));
nameValuePairs.add(new BasicNameValuePair("xStreet", ""));
nameValuePairs.add(new BasicNameValuePair("xZip", ""));
nameValuePairs.add(new BasicNameValuePair("xBillFirstName", ""));
nameValuePairs.add(new BasicNameValuePair("xBillMiddleName", ""));
nameValuePairs.add(new BasicNameValuePair("xBillLastName", ""));
nameValuePairs.add(new BasicNameValuePair("xBillCompany", ""));
nameValuePairs.add(new BasicNameValuePair("xBillStreet", ""));
nameValuePairs.add(new BasicNameValuePair("xBillStreet2", ""));
nameValuePairs.add(new BasicNameValuePair("xBillCity", ""));
nameValuePairs.add(new BasicNameValuePair("xBillZip", ""));
nameValuePairs.add(new BasicNameValuePair("xBillCountry", ""));
nameValuePairs.add(new BasicNameValuePair("xBillPhone", ""));
nameValuePairs.add(new BasicNameValuePair("xBillMobile", ""));
nameValuePairs.add(new BasicNameValuePair("xShipFirstName", ""));
nameValuePairs.add(new BasicNameValuePair("xShipMiddleName", ""));
nameValuePairs.add(new BasicNameValuePair("xShipLastName", ""));
nameValuePairs.add(new BasicNameValuePair("xShipCompany", ""));
nameValuePairs.add(new BasicNameValuePair("xShipStreet", ""));
nameValuePairs.add(new BasicNameValuePair("xShipStreet2", ""));
nameValuePairs.add(new BasicNameValuePair("xShipCity", ""));
nameValuePairs.add(new BasicNameValuePair("xShipState", ""));
nameValuePairs.add(new BasicNameValuePair("xShipZip", ""));
nameValuePairs.add(new BasicNameValuePair("xShipCountry", ""));
nameValuePairs.add(new BasicNameValuePair("xShipPhone", ""));
nameValuePairs.add(new BasicNameValuePair("xShipMobile", ""));
nameValuePairs.add(new BasicNameValuePair("xRefNum", ""));
nameValuePairs.add(new BasicNameValuePair("xAuthCode", ""));
nameValuePairs.add(new BasicNameValuePair("xIP", ""));
nameValuePairs.add(new BasicNameValuePair("xRouting", ""));
nameValuePairs.add(new BasicNameValuePair("xCardpresent", ""));
nameValuePairs.add(new BasicNameValuePair("xDUKPT", ""));
nameValuePairs.add(new BasicNameValuePair("xTax", ""));
nameValuePairs.add(new BasicNameValuePair("xTip", ""));
nameValuePairs.add(new BasicNameValuePair("xInvoice", ""));
nameValuePairs.add(new BasicNameValuePair("xPONum", ""));
nameValuePairs.add(new BasicNameValuePair("xComments", ""));
nameValuePairs.add(new BasicNameValuePair("xDescription", ""));
nameValuePairs.add(new BasicNameValuePair("xEmail", ""));
nameValuePairs.add(new BasicNameValuePair("xFax", ""));
nameValuePairs.add(new BasicNameValuePair("xBillState", ""));
nameValuePairs.add(new BasicNameValuePair("xAllowPartialAuth", ""));
nameValuePairs.add(new BasicNameValuePair("xRxAmount", ""));
nameValuePairs.add(new BasicNameValuePair("xDentalAmount", ""));
nameValuePairs.add(new BasicNameValuePair("xVisionAmount", ""));
nameValuePairs.add(new BasicNameValuePair("xTransitAmount", ""));
nameValuePairs.add(new BasicNameValuePair("xCopayAmount", ""));
nameValuePairs.add(new BasicNameValuePair("xClinicalAmount", ""));
nameValuePairs.add(new BasicNameValuePair("xOrderID", ""));
nameValuePairs.add(new BasicNameValuePair("xExistingCustomer", ""));
nameValuePairs.add(new BasicNameValuePair("xAllowDuplicate", ""));
nameValuePairs.add(new BasicNameValuePair("xMICR", ""));
nameValuePairs.add(new BasicNameValuePair("xCheckNum", ""));
nameValuePairs.add(new BasicNameValuePair("xCheckImageFront", ""));
nameValuePairs.add(new BasicNameValuePair("xCheckImageBack", ""));
nameValuePairs.add(new BasicNameValuePair("xVoucherApproval", ""));
nameValuePairs.add(new BasicNameValuePair("xVoucherSerial", ""));
nameValuePairs.add(new BasicNameValuePair("xGatewayRefNum", ""));
nameValuePairs.add(new BasicNameValuePair("xGatewayResult", ""));
nameValuePairs.add(new BasicNameValuePair("xGatewayError", ""));
nameValuePairs.add(new BasicNameValuePair("xGatewayCVV", ""));
nameValuePairs.add(new BasicNameValuePair("xGatewayAVS", ""));
nameValuePairs.add(new BasicNameValuePair("xOrderItems", ""));
nameValuePairs.add(new BasicNameValuePair("xOrderType", ""));
nameValuePairs.add(new BasicNameValuePair("xCustomerComments", ""));
nameValuePairs.add(new BasicNameValuePair("xShipMethod", ""));
nameValuePairs.add(new BasicNameValuePair("xShipAmount", ""));
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
// Execute HTTP Post Request
HttpResponse response = httpclient.execute(httppost);
System.out.println("response = " + EntityUtils.toString(response.getEntity()));
}
catch (ClientProtocolException e)
{
// TODO Auto-generated catch block
}
catch (IOException e)
{
// TODO Auto-generated catch block
}
}// Node.Js
var request = require("request");
var querystring = require('querystring');
request.post({
url: 'https://x1.cardknox.com/gateway',
form: {
xKey: '', // Credential
xVersion: '', // API Version
xSoftwareName: '', // Name of your software
xSoftwareVersion: '', // Version of your software
xCommand: '',
xCardNum: '',
xExp: '',
xAmount: '',
xAccount:'',
xMagstripe:'',
xToken:'',
xCustom01:'',
xCVV:'',
xStreet:'',
xZip:'',
xBillFirstName:'',
xBillMiddleName:'',
xBillLastName:'',
xBillCompany:'',
xBillStreet:'',
xBillStreet2:'',
xBillCity:'',
xBillCountry:'',
xBillPhone:'',
xShipFirstName:'',
xShipMiddleName:'',
xShipCompany:'',
xShipStreet:'',
xShipStreet2:'',
xShipCity:'',
xShipState:'',
xShipZip:'',
xShipCountry:'',
xShipPhone:'',
xShipMobile:'',
xRefNum:'',
xAuthCode:'',
xRouting:'',
xCardpresent:'',
xDUKPT:'',
xTax:'',
xTip:'',
xInvoice:'',
xPONum:'',
xComments:'',
xDescription:'',
xEmail:'',
xFax:'',
xBillState:'',
xAllowPartialAuth:'',
xRxAmount:'',
xDentalAmount:'',
xVisionAmount:'',
xTransitAmount:'',
xCopayAmount:'',
xClinicalAmount:'',
xOrderID:'',
xExistingCustomer:'',
xAllowDuplicate:'',
xMICR:'',
xCheckNum:'',
xCheckImageFront:'',
xCheckImageBack:'',
xVoucherApproval:'',
xVoucherSerial:'',
xGatewayRefNum:'',
xGatewayResult:'',
xGatewayError:'',
xGatewayCVV:'',
xGatewayAVS:'',
xOrderItems:'',
xOrderType:'',
xCustomerComments:'',
xShipMethod:'',
xShipAmount:'',
}
},
function (error, response, body) {
if (error) throw new Error(error);
console.log(querystring.parse(body));
});<?php
// Request
$data = array();
$data["xKey"] = ""; // Credential
$data["xVersion"] = ""; // API Version
$data["xSoftwareName"] = ""; // Name of your software
$data["xSoftwareVersion"] = ""; // Version of your software
$data["xCommand"] = "";
$data["xCardNum"] = "";
$data["xExp"] = "";
$data["xName"] = "";
$data["xAmount"] = "";
$data["xAccount"] = "";
$data["xMagstripe"] = "";
$data["xToken"] = "";
$data["xCustom01"] = "";
$data["xCVV"] = "";
$data["xStreet"] = "";
$data["xZip"] = "";
$data["xBillFirstName"] = "";
$data["xBillMiddleName"] = "";
$data["xBillLastName"] = "";
$data["xBillCompany"] = "";
$data["xBillStreet"] = "";
$data["xBillStreet2"] = "";
$data["xBillState"] = "";
$data["xBillCity"] = "";
$data["xBillZip"] = "";
$data["xBillCountry"] = "";
$data["xBillPhone"] = "";
$data["xBillMobile"] = "";
$data["xShipFirstName"] = "";
$data["xShipMiddleName"] = "";
$data["xShipLastName"] = "";
$data["xShipCompany"] = "";
$data["xShipStreet"] = "";
$data["xShipStreet2"] = "";
$data["xShipCity"] = "";
$data["xShipState"] = "";
$data["xShipZip"] = "";
$data["xShipCountry"] = "";
$data["xShipPhone"] = "";
$data["xShipMobile"] = "";
$data["xRefNum"] = "";
$data["xAuthCode"] = "";
$data["xIP"] = "";
$data["xRouting"] = "";
$data["xCardpresent"] = "";
$data["xDUKPT"] = "";
$data["xTax"] = "";
$data["xTip"] = "";
$data["xInvoice"] = "";
$data["xPONum"] = "";
$data["xComments"] = "";
$data["xDescription"] = "";
$data["xEmail"] = "";
$data["xFax"] = "";
$data["xBillState"] = "";
$data["xAllowPartialAuth"] = "";
$data["xRxAmount"] = "";
$data["xDentalAmount"] = "";
$data["xVisionAmount"] = "";
$data["xTransitAmount"] = "";
$data["xCopayAmount"] = "";
$data["xClinicalAmount"] = "";
$data["xOrderID"] = "";
$data["xExistingCustomer"] = "";
$data["xAllowDuplicate"] = "";
$data["xMICR"] = "";
$data["xCheckNum"] = "";
$data["xCheckImageFront"] = "";
$data["xCheckImageBack"] = "";
$data["xVoucherApproval"] = "";
$data["xVoucherSerial"] = "";
$data["xGatewayRefNum"] = "";
$data["xGatewayResult"] = "";
$data["xGatewayError"] = "";
$data["xGatewayCVV"] = "";
$data["xGatewayAVS"] = "";
$data["xOrderItems"] = "";
$data["xOrderType"] = "";
$data["xCustomerComments"] = "";
$data["xShipMethod"] = "";
$data["xShipAmount"] = "";
function buildQuery($data)
{
if(function_exists('http_build_query') && ini_get('arg_separator.output')=='&') return http_build_query($data);
$tmp = array();
foreach($data as $key=>$val) $tmp[] = rawurlencode($key) . '=' . rawurlencode($val);
return implode('&', $tmp);
}
$data = buildQuery($data);
$ch = curl_init("https://x1.cardknox.com/gateway");
if(!is_resource($ch))
{
echo "Error: Unable to initialize CURL ($ch)";
exit;
}
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_POST,1);
curl_setopt($ch, CURLOPT_TIMEOUT, 45);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
$raw_result = curl_exec($ch);
if(curl_error($ch) != "")
{
echo curl_error($ch);
}
elseif(!strlen($raw_result))
{
echo "Error reading from card processing gateway. Please contact the merchant to verify whether transaction has been processed.";
curl_close($ch);
exit;
}
elseif($raw_result == false)
{
echo "Blank response from card processing gateway.";
curl_close($ch);
exit;
}
else
{
// SUCCESS
curl_close($ch);
// result will be on the last line of the return
$tmp = explode("\n",$raw_result);
$result_string = $tmp[count($tmp)-1];
parse_str($result_string, $result_array);
print_r($result_array);
}
?># Python 2
import urllib2, urllib
from urlparse import parse_qs
data = {}
data["xKey"] = "" # Credential
data["xVersion"] = "" # API Version
data["xSoftwareName"] = "" # Name of your software
data["xSoftwareVersion"] = "" # Version of your software
data["xCommand"] = ""
data["xCardNum"] = ""
data["xExp"] = ""
data["xName"] = ""
data["xAmount"] = ""
data["xAccount"] = ""
data["xMagstripe"] = ""
data["xToken"] = ""
data["xCustom01"] = ""
data["xCVV"] = ""
data["xStreet"] = ""
data["xZip"] = ""
data["xBillFirstName"] = ""
data["xBillMiddleName"] = ""
data["xBillLastName"] = ""
data["xBillCompany"] = ""
data["xBillStreet"] = ""
data["xBillStreet2"] = ""
data["xBillCity"] = ""
data["xBillCountry"] = ""
data["xBillPhone"] = ""
data["xBillMobile"] = ""
data["xShipFirstName"] = ""
data["xShipMiddleName"] = ""
data["xShipCompany"] = ""
data["xShipStreet"] = ""
data["xShipStreet2"] = ""
data["xShipCity"] = ""
data["xShipState"] = ""
data["xShipZip"] = ""
data["xShipCountry"] = ""
data["xShipPhone"] = ""
data["xShipMobile"] = ""
data["xRefNum"] = ""
data["xAuthCode"] = ""
data["xIP"] = ""
data["xRouting"] = ""
data["xCardpresent"] = ""
data["xDUKPT"] = ""
data["xTax"] = ""
data["xTip"] = ""
data["xInvoice"] = ""
data["xPONum"] = ""
data["xComments"] = ""
data["xDescription"] = ""
data["xEmail"] = ""
data["xFax"] = ""
data["xBillState"] = ""
data["xAllowPartialAuth"] = ""
data["xRxAmount"] = ""
data["xDentalAmount"] = ""
data["xVisionAmount"] = ""
data["xTransitAmount"] = ""
data["xCopayAmount"] = ""
data["xClinicalAmount"] = ""
data["xOrderID"] = ""
data["xExistingCustomer"] = ""
data["xAllowDuplicate"] = ""
data["xMICR"] = ""
data["xCheckNum"] = ""
data["xCheckImageFront"] = ""
data["xCheckImageBack"] = ""
data["xVoucherApproval"] = ""
data["xVoucherSerial"] = ""
data["xGatewayRefNum"] = ""
data["xGatewayResult"] = ""
data["xGatewayError"] = ""
data["xGatewayCVV"] = ""
data["xGatewayAVS"] = ""
data["xOrderItems"] = ""
data["xOrderType"] = ""
data["xCustomerComments"] = ""
data["xShipMethod"] = ""
data["xShipAmount"] = ""
request = urllib2.Request("https://x1.cardknox.com/gateway", urllib.urlencode(data).encode('utf-8'))
rawResponse = urllib2.urlopen(request).read().decode('utf-8')
response = parse_qs(rawResponse, keep_blank_values=True)
print("xRefNum: " + "".join(response.get("xRefNum","")));
print("xResult: " + "".join(response.get("xResult","")));
print("xStatus: " + "".join(response.get("xStatus","")));
print("xError: " + "".join(response.get("xError","")));# Python 3
import urllib.request
from urllib.parse import parse_qs
data = {}
data["xKey"] = "" # Credential
data["xVersion"] = "" # API Version
data["xSoftwareName"] = "" # Name of your software
data["xSoftwareVersion"] = "" # Version of your software
data["xCommand"] = ""
data["xCardNum"] = ""
data["xExp"] = ""
data["xName"] = ""
data["xAmount"] = ""
data["xAccount"] = ""
data["xMagstripe"] = ""
data["xToken"] = ""
data["xCustom01"] = ""
data["xCVV"] = ""
data["xStreet"] = ""
data["xZip"] = ""
data["xBillFirstName"] = ""
data["xBillMiddleName"] = ""
data["xBillLastName"] = ""
data["xBillCompany"] = ""
data["xBillStreet"] = ""
data["xBillStreet2"] = ""
data["xBillCity"] = ""
data["xBillCountry"] = ""
data["xBillPhone"] = ""
data["xBillMobile"] = ""
data["xShipFirstName"] = ""
data["xShipMiddleName"] = ""
data["xShipCompany"] = ""
data["xShipStreet"] = ""
data["xShipStreet2"] = ""
data["xShipCity"] = ""
data["xShipState"] = ""
data["xShipZip"] = ""
data["xShipCountry"] = ""
data["xShipPhone"] = ""
data["xShipMobile"] = ""
data["xRefNum"] = ""
data["xAuthCode"] = ""
data["xIP"] = ""
data["xRouting"] = ""
data["xCardpresent"] = ""
data["xDUKPT"] = ""
data["xTax"] = ""
data["xTip"] = ""
data["xInvoice"] = ""
data["xPONum"] = ""
data["xComments"] = ""
data["xDescription"] = ""
data["xEmail"] = ""
data["xFax"] = ""
data["xBillState"] = ""
data["xAllowPartialAuth"] = ""
data["xRxAmount"] = ""
data["xDentalAmount"] = ""
data["xVisionAmount"] = ""
data["xTransitAmount"] = ""
data["xCopayAmount"] = ""
data["xClinicalAmount"] = ""
data["xOrderID"] = ""
data["xExistingCustomer"] = ""
data["xAllowDuplicate"] = ""
data["xMICR"] = ""
data["xCheckNum"] = ""
data["xCheckImageFront"] = ""
data["xCheckImageBack"] = ""
data["xVoucherApproval"] = ""
data["xVoucherSerial"] = ""
data["xGatewayRefNum"] = ""
data["xGatewayResult"] = ""
data["xGatewayError"] = ""
data["xGatewayCVV"] = ""
data["xGatewayAVS"] = ""
data["xOrderItems"] = ""
data["xOrderType"] = ""
data["xCustomerComments"] = ""
data["xShipMethod"] = ""
data["xShipAmount"] = ""
request = urllib.request.Request("https://x1.cardknox.com/gateway", urllib.parse.urlencode(data).encode('utf-8'))
rawResponse = urllib.request.urlopen(request).read().decode('utf-8')
response = parse_qs(rawResponse, keep_blank_values=True)
print("xRefNum: " + "".join(response.get("xRefNum","")));
print("xResult: " + "".join(response.get("xResult","")));
print("xStatus: " + "".join(response.get("xStatus","")));
print("xError: " + "".join(response.get("xError",""))); 'Request
Dim MyPost As New System.Collections.Specialized.NameValueCollection
MyPost.Add("xKey", "") ‘Credential
MyPost.Add("xVersion", "4.5.5") ‘API Version
MyPost.Add("xSoftwareName", My.Application.Info.Title) ‘Name of your software
MyPost.Add("xSoftwareVersion", My.Application.Info.Version.ToString) ‘Version of your software
MyPost.Add("xCommand", "cc:sale")
MyPost.Add("xCardNum", "")
MyPost.Add("xExp", "")
MyPost.Add("xName", "")
MyPost.Add("xAmount", "")
MyPost.Add("xAccount", "")
MyPost.Add("xMagstripe", "")
MyPost.Add("xToken", "")
MyPost.Add("xCustom01", "")
MyPost.Add("xCVV", "")
MyPost.Add("xStreet", "")
MyPost.Add("xZip", "")
MyPost.Add("xBillFirstName", "")
MyPost.Add("xBillMiddleName", "")
MyPost.Add("xBillLastName", "")
MyPost.Add("xBillCompany", "")
MyPost.Add("xBillStreet", "")
MyPost.Add("xBillStreet2", "")
MyPost.Add("xBillCity", "")
MyPost.Add("xBillZip", "")
MyPost.Add("xBillCountry", "")
MyPost.Add("xBillPhone", "")
MyPost.Add("xBillMobile", "")
MyPost.Add("xShipFirstName", "")
MyPost.Add("xShipMiddleName", "")
MyPost.Add("xShipLastName", "")
MyPost.Add("xShipCompany", "");
MyPost.Add("xShipStreet", "")
MyPost.Add("xShipStreet2", "")
MyPost.Add("xShipCity", "")
MyPost.Add("xShipState", "")
MyPost.Add("xShipZip", "")
MyPost.Add("xShipCountry", "")
MyPost.Add("xShipPhone", "")
MyPost.Add("xShipMobile", "")
MyPost.Add("xRefNum", "")
MyPost.Add("xAuthCode", "")
MyPost.Add("xIP", "")
MyPost.Add("xRouting", "")
MyPost.Add("xCardpresent", "")
MyPost.Add("xDUKPT", "")
MyPost.Add("xTax", "")
MyPost.Add("xTip", "")
MyPost.Add("xInvoice", "")
MyPost.Add("xPONum", "")
MyPost.Add("xComments", "")
MyPost.Add("xDescription", "")
MyPost.Add("xEmail", "")
MyPost.Add("xFax", "")
MyPost.Add("xBillState", "")
MyPost.Add("xAllowPartialAuth", "")
MyPost.Add("xRxAmount", "")
MyPost.Add("xDentalAmount", "")
MyPost.Add("xVisionAmount", "")
MyPost.Add("xTransitAmount", "")
MyPost.Add("xCopayAmount", "")
MyPost.Add("xClinicalAmount", "")
MyPost.Add("xOrderID", "")
MyPost.Add("xExistingCustomer", "")
MyPost.Add("xAllowDuplicate", "")
MyPost.Add("xMICR", "")
MyPost.Add("xCheckNum", "")
MyPost.Add("xCheckImageFront", "")
MyPost.Add("xCheckImageBack", "")
MyPost.Add("xVoucherApproval", "")
MyPost.Add("xVoucherSerial", "")
MyPost.Add("xGatewayRefNum", "")
MyPost.Add("xGatewayResult", "")
MyPost.Add("xGatewayError", "")
MyPost.Add("xGatewayCVV", "")
MyPost.Add("xGatewayAVS", "")
MyPost.Add("xOrderItems", "")
MyPost.Add("xOrderType", "")
MyPost.Add("xCustomerComments", "")
MyPost.Add("xShipMethod", "")
MyPost.Add("xShipAmount", "")
Dim MyClient As New Net.WebClient
Dim MyResponse As String = System.Text.UTF8Encoding.ASCII.GetString(MyClient.UploadValues("https://x1.cardknox.com/gateway", MyPost))
'Response
Dim MyResponseData As System.Collections.Specialized.NameValueCollection = System.Web.HttpUtility.ParseQueryString(MyResponse) 'If necessary, add reference to System.Web
Dim MyResult As String = ""
If MyResponseData.AllKeys.Contains("xResult") Then MyResult = MyResponseData("xResult")
Dim MyStatus As String = ""
If MyResponseData.AllKeys.Contains("xStatus") Then MyStatus = MyResponseData("xStatus")
Dim MyError As String = ""
If MyResponseData.AllKeys.Contains("xError") Then MyError = MyResponseData("xError")
Dim MyRefNum As String = ""
If MyResponseData.AllKeys.Contains("xRefNum") Then MyRefNum = MyResponseData("xRefNum")cc:sale
cc:refund
cc:sale
cc:sale
Integration
In Scope
In Scope
Language
Swift
Objective C
UI Toolkit
Storyboard
Storyboard
Integration
In Scope
Language
Swift
UI Toolkit
Storyboard
Transaction
cc:sale
Integration
In Scope
Language
Objective C
UI Toolkit
Storyboard
Transaction Type
cc:refund
Integration
Out of Scope
Out of Scope
Language
Swift
Objective C
UI Toolkit
Storyboard
Storyboard
Integration
Out of Scope
Language
Swift
UI Toolkit
Storyboard
Transaction
cc:sale
Integration
Out of Scope
Language
Objective C
UI Toolkit
Storyboard
Transaction Type
cc:sale
Transaction Type
Transaction Type
example: EnableDeviceInsertSwipeTap=true
EnableKeyedEntry - controls the availability of the keyed screen
controls the availability of the keyed screen
value type: boolean
possible values: true, false
example: EnableKeyedEntry=true
x
-
true
x
-
false
x
true
true
x
x
true
false
x
false
true
x
false
false
x
xAmount
double
Total amount of the transaction, including tax and tip, if applicable.
3.0
xRedirectURL
URL
A URL where the Sola app delivers the results of processing a transaction.
URL needs to have a schema/protocol alongside the domain name.
Results are delivered by the app, appending the Sola API response to this value and opening the URL on the mobile device’s browser.
This is a GET request.
https://www.test.com/
The customer card number.
4444333322221111
xCustReceipt
bool
True/False value indicating if the email address specified in xemail should receive a receipt containing the transaction details.
False
xEmail
string
The customer’s email address.
xCVV
string
3-digit code from the back of the card (for Amex, 4-digit code from the front of the card).
123
xName
string
The cardholder’s name.
John Doe
xInvoice
string
The merchant’s invoice number for the transaction. xInvoice is recommended when available for improved duplicate handling.
123456A
xPoNum
int
The merchant’s purchase order number for the transaction.
123485
xDescription
string
Additional data optionally passed along for reporting.
This is a description
xUserName
string
User’s name
John
xZip
string
The billing zip code of the cardholder.
11111
xStreet
string
The billing street address of the cardholder.
123 Any Street
xRefNum
double
Used to reference a previous transaction when doing a follow-up transaction, typically a refund, void, or capture.
Note: xRefnum can be a 64-bit number.
81234568
xCustom01
string
3 custom fields are available for custom data, such as customer comments, etc. Use xCustom01 through xCustom03.
xAuthCode
double
xAuthCode is a verification number provided by the issuing bank to be used with the cc:postauth command.
T4321A
xBillCity
string
The customer’s city for their billing profile.
Anytown
xBillCompany
string
The customer’s company name for their billing profile.
Acme
xBillCountry
string
The customer’s country for their billing profile.
USA
xBillFirstName
string
The customer’s first name for their billing profile.
John
xBillLastName
string
The customer’s last/family name for their billing profile.
Doe
xBillState
string
The customer’s state for their billing profile.
NY
xBillStreet
string
The customer’s street address for their billing profile.
123 Any Street
xBillPhone
string
The customer’s phone number for their billing profile.
8005551212
xBillZip
string
The customer’s zip code for their billing profile.
12345
xShipCity
string
The customer’s city for their shipping profile.
Anytown
xShipCompany
string
The customer’s company name for their shipping profile.
Acme
xShipFirstName
string
The customer’s first name for their shipping profile.
John
xShipLastName
string
The customer’s last/family name for their shipping profile.
Doe
xShipState
string
The customer’s state for their shipping profile.
NY
xShipStreet
string
The customer’s street address for their shipping profile.
123 Any Street
xShipPhone
string
The customer’s phone number for their shipping profile.
8005551212
xShipZip
string
The customer’s zip code for their shipping profile.
11111
EnableDeviceInsertSwipeTap
EnableKeyedEntry
Keyed UI available
Swipe UI available
-
-
x
true
-
x
x
false
Response
Value
xError
DeepLink Cancelled
xResult
E
xStatus
Error
Name
Type
Description
Sample data
Additional notes
xKey
string
Sola account key
Sola
Has to be a non-empty, non-pure-whitespace string.
xCommand
string
Sola transaction type
cc:sale
Name
Type
Description
Sample data
xAllowDuplicate
bool
By default, Sola rejects duplicate transactions within 10 minutes of the original transaction. This command overrides that safeguard. True/False allowed.
False
xExp
string
The card expiration number. Format: MMYY
1249
xCardNum





-
Has to be lowercase.
Supported values are all values supported by the Sola API.
string
Use: iStatus.success
Use: GPEnvironment.test
Use: GPButtonColor.white
Use: GPButtonType.buy
Use: GPButtonSizeMode.fill
Use: GPBillingAddressFormat.min
The Main object that contains all the information necessary to communicate with Google Pay API.
Name
Type
Required
Description
merchantInfo
No
Describes the Merchant name and website. For more information please click the link
onGPButtonLoaded
String
No
Name of a callback function to be called when Google Pay button is loaded. Accepts an object of type .
onGetTransactionInfo
Payment Request example
onGPButtonLoaded example
onGetTransactionInfo example
onBeforeProcessPayment callback example
onProcessPayment callback example
onPaymentCanceled callback example
Name
Type
Required
Description
merchantName
String
Yes
From Google documentation:
Merchant name encoded as UTF-8. Merchant name is rendered in the payment sheet. In TEST environment, or if a merchant isn't recognized, a “Pay Unverified Merchant” message is displayed in the payment sheet.
Merchant Info example
Name
Type
Description
status
There are 3 possible cases:
Google Pay Button loaded successfully: status = iStatus.success
Google Pay not supported: status = iStatus.unsupported
An error occurred while loading Google Pay Button: status = iStatus.error
reason
String
If Google Pay Button failed to load this field will be populated with the reason.
Name
Type
Required
Description
transactionId
String
No
From Google documentation: A unique ID that identifies a transaction attempt. If not provided will be automatically generated by iFields API. Will be sent back on paymentRequest..transactionInfo response object.
allowedAuthMethods
String[]
No
If not provided will be defaulted to ["PAN_ONLY", "CRYPTOGRAM_3DS"]
From Google documentation:
Fields supported to authenticate a card transaction.
PAN_ONLY: This authentication method is associated with payment cards stored on file with the user's Google Account. Returned payment data includes personal account number (PAN) with the expiration month and the expiration year.
CRYPTOGRAM_3DS: This authentication method is associated with cards stored as Android device tokens. Returned payment data includes a 3-D Secure (3DS) cryptogram generated on the device.
allowedCardNetworks
Billing Parameters example
Name
Type
Required
Description
onGetShippingOptions
String
No
When shipping is required you need to provide the name of your function that returns a list of shipping options.
For an example - please see below
onGetShippingCosts
String
No
When shipping is required you need to provide the name of your function that returns a list of shipping costs.
For an example - please see below
shippingAddressRequired
Shipping Parameters example
Name
Type
Description
shippingAddress
An Address containing countryCode, postalCode, locality(city), administrativeArea(state).
shippingOptionData
An object containing a selected option
ShippingData object example
Name
Type
Description
postalCode
String
From Google documentation: The postal or ZIP code.
countryCode
String
From Google documentation: ISO 3166-1 alpha-2 country code.
locality
String
From Google documentation: City, town, neighborhood, or suburb.
administrativeArea
Name
Type
Description
id
String
id of selected shipping option
Name
Type
Required
Description
buttonColor
No
From Google documentation:
default: A Google-selected default value. Currently black but it may change over time (default).
black: A black button suitable for use on white or light backgrounds.
buttonType
No
From Google documentation:
buy: "Buy with Google Pay" button (default).
donate: "Donate with Google Pay" button.
plain
buttonSizeMode
Button Options example
This page contains all API documentation for Electronic Benefit Transfer (EBT) transactions. For more information regarding account access, navigate to the Transaction API parent page.
POST ebtfs:sale
xCommand = ebtfs:sale
The Sale command is used to make a purchase on an EBT cardholder’s food stamp account.
POST ebtfs:credit
xCommand = ebtfs:credit
The Credit command is used to credit an EBT cardholder’s food stamp account.
POST ebtfs:balance
xCommand = ebtfs:Balance
The Balance command is used to check the balance on an EBT cash benefit account.
POST ebtfs:voucher
xCommand = ebtfs:voucher
The Voucher command is used to process a manual EBT food stamp voucher.
POST ebtcb:sale
xCommand = ebtcb:sale
The Sale command is used to make a purchase on an EBT cardholder’s cash benefit account.
POST ebtcb:cash
xCommand = ebtcb:Cash
The Cash command enables a cash withdrawal from an EBT cardholder’s cash benefit account.
POST ebtcb:balance
xCommand = ebtcb:Balance
The Balance command is used to check the balance on an EBT cash benefit account.
POST ebtw:sale
xCommand = ebtw:sale
The Sale command is used to make a purchase on an EBTW cardholder’s cash benefit account.
POST ebtw:balance
xCommand = ebtw:Balance
The Balance command is used to check the balance on an EBTW cash benefit account.
POST ebtw:void
xCommand = ebtw:Void
The Void command voids a purchase made with an EBTW cardholder’s cash benefit account.
The code below is a source of ifield-sample.htm
CardknoxSDK.setPrincipalKey("Your xKey value");
CardknoxSDK.setxSoftwareName("Your app name", xSoftwareVersion: "1.0.0", xVersion: "4.5.9");func viewDidAppear()
{
// Example of a "view appear" method in a SwiftUI View
// Store the object instance as a @State in the View for later use
let cardknoxSDKDirect = CardknoxSDKDirect.create() as? CardknoxSDKDirect;
}struct InScopeView : View
{
var body: some View
{
// Using NavigationView as a View example
NavigationView{}
.onAppear(perform: viewDidAppear)
}
}cardknoxSDKDirect.destroy();let prms : TransactionParameters = TransactionParameters.init()prms.xCommand = "<xCommand>";
prms.xAmount = 1.23;prms.xCardNum = "4444333322221111";
prms.xExpDate = "1225"; // MMYYprms.xRefNum = "123456789";prms.xInvoice = "123456";
prms.xBillFirstName = "Billing first name";
// ... etc. let request = cardknoxSDKDirect.createRequest(withParameters: prms) as! PaymentTransactionRequestDirect;
if(request.isValid)
{
let respone = request.process() as! PaymentTransactionResponse
if(response.isSuccess())
{
let refNum = respone.xRefNum();
let status = respone.xStatus();
let avs = respone.xAvsResult();
}
else
{
let refNum = response.xRefNum();
let error = response.xError()!
let errorCode = response.xErrorCode()!;
}
}
else
{
// Request could not be processed due to these errors
let errors = request.validationErrors!
}CardknoxSDK.setPrincipalKey("Your xKey value");
CardknoxSDK.setxSoftwareName("Your app name", xSoftwareVersion: "1.0.0", xVersion: "4.5.9");override func viewDidAppear(_ animated: Bool)
{
super.viewDidAppear(animated)
let cardknoxSDKDirect = CardknoxSDKDirect.create() as? CardknoxSDKDirect
}cardknoxSDKDirect.destroy();let prms = TransactionParameters();prms.xCommand = "<xCommand>";
prms.xAmount = 1.23;prms.xCardNum = "4444333322221111";
prms.xExpDate = "1225"; // MMYYprms.xRefNum = "123456789";prms.xInvoice = "123456";
prms.xBillFirstName = "Billing first name";
// ... etc. let request = cardknoxSDKDirect.createRequest(withParameters: prms) as! PaymentTransactionRequestDirect;
if(request.isValid)
{
let respone = request.process() as! PaymentTransactionResponse
if(response.isSuccess())
{
let refNum = respone.xRefNum();
let status = respone.xStatus();
let avs = respone.xAvsResult();
}
else
{
let refNum = response.xRefNum();
let error = response.xError()!
let errorCode = response.xErrorCode()!;
}
}
else
{
// Request could not be processed due to these errors
let errors = request.validationErrors!
}[CardknoxSDK setPrincipalKey:@"Your xKey"];
[CardknoxSDK setxSoftwareName:@"Your app name" xSoftwareVersion:@"1.0.0" xVersion:@"4.5.9"];- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
CardknoxSDKDirect* cardknoxSDKDirect = [CardknoxSDKDirect create];
}[cardknoxSDKDirect destroy];TransactionParameters *prms =[[TransactionParameters alloc] init];prms.xCommand = @"<xCommand>";
prms.xAmount = 1.23;prms.xCardNum = @"4444333322221111";
prms.xExpDate = @"1225"; // MMYYprms.xRefNum = @"123456789";prms.xInvoice = @"123456";
prms.xBillFirstName = @"Billing first name";
// ... etc. PaymentTransactionRequestDirect *request = [cardknoxSDKDirect createRequestWithParameters:prms];
if([request IsValid])
{
PaymentTransactionResponse * response = [request process];
if(response.isSuccess)
{
NSString* refNum = response.xRefNum;
NSString* status = response.xStatus;
NSString* avs = response.xAvsResult;
}
else
{
NSString* refNum = response.xRefNum;
NSString* error = response.xError;
NSString* errorCode = response.xErrorCode;
}
}
else
{
// Request could not be processed due to these errors
NSArray* errors = request.ValidationErrors;
}CardknoxSDK.setPrincipalKey("Your xKey value");
CardknoxSDK.setxSoftwareName("Your app name", xSoftwareVersion: "1.0.0", xVersion: "4.5.9");func viewDidAppear()
{
// Example of a "view appear" method in a SwiftUI View
// Store the object instance as a @State in the View for later use
let cardknoxSDKUI = CardknoxSDKUI.create() as? CardknoxSDKUI
}struct OutOfScopeView : View
{
var body: some View
{
// Using NavigationView as a View example
NavigationView{}
.onAppear(perform: viewDidAppear)
}
}cardknoxSDKDirect.destroy();let transactionResultSubscription =
NotificationCenter.default.publisher(for: NSNotification.Name(CardknoxSDK.transactionResultSubscription_NSNotificationCenterName()))let cardreaderEventSubscription =
NotificationCenter.default.publisher(for: NSNotification.Name(CardknoxSDK.cardreaderEventSubscription_NSNotificationCenterName()))func transactionResultSubscription(aNotification: Notification)
{
let response = PaymentTransactionResponse.unwrap(aNotification) as! PaymentTransactionResponse
var message = ""
if(response.isSuccess())
{
let refNum = response.xRefNum()!
message = "Transaction success response! Ref num: " + refNum
}
else
{
let error = response.errorMessage()!
message = "Transaction error response - " + error
}
}struct OutOfScopeView : View
{
var body: some View
{
// Using NavigationView as a View example
NavigationView{}
.onReceive(transactionResultSubscriptionPublisher, perform: transactionResultSubscription(aNotification:))
}
}func cardreaderEventSubscription(aNotification: Notification)
{
let callback = CardknoxCardReaderCallback.unwrap(aNotification) as? CardknoxCardReaderCallback
let code = callback?.code()
let name = callback?.name()
var errorMessage : String?;
if(code == CardknoxCardReaderCallbackType.error()){
errorMessage = callback?.message();
}
}struct OutOfScopeView : View
{
var body: some View
{
// Using NavigationView as a View example
NavigationView{}
.onReceive(cardreaderEventSubscriptionPublisher, perform: cardreaderEventSubscription(aNotification:))
}
}let prms = TransactionParameters();prms.xCommand = "<xCommand>";
prms.xAmount = 1.23;prms.xInvoice = "123456";
prms.xBillFirstName = "Billing first name";
// ... etc. // Define if a 'keyed' screen is available
CardknoxSDKUI.setEnableKeyedEntry(true);
// Define if a 'swipe' screen is available
CardknoxSDKUI.setEnableDeviceInsertSwipeTap(true);
// Define if the UI should auto close
CardknoxSDKUI.setCloseOnProcessedTransaction(true);
let request = cardknoxSDKUI.createRequest(withParameters: prms) as! PaymentTransactionRequestUI
if(request.isValid)
{
// Show the Cardknox UI
request.process()
}
else
{
// Request could not be processed due to these errors
let errors = request.validationErrors!
}CardknoxSDK.setPrincipalKey("Your xKey value");
CardknoxSDK.setxSoftwareName("Your app name", xSoftwareVersion: "1.0.0", xVersion: "4.5.9");override func viewDidAppear(_ animated: Bool)
{
super.viewDidAppear(animated)
let cardknoxSDKUI = CardknoxSDKUI.create() as? CardknoxSDKUI
}cardknoxSDKDirect.destroy();@objc func transactionResultSubscription(aNotification: Notification)
{
let response = PaymentTransactionResponse.unwrap(aNotification) as! PaymentTransactionResponse
var message = ""
if(response.isSuccess())
{
let refNum = response.xRefNum()!
message = "Transaction success response! Ref num: " + refNum
}
else
{
let error = response.errorMessage()!
message = "Transaction error response - " + error
}
}NotificationCenter.default.addObserver(self,
selector: #selector(transactionResultSubscription(aNotification:)),
name: Notification.Name( CardknoxSDK.transactionResultSubscription_NSNotificationCenterName()),
object: nil)@objc func cardreaderEventSubscription(aNotification: Notification)
{
let callback = CardknoxCardReaderCallback.unwrap(aNotification) as? CardknoxCardReaderCallback
let code = callback?.code()
let name = callback?.name()
var errorMessage : String?;
if(code == CardknoxCardReaderCallbackType.error()){
errorMessage = callback?.message();
}
}NotificationCenter.default.addObserver(self,
selector: #selector(cardreaderEventSubscription(aNotification:)),
name: Notification.Name( CardknoxSDK.cardreaderEventSubscription_NSNotificationCenterName()),
object: nil)let prms = TransactionParameters();prms.xCommand = "<xCommand>";
prms.xAmount = 1.23;prms.xInvoice = "123456";
prms.xBillFirstName = "Billing first name";
// ... etc. // Define if a 'keyed' screen is available
CardknoxSDKUI.setEnableKeyedEntry(true);
// Define if a 'swipe' screen is available
CardknoxSDKUI.setEnableDeviceInsertSwipeTap(true);
// Define if the UI should auto close
CardknoxSDKUI.setCloseOnProcessedTransaction(true);
let request = cardknoxSDKUI.createRequest(withParameters: prms) as! PaymentTransactionRequestUI
if(request.isValid)
{
// Show the Cardknox UI
request.process()
}
else
{
// Request could not be processed due to these errors
let errors = request.validationErrors!
}[CardknoxSDK setPrincipalKey:@"Your xKey"];
[CardknoxSDK setxSoftwareName:@"Your app name" xSoftwareVersion:@"1.0.0" xVersion:@"4.5.9"];- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
CardknoxSDKUI* cardknoxSDKUI = [CardknoxSDKUI create];
}[cardknoxSDKUI destroy];-(void)transactionResultSubscription:(NSNotification*)aNotification
{
PaymentTransactionResponse * response = [PaymentTransactionResponse unwrap:aNotification];
NSString *message;
if(response.isSuccess)
{
NSString * refNum = response.xRefNum;
message = [NSString stringWithFormat:@"Transaction success response! Ref num: %@", refNum];
}
else
{
NSString * error = response.errorMessage;
message = [NSString stringWithFormat:@"Transaction error response - %@", error];
}
}[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(transactionResultSubscription:)
name:[CardknoxSDK transactionResultSubscription_NSNotificationCenterName]
object:nil];-(void)cardreaderEventSubscription:(NSNotification*)callbackNotification
{
CardknoxCardReaderCallback* callback = [CardknoxCardReaderCallback unwrap:callbackNotification];
int code = callback.code;
NSString* name = callback.name;
NSString* errorMessage;
if(code == CardknoxCardReaderCallbackType.error){
errorMessage = callback.message;
}
}NotificationCenter.default.addObserver(self,
selector: #selector(cardreaderEventSubscription(aNotification:)),
name: Notification.Name( CardknoxSDK.cardreaderEventSubscription_NSNotificationCenterName()),
object: nil)TransactionParameters *prms =[[TransactionParameters alloc] init];prms.xCommand = @"<xCommand>";
prms.xAmount = 1.23;prms.xInvoice = @"123456";
prms.xBillFirstName = @"Billing first name";
// ... etc. // Define if a 'keyed' screen is available
CardknoxSDKUI.EnableKeyedEntry = true;
// Define if a 'swipe' screen is available
CardknoxSDKUI.EnableDeviceInsertSwipeTap = true;
// Define if the UI should auto close
CardknoxSDKUI.CloseSDKUIOnProcessedTransaction = true;
PaymentTransactionRequestUI *request = [cardknoxSDKUI createRequestWithParameters:prms];
if(request.IsValid)
{
// Show the Cardknox UI
[request process];
}
else
{
// Request could not be processed due to these errors
NSArray* errors = request.ValidationErrors;
}prms.xCardNum = "4444333322221111";
2prms.xExpDate = "1225"; // MMYYCardknoxSDK.setPrincipalKey("Your xKey value");
CardknoxSDK.setxSoftwareName("Your app name", xSoftwareVersion: "1.0.0", xVersion: "4.5.9")override func viewDidAppear(_ animated: Bool)
{
super.viewDidAppear(animated)
let cardknoxSDKDirect = CardknoxSDKDirect.create() as? CardknoxSDKDirect
}cardknoxSDKDirect.destroy();let prms = TransactionParameters();prms.xCommand = "cc:sale";
prms.xAmount = 1.23;prms.xCardNum = "4444333322221111";
prms.xExpDate = "1225"; // MMYYprms.xInvoice = "123456";
prms.xBillFirstName = "Billing first name";
// ... etc. let request = cardknoxSDKDirect.createRequest(withParameters: prms) as! PaymentTransactionRequestDirect;
if(request.isValid)
{
let respone = request.process() as! PaymentTransactionResponse
if(response.isSuccess())
{
let refNum = respone.xRefNum();
let status = respone.xStatus();
let avs = respone.xAvsResult();
}
else
{
let refNum = response.xRefNum();
let error = response.xError()!
let errorCode = response.xErrorCode()!;
}
}
else
{
// Request could not be processed due to these errors
let errors = request.validationErrors!
}prms.xRefNum = @"123456789";[CardknoxSDK setPrincipalKey:@"Your xKey"];
[CardknoxSDK setxSoftwareName:@"Your app name" xSoftwareVersion:@"1.0.0" xVersion:@"4.5.9"];- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
CardknoxSDKDirect* cardknoxSDKDirect = [CardknoxSDKDirect create];
}[cardknoxSDKDirect destroy];TransactionParameters *prms =[[TransactionParameters alloc] init];prms.xCommand = @"cc:refund";
prms.xAmount = 1.23;prms.xRefNum = @"123456789";prms.xInvoice = @"123456";
prms.xBillFirstName = @"Billing first name";
// ... etc. PaymentTransactionRequestDirect *request = [cardknoxSDKDirect createRequestWithParameters:prms];
if([request IsValid])
{
PaymentTransactionResponse * response = [request process];
if(response.isSuccess)
{
NSString* refNum = response.xRefNum;
NSString* status = response.xStatus;
NSString* avs = response.xAvsResult;
}
else
{
NSString* refNum = response.xRefNum;
NSString* error = response.xError;
NSString* errorCode = response.xErrorCode;
}
}
else
{
// Request could not be processed due to these errors
NSArray* errors = request.ValidationErrors;
}CardknoxSDK.setPrincipalKey("Your xKey value");
CardknoxSDK.setxSoftwareName("Your app name", xSoftwareVersion: "1.0.0", xVersion: "4.5.9")override func viewDidAppear(_ animated: Bool)
{
super.viewDidAppear(animated)
let cardknoxSDKUI = CardknoxSDKUI.create() as? CardknoxSDKUI
}cardknoxSDKDirect.destroy();@objc func transactionResultSubscription(aNotification: Notification)
{
let response = PaymentTransactionResponse.unwrap(aNotification) as? PaymentTransactionResponse
var message = ""
if((response?.isSuccess()) != nil)
{
let refNum = (response?.xRefNum())! as String
message = "Transaction success response! Ref num: " + refNum
}
else
{
let error = (response?.errorMessage())! as String
message = "Transaction error response - " + error
}
}NotificationCenter.default.addObserver(self,
selector: #selector(transactionResultSubscription(aNotification:)),
name: Notification.Name( CardknoxSDK.transactionResultSubscription_NSNotificationCenterName()),
object: nil)@objc func cardreaderEventSubscription(aNotification: Notification)
{
let callback = CardknoxCardReaderCallback.unwrap(aNotification) as? CardknoxCardReaderCallback
let code = callback?.code()
let name = callback?.name()
var errorMessage : String?;
if(code == CardknoxCardReaderCallbackType.error()){
errorMessage = callback?.message();
}
}NotificationCenter.default.addObserver(self,
selector: #selector(cardreaderEventSubscription(aNotification:)),
name: Notification.Name( CardknoxSDK.cardreaderEventSubscription_NSNotificationCenterName()),
object: nil)let prms = TransactionParameters();prms?.xCommand = "cc:sale";
2prms?.xAmount = 1.23;prms?.xInvoice = "123456";
prms?.xBillFirstName = "Billing first name";
// ... etc. // Define if a 'keyed' screen is available
CardknoxSDKUI.setEnableKeyedEntry(true);
// Define if a 'swipe' screen is available
CardknoxSDKUI.setEnableDeviceInsertSwipeTap(true);
// Define if the UI should auto close
CardknoxSDKUI.setCloseOnProcessedTransaction(true);
let request = cardknoxSDKUI.createRequest(withParameters: prms) as! PaymentTransactionRequestUI
if(request.isValid)
{
// Show the Cardknox UI
request.process()
}
else
{
// Request could not be processed due to these errors
let errors = request.validationErrors!
}[CardknoxSDK setPrincipalKey:@"Your xKey"];
[CardknoxSDK setxSoftwareName:@"Your app name" xSoftwareVersion:@"1.0.0" xVersion:@"4.5.9"];- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
CardknoxSDKUI* cardknoxSDKUI = [CardknoxSDKUI create];
}[cardknoxSDKUI destroy];-(void)transactionResultSubscription:(NSNotification*)aNotification
{
PaymentTransactionResponse * response = [PaymentTransactionResponse unwrap:aNotification];
NSString *message;
if(response.isSuccess)
{
NSString * refNum = response.xRefNum;
message = [NSString stringWithFormat:@"Transaction success response! Ref num: %@", refNum];
}
else
{
NSString * error = response.errorMessage;
message = [NSString stringWithFormat:@"Transaction error response - %@", error];
}
}[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(transactionResultSubscription:)
name:[CardknoxSDK transactionResultSubscription_NSNotificationCenterName]
object:nil];-(void)cardreaderEventSubscription:(NSNotification*)callbackNotification
{
CardknoxCardReaderCallback* callback = [CardknoxCardReaderCallback unwrap:callbackNotification];
int code = callback.code;
NSString* name = callback.name;
NSString* errorMessage;
if(code == CardknoxCardReaderCallbackType.error){
errorMessage = callback.message;
}
}NotificationCenter.default.addObserver(self,
selector: #selector(cardreaderEventSubscription(aNotification:)),
name: Notification.Name( CardknoxSDK.cardreaderEventSubscription_NSNotificationCenterName()),
object: nil)TransactionParameters *prms = [[TransactionParameters alloc] init];prms.xCommand = @"cc:sale";
prms.xAmount = 1.23;prms.xInvoice = @"123456";
prms.xBillFirstName = @"Billing first name";
// ... etc.// Define if a 'keyed' screen is available
CardknoxSDKUI.EnableKeyedEntry = true;
// Define if a 'swipe' screen is available
CardknoxSDKUI.EnableDeviceInsertSwipeTap = true;
// Define if the UI should auto close
CardknoxSDKUI.CloseSDKUIOnProcessedTransaction = true;
PaymentTransactionRequestUI *request = [cardknoxSDKUI createRequestWithParameters:prms];
if(request.IsValid)
{
// Show the Cardknox UI
[request process];
}
else
{
// Request could not be processed due to these errors
NSArray* errors = request.ValidationErrors;
}adb shell am start -a android.intent.action.VIEW -d "dck://portal.cardknox.com/cardknoxdeeplink" com.gateway.cardknox.androiddck://app.cardknox.com/transaction?xAmount=1.0&xKey=CardknoxSupport_Test&xRedirectURL=https://www.test.com/&xCommand=cc:salehttps://www.test.com/?xError=Required+parameter%3a+xKey&xResult=E&xStatus=Errorhttps://www.test.com/?xError=Required+parameter%3a+xAmount&xResult=E&xStatus=Errorhttps://www.test.com/?xError=Required+parameter%3a+xCommand&xResult=E&xStatus=Errorhttps://www.test.com/?xResult=A&xStatus=Approved&xError=&xErrorCode=00000&xRefNum=441701775&xExp=0421&xDate=4%2f7%2f2021+8%3a04%3a58+AM&xAuthCode=382480&xBatch=6913571&xAvsResultCode=NNN&xAvsResult=Address%3a+No+Match+%26+5+Digit+Zip%3a+No+Match&xCvvResultCode=&xCvvResult=No+CVV+data+available&xAuthAmount=1.30&xToken=7848qp7h1qp7q8p199062qnh4h9mq2q7&xMaskedCardNumber=4xxxxxxxxxxx1111&xCardType=Visahttps://www.test.com/?xResult=E&xStatus=Error&xError=Duplicate+Transaction&xErrorCode=01332&xRefNum=441702196&xExp=0421&xDate=4%2f7%2f2021+8%3a07%3a18+AM&xAuthCode=000000&xBatch=&xAvsResultCode=&xAvsResult=Unmapped+AVS+response&xCvvResultCode=&xCvvResult=No+CVV+data+available&xDuplicateAuthCode=382480&xDuplicateRefnum=441701775&xMaskedCardNumber=4xxxxxxxxxxx1111&xCardType=Visaconst iStatus = {
success: 100,
unsupported: -100,
error: -200
}const GPEnvironment = {
test: "TEST",
production: "PRODUCTION"
}const GPButtonColor = {
default: "default",
black: "black",
white: "white"
}const GPButtonType = {
buy: "buy",
donate: "donate",
plain: "plain"
}const GPButtonSizeMode = {
static: "static",
fill: "fill"
}const GPBillingAddressFormat = {
min: "MIN",
full: "FULL"
}initGP: function() {
return {
merchantInfo: this.merchantInfo,
buttonOptions: this.buttonOptions,
environment: this.getGPEnvironment(),
billingParameters: this.billingParams,
shippingParameters: {
emailRequired: this.shippingParams.emailRequired,
onGetShippingCosts: "gpRequest.shippingParams.onGetShippingCosts",
onGetShippingOptions: "gpRequest.shippingParams.onGetShippingOptions"
},
onGetTransactionInfo: "gpRequest.onGetTransactionInfo",
onBeforeProcessPayment: "gpRequest.onBeforeProcessPayment",
onProcessPayment: "gpRequest.onProcessPayment",
onPaymentCanceled: "gpRequest.onPaymentCanceled",
onGPButtonLoaded: "gpRequest.gpButtonLoaded"
};
}gpButtonLoaded: function(resp) {
if (!resp) return;
if (resp.status === iStatus.success) {
showHide("divGpay", true);
showHide("lbGPPayload", true);
} else if (resp.reason) {
alert(resp.reason);
}
}onGetTransactionInfo: function () {
let amt = this.getAmount();
return {
displayItems: [
{
label: "Subtotal",
type: "SUBTOTAL",
price: amt.toString(),
},
{
label: "Tax",
type: "TAX",
price: (0.1 * amt).toString(),
}
],
countryCode: 'US',
currencyCode: "USD",
totalPriceStatus: "FINAL",
totalPrice: (1.1 * amt).toString(),
totalPriceLabel: "Total"
}
}onBeforeProcessPayment: function () {
return new Promise(function (resolve, reject) {
try {
//Do some validation here
resolve(iStatus.success);
} catch (err) {
reject(err);
}
});
}onProcessPayment: function (paymentRequest) {
let self = this;
return new Promise(function (resolve, reject) {
setTimeout(function () {
try {
console.log("paymentRequest", JSON.stringify(paymentRequest));
paymentToken = paymentRequest.paymentData.paymentMethodData.tokenizationData.token;
console.log("paymentToken", paymentToken);
const amt = (chained([paymentRequest, "transactionInfo", "totalPrice"]) && paymentRequest.transactionInfo.totalPrice) || 0;
try {
if (amt <= 0)
throw "Payment is not authorized. Invalid amount. Amount must be greater than 0";
authorizeGPay({ token: paymentToken, amount: amt})
.then((resp) => {
gpRequest.handleResponse(resp);
resolve(resp);
})
.catch((rej) => {
console.error("Payment is not authorized", JSON.stringify(rej));
setTimeout(function () { alert("Payment is not authorized. Please check the logs") }, 500);
reject(rej);
});
} catch (err) {
const emsg = JSON.stringify(err);
console.error(emsg);
setTimeout(function () { alert(emsg) }, 500);
reject({error: err});
}
} catch (e) {
reject(e);
}
}, 100); //3000);
});
}onPaymentCanceled: function(respCanceled) {
setTimeout(function () { alert("Payment was canceled") }, 500);
}merchantInfo: {
merchantName: "Example Merchant"
}billingParameters: {
transactionId: "b65c7435-b57a-407e-a6e0-b166518d5d97",
allowedAuthMethods: ["PAN_ONLY"],
allowedCardNetworks: ["VISA", "MASTERCARD"],
emailRequired: true
billingAddressRequired: true,
billingAddressFormat: GPBillingAddressFormat.min,
phoneNumberRequired: true
}shippingParams: {
allowedCountryCodes: ['US'],
onGetShippingCosts: function (shippingData) {
logDebug({
label: "onGetShippingCosts",
data: shippingData
});
return {
"shipping-001": "0.00",
"shipping-002": "1.99",
"shipping-003": "10.00"
}
},
onGetShippingOptions: function (shippingData) {
logDebug({
label: "onGetShippingOptions",
data: shippingData
});
let selectedOptionid = "shipping-001";
if (shippingData && shippingData.shippingOptionData && shippingData.shippingOptionData.id !== "shipping_option_unselected") {
selectedOptionid = shippingData.shippingOptionData.id;
}
return {
defaultSelectedOptionId: selectedOptionid,
shippingOptions: [
{
"id": "shipping-001",
"label": "Free: Standard shipping",
"description": "Free Shipping delivered in 5 business days."
},
{
"id": "shipping-002",
"label": "$1.99: Standard shipping",
"description": "Standard shipping delivered in 3 business days."
},
{
"id": "shipping-003",
"label": "$10: Express shipping",
"description": "Express shipping delivered in 1 business day."
},
]
};
}
}{
"shippingAddress": {
"countryCode": "US",
"postalCode": "10601",
"locality": "White Plains",
"administrativeArea": "NY"
},
"shippingOptionData": {
"id": "shipping-001"
}
}buttonOptions: {
buttonColor: GPButtonColor.white,
buttonType: GPButtonType.buy,
buttonSizeMode: GPButtonSizeMode.full
}white: A white button suitable for use on colorful backgrounds.String
Yes
Name of a callback function to be called that returns the final price and tax calculations. Please click here for the sample code
onBeforeProcessPayment
String
No
Name of a callback function to be called when consumer clicked the button but before Google Pay sheet is loaded . Usually used to make validations before the payment. Please click here for the sample code
onProcessPayment
String
Yes
Name of a callback function to be called when Google Payment is authorized for the completion of the transaction. This function accepts a parameter of PaymentResponse. Please click here for the sample code
onPaymentCanceled
String
No
Name of a callback function to be called when Google Pay sheet is closed/canceled without completing the transaction. Please click here for the sample code
environment
String
No
Google Pay Environment. Could be either “TEST“ or “PRODUCTION“. If omitted, defaults to “TEST“
billingParameters
No
Sets Billing parameters, including transactionId. For more information please click the link
shippingParameters
No
Sets various Shipping Options. For more information please click the link
buttonOptions
No
Provides Google Pay button customization options. For more information please click the link
String[]
No
If not provided will be defaulted to ["AMEX", "DISCOVER", "MASTERCARD", "VISA"]
From Google documentation:
One or more card networks that you support, also supported by the Google Pay API.
AMEX
DISCOVER
INTERAC
JCB
MASTERCARD
VISA
assuranceDetailsRequired
Boolean
No
From Google documentation:
Set to true to request assuranceDetails. This object provides information about the validation performed on the returned payment data.
billingAddressRequired
Boolean
No
From Google documentation:
Set to true if you require a billing address. A billing address should only be requested if it's required to process the transaction.
billingAddressFormat
No
Has an effect when billingAddressRequired is set to true From Google documentation: Billing address format required to complete the transaction.
MIN: Name, country code, and postal code (default).
FULL: Name, street address, locality, region, country code, and postal code.
phoneNumberRequired
Boolean
No
Has an effect when billingAddressRequired is set to true
From Google documentation:
Set to true if a phone number is required to process the transaction.
Boolean
No
From Google documentation:
Set to true to request a full shipping address..
emailRequired
Boolean
No
From Google documentation:
Set to true to request an email address.
phoneNumberRequired
Boolean
No
From Google documentation:
Set to true if a phone number is required for the provided shipping address.
allowedCountryCodes
String[]
No
From Google documentation:
ISO 3166-1 alpha-2 country code values of the countries where shipping is allowed. If this object isn't specified, will be defaulted to US only.
String
From Google documentation: A country subdivision, such as a state or province.
No
From Google documentation:
static: Button has a static width and height (default).
fill: Button size changes to fill the size of its container.
xSoftwareVersion*
String
Version number of your software
xCommand*
String
Sola transaction type
xAmount*
String
The total amount of the transaction, inclusive of tax and tip if applicable.
xDUKPT*
String
The DUK/PT key for PIN debit and EBT transactions.The first 16 characters are the encrypted PIN block, followed by the 6 character long Key Set Identifier (KSID). The remaining characters are the PIN pad serial number and transaction counter.
xToken
String
The Sola token that references a previously used payment method. When using a token, xCardNum xExp and xMagstripe should not be used.
xCustom01
String
20 custom fields are available for custom data, such as customer comments, etc. Use xCustom01 through xCustom20.
xMagstripe
String
The magstripe data of a credit card. Magstripe data includes the card number and expiration date. When using this command, xCardNum xExp and xToken should not be used. Encrypted card data can also be sent using xMagstripe
xName
String
The cardholder’s name
xTax
String
The tax portion that is included in the total transaction amount (xAmount)
xTip
String
The tip portion that is included in the total transaction amount (xAmount)
xInvoice
String
The merchant’s invoice number for the transaction. xInvoice is recommended when available for improved duplicate handling
xPONum
String
The merchant’s purchase order number for the transaction
xComments
String
Additional data optionally passed along to the receipt
xDescription
String
Additional data optionally passed along for reporting
xIP
String
The customer’s IP address. Typically used for fraud detection
xEmail
String
The customer’s email address
xFax
String
The customer’s fax number
xBillFirstName
String
The customer’s first name for their billing profile
xBillMiddleName
String
The customer’s middle name or initial for their billing profile
xBillLastName
String
The customer’s last/family name for their billing profile
xBillCompany
String
The customer’s company name for their billing profile
xBillStreet
String
The customer’s street address for their billing profile
xBillStreet2
String
The customer’s street address 2nd line for their billing profile
xBillCity
String
The customer’s city for their billing profile
xBillState
String
The customer’s state for their billing profile
xBillZip
String
The customer’s zip code for their billing profile
xBillCountry
String
The customer’s country for their billing profile
xBillPhone
String
The customer’s phone number for their billing profile
xBillMobile
String
The customer’s mobile number for their billing profile
xShipFirstName
String
The customer’s first name for their shipping profile
xShipMiddleName
String
The customer’s middle name or initial for their shipping profile
xShipLastName
String
The customer’s last/family name for their shipping profile
xShipCompany
String
The customer’s company name for their shipping profile
xShipStreet
String
The customer’s street address for their shipping profile
xShipStreet2
String
The customer’s street address 2nd line for their shipping profile
xShipCity
String
The customer’s city for their shipping profile
xShipState
String
The customer’s state for their shipping profile
xShipZip
String
The customer’s zip code for their shipping profile
xShipCountry
String
The customer’s country for their shipping profile
xShipPhone
String
The customer’s phone number for their shipping profile
xShipMobile
String
The customer’s mobile number for their shipping profile
xAllowDuplicate
String
By default, Sola rejects duplicate transactions within 10 minutes of the original transaction. This command overrides that safeguard. True/False allowed.
xCustReceipt
String
True/False value indicating if the email address specified in xemail should receive a receipt containing the transaction details
xOrderID
String
Unique order number for FraudWatch verification
xExistingCustomer
String
Yes/No value indicating if the customer is a repeat customer
xSoftwareVersion*
String
Version number of your software
xCommand*
String
Sola transaction type
xAmount*
String
The total amount of the transaction, inclusive of tax and tip if applicable. This the total amount of the transaction.
xDUKPT*
String
The DUK/PT key for PIN debit and EBT transactions.The first 16 characters are the encrypted PIN block, followed by the 6 character long Key Set Identifier (KSID). The remaining characters are the PIN pad serial number and transaction counter.
xToken
String
The Sola token that references a previously used payment method. When using a token, xCardNum xExp and xMagstripe should not be used.
xCustom01
String
20 custom fields are available for custom data, such as customer comments, etc. Use xCustom01 through xCustom20.
xMagstripe
String
The magstripe data of a credit card. Magstripe data includes the card number and expiration date. When using this command, xCardNum xExp and xToken should not be used. Encrypted Card data can also be sent using xMagstripe.
xName
String
The cardholder’s name
xTax
String
The tax portion that is included in the total transaction amount (xAmount)
xTip
String
The tip portion that is included in the total transaction amount (xAmount)
xInvoice
String
The merchant’s invoice number for the transaction. xInvoice is recommended when available for improved duplicate handling.
xPONum
String
The merchant’s purchase order number for the transaction
xComments
String
Additional data optionally passed along to the receipt
xDescription
String
Additional data optionally passed along for reporting
xIP
String
The customer’s IP address. Typically used for fraud detection
xEmail
String
The customer’s email address
xFax
String
The customer’s fax number
xBillFirstName
String
The customer’s first name for their billing profile
xBillMiddleName
String
The customer’s middle name or initial for their billing profile
xBillLastName
String
The customer’s last/family name for their billing profile
xBillCompany
String
The customer’s company name for their billing profile
xBillStreet
String
The customer’s street address for their billing profile
xBillStreet2
String
The customer’s street address 2nd line for their billing profile
xBillCity
String
The customer’s city for their billing profile
xBillState
String
The customer’s state for their billing profile
xBillZip
String
The customer’s zip code for their billing profile
xBillCountry
String
The customer’s country for their billing profile
xBillPhone
String
The customer’s phone number for their billing profile
xBillMobile
String
The customer’s mobile number for their billing profile
xShipFirstName
String
The customer’s first name for their shipping profile
xShipMiddleName
String
The customer’s middle name or initial for their shipping profile
xShipLastName
String
The customer’s last/family name for their shipping profile
xShipCompany
String
The customer’s company name for their shipping profile
xShipStreet
String
The customer’s street address for their shipping profile
xShipStreet2
String
The customer’s street address 2nd line for their shipping profile
xShipCity
String
The customer’s city for their shipping profile
xShipState
String
The customer’s state for their shipping profile
xShipZip
String
The customer’s zip code for their shipping profile
xShipCountry
String
The customer’s country for their shipping profile
xShipPhone
String
The customer’s phone number for their shipping profile
xShipMobile
String
The customer’s mobile number for their shipping profile
xAllowDuplicate
String
By default, Sola rejects duplicate transactions within 10 minutes of the original transaction. This command overrides that safeguard. True/False allowed.
xOrderID
String
Unique order number for FraudWatch verification
xExistingCustomer
String
Yes/No value indicating if the customer is a repeat customer
xSoftwareVersion*
String
Version number of your software
xCommand*
String
Sola transaction type
xDUKPT*
String
The DUK/PT key for PIN debit and EBT transactions.The first 16 characters are the encrypted PIN block, followed by the 6 character long Key Set Identifier (KSID). The remaining characters are the PIN pad serial number and transaction counter.
xMagstripe
String
The magstripe data of a credit card. Magstripe data includes the card number and expiration date. When using this command, xCardNum xExp and xToken should not be used. Encrypted card data can also be sent using xMagstripe.
xIP
String
The customer’s IP address. Typically used for fraud detection.
xSoftwareVersion*
String
Version number of your software
xCommand*
String
Sola transaction type
xAmount*
String
The total amount of the transaction, inclusive of tax and tip if applicable. This the total amount of the transaction.
xDUKPT*
String
The DUK/PT key for PIN debit and EBT transactions.The first 16 characters are the encrypted PIN block, followed by the 6 character long Key Set Identifier (KSID). The remaining characters are the PIN Pad serial number and transaction counter.
xVoucherApproval*
String
The EBT voucher approval code
xVoucherSerial*
String
The EBT voucher serial number
xToken
String
The Sola token that references a previously used payment method. When using a token, xCardNum xExp and xMagstripe should not be used.
xCustom01
String
20 custom fields are available for custom data, such as customer comments, etc. Use xCustom01 through xCustom20.
xMagstripe
String
The magstripe data of a credit card. Magstripe data includes the card number and expiration date. When using this command, xCardNum xExp and xToken should not be used. Encrypted Card data can also be sent using xMagstripe.
xName
String
The cardholder’s name
xTax
String
The tax portion that is included in the total transaction amount (xAmount)
xTip
String
The tip portion that is included in the total transaction amount (xAmount)
xInvoice
String
The merchant’s invoice number for the transaction. xInvoice is recommended when available for improved duplicate handling.
xPONum
String
The merchant’s purchase order number for the transaction
xComments
String
Additional data that is optionally passed along to the receipt
xDescription
String
Additional data that is optionally passed along for reporting
xIP
String
The customer’s IP address. Typically used for fraud detection.
xEmail
String
The customer’s email address
xFax
String
The customer’s fax number
xBillFirstName
String
The customer’s first name for their billing profile
xBillMiddleName
String
The customer’s middle name or initial for their billing profile
xBillLastName
String
The customer’s last/family name for their billing profile
xBillCompany
String
The customer’s company name for their billing profile
xBillStreet
String
The customer’s street address for their billing profile
xBillStreet2
String
The customer’s street address 2nd line for their billing profile
xBillCity
String
The customer’s city for their billing profile
xBillState
String
The customer’s state for their billing profile
xBillZip
String
The customer’s zip code for their billing profile
xBillCountry
String
The customer’s country for their billing profile
xBillPhone
String
The customer’s phone number for their billing profile
xBillMobile
String
The customer’s mobile number for their billing profile
xShipFirstName
String
The customer’s first name for their shipping profile
xShipMiddleName
String
The customer’s middle name or initial for their shipping profile
xShipLastName
String
The customer’s last/family name for their shipping profile
xShipCompany
String
The customer’s company name for their shipping profile
xShipStreet
String
The customer’s street address for their shipping profile
xShipStreet2
String
The customer’s street address 2nd line for their shipping profile
xShipCity
String
The customer’s city for their shipping profile
xShipState
String
The customer’s state for their shipping profile
xShipZip
String
The customer’s zip code for their shipping profile
xShipCountry
String
The customer’s country for their shipping profile
xShipPhone
String
The customer’s phone number for their shipping profile
xShipMobile
String
The customer’s mobile number for their shipping profile
xAllowDuplicate
String
By default, Sola rejects duplicate transactions within 10 minutes of the original transaction. This command overrides that safeguard. True/False allowed.
xOrderID
String
Unique order number for FraudWatch verification
xExistingCustomer
String
Yes/No value indicating if the customer is a repeat customer
xSoftwareVersion*
String
Version number of your software
xCommand*
String
Sola transaction type
xAmount*
String
The total amount of the transaction, inclusive of tax and tip if applicable. This the total amount of the transaction.
xDUKPT*
String
The DUK/PT key for PIN debit and EBT transactions.The first 16 characters are the encrypted PIN block, followed by the 6 character long Key Set Identifier (KSID). The remaining characters are the PIN pad serial number and transaction counter.
xToken
String
The Sola token that references a previously used payment method. When using a token, xCardNum xExp and xMagstripe should not be used.
xCustom01
String
20 custom fields are available for custom data, such as customer comments, etc. Use xCustom01 through xCustom20.
xMagstripe
String
The magstripe data of a credit card. Magstripe data includes the card number and expiration date. When using this command, xCardNum xExp and xToken should not be used. Encrypted Card data can also be sent using xMagstripe.
xName
String
The cardholder’s name
xTax
String
The tax portion that is included in the total transaction amount (xAmount).
xTip
String
The tip portion that is included in the total transaction amount (xAmount)
xInvoice
String
The merchant’s invoice number for the transaction. xInvoice is recommended when available for improved duplicate handling
xPONum
String
The merchant’s purchase order number for the transaction
xComments
String
Additional data that is optionally passed along to the receipt
xDescription
String
Additional data that is optionally passed along for reporting
xIP
String
The customer’s IP address. Typically used for fraud detection.
xEmail
String
The customer’s email address
xFax
String
The customer’s fax number
xBillFirstName
String
The customer’s first name for their billing profile
xBillMiddleName
String
The customer’s middle name or initial for their billing profile
xBillLastName
String
The customer’s last/family name for their billing profile
xBillCompany
String
The customer’s company name for their billing profile
xBillStreet
String
The customer’s street address for their billing profile
xBillStreet2
String
The customer’s street address 2nd line for their billing profile
xBillCity
String
The customer’s city for their billing profile
xBillState
String
The customer’s state for their billing profile
xBillZip
String
The customer’s zip code for their billing profile
xBillCountry
String
The customer’s Country for their billing profile
xBillPhone
String
The customer’s phone number for their billing profile
xBillMobile
String
The customer’s mobile number for their billing profile
xShipFirstName
String
The customer’s first name for their shipping profile
xShipMiddleName
String
The customer’s middle name or initial for their shipping profile
xShipLastName
String
The customer’s last/family name for their shipping profile
xShipCompany
String
The customer’s company name for their shipping profile
xShipStreet
String
The customer’s street address for their shipping profile
xShipStreet2
String
The customer’s street address 2nd line for their shipping profile
xShipCity
String
The customer’s city for their shipping profile
xShipState
String
The customer’s state for their shipping profile
xShipZip
String
The customer’s zip code for their shipping profile
xShipCountry
String
The customer’s country for their shipping profile
xShipPhone
String
The customer’s phone number for their shipping profile
xShipMobile
String
The customer’s mobile number for their shipping profile
xAllowDuplicate
String
By default, Sola rejects duplicate transactions within 10 minutes of the original transaction. This command overrides that safeguard. True/False allowed.
xOrderID
String
Unique order number for FraudWatch verification
xExistingCustomer
String
Yes/No value indicating if the customer is a repeat customer
xSoftwareVersion*
String
Version number of your software
xAmount*
String
The total amount of the transaction, inclusive of tax and tip if applicable. This the total amount of the transaction.
xCommand
String
Sola transaction type
xDUKPT
String
The DUK/PT key for PIN debit and EBT transactions.The first 16 characters are the encrypted PIN block, followed by the 6 character long Key Set Identifier (KSID). The remaining characters are the PIN pad serial number and transaction counter.
xMagstripe
String
The magstripe data of a credit card. Magstripe data includes the card number and expiration date. When using this command, xCardNum xExp and xToken should not be used. Encrypted Card data can also be sent using xMagstripe.
xIP
String
The customer’s IP address. Typically used for fraud detection.
xToken
String
The Sola token that references a previously used payment method. When using a token, xCardNum xExp and xMagstripe should not be used.
xCustom01
String
20 custom fields are available for custom data, such as customer comments, etc. Use xCustom01 through xCustom20.
xName
String
The cardholder’s name
xInvoice
String
The merchant’s invoice number for the transaction. xInvoice is recommended when available for improved duplicate handling.
xAllowDuplicate
String
By default, Sola rejects duplicate transactions within 10 minutes of the original transaction. This command overrides that safeguard. True/False allowed.
xSoftwareVersion*
String
Version number of your software
xCommand*
String
Sola transaction type
xDUKPT*
String
The DUK/PT key for PIN debit and EBT transactions.The first 16 characters are the encrypted PIN block, followed by the 6 character long Key Set Identifier (KSID). The remaining characters are the PIN pad serial number and transaction counter.
xMagstripe
String
The magstripe data of a credit card. Magstripe data includes the card number and expiration date. When using this command, xCardNum xExp and xToken should not be used. Encrypted card data can also be sent using xMagstripe.
xIP
String
The customer’s IP address. Typically used for fraud detection.
xSoftwareVersion*
String
Version number of your software
xCommand*
String
Sola transaction type
xAmount*
String
The total amount of the transaction, inclusive of tax and tip if applicable. This the total amount of the transaction.
x1UnitPrice*
String
Unit price for item specified in xUPC. Additional items can be specified by incrementing (i.e., x2UnitPrice, x3UnitPrice, etc.).
x1Qty*
String
Quantity of item specified in xUPC. Additional items can be specified by incrementing (i.e., x2Qty, x3Qty, etc.).
x1Upc*
String
Universal Product Code. Additional items can be specified by incrementing (i.e., x2Upc, x3Upc, etc.).
xDUKPT*
String
The DUK/PT key for PIN debit and EBT transactions.The first 16 characters are the encrypted PIN block, followed by the 6 character long Key Set Identifier (KSID). The remaining characters are the PIN pad serial number and transaction counter.
xAllowPartialAuth*
String
Allows for partial authorization. Must be set to "TRUE".
xToken
String
The Sola token that references a previously used payment method. When using a token, xCardNum and xMagstripe should not be used.
xCustom01
String
20 custom fields are available for custom data, such as customer comments, etc. Use xCustom01 through xCustom20.
xMagstripe
String
The magstripe data of an eWIC card. When using xMagstripe, xCardNum and xToken should not be used. Encrypted card data can also be sent using xMagstripe.
xName
String
The cardholder’s name
xTax
String
The tax portion that is included in the total transaction amount (xAmount)
xTip
String
The tip portion that is included in the total transaction amount (xAmount)
xInvoice
String
The merchant’s invoice number for the transaction. xInvoice is recommended when available for improved duplicate handling.
xPONum
String
The merchant’s purchase order number for the transaction
xComments
String
Additional data that is optionally passed along to the receipt
xDescription
String
Additional data that is optionally passed along for reporting
xIP
String
The customer’s IP address. Typically used for fraud detection.
xEmail
String
The customer’s email address
xFax
String
The customer’s fax number
xBillFirstName
String
The customer’s first name for their billing profile
xBillMiddleName
String
The customer’s middle name for their billing profile
xBillLastName
String
The customer’s last name for their billing profile
xBillCompany
String
The customer’s company name for their billing profile
xBillStreet
String
The customer’s street address for their billing profile
xBillStreet2
String
The customer’s street address 2nd line for their billing profile
xBillCity
String
The customer’s city for their billing profile
xBillState
String
The customer’s state for their billing profile
xBillZip
String
The customer’s zip code for their billing profile
xBillCountry
String
The customer’s country for their billing profile
xBillPhone
String
The customer’s phone number for their billing profile
xBillMobile
String
The customer’s mobile number for their billing profile
xShipFirstName
String
The customer’s first name for their shipping profile
xShipMiddleName
String
The customer’s middle name or initial for their shipping profile
xShipLastName
String
The customer’s last/family name for their shipping profile
xShipCompany
String
The customer’s company name for their shipping profile
xShipStreet
String
The customer’s street address for their shipping profile
xShipStreet2
String
The customer’s street address 2nd line for their shipping profile
xShipCity
String
The customer’s city for their shipping profile
xShipState
String
The customer’s state for their shipping profile
xShipZip
String
The customer’s zip code for their shipping profile
xShipCountry
String
The customer’s country for their shipping profile
xShipPhone
String
The customer’s phone number for their shipping profile
xShipMobile
String
The customer’s mobile number for their shipping profile
xOrderID
String
Unique order number for FraudWatch verification
xExistingCustomer
String
Yes/No value indicating if the customer is a repeat customer
xAllowDuplicate
String
By default, Sola rejects duplicate transactions within 10 minutes of the original transaction. This command overrides that safeguard. True/False allowed.
xSoftwareVersion*
String
Version number of your software
xCommand*
String
Sola transaction type
xDUKPT*
String
The DUK/PT key for PIN debit and EBT transactions.The first 16 characters are the encrypted PIN block, followed by the 6 character long Key Set Identifier (KSID). The remaining characters are the PIN pad serial number and transaction counter.
xMagstripe
String
The magstripe data of a credit card. Magstripe data includes the card number and expiration date. When using this command, xCardNum xExp and xToken should not be used. Encrypted card data can also be sent using xMagstripe
xIP
String
The customer’s IP address. Typically used for fraud detection.
xSoftwareVersion*
String
Version number of your software
xCommand*
String
Sola transaction type
xDUKPT*
String
The DUK/PT key for PIN debit and EBT transactions.The first 16 characters are the encrypted PIN block, followed by the 6 character long Key Set Identifier (KSID). The remaining characters are the PIN pad serial number and transaction counter.
xRefNum*
String
Used to reference a previous transaction when processing a follow-up transaction; typically a refund, void, or capture. (Note: xRefnum can be a 64-bit number and should be stored as BIGINT, Long, Int64 or String).
xMagstripe
String
The magstripe data of a credit card. Magstripe data includes the card number and expiration date. When using this command, xCardNum xExp and xToken should not be used. Encrypted card data can also be sent using xMagstripe
xIP
String
The customer’s IP address. Typically used for fraud detection.
xCardNum*
String
The customer card number. *Alternatively, xToken xMagStripe or SUT can be used.
xKey*
String
Your Sola API key.
xVersion*
String
Gateway API version. The current version is 5.0.0.
xSoftwareName*
String
Name of your software
xCardNum*
String
The customer card number. *Alternatively, xToken xMagStripe or SUT can be used.
xKey*
String
Your Sola API key.
xVersion*
String
Gateway API version. The current version is 5.0.0.
xSoftwareName*
String
Name of your software
xCardNum*
String
The customer card number. *Alternatively, xToken xMagStripe or SUT can be used.
xKey*
String
Your Sola API key.
xVersion*
String
Gateway API version. The current version is 5.0.0.
xSoftwareName*
String
Name of your software
xCardNum*
String
The customer card number. *Alternatively, xToken xMagStripe or SUT can be used.
xKey*
String
Your Sola API key.
xVersion*
String
Gateway API version. The current version is 5.0.0.
xSoftwareName*
String
Name of your software
xCardNum*
String
The customer card number. *Alternatively, xToken xMagStripe or SUT can be used.
xKey*
String
Your Sola API key.
xVersion*
String
Gateway API version. The current version is 5.0.0.
xSoftwareName*
String
Name of your software
xCardNum*
String
The customer card number. *Alternatively, xToken xMagStripe or SUT can be used.
xKey*
String
Your Sola API key.
xVersion*
String
Gateway API version. The current version is 5.0.0.
xSoftwareName*
String
Name of your software
xCardNum*
String
The customer card number. *Alternatively, xToken xMagStripe or SUT can be used.
xKey*
String
Your Sola API key.
xVersion*
String
Gateway API version. The current version is 5.0.0.
xSoftwareName*
String
Name of your software
xCardNum*
String
The customer card number. *Alternatively, xToken, xMagStripe or SUT can be used.
xKey*
String
Your Sola API key.
xVersion*
String
Gateway API version. The current version is 5.0.0.
xSoftwareName*
String
Name of your software
xCardNum*
String
The customer card number. *Alternatively, xToken xMagStripe or SUT can be used.
xKey*
String
Your Sola API key.
xVersion*
String
Gateway API version. The current version is 5.0.0.
xSoftwareName*
String
Name of your software
xCardNum*
String
The customer card number. *Alternatively, xToken xMagStripe or SUT can be used.
xKey*
String
Your Sola API key.
xVersion*
String
Gateway API version. The current version is 5.0.0.
xSoftwareName*
String
Name of your software
{
"xCardNum": "4444333322221111",
"xKey": "[xkeycredentials]",
"xVersion": "4.5.9",
"xSoftwareName": "YourSoftwareName",
"xSoftwareVersion": "1.0.0",
"xCommand": "ebtfs:sale",
"xAmount": "35.00",
"xToken": "61h72mmh68phn9q233634ph3g54p1499m69qhp4816pn528h84",
"xCustom01": "Register01",
"xDUKPT": "%B4444333322221111^TEST CARD/VISA^4912101123456789?;444433",
"xMagstripe": "%B4444333322221111^TEST CARD/VISA^4912101123456789?;4444333322221111=4912101123456789?",
"xName": "John Doe",
"xTax": "2.00",
"xTip": "2.00",
"xInvoice": "123456A",
"xPONum": "123456B",
"xComments": "This is a comment",
"xDescription": "This is a description",
"xIP": "1.2.3.4",
"xEmail": "[email protected]",
"xFax": "1234567890",
"xBillFirstName": "John",
"xBillMiddleName": "Max",
"xBillLastName": "Doe",
"xBillCompany": "Acme",
"xBillStreet": "123 Any Street",
"xBillStreet2": "Apt 4b",
"xBillCity": "Anytown",
"xBillState": "NY",
"xBillZip": "12345",
"xBillCountry": "USA",
"xBillPhone": "8005551212",
"xBillMobile": "8005551111",
"xShipFirstName": "John",
"xShipMiddleName": "Max",
"xShipLastName": "Doe",
"xShipCompany": "Acme",
"xShipStreet": "123 Any Street",
"xShipStreet2": "Apt 4b",
"xShipCity": "Anytown",
"xShipState": "NY",
"xShipZip": "11111",
"xShipCountry": "USA",
"xShipPhone": "8005551212",
"xShipMobile": "8005551111",
"xOrderID": "12356",
"xExistingCustomer": "TRUE",
"xAllowDuplicate": "TRUE",
"xCustReceipt": "TRUE"
}{
"xCardNum": "4444333322221111",
"xKey": "[xkeycredentials]",
"xVersion": "4.5.9",
"xSoftwareName": "YourSoftwareName",
"xSoftwareVersion": "1.0.0",
"xCommand": "ebtfs:credit",
"xAmount": "35.00",
"xToken": "61h72mmh68phn9q233634ph3g54p1499m69qhp4816pn528h84",
"xCustom01": "Register01",
"xDUKPT": "%B4444333322221111^TEST CARD/VISA^4912101123456789?;444433",
"xMagstripe": "%B4444333322221111^TEST CARD/VISA^4912101123456789?;4444333322221111=4912101123456789?",
"xName": "John Doe",
"xTax": "2.00",
"xTip": "2.00",
"xInvoice": "123456A",
"xPONum": "123456B",
"xComments": "This is a comment",
"xDescription": "This is a description",
"xIP": "1.2.3.4",
"xEmail": "[email protected]",
"xFax": "1234567890",
"xBillFirstName": "John",
"xBillMiddleName": "Max",
"xBillLastName": "Doe",
"xBillCompany": "Acme",
"xBillStreet": "123 Any Street",
"xBillStreet2": "Apt 4b",
"xBillCity": "Anytown",
"xBillState": "NY",
"xBillZip": "12345",
"xBillCountry": "USA",
"xBillPhone": "8005551212",
"xBillMobile": "8005551111",
"xShipFirstName": "John",
"xShipMiddleName": "Max",
"xShipLastName": "Doe",
"xShipCompany": "Acme",
"xShipStreet": "123 Any Street",
"xShipStreet2": "Apt 4b",
"xShipCity": "Anytown",
"xShipState": "NY",
"xShipZip": "11111",
"xShipCountry": "USA",
"xShipPhone": "8005551212",
"xShipMobile": "8005551111",
"xOrderID": "12356",
"xExistingCustomer": "TRUE",
"xAllowDuplicate": "TRUE"
}{
"xCardNum": "4444333322221111",
"xKey": "[xkeycredentials]",
"xVersion": "4.5.9",
"xSoftwareName": "YourSoftwareName",
"xSoftwareVersion": "1.0.0",
"xCommand": "ebtfs:balance",
"xDUKPT": "3748276384717382:2dh2298h28dhf982f298g",
"xMagstripe": "%B4444333322221111^TEST CARD/VISA^4912101123456789?;4444333322221111=4912101123456789?",
"xIP": "1.1.1.1"
}{
"xCardNum": "4444333322221111",
"xKey": "[xkeycredentials]",
"xVersion": "4.5.9",
"xSoftwareName": "YourSoftwareName",
"xSoftwareVersion": "1.0.0",
"xCommand": "ebtfs:voucher",
"xAmount": "35.00",
"xToken": "61h72mmh68phn9q233634ph3g54p1499m69qhp4816pn528h84",
"xCustom01": "Register01",
"xDUKPT": "%B4444333322221111^TEST CARD/VISA^4912101123456789?;444433",
"xVoucherApproval": "123df1248f",
"xVoucherSerial": "123",
"xMagstripe": "%B4444333322221111^TEST CARD/VISA^4912101123456789?;4444333322221111=4912101123456789?",
"xName": "John Doe",
"xTax": "2.00",
"xTip": "2.00",
"xInvoice": "123456A",
"xPONum": "123456B",
"xComments": "This is a comment",
"xDescription": "This is a description",
"xIP": "1.2.3.4",
"xEmail": "[email protected]",
"xFax": "1234567890",
"xBillFirstName": "John",
"xBillMiddleName": "Max",
"xBillLastName": "Doe",
"xBillCompany": "Acme",
"xBillStreet": "123 Any Street",
"xBillStreet2": "Apt 4b",
"xBillCity": "Anytown",
"xBillState": "NY",
"xBillZip": "12345",
"xBillCountry": "USA",
"xBillPhone": "8005551212",
"xBillMobile": "8005551111",
"xShipFirstName": "John",
"xShipMiddleName": "Max",
"xShipLastName": "Doe",
"xShipCompany": "Acme",
"xShipStreet": "123 Any Street",
"xShipStreet2": "Apt 4b",
"xShipCity": "Anytown",
"xShipState": "NY",
"xShipZip": "11111",
"xShipCountry": "USA",
"xShipPhone": "8005551212",
"xShipMobile": "8005551111",
"xOrderID": "12356",
"xExistingCustomer": "TRUE",
"xAllowDuplicate": "TRUE"
}{
"xCardNum": "4444333322221111",
"xKey": "[xkeycredentials]",
"xVersion": "4.5.9",
"xSoftwareName": "YourSoftwareName",
"xSoftwareVersion": "1.0.0",
"xCommand": "ebtcb:sale"
"xAmount": "35.00",
"xToken": "61h72mmh68phn9q233634ph3g54p1499m69qhp4816pn528h84",
"xCustom01": "Register01",
"xDUKPT": "%B4444333322221111^TEST CARD/VISA^4912101123456789?;444433",
"xMagstripe": "%B4444333322221111^TEST CARD/VISA^4912101123456789?;4444333322221111=4912101123456789?",
"xName": "John Doe",
"xTax": "2.00",
"xTip": "2.00",
"xInvoice": "123456A",
"xPONum": "123456B",
"xComments": "This is a comment",
"xDescription": "This is a description",
"xIP": "1.2.3.4",
"xEmail": "[email protected]",
"xFax": "1234567890",
"xBillFirstName": "John",
"xBillMiddleName": "Max",
"xBillLastName": "Doe",
"xBillCompany": "Acme",
"xBillStreet": "123 Any Street",
"xBillStreet2": "Apt 4b",
"xBillCity": "Anytown",
"xBillState": "NY",
"xBillZip": "12345",
"xBillCountry": "USA",
"xBillPhone": "8005551212",
"xBillMobile": "8005551111",
"xShipFirstName": "John",
"xShipMiddleName": "Max",
"xShipLastName": "Doe",
"xShipCompany": "Acme",
"xShipStreet": "123 Any Street",
"xShipStreet2": "Apt 4b",
"xShipCity": "Anytown",
"xShipState": "NY",
"xShipZip": "11111",
"xShipCountry": "USA",
"xShipPhone": "8005551212",
"xShipMobile": "8005551111",
"xOrderID": "12356",
"xExistingCustomer": "TRUE",
"xAllowDuplicate": "TRUE"
}{
"xCardNum": "4444333322221111",
"xKey": "[xkeycredentials]",
"xVersion": "4.5.9",
"xSoftwareName": "YourSoftwareName",
"xSoftwareVersion": "1.0.0",
"xCommand": "ebtcb:cash",
"xAmount": "35.00",
"xToken": "61h72mmh68phn9q233634ph3g54p1499m69qhp4816pn528h84",
"xCustom01": "Register01",
"xDUKPT": "%B4444333322221111^TEST CARD/VISA^4912101123456789?;444433",
"xMagstripe": "%B4444333322221111^TEST CARD/VISA^4912101123456789?;4444333322221111=4912101123456789?",
"xName": "John Doe",
"xInvoice": "123456A",
"xIP": "1.2.3.4",
"xAllowDuplicate": "TRUE"
}{
"xCardNum": "4444333322221111",
"xKey": "[xkeycredentials]",
"xVersion": "4.5.9",
"xSoftwareName": "YourSoftwareName",
"xSoftwareVersion": "1.0.0",
"xCommand": "ebtcb:balance",
"xDUKPT": "%B4444333322221111^TEST CARD/VISA^4912101123456789?;444433",
"xMagstripe": "%B4444333322221111^TEST CARD/VISA^4912101123456789?;4444333322221111=4912101123456789?",
"xIP": "1.2.3.4"
}{
"xCardNum": "4444333322221111",
"xKey": "[xkeycredentials]",
"xVersion": "4.5.9",
"xSoftwareName": "YourSoftwareName",
"xSoftwareVersion": "1.0.0",
"xCommand": "ebtw:sale"
"xAmount": "35.00",
"x1UnitPrice": "3.50",
"x1Qty": "10",
"1Upc": "075457026002",
"xToken": "61h72mmh68phn9q233634ph3g54p1499m69qhp4816pn528h84",
"xCustom01": "Register01",
"xDUKPT": "%B4444333322221111^TEST CARD/VISA^4912101123456789?;444433",
"xAllowPartialAuth": "TRUE",
"xMagstripe": "%B4444333322221111^TEST CARD/VISA^4912101123456789?;4444333322221111=4912101123456789?",
"xName": "John Doe",
"xTax": "2.00",
"xTip": "2.00",
"xInvoice": "123456A",
"xPONum": "123456B",
"xComments": "This is a comment",
"xDescription": "This is a description",
"xIP": "1.2.3.4",
"xEmail": "[email protected]",
"xFax": "1234567890",
"xBillFirstName": "John",
"xBillMiddleName": "Max",
"xBillLastName": "Doe",
"xBillCompany": "Acme",
"xBillStreet": "123 Any Street",
"xBillStreet2": "Apt 4b",
"xBillCity": "Anytown",
"xBillState": "NY",
"xBillZip": "12345",
"xBillCountry": "USA",
"xBillPhone": "8005551212",
"xBillMobile": "8005551111",
"xShipFirstName": "John",
"xShipMiddleName": "Max",
"xShipLastName": "Doe",
"xShipCompany": "Acme",
"xShipStreet": "123 Any Street",
"xShipStreet2": "Apt 4b",
"xShipCity": "Anytown",
"xShipState": "NY",
"xShipZip": "11111",
"xShipCountry": "USA",
"xShipPhone": "8005551212",
"xShipMobile": "8005551111",
"xOrderID": "12356",
"xExistingCustomer": "TRUE",
"xAllowDuplicate": "TRUE"
}{
"xCardNum": "4444333322221111",
"xKey": "[xkeycredentials]",
"xVersion": "4.5.9",
"xSoftwareName": "YourSoftwareName",
"xSoftwareVersion": "1.0.0",
"xCommand": "ebtw:balance",
"xDUKPT": "%B4444333322221111^TEST CARD/VISA^4912101123456789?;444433",
"xMagstripe": "%B4444333322221111^TEST CARD/VISA^4912101123456789?;4444333322221111=4912101123456789?",
"xIP": "1.2.3.4"
}{
"xCardNum": "4444333322221111",
"xKey": "[xkeycredentials]",
"xVersion": "4.5.9",
"xSoftwareName": "YourSoftwareName",
"xSoftwareVersion": "1.0.0",
"xCommand": "ebtw.void",
"xDUKPT": "%B4444333322221111^TEST CARD/VISA^4912101123456789?;444433",
"xRefNum": "81726356",
"xMagstripe": "%B4444333322221111^TEST CARD/VISA^4912101123456789?;4444333322221111=4912101123456789?",
"xIP": "1.1.1.1"
}<!DOCTYPE html>
<html>
<head>
<meta content="text/html;charset=utf-8" http-equiv="Content-Type">
<meta content="utf-8" http-equiv="encoding">
<!-- Use the following src for the script on your form and replace ****version**** with the desired version: src="https://cdn.cardknox.com/ifields/****version****/ifields.min.js" -->
<script src="https://cdn.cardknox.com/ifields/2.9.2109.2701/ifields.min.js"></script>
<script type="text/javascript">
document.addEventListener("DOMContentLoaded", function(event) {
if (/[?&](is)?debug/i.test(window.location.search)){
setDebugEnv(true);
}
/*
* [Contitional]
* Required if you want to enable Google Pay payment method on your website
* For more information please refer to documentation
*/
ckGooglePay.enableGooglePay({amountField: 'amount'});
});
//Google Pay
window.gpRequest = {
merchantInfo: {
merchantName: "Example Merchant"
},
buttonOptions: {
buttonSizeMode: GPButtonSizeMode.fill
},
billingParams: {
//phoneNumberRequired: true,
emailRequired: true,
billingAddressRequired: true,
billingAddressFormat: GPBillingAddressFormat.full
},
shippingParams: {
phoneNumberRequired: true,
emailRequired: true,
onGetShippingCosts: function (shippingData) {
logDebug({
label: "onGetShippingCosts",
data: shippingData
});
return {
"shipping-001": "0.00",
"shipping-002": "1.99",
"shipping-003": "10.00"
}
},
onGetShippingOptions: function (shippingData) {
logDebug({
label: "onGetShippingOptions",
data: shippingData
});
let selectedOptionid = "shipping-001";
if (shippingData && shippingData.shippingOptionData && shippingData.shippingOptionData.id !== "shipping_option_unselected") {
selectedOptionid = shippingData.shippingOptionData.id;
}
return {
defaultSelectedOptionId: selectedOptionid,
shippingOptions: [
{
"id": "shipping-001",
"label": "Free: Standard shipping",
"description": "Free Shipping delivered in 5 business days."
},
{
"id": "shipping-002",
"label": "$1.99: Standard shipping",
"description": "Standard shipping delivered in 3 business days."
},
{
"id": "shipping-003",
"label": "$10: Express shipping",
"description": "Express shipping delivered in 1 business day."
},
]
};
}
},
onGetTransactionInfo: function () {
let amt = getAmount();
return {
displayItems: [
{
label: "Subtotal",
type: "SUBTOTAL",
price: amt.toString(),
},
{
label: "Tax",
type: "TAX",
price: (0.1 * amt).toString(),
}
],
countryCode: 'US',
currencyCode: "USD",
totalPriceStatus: "FINAL",
totalPrice: (1.1 * amt).toString(),
totalPriceLabel: "Total"
}
},
onBeforeProcessPayment: function () {
return new Promise(function (resolve, reject) {
try {
//Do some validation here
resolve(iStatus.success);
} catch (err) {
reject(err);
}
});
},
onProcessPayment: function (paymentResponse) {
return new Promise(function (resolve, reject) {
try {
// show returned data in developer console for debugging
console.log("paymentResponse", JSON.stringify(paymentResponse));
paymentToken = paymentResponse.paymentData.paymentMethodData.tokenizationData.token;
console.log("paymentToken", paymentToken);
const amt = (paymentResponse && paymentResponse.transactionInfo && paymentResponse.transactionInfo.totalPrice) || 0;
try {
if (amt <= 0) {
throw "Payment is not authorized. Invalid amount. Amount must be greater than 0";
}
setGPPayload(JSON.stringify(paymentResponse, null, 2));
resolve({status: iStatus.success});
} catch (err) {
const emsg = JSON.stringify(err);
console.error(emsg);
setGPPayload("");
setTimeout(function () { alert(emsg) }, 500);
reject({error: err});
}
} catch (err) {
setGPPayload("");
reject(err);
}
});
},
onPaymentCanceled: function(respCanceled) {
setTimeout(function () { alert("Payment was canceled") }, 500);
},
handleResponse: function (resp) {
const respObj = JSON.parse(resp);
if (respObj) {
if (respObj.xError) {
setTimeout(function () { alert(`There was a problem with your order (${respObj.xRefNum})!`) }, 500);
} else
setTimeout(function () { alert(`Thank you for your order (${respObj.xRefNum})!`) }, 500);
}
},
getGPEnvironment: function () {
if (/[?&]prod/.test(window.location.search)) {
return GPEnvironment.production;
}
return GPEnvironment.test;
},
initGP: function() {
return {
merchantInfo: this.merchantInfo,
buttonOptions: this.buttonOptions,
environment: this.getGPEnvironment(),
billingParameters: this.billingParams,
shippingParameters: {
emailRequired: this.shippingParams.emailRequired,
onGetShippingCosts: "gpRequest.shippingParams.onGetShippingCosts",
onGetShippingOptions: "gpRequest.shippingParams.onGetShippingOptions"
},
onGetTransactionInfo: "gpRequest.onGetTransactionInfo",
onBeforeProcessPayment: "gpRequest.onBeforeProcessPayment",
onProcessPayment: "gpRequest.onProcessPayment",
onPaymentCanceled: "gpRequest.onPaymentCanceled",
onGPButtonLoaded: "gpRequest.gpButtonLoaded",
isDebug: isDebugEnv
};
},
gpButtonLoaded: function(resp) {
if (!resp) return;
if (resp.status === iStatus.success) {
showHide("divGpay", true);
showHide("lbGPPayload", true);
} else if (resp.reason) {
alert(resp.reason);
}
}
};
function setGPPayload(value) {
const gpTxt = document.getElementById('gp-payload');
gpTxt.value = value;
showHide(gpTxt, value);
}
function showHide(elem, toShow) {
if (typeof(elem) === "string") {
elem = document.getElementById(elem);
}
if (elem) {
toShow ? elem.classList.remove("hidden") : elem.classList.add("hidden");
}
}
function getAmount () {
return roundToNumber(document.getElementById("amount").value || "0", 2);
}
</script>
<style>
body {
margin: 10px;
}
iframe.gp {
display: inline-block;
border: 0;
width: 250px;
height: 45px;
padding: 0px;
margin-bottom: 12px;
overflow: hidden;
position: absolute;
}
div.gp {
overflow: hidden;
display: inline-block;
overflow: hidden;
margin-bottom: 20px;
}
input {
border: 1px solid black;
font-size: 14px;
padding: 3px;
width: 243px;
margin-bottom: 12px;
}
.hidden {
display: none;
}
textarea {
border: 1px solid black;
width: 350px;
}
</style>
</head>
<body>
<form id="payment-form" method="POST">
<input id="amount" name="xAmount" placeholder="Amount" type="number" inputmode="decimal"></input>
<br/>
<div id="divGpay" class="gp hidden">
<iframe id="igp" class="gp" data-ifields-id="igp" data-ifields-oninit="gpRequest.initGP" src="https://cdn.cardknox.com/ifields/2.9.2109.2701/igp.htm"
allowpaymentrequest
sandbox="allow-popups allow-modals allow-scripts allow-same-origin allow-forms allow-popups-to-escape-sandbox allow-top-navigation"
title="GPay checkout page">
</iframe>
<br/>
</div>
<br />
<br />
<label id="lbGPPayload" class="hidden">Google Pay Payload: </label>
<br />
<textarea id="gp-payload" class="hidden" rows="10" readonly="true"></textarea>
</form>
</body>
</html>




<!DOCTYPE html>
<html>
<head>
<meta content="text/html;charset=utf-8" http-equiv="Content-Type">
<meta content="utf-8" http-equiv="encoding">
<!-- Use the following src for the script on your form and replace ****version**** with the desired version: src="https://cdn.cardknox.com/ifields/****version****/ifields.min.js" -->
<script src="ifields.min.js"></script>
<script type="text/javascript">
document.addEventListener("DOMContentLoaded", function(event) {
ckApplePay.enableApplePay({
initFunction: 'apRequest.initAP',
amountField: 'amount'
});
});
window.apRequest = {
buttonOptions: {
buttonContainer: "ap-container",
buttonColor: APButtonColor.black,
buttonType: APButtonType.pay
},
totalAmount: null,
taxAmt: null,
shippingMethod: null,
creditType: null,
getTransactionInfo: function (taxAmt, shippingMethod, creditType) {
try {
this.shippingMethod = shippingMethod || this.shippingMethod || {
"label": "Free Shipping",
"amount": "0.00",
"type": "final"
};
this.taxAmt = roundToNumber(taxAmt, 4) || this.taxAmt || 0.07;
this.creditType = creditType || this.creditType;
const amt = getAmount();
const lineItems = [
{
"label": "Subtotal",
"type": "final",
"amount": amt
},
this.shippingMethod
];
if (this.creditType === "credit") {
lineItems.push({
"label": "Credit Card Fee",
"amount": roundTo(0.0275*amt, 2),
"type": "final"
});
}
lineItems.push({
"label": "Estimated Tax",
"amount": roundTo(this.taxAmt*amt, 2),
"type": "final"
});
let totalAmt = 0;
lineItems.forEach((item) => {
totalAmt += parseFloat(item.amount)||0;
});
totalAmt = roundTo(totalAmt, 2);
this.totalAmount = totalAmt;
return {
'lineItems': lineItems,
total: {
type: 'final',
label: '[Your Business Name]',
amount: totalAmt,
}
};
} catch (err) {
console.error("getTransactionInfo error ", exMsg(err));
}
},
onGetTransactionInfo: function () {
try {
return this.getTransactionInfo();
} catch (err) {
console.error("onGetTransactionInfo error ", exMsg(err));
}
},
onGetShippingMethods: function() {
return [
{
label: 'Free Shipping',
amount: '0.00',
identifier: 'free',
detail: 'Delivers in five business days',
},
{
label: 'Express Shipping',
amount: '5.00',
identifier: 'express',
detail: 'Delivers in two business days',
},
];
},
onShippingContactSelected: function(shippingContact) {
const self = this;
return new Promise((resolve, reject) => {
try {
console.log("shippingContact", JSON.stringify(shippingContact));
let taxAmt = 0.1;
const newShippingMethods = [
{
label: 'Free Shipping',
amount: '0.00',
identifier: 'free',
detail: 'Delivers in five business days',
}
];
if (shippingContact && shippingContact.administrativeArea) {
if (shippingContact.administrativeArea === "NY") {
taxAmt = 0.0875;
newShippingMethods.push(
{
label: 'Overnight Shipping',
amount: '10.00',
identifier: 'overnight',
detail: 'Delivers in one business days',
}
);
} else if (shippingContact.administrativeArea === "NJ") {
taxAmt = 0.07;
newShippingMethods.push(
{
label: 'Express Shipping',
amount: '5.00',
identifier: 'express',
detail: 'Delivers in two business days',
}
);
}
}
const resp = self.getTransactionInfo(taxAmt, newShippingMethods[0]);
resp.shippingMethods = newShippingMethods;
resolve(resp);
} catch (err) {
const apErr = {
code: "-101",
contactField: "",
message: exMsg(err)
}
console.error("onShippingContactSelected error.", exMsg(err));
reject({errors: [err]});
}
})
},
onShippingMethodSelected: function(shippingMethod) {
const self = this;
return new Promise(function (resolve, reject) {
try {
console.log("shippingMethod", JSON.stringify(shippingMethod));
const resp = self.getTransactionInfo(null, shippingMethod);
resolve(resp);
} catch (err) {
const apErr = {
code: "-102",
contactField: "",
message: exMsg(err)
}
console.error("onShippingMethodSelected error.", exMsg(err));
reject({errors: [err]});
}
})
},
onPaymentMethodSelected: function(paymentMethod) {
const self = this;
return new Promise((resolve, reject) => {
try {
console.log("paymentMethod", JSON.stringify(paymentMethod));
const resp = self.getTransactionInfo(null, null, paymentMethod.type);
resolve(resp);
} catch (err) {
const apErr = {
code: "-102",
contactField: "",
message: exMsg(err)
}
console.error("onPaymentMethodSelected error.", exMsg(err));
reject({errors: [err]});
}
})
},
validateApplePayMerchant: function () {
return new Promise((resolve, reject) => {
try {
var xhr = new XMLHttpRequest();
xhr.open("POST", "https://api.cardknox.com/applepay/validate");
xhr.onload = function () {
if (this.status >= 200 && this.status < 300) {
console.log("validateApplePayMerchant", JSON.stringify(xhr.response));
resolve(xhr.response);
} else {
console.error("validateApplePayMerchant", JSON.stringify(xhr.response), this.status);
reject({
status: this.status,
statusText: xhr.response
});
}
};
xhr.onerror = function () {
console.error("validateApplePayMerchant", xhr.statusText, this.status);
reject({
status: this.status,
statusText: xhr.statusText
});
};
xhr.setRequestHeader("Content-Type", "application/json");
xhr.send();
} catch (err) {
setTimeout(function () { console.log("getApplePaySession error: " + exMsg(err)) }, 100);
}
});
},
onValidateMerchant: function() {
return new Promise((resolve, reject) => {
try {
this.validateApplePayMerchant()
.then((response) => {
try {
console.log(response);
resolve(response);
} catch (err) {
console.error("validateApplePayMerchant exception.", JSON.stringify(err));
reject(err);
}
})
.catch((err) => {
console.error("validateApplePayMerchant error.", JSON.stringify(err));
reject(err);
});
} catch (err) {
console.error("onValidateMerchant error.", JSON.stringify(err));
reject(err);
}
});
},
authorize: function(applePayload, totalAmount) {
return new Promise(function (resolve, reject) {
var xhr = new XMLHttpRequest();
xhr.open("POST", "https://<your domain>/<path to handle authorization>");
xhr.onload = function () {
if (this.status >= 200 && this.status < 300) {
resolve(xhr.response);
} else {
reject({
status: this.status,
statusText: xhr.statusText
});
}
};
xhr.onerror = function () {
reject({
status: this.status,
statusText: xhr.statusText
});
};
const data = {
amount: totalAmount,
payload: applePayload
};
xhr.setRequestHeader("Content-Type", "application/json");
xhr.send(JSON.stringify(data));
});
},
onPaymentAuthorize: function(applePayload) {
return new Promise((resolve, reject) => {
try {
this.authorize(applePayload, this.totalAmount)
.then((response) => {
try {
console.log(response);
const resp = JSON.parse(response);
if (!resp)
throw "Invalid response: "+ response;
if (resp.xError) {
throw resp;
}
resolve(response);
} catch (err) {
throw err;
// reject(err);
}
})
.catch((err) => {
console.error("authorizeAPay error.", JSON.stringify(err));
apRequest.handleAPError(err);
reject(err);
});
} catch (err) {
console.error("onPaymentAuthorize error.", JSON.stringify(err));
apRequest.handleAPError(err);
reject(err);
}
});
},
onPaymentComplete: function(paymentComplete) {
if (paymentComplete.response) { //Success
const resp = JSON.parse(paymentComplete.response);
if (resp.xRefNum) {
setAPPayload("Thank you for your order:("+resp.xRefNum+")");
} else {
setAPPayload("Thank you for your order.");
}
} else if (paymentComplete.error) {
console.error("onPaymentComplete", exMsg(paymentComplete.error));
handleAPError(paymentComplete.error);
}
},
handleAPError: function(err) {
if (err && err.xRefNum) {
setAPPayload("There was a problem with your order:("+err.xRefNum+")");
} else {
setAPPayload("There was a problem with your order:"+exMsg(err));
}
},
initAP: function() {
return {
buttonOptions: this.buttonOptions,
merchantIdentifier: "<Your Apple Merchant ID>",
requiredBillingContactFields: ['postalAddress', 'name', 'phone', 'email'],
requiredShippingContactFields: ['postalAddress', 'name', 'phone', 'email'],
onGetTransactionInfo: "apRequest.onGetTransactionInfo",
onGetShippingMethods: "apRequest.onGetShippingMethods",
onShippingContactSelected: "apRequest.onShippingContactSelected",
onShippingMethodSelected: "apRequest.onShippingMethodSelected",
onPaymentMethodSelected: "apRequest.onPaymentMethodSelected",
onValidateMerchant: "apRequest.onValidateMerchant",
onPaymentAuthorize: "apRequest.onPaymentAuthorize",
onPaymentComplete: "apRequest.onPaymentComplete",
onAPButtonLoaded: "apRequest.apButtonLoaded",
isDebug: true
};
},
apButtonLoaded: function(resp) {
if (!resp) return;
if (resp.status === iStatus.success) {
showHide(this.buttonOptions.buttonContainer, true);
showHide("lbAPPayload", true);
} else if (resp.reason) {
console.log(resp.reason);
}
}
};
function setAPPayload(value) {
const apTxt = document.getElementById('ap-payload');
apTxt.value = value;
showHide(apTxt, value);
}
function showHide(elem, toShow) {
if (typeof(elem) === "string") {
elem = document.getElementById(elem);
}
if (elem) {
toShow ? elem.classList.remove("hidden") : elem.classList.add("hidden");
}
}
function getAmount () {
return roundToNumber(document.getElementById("amount").value || "0", 2);
}
</script>
<style>
body {
margin: 10px;
}
div.main {
width: 350px;
}
.ap {
border: 0;
width: 250px;
height: auto;
min-height: 55px;
padding: 0px;
margin-bottom: 12px;
}
input {
border: 1px solid black;
font-size: 14px;
padding: 3px;
width: 250px;
margin-bottom: 12px;
}
.hidden {
display: none;
}
textarea {
border: 1px solid black;
width: 100%;
}
</style>
</head>
<body>
<div class="main">
<form id="payment-form" method="POST">
<input id="amount" name="xAmount" placeholder="Amount" type="number" inputmode="decimal"></input>
<br/>
<div id="ap-container" class="ap hidden" >
<br/>
</div>
<br/>
<label id="lbAPPayload" class="hidden">Apple Pay Payload: </label>
<br />
<textarea id="ap-payload" class="hidden" rows="10" readonly="true"></textarea>
<br/>
</form>
</div>
</body>
</html> .Net Framework 4 and above
Enable Sola payment processing on RMS point-of-sale systems.
PART 1: Prepare each computer
Run a Z Report:
Open the Store Operations POS.
Press F5.
Select Print Z Report
PART 2: Download and run the software
Download the Sola Updater plugin:
Right-click on the downloaded program (Updater.exe), then click Run as administrator and choose Yes when prompted.
An input box will appear. Type fidelipayrms and click Enter.
The following steps will enable additional payment types on the Sola gateway.
Open the Store Operations Manager and go to Database > Tender Types.
If Credit Card is not listed:
Click on New.
PART 1: Configure or create EBTFS as a tender type
Open the Store Operations Manager and go to Database > Tender Types.
If EBTFS is listed as an existing tender type, select it, click on Properties, and continue to the next step. If it is not listed:
Click on New.
PART 2: Add an EBTFS button
Go to Database > Registers > Custom POS Buttons.
Click New.
On the popup window, fill in several fields:
PART 1: Configure or create gift cards as a tender type
Open the Store Operations Manager and go to Database > Tender Types.
If Gift Card is listed as an existing tender type, select it and click Properties. Continue to the next step. If it is not listed:
Click on New.
PART 2: Add a Gift Card button
Navigate to Database > Registers > Custom POS Buttons.
Click New.
In the window the pops up, you’ll need to fill in several fields:
PART 3: Set option to enter the price at POS
Navigate to Database > Items.
Check if the Gift Card item exists. The description for the item should be Gift Card. If it is listed, select the item and click on Properties and continue to the next step. If it is not listed:
Click on New.
The following steps will enable you to securely save cardholder information for future use.
PART 1: Enable tokens on your POS
Run C:\FPS_RMS_Plugin\FidelipayRMS.exe.
Go to the FidelipayRMSSettings tab:
EnableTokenization, 1
DB_Database, [
PART 2: Add a Tokens button
Open the Store Operations Manager and go to Database > Registers > Custom POS Buttons.
Click New.
On the popup window, fill in several fields:
PART 1: Download the device drivers For VeriFone Mx devices: 32 bit:
64 bit:
PART 2: Connect your terminal to RMS
Navigate to C:\FPS_RMS_Plugin\FidelipayRMS.exe.
Complete the form with the appropriate device settings.
Restart RMS and run a test transaction.
To show the Sola information on the RMS receipt, you need to add Session.Variable1 in the XML receipt. It includes the information below.
Card number Card Type Auth Code Tender Amount Transaction Type Response
XML to add:
Update existing receipt in RMS
PART 1: Locate the receipt currently in use
In Store Operations Manager, go to Database > Registers > Register List.
Select a register that is currently used and on which you wish to base the receipt.
Click Properties.
Click on the Receipt Printer 1
PART 2: Save the current receipt
In the Store Operations Manager, go to Database > Registers > Receipt Formats.
Select the sales receipt that is currently used.
Click Properties.
Use the Save As command to save the receipt as CurrentReceipt to the following location: C:\Program Files\Microsoft Retail Management System\StoreOperations\ReceiptTemplates
PART 3: Add Session.Variable1 to the receipt
Open the receipt in a text editor.
Choose the SUB in the XML receipt where you want to display the Cardknox information.
Copy paste the XML to add as listed in the “Add Cardknox variables to receipt“ section above and save it.
PART 4: Update RMS through the desktop icon
Open Store Operations Manager and go to Database > Registers > Receipt Formats.
On the right side of the window, click New.
Type plugin_receipt into both the Title and Description fields.
PART 5: Select the receipt format for each register
Go to Database > Registers > Register List and complete the following steps for each register:
Select the register and click Properties.
Choose the Receipt Printer 1 tab.
To display the EBT balance on the RMS receipt:
In the Cardknox plugin advanced settings set EBTFSBalanceVariable to a number from 1-9. Note: Ensure that the (EBTFSBalanceVariable) variable doesn't conflict with the following variables in the settings: "GiftCardBalanceVariable", "ReceiptHookVariable", and "RetailPointBalanceVariable".
Add Session.Variable{x} to the receipt. For example, Session.Variable1 . The number, in this case "1", should match the number entered in step 1 above.
Sample receipt snippet:
To display the GIFT balance on the RMS receipt:
In the Cardknox plugin advanced settings set GiftCardBalanceVariable to a number from 1-9. Note: Ensure that the GiftCardBalanceVariable variable doesn't conflict with the following variables in the settings "EBTFSBalanceVariable", "ReceiptHookVariable" and "RetailPointBalanceVariable".
Add Session.Variable{x} to the receipt. For example Session.Variable2 The number, in this case "2", should match the number entered in step 2 above
Sample receipt snippet:
Navigate to Advanced Settings and set Allow Cashback = True
Set Enable Cashback = True
Navigate to FidelipayRMSSettings tab
Set Cashback Fee Item to a non inventory item
Navigate to Advanced Settings. Set CashbackAmountIncludedInAmount to True
Enable Offline Transactions in the FidelpayRMS Settings panel
Click “Display Prompt Before Continue”: This will bring a pop up on RMS before continuing to Offline mode.
Selecting "Require Customer Selection" will require a customer selected for offline.
RMS database Version minimum SQL 2005
Step 1: Create a new tender
Navigate to the RMS Manager > Database > Tender Types
Click on NEW
Set Description as eWIC
Set Tender Code as EBTW
Step 2: Enable eWIC
Enable eWIC in the FidelipayRMS Settings panel
"Secondary UPC Field Name": This can be used to use the Sub description for the UPC or PLU for eWIC.
"Discount item": Set a non-inventory item to be used for eWIC partial auth
For complete sample code please refer here
Use: iStatus.success
Use: APButtonColor.black
Use: APButtonType.buy
Use: APRequiredFeatures.address_validation
Use: APErrorCode.addressUnserviceable
Use: APErrorContactField.administrativeArea
The Main object that contains all the information necessary to communicate with Apple Pay API.
Field names used for requesting contact information in a payment request.
Available fields:
name
phone
postalAddress
final - A line item representing the known, final cost.
pending - A line item representing an estimated or unknown cost.
year
month
day
Recurring Line Item Example (Charging $20 starting today for the next year)
A payment card’s type of payment.
The payment method type value is one of:
debit
credit
prepaid
store
Note: Supported starting iOS 11.
Available when address_validation is part of list.
Close the Store Operations POS.
Go to the Store Operations Administrator and click File > Configuration > EDC.
Select Do not use electronic capture draft software and click OK.
Repeat steps 1 and 2 on each register.
Set the Tender Code and Display Order values.
Click OK.
Click Close.
Type EBTFS in the Description field.
Set the Tender Code and Display Order values.
In the Tender Type dropdown, select Food Stamps.
Click OK.
For Caption, type EBT Balance.
For Command, type FidelipayRMS.GetEBTFSBalance.
Click OK.
Click Close.
Type Gift Card in the Description field.
Type GC as the Tender Code.
Set the Display Order value you desire.
In the Tender Type dropdown, select Other.
Click OK.
For Caption, type Gift Card Balance.
For Command, type FidelipayRMS.GetGiftBalance.
Click OK.
Select on Standard Item and click OK.
Set Item Lookup Code as gc.
Select the Inventory tab and enter the appropriate information.
Select the Options tab.
Enable Must enter price at the POS.
Click OK.
DB_Username, [YourDatabaseUserName]
DB_Server, [YourServerIpAddress]
DB_Password [YourPassword]
Click Test Connection.
Close and save the Settings file.
For Caption, type Save Card.
For Command, type FidelipayRMS.SaveCard.
Click OK.
If Store Operations POS is currently running, restart it. If not, open it.
Click on Saved Card to test.
The receipt currently in use can be found in the Receipt Format field.
Go to the following plugin folder: C:\Program Files\Microsoft RetailManagementSystem\StoreOperations\ReceiptTemplates\Plugin
Select the current receipt name and click Open.
When you are prompted to update all transaction types, click Yes.
The Report box will still not have a file. Click the magnifying glass, select XReport.xml, and click Open.
Click OK and close the Receipt Formats window.
Select plugin_receipt and click OK.
After this has been completed for all of the registers, close the Registers window and restart the POS.
Select the Transaction Type allowed in Offline mode.
Ensure that your items lookup code matches the expected eWIC UPC or PLU code
<IF>
<CONDITION> Len(Session.Variable1) </CONDITION>
<THEN>
<TABLE>
<BORDER> tbNone </BORDER>
<COLUMNHEADER>
<ALIGNMENT> "<" </ALIGNMENT>
<WIDTH> PageWidth </WIDTH>
<TEXT> Session.Variable1 </TEXT>
</COLUMNHEADER>
</TABLE>
</THEN>
</IF><IF>
<CONDITION> Len(Session.Variable1) </CONDITION>
<THEN>
<ROW> "Available EBTFS Balance|" Session.Variable1 "|" </ROW>
</THEN>
</IF><IF>
<CONDITION> Len(Session.Variable2) </CONDITION>
<THEN>
<ROW> "Available EBTFS Balance|" Session.Variable2 "|" </ROW>
</THEN>
</IF>No
Features required by Merchant. Each Feature is available with the certain iOS version. Therefore if device doesn’t support that version (Feature) - Apple Pay Button won’t be displayed.
requiredBillingContactFields
No
List of field names used for requesting contact information in a payment request.
requiredShippingContactFields
No
List of field names used for requesting contact information in a payment request.
onAPButtonLoaded
String
Yes
Name of a callback function to be called when Apple Pay button is loaded. Accepts an object of type Please click for the sample code.
onGetTransactionInfo
String
Yes
Name of a callback function to be called that returns the final price and tax calculations. Please click for the sample code.
onGetShippingMethods
String
Yes
Name of a callback function to be called that returns a list of available Shipping Methods. Please click for the sample code.
onShippingContactSelected
String
Yes
Name of a callback function to be called when Shipping Contact is selected/changed.
Accepts a parameter .
Returns .
If address_validation is part of in your ApplePay Request object you can return an as part of ShippingContactResponse.
Please click for the sample code.
onShippingMethodSelected
String
Yes
Name of a callback function to be called when Shipping Method is selected/changed. Accepts a parameter . Please click for the sample code.
onPaymentMethodSelected
String
Yes
Name of a callback function to be called when Payment Method is selected/changed. Accepts a parameter . Please click for the sample code.
onBeforeProcessPayment
String
Yes
Name of a callback function to be called when consumer clicked the button but before Apple Pay sheet is loaded. Usually used to make validations before the payment. Please click for the sample code.
onValidateMerchant
String
Yes
Name of a callback function to be called to validate the Merchant. This functions accepts a parameter validationUrl. Please click for the sample code.
onPaymentAuthorize
String
Yes
Name of a callback function to be called when Apple Payment is authorized for the completion of the transaction. This function accepts a parameter of PaymentResponse. Please click for the sample code.
onPaymentComplete
String
Yes
Name of a callback function to be called when Apple confirms the completion of the transaction. This function accepts a parameter of PaymentComplete. Please click for the sample code.
onError
String
Yes
Name of a callback function to be called when Error occurs.
Please click for the sample code.
Make sure to assign onError in initAP function like .
onCancel
String
Yes
Name of a callback function to be called when user cancels. Please click for the sample code.
No
From Google documentation:
buy: "Buy with Google Pay" button (default).
donate: "Donate with Google Pay" button.
plain: Google Pay button without additional text.
The contact’s family name
addressLines
String[]
The street portion of the address for the contact
subLocality
String
Additional information associated with the location, typically defined at the city or town level (such as district or neighborhood), in a postal address
locality
String
The city for the contact
postalCode
String
The zip code or postal code, where applicable, for the contact
subAdministrativeArea
String
The subadministrative area (such as a county or other region) in a postal address
administrativeArea
String
The state for the contact
country
String
The name of the country or region for the contact
countryCode
String
The contact’s two-letter ISO 3166 country code
Error code
paymentTiming
ApplePayPaymentTiming object
The time that the payment occurs as part of a successful transaction
recurringPaymentStartDate
Date
The date of the first payment
recurringPaymentEndDate
Date
The date of the final payment
recurringPaymentIntervalUnit
ApplePayRecurringPaymentDateUnit
The amount of time — in calendar units, such as day, month, or year — that represents a fraction of the total payment interval
recurringPaymentIntervalCount
Long
The number of interval units that make up the total payment interval
deferredPaymentDate
Date
The date, in the future, of the payment
automaticReloadPaymentThresholdAmount
String
The balance an account reaches before the merchant applies the automatic reload amount
hourminute
Identifier for this Shipping Method
The billing contact associated with the card
Name
Type
Required
Description
merchantIdentifier
String
Yes
For merchants integrating their own Apple Developer account must be Merchant Identifier from the account, otherwise must be merchant.cardknox.com
buttonOptions
No
Provides Apple Pay button customization options. For more information please click the link.
requiredFeatures
Name
Type
Required
Description
buttonContainer
String
Yes
Name of the <div> where Apple Pay Button will be loaded
buttonColor
No
From Google documentation:
default: A Google-selected default value. Currently black but it may change over time (default).
black: A black button suitable for use on white or light backgrounds.
white: A white button suitable for use on colorful backgrounds.
buttonType
Name
Type
Description
status
iStatus
There are 3 possible cases:
Apple Pay Button loaded successfully: status = iStatus.success
Apple Pay not supported: status = iStatus.unsupported
An error occurred while loading Apple Pay Button: status = iStatus.error
reason
String
If Apple Pay Button failed to load this field will be populated with the reason.
Name
Type
Description
phoneNumber
String
A phone number for the contact
emailAddress
String
An email address for the contact
givenName
String
The contact’s given name
familyName
Name
Type
Description
lineItems
LineItem[]
A set of line items that explain recurring payments and additional charges and discounts.
total
A line item that represents the total for the payment.
shippingMethods
A list of Shipping Methods
error
type
ApplePayLineItemType
A value that indicates whether the line item is final or pending
label
String
A required value that’s a short, description of the line item
amount
String
A required value that’s the monetary amount of the line item.
Name
Type
Description
label
String
Label for this Shipping Method
amount
String
Price for this shipping option
detail
String
Description for this Shipping Method
identifier
Name
Type
Description
displayName
String
A string, suitable for display, that describes the card
network
String
Name of the payment network backing the card
type
PaymentMethodType
The card's type of payment
billingContact
Name
Type
Description
code
One of Apple Pay Error Codes
contactField
One of Apple Pay Error Contact fields
message
String
Error message displayed to the customer
String
Recurring and Subscription
String
PaymentContact
const iStatus = {
success: 100,
unsupported: -100,
error: -200
}const APButtonColor = {
black: "black",
white: "white",
whiteOutline: "white-outline"
} const APButtonType = {
buy: "buy",
pay: "pay",
plain: "plain",
order: "order",
donate: "donate",
continue: "continue",
checkout: "check-out"
} const APRequiredFeatures = {
address_validation: "address_validation",
support_recurring: "support_recurring",
support_subscription : "support_subscription"
} const APErrorCode = {
shippingContactInvalid: "shippingContactInvalid",
billingContactInvalid: "billingContactInvalid",
addressUnserviceable: "addressUnserviceable",
couponCodeInvalid: "couponCodeInvalid",
couponCodeExpired: "couponCodeExpired",
unknown: "unknown"
} const APErrorContactField = {
phoneNumber: "phoneNumber",
emailAddress: "emailAddress",
name: "name",
phoneticName: "phoneticName",
postalAddress: "postalAddress",
addressLines: "addressLines",
locality: "locality",
subLocality: "subLocality",
postalCode: "postalCode",
administrativeArea: "administrativeArea",
subAdministrativeArea: "subAdministrativeArea",
country: "country",
countryCode: "countryCode"
}initAP: function() {
return {
buttonOptions: this.buttonOptions,
merchantIdentifier: "merchant.cardknoxdev.com",
requiredBillingContactFields: ['postalAddress', 'name', 'phone', 'email'],
requiredShippingContactFields: ['postalAddress', 'name', 'phone', 'email'],
onGetTransactionInfo: "apRequest.onGetTransactionInfo",
onGetShippingMethods: "apRequest.onGetShippingMethods",
onShippingContactSelected: "apRequest.onShippingContactSelected",
onShippingMethodSelected: "apRequest.onShippingMethodSelected",
onPaymentMethodSelected: "apRequest.onPaymentMethodSelected",
onValidateMerchant: "apRequest.onValidateMerchant",
onPaymentAuthorize: "apRequest.onPaymentAuthorize",
onPaymentComplete: "apRequest.onPaymentComplete",
onError: "apRequest.onError",
onAPButtonLoaded: "apRequest.apButtonLoaded"
};
}apButtonLoaded: function(resp) {
if (!resp) return;
if (resp.status === iStatus.success) {
showHide(this.buttonOptions.buttonContainer, true);
showHide("lbAPPayload", true);
} else if (resp.reason) {
alert(resp.reason);
}
}taxAmt: null,
shippingMethod: null,
creditType: null,
getTransactionInfo: function (taxAmt, shippingMethod, creditType) {
try {
this.shippingMethod = shippingMethod || this.shippingMethod || {
"label": "Free Shipping",
"amount": "0.00",
"type": "final"
};
this.taxAmt = roundToNumber(taxAmt, 4) || this.taxAmt || 0.07;
this.creditType = creditType || this.creditType;
const amt = getAmount();
const lineItems = [
{
"label": "Subtotal",
"type": "final",
"amount": amt
},
this.shippingMethod
];
if (this.creditType === "credit") {
lineItems.push({
"label": "Credit Card Fee",
"amount": roundTo(0.0275*amt, 2),
"type": "final"
});
}
lineItems.push({
"label": "Estimated Tax",
"amount": roundTo(this.taxAmt*amt, 2),
"type": "final"
});
let totalAmt = 0;
lineItems.forEach((item) => {
totalAmt += parseFloat(item.amount)||0;
});
totalAmt = roundTo(totalAmt, 2);
return {
'lineItems': lineItems,
total: {
type: 'final',
label: 'Total',
amount: totalAmt,
}
};
} catch (err) {
console.error("getTransactionInfo error ", exMsg(err));
if (isDebugEnv) {
alert("getTransactionInfo error: "+exMsg(err));
}
}
},
onGetTransactionInfo: function () {
try {
return this.getTransactionInfo();
} catch (err) {
console.error("onGetTransactionInfo error ", exMsg(err));
if (isDebugEnv) {
alert("onGetTransactionInfo error: "+exMsg(err));
}
}
}onGetShippingMethods: function() {
return [
{
label: 'Free Shipping',
amount: '0.00',
identifier: 'free',
detail: 'Delivers in five business days',
},
{
label: 'Express Shipping',
amount: '5.00',
identifier: 'express',
detail: 'Delivers in two business days',
},
];
}onShippingContactSelected: function(shippingContact) {
const self = this;
return new Promise(function (resolve, reject) {
try {
console.log("shippingContact", JSON.stringify(shippingContact));
let taxAmt = 0.1;
const newShippingMethods = [
{
label: 'Free Shipping',
amount: '0.00',
identifier: 'free',
detail: 'Delivers in five business days',
}
];
if (shippingContact && shippingContact.administrativeArea) {
if (shippingContact.administrativeArea === "NY") {
taxAmt = 0.0875;
newShippingMethods.push(
{
label: 'Overnight Shipping',
amount: '10.00',
identifier: 'overnight',
detail: 'Delivers in one business days',
}
);
} else if (shippingContact.administrativeArea === "NJ") {
taxAmt = 0.07;
newShippingMethods.push(
{
label: 'Express Shipping',
amount: '5.00',
identifier: 'express',
detail: 'Delivers in two business days',
}
);
}
}
const resp = self.getTransactionInfo(taxAmt, newShippingMethods[0]);
resp.shippingMethods = newShippingMethods;
resolve(resp);
} catch (err) {
const apErr = {
code: "-101",
contactField: "",
message: exMsg(err)
}
console.error("onShippingContactSelected error.", exMsg(err));
if (isDebugEnv) {
setTimeout(function(){ alert("onShippingContactSelected error: "+exMsg(err))}, 100);
}
reject({errors: [err]});
}
})
}onShippingMethodSelected: function(shippingMethod) {
const self = this;
return new Promise(function (resolve, reject) {
try {
console.log("shippingMethod", JSON.stringify(shippingMethod));
const resp = self.getTransactionInfo(null, shippingMethod);
resolve(resp);
} catch (err) {
const apErr = {
code: "-102",
contactField: "",
message: exMsg(err)
}
console.error("onShippingMethodSelected error.", exMsg(err));
if (isDebugEnv) {
setTimeout(function(){ alert("onShippingMethodSelected error: "+exMsg(err))}, 100);
}
reject({errors: [err]});
}
})
}onPaymentMethodSelected: function(paymentMethod) {
const self = this;
return new Promise(function (resolve, reject) {
try {
console.log("paymentMethod", JSON.stringify(paymentMethod));
const resp = self.getTransactionInfo(null, null, paymentMethod.type);
resolve(resp);
} catch (err) {
const apErr = {
code: "-102",
contactField: "",
message: exMsg(err)
}
console.error("onPaymentMethodSelected error.", exMsg(err));
if (isDebugEnv) {
setTimeout(function(){ alert("onPaymentMethodSelected error: "+exMsg(err))}, 100);
}
reject({errors: [err]});
}
})
}onBeforeProcessPayment: function () {
return new Promise(function (resolve, reject) {
try {
//Do some validation here
resolve(iStatus.success);
} catch (err) {
reject(err);
}
});
}
Payment callback exampleonValidateMerchant: function(validationUrl) {
return new Promise(function (resolve, reject) {
try {
if (isDebugEnv) {
alert("onValidateMerchant: "+JSON.stringify(event), validationUrl);
}
getApplePaySession(validationUrl)
.then(function (response) {
try {
console.log(response);
resolve(response);
} catch (err) {
console.error("getApplePaySession exception.", JSON.stringify(err));
setTimeout(function(){ alert("onValidateMerchant error: "+exMsg(err))}, 100);
reject(err);
}
})
.catch(function(err) {
console.error("getApplePaySession error.", JSON.stringify(err));
setTimeout(function(){ alert("getApplePaySession error: "+exMsg(err))}, 100);
reject(err);
});
} catch (err) {
console.error("onValidateMerchant error.", JSON.stringify(err));
if (isDebugEnv) {
setTimeout(function(){ alert("onValidateMerchant error: "+exMsg(err))}, 100);
}
reject(err);
}
})
}onPaymentAuthorize: function(paymentResponse) {
return new Promise(function (resolve, reject) {
try {
authorizeAPay(paymentResponse.token)
.then(function (response) {
try {
console.log(response);
setAPPayload(JSON.stringify(paymentResponse, null, 2));
const resp = JSON.parse(response);
if (!resp)
throw "Invalid response: "+ response;
if (resp.xError) {
throw resp;
}
resolve(response);
} catch (err) {
throw err;
// console.error("authorizeAPay exception.", JSON.stringify(err));
// setTimeout(function(){ alert("onPaymentAuthorize error: "+exMsg(err))}, 100);
// reject(err);
}
})
.catch(function(err) {
console.error("authorizeAPay error.", JSON.stringify(err));
apRequest.handleAPError(err);
reject(err);
});
} catch (err) {
console.error("onPaymentAuthorize error.", JSON.stringify(err));
apRequest.handleAPError(err);
reject(err);
}
})
}onPaymentComplete: function(paymentComplete) {
if (paymentComplete.response) { //Success
const resp = JSON.parse(paymentComplete.response);
if (resp.xRefNum) {
setTimeout(function(){ alert("Thank you for your order:("+resp.xRefNum+")")}, 100);
} else {
setTimeout(function(){ alert("Thank you for your order.")}, 100);
}
} else if (paymentComplete.error) {
console.error("onPaymentComplete", exMsg(paymentComplete.error));
handleAPError(paymentComplete.error);
}
}onError: function(error) {
setTimeout(function () { alert(`An error occured: ${error}`) }, 500);
}onCancel: function() {
setTimeout(function () { alert("Payment was canceled") }, 500);
}buttonOptions: {
buttonContainer: "ap-container",
buttonColor: APButtonColor.black,
buttonType: APButtonType.pay
}...
requiredBillingContactFields: ['postalAddress', 'name', 'phone', 'email'],
requiredShippingContactFields: ['postalAddress', 'name', 'phone', 'email'],
...const startDate = new Date();
const endDate = new Date(startDate.getFullYear()+1, startDate.getMonth(), startDate.getDate());
lineItem = {
"label": "Subscription",
"amount": "20.00",
"type": "final",
"paymentTiming": "recurring",
"recurringPaymentStartDate": startDate,
"recurringPaymentIntervalUnit": "month",
"recurringPaymentIntervalCount": 1,
"recurringPaymentEndDate": endDate,
}{
"label": "Free Shipping",
"amount": "0.00",
"detail": "Arrives in 7 to 10 business days",
"identifier": "free"
}EBT (Electronic Benefits Transfer) cards allow customers to pay for food and other products through government-funded financial assistance programs. One of the largest such programs is the Supplemental Nutrition Assistance Program (SNAP). SNAP is managed by the U.S. Department of Agriculture (USDA).
To qualify for SNAP EBT online processing, retailers must meet SNAP's food stocking requirements as well as their online purchasing requirements. One of the online purchasing requirements for retailers is to integrate their online shopping cart with a third-party processor that offers a digital PIN pad. Sola's EBT solution utilizes a third-party PIN pad so that EBT cardholders can securely type in their PIN online just as they would in-store. Once the customer makes a payment with their EBT card, they are able to see the remaining balance on their card and complete the transaction.
During the implementation process, keep in mind that when submitting a sale transaction, you can add up to a 10% padding to the amount if the final price needs to be adjusted upon completing the order. When completing the order, the retailer would refund the remaining amount. Retailers must follow the refund process and not issue refunds using cash or gift cards.
The Sample Code can be found .
The base URL to send transactions to is https://x1.cardknox.com
Additionally, the backup URL is https://b1.cardknox.com
Sola allows you to send the data in FormData, JSON, and XML formats.
Add to the base URL any of the following formats to indicate which format you are sending it as:
As noted above, you can use “https://b1.cardknox.com" as an alternative backup URL.
Method: POST
Sola/Cardknox Gateway requires an HTTP POST method to be used for enhanced security.
We do not support the GET method.
This API call will return the information needed to redirect the user to the PIN pad.
A PIN is needed for the ebtonline:fssale, ebtonline:cbsale, and ebtonline:balance commands.
Process an EBT Online transaction to transfer funds from an EBT card to the retailer.
Process an EBT Online cash benefits transaction to transfer funds from an EBT card to the retailer.
Check the available balance on an EBT card
Process an EBT online refund transaction to return funds from the retailer to the cardholder.
Process an EBT Online void transaction to cancel out a sale.
Responses that can be returned.
Errors that can be returned.
After the ebtonline:initiate command, the Sola gateway will return the necessary pieces to render the PIN pad. The website will take care of redirecting the user to the PIN pad.
To render the PIN pad redirect the consumer to the xPinPadURL (PaySecure) using a POST with the following parameters. Once the consumer has completed entry of their PIN, PaySecure will redirect the consumer back to your site using the URL in the AccuReturnURL field. PaySecure will determine the viewport (desktop or mobile) and render the PIN pad in an adaptive manner, meaning there are distinct layouts based on screen size. PaySecure does not use responsive web design as it interferes with the PIN pad functionality.
Endpoint: xPinPadURL that was returned in the initiate command
Method: URL Redirection
Format: FormData
ebtonline:fssale, ebtonline:cbsale, and ebtonline:balance transactions require the user to enter a PIN during the transaction process (for ebtonline:refund and ebtonline:void skip to step 3).
As per the EBT requirement (certification), The PIN is not sent with the transaction to the gateway, the Acculynk PIN pad must be used. Acculynk sends the PIN directly to PaySecure and it’s identified by a unique transaction ID.
The ebtonline:initiate will begin the PIN process. Sola will return the necessary pieces to render a PIN pad for the user.
Request
Response
Redirect the user to the xPinPadURL for the user to enter their pin.
Request
Response
Once the user is redirected back to your site with the response code Accu000 submit the final request (ebtonline:fssale, ebtonline:cbsale, or ebtonline:balance) to the Sola gateway to complete the transaction. If you receive any other response code, allow the user to try again or cancel the transaction.
Request
Response
Name of your software.
[xsoftwarecredentials]
xSoftwareVersion
Yes
Version number of your software.
[xversioncredentials]
xCommand
Yes
Command specifying which transaction.
ebtonline:initiate
xCardNum
Yes
The customer card number. Alternatively, xToken xMagStripe or SUT can be used.
6004861944321111844
xShipMethod
Yes*
Denotes Shipping Method
DirectDelivery
CustomerPickup
CommercialShipping
Other
Name of your software.
[xsoftwarecredentials]
xSoftwareVersion
Yes
Version number of your software.
[xversioncredentials]
xCommand
Yes
Command specifying which transaction.
ebtonline:fssale
xAmount
Yes
The total amount of the transaction, inclusive of tax and tip if applicable. This the total amount of the transaction.
9.99
xShipFirstName
Yes*
Customer’s first name for their shipping profile.
xShipMiddleName
Yes*
Customer’s middle name or initial for their shipping profile.
xShipLastName
Yes*
Customer’s last/family name for their shipping profile.
xShipCompany
Yes*
Customer’s company name for their shipping profile.
xShipPhone
No
Customer’s phone number for their shipping profile.
xShipMobile
No
Customer’s mobile number for their shipping profile.
xRefnum
Yes
xShipMethod
Yes*
Denotes Shipping Method
Supported methods:
DirectDelivery
CustomerPickup
CommercialShipping
Name of your software.
[xsoftwarecredentials]
xSoftwareVersion
Yes
Version number of your software.
[xversioncredentials]
xCommand
Yes
Command specifying which transaction.
cbsale
xAmount
Yes
The total amount of the transaction, inclusive of tax and tip if applicable. This the total amount of the transaction.
9.99
xShipFirstName
Yes*
Customer’s first name for their shipping profile.
xShipMiddleName
Yes*
Customer’s middle name or initial for their shipping profile.
xShipLastName
Yes*
Customer’s last/family name for their shipping profile.
xShipCompany
Yes*
Customer’s company name for their shipping profile.
xShipPhone
No
Customer’s phone number for their shipping profile.
xShipMobile
No
Customer’s mobile number for their shipping profile.
xRefnum
Yes
A unique request ID.
xShipMethod
Yes*
Shipping method.
Supported methods:
DirectDelivery
CustomerPickup
CommercialShipping
Name of your software.
[xsoftwarecredentials]
xSoftwareVersion
Yes
Version number of your software.
[xversioncredentials]
xCommand
Yes
Command specifying which transaction.
balance
xRefnum
Yes
A unique request ID.
xShipMethod
Yes*
Denotes Shipping Method
Supported methods:
DirectDelivery
CustomerPickup
CommercialShipping
Name of your software.
[xsoftwarecredentials]
xSoftwareVersion
Yes
Version number of your software.
[xversioncredentials]
xCommand
Yes
Command specifying which transaction.
refund
xAmount
No
The total amount of the transaction, inclusive of tax and tip if applicable. This the total amount of the transaction.
9.99
xRefnum
Yes
A unique request ID.
Name of your software.
[xsoftwarecredentials]
xSoftwareVersion
Yes
Version number of your software.
[xversioncredentials]
xCommand
Yes
Command specifying which transaction.
void
xRefnum
Yes
A unique request ID.
xToken
xError
Error message, if applicable
xRefnum
Sola reference number
xCardType
Type of card
EBT
xPinPadURL
This field is returned on the initiate command and you would send it when redirecting to the PIN pad
xAccuID
This field is returned on the initiate command and you would send it when redirecting to the PIN pad
xRemainingBalanceEBTCB
Indicates the remaining EBT cash benefits balance
xRemainingBalanceEBTFS
Indicates the remaining EBT cash benefits balance
xBatch
Batch into which transaction will settle
xAuthAmount
The total amount authorized, inclusive
xEbtOnlineErrorMessage
Error message as received from the EBT online provider.
xEbtOnlineErrorCode
Error code as received from the EBT online provider.
xEbtOnlineResponseCode
Response code as received from the EBT online provider.
Decline
12
Invalid Transaction
13
Invalid Amount
14
The EBT card you entered is invalid. Please try again.
23
Unacceptable Transaction Fee
40
Request Not Supported
41
The EBT card you used is restricted and cannot be used. Please call the number on the back of your card for assistance or use a different payment method.
42
Invalid Account
43
The EBT card you used is restricted and cannot be used. Please call the number on the back of your card for assistance or use a different payment method.
51
Your SNAP (or Cash) payment failed for insufficient funds.
54
Expired Card
55
The PIN you entered is incorrect. Please re-enter your PIN.
56
The EBT card you entered is invalid. Please try again.
57
Your credit / debit card has been declined. Please try again or add a different payment method.
59
Your credit / debit card has been declined. Please try again or add a different payment method.
60
Card Acceptor Contact Acquirer
61
The refund amount requested exceeds the original sales amount.
62
The EBT card you used is restricted and cannot be used. Please call the number on the back of your card for assistance or use a different payment method.
67
Decline
75
Your card was locked after too many incorrect PIN attempts. Please call the number on the back of your card for assistance.
76
Key Synchronization Error
89
CVV Failed
90
No Account On File
92
There has been an error while processing your PIN. Please try again.
96
There has been an error while processing your PIN. Please try again.
9
There has been an error while processing your PIN. Please try again.
Original Transaction Not Found
604
Payment provider could not read card. Please try again
605
Track Data Error
607
RSA Token Key Error
608
Tokenazation Error
609
Transaction Type can not be reversed
610
Invalid Currency
611
Invalid BIN
612
BIN Error
616
Merchant Descriptor Error
618
Our payment solution provider is not responding. Please try again.
621
Duplicate Reference Key
622
Transaction Type Not Supported
702
Error With Transaction Number
703
SAF Error
704
EFT Connection Error
712
Declined transaction
713
Our payment solution provider is not responding. Please try again.
Command not supported
6104341397212234
5
Command not authorized
6104342085618120
6
Decline
6004861835913142835
41
Decline
6004861659118294500
43
Decline
6104341476018981
57
Decline
6004861674715978348
59
Decline
6004861469721133669
67
Decline
6104341094217098
12
Invalid transaction
6104341339116774
13
Invalid amount
6104342179210040
14
Invalid card number
6004861283711548772
15
Invalid card
6004861936221520819
23
Unacceptable transaction fee
40
Request not supported
6104341157820259
42
Invalid account
6004861118116374806
51
Insufficient funds
6104342148913849
54
Expired card
6104341215511833
55
Incorrect PIN
6004861487521029713
56
Invalid card
6004861804921225354
60
Card acceptor contact acquirer
6104341821716867
61
Exceeds withdrawal limit
6104341606718450
62
Restricted card
6104341108310343
75
PIN tries exceeded
6004861908615095260
76
Key synchronization error
6004861170115289659
89
CVV failed
90
No account on file
6004861035618530794
92
System error
6004861904512646719
96
System error
6004861141211040767
99
System error
Format
Addtional URL
Full URL
FormData
/gateway
https://x1.cardknox.com/gateway
JSON
/gatewayjson
https://x1.cardknox.com/gatewayjson
XML
/gatewayxml
https://x1.cardknox.com/gatewayxml
Variable
Required
Description
Sample data
xKey
Yes
Your Sola API Key.
[xkeycredentials]
xVersion
Yes
Gateway API Version. The current version is 4.5.9
4.5.9
xSoftwareName
Variable
Required
Description
Sample data
xKey
Yes
Your Sola API Key.
[xkeycredentials]
xVersion
Yes
Gateway API Version. The current version is 4.5.9
4.5.9
xSoftwareName
Variable
Required
Description
Sample data
xKey
Yes
Your Sola API Key.
[xkeycredentials]
xVersion
Yes
Gateway API Version. The current version is 4.5.9
4.5.9
xSoftwareName
Variable
Required
Description
Sample data
xKey
Yes
Your Sola API Key.
[xkeycredentials]
xVersion
Yes
Gateway API Version. The current version is 4.5.9
4.5.9
xSoftwareName
Variable
Required
Description
Sample data
xKey
Yes
Your Sola API Key.
[xkeycredentials]
xVersion
Yes
Gateway API Version. The current version is 4.5.9
4.5.9
xSoftwareName
Variable
Required
Description
Sample data
xKey
Yes
Your Sola API Key.
[xkeycredentials]
xVersion
Yes
Gateway API Version. The current version is 4.5.9
4.5.9
xSoftwareName
Variable
Description
Sample data
Variable
Description
Sample data
xResult
Transaction status
A D E
xDate
xStatus
Result verbiage
Approved Declined Error
xMaskedCardNumber
Response Code
Response Message
0
1
Missing Parameter
3
Invalid Merchant/Terminal
4
Command Not Supported
5
Command Not Authorized
Error Code
Error Message
501
Invalid IP Address
502
Invalid User Credentials
503
Request Validation Failed
504
Invalid Hash Value
602
Invalid User
Variable
Description
Sample data
AccuId
xAccuID that was returned in the initiate command
AccuReturnURL
Fully qualified retailer’s URL; PaySecure will use to redirect the user upon completion of the PIN pad.
URL encoding required
AccuLanguage
Language in which the PIN pad will be displayed to the user
en-US (English) es-MX (Spanish)
[Client Echoed Fields]
Variable
Description
Sample data
AccuResponseCode
Response code from PaySecure indicating if the pin process was successful
Accu000 = PIN successfully collected Accu200 = Cardholder pressed cancel button Accu400 = Cardholder inactivity timeout Accu600 = Invalid data received by terminal Accu710 = Terminal security issue Accu720 = Terminal communication issue Accu730 = Terminal internal error Accu800 = General error encountered
AccuResponseMsg
Response message from PaySecure indicating if the pin process was successful
see AccuResponseCode
AccuId
xAccuID that was submitted
[Client Echoed Fields]
Test Card
Response Code
Error Message
6004861944321111844
0
(Approved)
1
Missing parameter
3
Invalid merchant/terminal
6104341675219380
Yes
Yes
Yes
Yes
Yes
Yes
6
603
You may pass additional form fields that will be passed back to your AccuReturnURL.
There are no restrictions on these fields, provided their names are not the same as the reserved PaySecure names. Many retailers utilize these fields to pass session IDs used to identify the user upon return to the AccuReturnURL.
Fields that you sent in the Redirect Parameters to the pin pad in [Client Echoed Fields]
4
{
"xKey": "xxxxxxxxxxxxxxxxxxxxxxx",
"xVersion": "4.5.9",
"xSoftwareName": "YourSoftwareName",
"xSoftwareVersion": "1.0.0",
"xCommand": "ebtonline:initiate",
"xCardNum": "6004861944321111844",
"xShipMethod": "CustomerPickup"
}{
"xResult": "A",
"xStatus": "Approved",
"xError": "",
"xErrorCode": "00000",
"xRefNum": "600546727",
"xAvsResultCode": "",
"xAvsResult": "Unmapped AVS response",
"xCvvResultCode": "",
"xCvvResult": "No CVV data available",
"xMaskedCardNumber": "6xxxxxxxxxxxxxx1844",
"xCardType": "EBT",
"xToken": "hp6h31h29phnh6p48pm6024mp8278q96",
"xInternalID": "5c3d7ba7-80d4-4437-b4cb-c259cf0757c6",
"xPinPadURL": "https://test.paysecure.acculynk.net/PINpad",
"xAccuID": "ce8da934-fe7c-47f4-90bd-46fd0e3ff99e",
"xMID": "xxxxxxxxxxxTest",
"xDate": "3/1/2022 12:51:52 PM",
"xEntryMethod": "Keyed",
"xRemainingBalanceEBTCB": "0.00",
"xRemainingBalanceEBTFS": "0.00",
"xEbtOnlineErrorCode": "00",
"xEbtOnlineErrorMessage": "SUCCESS"
}<form action="https://test.paysecure.acculynk.net/PINpad" method="post">
<label>AccuId:</label>
<input type="text" id="AccuId" name="AccuId" value="">
<label>AccuReturnURL:</label>
<input type="text" id="AccuReturnURL" name="AccuReturnURL" value="">
<label>AccuLanguage:</label>
<input type="text" id="AccuLanguage" name="AccuLanguage" value="en-US">
<input type="submit" value="Submit">
</form>AccuLanguage=en-US&
AccuId=ce8da934-fe7c-47f4-90bd-46fd0e3ff99e&
AccuResponseCode=ACCU000&
AccuResponseMsg=SUCCESS{
"xKey": "xxxxxxxxxxxxxxxxxxxxxxx",
"xVersion": "4.5.9",
"xSoftwareName": "YourSoftwareName",
"xSoftwareVersion": "1.0.0",
"xCommand": "ebtonline:fssale",
"xAmount": "1",
"xRefNum": "123456789"
}{
"xResult": "A",
"xStatus": "Approved",
"xError": "",
"xErrorCode": "00000",
"xRefNum": "600548315",
"xAuthCode": "452251",
"xBatch": "6329524",
"xAvsResultCode": "",
"xAvsResult": "Unmapped AVS response",
"xCvvResultCode": "",
"xCvvResult": "No CVV data available",
"xAuthAmount": "1.00",
"xMaskedCardNumber": "6xxxxxxxxxxxxxx1844",
"xCardType": "EBT",
"xMID": "xxxxxxxxxxxTest",
"xDate": "3/1/2022 12:54:39 PM",
"xEntryMethod": "Unknown",
"xRemainingBalanceEBTCB": "932.62",
"xRemainingBalanceEBTFS": "235.25",
"xEbtOnlineResponseCode": "00",
"xEbtOnlineErrorCode": "00",
"xEbtOnlineErrorMessage": "SUCCESS"
}Other
xErrorCode within API docs
These errors come from the Sola gateway when the request is invalid or something is misconfigured. Use the table below to understand the error and how to resolve it.
Error Code
Message
What It Means
How to Fix
01727
These declines come directly from the cardholder’s bank and usually need to be resolved by the cardholder with their issuing bank. In rare cases, the issue may be on Sola’s side, or we may be able to provide additional guidance. If you suspect this, please reach out to our support team.
More Than One Record Matches PTRANNUM; Please Use TTID
01013
AVSCode is required
01014
Bad Cardholder Account Information
01015
Invalid Issuing Bank
01016
CVV Required
01017
Invalid Street
01018
Unknown Error From Host
01019
Shipping_Information_Required
01020
Bank Not On File
01021
Exceeds Amount Limit
01022
Pin Required (EBT)
01023
Refund not permitted
01024
Security Voilation
01025
Invalid_Version
01026
Unmatched Return Not Allowed
01027
Void Rejected
01028
Must Allow Partial Auth
01029
AuthCode Required
01031
Batch Error
01032
Unable to parse response
01033
No Such Issuer
01035
Authonly not allowed on Debit/EBT transaction
01036
Lookup status not supported
01037
Adjustment Error
01038
Transaction Type Not Voidable
01040
Command Type Not Supported for Debit
01041
Incremental Auths Not Supported
01042
Connection Timeout
01043
No Original
01044
A capture requires that the existing transaction be an auth
01045
The original transaction cannot have this operation performed on it at this time
01046
Disconnect before response
01048
Revocation Auth
00104
Login failed. The login is from an untrusted domain and cannot be used with Windows authentication
01050
Account: Invalid Length
01051
Transaction type not allowed from this source
01052
No Account
01054
Processing Institution Does Not Support That Transaction Type
01055
Bank Unavailable
01057
Pin XLate Error
01058
Merchant number does not relate to a defined bank or financial institution
01059
Auth Prohibited
01060
Partial Refund Not Allowed
01062
The sum of unit and qty minus disc plus freight plus duty plus tax must equal transaction amount
01063
Original Transaction Not Approved
01064
Unable to connect to remote server
01066
The underlying connection was closed
01067
Credits are not enabled
01070
Transaction type is not voidable. Issue refund instead.
01072
Routing: Invalid Value
01073
Account: Invalid Value
01075
Card Must Be Swiped
01076
AVS CV2 Declined
01078
Authentication Error
01080
Command Not Supported
01082
Login Failed
01083
Issuer Unavailable
01084
Account Not Issued
01085
Refused
01086
Velocity Exception
01087
Invalid Data
01088
An error occurred while receiving the HTTP response
01089
Remote Server Error
01090
Unable to connect to the remote server
01092
Engine Required
01093
No checking account
01094
Invalid CC Account Number
01095
Terminal not identified or inactive
01096
This terminal or user id is not permitted to process this transaction type.
01097
Connection Error
01098
Host Connection Error
01099
Unknown Transaction Type
01100
Transaction Not Found
01102
Payment Initiative Not Supported
01103
CheckNum Invalid Value
01105
Unable to Auth
01106
Valid Auth Not Found
01110
Gift Issuance not allowed for this location
01112
Invalid Gift Card
01113
Invalid GiftCard Magstripe
01114
Account Already Issued
01115
Invalid Set ID
01116
cannot modify transaction during settlement
01117
Invalid data in Settlement Transaction Detail message
01118
Reference Number Not Supported
01119
Transaction is in a state that cannot be refunded
01120
Transaction already refunded
01121
Transaction not eligible for refund.
01122
The transaction ID is invalid for this transaction type
01123
Capture Not Supported
01124
Max refund amount exceeded
01125
TAX MUST BE >= 0.00 AND <= AMOUNT
01126
Invalid Order Amount (MIN)
01127
Invalid Order Amount (MAX)
01128
The provided Order has no lines in On Hold status
01130
None of the order lines specified could be updated to the specified reason.
01132
An error occurred while updating the entries
01135
Unable to retrieve expiration date
01137
CVV2 check cannot be performed as no data was supplied in the authorization request.
01138
The cc payment type and/or currency is not accepted
01140
Name On Account Required.
01141
Pin code required for credit/void
01145
This account has not been given the permission(s) required for this request.
01150
Exceeds Count Limit
01151
Refunds cannot be performed until the transaction has settled
01152
The server is temporarily unavailable. Please try back shortly.
01153
Backend DB Error
01154
You have tried this card too many times
01155
No Credit Account
01160
Revk Pay Ordered
01161
Stop Pay Ordered
01165
Invalid Null Account Number Last Four
01167
UserName not recognized
01170
Phone Field Required
01171
Country Field Required
01172
Email Field Required
01175
Input String was not in a correct format
01179
Authenticate Failed
01180
Lookup Failed
01182
Balance Temoporarily Unavailable
01184
Network Error
01185
No Reply
01187
Merchant has been deactivated
01188
Funds can not be released for this transaction
01189
Incorrect Device Encryption
01190
Bad MID
01191
Host Drop
01192
No Response
01193
Transaction Count Exceeded Limit
01194
Amount exceeds original transaction amount.
01195
Processor returned an invalid authorization code
01196
Zip Required for Keyed Transaction
01197
Unable to connect to TSYS
01198
Processing Error Please Try Again
01199
Server Error
01200
Unable To Create Transaction. Please Contact Support.
01201
Refund amount exceeds sale amount
01202
Credit amount exceeds sale amount
01203
Amount Required
01204
Invalid Token
01205
Invalid Zip
01206
Invalid_Pin
01207
License Required
01209
Activity Limit Exceeded
01210
Over Pin Limit
01211
Negative amount not allowed
01212
Swiping Not Allowed. Contact Support
01213
Invalid Action
01214
Unsupported Cardtype
01215
Not Authorized
01217
Account is inactive
01218
Unrecognized Trackdata Format
01220
Duplicate Keys Found
01221
Invalid GiftCard Number
01223
Card Number was not between 13 and 16 digits
01224
Original transaction not specified
01225
Pin Pad Error
01226
Invalid_Command
01227
Auth Declined
01228
Record Not Found
01230
Transaction Not Permitted
01231
OrderNumber is required
01232
Transaction Already Settled
01233
Account Required
01234
Eligible transaction not found
01235
Missing CardCVV
01236
Account Not Found
01237
Terminal ID Error
01238
PIN Retries Exceeded
01239
Invalid Credentials
01240
Invalid Share Group.
01241
GiftCard Already Exists
01242
Routing: Invalid Length
01243
Internal Error
01244
Credit Not Allowed
01245
Refund Not Allowed
01246
Void Not Allowed
01247
Transaction Not Allowed
01248
Order has already been imported
01249
Edit Error
01251
Card Expired
01253
Unable to locate transaction
01254
Req exceeds bal
01255
The request was aborted: Could not create SSL/TLS secure channel.
01257
Transaction amount exceeds limit
01258
Connection Failed: Possible Setup Error
01259
Stop Recurring
01260
Bad SE Number
01261
Type Not Supported
01262
Merchant does not support this card type
01264
Unable to verify card ID number
01265
Settlement Error
01266
Limit Exceeded
01267
Invalid AuthCode
01269
Invalid Software
01270
No Open Batches Found
01271
Billing_Information_Required
01272
Card Fraud
01273
Line item total must equal amount
01274
AMEXSE merchant parameter not provided
01275
Invalid Routing Number
01277
SEC Violation
01278
Invalid_Routing
01279
Amount Error
01280
Cardnumber Mismatch
01286
No Phone Number Provided
01287
Invalid_CVV
01289
Invalid Website
01290
Debit Requires Track2 Data
01291
Invalid Email
01294
Invalid Exp Length
01295
Expiration Date Must Be In Future
01296
Invalid Merchant ID
01297
Invalid Terminal ID
01298
Invalid Account
01299
Invalid Account Settings
01300
Invalid Effective Date
01301
Invalid merchant key
01302
Try_Again_Later
01303
Void of activation after account activity
01304
Edit Honor
01305
Not approved
01306
Call acquirer's security
01307
Crypto box is offline
01308
Invalid Checking Account Number
01309
Accepted but not yet processed
01310
Promo location restricted
01311
Bulk activation package amount error
01312
Hard Capture; Pick Up
01313
Promotions for Internet virtual and physical cards do not match
01314
Transaction not permitted to terminal
01315
Reversal Rejected. Do not try again
01316
Bad checksum. The checksum provided is incorrect
01317
No term record on system
01318
System malfunction
01319
Internet access disabled
01320
No reason to decline
01321
Invalid status change
01323
TransArmor Service Unavailable
01324
Void/Full Reversal requests in which the Original Authorization was not found
01325
Too many transactions requested
01327
Duplicate Return
01328
Unmatched card expiry date
01329
Invalid issuer
01330
Lost card
01331
Account closed
01332
Duplicate Transaction
01333
CCV failed
01334
Decline
01335
System Error
01336
New Account Information
01337
Invalid account number
01338
Invalid Card Account
01339
Count Exceeds Limit
01340
Transaction Error
01341
Invalid EAN
01342
Target embossed card entered and Transaction count entered do not match
01343
Debit Switch Unavailable
01344
Approve VIP
01345
Violation of law
01346
Transaction destination not
01347
Expired card
01348
Already active and reloadable
01349
Already reversed
01350
Please retry
01351
Invalid account/date or sales date in future
01352
Product code(s) restricted
01353
Date of Birth Error for Check Processing
01354
Invalid State Code
01355
Incorrect PIN
01356
The authorizing network has a problem decrypting the cryptogram in the request
01357
Transaction not permitted to cardholder
01358
Store location zero not allowed
01359
Error
01360
Account on hold
01361
Approved EMV Key Load
01362
Invalid clerk
01363
Account is Purged
01364
Invalid_Amount
01365
Invalid transaction source
01366
Invalid time zone
01367
Service not allowed
01368
Card issuer timed out
01370
Bad authorization code
01371
Duplicate Reversal
01373
DUKPT: An error while processing the PIN block that is not related to the point-ofsale equipment. Contact the Help Desk for assistance 01372 Network Response indicates that Merchant ID/SE is invalid"
01377
Bad_repay_date
01378
Invalid currency
01379
Incorrect transaction version or format number for POS transactions
01380
Do not try again
01381
No account link
01382
Duplicate Completion
01383
Allowable PIN tries exceeded
01384
Bulk activation error
01385
CVV2 Declined
01386
Restricted card
01387
Incorrect location
01388
Transaction history not available
01389
Invalid terminal
01390
Totals Unavailable
01391
The DUKPT Base Derivation key is missing or incorrect in the PIN pad, or PIN key synchronization error
01392
No Savings Account
01393
Cash Back greater than total Transaction amount
01394
Refer – Call Authorization (Checks only)
01395
Password retry exceeded
01396
Currency conversion error
01397
Unknown account
01398
Max balance exceeded
01399
Honor With Authentication
01401
TransArmor Key Error
01402
Not lost or stolen
01403
Account already linked
01404
Already active
01405
Invalid transaction
01406
No transactions available/no more transactions available
01407
Debit/EBT network gateway cannot get through to the ISSUER
01409
Account locked
01410
Refer to issuer‘s special conditions
01411
Insufficent_Funds
01412
Exceeded account reloads
01413
Invalid merchant
01414
Invalid new password
01415
Request not permitted by this merchant location
01416
Request not permitted by this account
01417
Enter lesser amount
01418
Amount Too Large
01419
No phone service
01420
Unsuccessful
01421
Debit/EBT transaction count exceeds pre-determined limit in specified time/ Withdrawal limit exceeded
01422
Account not in inactive state
01423
Bad Post Date
01424
Stolen card
01426
Unable to Locate Record On File
01427
Bulk activation un-attempted error
01428
Account status is void lock
01429
Schema Validation Error
01430
No card record
01432
Pick Up Card
01433
The terminal transaction number did not match (on a void or reversal)
01434
Subsystem Unavailable
01435
New Account Information available
01436
Call for authorization
01437
Approve for partial amount
01438
Inactive account
01439
TransArmor Invalid Token or Account Number
01440
EMV Key Download Error
01441
Do not honor
01442
Referred – Skip Trace Info
01443
Balance not available (denial)
01444
Bad mag stripe
01446
Approved EMV Key Load
01447
Invalid password
01448
Exceeds withdrawal frequency limit
01449
No previous transaction
01451
Transaction not permitted to acquirer or terminal
01452
Hard Negative Info On File
01453
Account row locked
01455
Format error
01456
Exceeds withdrawal amount limit
01457
Resubmission of transaction violates debit/EBT network frequency
01458
New password required
01462
Transaction Previously Voided
01463
Invalid_RefNum
01464
Invalid Credit Card
01465
Invalid Trackdata
01466
Either Token or Magstripe or Card Num and Exp valid per transaction
01467
Refund/Void not allowed on EBT transaction
01468
Invalid EBT Card
01469
Transaction amount exceeded for test account
01470
Invalid_EXP
01471
Refund/Void not allowed on Debit transaction
01472
PIN/DUKPT Required
01474
Invalid Pin/Dukpt
01477
Expiration Date Required
01478
Invalid EBT Card Length
01479
Invalid Card
01480
Voice_Authentication_Required
01481
Timeout
01482
Billing Address Mismatch
01483
Invalid DUKPT format
01485
Account Setup Error
01486
Credit Denied
01487
Unsupported Card Type
01488
Processor temporarily unavailable
01489
Invalid CVV Length
01490
Card Number Error
01491
Invalid_CardNumber
01492
Invalid Tran Code
01493
Hold Card
01494
Use VOID to refund an unsettled transaction
01495
Invalid Variable
01496
Invalid Hash
01500
Invalid FSA Amounts
01501
Resume Map
01502
Name exceeds max length
01503
Monthly volume exceeded
01504
Transaction can not be completed, violation of law
01505
Invalid Transaction Type
01506
Unsupported AID
01507
Processing Error
01508
Invalid Store Key
01509
Invalid Integer
01510
Routing or MICR Required
01511
Account Closed - Contact Cardholder (AU)
01512
Contact Cardholder (AU)
01513
Specified source key not found.
01514
Invalid Bill Street
01515
Invalid Bill First Name
01516
Invalid Bill Last Name
01517
Invalid Ship Street
01518
Invalid Ship First Name
01519
Invalid Ship Last Name
01520
Declined (SF)
01521
MVV merchant parameter empty or invalid
01522
Unable to process transaction
01523
Transaction cannot be refunded at this time
01524
Transaction cannot be voided at this time
01525
Transaction Cannot Be Voided
01526
Specified source key not found
01530
FSA Not Supported
01531
Pin Required for EBT
01532
Account Setup error. Please Contact Support.
01533
Card or Magstripe or MemberID Required
01534
Access Denied
01535
Invalid Input
01536
Invalid Tax
01537
Sequence ID Required
01538
CVV2 Refused
01539
Transaction exceeds maximum amount.
01540
Name Required
01541
Street exceeds max length
01542
Invalid Service Code
01543
Invalid Account/Card Number.
01544
CVC2/CID Rejected by Issuer.
01545
Reversal error
01546
Invalid Name
01548
EXAMOUNT MUST BE >= 0.00 AND <= AMOUNT
01550
EMV Pin Error
01551
Ineligible Refnum
01552
Invalid PNRef
01553
Command Type Does Not Support Pin
01554
Void Not Supported For Pin Transactions
01555
Card not accepted by merchant, please try a different card
01556
Invalid Invoice
01557
Refund not permitted, original sale not found
01558
Balance Temporarily Unavailable
01559
System temporarily unavailable
01560
Issue Amount Exceeds Redeem Amount
01561
This card can not be used with MOTO transactions
01562
Current permissions do not allow this operation. Please contact customer support.
01563
Transaction amount below minimum
01564
Invalid check images
01565
Invalid Username
01566
Invalid Currency Code
01567
Invalid Account Type
01568
Invalid mInitial
01569
Invalid aptNum
01570
Invalid city
01571
Invalid state
01572
Invalid billZip
01573
Invalid mailApt
01574
Invalid mailCity
01575
Invalid mailState
01576
Invalid mailZip
01577
Invalid dayPhone
01578
Invalid evenPhone
01579
Invalid ssn
01580
Invalid dob
01581
Invalid recEmail
01582
Invalid knownAccount
01583
Invalid rtNum
01584
Invalid splitNum
01585
A ProPay account With this e-mail address already exists Or User has no AccountNumber
01586
A ProPay account With this social security number already exists
01587
The email address provided does Not correspond To a ProPay account.
01588
Recipients e-mail address shouldnt have a ProPay account And does
01589
Invalid Credential Or IP address Not allowed
01590
Over credit card use limit
01591
Miscellaneous Error
01592
Denied a ProPay account (Developer should display a descriptive message that guides a New user To fill out ProPay exceptions form And submit it.)
01593
Unauthorized service requested
01594
Account Not affiliated
01595
Duplicate invoice number (The same card was charged For the same amount With the same invoice number (including blank invoices) In a 1 minute period. Details about the original transaction are included whenever a 69 response Is returned. These details include a repeat Of the auth code, the original AVS response, And the original CVV response.)
01596
Duplicate external ID
01597
Account previously Set up, but problem affiliating it With partner
01598
The ProPay Account has already been upgraded To a Premium Account
01599
Invalid Destination Account
01600
Account Or Trans Error
01601
Money already pulled
01602
Not Premium (used only For push/pull transactions)
01603
Empty results
01604
Generic account status Error
01605
InvalidUserID
01606
BatchTransCountError
01607
InvalidBeginDate
01608
InvalidEndDate
01609
InvalidExternalID
01610
DuplicateUserID
01611
Duplicate Batch ID
01612
Duplicate Batch Transaction
01613
Batch Transaction amount Error
01614
Unavailable Tier
01615
Invalid Country Code
01616
Account created In documentary status, but still must be validated.
01617
Account created In documentary status, but still must be validated And paid For.
01618
Account created successfully, but still must be paid For.
01619
Invalid Payer Name
01620
Transaction does Not meet Date criteria
01621
Direct deposit account Not specified
01622
Invalid SEC code
01623
Invalid x509 certificate
01624
Invalid value for require CC refund
01625
Required field Is missing (This Is returned only For edit ProPay account. See response tag For field name.)
01626
Invalid EIN
01627
Invalid business legal name (DBA)
01628
One of the business legal address fields Is invalid
01629
Business (legal) city Is invalid
01630
Business (legal) state Is invalid
01631
Business (legal) zip Is invalid
01632
Business (legal) country Is invalid
01633
Mailing address invalid
01634
Business (legal) address Is invalid
01635
Incomplete business address
01636
Amount Encumbered by enhanced Spendback
01637
Invalid key serial number
01638
You may Not transfer money between these two accounts. Sponsor bank transfer disallowed.
01639
Currency code Not allowed for this transaction
01640
Currency code Not permitted for this account
01641
Requires Additional Validation
01642
Multicurrency processing Is Not allowed for the account
01643
Multicurrency processing Is Not supported For this bank processor
01644
Capture amount exceeds allowed amount
01645
Account setup does Not allow capture For amount greater than authorization
01646
Threat Metrix risk denied (no responseCode Is returned)
01647
Threat Metrix Invalid SessionId
01648
Threat Metrix Invalid Account configuration
01649
External Payment Provider Not provided
01650
External Payment Identifier Not provided
01651
External Payment Provider Not valid
01652
Inactive Or blocked MCC Code
01653
Invalid MCC Code (non-numeric Or Not In our database)
01654
Gross settle: invalid credit card information
01655
Gross settle: invalid billing information
01656
Gross settle: no billing information was included with the payment info
01657
Debit Requires Swipe. Please Swipe or Use Credit.
01658
Swipe again
01659
Key Is Inactive
01660
Invalid Void After Refund
01661
Refund on a refund not allowed
01662
Invalid Cavv/Eci Value
01663
Invalid Contactless
01664
CVV Response Code is required
01665
Invalid processor
01666
Processor is temporarily unavailable
01667
NOT AUTHORISED
01668
BIN is required
01669
Invalid license
01670
Token Expired
01671
Token reference not found
01672
Invalid EMV Read. Please try again.
01673
Inactive Gift Card
01674
Card already active
01675
Card already inactive
01678
Refund not permitted, amount exceeds original sale
01679
Declined - Contact Support
01680
Unsupported Transaction
01681
AVS Street Required
01683
Line Items Required
01684
Re enter
01685
Missing or Invalid PARes
01686
Recapture not supported
01687
You have tried too many card numbers, please contact merchant.
01689
Capture not allowed on voided auth
01690
Negative Tax amount not allowed
01691
Data Unavailable
01692
Account Unavailable
01693
This terminal has been disabled. Please contact customer service to configure the terminal.
01694
Transaction not supported
01695
Cashback not supported
01696
An unexpected error has occurred. Technical Support has been alerted to this problem.
01697
Unable to map data
01698
Invalid billing address
01699
Incorrect CVV
01700
AID Mismatch
01701
Batch previously locked for settlement
01702
Insert Card Again
01703
Card Type Not Allowed
01704
Refund not allowed; issue void
01705
Invalid RoomNum
01706
Amount Not Supported
01707
Unsupported Industry
01708
Transaction authentication required.
01709
Swipe Card
01710
Encryption Required (Port)
01711
Specified Encryption Key Not Found
01712
Debit Void Not Supported
01713
Command Type Not Supported For Debit/EBT
01714
Invalid chip read; try again.
01715
Invalid Start Date (Batch Report)
01716
Invalid Start Date/Time
01717
Swipe Not Allowed
01718
Invalid EntryMode
01719
Invalid Encryption Key
01720
Signature Invalid (SUT)
01721
Transaction can no longer be voided
01722
Invalid Encrypted Swipe
01723
One or more errors occurred
01724
The referenced transaction does not meet the criteria for issuing a credit
01725
Bill field required
01726
Invalid GiftCard Length
01728
Invalid Batch Sequence
01729
Missing Required Credit Card Data
01730
Unable to Communicate with MAPS Server
01731
Bad Data
01732
Verify Balances
01733
OOS Required
01734
Currency Not Supported
01735
Object reference not set to an instance of an object
01736
Source has been blocked from processing transactions.
01737
Invalid Field
01738
An error occurred during processing. Call Merchant Service Provider.
01739
Partial Auth not supported for eWIC
01740
This transaction cannot be accepted.
01741
Invalid eWIC card
01742
Could not Retrieve Transaction ID
01743
Missing part of path
01744
Error Processing Lookup Request Message
01745
Invoice exceeds max length. Field has been truncated.
01746
Invalid Device IP
01747
Database Unavailable
01748
Adjustment not allowed
01749
Must specify a valid payment method
01750
An error has occured. Please contact support.
01751
Try Again
01752
Batch Not Found
01753
Authentication Data Unavailable
01754
Exceeds Daily Limit
01755
Exceeds 7 Day Limit
01756
Exceeds 30 Day Limit
01757
FAILED PLZ CALL S80
01758
Transaction already settled, issue refund (P)
Specified Token Not Found (SUT)
The provided SUT is invalid. This usually occurs if the token has already been used.
Ensure each SUT is used only once and generate a new one for every request.
01208
Specified Key Not Found
Specified Key Not Found (SUT)
The xKey or iFields key provided is invalid. This can happen if the key is incomplete or has been modified.
Make sure you are using the full, unmodified key exactly as provided.
99999
Signature Invalid (SUT)
The SUT is invalid, often because the data was altered or not fully included.
Send the full, unmodified SUT exactly as returned.
01222
Unauthorized Token (V)
Unauthorized Token (I) (SUT)
The Vendor ID or iFields key is invalid. This usually occurs if the Vendor ID is incorrect or the iFields key belongs to a different account than the xKey.
Verify that the Vendor ID is correct and that the iFields key and xKey belong to the same account.
01473
Card Or Magstripe Required
The request is missing card information.
Ensure that a card number, SUT, or token is included in the transaction request.
Error Code
Message
09999
Undefined Error
01000
Missing Required Variable
01001
Missing Required Tags
01002
Missing Required Fields
01010
Unable to verify card ID number.
01011
Customer Name Required
01012
Sola (Cardknox) Android SDK is a mobile SDK targeted towards Android developers, allowing developers to process transactions with the Sola Transactions API.
To start, download the SDK framework file:
Integrate the SDK file into your Android Studio project by referring to the .
The SDK offers developers a couple of ways to process transactions:
In scope function
Out of scope function
Custom UI set of functions
Payment Engine set of functions
Use the out of scope function when the user needs to provide their credit card information. This function displays the SDK user interface, effectively giving the control over to the SDK to acquire the sensitive credit card data from the user. The user provides the sensitive information either via a form or via a credit card device, and then the SDK processes the transaction with the gateway.
Use the in scope function when there is no need for the SDK to interact with the user through a user interface. The developer should either pass in a card number + an expiration date, or provide a tokenized card data via the xToken parameter to this function to quickly process the transaction and retrieve back the results.
Custom-UI integration consists of a set of functions to control the card reader device via the SDK. Currently supported card reader device is a Bluetooth VP3300 card reader and USB connection. This integration path is useful when the developer has an existing UI and wishes to use a card reader device to obtain users' card sensitive information and then process the transaction with the gateway. The SDK offers a set of functions to control the card reader device. The SDK takes care of processing with the gateway and notifying the Developer’s application with the processing results.
The Payment Engine feature inside the SDK enables you to create transactions with a card reader over IP. The Payment Engine supports different card readers from Pax, Verifone, and Ingenico brands. See a full list of supported devices in the table below. The feature doesn't contain any UI. The developer provides device and transaction parameters to Payment Engine functions. The SDK takes care of communicating with the card reader and processing with the gateway. Finally, the SDK returns the device and transaction status and states.
Download our sample applications:
Prior to any processing, the Sola SDK needs to be configured with user’s metadata and the account key. These functions can be called anywhere in the application any number of times to change the metadata and/or current account key.
Each integration path has a “process” function that accepts a “transaction parameters” object. Developers specify required values for transaction processing through that object. The same object can be used to specify optional; parameters to associate with a transaction, such as invoice numbers, billing address, etc.
Optional transaction parameters further complement the transaction processing. All the parameters are sent to the Gateway during processing.
The SDK can notify the application about various events during processing, such as about different card reader events during out of scope processing, or perhaps about a completed bluetooth device scan during custom UI processing.
Developers opt in to receive callbacks by registering BroadcastReceivers with IntentFilters, using a predefined value from the SDK for the “action” parameter.
The SDK uses the same “action” value to report results & various information back to subscribers.
Available callback types and integrations where they are applicable in are as follows:
Based on your integration path choice, choose an available callback type for that integration path and register a BroadcastReceiver to receive appropriate information back from the SDK.
This callback delivers a “transaction processed response” object to the subscriber.
Subscription can be made in the appropriate Fragment lifecycle method:
This callback delivers information about various events happening between the application & the card reader.
For example, while out-of-scope processing the SDK can report back error events related to bluetooth device pairing, such as “bluetooth not turned on” to indicate that the mobile device wanted to use the bluetooth service to find a nearby card reader device but the service is unavailable, or an error such as “waiting for device bluetooth response” to indicate that the mobile device found an eligible bluetooth card reader device and is expecting the card reader to respond back with bluetooth data. This could mean that the bluetooth button on the card reader needs to be pressed.
After a bluetooth pairing is established, the SDK reports back events related to obtaining the card data via the card reader. For example, a “connected” event means that the mobile device & the card reader are connected and a card data transaction can start. A “transaction started” event means that the SDK initiated a card data transaction with the card reader and the physical card can be tapped onto the card reader.
Subscription can be made in the appropriate Fragment lifecycle method:
When a card reader event happens, the SDK delivers an object, of a type named similarly to “CardknoxCardReaderCallback”, back into the app.
The object encapsulates two things:
an event integer code
an event name; such as “connected”, “disconnected”, etc.
Event integer codes are enumerated in a type named similarly to "CardknoxCardReaderCallbackType".
Developers can match the received integer code value with the enumeration of interest to pinpoint a wanted event.
One of the Custom UI integration functions is a “start scanning” function. The function keeps scanning for nearby bluetooth devices until it is manually stopped with the “stop scanning” function or if it times out.
During the scanning process, for every scanned device the SDK sends a “scanned device” object that contains all the necessary metadata about the scanned device, such as the devices' display name or its internal name.
Subscription can be made in the appropriate Fragment lifecycle method:
One of the Custom UI integration functions is a “start scanning” function. The function keeps scanning for nearby bluetooth devices until it is manually stopped with the “stop scanning” function or if it times out.
Once the scanning process ends, the SDK sends a list of scanned device objects to all subscribers. Any object in the retrieved list can be used as an argument to the “connect to device” method.
Subscription can be made in the appropriate Fragment lifecycle method:
This callback provides information about the status of the card reader. It sends information about the initialization process of the device, the connection process of the card reader, and the mobile device. It also sends notifications about the actions expected by the user of the credit card.
The transaction status callback sends information about the card scanning process. This callback starts triggering when the user inserts or swipes the credit card and ends with the result of card scanning.
The callback for a basic processed transaction response returns information about the transaction as an object with properties. Each property of the object corresponds to a specific piece of transaction data. However, the payment engine has an additional callback for the transaction result, which is returned as JSON. In this callback, instead of returning the transaction as an object, the processed transaction is provided as a text representation of a JSON object.
To receive the transaction response as JSON using this callback, you must call the SetSendResponseAsJSON(true) method on CardknoxPaymentEngineSDKobject . Otherwise, the transaction result will return the response as an object. The transaction response can only be received through a single callback at any given time. This means that only one callback handler is allowed to process the response for a specific transaction, ensuring consistency and avoiding potential conflicts or duplicate processing.
LogCat callback logging is a feature that allows the payment engine to send log messages directly to the application through callbacks. When enabled—by setting the EnableLogcatBroadcasts property to true—the app receives log events programmatically instead of relying only on the standard LogCat console output.
This method gives developers more control over how logs are used. Logs can be captured, filtered, stored, or forwarded to external monitoring systems, making it especially useful in production environments where console access is limited. It also enables building custom logging tools within the app for advanced debugging and diagnostics.
Out of scope processing feature allows the developer to show the Cardknox user interface for payment processing.
To show the user interface, create a request object that is capable of showing a user interface:
Check if the request object is in a valid state. If it is, call the method to show the UI. Otherwise, inspect the validation errors to see what is incorrect in the request object:
The SDK’s user interface consists of two fullscreen parts - a manual entry screen and a card reader screen. Manual entry screen is also abbreviated as a “keyed” screen. The card reader screen is also abbreviated as a “swipe” screen.
Showing the SDK user interface via a Request object will either show one of the screens, or both. Which screen will be visible depends on the global SDK configuration state prior to showing the SDK user interface via a Request object.
Note that if the SDK is configured to allow access to both processing screens, one of them will be shown by default and both of them will have some kind of a visual way to navigate to the other one.
The following table shows available functions to control which screen will be visible & accessible:
The following mapping represents which screens will be available when the SDK shows its user interface:
The following mapping represents available Cardknox Transaction API commands on each user interface
Developer using the Out Of Scope integration to process using the VP3300 card reader can specify a per-request transaction timeout value. The SDK will start a transaction with the VP3300 reader, and timeout in the specified time frame if the card is not tapped, swiped or inserted in that same time frame.
After the out-of-scope function finishes with transaction processing, the SDK displays a popup containing a handful of information about the transaction.
The SDK can be configured to auto close the user interface immediately after the transaction processing has completed; regardless if the transaction was approved or not.
In scope processing feature allows the developer to quickly process a payment and retrieve the response object.
To process directly, create a request object:
Check if the request object is in a valid state. If it is, call the method to process directly. Otherwise, inspect the validation errors to see what is incorrect in the request object:
Check (ACH) commands
Reference:
Credit Card commands
Custom UI integration is similar to the “out of scope” integration in a way that the exact same methods that the “out of scope” is using under the hood for controlling the card reader, are exposed via the SDK for the Developer to use.
The Developer can choose and use two connection method to create a transaction with the card reader device, the Bluetooth and USB. Bluetooth is a wireless method of communication between a card reader and a mobile device. To use Bluetooth, the mobile device must have Bluetooth capability and must have Bluetooth permissions enabled. The SDK takes care of the availability of Bluetooth and Bluetooth permissions. On the other hand, the USB connection method uses a wire for communication between the card reader and the mobile device. The USB method is the simplest and most direct method, as the connection between the card reader and the mobile phone is a strong connection. This means that the mobile device does not need to scan to find and communicate with the card reader. The USB method is also not affected by the card reader's sleep feature, while with Bluetooth, the connection is lost when the reader goes into sleep mode.
The SDK cannot automatically recognize what connection methods card reader supports and cannot automatically initiate communication between the reader and the mobile device. Therefore, the Developer must decide which connection method to use and for which card reader. The CardknoxSDK object has two different functions that return an instance of communication manager for card readers based on communication method. The getCustomUIBluetooth() for Custom UI with Bluetooth and getCustomUIUSB()for Custom UI with USB. Both Bluetooth and USB only support the VP3300 device.
The Developer provides the user interface and orchestrates the entire flow for obtaining the card data via the card reader by calling appropriate Custom UI functions at specific times.
The CardknoxSDKtype provides a function to obtain the Custom UI manager:
The CardknoxSDK object contains instance for connecting card reader with USB. Management of the card reader is done using the functions contained in the USB instance.
Any of the following credit card commands are available for Custom UI:
cc:save
cc:credit
cc:authonly
cc:sale
Reference:
First, create a “custom ui” object to get access to all the Custom UI functions. Afterwards, subscribe to all the relevant callbacks for this integration path:
transaction result callback - to receive the “response” object after the SDK has processed a transaction
card reader event callback - to be notified about various events that take place between the application & the card reader
scanned bluetooth device callback - to be notified about every new scanned bluetooth device during the “scan for devices” process
Next step is to establish a connection between the app and the card reader device. Use one of the “connect” methods on the “custom ui” to initiate a connection; such as “connect with name” or “connect with address”.
Device name or the MAC address can be obtained with the “scan for devices” flow. Initiate the “start scanning” function call, with or without a timeout.
The scanning process stops with a call to the “stop scanning” function or when the “start scanning” function times out.
After establishing a connection with the card reader by calling one of the “connect” methods and receiving a “connected” card reader event via the BroadcastReceiver subscription, call the “start transaction” function to make the card reader ready for a card.
The SDK will report a “transaction started” event if the transaction with the card reader was successfully started, otherwise an “error” card reader event is reported back. At this point the card can be tapped, swiped or inserted into the card reader. The SDK will read the card information, process a transaction & deliver the results to the application via a callback.
If no card is tapped, swiped or inserted after the transaction started - a “timeout” card reader is reported back. The default timeout value is about 10 seconds. The developer can override this value via the “transaction parameters” object.
The Payment Engine won't show any UI. The developer provides the user interface and uses three payment engine functions to create transactions with a card reader over IP. Data that is required to create a transaction is passed by developers as parameters to those SDK functions. The messages and results of creating a transaction with the Payments engine are obtained by the developer from transaction result callback, device status callback, and transaction status.
Developers can read from the cardknox.payments.sdk.BuildConfig class, properties are:
SDK verbose logging can be enabled or disabled with a function call:
As a Cardknox SDK user, I want to process without an internet connection. What will happen?
The SDK will return a PaymentTransactionResponse object with a special xErrorCode value -1
As a Cardknox SDK user, I’ve encountered errors during transaction processing. What response can I expect?
To ensure that the integrity of the downloaded SDK & sample app files & archives was not tampered with, refer to the following checksums:
SDK
Sample apps
A35
Pax_A35.3
A60
Pax_A60.3
A77
Pax_A773
A80
Pax_A80.3
A920
Pax_A920.3
PX5
Pax_PX5.3
PX7
Pax_PX7.3
D210
Pax_D210.3
D220
Pax_D22.3
Aries6
Pax_Aries6.3
Aries8
Pax_Aries8.3
Verifone
MX915
.4
Verifone_MX915.4
MX925
Verifone_MX925.4
P200
Verifone_P200.4
P400
Verifone_P400.4
M400
Verifone_M400.4
E285
Verifone_E2854
Ingenico
ICT250
.2
Ingenico_ICT250.2
Desk500
Ingenico_Desk5000.2
Move500
Ingenico_Move5000.2
Name of your software
My app
xSoftwareVersion
Yes
Version number of your software
1.0.0
61h72mmh68phn9q233634ph3g54p1499m69qhp4816pn528h84
xRefNum
Used to reference a previous transaction when doing a follow-up transaction, typically a refund, void, or capture.
12345678
xInvoice
The merchant’s invoice number for the transaction. xInvoice is recommended when available for improved duplicate handling.
The merchant’s invoice number for the transaction. xInvoice is recommended when available for improved duplicate handling.
xPoNum
The merchant’s purchase order number for the transaction.
123485
xDescription
This is a description
This is a description
xName
The cardholder’s name.
John Doe
xBillFirstName
The customer’s first name for their billing profile.
John
xBillLastName
The customer’s last/family name for their billing profile.
Doe
xBillCompany
The customer’s company name for their billing profile.
Acme
xBillStreet
The customer’s street address for their billing profile.
123 Any Street
xBillStreet2
The customer’s second street address for their billing profile.
123 Any Street
xBillCity
The customer’s city for their billing profile.
Anytown
xBillState
The customer’s state for their billing profile.
NY
xBillZip
The customer’s zip code for their billing profile.
12345
xBillCountry
The customer’s phone number for their billing profile.
USA
xBillPhone
The customer’s phone number for their billing profile.
8005551212
xShipFirstName
The customer’s last/family name for their shipping profile.
John
xShipLastName
The customer’s last/family name for their shipping profile.
Doe
xShipCompany
The customer’s company name for their shipping profile.
Acme
xShipStreet
The customer’s street address for their shipping profile.
123 Any Street
xShipStreet2
The customer’s second street address for their shipping profile.
123 Any Street
xShipCity
The customer’s city for their shipping profile.
Anytown
xShipState
The customer’s state for their shipping profile.
NY
xShipZip
The customer’s zip code for their shipping profile.
12345
xShipCountry
The customer’s country for their shipping profile.
USA
xShipPhone
The customer’s phone number for their shipping profile.
1113333444
xCustom01
Custom field 1. Use this for any additional data
xCustom02
Custom field 2. Use this for any additional data
xCustom03
Custom field 3. Use this for any additional data
xAuthCode
xAuthCode is a verification number provided by the issuing bank to be used with the cc:postauth command.
xAllowDuplicate
By default, Cardknox rejects duplicate transactions within 10 minutes of the original transaction. This command overrides that safeguard. True/False allowed.
False
xCustReceipt
True/False value indicating if the email address specified in xEmail should receive a receipt containing the transaction details.
False
Device_name
PE device name
Verifone_P400.4
(The 4. column in Payment engine support device table)
Device_IP_Address
IP address of PE device
172.21.2.7
Device_Port
Port of PE device
9006
Device_Timeout
Timeout for PE device connecting
120
VP3300StartTransactionMethod
The card reader can scan a card in a few different ways: swipe, tap, or insert a card. This property defines how the card reader expects the card to be scanned.
See .
Possible values:
CTLS - tap a card (NFC)
EMV - insert card
MSR - swipe card
EnableTipPrompt
Prompts the user on the device to add a tip to the transaction. This functionality is only available when the device is enabled. The response to the transaction will include two parameters: "xTip" (the tip amount) and "xAuthAmount" (the final authorized amount on the card, including the tip amount).
Available in the Payment Engine integration.
Custom UI
Device status
The SDK is sending information to subscribers about the device initialization process and the actions that the device expects from the user of the card scanner.
For example, waiting for the insert or swipe of a credit card.
Payment Engine
Transaction status
The transaction status sends information about the card scanning process.
Payment Engine
Result as JSON
The result of created transaction return in JSON format.
Payment Engine
Payment engine LogCat logging
The payment engine supports two types of event logging. One prints logs directly to the LogCat console, while the other delivers logs via callbacks, allowing the app to handle them programmatically.
Payment Engine
Cardknox SDK attempts a “start transaction” call with the card reader SDK.
Card reader SDK successfully starts the transaction and notifies the Cardknox SDK with this event.
Cardknox SDK calls back with this event to the app.
transactionStartErrorTimeout
Cardknox SDK attempts a “start transaction” call with the card reader SDK.
The card reader never receives a card in a specified timeout frame window (about 20 seconds) and the transaction times out.
transactionStartDeviceDisconnected
Cardknox SDK wants to start the transaction with a disconnected device.
transactionCancelled
Generally, this is raised whenever an error occurs at any point between starting a transaction with the reader and obtaining the card data.
See the “error” event for error examples.
The Cardknox SDK in cases of these errors preventively calls the “cancel any pending transactions” internally to clean up.
Specifically, this event is raised in the “custom ui” integration when:
a “cancel transaction” method is called & the card reader SDK cancels all pending transactions between the app & the card reader
Furthermore, this event is raised in the “process out of scope” integration when:
scanStop
Indicates that the Cardknox SDK stopped its own bluetooth scanning.
Raised in the “custom ui” integration when:
a Developer explicitly calls the “stop scanning” method
when the “start scanning” method was called with a timeout value and the timeout expired or was cancelled / interrupted
in the “disconnect from current device” call if the “connect to device” method was called beforehand but there is no connected device to disconnect from
scanStart
Indicates that the Cardknox SDK started a bluetooth scanning process.
Raised in the “custom ui” integration when:
the “start scanning” method was called, with or without a timeout value
Raised in the “process out of scope” integration when:
the SDK shows its' UI and automatically starts scanning for nearby readers
error
This is raised whenever an error occurs at any point between starting a transaction with the reader and obtaining the card data.
Things that could go wrong (list is not exhaustive) are:
transaction with the card reader failed to start
emv card readings are corrupted
transaction started but the card was not tapped / swiped / inserted in time
swipe says use chip reader
This card reader event is raised when the card with a chip is swiped, to indicate that a “fallback Swipe” was blocked. Reach out to Sola support to consult about “fallback Swipe”.
card inserted when ctls swipe requested
in some scenarios, the VP3300 will expect a Swipe, but will receive a card Insert. In such cases this event is raised.
contactless in msr card read event
this event is raised when a Contactless MSD transaction is performed on a VP3300 device.
USB detached
This event occurs when the USB cable is unplugged, causing the connection between the mobile device and the card reader to be interrupted. As a result, any ongoing communication or data transfer between the two devices is immediately stopped.
Note: Only available for .
USB device not found
This is raised when you try to connect to the card reader that's not plugged in with a USB cable.
Note: Only available for .
USB unsupported product
This means that the connected USB device is not supported by the system or the driver.
Note: Only available for .
USB permission not granted
This error occurs when the application does not have the necessary permission to access the connected USB device. The user must explicitly grant permission for the device to be recognized and used.
Note: Only available for .
Yes
No
true
true
Yes
Yes
EBT Food Stamp commands
Reference: EBT Food Stamp
EBT Cash Benefits
Reference: EBT Cash Benefits
EBT Wic
Reference: EBT Wic
Gift Card commands
Reference: Gift Card
DisconnectFromCurrentDevice
Attempts to break the connection between the application & the card reader. If the card reader is not connected to the app, a card reader event similar to “disconnected already” is raised.
Otherwise, the SDK attempts to disconnect the card reader. If successful, the “disconnected” card reader event is raised.
StartTransaction
Starts a transaction between an already connected application & the card reader.
Once the transaction starts, the card reader is ready to accept cards, either via swipe, tap or insert.
This method can timeout. Default value is 10 seconds. Developers can override this value via the “parameters” object.
CancelTransaction
Attempts to cancel an already started transaction between the application & the card reader.
If no transactions are started when this function is called, the function does not do anything.
Attempts to cancel an already started transaction between the application & the card reader.
If no transactions are started when this function is called, the function does not do anything.
CardknoxSDK.create().getCustomUIUSB().cancelTransaction();
The EnableLogcatBroadcasts property enables log delivery via callbacks. When set to true, the payment engine sends logs to the app instead of just printing them to the LogCat console, allowing custom handling of log messages.
CardknoxSDK.create().getPaymentEngine().enableLogCatBroadcasts(true);
Device_ReprintReceipt
This method is used to reprint a transaction receipt from the card reader. This function allows users to reprint receipts for any previous transaction. It is useful in situations where a receipt was not printed correctly, was lost, or when a customer requests a duplicate or previous transaction receipt
CardknoxPaymentEngineSDKSettings settings = new CardknoxPaymentEngineSDKSettings(); settings.SetDevice_IP_Address("specify IP"); settings.SetDevice_IP_Port("specify port"); settings.SetDevice_Name("specify device name, such as PAX_A77.3"); settings.SetDevice_Timeout(5 * 1000); /* milliseconds to seconds */ CardknoxPaymentEngineSDKRequest request = new CardknoxPaymentEngineSDKRequest(); request.SetxAuthCode("add auth code here"); String response = CardknoxSDK.create().getPaymentEngine().Device_ReprintReceipt(settings, request); boolean success = response.equals("OK");
the PaymentTransactionRequest object will encapsulate all relevant information in respective fields; for example the xErrorCode property will return a code from the Cardknox Transaction API documentation, the xErrorMessage and xError properties can be used for a descriptive error message while the xRefNum gives back a unique ref num to follow up with the customer support
Brand
Model
Suffix
Parameter value
Pax
SP30
.3
Pax_SP30.3
S300
Pax_S300.3
S920
Pax_S920.3
Name
Required
Description
Sample data
xKey
Yes
Sola account key
Sola
xVersion
Yes
Gateway version
4.5.9
xSoftwareName
Function
Description
Sample data
setSoftwareConfigurations
Specifies the name of your software (xSoftwareName), version number of your software (xSoftwareVersion) and the gateway version (xVersion)
CardknoxSDK.setSoftwareConfigurations("Your app name", "0.0.1", "4.5.9");
setPrincipalKey
Accepts the xKey.
xKey is a Sola account key.
All transactions being processed after calling this function will be associated to the account that was passed in into the function.
CardknoxSDK.setPrincipalKey("ps_demo_cardknox");
Name
Description
Sample data
xCommand
Sola transaction type
cc:sale
Name
Description
Sample data
VP3300TransactionTimeout
Start transaction timeout, in seconds.
Once the transaction with the VP3300 reader is started; the SDK times out if the card is not provided in the time frame specified by this timeout value.
This parameter is only applicable for SDK integrations that use a VP3300 card reader; such as CustomUI or OutOfScope integrations.
Refer to the Custom UI flow or Out Of Scope flow for samples.
xCardNum
Card number
4444333322221111
xExpDate
Card expiration date.
Expected format is MMYY where MM is a month, and YY are last 2 year digits
“1126” for (November 2026)
“0122” for “January 2022”
xToken
Callback type
Description
Available in integration
Transaction result
The SDK processes a payment with the Gateway and delivers an object containing all processed transaction details.
Out of scope
Custom UI Payment Engine
Card reader event
The SDK keeps informing the subscribers about various events taking place between the application and the card reader device; such as “connected”, “disconnected”, “transaction started”, “on bluetooth disabled error”, etc.
Out of scope
Custom UI
Scanned bluetooth device
Trigger a bluetooth device scanning process with the “start scanning” function.
During the scanning process, the SDK keeps informing subscribers with objects that encapsulate all the information about each newly discovered Bluetooth device.
The SDK expects one of the objects as an argument in the “connect to device” function.
Custom UI
Scan completed
Event name
Description
connecting
The Cardknox SDK calls into the card reader SDK to connect with the reader, in scenarios such as:
“connect to device” method in the “custom ui” integration
when it presents its own UI in “process out of scope” integration
The card reader SDK starts searching for nearby IDTech card readers & notifies the Cardknox SDK with a “connecting” event.
The Cardknox SDK raises a “connecting” callback which notifies the app.
waitingForDeviceResponse
This event is raised whenever the Cardknox SDK scans for nearby card readers. Awake readers are usually auto connected straight away.
Asleep or not, this event is always raised from the SDK to indicate that some action is required on the device.
This event is raised in the “custom ui” integration when:
a developer calls the “start scanning” method and the underlying bluetooth adapter starts scanning
or when a Developer calls the “connect to device” method. Sola SDK will call the card reader SDK to “connect” and raise this event
This event is raised in the “process out of scope” integration when:
the Cardknox SDK presents its user interface; automatically starting a bluetooth scan for a nearby card reader, expecting a response back
connected
Raised when the app & the card reader establish a bluetooth connection.
Bluetooth connection is established when the Cardknox SDK scans for card readers, and card readers respond back with some bluetooth payload.
disconnected
Card reader SDK sends this event to the Cardknox SDK whenever a bluetooth card reader goes to sleep.
This event is never raised explicitly by the Cardknox SDK.
transactionStarting
Informational event.
Cardknox SDK raises this event before it places a call to the underlying card reader SDK in order to start a transaction with the card reader.
Function
Description
Sample data
EnableDeviceInsertSwipeTap
Globally configures the SDK to show the keyed screen that allows manual input interaction.
CardknoxSDKUI.SetEnableDeviceInsertSwipeTap(true);
EnableKeyedEntry
Globally configures the SDK to show the swipe screen that allows card reader interaction.
CardknoxSDKUI.SetEnableKeyedEntry(true);
EnableDeviceInsertSwipeTap
EnableKeyedEntry
Keyed screen available
Swipe screen available
false
false
Yes
No
true
false
No
Yes
false
Keyed
Swipe
Any Cardknox Transaction API command
Any of the following credit card commands:
cc:save
cc:credit
cc:authonly
cc:sale
Reference:
Function/property
Description
Sample data
VP3300TransactionTimeout
Start transaction value, in seconds.
Function
Description
Sample data
CloseSDKUIOnProcessedTransaction
Globally configures the SDK to auto close the user interface after processing a transaction.
Default value is false.
CardknoxSDKUI.SetCloseSDKUIOnProcessedTransaction(false);
CardknoxSDK.create().getCustomUIBluetooth();
Function
Description
Sample data
StartScanningWithTimeout
Starts the “scan for nearby bluetooth devices” process.
If the timeout value is 0 or a negative number, the scanning never times out.
A card reader event similar to “waiting for device response” will be raised once the scanning starts. This usually means that the user needs to press the physical button in order for the card reader device to be visible to nearby scanners.
StopScanning
Attempts to stop the bluetooth device scanning process.
Raises a “stop scan” card reader event.
Doesn’t do anything if scanning is not in progress.
If the method stops the scanning process, the SDK reports all scanned devices via a callback.
ConnectWithName
Accepts a device name.
Configures the SDK to be ready to establish a Bluetooth connection with the nearby VP3300 device with a name equal to the provided name.
After the call:
the card reader & the app are not connected immediately but rather the SDK notifies the developer about various card reader events taking place after this method is called; such as “connecting” and “waiting for device response”
if the VP3300 devices’ bluetooth is not asleep when this method is called, the card reader auto connects to the app
ConnectWithAddress
Function
Description
Sample data
ConnectVP3300
It tries to establish a communication channel between the application and the VP3300 card reader.
CardknoxSDK.create().getCustomUIUSB().connectVP3300();
DisconnectFromCurrentDevice
Termination of the communication channel between the currently connected card reader and the mobile device.
CardknoxSDK.create().getCustomUIUSB().disconnectFromCurrentDevice();
SetVP3300StartTransactionMethod
The SetVP3300StartTransactionMethod function is a method of the TransactionParameters object used to configure how a card reader initiates a card transaction. It accepts a parameter of type VP3300StartTransactionMethod, which defines the scanning method the card reader should use.
By calling this method, developers can control the specific way in which the reader should prompt and process a card during a transaction, depending on the desired input method.
The VP3300StartTransactionMethod parameter is an enumerated type that supports the following constant values:
CTLS – Contactless card transaction
EMV – Chip (contact) card transaction
MSR – Magnetic stripe card transaction
DEVICE – Default or device-specific scanning behaviour.
TransactionParameters prms = new TransactionParameters(); prms.SetVP3300StartTransactionMethod(VP3300StartTransactionMethod.MSR); CardknoxSDK.create().getCustomUIUSB().startTransactionWithArgs(prms);
StartTransactionWithArgs
Starts a transaction between an already connected application & the card reader.
Once the transaction starts, the card reader is ready to accept cards, either via swipe, tap or insert.
Developers can override this value via the “parameters” object.
TransactionParameters prms = new TransactionParameters(); prms.SetxAmount(1.23); prms.SetxInvoice("1234"); prms.SetxCommand("cc:sale"); prms.SetVP3300TransactionTimeout(13); CardknoxSDK.create().getCustomUIUSB().startTransactionWithArgs(prms);
Function
Description
Sample data
Device_Initialize
This function makes sure that the mobile device can communicate with the card reader and saves data that is needed for connecting to the card reader.
The initialization process can take about 2 minutes. But it is sufficient to execute it once per card reader and IP address.
CardknoxPaymentEngineSDKSettings settings = new CardknoxPaymentEngineSDKSettings(); settings.SetDevice_IP_Port("9001"); settings.SetDevice_IP_Address("127.21.2.7"); settings.SetDevice_Name("Verifone_P400.4"); settings.SetDevice_Timeout(120 * 1000); // 120 seconds; CardknoxSDK.create().getPaymentEngine().Device_Initialize(settings);
ProcessOutOfScopeWithSettings
Attempts to create a transaction with a card reader over IP.
This function will perform the initialization process if initialization has not been performed for the specific card reader.
CardknoxPaymentEngineSDKSettings settings = new CardknoxPaymentEngineSDKSettings(); settings.SetDevice_IP_Port("9001"); settings.SetDevice_IP_Address("127.21.2.7"); settings.SetDevice_Name("Verifone_P400.4"); settings.SetDevice_Timeout(120 * 1000); // 120 seconds; CardknoxPaymentEngineSDKRequest request = new CardknoxPaymentEngineSDKRequest(); request.SetxCommand("cc:sale"); request.SetxAmount(1.23); CardknoxSDK.create().getPaymentEngine().ProcessOutOfScope(settings, request);
Device_CancelTransaction
Attempts to cancel an already started transaction between the application & the card reader.
If no transactions are started when this function is called, the function does not do anything.
CardknoxSDK.create().getPaymentEngine().Device_CancelTransaction();
SetSendResponseaAsJSON
This function configures the SDK for Payment Engine integration. When the value is set to true, the SDK returns a processed transaction response via the Result as JSON callback. Otherwise, the transaction response is provided through the basic Transaction Result callback.
CardknoxSDK.create().getPaymentEngine().SetSendResponseaAsJSON(true);
VERSION_NAME
Major SDK version
VERSION_CODE
Release number in the major SDK version
GIT_HASH
Git tag for troubleshooting
Function
Description
Sample data
EnableLogging
Accepts a boolean.
Enables or disabled the verbose logging.
CardknoxSDK.enableLogging(false);






Yes
From
The Cardknox token that references a previously used payment method. When using a token, xCardNum, xExp and xMagstripe should not be used.
Trigger a bluetooth device scanning process with the “start scanning” function.
Stop the process with a “stop scanning” function.
Once the scanning process is stopped, the SDK reports back a list of all scanned bluetooth devices.
The SDK expects one of the objects as an argument in the “connect to device” function.
transactionStarted
true
Accepts a MAC address.
Configures the SDK to be ready to establish a Bluetooth connection with the nearby VP3300 device with the internal MAC address equal to the provided value.
CancelTransaction
EnableLogcatBroadcasts
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import cardknox.payments.sdk.CardknoxSDK;
import cardknox.payments.sdk.PaymentTransactionResponse;
public class TransactionResultExampleFragment extends Fragment {
@Override
public void onAttach(@NonNull Context context) {
super.onAttach(context);
RegisterIntentFilters();
}
@Override
public void onDetach() {
super.onDetach();
UnregisterIntentFilters();
}
private void RegisterIntentFilters()
{
Context c = getContext();
if(c != null)
{
c.registerReceiver(Receiver_TransactionProcessing, new IntentFilter(CardknoxSDK.TRANSACTION_CALLBACK_INTENTFILTER_ACTION()));
}
}
private void UnregisterIntentFilters()
{
Context c = this.getContext();
if(c != null)
{
c.unregisterReceiver(Receiver_TransactionProcessing);
}
}
private final BroadcastReceiver Receiver_TransactionProcessing = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent)
{
String action = intent.getAction();
// Verify that the Cardknox SDK broadcasted the Intent
if(action.equals(CardknoxSDK.TRANSACTION_CALLBACK_INTENTFILTER_ACTION()))
{
String extraKey = CardknoxSDK.TRANSACTION_CALLBACK_INTENTFILTER_EXTRA();
java.lang.Object extra = intent.getParcelableExtra(extraKey);
// Cast the 'extra' to the Cardknox SDK response type
PaymentTransactionResponse response = (PaymentTransactionResponse)extra;
if(response.GetIsSuccess())
{
// Transaction successfully processed
String xRefNum = response.GetxRefNum();
// approved, declined, ...
String xStatus = response.GetxStatus();
String cvv = response.GetxCvvResult();
String avs = response.GetxAvsResult();
// ... other properties ...
Output("Transaction approved. Ref num: " + xRefNum);
}
else
{
// Transaction processing resulted in an error; message can be extracted from this property:
String errorMessage = response.GetErrorMessage();
String errorCode = response.GetxErrorCode();
String error = response.GetxError();
Output("Transaction declined/errored. Ref num: " + response.GetxRefNum());
}
}
}
};
private void Output(String text)
{
android.util.Log.d("ExampleTag", text);
}
}import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import cardknox.payments.sdk.CardknoxCardReaderCallback;
import cardknox.payments.sdk.CardknoxCardReaderCallbackType;
import cardknox.payments.sdk.CardknoxSDK;
public class CardReaderEventsExampleFragment extends Fragment {
@Override
public void onAttach(@NonNull Context context) {
super.onAttach(context);
RegisterIntentFilters();
}
@Override
public void onDetach() {
super.onDetach();
UnregisterIntentFilters();
}
private void RegisterIntentFilters()
{
Context c = getContext();
if(c != null)
{
c.registerReceiver(Receiver_CardReaderEvents, new IntentFilter(CardknoxSDK.CARDREADER_CALLBACK_INTENTFILTER_ACTION()));
}
}
private void UnregisterIntentFilters()
{
Context c = this.getContext();
if(c != null)
{
c.unregisterReceiver(Receiver_CardReaderEvents);
}
}
private final BroadcastReceiver Receiver_CardReaderEvents = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent)
{
String action = intent.getAction();
// Verify that the Cardknox SDK broadcasted the Intent
if(action.equals(CardknoxSDK.CARDREADER_CALLBACK_INTENTFILTER_ACTION()))
{
String extraKey = CardknoxSDK.CARDREADER_CALLBACK_INTENTFILTER_EXTRA();
CardknoxCardReaderCallback callback = intent.getParcelableExtra(extraKey);
// Read the event code
int code = callback.GetCode();
// Read the event name
String name = callback.GetName();
Output("Card reader event: " + name);
// Match the non-error code; for example "connected"
if(code == CardknoxCardReaderCallbackType.CONNECTED){
Output("Connected!");
}
// Extract the message when there's an error
if(code == CardknoxCardReaderCallbackType.ERROR){
String message = callback.GetMessage();
Output("Card reader event: " + message);
}
}
}
};
private void Output(String text)
{
android.util.Log.d("ExampleTag", text);
}
}import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import cardknox.payments.sdk.CardknoxSDKCustomUI;
import cardknox.payments.sdk.CardknoxSDKCustomUIScannedDevice;
public class ScannedDeviceExampleFragment extends Fragment {
@Override
public void onAttach(@NonNull Context context) {
super.onAttach(context);
RegisterIntentFilters();
}
@Override
public void onDetach() {
super.onDetach();
UnregisterIntentFilters();
}
private void RegisterIntentFilters()
{
Context c = getContext();
if(c != null)
{
c.registerReceiver(Receiver_ScannedDevice, new IntentFilter(CardknoxSDKCustomUI.SCANNED_DEVICE_INTENTFILTER_ACTION()));
}
}
private void UnregisterIntentFilters()
{
Context c = this.getContext();
if(c != null)
{
c.unregisterReceiver(Receiver_ScannedDevice);
}
}
private final BroadcastReceiver Receiver_ScannedDevice = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent)
{
String action = intent.getAction();
// Verify that the Cardknox SDK broadcasted the Intent
if(action.equals(CardknoxSDKCustomUI.SCANNED_DEVICE_INTENTFILTER_ACTION()))
{
String extraKey = CardknoxSDKCustomUI.SCANNED_DEVICE_INTENTFILTER_EXTRA();
java.lang.Object extra = intent.getParcelableExtra(extraKey);
CardknoxSDKCustomUIScannedDevice device = (CardknoxSDKCustomUIScannedDevice) extra;
// Can be used with a 'connect' method, like so:
String address = device.GetAddress();
CardknoxSDKCustomUI example = null;
example.connectWithAddress(address);
// Output various data about the device
Output("Scanned device name: " + device.GetName());
Output("Scanned device display name: " + device.GetDisplayName());
Output("Scanned device address: " + device.GetAddress());
}
}
};
private void Output(String text)
{
android.util.Log.d("ExampleTag", text);
}
}import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import cardknox.payments.sdk.CardknoxSDKCustomUI;
import cardknox.payments.sdk.CardknoxSDKCustomUIScanCompleted;
import cardknox.payments.sdk.CardknoxSDKCustomUIScannedDevice;
public class ScanCompletedExampleFragment extends Fragment {
@Override
public void onAttach(@NonNull Context context) {
super.onAttach(context);
RegisterIntentFilters();
}
@Override
public void onDetach() {
super.onDetach();
UnregisterIntentFilters();
}
private void RegisterIntentFilters()
{
Context c = getContext();
if(c != null)
{
c.registerReceiver(Receiver_ScanCompleted, new IntentFilter(CardknoxSDKCustomUI.SCAN_COMPLETED_INTENTFILTER_ACTION()));
}
}
private void UnregisterIntentFilters()
{
Context c = this.getContext();
if(c != null)
{
c.registerReceiver(Receiver_ScanCompleted, new IntentFilter(CardknoxSDKCustomUI.SCAN_COMPLETED_INTENTFILTER_ACTION()));
}
}
private final BroadcastReceiver Receiver_ScanCompleted = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent)
{
String action = intent.getAction();
// Verify that the Cardknox SDK broadcasted the Intent
if(action.equals(CardknoxSDKCustomUI.SCAN_COMPLETED_INTENTFILTER_ACTION()))
{
String extraKey = CardknoxSDKCustomUI.SCAN_COMPLETED_INTENTFILTER_EXTRA();
java.lang.Object extra = intent.getParcelableExtra(extraKey);
CardknoxSDKCustomUIScanCompleted scanCompleted = (CardknoxSDKCustomUIScanCompleted) extra;
if(scanCompleted != null && scanCompleted.scannedDevices() != null &&
scanCompleted.scannedDevices().size() > 0)
{
for (Object device : scanCompleted.scannedDevices()) {
CardknoxSDKCustomUIScannedDevice device = (CardknoxSDKCustomUIScannedDevice)d;
// Can be used with a 'connect' method, like so:
String address = device.GetAddress();
CardknoxSDKCustomUI example = null;
example.connectWithAddress(address);
// Output various data about the device
Output("Scanned device name: " + device.GetName());
Output("Scanned device display name: " + device.GetDisplayName());
Output("Scanned device address: " + device.GetAddress());
}
}
}
}
};
private void Output(String text)
{
android.util.Log.d("ExampleTag", text);
}
}import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import cardknox.payments.sdk.CardknoxPaymentEngineSDK;
public class DeviceStatusExampleFragment extends Fragment {
@Override
public void onAttach(@NonNull Context context) {
super.onAttach(context);
RegisterIntentFilters();
}
@Override
public void onDetach() {
super.onDetach();
UnregisterIntentFilters();
}
private void RegisterIntentFilters()
{
Context c = getContext();
if(c != null)
{
c.registerReceiver(Receiver_DeviceStatus, new IntentFilter(CardknoxPaymentEngineSDK.DEVICE_STATUS_INTENTFILTER_ACTION()));
}
}
private void UnregisterIntentFilters()
{
Context c = this.getContext();
if(c != null)
{
c.unregisterReceiver(Receiver_DeviceStatus);
}
}
private final BroadcastReceiver Receiver_DeviceStatus = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
// Verify that the Cardknox SDK broadcasted the event
if(action.equals(CardknoxPaymentEngineSDK.DEVICE_STATUS_INTENTFILTER_ACTION()))
{
String extraKey = CardknoxPaymentEngineSDK.DEVICE_STATUS_INTENTFILTER_EXTRA();
String deviceStatus = intent.getStringExtra(extraKey);
Output(deviceStatus);
}
}
};
private void Output(String text)
{
android.util.Log.d("ExampleTag", text);
}
}import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import cardknox.payments.sdk.CardknoxPaymentEngineSDK;
public class TransactionStatusExampleFragment extends Fragment {
@Override
public void onAttach(@NonNull Context context) {
super.onAttach(context);
RegisterIntentFilters();
}
@Override
public void onDetach() {
super.onDetach();
UnregisterIntentFilters();
}
private void RegisterIntentFilters()
{
Context c = getContext();
if(c != null)
{
c.registerReceiver(Receiver_TransactionStatus, new IntentFilter(CardknoxPaymentEngineSDK.TRANSACTION_STATUS_INTENTFILTER_ACTION));
}
}
private void UnregisterIntentFilters()
{
Context c = this.getContext();
if(c != null)
{
c.unregisterReceiver(Receiver_TransactionStatus);
}
}
private final BroadcastReceiver Receiver_TransactionStatus = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
// Verify that the Cardknox SDK broadcasted the event
if(action.equals(CardknoxPaymentEngineSDK.TRANSACTION_STATUS_INTENTFILTER_ACTION()))
{
String extraKey = CardknoxPaymentEngineSDK.TRANSACTION_STATUS_INTENTFILTER_EXTRA();
String deviceStatus = intent.getStringExtra(extraKey);
Output(deviceStatus);
}
}
};
private void Output(String text)
{
android.util.Log.d("ExampleTag", text);
}
}import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import androidx.fragment.app.Fragment;
import cardknox.payments.sdk.CardknoxPaymentEngineSDK;
import cardknox.payments.sdk.CardknoxPaymentEngineSDKRequest;
import cardknox.payments.sdk.CardknoxPaymentEngineSDKResponseJSON;
import cardknox.payments.sdk.CardknoxPaymentEngineSDKSettings;
import cardknox.payments.sdk.CardknoxSDK;
public class PaymentEngineExampleFragment extends Fragment {
private void SetupReceivePaymentEngineResponseAsJSON(){
Context applicationContext = null;
CardknoxSDK.create().getPaymentEngine().SetSendResponseaAsJSON(true);
try { applicationContext.unregisterReceiver(Result_PaymentEngineResponseAsJSON);} catch(Exception e) {}
applicationContext.registerReceiver(Result_PaymentEngineResponseAsJSON, new IntentFilter(CardknoxPaymentEngineSDK.PAYMENTENGINE_JSON_INTENTFILTER_ACTION()));
}
private final BroadcastReceiver Result_PaymentEngineResponseAsJSON = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
// Verify that the Cardknox SDK broadcasted the Intent
if (action != null && action.equals(CardknoxPaymentEngineSDK.PAYMENTENGINE_JSON_INTENTFILTER_ACTION())) {
String extraKey = CardknoxPaymentEngineSDK.PAYMENTENGINE_JSON_INTENTFILTER_EXTRA();
java.lang.Object extra = intent.getParcelableExtra(extraKey);
// Cast
CardknoxPaymentEngineSDKResponseJSON response = (CardknoxPaymentEngineSDKResponseJSON) extra;
String json = response.GetJSON();
}
}
};
private void SetupPaymentEngineBroadcastsLogCatMessages(){
Context context = null;
CardknoxPaymentEngineSDK paymentEngine = CardknoxSDK.create().getPaymentEngine();
// PaymentEngine logging, 2 options:
// 1. SDK writes the PE log to LogCat directly
// 2. SDK sends the PE log it wants to write to this app (via BroadcastReceiver)
// Note: calling 1 method negates the other one
boolean broadcast = false;
boolean writeDirectly = true;
if(broadcast && writeDirectly)
throw new RuntimeException("PE logs can either be directly written to LogCat or broadcasted back to this app, not both");
if(writeDirectly){
paymentEngine.enableLogCatOutput("LogCatTag");
}
else if(broadcast){
paymentEngine.enableLogCatBroadcasts(true);
// subscribe to logcat broadcasts
try { context.unregisterReceiver(Receiver_LogcatMessages);} catch(Exception e) {}
context.registerReceiver(Receiver_LogcatMessages, new IntentFilter(CardknoxPaymentEngineSDK.LOGGER_INTENTFILTER_ACTION()));
}
}
private final BroadcastReceiver Receiver_LogcatMessages = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if(intent != null) {
String action = intent.getAction();
if (action != null && action.equals(CardknoxPaymentEngineSDK.LOGGER_INTENTFILTER_ACTION())) {
String logcatMessage = "unknown";
String extraKey= CardknoxPaymentEngineSDK.LOGGER_INTENTFILTER_EXTRA();
if(intent.hasExtra(extraKey))
logcatMessage = intent.getStringExtra(extraKey);
android.util.Log.d("SomeTag", logcatMessage);
}
}
}
};
private void Device_ReprintReceipt_Example(){
CardknoxPaymentEngineSDKSettings settings = new CardknoxPaymentEngineSDKSettings();
settings.SetDevice_IP_Address("specify IP");
settings.SetDevice_IP_Port("specify port");
settings.SetDevice_Name("specify device name, such as PAX_A77.3");
settings.SetDevice_Timeout(5 * 1000); /* milliseconds to seconds */
CardknoxPaymentEngineSDKRequest request = new CardknoxPaymentEngineSDKRequest();
request.SetxAuthCode("add auth code here");
String response = CardknoxSDK.create().getPaymentEngine().Device_ReprintReceipt(settings, request);
boolean success = response.equals("OK");
}
} import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import androidx.fragment.app.Fragment;
import cardknox.payments.sdk.CardknoxPaymentEngineSDK;
import cardknox.payments.sdk.CardknoxPaymentEngineSDKRequest;
import cardknox.payments.sdk.CardknoxPaymentEngineSDKResponseJSON;
import cardknox.payments.sdk.CardknoxPaymentEngineSDKSettings;
import cardknox.payments.sdk.CardknoxSDK;
public class PaymentEngineExampleFragment extends Fragment {
private void SetupPaymentEngineBroadcastsLogCatMessages(){
Context context = null;
CardknoxPaymentEngineSDK paymentEngine = CardknoxSDK.create().getPaymentEngine();
// PaymentEngine logging, 2 options:
// 1. SDK writes the PE log to LogCat directly
// 2. SDK sends the PE log it wants to write to this app (via BroadcastReceiver)
// Note: calling 1 method negates the other one
boolean broadcast = false;
boolean writeDirectly = true;
if(broadcast && writeDirectly)
throw new RuntimeException("PE logs can either be directly written to LogCat or broadcasted back to this app, not both");
if(writeDirectly){
paymentEngine.enableLogCatOutput("LogCatTag");
}
else if(broadcast){
paymentEngine.enableLogCatBroadcasts(true);
// subscribe to logcat broadcasts
try { context.unregisterReceiver(Receiver_LogcatMessages);} catch(Exception e) {}
context.registerReceiver(Receiver_LogcatMessages, new IntentFilter(CardknoxPaymentEngineSDK.LOGGER_INTENTFILTER_ACTION()));
}
}
private final BroadcastReceiver Receiver_LogcatMessages = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if(intent != null) {
String action = intent.getAction();
if (action != null && action.equals(CardknoxPaymentEngineSDK.LOGGER_INTENTFILTER_ACTION())) {
String logcatMessage = "unknown";
String extraKey= CardknoxPaymentEngineSDK.LOGGER_INTENTFILTER_EXTRA();
if(intent.hasExtra(extraKey))
logcatMessage = intent.getStringExtra(extraKey);
android.util.Log.d("SomeTag", logcatMessage);
}
}
}
};
}// Create the parameters object
TransactionParameters parameters = new TransactionParameters()
{
{
// Required parameters
// 1. command to use. One of the Cardknox Transaction API commands
SetxCommand("cc:sale");
// 2. amount
SetxAmount(1.23);
// Supplementary parameters
// 1. card number - will be prefilled on the keyed form
SetxCardNum("4444333322221111");
// 2. expiration date - will be prefilled on the keyed form
// Format "MMYY"
// For example: December 2024
SetxExp("1224");
// Optional parameters to supplement the transaction
// All of the available parameters will be sent to the gateway
SetxInvoice("1234");
SetxBillCity("New York");
// ... other optional parameters.
}
};
PaymentTransactionRequestUI request = cardknoxSDKUI.createRequestWithParameters(parameters);PaymentTransactionRequestUI request = cardknoxSDKUI.createRequestWithParameters(parameters);
if(request.GetIsValid()){
// Supply the Activity reference here.
// In fragments, that might be a 'getActivity()' call.
android.app.Activity activity = null;
// Show Cardknox SDK UI
request.process(activity);
} else {
// Extract all validation errors that block
// the request object from showing the SDK UI
String[] validationErrors = request.GetValidationErrors();
}CardknoxSDKUI ui = CardknoxSDKUI.create();
TransactionParameters parameters = new TransactionParameters();
parameters.SetVP3300TransactionTimeout(13);
PaymentTransactionRequestUI req = ui.createRequestWithParameters(parameters);
// Enable swipe screen in the Cardknox UI
CardknoxSDKUI.SetEnableDeviceInsertSwipeTap(true);
// Show Cardknox UI
Activity activity = null; // Obtain an Activity reference
req.process(activity);// Create the parameters object
TransactionParameters parameters = new TransactionParameters()
{
{
// Required parameters
SetxCommand("cc:sale");
SetxAmount(1.23);
SetxCardNum("4444333322221111");
// Format "MMYY"
// For example: December 2024
SetxExp("1224");
// Optional parameters to supplement the transaction
SetxInvoice("1234");
}
};
// Create the request object
PaymentTransactionRequestDirect request = cardknoxSDKDirect.createRequestWithParameters(parameters);PaymentTransactionRequestDirect request = cardknoxSDKDirect.createRequestWithParameters(parameters);
if(request.GetIsValid()) {
PaymentTransactionResponse response = request.process();
boolean isSuccess = response.GetIsSuccess();
String errorMessage = response.GetErrorMessage();
String errorCode = response.GetxErrorCode();
String refNum = response.GetxRefNum();
}
else {
String[] errors = request.GetValidationErrors();
}// Indefinite scan until stopped
CardknoxSDK.create().getCustomUIBluetooth().startScanningWithTimeout(0);
// Scan with a timeout
CardknoxSDK.create().getCustomUIBluetooth().startScanningWithTimeout(20);CardknoxSDK.create().getCustomUIBluetooth().stopScanning();String deviceName = "IDTECH-VP3300-12345";
CardknoxSDK.create().getCustomUIBluetooth().connectWithName(deviceName);CardknoxSDK.create().getCustomUIUSB()the Cardknox SDK’s user interface is closed; either via a pull down gesture or via a “close” UI element; to clean things up
the charge amount gets modified via UI and becomes invalid, effectively invalidating any pending transactions between the app & the card reader
Raised in the “process out of scope” integration when:
the SDK shows its' UI and automatically starts scanning for nearby readers. User can explicitly stop the scanning process
String addr = "00:1C:97:1D:EA:50";
CardknoxSDK.create().getCustomUIBluetooth().connectWithAddress(addr);CardknoxSDK.create().getCustomUIBluetooth().disconnectFromCurrentDevice();Activity activity = null; // Provide this
TransactionParameters prms = new TransactionParameters();
prms.SetxAmount(1.23);
prms.SetxInvoice("1234");
prms.SetxCommand("cc:sale");
prms.SetVP3300TransactionTimeout(13);
CardknoxSDK.create().getCustomUIBluetooth().startTransactionWithArgs(prms);CardknoxSDKCustomUI customUI = null; /* created object beforehand */
customUI.cancelTransaction();This page contains all API documentation for Credit Card (CC) transactions. For more information regarding account access, navigate to the Transaction API parent page.
POST cc:sale
xCommand = cc:Sale
The Sale command is a combination of the authorization and capture transactions. it is intended for use when fulfilling an order right away. For transactions that are not fulfilled right away, use the command initially and then use the command to complete the sale.
The card to be charged can be communicated with 4 different approaches: xCardNum + xExp OR xMagstripe OR xToken OR SUT. Only one of these combinations can be used. Depending on the software or website’s security settings, cc:sale may also require xCVV, xStreet, or xZip and their related values.
For a full list of response codes, see the in the Introduction page.
POST cc:authonly
xCommand = cc:AuthOnly
The AuthOnly command authorizes an amount on a cardholder’s account and places a hold on the available credit for that amount, but does not submit the charge for settlement. AuthOnly is used to reserve funds from a cardholder’s credit limit for a sale that is not ready to be processed. AuthOnly is commonly used when an order is placed on a website prior to the order being shipped, or when a customer makes a hotel or car rental reservation. If the authorization amount exceeds the cardholder’s available credit, a rejected response will be returned. When successful, the authorization number is returned as RefNum and can be used to reference the authorization for a follow-up transaction. The funds will remain held until the authorization is either captured, voided, or expires. To settle an AuthOnly transaction and complete the sale, use the command. If an AuthOnly transaction is captured after 24 hours, it may be subject to a higher processing rate by the acquiring bank.
An AuthOnly hold only reduces the cardholder’s credit limit; it will not appear as a charge on their account. If the authorization will not be converted to a charge, can be used to release the hold prior to the expiration. The expiration timeframe varies by the issuer, but is typically 7-30 days for credit cards and 3-5 days for debit cards.
For a full list of response codes, see the in the Introduction page.
POST cc:capture
xCommand = cc:Capture
The Capture command is used to settle funds from a previous authorization and withdraw the funds from the cardholder’s account. The RefNumber from the associated authorization is required when submitting a Capture request. To perform an authorization and capture in the same command, use the Sale command.
For a full list of response codes, see the in the Introduction page.
POST cc:splitcapture
xCommand = cc:splitcapture
The SplitCapture command is used to capture funds in multiple stages from a single authorization. This is useful for scenarios where the total transaction amount is not settled all at once, such as partial shipments or staged payments. Each SplitCapture request requires the xRefNum of the authorization and allows capturing different amounts up until the authorized amount. See for more information.
POST cc:adjust
xCommand = cc:Adjust
You can use the Adjust command to update certain fields on a transaction, such as xOrderID. This action will not reprocess the transaction; it will only update the information. However, you can only update the xAmount, xTax, and xTip fields on an authorization before it is captured; you cannot change these fields on a transaction that was already processed.
POST cc:save
xCommand = cc:Save
The Save command is used to send account information and to request a token from Sola. It does not submit the transaction for processing. The response returns a token that references the account information. A token at minimum references the credit card number, but if other data is sent—such as a billing address—it will be associated with the token as well.
AvsOnly
When AvsOnly is enabled for cc:Save, in addition to just generating a token, the transaction will be submitted to the bank for AVS and CVV verification. This setting can be turned on in the Sola backend settings.
POST cc:avsonly
xCommand = cc:AvsOnly
An AVS Only transaction allows you to verify the accuracy of a customer's billing address without processing the payment. This type of transaction is useful for validating the authenticity of the billing address before completing a purchase. It can also be use to verify the card CVV
To perform an AVS Only transaction, you need to send the customer's billing address details along with the request. The bank will then compare the provided address against the billing address on file with the card issuer and return a response indicating whether the address matches or not.
POST cc:credit
xCommand = cc:Credit
To issue a credit (refund) through our API without referring to a previous sale, you can use the following command: cc:credit
Please note that our system blocks credits on cards that do not have a prior sale by default. To allow such credits to go through, you must send a request to .
POST cc:refund
xCommand = cc:Refund
The Refund command is used to refund a full or partial amount of a previous transaction using xRefNum. Partial check refunds are only supported for ACHQ.
POST cc:voidrefund
xCommand = cc:voidrefund
The VoidRefund command will either void the pending transaction if it has not settled yet, or it will fully refund the transaction if it has already settled.
POST cc:voidrelease
xCommand = cc:voidrelease
The VoidRelease command releases a pending authorization amount back to the cardholder’s credit limit without waiting for the standard authorization time frame to expire.
POST cc:void
xCommand = cc:Void
The Void command voids a transaction that has not yet settled using xRefNum.
xSoftwareVersion*
String
Version number of your software
xCommand*
String
Sola transaction type
xAmount*
String
The total amount of the transaction, inclusive of tax and tip if applicable.
xCardNum*
String
The customer card number. *Alternatively, xToken xMagStripe or SUT can be used.
xToken
String
The Sola token that references a previously used payment method. When using a token, xCardNum xExp and xMagstripe should not be used.
xCustom01
String
20 custom fields are available for custom data such as customer comments, etc. Use xCustom01 through xCustom20
xCVV
String
3-digit code from the back of the card (for Amex, 4-digit code from the front of the card)
xStreet
String
The billing street address of the cardholder
xZip
String
The billing zip code of the cardholder
xMagstripe
String
The magstripe data of a credit card. Magstripe data includes the card number and expiration date. When using this command, xCardNum xExp and xToken should not be used. Encrypted card data can also be sent using xMagstripe.
xName
String
The cardholder’s name.
xDUKPT
String
The DUK/PT key for PIN debit and EBT transactions.The first 16 characters are the encrypted PIN block, followed by the 6 character long Key Set Identifier (KSID). The remaining characters are the PIN pad serial number and transaction counter.
xTax
String
The tax portion that is included in the total transaction amount (xAmount)
xTip
String
The tip portion that is included in the total transaction amount (xAmount).
xInvoice
String
The merchant’s invoice number for the transaction. xInvoice is recommended when available for improved duplicate handling.
xPONum
String
The merchant’s purchase order number for the transaction
xComments
String
Additional data that is optionally passed along to the receipt.
xDescription
String
Additional data that is optionally passed along for reporting
xIP
String
The customer’s IP address. Typically used for fraud detection.
xEmail*
String
The customer’s email address *Required when 3ds is enabled
xFax
String
The customer’s fax number
xBillFirstName*
String
The customer’s first name for their billing profile *Required when 3ds is enabled
xBillMiddleName
String
The customer’s middle name or initial for their billing profile
xBillLastName*
String
The customer’s last/family name for their billing profile *Required when 3ds is enabled
xBillCompany
String
The customer’s company name for their billing profile
xBillStreet*
String
The customer’s street address for their billing profile *Required when 3ds is enabled
xBillStreet2
String
The customer’s street address 2nd line for their billing profile
xBillCity*
String
The customer’s city for their billing profile. *Required when 3ds is enabled
xBillState*
String
The customer’s state for their billing profile *Required when 3ds is enabled
xBillZip*
String
The customer’s zip code for their billing profile *Required when 3ds is enabled
xBillCountry
String
The customer’s country for their billing profile
xBillPhone
String
The customer’s phone number for their billing profile
xBillMobile*
String
The customer’s mobile number for their billing profile *Required when 3ds is enabled
xShipFirstName
String
The customer’s first name for their shipping profile
xShipMiddleName
String
The customer’s middle name or initial for their shipping profile
xShipLastName
String
The customer’s last/family name for their shipping profile
xShipCompany
String
The customer’s company name for their shipping profile
xShipStreet
String
The customer’s street address for their shipping profile
xShipStreet2
String
The customer’s street address 2nd line for their shipping profile
xShipCity
String
The customer’s city for their shipping profile
xShipState
String
The customer’s state for their shipping profile
xShipZip
String
The customer’s zip code for their shipping profile
xShipCountry
String
The customer’s country for their shipping profile
xShipPhone
String
The customer’s phone number for their shipping profile
xShipMobile
String
The customer’s mobile number for their shipping profile
x1Description
String
Line Item product description. Increment the “1“ for additional items.
x1Sku
String
Line Item product sku. Increment the “1“ for additional items.
x1Qty
String
Line Item product quantity. Increment the “1“ for additional items.
x1UnitPrice
String
Line Item product price. Increment the “1“ for additional items.
xHotelCheckInDate
String
The customer’s date of hotel check-in
xHotelCheckOutDate
String
The customer's date of hotel check-out
xAllowPartialAuth
String
True/false value indicating if an authorization amount is less than the initial request when full initial amount is unavailable. This variable is platform-dependent. Default is false.
xAllowNonAuthenticated
String
True/False value, enabling a customer to complete a purchase without needing to verify their identity through a separate authentication step. Defaults to false.
xRxAmount
String
Specifies qualifying prescription amount for FSA transactions. xAllowPartialAuth must be set to True.
xDentalAmount
String
Specifies qualifying dental amount for FSA transactions. xAllowPartialAuth must be set to True.
xVisionAmount
String
Specifies qualifying vision amount for FSA transactions. xAllowPartialAuth must be set to True.
xTransitAmount
String
Specifies qualifying transit amount for commuter card transactions. xAllowPartialAuth must be set to True.
xCopayAmount
String
Specifies Co-pay amount for FSA transactions. xAllowPartialAuth must be set to True.
xClinicalAmount
String
Specifies qualifying clinical amount for FSA transactions. xAllowPartialAuth must be set to True.
xOrderId
String
Unique order number for FraudWatch verification
xExistingCustomer
String
Yes/No value indicating if customer is a repeat customer
xAllowDuplicate
String
By default, Sola rejects duplicate transactions within 10 minutes of the original transaction. This command overrides that safeguard. True/False allowed.
xCustReceipt
String
True/False value indicating if the email address specified in xemail should receive a receipt containing the transaction details.
xCurrency
String
Used to specify an alternate currency. Only applicable for accounts that are using Multi-Currency Conversion (MCC). For accounts that are natively in a foreign currency, the currency does not need to be specified ().
xReturnPaymentID
Boolean
True/False value indicating if the user would like to receive xPaymentId in the transaction response. Unless specified, the value is “False”. Unlike an xToken which will return a new value on transactions of the same card, xPaymentId will return the same value for transactions using the same card.
xSplitFee
String
The amount that should be sent to the Split Fee account Example: xAmount = 100 xSplitFee = 10 90 Will go to the xKey account and 10 will go to the Split Fee account (Split Fee account is set in the Sola gateway backend) Note: To use this feature, the account needs to be setup to support it. Otherwise, an error will be returned.
xTimeoutSeconds
String
Configurable amount of seconds in which the request will wait for a response.
xVendorId
String
The parameter that tells the gateway which developer is performing the transaction. If the value matches the account of the iFields key, the gateway will allow the transaction to work even though the API and iFields keys are from different accounts. See more
xDigitalWalletType
String
This field should indicate the wallet type in a case where the card number is a digital wallet token (Ex: "Google Pay")
xRecurringIndicator*
String
Indicates the type of transaction based on its recurrence. This field helps classify whether a transaction is part of a recurring series, an installment plan, a one-time charge, or a deferred payment. *When set, xInstallments is required.
Note: Use of this flag on a transaction does NOT set up a recurring schedule for the transaction. Recurring schedules must be set up separately.
Allowed Values:
Recurring- a transaction that is part of a regularly scheduled series (e.g., subscriptions). Usually initiated by the merchant after the first payment.
Installment- one in a series of transactions where the total amount is divided into multiple payments with a fixed schedule (e.g., 3 monthly payments).
Single- a one-time transaction, not part of a recurring or installment plan.
Deferred- indicates that the transaction authorization was delayed and submitted later due to temporary issues like connectivity problems or offline environments.
*Required for Merchant-initiated transactions
xInstallments
Only when xRecurringIndicator=Installment
Specifies the number of payment installments
xSplitInstruction
Object
Array of objects containing split funding instructions. Each object must include xMid (merchant ID) and xAmount (amount to direct to that merchant). The sum of all split amounts must equal the total transaction amount.
xSoftwareName*
String
Name of your software
xSoftwareVersion*
String
Version number of your software
xCommand*
String
Sola transaction type
xAmount*
String
The total amount of the transaction, inclusive of tax and tip if applicable. This the total amount of the transaction.
xToken
String
The Sola token that references a previously used payment method. When using a token, xCardNum xExp and xMagstripe should not be used.
xCustom01
String
20 custom fields are available for custom data such as customer comments, etc. Use xCustom01 through xCustom20.
xCVV
String
3-digit code from the back of the card (4-digit code from the front of the card for Amex)
xStreet
String
The billing street address of the cardholder
xZip
String
The billing zip code of the cardholder
xMagstripe
String
The magstripe data of a credit card. Magstripe data includes the card number and expiration date. When using this command, xCardNum xExp and xToken should not be used. Encrypted card data can also be sent using xMagstripe.
xName
String
The cardholder’s name
xDUKPT
String
The DUK/PT key for PIN debit and EBT transactions.The first 16 characters are the encrypted PIN block, followed by the 6 character long Key Set Identifier (KSID). The remaining characters are the PIN pad serial number and transaction counter.
xTax
String
The tax portion that is included in the total transaction amount (xAmount)
xTip
String
The tip portion that is included in the total transaction amount (xAmount)
xRequireSplitCapturable
String
Indicate if you want to ensure that the authorization will allow split capture. When this is set to true and split capture is not supported, an error will be returned “Split capture not supported“.
xInvoice
String
The merchant’s invoice number for the transaction. xInvoice is recommended when available for improved duplicate handling.
xPONum
String
The merchant’s purchase order number for the transaction
xComments
String
Additional data optionally passed along to the receipt
xDescription
String
Additional data optionally passed along for reporting
xIP
String
The customer’s IP address. Typically used for fraud detection.
xEmail
String
The customer’s email address
xBillLastName
String
The customer’s last/family name for their billing profile
xBillMiddleName
String
The customer’s middle name or initial for their billing profile
xBillFirstName
String
The customer’s first name for their billing profile
xFax
String
The customer’s fax number
xBillCompany
String
The customer’s company name for their billing profile.
xBillStreet
String
The customer’s street address for their billing profile.
xBillStreet2
String
The customer’s street address 2nd line for their billing profile
xBillCity
String
The customer’s city for their billing profile
xBillState
String
The customer’s state for their billing profile
xBillZip
String
The customer’s zip code for their billing profile
xBillCountry
String
The customer’s country for their billing profile
xBillPhone
String
The customer’s phone number for their billing profile
xBillMobile
String
The customer’s mobile number for their billing profile
xShipFirstName
String
The customer’s first name for their shipping profile
xShipMiddleName
String
The customer’s middle name or initial for their shipping profile
xShipLastName
String
The customer’s last/family name for their shipping profile
xShipCountry
String
The customer’s company name for their shipping profile
xShipStreet
String
The customer’s street address for their shipping profile
xShipStreet2
String
The customer’s street address 2nd line for their shipping profile
xShipCity
String
The customer’s city for their shipping profile
xShipState
String
The customer’s state for their shipping profile
xShipZip
String
The customer’s zip code for their shipping profile
xShipCountry
String
The customer’s country for their shipping profile.
xShipPhone
String
The customer’s phone number for their shipping profile
xShipMobile
String
The customer’s mobile number for their shipping profile
xHotelCheckInDate
String
The customer’s date of hotel check-in.
xHotelCheckOutDate
String
The customer’s date of hotel check-out.
xHotelChargeType
String
The charge type for the transaction.
xHotelRoomRate
String
The nightly room rate for the hotel.
xHotelNoShow
String
True/False indicating whether customer was a no-show.
xAllowPartialAuth
String
True/False value indicating if an authorization amount is less than the initial request when the full initial amount is unavailable. This variable is platform-dependent. Default is false.
xAutoRentalPickupDate
String
Specific date for customer to pick up vehicle.
*Note: This field is required only for the auto rental industry.
xAutoRentalPickupTime
String
Specific time for customer to pick up vehicle.
*Note: This field is required only for the auto rental industry.
xAutoRentalReturnDate
String
Specific date for customer to return vehicle.
*Note: This field is required only for the auto rental industry.
xAutoRentalReturnTime
String
Specific time for customer to return vehicle.
*Note: This field is required only for the auto rental industry.
xRxAmount
String
Specifies qualifying prescription amount for FSA transactions. xAllowPartialAuth must be set to True.
xDentalAmount
String
Specifies qualifying dental amount for FSA transactions. xAllowPartialAuth must be set to True.
xVisionAmount
String
Specifies qualifying vision amount for FSA transactions. xAllowPartialAuth must be set to True.
xTransitAmount
String
Specifies qualifying transit amount for commuter card transactions. xAllowPartialAuth must be set to True.
xCopayAmount
String
Specifies Co-pay amount for FSA transactions. xAllowPartialAuth must be set to True.
xClinicalAmount
String
Specifies qualifying clinical amount for FSA transactions. xAllowPartialAuth must be set to True.
xOrderID
String
Unique order number for FraudWatch verification.
xAllowDuplicate
String
By default, Sola rejects duplicate transactions within 10 minutes of the original transaction. This command overrides that safeguard. True/False allowed.
xCustReceipt
String
True/False value indicating if the email address specificied in xemail should receive a receipt containing the transaction details.
xCurrency
String
Used to specify an alternate currency. Only applicable for accounts that are using Multi-Currency Conversion (MCC). For accounts that are natively in a foreign currency, the currency does not need to be specified. ().
xTimeoutSeconds
String
Configurable amount of seconds in which the request will wait for a response.
xRecurringIndicator*
String
Recurring- a transaction that is part of a regularly scheduled series (e.g., subscriptions). Usually initiated by the merchant after the first payment.
Installment- one in a series of transactions where the total amount is divided into multiple payments with a fixed schedule (e.g., 3 monthly payments).
Single- a one-time transaction, not part of a recurring or installment plan.
Deferred- indicates that the transaction authorization was delayed and submitted later due to temporary issues like connectivity problems or offline environments.
*Required for Merchant-initiated transactions
xCommand*
String
Sola transaction type
xRefNum*
String
Used to reference a previous transaction when doing a follow-up transaction, typically a refund, void, or capture. (Note: xRefnum can be a 64-bit number and should be stored as BIGINT, Long, Int64 or String).
xAmount
String
The total amount of the transaction, inclusive of tax and tip if applicable. This the total amount of the transaction.
xCustom01
String
20 custom fields are available for custom data such as customer comments, etc. Use xCustom01 through xCustom20.
xStreet
String
The billing street address of the cardholder.
xZip
String
The billing zip code of the cardholder.
xName
String
The cardholder’s name
xTax
String
The tax portion that is included in the total transaction amount (xAmount)
xTip
String
The tip portion that is included in the total transaction amount (xAmount)
xInvoice
String
The merchant’s invoice number for the transaction. xInvoice is recommended when available for improved duplicate handling.
xPONum
String
The merchant’s purchase order number for the transaction
xComments
String
Additional data optionally passed along to the receipt
xDescription
String
Additional data optionally passed along for reporting
xIP
String
The customer’s IP address. Typically used for fraud detection.
xEmail
String
The customer’s email address
xFax
String
The customer’s fax number
xBillFirstName
String
The customer’s first name for their billing profile
xBillMiddleName
String
The customer’s middle name for their billing profile
xBillLastName
String
The customer’s last name for their billing profile
xBillCompany
String
The customer’s company name for their billing profile
xBillStreet
String
The customer’s street address for their billing profile
xBillStreet2
String
The customer’s street address 2nd line for their billing profile
xBillCity
String
The customer’s city for their billing profile
xBillState
String
The customer’s state for their billing profile
xBillZip
String
The customer’s zip code for their billing profile
xBillCountry
String
The customer’s country for their billing profile
xBillPhone
String
The customer’s phone number for their billing profile
xBillMobile
String
The customer’s mobile number for their billing profile
xShipFirstName
String
The customer’s first name for their shipping profile
xShipMiddleName
String
The customer’s middle name for their shipping profile
xShipLastName
String
The customer’s last name for their shipping profile
xShipCompany
String
The customer’s company name for their shipping profile
xShipStreet
String
The customer’s street address for their shipping profile
xShipStreet2
String
The customer’s street address 2nd line for their shipping profile
xShipCity
String
The customer’s city for their shipping profile
xShipState
String
The customer’s state for their shipping profile
xShipZip
String
The customer’s zip code for their shipping profile
xShipCountry
String
The customer’s country for their shipping profile
xShipPhone
String
The customer’s phone number for their shipping profile
xShipMobile
String
The customer’s mobile number for their shipping profile
xAllowDuplicate
String
By default, Sola rejects duplicate transactions within 10 minutes of the original transaction. This command overrides that safeguard. True/False allowed.
xCustReceipt
String
True/False value indicating if the email address specified in xemail should receive a receipt containing the transaction details.
String
Used to reference a previous transaction when doing a follow-up transaction, typically a refund, void, or capture. (Note: xRefnum can be a 64-bit number and should be stored as BIGINT, Long, Int64 or String).
xAmount*
String
The portion of the authorized funds to capture in the current SplitCapture request.
xCustom01
String
20 custom fields are available for custom data such as customer comments, etc. Use xCustom01 through xCustom20.
xStreet
String
The billing street address of the cardholder.
xZip
String
The billing zip code of the cardholder.
xName
String
The cardholder’s name
xTax
String
The tax portion that is included in the total transaction amount (xAmount)
xTip
String
The tip portion that is included in the total transaction amount (xAmount)
xInvoice
String
The merchant’s invoice number for the transaction. xInvoice is recommended when available for improved duplicate handling.
xPONum
String
The merchant’s purchase order number for the transaction
xComments
String
Additional data optionally passed along to the receipt
xDescription
String
Additional data optionally passed along for reporting
xIP
String
The customer’s IP address. Typically used for fraud detection.
xEmail
String
The customer’s email address
xFax
String
The customer’s fax number
xBillFirstName
String
The customer’s first name for their billing profile
xBillMiddleName
String
The customer’s middle name or initial for their billing profile
xBillLastName
String
The customer’s last/family name for their billing profile
xBillCompany
String
The customer’s company name for their billing profile
xBillStreet
String
The customer’s street address for their billing profile
xBillStreet2
String
The customer’s street address 2nd line for their billing profile
xBillCity
String
The customer’s city for their billing profile
xBillState
String
The customer’s state for their billing profile
xBillZip
String
The customer’s zip code for their billing profile
xBillCountry
String
The customer’s country for their billing profile
xBillPhone
String
The customer’s phone number for their billing profile
xBillMobile
String
The customer’s mobile number for their billing profile
xShipFirstName
String
The customer’s first name for their shipping profile
xShipMiddleName
String
The customer’s middle name or initial for their shipping profile
xShipLastName
String
The customer’s last/family name for their shipping profile
xShipCompany
String
The customer’s company name for their shipping profile
xShipStreet
String
The customer’s street address for their shipping profile
xShipStreet2
String
The customer’s street address 2nd line for their shipping profile
xShipCity
String
The customer’s city for their shipping profile
xShipState
String
The customer’s state for their shipping profile
xShipZip
String
The customer’s zip code for their shipping profile
xShipCountry
String
The customer’s country for their shipping profile
xShipPhone
String
The customer’s phone number for their shipping profile
xShipMobile
String
The customer’s mobile number for their shipping profile
xAllowDuplicate
String
By default, Sola rejects duplicate transactions within 10 minutes of the original transaction. This command overrides that safeguard. True/False allowed.
xCustReceipt
String
True/False value indicating if the email address specified in xemail should receive a receipt containing the transaction details.
xCommand*
String
Sola transaction type
xAmount*
String
The total amount of the transaction, inclusive of tax and tip if applicable. This the total amount of the transaction.
If xIncremental field is not set to True in cc:AuthOnly, use of xAmount in will result in forced cc:Adjust transaction.
xRefNum*
String
Used to reference a previous transaction when doing a follow-up transaction; typically a refund, void, or capture. (Note: xRefnum can be a 64-bit number and should be stored as BIGINT, Long, Int64 or String).
Custom01
String
Custom fields available for custom data such as customer comments, etc.
Custom02
String
Custom fields available for custom data such as customer comments, etc.
Custom03
String
Custom fields available for custom data such as customer comments, etc.
xStreet
String
The billing street address of the cardholder
xZip
String
The billing zip code of the cardholder
xName
String
The cardholder’s name
xDescription
String
Additional data optionally passed along for reporting
xOrderID
String
Unique Order Number for FraudWatch verification
xTip
String
The tip portion that is included in the total transaction amount (xAmount)
xTax
String
The tax portion that is included in the total transaction amount (xAmount)
xSignature
String
The Base 64 encoded customer signature
xInvoice
String
The merchant’s invoice number for the transaction. xInvoice is recommended when available for improved duplicate handling
xIncremental
String
Incremental authorizations enable increase the authorized amount on a captured transaction.
True/False value. Must be set to True in order for xAmount to be used in cc:Adjust, otherwise cc:Adjust will be a forced transaction.
xSoftwareName*
String
Name of your software
xCommand*
String
Sola transaction type
xSoftwareVersion*
String
Version number of your software
xCustom01
String
20 custom fields are available for custom data, such as customer comments, etc. Use xCustom01 through xCustom20.
xStreet
String
The billing street address of the cardholder
xZip
String
The billing zip code of the cardholder
xMagstripe
String
The magstripe data of a credit card. Magstripe data includes the card number and expiration date. When using this command, xCardNum xExp and xToken should not be used. Encrypted card data can also be sent using xMagstripe.
xName
String
The cardholder’s name.
xIP
String
The customer’s IP address. Typically used for fraud detection.
xCVV
String
3-digit code from the back of the card (for Amex, 4-digit code from the front of the card)
xCommand*
String
Sola transaction type
xCardNum*
String
The customer card number. *Alternatively, xToken xMagStripe or SUT can be used.
xExp*
String
The card expiration number. Format: MMYY. For sandbox test transactions, use any date in the future. *xExp is required when sending in xCardnum and cannot be used with xMagstripe
xCustom01
String
20 custom fields are available for custom data, such as customer comments, etc. Use xCustom01 through xCustom20.
xCVV
String
3-digit code from the back of the card (for Amex, 4-digit code from the front of the card).
xStreet
String
The billing street address of the cardholder
xZip
String
The billing zip code of the cardholder
xMagstripe
String
The magstripe data of a credit card. Magstripe data includes the card number and expiration date. When using this command, xCardNum xExp and xToken should not be used. Encrypted card data can also be sent using xMagstripe.
xName
String
The cardholder’s name
xIP
String
The customer’s IP address. Typically used for fraud detection.
xCVV
String
3-digit code from the back of the card (for Amex, 4-digit code from the front of the card)
xSoftwareName*
String
Name of your software
xSoftwareVersion*
String
Version number of your software
xCommand*
String
Sola transaction type
xAmount*
String
The total amount of the transaction, inclusive of tax and tip if applicable. This the total amount of the transaction.
xCustom01*
String
20 custom fields are available for custom data, such as customer comments, etc. Use xCustom01 through xCustom20.
xToken
String
The Sola token that references a previously used payment method. When using a token, xCardNum xExp and xMagstripe should not be used.
xCVV
String
3-digit code from the back of the card (for Amex, 4-digit code from the front of the card)
xStreet
String
The billing street address of the cardholder
xZip
String
The billing zip code of the cardholder
xMagstripe
String
The magstripe data of a credit card. Magstripe data includes the card number and expiration date. When using this command, xCardNum xExp and xToken should not be used. Encrypted card data can also be sent using xMagstripe
xName
String
The cardholder’s name
xDUKPT
String
The DUK/PT key for PIN debit and EBT transactions.The first 16 characters are the encrypted PIN block, followed by the 6 character long Key Set Identifier (KSID). The remaining characters are the PIN pad serial number and transaction counter.
xTax
String
The tax portion that is included in the total transaction amount (xAmount)
xTip
String
The tip portion that is included in the total transaction amount (xAmount)
xInvoice
String
The merchant’s invoice number for the transaction. xInvoice is recommended when available for improved duplicate handling.
xPONum
String
The merchant’s purchase order number for the transaction
xComments
String
Additional data optionally passed along to the receipt
xDescription
String
Additional data that is optionally passed along for reporting
xIP
String
The customer’s IP address. Typically used for fraud detection.
xEmail
String
The customer’s email address
xFax
String
The customer’s fax number
xBillFirstName
String
The customer’s first name for their billing profile
xBillMiddleName
String
The customer’s middle name or initial for their billing profile
xBillLastName
String
The customer’s last/family name for their billing profile
xBillCompany
String
The customer’s company name for their billing profile
xBillStreet
String
The customer’s street address for their billing profile
xBillStreet2
String
The customer’s street address 2nd line for their billing profile
xBillCity
String
The customer’s city for their billing profile
xBillState
String
The customer’s state for their billing profile
xBillZip
String
The customer’s zip code for their billing profile
xBillCountry
String
The customer’s country for their billing profile
xBillPhone
String
The customer’s phone number for their billing profile
xBillMobile
String
The customer’s mobile number for their billing profile
xShipFirstName
String
The customer’s first name for their shipping profile
xShipMiddleName
String
The customer’s middle name or initial for their shipping profile
xShipLastName
String
The customer’s last/family name for their shipping profile
xShipCompany
String
The customer’s company name for their shipping profile
xShipStreet
String
The customer’s street address for their shipping profile
xShipStreet2
String
The customer’s street address 2nd line for their shipping profile
xShipCity
String
The customer’s city for their shipping profile
xShipState
String
The customer’s state for their shipping profile
xShipZip
String
The customer’s zip code for their shipping profile
xShipCountry
String
The customer’s country for their shipping profile
xShipPhone
String
The customer’s phone number for their shipping profile
xShipMobile
String
The customer’s mobile number for their shipping profile
xOrderId
String
Unique order number for FraudWatch verification
xExistingCustomer
String
Yes/No value indicating if the customer is a repeat customer
xAllowDuplicate
String
By default, Sola rejects duplicate transactions within 10 minutes of the original transaction. This command overrides that safeguard. True/False allowed.
xCustReceipt
String
True/False value indicating if the email address specified in xemail should receive a receipt containing the transaction details.
xCurrency
String
Used to specify an alternate currency. Only applicable for accounts that are using Multi-Currency Conversion (MCC). For accounts that are natively in a foreign currency, the currency does not need to be specified. ().
xTimeoutSeconds
String
Configurable amount of seconds in which the request will wait for a response.
xCommand*
String
Sola transaction type
xRefNum*
String
Used to reference a previous transaction when processing a follow-up transaction; typically a refund, void, or capture. (Note: xRefnum can be a 64-bit number and should be stored as BIGINT, Long, Int64 or String).
xAmount
String
Refund amount. Can be equal or less than the original transaction.
xAllowDuplicate
String
By default, Sola rejects duplicate transactions within 10 minutes of the original transaction. This command overrides that safeguard. True/False allowed.
xDescription
String
Additional data optionally passed along for reporting
xCustReceipt
String
True/False value indicating if the email address specified in xemail should receive a receipt containing the transaction details
xTimeoutSeconds
String
Configurable amount of seconds in which the request will wait for a response.
xSplitInstruction
Object
Array of objects containing split funding instructions for the refund. Each object must include xMid (merchant ID) and xAmount (amount to refund from that merchant). The sum of all split amounts must equal the total refund amount.
xCommand*
String
Sola transaction type
xRefNum*
String
Used to reference a previous transaction when processing a follow-up transaction; typically a refund, void, or capture. (Note: xRefnum can be a 64-bit number and should be stored as BIGINT, Long, Int64 or String).
xCustom01
String
20 custom fields are available for custom data, such as customer comments, etc. Use xCustom01 through xCustom20.
xCommand*
String
Sola transaction type
xRefNum*
String
Used to reference a previous transaction when processing a follow-up transaction, typically a refund, void, or capture. (Note: xRefnum can be a 64-bit number and should be stored as BIGINT, Long, Int64 or String).
xCustom01
String
20 custom fields are available for custom data, such as customer comments, etc. Use xCustom01 through xCustom20.
xCommand*
String
Sola transaction type
xRefNum*
String
Used to reference a previous transaction when processing a follow-up transaction; typically a refund, void, or capture. (Note: xRefnum can be a 64-bit number and should be stored as BIGINT, Long, Int64 or String).
xCustom01
String
20 custom fields are available for custom data, such as customer comments, etc. Use xCustom01 through xCustom20.
xExp*
String
The card expiration number. Format: MMYY. For sandbox test transactions, use any date in the future. *xExp is required when sending in xCardnum and cannot be used with xMagstripe.
xKey*
String
Your Sola API key.
xVersion*
String
Gateway API Version. The current version is 5.0.0.
xSoftwareName*
String
Name of your software
xCardNum*
String
The customer card number. *Alternatively, xToken xMagStripe or SUT can be used.
xExp*
String
The card expiration number. Format: MMYY. For sandbox test transactions, use any date in the future. *xExp is required when sending in xCardnum and cannot be used with xMagstripe.
xKey*
String
Your Sola API key.
xVersion*
String
Gateway API version. The current version is 5.0.0
xKey*
String
Your Sola API key.
xVersion*
String
Gateway API Version. The current version is 5.0.0
xSoftwareName*
String
Name of your software
xSoftwareVersion*
String
Version number of your software
xKey*
String
Your Sola API key
xVersion*
String
Gateway API Version. The current version is 5.0.0.
xCommand*
String
Sola transaction type
xSoftwareName*
String
Name of your software
xSoftwareVersion*
String
Version number of your software
xKey*
String
Your Sola API key
xVersion*
String
Gateway API Version. The current version is 5.0.0
xSoftwareName*
String
Name of your software
xSoftwareVersion*
String
Version number of your software
xCardNum*
String
The customer card number. *Alternatively, xToken xMagStripe or SUT can be used.
xExp*
String
The card expiration number. Format: MMYY. For sandbox test transactions, use any date in the future. *xExp is required when sending in xCardnum and cannot be used with xMagstripe
xKey*
String
Your Sola API key.
xVersion*
String
Gateway API version. The current version is 5.0.0.
xKey*
String
Your Sola API key.
xVersion*
String
Gateway API version. The current version is 5.0.0
xSoftwareName*
String
Name of your software
xSoftwareVersion*
String
Version number of your software
xCardNum*
String
The customer card number. *Alternatively, xToken xMagStripe or SUT can be used.
xExp*
String
The card expiration number. Format: MMYY. For sandbox test transactions, use any date in the future. *xExp is required when sending in xCardnum and cannot be used with xMagstripe.
xKey*
String
Your Sola API key.
xVersion*
String
Gateway API version. The current version is 5.0.0.
xKey*
String
Your Sola API key.
xVersion*
String
Gateway API version. The current version is 5.0.0.
xSoftwareName*
String
Name of your software
xSoftwareVersion*
String
Version number of your software
xKey*
String
Your Sola API key.
xVersion*
String
Gateway API version. The current version is 5.0.0
xSoftwareName*
String
Name of your software
xSoftwareVersion*
String
Version number of your software
xKey*
String
Your Sola API key.
xVersion*
String
Gateway API version. The current version is 5.0.0
xSoftwareName*
String
Name of your software
xSoftwareVersion*
String
Version number of your software
xKey*
String
Your Sola API key.
xVersion*
String
Gateway API version. The current version is 5.0.0
xSoftwareName*
String
Name of your software
xSoftwareVersion*
String
Version number of your software
xRefNum*
{
"xResult":"A",
"xStatus":"Approved",
"xError":"",
"xErrorCode":"00000",
"xRefNum":"601518451",
"xInvoice":"123456",
"xExp":"1030",
"xAuthCode":"11295A",
"xBatch":"11948741",
"xAvsResultCode":"NNN",
"xAvsResult":"Address: No Match & 5 Digit Zip: No Match",
"xCvvResultCode":"M",
"xCvvResult":"Match",
"xAuthAmount":"35.00",
"xMaskedCardNumber":"4xxxxxxxxxxx1111",
"xCardType":"Visa",
"xToken":"8n21126mq0hn253p9m7964p5qn60000g",
"xMID":"xxxxxxxxxx9999",
"xTID":"xxxxx6789",
"xCurrency":"USD",
"xDate":"3/3/2022 7:36:34 AM",
"xEntryMethod":"Keyed",
"xReviewed":"N"
}{
"xCardNum": "4444333322221111",
"xExp": "1030",
"xKey": "[xkeycredentials]",
"xVersion": "4.5.9",
"xSoftwareName": "YourSoftwareName",
"xSoftwareVersion": "1.0.0",
"xCommand": "cc:sale",
"xAmount": "35.00",
"xToken": "61h72mmh68phn9q233634ph3g54p1499m69qhp4816pn528h84",
"xCustom01": "Register01",
"xCVV": "123",
"xStreet": "123 Main Street",
"xZip": "12345",
"xMagstripe": "%B4444333322221111^TEST CARD/VISA^4912101123456789?;4444333322221111=4912101123456789?",
"xName": "John Doe",
"xDUPKT": "Example",
"xDigitalWalletType": "Google Pay",
"xTax": "2.00",
"xTip": "2.00",
"xInvoice": "123456A",
"xPONum": "123456B",
"xComments": "This is a comment",
"xDescription": "This is a description",
"xIP": "1.2.3.4",
"xEmail": "[email protected]",
"xFax": "1234567890",
"xBillFirstName": "John",
"xBillMiddleName": "Max",
"xBillLastName": "Doe",
"xBillCompany": "Acme",
"xBillStreet": "123 Any Street",
"xBillStreet2": "Apt 4b",
"xBillCity": "Anytown",
"xBillState": "NY",
"xBillZip": "12345",
"xBillCountry": "USA",
"xBillPhone": "8005551212",
"xBillMobile": "8005551111",
"xShipFirstName": "John",
"xShipMiddleName": "Max",
"xShipLastName": "Doe",
"xShipCompany": "Acme",
"xShipStreet": "123 Any Street",
"xShipStreet2": "Apt 4b",
"xShipCity": "Anytown",
"xShipState": "NY",
"xShipZip": "11111",
"xShipCountry": "USA",
"xShipPhone": "8005551212",
"xShipMobile": "8005551111",
"x1Description": "Wireless Bluetooth Speaker",
"x1Sku": "12345",
"x1Qty": "5",
"x1UnitPrice": "49.99",
"xHotelCheckInDate": "7/1/2024",
"xHotelCheckOutDate": "7/10/2024",
"xHotelChargeType": "Direct",
"xHotelRoomRate": "159.99",
"xHotelNoShow": "TRUE",
"xAllowPartialAuth": "TRUE",
"xAllowNonAuthenticated": "FALSE",
"xRxAmount": "1.50",
"xDentalAmount": "1.50",
"xVisionAmount": "1.50",
"xTransitAmount": "1.50",
"xCopayAmount": "1.50",
"xClinicalAmount": "1.50",
"xOrderID": "12356",
"xExistingCustomer": "TRUE",
"xAllowDuplicate": "TRUE",
"xCustReceipt": "TRUE",
"xCurrency": "USD",
"xTimeoutSeconds": "10",
"xVendorId": "12345",
"xInstallments": "5",
"xSplitInstruction": [
{
xAmount:1.1,
xMid: "123"
},
{
xAmount:.4,
xMid: "456"
}
]
}{
"xResult":"A",
"xStatus":"Approved",
"xError":"",
"xErrorCode":"00000",
"xRefNum":"601519890",
"xInvoice":"123456",
"xExp":"1030",
"xAuthCode":"47436A",
"xAvsResultCode":"NNN",
"xAvsResult":"Address: No Match & 5 Digit Zip: No Match",
"xCvvResultCode":"M",
"xCvvResult":"Match",
"xAuthAmount":"35.00",
"xMaskedCardNumber":"4xxxxxxxxxxx1111",
"xCardType":"Visa",
"xName":"John Doe",
"xToken":"q3nq31h6n8n24623n9qg695hhgh24g61",
"xMID":"xxxxxxxxxx9999",
"xTID":"xxxxx6789",
"xCurrency":"USD",
"xDate":"3/3/2022 7:43:21 AM",
"xIsSplitCapturable":"1",
"xEntryMethod":"Keyed",
"xReviewed":"N"
}{
"xCardNum": "4444333322221111",
"xExp": "1030",
"xKey": "[xkeycredentials]",
"xVersion": "4.5.9",
"xSoftwareName": "YourSoftwareName",
"xSoftwareVersion": "1.0.0",
"xCommand": "cc:authonly",
"xAmount": "35.00",
"token": "61h72mmh68phn9q233634ph3g54p1499m69qhp4816pn528h84",
"xCustom01": "Register01",
"xCVV": "123",
"xStreet": "123 Main Street",
"xZip": "12345",
"xMagstripe": "%B4444333322221111^TEST CARD/VISA^4912101123456789?;4444333322221111=4912101123456789?",
"xName": "John Doe",
"xDUPKT":
"xTax": "2.00",
"xTip": "2.00",
"xRequireSplitCapturable": "TRUE",
"xInvoice": "123456A",
"xPONum": "123456B",
"xComments": "This is a comment",
"xDescription": "This is a description",
"xIP": "1.2.3.4",
"xEmail": "[email protected]",
"xFax": "1234567890",
"xBillFirstName": "John",
"xBillMiddleName": "Max",
"xBillLastName": "Doe",
"xBillCompany": "Acme",
"xBillStreet": "123 Any Street",
"xBillStreet2": "Apt 4b",
"xBillCity": "Anytown",
"xBillState": "NY",
"xBillZip": "12345",
"xBillCountry": "USA",
"xBillPhone": "8005551212",
"xBillMobile": "8005551111",
"xShipFirstName": "John",
"xShipMiddleName": "Max",
"xShipLastName": "Doe",
"xShipCompany": "Acme",
"xShipStreet": "123 Any Street",
"xShipStreet2": "Apt 4b",
"xShipCity": "Anytown",
"xShipState": "NY",
"xShipZip": "11111",
"xShipCountry": "USA",
"xShipPhone": "8005551212",
"xShipMobile": "8005551111",
"xHotelCheckInDate": "7/1/2024",
"xHotelCheckOutDate": "7/10/2024",
"xAllowPartialAuth": "TRUE",
"xAutoRentalPickupDate": "2020-08-21",
"xAutoRentalPickupTime": "11:15:00",
"xAutoRentalReturnDate": "2020-08-21",
"xAutoRentalReturnTime": "11:15:00",
"xRxAmount": "1.50",
"xDentalAmount": "1.50",
"xVisionAmount": "1.50",
"xTransitAmount": "1.50",
"xCopayAmount": "1.50",
"xClinicalAmount": "1.50",
"xOrderID": "12356",
"xAllowDuplicate": "TRUE",
"xCustReceipt": "TRUE",
"xCurrency": "USD",
"xTimeoutSeconds": "10",
"xIncremental": "TRUE"
}{
"xResult":"E",
"xStatus":"Error",
"xError":"Invalid xRefNum",
"xErrorCode":"01463",
"xRefNum":"601523283",
"xInvoice":"123456",
"xDate":"3/3/2022 7:57:59 AM"
}{
"xKey": "[xkeycredentials]",
"xVersion": "4.5.9",
"xSoftwareName": "YourSoftwareName",
"xSoftwareVersion": "1.0.0",
"xCommand": "cc:capture",
"xAmount": "35.00",
"xCustom01": "Register01",
"xCVV": "123",
"xStreet": "123 Main Street",
"xZip": "12345",
"xRefNum": "81234568",
"xName": "John Doe",
"xTax": "2.00",
"xTip": "2.00",
"xInvoice": "123456A",
"xPONum": "123456B",
"xComments": "This is a comment",
"xDescription": "This is a description",
"xIP": "1.2.3.4",
"xEmail": "[email protected]",
"xFax": "1234567890",
"xBillFirstName": "John",
"xBillMiddleName": "Max",
"xBillLastName": "Doe",
"xBillCompany": "Acme",
"xBillStreet": "123 Any Street",
"xBillStreet2": "Apt 4b",
"xBillCity": "Anytown",
"xBillState": "NY",
"xBillZip": "12345",
"xBillCountry": "USA",
"xBillPhone": "8005551212",
"xBillMobile": "8005551111",
"xShipFirstName": "John",
"xShipMiddleName": "Max",
"xShipLastName": "Doe",
"xShipCompany": "Acme",
"xShipStreet": "123 Any Street",
"xShipStreet2": "Apt 4b",
"xShipCity": "Anytown",
"xShipState": "NY",
"xShipZip": "11111",
"xShipCountry": "USA",
"xShipPhone": "8005551212",
"xShipMobile": "8005551111",
"xAllowDuplicate": "TRUE",
"xCustReceipt": "TRUE"
}{
"xKey": "[xkeycredentials]",
"xVersion": "5.0.0",
"xSoftwareName": "YourSoftwareName",
"xSoftwareVersion": "1.0.0",
"xCommand": "cc:splitcapture",
"xRefNum": "81234568",
"xAmount": "9.99",
"xCustom01": "Register01",
"xStreet": "123 Main Street",
"xZip": "12345",
"xName": "John Doe",
"xTax": ".05",
"xTip": ".05",
"xInvoice": "123456A",
"xPONum": "123456B",
"xComments": "This is a comment",
"xDescription": "This is a description",
"xIP": "1.2.3.4",
"xEmail": "[email protected]",
"xFax": "1234567890",
"xBillFirstName": "John",
"xBillMiddleName": "Max",
"xBillLastName": "Doe",
"xBillCompany": "Acme",
"xBillStreet": "123 Any Street",
"xBillStreet2": "Apt 4b",
"xBillCity": "Anytown",
"xBillState": "NY",
"xBillZip": "12345",
"xBillCountry": "USA",
"xBillPhone": "8005551212",
"xBillMobile": "8005551111",
"xShipFirstName": "John",
"xShipMiddleName": "Max",
"xShipLastName": "Doe",
"xShipCompany": "Acme",
"xShipStreet": "123 Any Street",
"xShipStreet2": "Apt 4b",
"xShipCity": "Anytown",
"xShipState": "NY",
"xShipZip": "11111",
"xShipCountry": "USA",
"xShipPhone": "8005551212",
"xShipMobile": "8005551111",
"xAllowDuplicate": "TRUE",
"xCustReceipt": "TRUE"
}{
"xResult":"A",
"xStatus":"Approved",
"xError":"",
"xErrorCode":"00000",
"xRefNum":"10230508134",
"xInvoice":"123456",
"xExp":"1030",
"xAuthCode":"74119A",
"xBatch":"5128394",
"xAvsResultCode":"NNN",
"xAvsResult":"Address:No Match & 5 Digit Zip: No Match",
"xCvvResultCode":"",
"xCvvResult":"No CVV data available",
"xAuthAmount":"10.00",
"xMaskedCardNumber":"4xxxxxxxxxxx1111",
"xCardType":"Visa",
"xToken":"h0n6m0gn70m99598hp282802h60q2911",
"xMID":"xxxxxxxxxx9999",
"xTID":"xxxxx6789",
"xCurrency":"USD",
"xDate":"1/29/2025 10:58:54 AM",
"xEntryMethod":"Unknown"
}{
"xResult": "A",
"xStatus": "Approved",
"xError": "",
"xErrorCode": "00000",
"xRefNum": "10000016879",
"xInvoice": "1234567",
"xRefNumCurrent": "10000016886",
"xDate": "7/11/2022 4:06:11 PM"
}{
"xKey": "[xkeycredentials]",
"xVersion": "4.5.9",
"xSoftwareName": "YourSoftwareName",
"xSoftwareVersion": "1.0.0",
"xCommand": "cc:adjust",
"xAmount": "35.00",
"xCustom01": "Register01",
"xCustom02": "Register01",
"xCustom03": "Register01",
"xStreet": "123 Main Street",
"xZip": "12345",
"xRefNum": "81234568",
"xName": "John Doe",
"xDescription": "This is a description",
"OrderID": "123456",
"xTip": "1.05",
"xTax": "1.05",
"xSignature": "aGVsbG8gaG93IGFyZSB5b3UK",
"xInvoice": "123456A",
"xIncremental": "TRUE"
}{
"xResult": "A",
"xStatus": "Approved",
"xError": "",
"xErrorCode": "00000",
"xRefNum": "10000016898",
"xExp": "1030",
"xDate": "7/11/2022 4:15:15 PM",
"xToken": "38gn292893h0nq72m0qn69892q9mg56g",
"xMaskedCardNumber": "4xxxxxxxxxxx1111",
"xCardType": "Visa"
}{
"xCardNum": "4444333322221111",
"xExp": "1249",
"xKey": "[xkeycredentials]",
"xVersion": "4.5.9",
"xSoftwareName": "YourSoftwareName",
"xSoftwareVersion": "1.0.0",
"xCommand": "cc:save",
"xCustom01": "Register01",
"xStreet": "123 Main Street",
"xZip": "12345",
"xMagstripe": "%B4444333322221111^TEST CARD/VISA^4912101123456789?;4444333322221111=4912101123456789?",
"xName": "John Doe",
"xIP": "1.1.1.1"
}{
"xResult": "A",
"xStatus": "Approved",
"xError": "",
"xErrorCode": "00000",
"xRefNum": "10000016908",
"xInvoice": "123456",
"xExp": "1030",
"xAuthCode": "78685A",
"xBatch": "14594556",
"xAvsResultCode": "NNN",
"xAvsResult": "Address: No Match & 5 Digit Zip: No Match",
"xCvvResultCode": "M",
"xCvvResult": "Match",
"xAuthAmount": "35.00",
"xMaskedCardNumber": "4xxxxxxxxxxx1111",
"xCardType": "Visa",
"xToken": "n701mmg5qm3969673q92hm0p652h2n9g",
"xMID": "xxxxxxxxxx9999",
"xTID": "xxxxx6789",
"xCurrency": "USD",
"xDate": "7/11/2022 4:21:17 PM",
"xEntryMethod": "Keyed"
}{
"xCardNum": "4444333322221111",
"xExp": "1030",
"xKey": "[xkeycredentials]",
"xVersion": "4.5.9",
"xSoftwareName": "YourSoftwareName",
"xSoftwareVersion": "1.0.0",
"xCommand": "cc:credit",
"xAmount": "35.00",
"token": "61h72mmh68phn9q233634ph3g54p1499m69qhp4816pn528h84",
"xCustom01": "Register01",
"xCVV": "123",
"xStreet": "123 Main Street",
"xZip": "12345",
"xMagstripe": "%B4444333322221111^TEST CARD/VISA^4912101123456789?;4444333322221111=4912101123456789?",
"xName": "John Doe",
"xDUPKT":
"xTax": "2.00",
"xTip": "2.00",
"xInvoice": "123456A",
"xPONum": "123456B",
"xComments": "This is a comment",
"xDescription": "This is a description",
"xIP": "1.2.3.4",
"xEmail": "[email protected]",
"xFax": "1234567890",
"xBillFirstName": "John",
"xBillMiddleName": "Max",
"xBillLastName": "Doe",
"xBillCompany": "Acme",
"xBillStreet": "123 Any Street",
"xBillStreet2": "Apt 4b",
"xBillCity": "Anytown",
"xBillState": "NY",
"xBillZip": "12345",
"xBillCountry": "USA",
"xBillPhone": "8005551212",
"xBillMobile": "8005551111",
"xShipFirstName": "John",
"xShipMiddleName": "Max",
"xShipLastName": "Doe",
"xShipCompany": "Acme",
"xShipStreet": "123 Any Street",
"xShipStreet2": "Apt 4b",
"xShipCity": "Anytown",
"xShipState": "NY",
"xShipZip": "11111",
"xShipCountry": "USA",
"xShipPhone": "8005551212",
"xShipMobile": "8005551111",
"xAllowPartialAuth": "TRUE",
"xRxAmount": "1.50",
"xDentalAmount": "1.50",
"xVisionAmount": "1.50",
"xTransitAmount": "1.50",
"xCopayAmount": "1.50",
"xClinicalAmount": "1.50",
"xOrderID": "12356",
"xExistingCustomer": "TRUE",
"xAllowDuplicate": "TRUE",
"xCustReceipt": "TRUE",
"xCurrency": "USD",
"xTimeoutSeconds": "10"
}{
"xResult": "A",
"xStatus": "Approved",
"xError": "",
"xErrorCode": "00000",
"xRefNum": "10000016913",
"xInvoice": "123456",
"xExp": "1030",
"xAuthCode": "41174A",
"xBatch": "14594556",
"xAvsResultCode": "NNN",
"xAvsResult": "Address: No Match & 5 Digit Zip: No Match",
"xCvvResultCode": "N",
"xCvvResult": "No Match",
"xAuthAmount": "35.00",
"xMaskedCardNumber": "4xxxxxxxxxxx1111",
"xCardType": "Visa",
"xMID": "xxxxxxxxxx9999",
"xTID": "xxxxx6789",
"xCurrency": "USD",
"xDate": "7/11/2022 4:27:32 PM",
"xEntryMethod": "Unknown"
}
{
"xKey": "[xkeycredentials]",
"xVersion": "4.5.9",
"xSoftwareName": "YourSoftwareName",
"xSoftwareVersion": "1.0.0",
"xCommand": "cc:refund",
"xAmount": "35.00",
"xRefNum": "93827163",
"xDescription": "This is a description",
"xAllowDuplicate": "TRUE",
"xCustReceipt": "FALSE",
"xCurrency": "USD",
"xTimeoutSeconds": "10",
"xSplitInstruction": [
{
xAmount:1.1,
xMid: "123"
},
{
xAmount:.4,
xMid: "456"
}
]
}{
"xResult": "A",
"xStatus": "Approved",
"xError": "",
"xErrorCode": "00000",
"xRefNum": "10000016915",
"xInvoice": "123456",
"xRefNumCurrent": "10000016916",
"xExp": "1030",
"xAvsResultCode": "NNN",
"xAvsResult": "Address: No Match & 5 Digit Zip: No Match",
"xCvvResultCode": "N",
"xCvvResult": "No Match",
"xAuthAmount": "35.00",
"xMaskedCardNumber": "4xxxxxxxxxxx1111",
"xCardType": "Visa",
"xToken": "h9n16qg990p99157640h6m823942934p",
"xMID": "xxxxxxxxxx9999",
"xTID": "xxxxx6789",
"xCurrency": "USD",
"xDate": "7/11/2022 4:30:38 PM",
"xEntryMethod": "Unknown"
}{
"xKey": "[xkeycredentials]",
"xVersion": "4.5.9",
"xSoftwareName": "YourSoftwareName",
"xSoftwareVersion": "1.0.0",
"xCommand": "cc:voidrefund",
"xCustom01": "Register01",
"xRefNum": "93827163"
}{
"xResult": "A",
"xStatus": "Approved",
"xError": "",
"xErrorCode": "00000",
"xRefNum": "10000016917",
"xInvoice": "123456",
"xRefNumCurrent": "10000016919",
"xExp": "1030",
"xAvsResultCode": "NNN",
"xAvsResult": "Address: No Match & 5 Digit Zip: No Match",
"xCvvResultCode": "N",
"xCvvResult": "No Match",
"xAuthAmount": "35.00",
"xMaskedCardNumber": "4xxxxxxxxxxx1111",
"xCardType": "Visa",
"xMID": "xxxxxxxxxx9999",
"xTID": "xxxxx6789",
"xCurrency": "USD",
"xDate": "7/11/2022 4:33:02 PM",
"xEntryMethod": "Unknown"
}
{
"xKey": "[xkeycredentials]",
"xVersion": "4.5.9",
"xSoftwareName": "YourSoftwareName",
"xSoftwareVersion": "1.0.0",
"xCommand": "cc:voidrelease",
"xCustom01": "Register01",
"xRefNum": "93827163"
}{
"xResult": "A",
"xStatus": "Approved",
"xError": "",
"xErrorCode": "00000",
"xRefNum": "10000016875",
"xInvoice": "123456",
"xRefNumCurrent": "10000016882",
"xExp": "1030",
"xAvsResultCode": "NNN",
"xAvsResult": "Address: No Match & 5 Digit Zip: No Match",
"xCvvResultCode": "N",
"xCvvResult": "No Match",
"xAuthAmount": "35.00",
"xMaskedCardNumber": "4xxxxxxxxxxx1111",
"xCardType": "Visa",
"xMID": "xxxxxxxxxx9999",
"xTID": "xxxxx6789",
"xCurrency": "USD",
"xDate": "7/11/2022 4:03:04 PM",
"xEntryMethod": "Unknown"
}{
"xKey": "[xkeycredentials]",
"xVersion": "4.5.9",
"xSoftwareName": "YourSoftwareName",
"xSoftwareVersion": "1.0.0",
"xCommand": "cc:void",
"xCustom01": "Register01",
"xRefNum": "93827163"
}Sola iOS SDK is a mobile SDK targeted towards Swift mobile application developers; it allows developers to process transactions with the Sola Transactions API.
To start, download the SDK framework file:
Integrate the framework file into your XCode project by referring to the .
The SDK offers developers a couple of ways to process transactions:
In scope function
Out of scope function
Custom UI set of functions
Payment Engine set of functions
Use the out of scope function when the user needs to provide their credit card information. This function displays the SDK user interface, effectively giving the control over to the SDK to acquire the sensitive credit card data from the user. The user provides the sensitive information either via a form or via a credit card device, and then the SDK processes the transaction with the gateway.
Use the in scope function when there is no need for the SDK to interact with the user through a user interface. The developer should either pass in a card number + an expiration date, or provide a tokenized card data via the xToken parameter to this function to quickly process the transaction and retrieve back the results.
Custom-UI integration consists of a set of functions to control the card reader device via the SDK. Currently supported card reader device is a Bluetooth VP3300 card reader. This integration path is useful when the developer has an existing UI and wishes to use a card reader device to obtain users' card sensitive information and then process the transaction with the gateway. The SDK offers a set of functions to control the card reader device. The SDK takes care of processing with the gateway and notifying the Developer’s application with the processing results.
The SDK offers the following functions: “start scanning for devices”, “stop scanning for devices”, “connect to device”, “disconnect from device”, “start transaction”, “stop transaction”.
Click here to view the transaction workflows online.
Download our sample application:
Prior to any processing, the Sola SDK needs to be configured with user’s metadata and the account key. These functions can be called anywhere in the application any number of times to change the metadata and/or current account key.
Each integration path has a “process” function that accepts a “transaction parameters” object. Developers specify required values for transaction processing through that object. Same object can be used to specify optional parameters to associate with a transaction; such as invoice numbers, billing address, etc.
Optional transaction parameters further complement the transaction processing. All the parameters are being sent to the Gateway during processing.
The SDK can notify the application about various events during processing, such as about different card reader events during out of scope processing, or perhaps about a completed bluetooth device scan during custom UI processing.
Developers opt in to receive callbacks by subscribing to the NSNotificationCenter using one of its' methods, using a predefined value from the SDK for the “name” parameter.
The SDK uses the same “name” value to report results & various information back to subscribers.
Available callback types and integrations where they are applicable in are as follows:
Based on your integration path choice, choose an available callback type for that integration path and subscribe with the NSNotificationCenter to receive appropriate information back from the SDK.
This callback delivers a “transaction processed response” object to the subscriber.
For Swift applications using Swift UI, subscription can be made in a View as follows:
This callback delivers information about various events happening between the application & the card reader.
For example, while out-of-scope processing the SDK can report back error events related to bluetooth device pairing, such as “bluetooth not turned on” to indicate that the mobile device wanted to use the bluetooth service to find a near card reader device but the service is unavailable, or an error such as “waiting for device bluetooth response” to indicate that the mobile device found an eligible bluetooth card reader device, and is expecting the card reader to respond back with bluetooth data. This could mean that the bluetooth button on the card reader needs to be pressed.
After an established bluetooth pair, the SDK reports back events related to obtaining the card data via the card reader. For example, a “connected” event means that the mobile device & the card reader are connected and a card data transaction can start. A “transaction started” event means that the SDK initiated a card data transaction with the card reader and the physical card can be tapped onto the card reader.
For Swift applications using Swift UI, subscription can be made in a View as follows:
When a card reader event happens, the SDK delivers an object, of a type named similarly to “CardknoxCardReaderCallback”, back into the app.
The object encapsulates two things:
an event integer code
an event name; such as “connected”, “disconnected”, etc.
Event integer codes are enumerated in a type named similarly to "CardknoxCardReaderCallbackType".
Developer can match the received integer code value with the enumeration of interest to pinpoint a wanted event.
One of the Custom UI integration functions is a “start scanning” function. The function keeps scanning for nearby bluetooth devices until it is manually stopped with the “stop scanning” function or if it times out.
During the scanning process, for every scanned device the SDK sends a “scanned device” object that contains all the necessary metadata about the scanned device, such as the devices' display name or its internal name.
For Swift applications using Swift UI, subscription can be made in a View as follows:
One of the Custom UI integration functions is a “start scanning” function. The function keeps scanning for nearby bluetooth devices until it is manually stopped with the “stop scanning” function or if it times out.
Once the scanning process ends, the SDK sends a list of scanned device objects to all subscribers. Any object in the retrieved list can be used as an argument to the “connect to device” method.
For Swift applications using Swift UI, subscription can be made in a View as follows:
This callback provides information about the status of the card reader. It sends information about the initialization process of the device, the connection process of the card reader, and the mobile device. It also sends notifications about the actions expected by the user of the credit card.
For Swift applications using Swift UI, subscription can be made in a View as follows:
The transaction status callback sends information about the card scanning process. This callback starts triggering when the user inserts or swipes the credit card and ends with the result of card scanning.
For Swift applications using Swift UI, subscription can be made in a View as follows:
Out of scope processing feature allows the developer to show the Cardknox user interface for payment processing.
To show the user interface, create a request object that is capable of showing a user interface:
Check if the request object is in a valid state. If it is, call the method to show the UI. Otherwise, inspect the validation errors to see what is incorrect in the request object:
The SDK’s user interface consists of two fullscreen parts - a manual entry screen and a card reader screen. Manual entry screen is also abbreviated as a “keyed” screen. The card reader screen is also abbreviated as a “swipe” screen.
Showing the SDK user interface via a Request object will either show one of the screens, or both. Which screen will be visible depends on the global SDK configuration state prior to showing the SDK user interface via a Request object.
Note that if the SDK is configured to allow access to both processing screens, one of them will be shown by default and both of them will have some kind of a visual way to navigate to the other one.
The following table shows available functions to control which screen will be visible & accessible:
The following mapping represents which screens will be available when the SDK shows its user interface:
The following mapping represents available Sola Transaction API commands on each user interface:
Pre processing options
Developer using the Out Of Scope integration to process using the VP3300 card reader can specify a per-request transaction timeout value. The SDK will start a transaction with the VP3300 reader, and timeout in the specified time frame if the card is not tapped, swiped or inserted in that same time frame.
After the out-of-scope function finishes with transaction processing, the SDK displays a popup containing a handful of information about the transaction.
SDK can be configured to auto close the user interface immediately after the transaction processing has completed; regardless if the transaction was approved or not.
In scope processing feature allows the developer to quickly process a payment and retrieve the response object.
To process directly, create a request object:
Check if the request object is in a valid state. If it is, call the method to process directly. Otherwise, inspect the validation errors to see what is incorrect in the request object:
Check (ACH) commands
Reference:
Credit Card commands
Custom UI integration is similar to the “out of scope” integration in a way that the exact same methods that the “out of scope” is using under the hood for controlling the card reader, are exposed via the SDK for the Developer to use.
The Developer provides the user interface and orchestrates the entire flow for obtaining the card data via the card reader by calling appropriate Custom UI functions at specific times.
Any of the following credit card commands are available for Custom UI:
cc:save
cc:credit
cc:authonly
cc:sale
Reference:
First, create a “custom ui” object to get access to all the Custom UI functions. Afterwards, subscribe to all the relevant callbacks for this integration path:
transaction result callback - to receive the “response” object after the SDK has processed a transaction
card reader event callback - to be notified about various events that take place between the application & the card reader
scanned bluetooth device callback - to be notified about every new scanned bluetooth device during the “scan for devices” process
Next step is to establish a connection between the app and the card reader device. Use one of the “connect” methods on the “custom ui” to initiate a connection; such as “connect with name” or “connect with UUID”.
Device name or the UUID can be obtained with the “scan for devices” flow. Initiate the “start scanning” function call, with or without a timeout.
The scanning process stops with a call to the “stop scanning” function or when the “start scanning” function times out.
After establishing a connection with the card reader by calling one of the “connect” methods and receiving a “connected” card reader event via the NSNotificationCenter subscription, call the “start transaction” function to make the card reader ready for a card.
The SDK will report a “transaction starting” card reader event via a callback followed by the “transaction started” event if the transaction with the card reader was successfully started, otherwise an “error” card reader event is reported back. At this point the card can be tapped, swiped or inserted into the card reader. The SDK will read the card information, process a transaction & deliver the results to the application via a callback.
If no card is tapped, swiped or inserted after the transaction started - a “timeout” card reader is reported back. The default timeout value is about 10 seconds. The developer can override this value via the “transaction parameters” object.
The Payment Engine won't show any UI. The developer provides the user interface and uses three payment engine functions to create transactions with a card reader over IP. Data that is required to create a transaction is passed by developers as parameters to those SDK functions. The messages and results of creating a transaction with the Payments engine are obtained by the developer from transaction result callback, device status callback, and transaction status.
Developers can call the “get version” API to obtain the SDK Semantic Versioning ()
SDK verbose logging can be enabled or disabled with a function call:
As a Sola SDK user, I want to process without an internet connection. What will happen?
The SDK will return a PaymentTransactionResponse object with a special xErrorCode value -1
As a Sola SDK user, I’ve encountered errors during transaction processing. What response can I expect?
Name of your software
My app
Accepts the xKey.
xKey is a Sola account key.
All transactions being processed after calling this function will be associated to the account that was passed in into the function.
Sample data (Swift)
CardknoxSDK.setPrincipalKey("Your xKey value")
Sample data (Objective C)
[CardknoxSDK setPrincipalKey:@"Your xKey value"];
61h72mmh68phn9q233634ph3g54p1499m69qhp4816pn528h84
xRefNum
Used to reference a previous transaction when doing a follow-up transaction, typically a refund, void, or capture.
12345678
xInvoice
The merchant’s invoice number for the transaction. xInvoice is recommended when available for improved duplicate handling.
The merchant’s invoice number for the transaction. xInvoice is recommended when available for improved duplicate handling.
xPoNum
The merchant’s purchase order number for the transaction.
123485
xDescription
This is a description
This is a description
xName
The cardholder’s name.
John Doe
xBillFirstName
The customer’s first name for their billing profile.
John
xBillLastName
The customer’s last/family name for their billing profile.
Doe
xBillCompany
The customer’s company name for their billing profile.
Acme
xBillStreet
The customer’s street address for their billing profile.
123 Any Street
xBillStreet2
The customer’s second street address for their billing profile.
123 Any Street
xBillCity
The customer’s city for their billing profile.
Anytown
xBillState
The customer’s state for their billing profile.
NY
xBillZip
The customer’s zip code for their billing profile.
12345
xBillCountry
The customer’s phone number for their billing profile.
USA
xBillPhone
The customer’s phone number for their billing profile.
8005551212
xShipFirstName
The customer’s last/family name for their shipping profile.
John
xShipLastName
The customer’s last/family name for their shipping profile.
Doe
xShipCompany
The customer’s company name for their shipping profile.
Acme
xShipStreet
The customer’s street address for their shipping profile.
123 Any Street
xShipStreet2
The customer’s second street address for their shipping profile.
123 Any Street
xShipCity
The customer’s city for their shipping profile.
Anytown
xShipState
The customer’s state for their shipping profile.
NY
xShipZip
The customer’s zip code for their shipping profile.
12345
xShipCountry
The customer’s country for their shipping profile.
USA
xShipPhone
The customer’s phone number for their shipping profile.
1113333444
xCustom01
Custom field 1. Use this for any additional data
xCustom02
Custom field 2. Use this for any additional data
xCustom03
Custom field 3. Use this for any additional data
xAuthCode
xAuthCode is a verification number provided by the issuing bank to be used with the cc:postauth command.
xAllowDuplicate
By default, Sola rejects duplicate transactions within 10 minutes of the original transaction. This command overrides that safeguard. True/False allowed.
False
xCustReceipt
True/False value indicating if the email address specified in xEmail should receive a receipt containing the transaction details.
False
Custom UI
Device status
The SDK is sending information to subscribers about the device initialization process and the actions that the device expects from the user of the card scanner. For example, waiting for the insert or swipe of a credit card.
Payment Engine
Transaction status
The transaction status sends information about the card scanning process.
Payment Engine
Sola SDK attempts a “start transaction” call with the card reader SDK.
Card reader SDK successfully starts the transaction and notifies the Sola SDK with this event.
Sola SDK calls back with this event to the app.
transaction start error timeout
Sola SDK attempts a “start transaction” call with the card reader SDK.
The card reader never receives a card in a specified timeout frame window (about 10 seconds) and the transaction times out.
transaction start device disconnected
Sola SDK wants to start the transaction with a disconnected device.
transactionCancelled
Generally, this is raised whenever an error occurs at any point between starting a transaction with the reader and obtaining the card data.
See the “error” event for error examples.
The Sola SDK in cases of these errors preventively calls the “cancel any pending transactions” internally to clean up.
Specifically, this event is raised in the “custom ui” integration when:
a “cancel transaction” method is called & the card reader SDK cancels all pending transactions between the app & the card reader
Furthermore, this event is raised in the “process out of scope” integration when:
scanStop
Indicates that the Sola SDK stopped its own bluetooth scanning.
Raised in the “custom ui” integration when:
a Developer explicitly calls the “stop scanning” method
when the “start scanning” method was called with a timeout value and the timeout expired or was cancelled / interrupted
in the “disconnect from current device” call if the “connect to device” method was called beforehand but there is no connected device to disconnect from
scanStart
Indicates that the Sola SDK started a bluetooth scanning process.
Raised in the “custom ui” integration when:
the “start scanning” method was called, with or without a timeout value
Raised in the “process out of scope” integration when:
the SDK shows its' UI and automatically starts scanning for nearby readers
error
This is raised whenever an error occurs at any point between starting a transaction with the reader and obtaining the card data.
Things that might go wrong (not a complete list) are:
transaction with the card reader failed to start
EMV card readings are corrupted
transaction started but the card was not tapped / swiped / inserted in time
CardknoxSDKUI.setEnableDeviceInsertSwipeTap(true);
Yes
No
true
true
Yes
Yes
EBT Food Stamp commands
Reference: EBT Food Stamp
EBT Cash Benefits
Reference: EBT Cash Benefits
EBT Wic
Reference: EBT Wic
Gift Card commands
Reference: Gift Card
customUI.stopScanning();
ConnectWithName
Accepts a device name.
Configures the SDK to be ready to establish a Bluetooth connection with the nearby VP3300 device with a name equal to the provided name.
After the call:
The card reader & the app are not connected immediately but rather the SDK notifies the developer about various card reader events taking place after this method is called; such as “connecting” and “waiting for device response”
If the VP3300 devices’ bluetooth is not asleep when this method is called, the card reader auto connects to the app
Sample data
let scannedDevice : String = nil;
customUI.connect(toDevice: scannedDevice);
ConnectwithUUID
Accepts an UUID in a string format.
Configures the SDK to be ready to establish a Bluetooth connection with the nearby VP3300 device with the internal identifier equal to the provided UUID value.
Note that on iOS, the CoreBluetooth framework generated internal identifiers are not unique across time.
Sample data
let uuid = "d1554880-56ac-11ed-9b6a-0242ac120002";
customUI.connect(withUUID: uuid);
DisconnectFromCurrentDevice
Attempts to break the connection between the application & the card reader.
If the card reader is not connected to the app, a card reader event similar to “disconnected already” is raised.
Otherwise, the SDK attempts to disconnect the card reader. If successful, the “disconnected” card reader event is raised.
Sample data
customUI.disconnectFromCurrentDevice();
StartTransaction
Starts a transaction between an already connected application & the card reader.
Once the transaction starts, the card reader is ready to accept cards, either via swipe, tap or insert. This method can timeout. Default value is 10 seconds. Developers can override this value via the “parameters” object.
Sample data
let prms : TransactionParameters = TransactionParameters.init()
prms.xAmount = 1.23;
prms.xInvoice = "1234";
prms.xCommand = "cc:sale";
prms.vp3300TransactionTimeout = 13;
customUI.startTransaction(withArgs: prms);
CancelTransaction
Attempts to cancel an already started transaction between the application & the card reader.
If no transactions are started when this function is called, the function does not do anything.
Sample data
customUI.cancelTransaction();
Sample data
CardknoxSDK.create().getPaymentEngine().device_CancelTransaction();
The PaymentTransactionRequest object will encapsulate all relevant information in respective fields; for example the xErrorCode property will return a code from the Sola Transaction API documentation, the xErrorMessage and xError properties can be used for a descriptive error message while the xRefNum gives back a unique ref num to follow up with the customer support
Name
Required
Description
Sample data
xKey
Yes
Sola account key
SolaSupport_Test
xVersion
Yes
Gateway version
4.5.9
xSoftwareName
Function
Description
setxSoftwareName
Specifies the name of your software (xSoftwareName), version number of your software (xSoftwareVersion) and the gateway version (xVersion)
Sample data (Swift)
CardknoxSDK.setxSoftwareName("Your app name", xSoftwareVersion: "Your app version, such as 1.0.0", xVersion: "4.5.9");
Sample data (Objective C)
[CardknoxSDK setxSoftwareName:@"Your app name" xSoftwareVersion:@"Your app version, such as 1.0.0" xVersion:@"4.5.9"];
Name
Description
Sample data
xCommand
Sola transaction type
cc:sale
Name
Description
Sample data
VP3300TransactionTimeout
Start transaction timeout, in seconds.
Once the transaction with the VP3300 reader is started; the SDK times out if the card is not provided in the time frame specified by this timeout value.
This parameter is only applicable for SDK integrations that use a VP3300 card reader; such as CustomUI or OutOfScope integrations.
Refer to the Custom UI flow or Out Of Scope flow for samples.
xCardNum
Card number
4444333322221111
xExpDate
Card expiration date.
Expected format is MMYY where MM is a month, and YY are last 2 year digits
“1126” for (November 2026)
“0122” for “January 2022”
xToken
Callback type
Description
Available in integration
Transaction result
The SDK processes a payment with the Gateway and delivers an object containing all processed transaction details.
Out of scope
Custom UI
Card reader event
The SDK keeps informing the subscribers about various events taking place between the application and the card reader device; such as “connected”, “disconnected”, “transaction started”, “on bluetooth disabled error”, etc.
Out of scope
Custom UI
Scanned bluetooth device
Trigger a bluetooth device scanning process with the “start scanning” function.
During the scanning process, the SDK keeps informing subscribers with objects that encapsulate all the information about each newly discovered Bluetooth device.
The SDK expects one of the objects as an argument in the “connect to device” function.
Custom UI
Scan completed
Event name
Description
connecting
The Sola SDK calls into the card reader SDK to connect with the reader, in scenarios such as:
“connect to device” method in the “custom ui” integration
when it presents its own UI in “process out of scope” integration
The card reader SDK starts searching for nearby IDTech card readers & notifies the Sola SDK with a “connecting” event.
The Sola SDK raises a “connecting” callback which notifies the app.
waitingForDeviceResponse
This event is raised whenever the Sola SDK scans for nearby card readers. Awake readers are usually auto connected straight away.
Asleep or not, this event is always raised from the SDK to indicate that some action is required on the device.
This event is raised in the “custom ui” integration when:
a Developer calls the “start scanning” method and the underlying bluetooth adapter starts scanning
or when a Developer calls the “connect to device” method. Sola SDK will call the card reader SDk to “connect” and raise this event
This event is raised in the “process out of scope” integration when:
the Sola SDK presents its user interface; automatically starting a bluetooth scan for a nearby card reader, expecting a response back
connected
Raised when the app & the card reader establish a bluetooth connection.
Bluetooth connection is established when the Sola SDK scans for card readers, and card readers respond back with some bluetooth payload.
disconnected
Card reader SDK sends this event to the Sola SDK whenever a bluetooth card reader goes to sleep.
This event is never raised explicitly by the Sola SDK.
transactionStarting
Informational event.
Sola SDK raises this event before it places a call to the underlying card reader SDK in order to start a transaction with the card reader.
Function
Description
EnableKeyedEntry
Globally configures the SDK to show the keyed screen that allows manual input interaction.
Sample data
CardknoxSDKUI.setEnableKeyedEntry(true);
EnableDeviceInsertSwipeTap
Globally configures the SDK to show the swipe screen that allows card reader interaction.
Sample data
EnableDeviceInsertSwipeTap
EnableKeyedEntry
Keyed screen available
Swipe screen available
false
false
Yes
No
true
false
No
Yes
false
Keyed
Swipe
Any Sola Transaction API command
Any of the following credit card commands:
cc:save
cc:credit
cc:authonly
cc:sale
Reference:
Function/property
Description
VP3300TransactionTimeout
Start transaction value, in seconds.
Sample data (Swift)
let ui = CardknoxSDKUI.create();
let parameters : TransactionParameters = TransactionParameters.init()
parameters.vp3300TransactionTimeout = 13;
let req = cardknoxSDKUI?.createRequest(withParameters: parameters) as! PaymentTransactionRequestUI
// Enable swipe screen in the Cardknox UI
CardknoxSDKUI.setEnableDeviceInsertSwipeTap(true)
// Show Cardknox UI
req.process();
Function
Description
CloseSDKOnUIProcessedTransaction
Globally configures the SDK to auto close the user interface after processing a transaction.
Default value is false.
Sample data (Swift)
CardknoxSDKUI.setCloseOnProcessedTransaction(true);
Function
Description
StartScanning
Starts the “scan for nearby bluetooth devices” process.
If the timeout value is 0 or a negative number, the scanning never times out. A card reader event similar to “waiting for device response” will be raised once the scanning starts. This usually means that the user needs to press the physical button in order for the card reader device to be visible to nearby scanners.
Sample data
customUI.startScanning(withTimeout: 0);
StopScanning
Attempts to stop the bluetooth device scanning process.
Raises a “stop scan” card reader event.
Doesn’t do anything if scanning is not in progress.
If the method stops the scanning process, the SDK reports all scanned devices via a callback.
Sample data
Device_Initialize
This function makes sure that the mobile device can communicate with the card reader and saves data that is needed for connecting to the card reader.
The initialization process can take about 2 minutes. But it is sufficient to execute it once per card reader and IP address.
Sample data
let settings : CardknoxPaymentEngineSDKSettings
CardknoxPaymentEngineSDKSettings.init();
settings.device_Name = "Verifone_P400.4";
settings.device_IP_Address = “127.21.2.7”;
settings.device_IP_Port = “9006”;
settings. device_Timeout = 120 * 1000; // seconds
CardknoxSDK.create().getPaymentEngine().device_Initialize(withSettings: settings)
ProcessOutOfScopeWithSettings
Attempts to create a transaction with a card reader over IP.
This function will perform the initialization process if initialization has not been performed for the specific card reader.
Sample data
let settings : CardknoxPaymentEngineSDKSettings
CardknoxPaymentEngineSDKSettings.init();
settings.device_Name = "Verifone_P400.4";
settings.device_IP_Address = “127.21.2.7”;
settings.device_IP_Port = “9006”;
settings. device_Timeout = 120 * 1000; // seconds
let request : CardknoxPaymentEngineSDKRequest = CardknoxPaymentEngineSDKRequest.init(); request.xAmount = 1.23 request.xCommand = "cc:sale";
CardknoxSDK.create().getPaymentEngine().processOutOfScope(withSettings: settings, request: request)
Device_CancelTransaction
Attempts to cancel an already started transaction between the application & the card reader.
If no transactions are started when this function is called, the function does not do anything.
Function
Description
getVersion
Reads the SDK version
Returns a “cardknox sdk version” object
access to the Semantic Versioning “string” value
access to all individual parts: major, minor, patch, build
Sample data (Swift)
let ver = CardknoxSDK.getVersion() as! CardknoxSDKVersion
// Read the version in format "major.minor.patch.build"
let semanticVersion = ver.description();
// Access individual parts as well
let major : Int32 = ver.major;
let minor : Int32 = ver.minor;
let patch : Int32 = ver.patch;
let build : Int32 = ver.build;
Sample data (Objective C)
CardknoxSDKVersion *ver = [CardknoxSDK getVersion];
// Read the version in format "major.minor.patch.build"
NSString *semanticVersion = [ver description];
// Access individual parts as well
int major = [ver major];
int minor = [ver minor];
int patch = [ver patch];
int build = [ver build];
Function
Description
EnableLogging
Accepts a boolean.
Enables or disabled the verbose logging.
Sample data (Swift)
CardknoxSDK.enableLogging(false);
Sample data (Objective C)
[CardknoxSDK enableLogging:true];






Yes
setPrincipalKey
From
The Sola token that references a previously used payment method. When using a token, xCardNum xExp and xMagstripe should not be used.
Trigger a bluetooth device scanning process with the “start scanning” function.
Stop the process with a “stop scanning” function.
Once the scanning process is stopped, the SDK reports back a list of all scanned bluetooth devices.
The SDK expects one of the objects as an argument in the “connect to device” function.
transactionStarted
true
import SwiftUI
struct ProcessOutOfScopeView: View
{
// Define a Publisher
let transactionPublisher =
NotificationCenter.default.publisher(for: NSNotification.Name(CardknoxSDK.transactionResultSubscription_NSNotificationCenterName()))
var body: some View
{
VStack{}
// Subscribe the Publisher with the NotificationCenter
.onReceive(transactionPublisher, perform: transactionNotification)
}
// Define a function that accepts a Notification.
// This method will be invoked when the SDK sends transaction processing results
func transactionNotification(notif: Notification) {
// Use the SDK's "response" object utility method to transform a Notification into a "response" object
let response = PaymentTransactionResponse.unwrap(notif) as! PaymentTransactionResponse
if response.isSuccess()
{
// Transaction successfully processed
let errorMessage = response.errorMessage()!
let refNum = response.xRefNum()!
// ... other properties ...
} else {
// Transaction processing resulted in an error message which can be extracted from this property:
let errorMessage = response.errorMessage()!
let errorCode = response.xErrorCode()!
let error = response.xError()!
}
}
}import SwiftUI
struct ProcessOutOfScopeView: View
{
// Define a Publisher
let cardReaderEventPublisher =
NotificationCenter.default.publisher(for: NSNotification.Name(CardknoxSDK.cardreaderEventSubscription_NSNotificationCenterName()))
var body: some View
{
VStack{}
// Subscribe the Publisher with the NotificationCenter
.onReceive(cardReaderEventPublisher, perform: cardReaderEventNotification)
}
// Define a function that accepts a Notification.
// This method will be invoked when the SDK sends card reader events
func cardReaderEventNotification(aNotification: Notification){
// Use the SDK's "response" object utility method to transform a Notification into a "response" object
let callback = CardknoxCardReaderCallback.unwrap(aNotification) as! CardknoxCardReaderCallback
// Read the event code
let code : Int32 = callback.code();
// Read the event name
let name: String = callback.name()!;
NSLog(String(format: "Card reader - %@", name));
// Match the non-error code
if(code == CardknoxCardReaderCallbackType.connected())
{
NSLog("Connected!");
}
// Match the error code & get the message
if(code == CardknoxCardReaderCallbackType.error())
{
let errorMessage : String = callback.message()!;
NSLog(String(format: "Card reader - %@", errorMessage));
}
}
}import SwiftUI
struct CustomUIView: View
{
// Track a scanned device
@State private var scannedDevice : CardknoxSDKCustomUIScannedDevice!;
// Define a Publisher
let customUIscannedDeviceSubscription =
NotificationCenter.default.publisher(for: NSNotification.Name(CardknoxSDKCustomUI.customUI_scannedDevice_Subscription_NSNotificationCenterName()))
var body: some View
{
VStack{}
// Subscribe the Publisher with the NotificationCenter
.onReceive(customUIscannedDeviceSubscription, perform: customUIscannedDeviceSubscription)
}
// Define a function that accepts a Notification.
// This method will be invoked when the SDK sends scanned device information
func customUIscannedDeviceSubscription(aNotification: Notification){
// Use the SDK's "response" object utility method to transform a Notification into a "response" object
scannedDevice = CardknoxSDKCustomUIScannedDevice.from(aNotification) as! CardknoxSDKCustomUIScannedDevice;
let name = scannedDevice.name();
let displayName = scannedDevice.displayName();
let uuid = scannedDevice.uuid();
}
}import SwiftUI
struct CustomUIView: View
{
// Track a scanned device
@State private var scannedDevice : CardknoxSDKCustomUIScannedDevice!;
// Define a Publisher
let customUIscanCompletedSubscription =
NotificationCenter.default.publisher(for: NSNotification.Name(CardknoxSDKCustomUI.customUI_scanCompleted_Subscription_NSNotificationCenterName()))
var body: some View
{
VStack{}
// Subscribe the Publisher with the NotificationCenter
.onReceive(customUIscanCompletedSubscription, perform: customUIscanCompletedNotification(aNotification:))
}
// Define a function that accepts a Notification.
// This method will be invoked when the SDK stops the scanning process and sends back all scanned devices
func customUIscanCompletedNotification(aNotification: Notification){
let scanCompleted = CardknoxSDKCustomUIScanCompleted.from(aNotification) as! CardknoxSDKCustomUIScanCompleted;
let devices : Array<Any> = scanCompleted.scannedDevices();
// Example to get a first scanned VP3300 device.
// All VP3300 devices have their internal name start with IDTECH prefix
if(devices != nil && devices.count > 0)
{
for dev in devices{
let typedDevice = dev as! CardknoxSDKCustomUIScannedDevice
let name = typedDevice.name()!;
if name.hasPrefix("IDTECH")
{
// Save the reference & use it with the "connect to device" method
scannedDevice = typedDevice;
break;
}
}
}
}
}import SwiftUI
struct PaymentEngineView: View
{
// Define a Publisher
let deviceStatusSubscription =
NotificationCenter.default.publisher(for:
NSNotification.Name(CardknoxPaymentEngineSDK.deviceStatus_NSNotification_Name()))
var body: some View
{
VStack{}
// Subscribe the Publisher with the NotificationCenter
.onReceive(deviceStatusSubscription, perform: deviceStatusNotification(aNotification:))
}
// Define a function that accepts a Notification.
// This method will be invoked when the SDK sends information about card reader status
func deviceStatusNotification(aNotification: Notification)
{
// Use the SDK's "response" object utility method to transform a Notification into a "response" object
let status = CardknoxPaymentEngineSDK.unwrapDeviceStatus(with: aNotification) as String;
}
}import SwiftUI
struct PaymentEngineView: View
{
// Define a Publisher
let transactionStatusSubscription =
NotificationCenter.default.publisher(for:
NSNotification.Name(CardknoxPaymentEngineSDK.transactionStatus_NSNotification_Name()))
var body: some View
{
VStack{}
// Subscribe the Publisher with the NotificationCenter
.onReceive(transactionStatusSubscription, perform: transactionStatusNotification(aNotification:))
}
// Define a function that accepts a Notification.
// This method will be invoked when the SDK sends information about card scanning
func transactionStatusNotification(aNotification: Notification){
// Use the SDK's "response" object utility method to transform a Notification into a "response" object
let status = CardknoxPaymentEngineSDK.unwrapTransactionStatus(with: aNotification) as String;
let line = "transaction status: " + status;
addLineToOutput(line: line)
}
}// Create the parameters object
let prms : TransactionParameters = TransactionParameters.init()
prms.xAmount = 1.23;
prms.xInvoice = "1234";
prms.xCommand = "cc:sale";
// ... other fields.
// Create the request object
let request = CardknoxSDK.create().getOutOfScope().createRequest(withParameters: prms) as! PaymentTransactionRequestUI// Create the parameters object
TransactionParameters *prms = [[TransactionParameters alloc] init];
prms.xAmount = 1.23;
prms.xInvoice = @"1234";
prms.xCommand = @"cc:sale";
// ... other fields.
// Create the request object
PaymentTransactionRequestUI * request = [cardknoxUI createRequestWithParameters:prms];let request = CardknoxSDK.create().getOutOfScope().createRequest(withParameters: prms) as! PaymentTransactionRequestUI
if(request.isValid){
request.process()
}
else{
let errors = request.validationErrors;
}PaymentTransactionRequestUI * request = [cardknoxUI createRequestWithParameters:prms];
if([request IsValid]){
[request process];
}
else{
NSArray* errors = request.ValidationErrors;
}// Create the parameters object
let prms : TransactionParameters = TransactionParameters.init()
prms.xAmount = 1.23;
prms.xInvoice = "1234";
prms.xCommand = "cc:sale";
// ... other fields.
// Create the request object
let request = cardknoxDirect.createRequest(withParameters: prms) as! PaymentTransactionRequestDirect;// Create the parameters object
TransactionParameters *prms = [[TransactionParameters alloc] init];
prms.xAmount = 1.23;
prms.xInvoice = @"1234";
prms.xCommand = @"cc:sale";
// ... other fields.
// Create the request object
PaymentTransactionRequestDirect* request = [cardknoxDirect createRequestWithParameters:prms];let request = cardknoxDirect.createRequest(withParameters: prms) as! PaymentTransactionRequestDirect;
if(request.isValid){
let response : PaymentTransactionResponse = request.process() as! PaymentTransactionResponse;
let isSuccess = response.isSuccess();
let errorMessage = response.errorMessage();
let errorCode = response.xErrorCode();
let refNum = response.xRefNum();
}
else{
let errors = request.validationErrors;
}PaymentTransactionRequestDirect* request = [cardknoxDirect createRequestWithParameters:prms];
if([request IsValid]){
PaymentTransactionResponse * response = [request process];
bool isSuccess = response.isSuccess;
NSString * errorMessage = response.errorMessage;
NSString * errorCode = response.xErrorCode;
NSString * refNum = response.xRefNum;
}
else{
NSArray* errors = request.ValidationErrors;
}the Sola SDK’s user interface is closed; either via a pull down gesture or via a “close” UI element; to clean things up
the charge amount gets modified via UI and becomes invalid, effectively invalidating any pending transactions between the app & the card reader
Raised in the “process out of scope” integration when:
the SDK shows its' UI and automatically starts scanning for nearby readers. User can explicitly stop the scanning process
The Sola Recurring API, designed in the RESTful architectural style, lets you process recurring transactions through the Sola gateway based on customized schedules. You can create recurring schedules along with customers and payment methods. Additionally, you can process single transactions for a customer and change a merchant's settings for recurring schedule reports.
Include your Sola API key in the Authorization header for all requests. You can generate an API key in the of the Sola Portal.
Customer and Recurring API V2 is versioned to allow stability for integrators and flexibility for Sola to continue making improvements.
The URL contains the major version number parameter. This version number would only be changed if there has been a major change that overhauls the entire API.
Example:
This version number is incremented when a breaking change to the existing API is implemented (for example, a change to how requests are processed or how responses are sent back).
The minor version is passed in the X-Recurring-Api-Version header: X-Recurring-Api-Version = 2.1
Method:
The Sola gateway requires the POST method to be used for enhanced security.
We do not support the GET method.
The base URL for all requests is
Add a new customer record, which can then be linked to payment methods and schedules.
Sample Response
Update existing customer information.
Note: All fields with values must be passed in (even fields that are not being updated). Any fields not passed in are treated as being set to blank.
Sample Request
Sample Response
Retrieves the details of a specific customer.
Sample Request
Sample Response
Deletes a customer record. You cannot delete a customer who has an active recurring schedule.
Sample Request
Sample Response
Lists customers created by a merchant.
Sample Request
Sample Response
Adds a new payment method to a customer’s account profile.
Sample Request
Sample Response
Updates an existing payment method.
Note: All fields with values must be passed in (even fields that are not being updated). Any fields not passed in are treated as being set to blank.
Sample Request
Sample Response
Retrieves an existing payment method.
Sample Request
Sample Response
Removes a payment method from the customer’s record. This will fail if the payment method is the customer's only payment method and there are active schedules.
Sample Request
Sample Response
Return payment methods based on specific search parameters.
Sample Request
Sample Response
Create a recurring payment schedule. Schedules have two main parameters: IntervalType and IntervalCount. You can set IntervalType to day, week, month, or year. The IntervalCount parameter determines the number of times the IntervalType should pass before the next payment schedule is triggered.
Example 1: To process a charge every two weeks, set IntervalType to week and set IntervalCount to 2. This specifies that two weeks should pass before initiating a new charge.
Example 2: To process a charge every 10 days, set IntervalType to day and set IntervalCount to 10. This specifies that 10 days should pass before initiating a new charge.
Unsuccessful Payments: If an attempted payment is unsuccessful (e.g., the card is declined), the system reschedules the charge for the following day. This can be done up to five times, provided that the rescheduled payment doesn’t overlap into the next payment cycle. After five unsuccessful attempts, or if rescheduling the payment as above will overlap into the next payment cycle, this individual payment will be canceled. The entire schedule remains in effect.
Sample Request
Sample Response
This command allows you to update some details of a schedule. You can only update information that does not change the actual schedule. For example, the CustomerId field cannot be updated (and it is not listed in the parameter table below). Also, you cannot update inactive schedules.
The following fields can be updated at any point:
AfterMaxRetriesAction
Amount
CustomXX
CustReceipt
Any fields that are not set will use the default values (or if no default is indicated, they will be removed).
Sample Request
Sample Response
Restart a schedule that was previously disabled.
Sample Request
Sample Response
Stop, pause, cancel, or inactivate an active schedule.
Sample Request
Sample Response
Removes a schedule. You can only delete a schedule that is not active.
Sample Request
Sample Response
Retrieves the details for a schedule.
Sample Request
Sample Response
Returns a list of upcoming payment dates (up to 100) for a specific schedule.
Sample Request
Sample Response
Returns a list of schedules that are sorted by creation date (ascending or descending order). You can use search filters to narrow the search results that are returned.
Sample Request
Sample Response
Processes a single payment transaction for a customer. You can specify a backup payment method to use should the initial payment fail. If desired, you can have the system send an email receipt of the transaction to the customer.
Sample Request
Sample Response
Returns the details of an existing transaction, such as transaction date and customer ID. Also returned are the transaction's processing status and any error messages from the gateway.
Sample Request
Sample Response
Returns a list of transactions, that are sorted by transaction date (in ascending or descending order). You can use specific search criteria to define which transactions to return.
Sample Request
Sample Response
Changes the recurring report settings for the merchant, which includes:
Email address
Enabled status
Show Details setting
Sample Request
Sample Response
Returns the merchant's current configuration for recurring report settings (see ).
Sample Request
{ "SoftwareName" : "ACME Inc.", "SoftwareVersion" : "1.0" }
Sample Response
There are two types of rules: On and Nth.
On rules run on a specified day within the specified interval (Examples: every Sunday, the 3rd of each month, or February 17th each year).
Nth rules run on nth (or nth from last) of the specified interval (Examples: the first weekday of each month, or the second to last Sunday of each month).
DayOfWeek, DayOfMonth, and MonthOfYear can only be used when RuleType is On.
DayOfWeek can only be used for weekly schedules.
Weekdays begin with Monday and continue through Friday.
Weekends are Saturday and Sunday.
The following are the values for the days of the week:
A monthly schedule that runs every 3 months on the first weekday of the month:
A yearly schedule that runs every year on January 1st:
A weekly schedule that runs every other Monday:
Timeouts
Transactions that take longer than 45 seconds to process will now be automatically voided by the gateway and marked as declined on recurring.
string
Merchant's internal customer identifier.
CustomerNotes
No
string
Notes pertaining to the customer.
No
string
Customer's email address.
Fax
No
string
Customer's fax number.
BillFirstName
Yes*
string
Customer's first name for their billing profile.
*Required if BillLastName and BillCompany are not passed in.
BillMiddleName
No
string
Customer's middle name or middle initial for their billing profile.
BillLastName
Yes*
string
Customer's last name or family name for their billing profile.
*Required if BillFirstName and BillCompany are not passed in.
BillCompany
Yes*
string
Customer's company name for their billing profile.
*Required if BillFirstName and BillLastName are not passed in.
BillStreet
No
string
Customer's street address for their billing profile.
BillStreet2
No
string
Customer's street address second line for their billing profile.
BillCity
No
string
Customer's city for their billing profile.
BillState
No
string
Customer's state for their billing profile.
BillZip
No
string
Customer's ZIP code or postal code for their billing profile.
BillCountry
No
string
Customer's country for their billing profile.
BillPhone
No
string
Customer's phone number for their billing profile.
BillMobile
No
string
Customer's mobile number for their billing profile.
ShipFirstName
No
string
Customer’s first name for their shipping profile.
ShipMiddleName
No
string
Customer’s middle name or initial for their shipping profile.
ShipLastName
No
string
Customer’s last/family name for their shipping profile.
ShipCompany
No
string
Customer’s company name for their shipping profile.
ShipStreet
No
string
Customer’s street address for their shipping profile.
ShipStreet2
No
string
Customer’s street address second line for their shipping profile.
ShipCity
No
string
Customer’s city for their shipping profile.
ShipState
No
string
Customer’s state for their shipping profile.
ShipZip
No
string
Customer’s ZIP code for their shipping profile.
ShipCountry
No
string
Customer’s country for their shipping profile.
ShipPhone
No
string
Customer’s phone number for their shipping profile.
ShipMobile
No
string
Customer’s mobile number for their shipping profile.
ShipEmail
No
string
Customer’s shipping email address for their shipping profile.
CustomerCustomXX
No
string
Custom fields (20 available) used for custom data such as customer comments and so forth. Use CustomerCustom01 through CustomerCustom20.
If the Result parameter contains a value of E, this parameter will contain any relevant error messages.
CustomerId
integer
The created customer ID.
integer
The revision number of the record to update. If this does not match the current revision number of the record, the update will fail.
CustomerId
Yes
string
The ID of the customer to update.
CustomerNumber
No
string
Merchant's internal customer identifier.
CustomerNotes
No
string
Notes pertaining to the customer.
DefaultPaymentMethodId
Yes
string
The ID of the created payment method.
No
string
Customer's email address.
Fax
No
string
Customer's fax number.
BillFirstName
Yes*
string
Customer's first name for their billing profile.
*Required if BillLastName and BillCompany are not passed in.
BillMiddleName
No
string
Customer's middle name or middle initial for their billing profile.
BillLastName
Yes*
string
Customer's last/family name for their billing profile.
*Required if BillFirstName and BillCompany are not passed in.
BillCompany
Yes*
string
Customer's company name for their billing profile.
*Required if BillFirstName and BillLastName are not passed in.
BillStreet
No
string
Customer's street address for their billing profile.
BillStreet2
No
string
Customer's street address second line for their billing profile.
BillCity
No
string
Customer's city for their billing profile.
BillState
No
string
Customer's state for their billing profile.
BillZip
No
string
Customer's ZIP code or postal code for their billing profile.
BillCountry
No
string
Customer's country for their billing profile.
BillPhone
No
string
Customer's phone number for their billing profile.
BillMobile
No
string
Customer's mobile number for their billing profile.
ShipFirstName
No
string
Customer’s first name for their shipping profile.
ShipMiddleName
No
string
Customer’s middle name or initial for their shipping profile.
ShipLastName
No
string
Customer’s last/family name for their shipping profile.
ShipCompany
No
string
Customer’s company name for their shipping profile.
ShipStreet
No
string
Customer’s street address for their shipping profile.
ShipStreet2
No
string
Customer’s street address second line for their shipping profile.
ShipCity
No
string
Customer’s city for their shipping profile.
ShipState
No
string
Customer’s state for their shipping profile.
ShipZip
No
string
Customer’s ZIP code for their shipping profile.
ShipCountry
No
string
Customer’s country for their shipping profile.
ShipPhone
No
string
Customer’s phone number for their shipping profile.
ShipMobile
No
string
Customer’s mobile number for their shipping profile.
ShipEmail
No
string
Customer’s shipping email address for their shipping profile.
CustomerCustomXX
No
string
Custom fields (20 available) used for custom data such as customer comments and so forth. Use CustomerCustom01 through CustomerCustom20.
If the Result parameter contains a value of E, this parameter will contain any relevant error messages.
string
The ID of the customer to retrieve.
ShowDeleted
No
boolean
A flag that can be set to retrieve deleted items. If set to true, only deleted items can be retrieved (i.e. customers that are not deleted will not be returned).
If the Result parameter contains a value of E, this parameter will contain any relevant error messages.
Revision
integer
The revision number of the customer record.
CreatedDate
string
The date and time the customer was created, returned in ISO 8601 format (yyyy-MM-dd HH:mm:ss.fff).
CustomerId
string
The ID of the customer to update.
CustomerNumber
string
Merchant's internal customer identifier.
CustomerNotes
string
Notes pertaining to the customer.
string
Customer's email address.
Fax
string
Customer's fax number.
BillFirstName
string
Customer's first name for their billing profile.
BillMiddleName
string
Customer's middle name or initial for their billing profile.
BillLastName
string
Customer's last/family name for their billing profile.
BillCompany
string
Customer's company name for their billing profile.
BillStreet
string
Customer's street address for their billing profile.
BillStreet2
string
Customer's street address second line for their billing profile.
BillCity
string
Customer's city for their billing profile.
BillState
string
Customer's state for their billing profile.
BillZip
string
Customer's ZIP code or postal code for their billing profile.
BillCountry
string
Customer's country for their billing profile.
BillPhone
string
Customer's phone number for their billing profile.
BillMobile
string
Customer's mobile number for their billing profile.
ShipFirstName
string
Customer’s first name for their shipping profile.
ShipMiddleName
string
Customer’s middle name or initial for their shipping profile.
ShipLastName
string
Customer’s last/family name for their shipping profile.
ShipCompany
string
Customer’s company name for their shipping profile.
ShipStreet
string
Customer’s street address for their shipping profile.
ShipStreet2
string
Customer’s street address second line for their shipping profile.
ShipCity
string
Customer’s city for their shipping profile.
ShipState
string
Customer’s state for their shipping profile.
ShipZip
string
Customer’s ZIP code for their shipping profile.
ShipCountry
string
Customer’s country for their shipping profile.
ShipPhone
string
Customer’s phone number for their shipping profile.
ShipMobile
string
Customer’s mobile number for their shipping profile.
ShipEmail
string
Customer’s shipping email address for their shipping profile.
CustomerCustomXX
string
Custom fields (20 available) used for custom data such as customer comments and so forth. Use CustomerCustom01 through CustomerCustom20.
string
The ID of the customer to update.
If the Result parameter contains a value of E, this parameter will contain any relevant error messages.
The version of the software making the request.
PageSize
No
integer
100
The maximum number of items to retrieve for this request.
NextToken
No
string
A token that can be sent in to the following request to get the next set of customers.
SortOrder
No
string
Ascending
The list order. Order is determined by customer creation date.
Ascending, Descending
Filters
No
object
{
"IsDeleted" : false
}
Filters that can be applied to limit the result set.
Filters will remove any items that do not contain the string for that filter value. If there are multiple filters applied, the item must match all of them.
Available filters:
CustomerId
CustomerNumber
If the Result parameter contains a value of E, this parameter will contain any relevant error messages.
Customers
object[]
An array of customer objects.
Refer to the endpoint for the values that are returned for each customer.
NextToken
string
A token to include in the next request to get the next set of results.
string
The ID of the customer to update with the new payment method.
Token
Yes
string
Sola token that represents a payment method.
*Raw card information cannot be passed in the request.
TokenType
Yes
string
The Token payment type.
TokenAlias
No
string
Custom name for the Token.
Exp
Yes*
string
Credit card expiration date.
*Required if Token is an iFields token and TokenType is cc.
Routing
Yes*
string
ACH payment routing number.
*Required if Token is an iFields token and TokenType is ach.
AccountType
No
string
The account type - checking / savings.
*Allowed if the TokenType is check.
Name
No
string
Name on the customer's account.
*Required for ACH (check) transactions.
Street
No
string
Customer's street address for their billing profile.
Zip
No
string
Customer's ZIP code or postal code for their billing profile.
SetAsDefault
No
boolean
Sets this payment method as the default payment method.
Note: If there are no other payment methods, this method is automatically set as the default.
If the Result parameter contains a value of E, this parameter will contain any relevant error messages.
PaymentMethodId
string
The ID of the created payment method.
integer
The revision number of the record to update. If this does not match the current revision number of the record, the update will fail.
PaymentMethodId
Yes
string
The ID of the payment method to update.
TokenAlias
No
string
Custom name for the Token.
Exp
No
string
Credit card expiration date.
AccountType
No
string
The account type - checking / savings
*Allowed if TokenType is check.
Routing
Yes*
string
ACH payment routing number.
*Required if Token is an iFields token and TokenType is ach.
Name
No*
string
Name on the customer's account.
*Required for ACH (check) transactions.
Street
No
string
Customer's street address for their billing profile.
Zip
No
string
Customer's ZIP code or postal code for their billing profile.
SetAsDefault
No
boolean
Sets this payment method as the default payment method.
Note: If there are no other payment methods, this method is automatically set as the default.
If the Result parameter contains a value of E, this parameter will contain any relevant error messages.
string
The ID of the payment method to retrieve.
ShowDeleted
No
boolean
A flag that can be set to retrieve deleted items. If set to true, only deleted items can be retrieved (i.e., payment methods that are not deleted will not be returned).
If the Result parameter contains a value of E, this parameter will contain any relevant error messages.
PaymentMethodId
string
The ID of the payment method.
Revision
number
The revision number of the record to update. If this does not match the current revision number of the record the update will fail.
Token
string
Sola token that references a previously used payment method to use for the charge.
TokenType
string
The Token payment type.
CC, Check
TokenAlias
string
Custom name for the Token.
Exp
string
Credit card expiration date (in MMYY format).
AccountType
string
The account type - checking / savings
Note: This field is only populated when TokenType is Check.
Issuer
string
The credit card issuer.
Note: This field is only populated when TokenType is CC.
MaskedCardNumber
string
The masked credit card number.
Note: This field is only populated when TokenType is CC.
Name
string
The name on the check.
Note: This field is only populated when TokenType is Check.
Street
string
The building number and street name of the customer being billed.
Zip
string
The zip code of the customer being billed.
CreatedDate
string
The date and time the payment method was created, returned in ISO 8601 format (yyyy-MM-dd HH:mm:ss.fff).
string
The ID of the payment method to retrieve.
If the Result parameter contains a value of E, this parameter will contain any relevant error messages.
The version of the software making the request.
PageSize
No
integer
100
The maximum number of items to retrieve for this request.
NextToken
No
string
A token that can be sent in to the following request to get the next set of payment methods.
SortOrder
No
string
Ascending
The list order. Order is determined by payment method creation date.
Ascending, Descending
Filters
No
object
{
"IsDeleted" : false
}
Filters that can be applied to limit the result set.
Filters will remove any items that do not contain the string for that filter value. If there are multiple filters applied, the item must match all of them.
Available filters:
IsDeleted
CustomerId
If the Result parameter contains a value of E, this parameter will contain any relevant error messages.
PaymentMethods
object[]
An array of payment method objects.
Refer to the endpoint for the values that are returned for each payment method.
NextToken
string
A token to include in the next request to get the next set of results.
The version of the software making the request.
CustomerId
Yes*
string
Customer's unique ID number.
*Required if linking the schedule to an existing customer.
PaymentMethodId
No
string
The unique ID number of the payment method the schedule should use to process the transactions. If none is set, the default payment method on the customer will be used.
*Allowed if linking the schedule to an existing customer
NewCustomer
Yes*
object
The customer details. Refer to the endpoint for fields that can be set for this object.
*Required if not linking the schedule to an existing customer. This cannot be set if linking to an existing customer.
NewPaymentMethod
Yes*
object
The payment method details. Refer to the endpoint for fields that can be set for this object.
*Required if not linking the schedule to an existing customer. This cannot be set if linking to an existing customer.
IntervalType
Yes
string
Type of time interval.
day, week, month, year
Amount
Yes
decimal
Total amount of each transaction.
Must be a number with up to 2 decimal places
Currency
No
string
Currency code to be used when processing transactions
Note: If the currency code used is not supported for the merchant and it does not run a transaction on schedule creation, the schedule will not error until the first transaction is processed.
TotalPayments
No
integer
infinite
Total count of scheduled payment occurrences, including the initial payment.
Note: If left blank, the count is indefinite. This field cannot be set together with EndDate.
Cvv
No
string
The CVV value for the first transaction that is run if a transaction is run immediately. This value will not be applied to a future transaction run by the created schedule.
Description
No
string
Additional data sent with the transaction.
Invoice
No
string
Customer's invoice number for the transaction.
Use Invoice when available for improved duplicate handling (recommended).
PONumber
No
string
Customer's purchase order number for the transaction.
ScheduleName
No
string
Merchant's internal schedule identifier.
IntervalCount
No
integer
1
Number of time periods to elapse before the payment schedule is re-triggered.
Examples:
For every 28 days, set IntervalType to day and set IntervalCount to 28.
For every other month, set IntervalType to month and set IntervalCount to 2.
FailedTransactionRetryTimes
No
integer
5
Maximum number of times to retry before rescheduling to the next run time if the transaction fails. Retries are run on each subsequent day. If it’s set to 0, it will try one time total.
DaysBetweenRetriesnew
No
integer
1
Number of days between retries after a declined transaction.
Any natural number greater than 0.
SkipSaturdayAndHolidays
No
boolean
false
Indicates whether to process payments on the Sabbath and Jewish holidays.
CustReceipt
No
boolean
false
A flag that can be set to send the receipts to the email set in Email for the customer.
CalendarCulture
No
string
Gregorian
Type of calendar to use when executing month and year interval types.
Gregorian, Hebrew
UseDefaultPaymentMethodOnly
No
boolean
false
Indicates that the system should not try another card if the default card fails.
ScheduleRule
No
object
The schedule rule used to determine the next run time after each processed payment.
See for more information on the ScheduleRule object.
StartDate
No
string
current date
Schedule start date in YYYY-MM-DD format. The start date must be within one year.
Unless the StartDate parameter is included to specify a future start date for the schedule, the first charge takes place immediately by default.
EndDate
No
string
Schedule expiration date in YYYY-MM-DD format.
Note: This field cannot be set together with TotalPayments.
AfterMaxRetriesAction
No
string
ContinueNextInterval
The action to perform after a schedule hits the maximum number of failed attempts in a single interval.
Disable: Disables the schedule.
ContinueNextInterval: Skips the current interval and continues at the next interval.
Disable, ContinueNextInterval
AllowInitialTransactionToDecline
No
Boolean
False
Create the schedule even if the initial payment fails.
Note: Can be used only if the StartDate is set to today's date (or left empty).
SplitInstruction
No
Object
False
On Instructional Funding accounts, add split instructions for each scheduled transaction. Format is an array of json objects, each having a mid and the amount for that mid.
CustomXX
No
String
Custom fields (19 available) used for custom data, such as customer comments and so forth.
Custom01 is reserved. Use Custom02 - Custom20.
InitialAmount
No
String or Integer
Overrides Amount on initial transaction
5.99
If the Result parameter contains a value of E, this parameter will contain any relevant error messages.
ScheduleId
string
The ID of the schedule that was created.
CustomerId
string
The ID of the customer that was created if the schedule was not linked to an existing customer.
PaymentMethodId
string
The ID of the payment method that was created if the schedule was not linked to an existing customer.
DaysBetweenRetries
Description
Invoice
PaymentMethodId
PONumber
RetryAmount
ScheduleName
SkipSaturdayAndHolidays
UseDefaultPaymentMethodOnly
SplitInstruction
The version of the software making the request.
Revision
Yes
integer
The revision number of the record to update. If this does not match the current revision number of the record, the update will fail.
ScheduleId
Yes
string
The ID of the schedule to update.
Amount
No
decimal
Transaction amount
Currency
No
string
Currency code to be used when processing transactions.
Note: If the currency code used is not supported for the merchant and it does not run a transaction on schedule creation, the schedule will not error until the first transaction is processed.
TotalPayments
No
integer
infinite
Total count of scheduled payment occurrences, including the initial payment.
You can only change this field before a schedule has been completed. Additionally, you cannot set the value to be lower than the number of payments already processed.
Note: This can be updated to at least the number of payments processed or higher.
Description
No
string
Additional data sent with the transaction.
Invoice
No
string
Customer's invoice number for the transaction
Use Invoice when available for improved duplicate handling (recommended).
PONumber
No
string
Customer's purchase order number for the transaction.
ScheduleName
No
string
Merchant's internal schedule identifier.
FailedTransactionRetryTimes
No
integer
5
Maximum number of times to retry before rescheduling to the next run time if the transaction fails. Retries are run on each subsequent day. If it’s set to 0, it will try one time.
You can only change this field before a schedule has been completed.
DaysBetweenRetries
No
integer
Number of days between retries after a declined transaction.
Any natural number greater than 0
SkipSaturdayAndHolidays
No
boolean
false
Indicates whether to process payments on the Sabbath and Jewish holidays.
CustReceipt
No
boolean
false
A flag that can be set to send the receipts to the email set in Email for the customer.
CalendarCulture
Yes
string
Gregorian
Type of calendar to use when executing month and year interval types.
Note: You cannot change this once the schedule has begun.
Gregorian, Hebrew
UseDefaultPaymentMethodOnly
No
boolean
false
Indicates that the system should not try another card if the default card fails.
PaymentMethodId
No
string
The unique ID of the payment method the schedule should use to process the transactions
ScheduleRule
No
object
The schedule rule used to determine the next run time after each processed payment.
See for more information on the ScheduleRule object.
StartDate
Yes
string
Schedule start date in YYYY-MM-DD format. The start date must be within one year.
Note: This cannot be changed once the schedule has begun.
EndDate
No
string
Schedule expiration date in YYYY-MM-DD format.
Note: This field cannot be set together with TotalPayments. This cannot be changed once the schedule has completed.
AfterMaxRetriesAction
No
String
ContinueNextInterval
The action to perform after a schedule hits the maximum number of failed attempts in a single interval.
Disable: Disables the schedule.
ContinueNextInterval: Skips the current interval and continues at the next interval.
Disable, ContinueNextInterval
SplitInstruction
No
Object
On Instructional Funding accounts, update the split instructions for each scheduled transaction. Format is an array of json objects, each having a mid and the amount for that mid.
CustomXX
No
String
Custom fields (19 available) used for custom data, such as customer comments and so forth.
Custom01 is reserved. Use Custom02 - Custom20.
If the Result parameter contains a value of E, this parameter will contain any relevant error messages.
string
The ID of the schedule to enable.
If the Result parameter contains a value of E,this parameter will contain any relevant error messages.
string
The ID of the schedule to disable.
If the Result parameter contains a value of E, this parameter will contain any relevant error messages.
string
The ID of the schedule to delete.
If the Result parameter contains a value of E, this parameter will contain any relevant error messages.
string
The ID of the schedule to retrieve.
ShowDeleted
No
boolean
A flag that can be set to retrieve deleted items. If set to true, only deleted items can be retrieved (i.e., schedules that are not deleted will not be returned).
If the Result parameter contains a value of E, this parameter will contain any relevant error messages.
Revision
integer
The revision number of the record to update. If this does not match the current revision number of the record, the update will fail.
ScheduleId
string
Schedule reference number.
ScheduleName
string
Schedule name.
CustomerId
string
Customer's unique ID number.
PaymentMethodId
string
The unique ID number of the payment method the schedule uses to process the transactions
Note: Only populated when a specific PaymentMethodId was sent in on creating/updating schedule
IsDeleted
boolean
A flag indicating whether the record is deleted.
UseDefaultCardOnly
boolean
Indicates that the system should not try another card if the default card fails.
FailedTransactionRetryTimes
integer
Maximum number of times to retry before rescheduling to the next run time if the transaction fails. The tries are spaced apart into 1-day intervals.
FailedAttemptsInCurrentInterval
integer
The number of unsuccessful transactions that were processed for the current interval. This value will reset to 0 at the start of the next interval.
DaysBetweenRetries
integer
Number of days between retries after a declined transaction.
ScheduleRule
object
The schedule rule used to determine the next run time after each processed payment.
See for more information on the ScheduleRule object.
StartDate
string
Schedule start date in YYYY-MM-DD format.
EndDate
string
Schedule end date in YYYY-MM-DD format.
AllowInitialTransactionToDecline
boolean
Indicates whether the schedule was set up to allow the first transaction to be declined.
Description
string
Additional data sent with the transaction (optional).
Amount
decimal
Transaction amount.
Currency
string
Currency code to be used when processing transactions.
TotalPayments
integer
Total count of scheduled payment occurrences, including the initial payment.
PaymentsProcessed
integer
The number of payments processed by the schedule.
SkipSaturdayAndHolidays
boolean
Indicates whether to process payments on the Sabbath and Jewish holidays.
IntervalType
string
Type of time interval.
IntervalCount
integer
Number of time periods to elapse before the payment schedule is re-triggered.
Note: Refer to the endpoint for more details.
LastTransactionStatus
string
The status of the last transaction run by the schedule.
LastTransactionError
string
The error message of the last transaction if the status was Error.
LastProjectedPaymentDate
string
The projected payment date of the last transaction that the schedule will run.
Note: This may not be 100% accurate if that last date falls on a Saturday or Holiday and SkipSaturdayAndHolidays is set.
Invoice
string
Customer's invoice number for the transaction.
PONumber
string
Customer's purchase order number for the transaction.
CustReceipt
boolean
A flag indicating whether receipts will be sent to the email set in Email for the customer.
NextScheduledRunTime
string
The date and time that the schedule will next run.
InitialRunTime
string
The date and time of the first transaction run by the schedule.
LastRunTime
string
The date and time of the last transaction run by the schedule.
IsActive
boolean
A flag indicating whether the schedule is currently enabled/active.
CalendarCulture
string
Type of calendar to use when executing month and year interval types.
CreatedDate
string
Date that the schedule was created.
CustomerNumber
string
Merchant's internal customer identifier.
string
Customer's email address.
BillFirstName
string
Customer's first name for their billing profile.
BillMiddleName
string
Customer's middle name or initial for their billing profile.
BillLastName
string
Customer's last/family name for their billing profile.
BillCompany
string
Customer's company for their billing profile.
AfterMaxRetriesAction
string
The action to perform after a schedule hits the maximum number of failed attempts in a single interval.
Disable: Disables the schedule.
ContinueNextInterval: Skips the current interval and continues at the next interval.
Disable, ContinueNextInterval
SplitInstruction
Object
On Instructional Funding accounts, the split instructions used for each scheduled transaction.
CustomXX
string
Custom fields (19 available) used for custom data, such as customer comments and so forth.
Custom01 is reserved.
The version of the software making the request.
ScheduleId
Yes
string
The ID of the schedule to retrieve.
NumberOfPayments
Yes
integer
The number of payment dates to retrieve.
An integer between 1 and 100 (inclusive)
CalendarCulture
No
string
Gregorian
The culture the dates should be returned in.
Gregorian, Hebrew
If the Result parameter contains a value of E, this parameter will contain any relevant error messages.
UpcomingPaymentDates
string[]
The upcoming payment dates for the specified schedule in the format yyyy-mm-dd.
The version of the software making the request.
PageSize
No
integer
100
The maximum number of items to retrieve for this request.
NextToken
No
string
A token that can be sent in to the following request to get the next set of schedules.
SortOrder
No
string
Ascending
The list order. Order is determined by schedule creation date.
Ascending, Descending
Filters
No
object
{
"IsDeleted" : false
}
Filters that can be applied to limit the result set.
Filters will remove any items that don't contain the string for that filter value. If there are multiple filters applied the item must match all of them.
Available filters:
IsDeleted
Active
If the Result parameter contains a value of E, this parameter will contain any relevant error messages.
Schedules
object[]
An array of schedule objects. Refer to the endpoint for the values that are returned for each schedule.
Note: The ScheduleRule field is not returned by this endpoint for each schedule.
NextToken
string
A token to include in the next request to get the next set of results.
CustomerId
Yes
string
Customer's unique ID number.
*This field is required if PaymentMethodID is not passed in. Valid combinations are below:
PM ID only
Customer ID Only (will use default PM on file)
Customer ID & new PM info
PaymentMethodId
Yes*
string
The ID of the payment method to use for the transaction.
*Required if using an existing non-default payment method.
Amount
Yes
decimal
The amount of the transaction.
Tax
No
decimal
The tax portion that is included in the total transaction amount.
PaymentDetails
No*
object
The details for a new method of payment.
*Required if not using an existing payment method.
Note: Refer to the endpoint for available and required fields.
UseBackupPaymentMethods
No
boolean
false
Indicates that the system should try another card if the default card fails.
Invoice
No
string
Customer's invoice number for the transaction.
Use Invoice when available for improved duplicate handling (recommended).
PONumber
No
string
Customer's purchase order number for the transaction.
Description
No
string
Additional data sent with the transaction.
AllowDuplicates
No
boolean
false
A flag indicating whether to disable duplicate detection. Useful for testing, but it is not suggested that this be set to true in production.
CustReceipt
No
boolean
A flag that can be set to send the receipts to the email address set in Email for the customer.
Cvv
No
string
The CVV value for the transaction.
No
string
Customer's email address.
Fax
No
string
Customer's fax number.
BillFirstName
Yes*
string
Customer's first name for their billing profile.
*This field is required if BillLastName and BillCompany are not passed in.
BillMiddleName
No
string
Customer's middle name or initial for their billing profile.
BillLastName
Yes*
string
Customer's last/family name for their billing profile.
*This field is required if BillFirstName and BillCompany are not passed in.
BillCompany
Yes*
string
Customer's company for their billing profile.
*This field is required if BillFirstName and BillLastName are not passed in.
BillStreet
No
string
Customer's street address for their billing profile.
BillStreet2
No
string
Customer's street address second line for their billing profile.
BillCity
No
string
Customer's city for their billing profile.
BillState
No
string
Customer's state for their billing profile.
BillZip
No
string
Customer's ZIP code or postal code for their billing profile.
BillCountry
No
string
Customer's country for their billing profile.
BillPhone
No
string
Customer's phone number for their billing profile.
BillMobile
No
string
Customer's mobile number for their billing profile.
ShipFirstName
No
string
Customer’s first name for their shipping profile.
ShipMiddleName
No
string
Customer’s middle name or initial for their shipping profile.
ShipLastName
No
string
Customer’s last/family name for their shipping profile.
ShipCompany
No
string
Customer’s company name for their shipping profile.
ShipStreet
No
string
Customer’s street address for their shipping profile.
ShipStreet2
No
string
Customer’s street address second line for their shipping profile.
ShipCity
No
string
Customer’s city for their shipping profile.
ShipState
No
string
Customer’s state for their shipping profile.
ShipZip
No
string
Customer’s ZIP or postal code for their shipping profile.
ShipCountry
No
string
Customer’s country for their shipping profile.
ShipPhone
No
string
Customer’s phone number for their shipping profile.
ShipMobile
No
string
Customer’s mobile number for their shipping profile.
ShipEmail
No
string
Customer’s shipping email address for their shipping profile.
CustomXX
No
string
Custom fields (19 available) used for custom data, such as customer comments and so forth.
Custom01 is reserved. Use Custom02 - Custom20.
Currency
No
string
Currency code for the transaction.
SplitInstruction
No
object
sale
On Instructional Funding accounts, add split instructions for the transaction. Format is an array of json objects, each having a mid and the amount for that mid.
If the Result parameter contains a value of E, this parameter will contain any relevant error messages.
GatewayRefnum
string
The gateway reference number for the transaction.
GatewayStatus
string
The status of the transaction passed back by the gateway.
Approved, Declined, Error
GatewayErrorMessage
string
The error message for the transaction passed back by the gateway if the status indicates an error.
string
The ID of the transaction to retrieve.
If the Result parameter contains a value of E, this parameter will contain any relevant error messages.
TransactionId
string
The ID of the retrieved transaction.
ScheduleId
string
The ID of the schedule that the transaction was run for.
CustomerId
string
The ID of the customer that the transaction was run for.
PaymentMethodId
string
The ID of the payment method used in the transaction.
TransactionDate
string
The date the transaction was run.
GatewayRefNum
string
The reference number generated by the gateway for the transaction.
GatewayStatus
string
The transaction processing status returned by the gateway.
Approved, Declined, Error
GatewayError
string
The error message returned by the gateway if GatewayStatus indicates an error.
The version of the software making the request.
PageSize
No
integer
100
The maximum number of items to retrieve for this request.
NextToken
No
string
A token that can be sent in to the following request to get the next set of transactions.
SortOrder
No
string
Ascending
The list order. Order is determined by the date the transaction ran.
Ascending, Descending
Filters
No
object
Filters that can be applied to limit the result set.
Filters will remove any items that do not contain the string for that filter value. If there are multiple filters applied, the item must match all of them.
Available filters:
IsApproved
FromDate
If the Result parameter contains a value of E, this parameter will contain any relevant error messages.
Transactions
object[]
An array of transaction objects.
Refer to the endpoint for the values that are returned for each transaction.
NextToken
string
A token to include in the next request to get the next set of results.
integer
The current revision number of the record. If his value is incorrect the update will fail.
ScheduleReportSettings
Yes
object
The schedule report settings for the merchant:
Enabled (boolean): A flag indicating if the system should send the report.
EmailAddresses (array of string): One or more email addresses that will be sent the report.
ShowDetails (boolean): A flag indicating if the system should send the detailed version of the report with transaction details. The system can send the detailed version sent only if there are 500 transactions or less.
MaxRetriesReachedNotification
No
object
Settings for an email notification when a schedule reaches the maximum number of retries in an interval.
Enabled (boolean): A flag indicating if the system should send the email notification.
EmailAddresses (array of string): One or more email addresses that will be sent the notification.
Note: Values are only updated if they are not set to null. To clear the EmailAddresses, an empty array must be passed in.
If the Result parameter contains a value of E, this parameter will contain any relevant error messages.
If the Result parameter contains a value of E, this parameter will contain any relevant error messages.
Revision
integer
The current revision number of the record.
ScheduleReportSettings
object
The schedule report settings for the merchant:
Enabled (boolean): A flag indicating if the system should send the report.
EmailAddresses (array of string): One or more email addresses that will be sent the report.
ShowDetails (boolean): A flag indicating if the system should send the detailed version of the report with transaction details. The system can send the detailed version sent only if there are 500 transactions or less.
MaxRetriesReachedNotification
object
The max retry reached notification settings for the merchant:
Enabled (boolean): A flag indicating if the system should send the email notification.
EmailAddresses (array of string): One or more email addresses that will be sent the notification.
The day of the month to run the schedule on.
1 - 31 for gregorian schedules
1 - 30 for hebrew schedules
MonthOfYear
integer
The month of the year to run the schedule on.
1 - 12 for gregorian schedules
1 - 13 for hebrew schedules
N
integer
The nth value to run the schedule on.
Any positive or negative integer other than zero
NthOfType
string
The type that the nth value should be applied to.
Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Day, Weekday, WeekendDay
DayOfMonth can only be used for monthly and yearly schedules.
MonthOfYear can only be used for yearly schedules.
N and NthOfType can only be used when RuleType is Nth.
Weekly schedules can only have a RuleType of On.
Daily schedules cannot use rule types.
Monday = 2
Tuesday = 3
Wednesday = 4
Thursday = 5
Friday = 6
Saturday = 7
The following are the values for MonthOfYear for the Hebrew calendar:
Tishrei = 1
Cheshvan = 2
Kislev = 3
Teves = 4
Shevat = 5
Adar = 6
(Adar Beis = 7 in a leap year)
Nisan = 7 (8 in a leap year)
Iyar = 8 (9 in a leap year)
Sivan = 9 (10 in a leap year)
Tamuz = 10 (11 in a leap year)
Av = 11 (12 in a leap year)
Elul = 12 (13 in a leap year)
Use a negative number as the value of N to run as the nth from last.
An N value of 1 indicates the first
An N value of -1 indicates the last
A schedule with an IntervalCount greater than 1 will first run on the next matching date and will skip intervals from now on.
Example: The current date is January 1st, 2023 (a Wednesday), and the schedule rule says it should run on the first Thursday of the month with an IntervalCount of 2. The first run time will be on January 2nd, 2023, and the second run time will be on March 5th, 2023.
Schedules will begin running on the first matching date on or after the scheduled start date. If the start date is past the first matching date in the current period, it will begin the next interval period.
Example: A yearly schedule that runs on January 1st with a start date of January 2nd, 2023, will first run on January 1st, 2024.
If no schedule rule is passed in when creating a schedule, a default rule will be created based on the interval type. The default RuleType is On with the DayOfWeek, DayOfMonth, and MonthOfYear values set based on the start date.
Parameter
Required
Type
Description
SoftwareName
Yes
string
The name of the software making the request.
SoftwareVersion
Yes
string
The version of the software making the request.
CustomerNumber
Parameter
Type
Description
Valid Values
Result
char
The result of the API call. S represents success, E represents error.
S, E
RefNum
string
A unique request ID.
Error
Parameter
Required
Type
Description
SoftwareName
Yes
string
The name of the software making the request.
SoftwareVersion
Yes
string
The version of the software making the request.
Revision
Parameter
Type
Description
Valid Values
Result
char
The result of the API call. S represents success, E represents error.
S, E
RefNum
string
A unique request ID.
Error
Parameter
Required
Type
Description
SoftwareName
Yes
string
The name of the software making the request.
SoftwareVersion
Yes
string
The version of the software making the request.
CustomerId
Parameter
Type
Description
Valid Values
Result
char
The result of the API call. S represents success, E represents error.
S, E
RefNum
string
A unique request ID.
Error
Parameter
Required
Type
Description
SoftwareName
Yes
string
The name of the software making the request.
SoftwareVersion
Yes
string
The version of the software making the request.
CustomerId
Parameter
Type
Description
Valid Values
Result
char
The result of the API call. S represents success, E represents error.
S, E
RefNum
string
A unique request ID.
Error
Parameter
Required
Type
Default Value
Description
Valid Values
SoftwareName
Yes
string
The name of the software making the request.
SoftwareVersion
Yes
Parameter
Type
Description
Valid Values
Result
char
The result of the API call. S represents success, E represents error.
S, E
RefNum
string
A unique request ID.
Error
Parameter
Required
Type
Description
SoftwareName
Yes
string
The name of the software making the request.
SoftwareVersion
Yes
string
The version of the software making the request.
CustomerId
Parameter
Type
Description
Valid Values
Result
char
The result of the API call. S represents success, E represents error.
S, E
RefNum
string
A unique request ID.
Error
Parameter
Required
Type
Description
SoftwareName
Yes
string
The name of the software making the request.
SoftwareVersion
Yes
string
The version of the software making the request.
Revision
Parameter
Type
Description
Valid Values
Result
char
The result of the API call. S represents success, E represents an error.
S, E
RefNum
string
A unique request ID.
Error
Parameter
Required
Type
Description
SoftwareName
Yes
string
The name of the software making the request.
SoftwareVersion
Yes
string
The version of the software making the request.
PaymentMethodId
Parameter
Type
Description
Valid Values
Result
char
The result of the API call. S represents success, E represents error.
S, E
RefNum
string
A unique request ID.
Error
Parameter
Required
Type
Description
SoftwareName
Yes
string
The name of the software making the request.
SoftwareVersion
Yes
string
The version of the software making the request.
PaymentMethodId
Parameter
Type
Description
Valid Values
Result
char
The result of the API call. S represents success, E represents error.
S, E
RefNum
string
A unique request ID.
Error
Parameter
Required
Type
Default Value
Description
Valid Values
SoftwareName
Yes
string
The name of the software making the request.
SoftwareVersion
Yes
Parameter
Type
Description
Valid Values
Result
char
The result of the API call. S represents success, E represents error.
S, E
RefNum
string
A unique request ID.
Error
Parameter
Required
Type
Default Value
Description
Valid Values
SoftwareName
Yes
string
The name of the software making the request.
SoftwareVersion
Yes
Parameter
Type
Description
Valid Values
Result
char
The result of the API call. S represents success, E represents error.
S, E
RefNum
string
A unique request ID.
Error
Parameter
Required
Type
Default Value
Description
Valid Values
SoftwareName
Yes
string
The name of the software making the request.
SoftwareVersion
Yes
Parameter
Type
Description
Valid Values
Result
char
The result of the API call. S represents success, E represents error.
S, E
RefNum
string
A unique request ID.
Error
Parameter
Required
Type
Description
SoftwareName
Yes
string
The name of the software making the request.
SoftwareVersion
Yes
string
The version of the software making the request.
ScheduleId
Parameter
Type
Description
Valid Values
Result
char
The result of the API call. S represents success, E represents error.
S, E
RefNum
string
A unique request ID.
Error
Parameter
Required
Type
Description
SoftwareName
Yes
string
The name of the software making the request.
SoftwareVersion
Yes
string
The version of the software making the request.
ScheduleId
Parameter
Type
Description
Valid Values
Result
char
The result of the API call. S represents success, E represents error.
S, E
RefNum
string
A unique request ID.
Error
Parameter
Required
Type
Description
SoftwareName
Yes
string
The name of the software making the request.
SoftwareVersion
Yes
string
The version of the software making the request.
ScheduleId
Parameter
Type
Description
Valid Values
Result
char
The result of the API call. S represents success, E represents error.
S, E
RefNum
string
A unique request ID.
Error
Parameter
Required
Type
Description
SoftwareName
Yes
string
The name of the software making the request.
SoftwareVersion
Yes
string
The version of the software making the request.
ScheduleId
Parameter
Type
Description
Valid Values
Result
char
The result of the API call. S represents success, E represents error.
S, E
RefNum
string
A unique request ID.
Error
Parameter
Required
Type
Default Value
Description
Valid Values
SoftwareName
Yes
string
The name of the software making the request.
SoftwareVersion
Yes
Parameter
Type
Description
Valid Values
Result
char
The result of the API call. S represents success, E represents an error.
S, E
RefNum
string
A unique request ID.
Error
Parameter
Required
Type
Default Value
Description
Valid Values
SoftwareName
Yes
string
The name of the software making the request.
SoftwareVersion
Yes
Parameter
Type
Description
Valid Values
Result
char
The result of the API call. S represents success, E represents an error.
S, E
RefNum
string
A unique request ID.
Error
Parameter
Required
Type
Default Value
Description
SoftwareName
Yes
string
The name of the software making the request.
SoftwareVersion
Yes
string
Parameter
Type
Description
Valid Values
Result
char
The result of the API call. S represents success, E represents error.
S, E
RefNum
string
A unique request ID.
Error
Parameter
Required
Type
Description
SoftwareName
Yes
string
The name of the software making the request.
SoftwareVersion
Yes
string
The version of the software making the request.
RefNum
Parameter
Type
Description
Valid Values
Result
char
The result of the API call. S represents success, E represents error.
S, E
RefNum
string
A unique request ID.
Error
Parameter
Required
Type
Default Value
Description
Valid Values
SoftwareName
Yes
string
The name of the software making the request.
SoftwareVersion
Yes
Parameter
Type
Description
Valid Values
Result
char
The result of the API call. S represents success, E represents error.
S, E
RefNum
string
A unique request ID.
Error
Parameter
Required
Type
Description
SoftwareName
Yes
string
The name of the software making the request.
SoftwareVersion
Yes
string
The version of the software making the request.
Revision
Parameter
Type
Description
Valid Values
Result
char
The result of the API call. S represents success, E represents error.
S, E
RefNum
string
A unique request ID.
Error
Parameter
Required
Type
Description
SoftwareName
Yes
string
The name of the software making the request.
SoftwareVersion
Yes
string
The version of the software making the request.
Parameter
Type
Description
Valid Values
Result
char
The result of the API call. S represents success, E represents error.
S, E
RefNum
string
A unique request ID.
Error
Name
Type
Description
Valid Values
RuleType
string
The type of rule to create.
On, Nth
DayOfWeek
integer
The day of the week to run the schedule on.
1 - 7
DayOfMonth
No
string
Yes
string
Yes
string
Yes
string
string
string
Yes
string
Yes
string
Yes
string
Yes
string
string
string
string
string
string
string
Yes
string
Yes
string
Yes
string
Yes
string
string
string
string
string
The version of the software making the request.
string
Yes
string
string
string
Yes
string
string
integer
{
"SoftwareName" : "ACME Inc.",
"SoftwareVersion" : "1.0",
"CustomerNumber" : "123456",
"CustomerNotes" : "Vip Customer",
"Email" : "[email protected]",
"Fax" : "",
"BillFirstName" : "John",
"BillMiddleName" : "G",
"BillLastName" : "Doe",
"BillCompany" : "ACME Inc.",
"BillStreet" : "123 Main Street",
"BillStreet2" : "STE 1",
"BillCity" : "AnyTown",
"BillState" : "NY",
"BillCountry" : "USA",
"BillZip" : "11218",
"BillPhone" : "",
"BillMobile" : "",
"ShipFirstName" : "John",
"ShipMiddleName" : "G",
"ShipLastName" : "Doe",
"ShipCompany" : "ACME Inc.",
"ShipStreet" : "123 Main Street",
"ShipStreet2" : "STE 1",
"ShipCity" : "AnyTown",
"ShipState" : "NY",
"ShipCountry" : "USA",
"ShipZip" : "11218",
"ShipPhone" : "",
"ShipMobile" : "",
"ShipEmail" : "[email protected]",
"CustomerCustom01" : "MyCustomValue",
"CustomerCustom02" : "MyCustomValue2",
"CustomerCustom03" : "MyCustomValue3"{
"RefNum": "r1234567890",
"Result": "S",
"Error": "",
"CustomerId": "c1234567890"
}{
"SoftwareName" : "ACME Inc.",
"SoftwareVersion" : "1.0",
"Revision" : 1,
"CustomerId" : "c123456",
"CustomerNumber" : "123456",
"CustomerNotes" : "Vip Customer",
"Email" : "[email protected]",
"Fax" : "",
"BillFirstName" : "John",
"BillMiddleName" : "G",
"BillLastName" : "Doe",
"BillCompany" : "ACME Inc.",
"BillStreet" : "123 Main Street",
"BillStreet2" : "STE 1",
"BillCity" : "AnyTown",
"BillState" : "NY",
"BillCountry" : "USA",
"BillZip" : "11218",
"BillPhone" : "",
"BillMobile" : "",
"ShipFirstName" : "John",
"ShipMiddleName" : "G",
"ShipLastName" : "Doe",
"ShipCompany" : "ACME Inc.",
"ShipStreet" : "123 Main Street",
"ShipStreet2" : "STE 1",
"ShipCity" : "AnyTown",
"ShipState" : "NY",
"ShipCountry" : "USA",
"ShipZip" : "11218",
"ShipPhone" : "",
"ShipMobile" : "",
"ShipEmail" : "[email protected]",
"CustomerCustom01" : "MyCustomValue",
"CustomerCustom02" : "MyCustomValue2",
"CustomerCustom03" : "MyCustomValue3"
}{
"RefNum": "r1234567890",
"Result": "S",
"Error": ""
}{
"SoftwareName" : "ACME Inc.",
"SoftwareVersion" : "1.0",
"CustomerId" : "c1234567890",
"ShowDeleted" : false
}{
"RefNum": "r1234567890",
"Result": "S",
"Error": "",
"CustomerId": "c123456",
"Revision": 1,
"CustomerNotes": "Vip Customer",
"CustomerNumber": "123456",
"DefaultPaymentMethodId": "",
"CreatedDate": "2019-08-20 14:30:57.578",
"Email": "[email protected]",
"BillFirstName": "John",
"BillMiddleName": "G",
"BillLastName": "Doe",
"BillCompany": "ACME Inc.",
"BillStreet": "123 Main Street",
"BillStreet2": "STE 1",
"BillCity": "AnyTown",
"BillState": "NY",
"BillZip": "11218",
"BillCountry": "USA",
"ShipFirstName": "John",
"ShipMiddleName": "G",
"ShipLastName": "Doe",
"ShipCompany": "ACME Inc.",
"ShipStreet": "123 Main Street",
"ShipStreet2": "STE 1",
"ShipCity": "AnyTown",
"ShipState": "NY",
"ShipZip": "11218",
"ShipCountry": "USA",
"ShipEmail": "[email protected]",
"CustomerCustom01": "MyCustomValue",
"CustomerCustom02": "MyCustomValue2",
"CustomerCustom03": "MyCustomValue3"
}{
"SoftwareName" : "ACME Inc.",
"SoftwareVersion" : "1.0",
"CustomerId" : "c123456"
}{
"RefNum": "r1234567890",
"Result": "S",
"Error": ""
}{
"SoftwareName" : "ACME Inc.",
"SoftwareVersion" : "1.0",
"NextToken" : "",
"PageSize" : 500,
"Filters" : {
"BillFirstName" : "John",
"BillState" : "NY"
}
}{
"RefNum": "r1234567890",
"Result": "S",
"Error": "",
"Customers" : [
{
"CustomerId" : "c123456",
"Revision" : 1,
"BillFirstName" : "John",
"BillLastName" : "Doe",
"BillState" : "NY"
},
{
"CustomerId" : "c123457",
"Revision" : 1,
"BillFirstName" : "Johnathan",
"BillLastName" : "Doe",
"BillState" : "NY"
}
]
}{
"SoftwareName" : "ACME Inc.",
"SoftwareVersion" : "1.0",
"CustomerId" : "c123456",
"Token" : "pm4408q3327hq551h5h51058qh6n87mn",
"TokenType" : "cc",
"TokenAlias" : "",
"Exp" : "1220",
"Routing" : "",
"AccountType" : "",
"Name" : "",
"Street" : "",
"Zip" : "",
"SetAsDefault" : false
}{
"RefNum": "r1234567890",
"Result": "S",
"Error": "",
"PaymentMethodId": "c123456_pm123456
}{
"SoftwareName" : "ACME Inc.",
"SoftwareVersion" : "1.0",
"Revision" : 1,
"PaymentMethodId" : "c123456",
"TokenAlias" : "",
"Exp" : "1220",
"AccountType": "",
"Routing" : "",
"Name" : "",
"Street" : "",
"Zip" : "",
"SetAsDefault" : false
}{
"RefNum": "r1234567890",
"Result": "S",
"Error": ""
}{
"SoftwareName" : "ACME Inc.",
"SoftwareVersion" : "1.0",
"PaymentMethodId" : "c123456_pm123456",
"ShowDeleted" : false
}{
"RefNum": "r1234567890",
"Result": "S",
"Error": "",
"PaymentMethodId": "c12345678_pm12345678",
"Revision": 1,
"Token": "qfjjf12m4iimkldfvoijv9012frljl0a",
"TokenType": "cc",
"TokenAlias": "",
"Exp": "1220",
"AccountType": "checking",
"Issuer": "Visa",
"MaskedCardNumber": "4xxxxxxxxxxx1111",
"Name": "",
"Street": "",
"Zip": "",
"CreatedDate": "2019-01-01 00:00:00.000"
}{
"SoftwareName" : "ACME Inc.",
"SoftwareVersion" : "1.0",
"PaymentMethodId" : "c123456_pm123456"
}{
"RefNum": "r1234567890",
"Result": "S",
"Error": ""
}{
"SoftwareName" : "ACME Inc.",
"SoftwareVersion" : "1.0",
"NextToken" : "",
"PageSize" : 500,
"Filters" : {
"IsDeleted" : false
}
}{
"RefNum": "r1234567890",
"Result": "S",
"Error": "",
"PaymentMethods": [
{
"PaymentMethodId": "c123456_pm123456",
"Token": "ervb24g45fcr2gsdbsgbwxbtrgxt314",
"TokenType": "check",
"Street": "123",
"Zip": "08701",
"CreatedDate": "0001-01-01 12:00:AM",
"Revision": 1
},
{
"PaymentMethodId": "c123456_pm123457",
"Token": "mpq93n8519hq6pm29312m1n7mm3n7204",
"TokenType": "cc",
"CreatedDate": "0001-01-01 12:00:AM",
"Revision": 1
}
]
}{
"SoftwareName" : "ACME Inc.",
"SoftwareVersion" : "1.0",
"CustomerId" : "c123456",
"PaymentMethodId" : "c123456_pm654321",
"Amount" : "1.23",
"IntervalType" : "month",
"IntervalCount" : 1,
"ScheduleName" : "Sample Schedule",
"TotalPayments" : 5,
"SkipSaturdayAndHolidays" : false,
"AllowInitialTransactionToDecline" : false,
"CustReceipt" : false,
"Custom01" : "customValue1",
"Custom02" : "customValue2",
"Custom03" : "customValue3"
}{
"RefNum": "r1234567890",
"Result": "S",
"Error": "",
"ScheduleId" : "c123456_s123456"
}{
"SoftwareName" : "ACME Inc.",
"SoftwareVersion" : "1.0",
"ScheduleId" : "c123456_s123456",
"Amount" : "1.23",
"ScheduleName" : "Sample Schedule",
"PaymentMethodId" : "c123456_pm654321",
"TotalPayments" : 5,
"SkipSaturdayAndHolidays" : false,
"CustReceipts" : false,
"Custom01" : "customValue1",
"Custom02" : "customValue2",
"Custom03" : "customValue3"
}{
"RefNum": "r1234567890",
"Result": "S",
"Error": ""
}{
"SoftwareName" : "ACME Inc.",
"SoftwareVersion" : "1.0",
"ScheduleId" : "c123456_s123456"
}{
"RefNum": "r1234567890",
"Result": "S",
"Error": ""
}{
"SoftwareName" : "ACME Inc.",
"SoftwareVersion" : "1.0",
"ScheduleId" : "c123456_s123456"
}{
"RefNum": "r1234567890",
"Result": "S",
"Error": ""
}{
"SoftwareName" : "ACME Inc.",
"SoftwareVersion" : "1.0",
"ScheduleId" : "c123456_s123456"
}{
"RefNum": "r1234567890",
"Result": "S",
"Error": ""
}{
"SoftwareName" : "ACME Inc.",
"SoftwareVersion" : "1.0",
"ScheduleId" : "c123456_s123456",
"ShowDeleted" : false
}{
"RefNum" : "r1234567890",
"Result" : "S",
"Error" : "",
"Revision" : 1,
"ScheduleId" : "c123456_s123456",
"ScheduleName" : "Sample Schedule",
"CustomerId" : "c123456",
"PaymentMethodId": "c123456_p987654",
"IsDeleted" : false,
"UseDefaultCardOnly" : false,
"FailedTransactionRetryTimes": 5,
"DaysBetweenRetries" : 2,
"IntervalType" : "month",
"IntervalCount" : 12
"ScheduleRule" : {
"RuleType" : "Nth",
"N" : 1,
"NthOfType" : "Weekday"
}
"StartDate" : "2020-04-27",
"EndDate" : "2021-04-27",
"AllowInitialTransactionToDecline" : false,
"Description" : "Sample Schedule",
"Amount" : 1.23,
"TotalPayments" : 12,
"PaymentsProcessed" : 2,
"SkipSaturdayAndHolidays" : false,
"LastTransactionStatus" : "Approved",
"LastTransactionError" : ""
"LastProjectedPaymentDate" : "2021-04-27",
"Invoice" : "1234567",
"PONumber" : "1234567",
"CustReceipts" : false,
"NextScheduledRunTime" : "2020-06-27",
"InitialRunTime" : "2020-04-27 01:03:50",
"LastRunTime" : "2020-05-27 012:15:34",
"IsActive" : true,
"CalendarCulture" : "Gregorian",
"CreatedDate" : "2020-03-21 10:15:40",
"CustomerNumber" : "123456",
"Email" : "[email protected]",
"BillFirstName" : "John",
"BillMiddleName" : "G",
"BillLastName" : "Doe",
"BillCompany" : "ACME Inc.",
"AfterMaxRetriesAction" : "Disable",
"SplitInstruction": [
{
"xMid": "1234",
"xAmount": "1.10"
},
{
"xMid": "5678",
"xAmount": "0.13"
}
],
"Custom01" : "customValue1",
"Custom02" : "customValue2",
"Custom03" : "customValue3"
}{
"SoftwareName" : "ACME Inc.",
"SoftwareVersion" : "1.0",
"ScheduleId" : "c123456_s123456",
"NumberOfPayments" : 12,
"CalendarCulture" : "Gregorian",
"ShowDeleted" : false
}{
"RefNum": "r1234567890",
"Result": "S",
"Error": "",
"UpcomingPaymentDates" : [
"2020-01-01",
"2020-02-01",
"2020-03-01"
]
}{
"SoftwareName" : "ACME Inc.",
"SoftwareVersion" : "1.0",
"NextToken" : "",
"PageSize" : 500,
"Filters" : {
"IsDeleted" : false
}
}
{
"RefNum": "r1234567890",
"Result": "S",
"Error": "",
"Schedules" : [
{
"ScheduleId": "c123456_s123456",
"Revision": 5,
"CustomerId": "c123456",
"FailedTransactionRetryTimes": 5,
"StartDate": "2018-04-27",
"Amount": 0.03,
"TotalPayments": 3,
"PaymentsProcessed": 2,
"IntervalType": "Day",
"IntervalCount": 1,
"LastTransactionStatus": "Approved",
"LastProjectedPaymentDate": "2019-05-16",
"InitialRunTime": "2019-05-16 01:03:50",
"LastRunTime": "2019-06-19 01:03:48",
"CalendarCulture": "Gregorian",
"CreatedDate": "2018-04-26 16:33:27.571",
"CustomerNumber": "1",
"BillFirstName": "John",
"BillLastName": "Smith",
"BillCompany": "ACME Inc.",
"SplitInstruction": [
{
"xMid": "1234",
"xAmount": "1.10"
},
{
"xMid": "5678",
"xAmount": "0.13"
}
]
}
]
}{
"SoftwareName" : "ACME Inc.",
"SoftwareVersion" : "1.0",
"PaymentMethodId" : "c123456_pm123456",
"Amount" : 1.23,
"PaymentDetails" : null,
"UseBackupPaymentMethods" : false,
"Invoice" : "1234567",
"PONumber" : "1234567",
"Description" : "Sample One Time Transaction",
"AllowDuplicates" : false,
"Cvv" : "123",
"BillStreet" : "123 Main St.",
"splitinstruction":[
{
"xmid":53141,
"xamount":1.01
},
{
"xmid":53138,
"xamount":0.01
}
]
}{
"RefNum": "r1234567890",
"Result": "S",
"Error": "",
"GatewayRefnum" : "1234567890"
"GatewayStatus" : "Approved",
"GatewayErrorMessage" : ""
}{
"SoftwareName" : "ACME Inc.",
"SoftwareVersion" : "1.0",
"RefNum" : "c123456_s123456_t123456"
}{
"RefNum": "r1234567890",
"Result": "S",
"Error": "",
"TransactionId": "c123456_s123456_t123456",
"ScheduleId": "c123456_s123456",
"CustomerId": "c123456",
"PaymentMethodId": "c123456_pm123456",
"TransactionDate": "2019-08-02 15:06:57",
"GatewayRefNum": "1234567890",
"GatewayStatus": "Approved",
"GatewayError": ""
}{
"SoftwareName" : "ACME Inc.",
"SoftwareVersion" : "1.0",
"NextToken" : "",
"PageSize" : 500,
"Filters" : {
"IsApproved" : true
}
}{
"RefNum": "r1234567890",
"Result": "S",
"Error": "",
"Transactions" : [
{
"TransactionId": "c123456_s123456_t123456",
"ScheduleId": "c123456_s123456",
"CustomerId": "c123456",
"PaymentMethodId": "c123456_pm123456",
"TransactionDate": "2019-08-02 15:06:57",
"GatewayRefNum": "1234567890",
"GatewayStatus": "Approved"
},
{
"TransactionId": "c123456_s123456_t123456",
"ScheduleId": "c123456_s123456",
"CustomerId": "c123456",
"PaymentMethodId": "c123456_pm123456",
"TransactionDate": "2019-08-07 16:34:16",
"GatewayRefNum": "1234567891",
"GatewayStatus": "Approved"
},
]
}{
"SoftwareName" : "ACME Inc.",
"SoftwareVersion" : "1.0",
"Revision" : 1,
"ScheduleReportSettings" : {
"Enabled" : true,
"EmailAddresses" : [
"[email protected]",
"[email protected]"
],
"ShowDetails" : true
},
"MaxRetriesReachedNotification" : {
"Enabled" : true,
"EmailAddresses" : [
"[email protected]",
"[email protected]"
]
}
}{
"RefNum": "r1234567890",
"Result": "S",
"Error": ""
}{
"RefNum": "r1234567890",
"Result": "S",
"Error": "",
"ScheduleReportSettings" : {
"Enabled" : true,
"EmailAddresses" : [
"[email protected]",
"[email protected]"
],
"ShowDetails" : true
},
"MaxRetriesReachedNotification" : {
"Enabled" : true,
"EmailAddresses" : [
"[email protected]",
"[email protected]"
]
}
}{
"IntervalType" : "Month",
"IntervalCount" : 3,
"ScheduleRule" : {
"RuleType" : "Nth",
"N" : 1,
"NthOfType" : "Weekday"
}
}{
"IntervalType" : "Year",
"IntervalCount" : 1,
"ScheduleRule" : {
"RuleType" : "On",
"DayOfMonth" : 1,
"MonthOfYear" : 1
}
}{
"IntervalType" : "Week",
"IntervalCount" : 2,
"ScheduleRule" : {
"RuleType" : "On",
"DayOfWeek" : 2
}
}BillName
BillFirstName
BillLastName
BillMiddleName
BillCompany
BillStreet
BillStreet2
BillCity
BillState
BillZip
BillCountry
BillPhoneNumber
BillPhone
BillMobile
BillFax
Token
TokenType
TokenAlias
IntervalCount
CustomerId
ScheduleId
BillFirstName
BillMiddleName
BillLastName
BillName
BillCompany
CustomerNumber
ScheduleName
Description
IntervalType
StartDate
PaymentsRemaining
CustomerId
ScheduleId
PaymentMethodId
TransactionId