Only this pageAll pages
Powered by GitBook
1 of 77

Sola

Loading...

API

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

SDK

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Products

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Mobile Wallets

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Plugins

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Articles

Loading...

Loading...

Loading...

Loading...

Donor-Advised Funds (DAF)

Donor-Advised Funds (DAF)

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.


Recommendation

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.


Void

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.

3DS

Transactions

3DS Verify

Paths/Formats:

  • /verify for form data

  • /verifyjson for JSON data

The Verify path is used after a 3DS Step-Up Authentication. See how to implement 3ds on the client side.

Request Body

Response Example

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]

iFields
{
  "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"
}

Transaction API

Overview

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.

How to Generate Sola Keys

  1. Sign in to the Sola Merchant Portal.

  2. Select "Account Settings" from the navigation bar.

  3. Select "Keys" from the sub-menu.

  4. 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.

iFields and Transaction API

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.

Cross-Origin Resource Sharing (CORS) Restrictions

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.

Endpoints

The endpoint section defines the details for accessing and interacting with the Sola transaction API.

Health Check

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

Transactions

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

x1 is the primary environment, with x2 and b1 as backups. The x2 and b1 environments have all resources necessary to operate independently of the other primary location.

Transaction Types

The endpoints can be found in the following child pages by navigating to the appropriate page:

Transactions

Transaction Type
Transaction (Link)
xCommand

Questions

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.

  • Fraud

    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

    Credit Card

    Sale

    cc:sale

    AuthOnly

    cc:authonly

    Capture

    cc:capture

    Click here
    Credit Card
    Check (ACH)
    EBT
    Gift Card
    [email protected]

    Adjust
    Save
    AVS Only
    PostAuth
    Credit
    Refund
    VoidRefund
    VoidRelease
    Void
    Check (ACH)
    Sale
    Credit
    Save
    Void
    Refund
    Check (ACH-Q)
    VoidRefund
    EBT Food Stamp
    Sale
    Credit
    Balance
    Voucher
    EBT Cash Benefits
    Sale
    Cash
    Balance
    EBT Wic (eWic)
    Sale
    Balance
    Void
    Gift Card
    Issue
    Redeem
    Balance
    Activate
    Deactivate
    Fraud
    Fraud Submit

    Introduction

    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.

    How to Integrate with Sola Payments

    iFields &

    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.

    Card-on-File & Recurring Payments

    Store in Your System

    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.

    Card Present Payments

    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

    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.

    Credentials

    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.

    Best practices

    • 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

    Vendor Settings (optional)

    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.

    Setup

    Our support team can enable your vendor account and provide you with the ID.

    Usage

    To use Vendor settings, include the xVendorID = {yourvendorid} in the transactions request.

    Features/Benefits

    iFields key: Use a single iFields key across all your accounts.

    Tokenization: Tokens can be used across accounts.

    Licenses: Unlimited device licenses

    Tokenization

    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.

    Note: The 3 or 4 digit CVV number is never stored on Sola servers as per PCI regulations, and in extension, is not associated with tokens. CVV data is only used when processing initial transactions where the cardholder is generating the transaction with their physical card in hand.

    Tokens can be used only on the account it was generated on unless linked to another account via cross tokenization

    You can request account linking for tokenization via .

    The best practice is to generate tokens on one account and link all other accounts to your first account instead of generating tokens for each.

    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.

    Duplicate Handling

    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.

    By default, you can set it up to 1440 (24 Hours) max. Your account can be set to allow up to 43200 (30 Days) via .

    Batches

    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.

    Response Parameters

    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.

    Sandbox Account Testing Info and Triggers

    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

    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.

    Card Type
    Card Number

    Triggers

    xAmount
    Response

    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.

    When submitting transaction requests to the Sola gateway, it is highly recommended to log the full request and response, including both the content body and headers. By logging this information, you ensure that critical details are readily available. In the event of any questions or troubleshooting needs, providing this information to the Sola support team will significantly reduce the time required to assist you or resolve the issue.
  • 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

    Account Number
    Routing Number

    999999999

    021000021 (any valid routing number)

    (AllowPartialAuth must be set to True)

    xAmount

    AuthAmount

    7.5

    1.5

    7.23

    1.23

    xAmount
    Behavior
    Response

    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

    Transaction API
    Tokens
    Customer & Recurring API
    CloudIM API
    PayFac API
    sandbox
    here
    PCI-compliance scope
    Support
    Support
    Self-certification Guide

    Error code

    370276000431054

    Gateway Error

    111

    Fraud

    Overview

    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.

    Transactions

    Fraud Submit

    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.

    Request Body

    Name
    Type
    Description

    Account Boarding Swagger UI

    For general information about using Swagger UI, refer to .

    Swagger URL

    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

    See All Error Codes

    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

    Fraud Submit - Request Payload Example
    { 
        "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" 
    }
    Using Swagger UI
    • Only sandbox keys may be used when submitting accounts

    • The Signature.Token field is not required

    this documentation
    Swagger UI

    Set up Apple Pay Merchant ID with Sola

    Setting up Apple Pay Merchant ID

    1. Login to https://portal.solapayments.com/login

    2. Navigate to Gateway Settings > Payment Methods

    3. Click on “Configure Apple Pay“

    Apple Pay Hosted Checkout

    Overview

    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.

    Gateway Emulators

    Overview

    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.

    Authorize.net (AIM)

    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

    Please note that we only emulate the AIM method.

    Split Your Key:

    Split your key by using the tool here.

    USAePay

    Endpoint URL: https://x1.cardknox.com/gate

    Use your Cardknox key as the UMkey.

    PayTrace

    Endpoint URL: https://x1.cardknox.com/paytrace

    What's New

    We now support Address Validation and Recurring/Deferred Payments and Subscriptions. For more info about Apple Pay Features please click the link.

    Apple Pay Hosted Checkout Resources

    The following pages can be found by viewing the navigation bar on the left side of the screen.

    • Initial Setup

    • Hosted Checkout Sample Code

    • iFields Integration

    • Hosted Checkout Request Objects

    Questions?

    Contact [email protected]

    Check (ACH)

    Overview

    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.

    Transactions

    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.

    Sale

    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.

    Request Body

    Name
    Type
    Description

    Save

    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.

    Request Body

    Name
    Type
    Description

    Adjust

    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.

    Request Body

    Void

    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.

    Request Body

    Name
    Type
    Description

    Refund

    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.

    Request Body

    Name
    Type
    Description

    VoidRefund

    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.

    Request Body

    Name
    Type
    Description

    Check (ACH) FAQ

    Q: How many days does it take to get the ACH status?

    A: It typically takes 2-3 days.

    Q: How can I get the ACH status?

    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.

    Q: What verbiage comes back from the ACH Status?

    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.

    Q: Can we get back a token when using the check MICR?

    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.

    3D Secure 2.0

    Overview

    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.

    Contents

    Click-To-Pay - Hosted Checkout

    Overview

    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.

    Flow

    There are three possible scenario:

    1. New User In this case Click-To-Pay Experience will be presented as a button

    2. Recognized User Consumer’s cards will be displayed

    3. Recognized Device An email screen to identify the consumer and load his cards

    Click-To-Pay Resources

    The following pages can be found by viewing the navigation bar on the left side of the screen.

    Apple Pay Features

    Overview

    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+

    Available Features

    • 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

    Deep Linking Integration for Third-Party Websites

    The following files need to be publicly accessible on the third-party’s website:

    Android

    • Host a publicly accessible file named assetlinks.json on the /well-known/assetlinks.json route with the following content:

    iOS

    • 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

    QR Codes for PaymentSITE

    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.

    The QR code will be returned as base64 and can be converted to an image file.

    Frequently Asked Questions

    Question: Is there a way to specify that only numbers can be entered into a credit card number field or a CVV iFields field? Or can the system generate an error message if the format is not valid?

    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.

    Card Present Integration Guide

    Payment Engine .NET SDK

    Supported Devices: All Sola-supported devices

    Benefits:

    • Seamless integration with all Sola-supported devices.

    Google Pay FAQ

    Q: Can I run Test transactions with Google Pay?

    A: Yes, just follow these steps:

    1. Setup your Google Pay Wallet with your real card

    Question: How do I obtain an API key?

    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.

    Question: What devices are supported for in-store payments?

    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.

    Question: How do I close a batch so I can get funded?

    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.

    Question: When integrating with the Sola transaction API, how can I ensure that the customer receives a receipt of the transaction details when they place an order on a merchant’s website?

    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.

    Question: Does Sola support Magento 2?

    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.

    Question: Does Sola support Magento 1?

    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.

    Question: What is the Sola mobile app?

    Answer: Sola Mobile is an app you can download to your mobile device to securely accept credit card transactions on your Sola account.

    Android App iOS App

    Question: Does the Sola mobile app work with an external credit card device?

    Answer: No, not at this time. We are working toward achieving this goal in 2024.

    Question: What is Sola iFields?

    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.

    Question: Does Sola support contactless payments?

    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.

    Q: What’s the maximum allowed amount for the Test transaction

    A: The maximum amount for test transaction allowed by Sola is $10

    Hosted Checkout Response Objects
    Apple Pay Features
    Client Side Integration
    Client Side Integration (Non-iFields)
    3DS Verify Transaction
    Server Side Integration
    Limitations:
    • Only compatible with Windows operating systems.

    BBPOS

    BBPOS

    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.

    Cloud IM

    CloudIM Developer Guide | Cardknox

    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.

    API + Keyboard Emulator

    Transaction API

    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

    Payment Engine SDK

    Response Objects

    Initial Setup
    Sample Code
    iFields Integration
    Request Objects

    Account Updater

    Overview

    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.

    Recurring Billing

    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.

    Reporting

    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

    Apple Pay Guidelines
    ApplePayRequest
    Available Features
     [
       {
          "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_validation
    APRequiredFeatures.support_recurring
    APRequiredFeatures.support_subscription
    initAP: 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.

    14 (Chargeback)
  • 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

    Developer Page

    xAmount*

    EndPoints

    /CREATE

    Create a QR code for merchants Sola/Cardknox PaymentSITEs

    API URLs

    Type

    URL

    Test

    Production

    API Details

    URL

    Type

    GET

    Parameters

    • URL (required)

      • This is expecting a [paymentSITE name] URL

    Sample Request

    /create??[xfield=value]&[xfield=value]

    Google Pay Control Object

    window.ckGooglePay object - controls initialization of Google Pay button.

    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

    EnableGooglePayParams Object

    Enable Google Pay example

    WooCommerce

    Overview

    Our WooCommerce plugin is an easy integration that allows users to accept payments online through their WooCommerce online site.

    Customer Usage

    New transaction:

    1. Go to the checkout page.

    2. Select Credit Card (or the title that was specified for Sola in the settings page).

    New card:

    1. Select "use a new payment method."

    2. Enter the card data.

    3. Select "save to account" if you would like to save the card for future use.

    Card on file:

    1. Select the card you would like to use.

    2. Select "place order."

    Add payment method (card on file):

    1. Select my account > payment methods.

    2. Click "add payment method."

    3. Enter card data.

    4. Click "add payment method."

    Add payment method image:

    Delete payment method:

    1. Select my account > payment methods.

    2. Click "delete" on the right of the payment method.

    Delete payment method:

    New subscription:

    1. Select subscription item.

    2. Pay the same as with a regular transaction.

    Change subscription:

    1. Go to my account > select subscriptions.

    2. Click "view" on the subscription.

    3. Apply modifications.

    Edit subscription image:

    Merchant

    Refund a transaction:

    This will refund the transaction. You can specify the amount to refund. Refund images:

    Change order status from on hold to processing:

    If the plugin is set to not capture the transaction, this will capture the transaction.

    Change order status from on hold to completed:

    If the plugin is set to not capture the transaction, this will capture the transaction.

    Change order status from on hold to canceled:

    If the order is not yet captured, this will void the auth only transaction.

    Change order status from on hold to refunded:

    If the order is not yet captured, this will void the auth only transaction.

    Change order status image:

    Recurring / Subscriptions:

    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.

    Magento Plugin

    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.

    Installation

    NetSuite Features and Demo

    Overview

    Our plugin is a NetSuite bundle that lets you use the Sola gateway to accept integrated payments with NetSuite. It also allows you to securely store payment methods for future transactions.

    Sola currently does not support the following NetSuite integrations:

    • SCA (NS eComm shopping cart)

    Android SDK - Technical Guide

    Overview

    This document helps developers to integrate the Cardknox Payments SDK with an Android app project using the gradle build system.

    Technical Overview

    Sale - Request Payload Example
    {
        "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"
    }
    Save - Request Payload Example
    {
        "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"
    }
    Adjust - Request Payload
    {
        "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"
    }
    200 - Response
    {
    "xResult": "A",
    "xStatus": "Approved",
    "xError": "",
    "xErrorCode": "00000",
    "xRefNum": "10000016879",
    "xInvoice": "1234567",
    "xRefNumCurrent": "10000016886",
    "xDate": "7/11/2022 4:06:11 PM"
    }
    Void - Request Payload Example
    {
        "xKey": "[xkeycredentials]",
        "xVersion": "4.5.9",
        "xSoftwareName": "YourSoftwareName",
        "xSoftwareVersion": "1.0.0",
        "xCommand": "check.void",
        "xCustom01": "Register01",
        "xRefNum": "81726356",
        "xIP": "1.1.1.1"
    }
    Refund - Request Payload Example
    {
        "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"
    }
    see list of all supported currencies
    https://xeubhm6lhd.execute-api.us-west-2.amazonaws.com/Prod
    us-east-2.qr.cardknox.com
    us-east-2.qr.cardknox.com/create
    secure.cardknox.com/
    us-east-2.qr.cardknox.com
    url=secure.cardknox.com/demo

    SCIS (NS Retail)

    Prerequisites

    1. Create an account with Sola (live or sandbox).

    2. Obtain your token and transaction key.

    3. Request a NetSuite license (create a sandbox account here).

    4. Provide Sola with your NetSuite ID ([email protected]). Sola will share the bundle with you.

    Installation

    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:

    FAQs

    Q: How do I add credit card information and save it?

    A: To store a customer’s credit card with their record:

    1. Open the customer record and click the Transactions tab.

    2. In the Payments section, click the plus sign ( + ) next to the PE Store Payment field.

    3. On the PE Stored Payment pop-up, fill in the required fields.

    4. Click the Save button on the pop-up to save and close the pop-up.

    5. Select the PE Get Authorization checkbox.

    6. 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:

    1. Open the customer record and click the Transactions tab.

    2. In the Items section, add as many items as necessary.

    3. In the Payment section, type in the credit card information.

    4. Select the PE Get Authorization checkbox.

    5. 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."

    6. Click the Approve button. The system displays the message "Pending Fulfillment."

    7. Click the Fulfill button. The system displays the Item Fulfillment screen.

    8. 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.

    9. Click the Bill button. The system displays the Cash Sale screen.

    10. 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:

    1. Open the customer record and click the Transactions tab.

    2. In the Items section, add as many items as necessary.

    3. In the Billing section, enter information in the following fields - Payment Method - Expires - Name on Card

    4. Type the card number into the PE Credit Card Number field.

    5. 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:

    1. Open the Customer Deposit screen.

    2. In the Customer field, choose the customer.

    3. Type in an amount in the Payment Amount field.

    4. In the PE Stored Payment field, select the payment method.

    5. 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:

    1. Open the invoice for which you will accept payment.

    2. Click the Accept button. NetSuite opens the Payment screen.

    3. Scroll down to the Payment Method section.

    4. In the PE Payment Method field, select the payment method.

    5. 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:

    2MB
    Customer Payment.mp4
    Open
    Customer Payment Video
    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 - 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)

    Click-To-Pay Sample Code

    1. Let's define a helper object with all necessary components:

    2. 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
        });
      .....
      }
    3. 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

    Install the plugin from https://marketplace.magento.com/cardknox-cardknox.html .

    Install the Sola Plugin

    To install the Sola plugin:

    1. Unzip the folder to app/code/CardknoxDevelopment/Cardknox (create the directories if needed)

    2. Run the below commands in the Magento root directory (bash).

    If you are using versions 2.0 – 2.1, contact cardknox for a compatible version. For 2.1.0 - 2.1.3, comment out lines 278 – 282 in Cardknox/etc/di.xml. On higher versions, no changes are needed.

    Enable the module

    Optionally flush the cache

    Setup

    Navigate to Stores > Configuration > Payment Methods > Sola which will bring you to the configuration page (see below).

    Configuration Options

    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.

    If you do not have a key, you can obtain it by signing into your account in the Sola portal and navigating to Key Management.

    Sola Google Pay

    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.

    Sola Apple Pay

    Please complete the Apple Pay Domain Registration here prior to enabling Cardknox Apple Pay

    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

    Usage

    New Order

    Select Credit Card as the payment method in the Payment & Shipping Information section (see Title in the Configuration Options section of this document).

    Capture

    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.

    Void

    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.

    Cancel

    Use Cancel to void an un-captured transaction and cancel the associated order.

    Credit Memo

    Issue a Credit Memo to refund an order that has already been invoiced.

    Retrieving Sola Reference Number

    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

  • Getting started

    To start:

    1. 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

    2. Provide the androidx.cardview dependency either explicitly or as a transitive dependency of some other package, such as com.google.android.material

    LogCat logging

    To capture the SDK Logcat logs, filter with the following tag:

    • (Cardknox_DroidSDKLogger|IDT_Event)

    Transaction Workflow

    Language C#

    Transaction Types

    cc:sale

    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.

    cc:sale (in scope)

    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.

    cc:void

    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.

    cc:refund

    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.

    cc:credit

    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.

    cc:authonly

    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.

    cc:capture

    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.

    GetSignature

    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.

    Device_ShowWelcomeScreen

    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.

    ebtfs:sale

    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.

    ebtfs:credit

    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.

    ebtfs:balance

    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.

    Device_ShowItems

    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.

    cc:encrypt

    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.

    Click-To-Pay Objects Reference (Response)

    Response objects


    ClickToPayResponse Object


    ClickToPayPayload Object


    ClickToPayResponse object example

    Account Boarding Merchant Agreement

    Overview


    In order to be boarded every Merchant needs to agree to Go Plus Terms and Conditions. To help Developers integrate Agreement API into their website we are supporting Agreement API through Sola iFields.

    PaymentSITE

    Overview

    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.

    RMH (Retail Management Hero)

    Setup

    • Download the Updater.

    • When prompted for program name, enter “PaymentEngineRMH”

    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:deploy
    php bin/magento cache:clean
    php bin/magento cache:flush
    CardknoxPaymentsSDK aar registration
    dependencies {
      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

    Sola support
    Sola support
    Sola support

    PaymentSITE use requires initial sign-up. To get more information or sign-up, contact support.

    Getting started

    Transaction types

    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

    Implementation

    Initiation methods

    Redirect

    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.

    iFrame

    When the user is ready to pay, the PaymentSite is opened in an iFrame in the merchants system.

    Pre-populate fields

    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

    Note: The merchant can log into the Cardknox portal to control what fields are available on the page. If you try to pre populate a field that is not added to the page, the system will just ignore it.

    Here is a list of specific settings fields that can be set in the query string in addition to the above.

    Settings

    Name
    Description

    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.

    Accounts need a setting enabled by a Cardknox Support Team member to use the xPostUrl field.

    Response methods

    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

    1. Set the Redirect URL in the Cardknox PaymentSite backend settings

    2. 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:

    1. Utilize account webhooks to receive webhooks for any transaction that is processed on an account

    2. Set the webhook URL in the Sola PaymentSite backend settings

    3. Set the xPostUrl the parameter in the query string when directing the user to the PaymentSITE.

    To set an xPostUrl, please note that you need to contact Gateway Support to enable the setting for this method to function correctly.

    iFields
    Transaction API
    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

    Integrate Agreement API using ifields

    Obtain your iFields xKey from your Sola Partner Portal account settings.

    Adding Reference to iFields


    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>

    Adding iFrame and JavaScript Objects for Merchant Agreement


    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:

    Objects Reference


    iStatus

    Agreement Response

    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.

  • Custom Buttons

    • In the POS Manager Setup > Hardware > Custom POS Buttons

    • For Settings Management, add a custom button with the following information:

      1. Style : Internal Command

      2. Caption : Settings

      3. 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:

      1. Style: Internal Command

      2. Caption: Gift Balance

      3. Command: CustomActionCommand "giftcardgetbalancee62227dd-ee9b-41b0-8390-161226f95436"

    EBT

    Step 1: Configure or create EBTFS and EBTCB as tender types

    EBT Tender

    1. Open the store Store Operations Manager and go to Financial > Tender Types.

    2. 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:

      1. Click New

      2. Set Description: “EBT Food Stamp”

      3. Set Tender Code: EBTFS

    3. For tender type, select “Food Stamp”

    EBT Cash Tender

    1. Open the store Store Operations Manager and go to Financial > Tender Types.

    2. 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:

      1. Click New

      2. Set Description: “EBT Cash Benefit”

      3. Set Tender Code: EBTCB

    3. 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:

    1. Style: Internal Command

    2. Caption: EBT Balance

    3. Command: CustomActionCommand ebtBalance_0586D912-FC34-401B-A55E-0B977C7F47B0

    To enable the saved card feature, open the Sola settings >> RMH settings and choose Enable Tokenization.

    To enable Device Display Items, open the Sola settings >> RMH settings and choose Device Display Items.

    Receipts

    Viewing Receipt Information

    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.

    Displaying additional data such as Balance, AuthCode for EBT, EBTCS, Gift

    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.

    https://cdn.cardknox.com/dl/updater.exe

    Batch Processing

    Overview

    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.

    Conventions

    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.

    Batch Upload Lifecycle

    Request

    1. Client uploads Request/REQUEST_X.KVP

    2. Client uploads Request/PROCESS_X.KVP

    3. Batch process is triggered when Request/PROCESS_X.KVP is received

    Response

    1. Gateway saves Response/RESPONSE_X.KVP

    2. Gateway saves Response/COMPLETE_X.KVP

    3. Client polls and parses Response/COMPLETE_X.KVP

    4. If xStatus=Success, then client downloads and parses Response/RESPONSE_X.KVP

    File Formats

    Request Data File

    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

    Request Metadata File

    Filename Format: PROCESS_X.KVP Required Variables:

    File Formats

    Response Data File

    Filename Format: RESPONSE_X.KVP

    • Each line contains an individual response in KVP format.

    Required Variables:

    File Formats

    Response Metadata File

    Filename Format: COMPLETE_X.KVP

    Required Variables:

    iOS SDK - Technical Guide

    Overview

    This document helps developers to set up and integrate Cardknox Payments SDK into Swift projects. The document contains steps for framework integration, required settings setup and import of SDK headers.

    Technical Overview

    Apple Pay Prerequisites

    1. Create a Merchant ID.

      1. Navigate to .

      2. Click on Identifiers.

    Webhooks

    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
    }
    ClickToPayPayload
    iStatus
  • 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

    Webhook PIN

    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.

    1. URL Decode Data: URL decode the webhook data.

    2. Normalize Key Case: Convert all parameter keys to lowercase to ensure case-insensitive sorting.

    3. Sort Data Alphabetically: Sort the parameters alphabetically by their keys.

    4. Extract Values: Extract the values from the sorted parameters.

    5. Concatenate Values with PIN: Combine the extracted values with the webhook pin at the end.

    6. Hash Concatenated String Using MD5: Apply the MD5 hashing algorithm to the concatenated string.

    Pin Rules

    1. The pin can only be AlphaNumeric

    2. The pin must be at least 15 characters long

    Form values

    xEnteredDate

    9/3/2021 9:28:22 AM

    xRefNum

    506918667

    Response Parameters
    optional pin
    Sola Portal

    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+Support
  • The 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

  • Framework File Integration

    1. Obtain and place the downloaded .framework file to the root of your project (for example, alongside the xcodeproj file):

    2. 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.

    3. + 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....

    4. Add files... opens Choose frameworks and libraries to add dialog. On dialog find the root folder of the project and select CardknoxPaymentsSDK.framework file.

    5. 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.

    6. 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.

    SkiaSharp dependency

    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.

    Required Settings Setup

    Disabling Bitcode

    The Cardknox SDK doesn’t support bitcode. To disable Bitcode, follow these steps:

    1. Click on your application target. Choose Build Settings > All

    2. Set the Enable Bitcode option to No in the Build Options section

    Info.plist merge

    1. 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"

    2. The application that is using the CardknoxPaymentsSDK framework also defines an Info.plist file with its own key/value pairs

    3. 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.

    4. 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

    5. 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

    1. 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”.

    2. 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.

    3. Define a new Run Script phase for your application Target in XCode

    4. Input the following code:

    CardknoxPaymentsSDK headers import

    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:

    1. 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

    2. Clear all text in the header file

    3. Add #import "CardknoxPaymentsSDK/CardknoxPaymentsSDK.h" into the header file.

    4. Navigate to your target’s Build Settings > All.

    5. 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.

    1. If you are not using Apple Pay on the Web, skip this step.

    2. On Apple Developer Page, under the list of merchants, click on the one you just created.

    3. Scroll down to Merchant Domains and click Add Domain.

    4. Follow the instructions to register your domain.

  • Generate Merchant ID Certificate.

    1. Navigate to your Sola Merchant Portal

    2. Open AccountSettings > Payment Methods > Configure Apple Pay

    3. Click Register for Apple Pay using your own Certificate

    4. Download csr file and generate Merchant Certificate based on that csr.

    5. Click Download Certificate from Apple and save it locally

  • Create an Apple Pay Payment Processing Certificate.

    1. Continue on Merchant Portal by uploading Merchant Certificate from Apple.

    2. Download Payment Processing csr

    3. Under Apple Pay Payment Processing Certificate, click on Create Certificate.

    4. Click on Choose File, select CSR file and continue.

  • You are now ready to process Apple Pay transactions!

  • FAQs

    Q: What Apple Pay related fields are necessary to be sent on a gateway transaction request? A:

    1. xCardNum containing a base-64 encoded ApplePay encrypted token block (paymentData.data)

    1. 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.

    Apple Developer Page

    Apple Pay Hosted Checkout Objects Reference (Response)

    Response objects

    For the Full Response example click here


    ApplePayload Object


    PaymentToken Object

    paymentData use example


    PaymentComplete Object

    An object returned from onPaymentAuthorize ajax call - typically a Gateway Response An example of PaymentComplete Response returned by iFields is below:

    Netsuite

    Overview

    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.

    Note: Only NetSuite administrators can install this bundle.

    Bundle Components

    Install the Bundle

    Prerequisites:

    • 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.

    Installation:

    1. Navigate to Customization > Suite Bundler > Search & Install Bundles.

    2. Search and install the ‘xPayment’ bundle (you can also install ‘xPayment Beta’ for additional features).

    Setup

    Configure Account Settings:

    1. 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.

    Form Setup

    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.

    Use the Bundle

    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

    1. In the customer record, select Financials > PE Stored Card.

    2. 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.

    Miscellaneous

    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:

    1. 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.

    Update the Bundle

    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.

    Uninstall the Bundle

    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.

    Split Capture

    Overview

    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.

    Transaction Flow

    CC:AuthOnly Transaction

    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.

    Transaction Incoming Fields (Specific to AuthOnly Transactions)

    [Optional] flag to require that authorization is able to be split captured before processing the authorization

    CC:SplitCapture Transaction

    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).

    Transaction Incoming Fields (Specific to Split Capture Transactions)

    Reference number of the authonly transaction.

    Follow Up Transactions

    Closing an 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.

    Voids

    • 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.

    Refunds

    • 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.

    Reporting

    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.

    Click-To-Pay iFields Integration

    How to Build POS Integration Flows

    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.

    Credit Card Processing Flow 1

    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."

  • “Split capture cannot be voided. Issue refund."
    Once the authonly has been split captured, refund would be blocked.
    • “Refund not allowed. Issue refund on split capture transaction.”

  • Refunding a split capture transaction:

  • 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.

    here

    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

    PaymentContact

    No

    Contains all transaction data. For more details please click on the link.

    shippingContact

    PaymentContact

    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

    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 Token Key: iFields key
  • 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 Merchant Account needs at least View rights (Role > Permissions > Custom Record).
  • 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).

    [email protected]

    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.

  • Credit Card Processing Flow 2

    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.

    1. The POS software communicates the intended transaction to Payment Engine.

    2. Payment Engine communicates the intended transaction to the credit card device.

    3. The credit card device prompts the user for their card information.

    4. The credit card device transfers transaction data to the Cardknox gateway.

    5. The Cardknox gateway transfers transaction data to the bank for processing.

    6. The bank communicates the transaction response (approval or decline) to the Cardknox gateway.

    7. The Cardknox gateway communicates the bank’s transaction response to the credit card device.

    8. The credit card device communicates the bank’s transaction response to Payment Engine.

    9. Payment Engine communicates the bank’s transaction response to the POS software.

    Credit Card Processing Flow 3

    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.

    1. The POS software communicates the intended transaction to Payment Engine.

    2. Payment Engine communicates the intended transaction to the credit card device.

    3. The credit card device prompts the user for their card information.

    4. The credit card device transfers transaction data to the bank for processing.

    5. The bank communicates the transaction response (approval or decline) to the credit card device.

    6. The credit card device provides the bank’s transaction response to Payment Engine.

    7. Payment Engine communicates the bank's transaction response to the POS software.

    8. Payment Engine notifies the Sola gateway of the transaction so that the data is recorded in the Merchant’s Sola account.

    Ways to Integrate – Considerations

    SDK (Payment Engine)

    Payment Engine SDK

    Supported devices:

    • All Sola supported devices

    Benefits:

    • Supports all Sola devices

    Limitations:

    • Only supported on Windows

    BBPOS

    BBPOS

    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

    API + Keyboard Emulator

    Transaction API

    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

    .NET SDK

    Overview

    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.

    Getting Started

    Download and reference SDK files

    1. Download & Run

      • Download the .

      • Right-click the file and Run as Administrator.

    2. 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 )

    Initiate Transaction

    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.

    0. Create a Transaction Request Object

    Instantiate a new PaymentEngine.xTransaction.Request object. This object will hold all transaction parameters and settings

    1. Prepare the Transaction Request

    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.

    2. Initiate the Transaction

    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.

    3. Handle the Response

    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

    Troubleshooting steps

    • 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.

    Backup gateway host

    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

    Transaction Workflow

    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.

    Transaction Functions

    Basic Parameters

    Transaction-Specific

    Form Settings

    Device Settings

    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)

    Cancel Command

    Name
    Description
    Sample Data

    PIN Signature

    Receipt

    Stored Account

    Show Items

    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.

    Update Device

    This is currently only supported on certain VeriFone devices.

    Additional Features

    Show Forms

    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

    Updater app
    click here
    response parameters
    https://status.solapayments.com/
    here
    Download Our Sample Application
    https://cdn.cardknox.com/pe/files/verifone_unified_driver_installer-5.0.5.2-b5.zip

    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.

    Tap to Pay - Android

    Introduction

    Purpose

    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

    Scope

    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.


    Overview of Tap to Pay Helper Mobile App

    About

    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:

    How to use Tap to Pay with the Sola Android App

    • Enable the Tap to Pay Feature:

      • Open the Sola .

      • Navigate to Settings -> Device Configuration

      • Select Tap to Pay.

    How to install Tap to Pay using the Google Play Store

    Download the Tap to Pay Helper application from the .


    Deep Linking

    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


    Supported Transaction Workflows

    Tap to Pay Helper mobile application supports three (3) different transaction workflows.

    1. 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)

    1. 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.

    1. 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.


    Transaction Parameters

    Two types of parameters are supported by the Tap to Pay helper application.

    1. 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.


    Development and Debugging

    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.


    How to Integrate Tap to Pay with Third-Party Android Applications

    How to Setup Deeplink URL

    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.

    How to create a server-side call:

    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:

    Server-side Request Example:

    How to call a Deep Link URL to Invoke the Tap to Pay Helper Application

    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:

    Click-To-Pay Objects Reference (Request)

    For complete sample code please refer

    Available dictionary objects

    Google Pay Sample Code

    1. Let's define a helper object with all necessary components:

    2. Object with necessary properties to initialize Google Pay:

      For more information please refer to object

    3. Google Pay iField:

    Google Pay Hosted Checkout

    Overview

    Google Pay Hosted Checkout is our simple integration that enables online Google Pay processing through the Sola gateway. This document details the steps necessary to integrate Google Pay Hosted Checkout with your site.

    Contents

    • Server-Side Integration

    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"
        };
    }
    Request
    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.

  • debug
    =True&
    useSTG
    =True&x
    AllowPartialAuth
    =true

    Parameters

    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…

    Android App
    Google Play Store
    See Transaction API documentation
    API documentation
    Transaction API
    iStatus

    Use: iStatus.success

    c2pEnvironment

    Use: c2pEnvironment.sandbox

    c2pReviewAction

    Use: c2pReviewAction.pay

    Request objects

    ClickToPayRequest

    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

    onCPButtonLoaded callback example

    onPaymentPrefill callback example

    onPaymentValidate callback example

    onPaymentSuccess callback example

    onPaymentCancel callback example

    onPaymentError callback example


    CPButtonLoadedResult Object

    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.


    here
  • 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

  • Implementing Google Pay Hosted Checkout

    Server-Side Integration

    Server Endpoint Creation

    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.

    API Integration

    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:

    1. Encode that token with Base64 encoding.

    2. Set xCardNum field to the encoded token above.

    3. Set xDigitalWalletType to GooglePay.

    4. Set the remaining required fields:

      1. xAmount to transactionInfo.totalPrice - this is the consumer-approved amount from the Google Pay payment sheet.

      2. xCommand - Set to one of the values that start with cc: like cc:sale, cc:auth

    For more details, please contact your Sola Representative.

    Client-Side Integration

    Adding Reference to iFields

    Find the latest version of iFields here.

    Step 1: Add the iFields .js file after the <head> tag on your payment page:

    Adding iFrame and JavaScript Objects for Google Pay button

    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.

    Full a full sample code, refer to the iFields document.

    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:

    For full sample code, please refer to Google Pay Sample Code.

    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.

    Enable Google Pay

    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".

    EnableGooglePayParams Object

    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)

    Enable Google Pay example

    ckGooglePay.enableGooglePay({amountField: 'amount'});

    Questions?

    Check out the Google Pay FAQ page here.

    For additional questions, contact [email protected]

    Apple Pay Hosted Checkout Initial Setup

    Initial Setup

    Contents

    • Prerequisites

    Prerequisites

    Set up Apple Pay Merchant ID

    Sola supports two solutions to help you set up your Apple Pay Merchant ID:

    1. - A simple solution where Sola handles all communications with Apple and takes care of all certificates.

    2. - in this case it will be your responsibility for mainlining account, domain and certificates up to date with Apple.

    Implementing Apple Pay Hosted Checkout

    Client-Side Integration

    Adding Reference to iFields

    Find the latest version of iFields at:

    Step 1: Add the iFields.js file after the <head> tag on your payment page:

    Adding JavaScript Objects for Apple Pay button

    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.

    For a full sample code please refer to

    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:

    For full sample code, please refer to

    Step 4: Create JavaScript function that will initialize iFields.

    initAP function above returns .

    Enable Apple Pay

    window.ckApplePay object - controls initialization of Apple Pay button

    You can provide either All, One, or None of the parameters for enableApplePay call.

    • initFunction Required - either function name or function itself to initialize Apple Pay.

    • amountField Optional - if specified, the Apple Pay total amount will be automatically updated whenever the amount has changed.

    EnableApplePayParams Object


    Server-Side Integration

    Server Endpoint Creation

    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:

    API Integration

    This section assumes that you already know how to integrate other payments with

    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:

    1. Extract the paymentData from the payload.

    2. Encode it with Base64 encoding.

    3. Set xCardNum field to the encoded value above.

    4. Set

    Sample Request:

    For more details, please contact your Sola Representative.

    Questions?

    Contact

    Browser-Based POS systems (BBPOS)

    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.

    In order to use BBPOS, it must be activated on your account. To request activation, please contact support.

    {
      "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"
        };
    }
    *Any ‘Cardknox API’ parameter

    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

    c2pReviewAction

    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

    c2pEnvironment
    iStatus
    , etc.
  • xBillFirstName

  • xBillLastName

  • xBillStreet if available

  • xBillCity if available

  • xBillState if available

  • xBillZip

  • EnableGooglePayParams
    onPaymentAuthorize - a callback that will be called after the consumer pays and Apple returns a token with all of the requested consumer information, like the billing address, shipping address, etc. This is where you need to make an ajax call to your server with the Apple Payload. The sample for making an ajax call is below.

    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.

    xDigitalWalletType
    to ApplePay.
  • Set the remaining required fields:

    1. xAmount the Transaction Amount.

    2. xCommand - Set to one of the values that starts with cc: like cc:sale, cc:auth, etc.

    3. xBillFirstName

    4. xBillLastName

    5. xBillStreet

    6. xBillCity

    7. xBillState

    8. 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)

    Client-Side Integration
    Adding Reference to iFields
    Adding JavaScript Objects for Apple Pay button
    Enabling Apple Pay
    Server-Side Integration
    Server Endpoint Creation
    API Integration
    Set up Apple Pay Merchant ID through your Merchant Portal
    Set up Apple Pay Merchant ID using your own Apple account
    https://cdn.cardknox.com/ifields/versions.htm
    Apple Pay iFields Integration
    Apple Pay Object
    Apple Pay iFields Integration
    Request Object
    Apple Payload
    Cardknox API
    Apple Payload
    [email protected]
    <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
        };
    }
    Enable Apple Pay example
    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();
    		.....
    	}
    	.....
    }	
    Configuration

    To configure the BBPOS application:

    1. Download and install Sola BBPOS (PaymentEngineExt) from the provided link. BBPOS download

    2. Follow the installation prompts.

    3. When asked for the "Software name," enter "BBPOS."

    4. Provide your Sola key when prompted.

    5. BBPOS will now run in the background and can be found in the system tray

    Transaction Flow

    1. 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).

    2. Our BBPOS application receives the request and communicates with either the terminal or a pop-up window on the screen.

    3. The customer inserts their credit card into the terminal or keys the card number into the pop-up window.

    4. The transaction data is transmitted to the Sola gateway for authorization.

    5. 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.

    6. To cancel a currently processing transaction, send xCancel=1 to host .

    7. You can find available and required commands and parameters at . See the Custom Device Commands Table for BBPOS specific commands.

    8. The transaction can be redirected to a URL specified in xRedirectURL. See the Transaction Settings Table for more information.

    9. Go to for a sample implementation using a redirect.

    10. Go to for a sample implementation using AJAX.

    Transaction Settings

    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

    Custom Device Commands

    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.

    BBPOS test sites

    (Note: in order to use the test site, you will need to first download and run our application.)

    https://www.cardknox.com/bbpos/request-redirect.htm https://www.cardknox.com/bbpos/request-ajax.htm

    Offline Transactions

    Use the following integration when you are offline or cannot reach Cardknox:

    1. Send the following command to BBPOS (https://localemv.com:8887) to initiate an offline transaction on the device xCommand=cc:encrypt

    2. Complete the transaction on the device or on the Payment Engine form

    3. 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" }

    4. Store the xCardnum data locally until you have a connection, and then submit the data as xCardnum or xMagStripe

      1. xCardNum data needs to be URL encoded Key-Value Pairs (KVP)

    www.cardknox.com/supported-emv-equipment

    Click-To-Pay Initial Setup

    Overview

    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

    • Prerequisites

    Prerequisites

    Register for Click-To-Pay: See [insert link here]

    Implementing Click-To-Pay

    Client-Side Integration

    Adding Reference to iFields

    Find the latest version of iFields at:

    Step 1: Add the iFields.js file after the <head> tag on your payment page:

    Adding JavaScript Objects for Click-To-Pay button

    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

    Enable Click-To-Pay

    window.ckClickToPay object - controls initialization of Click-To-Pay button

    enableClickToPay Parameters

    For full list of Init Parameters, please refer to



    Server-Side Integration

    Server Endpoint Creation

    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

    API Integration

    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:

    1. Set the required fields:

      1. xDigitalWalletType to ClickToPay

      2. xClickToPayTransactionId to clickToPayResponse.payload.transactionId

      3. xClickToPayExternalClientId to clickToPayResponse.payload.externalClientId

    Sample Request:

    For more details, please contact your Sola Representative.

    Questions?

    Contact

    Angular iFields

    Overview

    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.

    Inputs

    There are 2 basic inputs required to get this up and running:

    1. Type

    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.

    2. Account

    Pass your to the component in the account input like this:

    Events:

    There are 2 lifecycle events and 7 user events.

    Lifecycle events

    1. Load

    Is emitted when the iFrame has loaded.

    1 <cardknox-ifields (load)="onLoad"></cardknox-ifields>

    2. Token

    Is emitted when a token is received from the iField.

    1 <cardknox-ifields (token)="onToken"></cardknox-ifields>

    User events

    User events are events passed along from iFields when the user interacts with it.

    The available events are:

    1. click

    2. dblclick

    3. focus

    4. blur

    * the submit event works slightly differently, see below.

    Update

    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:

    Submit

    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.

    Error

    There is also an error event that can be subscribed to.

    Actions

    There are 3 actions available on this component as well:

    Focus

    focusIfield

    This action will set the focus to the iField when called.

    Clear

    clearIfield

    This action will clear the data from the iField when called.

    Get Token

    getToken

    This action will load the token for the iField when called.

    Inputs

    Account

    Options

    ThreeDS

    Update Event Data

    Error Data

    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

    https://localemv.com:8887
    https://kb.cardknox.com/api/
    https://www.cardknox.com/bbpos/request-redirect.htm
    https://www.cardknox.com/bbpos/request-ajax.htm
    here
  • 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

    Client-Side Integration
    Adding Reference to iFields
    Adding JavaScript Objects for Click-To-Pay button
    Enabling Click-To-Pay
    Server-Side Integration
    Server Endpoint Creation
    API Integration
    https://cdn.cardknox.com/ifields/versions.htm
    Click-To-Pay Sample Code
    Click-To-Pay Request
    Click-To-Pay iFields Integration
    Click-To-Pay Request Object
    Sola API
    Click-To-Pay Response
    [email protected]

    Apple Pay Hosted Checkout Sample Code

    1. Let's define a helper object with all necessary components:

    2. Let’s enable Apple Pay for the website:

      document.addEventListener("DOMContentLoaded", function(event) { 
          .....
          ckApplePay.enableApplePay({
              initFunction: 'apRequest.initAP',
              amountField: 'amount'
          });
          .....
      }
    3. 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));
        });
    }
    Enable Click-To-Pay example
    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

    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

    iFields key
    payload
    2.6.2006.0102

    Boolean

    Number

    Number

    Gift Card

    Overview

    This page contains all API documentation for Gift Card transactions. For more information regarding account access, navigate to the parent page.

    Transactions

        <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();
    Options
    ThreeDS
    Issue

    POST gift:issue

    xCommand = gift:issue The Issue command is used to issue funds to a Sola gift card.

    Request Body

    Name
    Type
    Description

    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

    Redeem

    POST gift:redeem

    xCommand = gift:redeem

    The Redeem command is used to debit funds from a Sola gift card.

    Request Body

    Name
    Type
    Description

    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

    Balance

    POST gift:balance

    xCommand = gift:balance The Balance command is used to check the available balance on a Sola gift card.

    Request Body

    Name
    Type
    Description

    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

    Activate

    POST gift:activate

    xCommand = gift:activate The Activate command is used to activate a Sola gift card.

    Request Body

    Name
    Type
    Description

    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

    Deactivate

    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).

    Request Body

    Name
    Type
    Description

    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

    Transaction API

    CloudIM Developer Guide

    Table of Contents

    1. Quick Start

    2. Authentication Flow


    1. Quick Start

    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.

    In order to use CloudIM, it must be activated on your account. To request activation, please contact support.

    Supported commands are:

    • cc:sale

    • cc:authonly

    • cc:credit

    Step-by-Step Quick Start

    1. Sign Up: Create a Sola account

    2. Authentication: Use the API Key from the merchant dashboard.

    3. Create Device: Before initiating transactions, you need a Device ID. Follow the instructions below to create and obtain the device ID.

    4. Make Your First API Call: Start by making a simple


    2. Authentication Flow (Using Your API Key)

    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.


    3. Before You Start - Device Setup

    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:


    4. Transaction Flow

    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.


    5. Schemas

    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.


    6. Troubleshooting & Common Issues

    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

    1. Ensure the device is connected to the internet.

    2. Restart the app or reboot the terminal.

    3. 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.


    7. FAQs

    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.


    Issue - Request Payload Example
    { 
        "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"
    }
    Redeem - Request Payload Example
    { 
        "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"
    }
    Balance - Request Payload Example
    { 
        "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" 
    }
    Activate - Request Payload Example
    { 
        "xCardNum": "4444333322221111", 
        "xKey": "[xkeycredentials]", 
        "xVersion": "4.5.9", 
        "xSoftwareName": "YourSoftwareName", 
        "xSoftwareVersion": "1.0.0", 
        "xCommand": "gift:activate"
    }
    Deactivate - Request Payload Example
    { 
        "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

    payment request
    via the
    POST /payments
    endpoint.
  • Test 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”

    USER_CANCELLED - Cancel button on device
  • 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

    Before You Start - Device Setup
    Transaction Flow
    Schemas
    Troubleshooting & Common Issues
    FAQs
    Link
    https://device.cardknox.com/api/v1/swagger/index.html

    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

    Overview

    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.

    Workflow

    Let's get started by understanding the difference between how card information flows through an API-only integration versus one that utilizes iFields.

    API-Only

    • 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.

    API and iFields

    • 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.

    Getting Started

    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.

    Frameworks

    If you use one of the following frameworks, you can set up the iFields integration more easily:

    Initiate iFields

    Step 1

    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:

    Step 2: HTML

    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:

    Step 3: JavaScript

    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 .

    3D Secure Authentication with iFields

    (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.

    Step 1: Enable 3D Secure on the Client Side

    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.

    Step 2: Check Server Response for 3DS Challenge

    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:

    iFields Features

    Setting iFields Styles

    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:

    Clear iFields

    Added in version 2.2 You can clear the data inside an iFields by calling clearIfield(ifieldName).

    Parameters:

    Sample Code:

    Auto Format iFields Data

    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:

    Focus iFields

    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:

    iFields Key Pressed Callback

    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:

    Global iFields Key

    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:

    Account Boarding API

    Overview

    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

    Transaction API - Request Method
    Transaction API - Tokenization
    Transaction API
    Npm: React
    Npm: Angular
    Npm: Vue
    See Full Working Example
    https://cdn.cardknox.com/ifields/versions.htm
    https://cdn.cardknox.com/ifields/versions.htm
    API docs
    server-side
    server-side
    transaction API

    See this API on Swagger UI

    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.

    API Endpoints

    GetTierNames

    URL: https://psapi.cardknox.com/boarding/v1/GetTierNames

    Description: The GetTierNames endpoint gives a list of available tiers that can be passed along to the SubmitGoApp request.

    Method: POST

    Input: JSON

    Request Headers

    Parameter

    Type

    Description

    Required

    ApiKey

    String

    Authentication credentials

    True

    Sample Request:

    Response

    Parameter

    Description

    status

    • Success

    • Error

    refnum

    error

    • Error Code

    • Error Message

    tiers

    List of available tiers

    Sample Success Response:

    Sample Error Response:

    SubmitGoApp

    URL: https://psapi.cardknox.com/boarding/v1/SubmitGoApp

    The SubmitGoApp end point will create a GoPlus Application.

    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

    Request

    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

    Response

    Parameter

    Description

    Status

    • Success

    • Error

    Refnum

    Error

    • Error Code

    • Error Messages - List of errors

    AppId

    Sample Success Response

    Sample Error Response:

    Glossary of Terms

    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 #


    Account number

    A unique sequence of numbers assigned to a cardholder account that identifies the issuer and type of financial transaction card.


    Account Updater

    A tool that, in conjunction with tokenization, automatically keeps credit cards in the Sola data vault updated to ensure subsequent transactions are not declined.


    ACH

    Automated Clearing House – Electronic network used to transfer money and payment information between bank accounts. See for more information.


    Acquirer

    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.


    AFT

    Automatic Funds Transfer – A transaction in which funds are securely transferred from one bank account to another via electronic or telecommunications technology.


    AML

    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.


    Annual fee

    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.


    API

    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.


    ATM

    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.


    Authorization

    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.


    Authorization code

    A code notifying you that you have obtained the authorization for a specific card transaction.


    AVS

    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.


    AVS Precheck

    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.


    Bank card

    A debit or credit card issued by an issuing bank. Also referred to as “bankcard.”


    Batch

    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.


    BBPOS

    Browser-Based POS – Sola application that allows a POS running in a browser to accept EMV payments while remaining out of PCI scope.


    Billing Cycle

    The interval between periodic billings for goods sold or services rendered, typically sent on a monthly basis.


    BIN

    Bank Identification Number – The first 6 digits of a credit or debit card number. Also referred to as Issuer Identification Number (IIN)


    Card association

    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.


    Cardholder

    The customer to whom a card has been issued, or the individual authorized to use the card.


    Chargeback

    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.


    Check

    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.


    Clear

    The collection of funds on which a check is drawn and payment of those funds to the holder of the check.


    Clearing

    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.


    Clearing House Funds

    Funds represented by checks or drafts that pass between banks through the Federal Reserve system.


    CNP

    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.


    Code 10 authorization

    A voice authorization code that you might initiate when you suspect a card is stolen or counterfeit, or when a customer is acting suspiciously.


    Contactless

    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.


    Credit

    A refund or return of goods by a consumer to the merchant.


    Credit card

    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.


    Credit card processors

    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.”


    Currency conversion

    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.


    CVV

    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


    DCC

    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.


    Debit card

    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.


    Debit fees

    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.


    Decline re-routing

    Sola feature that enables a transaction to be re-routed to an alternate processor if the transaction was initially declined.


    Digital wallet

    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.


    Discount rate

    The rate charged to a merchant for payment processing services on debit and credit card transactions.


    EBT

    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.


    E-commerce

    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.


    EDC

    Electronic draft capture – A system in which the transaction data is captured at the merchant location for processing and storage.


    EFT

    Electronic funds transfer – A paperless transfer of funds initiated from a terminal, computer, telephone instrument, or magnetic tape.


    EMV

    Europay, MasterCard and Visa – EMV is a global standard created by Europay, Mastercard, and Visa for authenticating payment card transactions. See for more information.


    EMV card

    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.


    ERP

    Enterprise Resource Planning – Software application used to integrate all of the processes needed to run a company with a single system.


    eWIC card

    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.


    Federal Reserve Bank

    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.


    Financial Institution

    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.


    Floor limit

    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.


    Fraud

    A wrongful or criminal deceptive activity used to obtain money, assets, or other property.


    Gateway-only provider

    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.


    Holdback

    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.


    iFields technology

    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.


    Intelligent routing

    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.


    Interchange fee

    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.


    ISO

    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.


    Issuer

    The member bank that enters into a contractual agreement with card associations to issue cards.


    Issuing bank

    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.


    ISV

    Independent Software Vendor – An individual or organization that develops, markets, and sells software products that run on third-party software and hardware platforms.


    IVR

    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.


    KYC

    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.


    Loyalty program

    A rewards program a merchant offers to its customers who meet certain criteria, such as making frequent purchases.


    Magnetic stripe

    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.


    Magnetic stripe reader

    A device that reads information recorded on the magnetic stripe of a card. Also known as a “card swipe reader.”


    MCP

    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.


    Member

    An institution that participates in the programs offered by card associations such as issuers and acquirers.


    Merchant

    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.


    Merchant account

    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.


    Merchant bank

    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.”


    Merchant Identification Number

    The number that a financial institution assigns to a merchant to identify the business.


    Mobile payment

    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.


    Monthly minimum

    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.


    MOTO

    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.


    NFC

    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.


    Omnichannel processing

    Technical solution enabling a merchant to accept cashless payments across all channels, including online, in-store, mobile, e-wallet, and MOTO.


    PayFac

    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.


    Payment aggregator

    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.


    PCI DSS

    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.


    PCI DSS Level 1 Compliance

    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


    PCI SSC

    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.


    Payment gateway

    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.


    Payment gateway provider

    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.”


    PIN

    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.


    PIN debit

    Secure PIN debit card processing feature which results in the lowest processing fees.


    Plugin

    A software component, also called an extension, that adds a specific feature to an existing program to enable customization.


    POS

    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.


    POS terminal

    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.


    Postal code

    A 6-digit alphanumeric string of characters that form part of a postal address in Canada that follows the province or territory abbreviation.


    Processing solution

    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.


    PSP

    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.


    P2PE

    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.


    Real-time processing

    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.


    Receipt

    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.


    Recurring fees

    Regularly occurring charges for maintaining a merchant account. Recurring fees include the discount rate, transaction fees, statement fee, and monthly minimum.


    Recurring payment

    Regularly scheduled customer payments that occur over time at specific intervals, such as daily, weekly, monthly, quarterly, or annually.


    Refund

    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.


    Reserve

    See “Holdback.”


    Retrieval request

    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.


    Routing number

    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.


    SDK

    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.


    SSL

    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.


    Settlement

    The process by which merchant and cardholder banks exchange financial data and value resulting from sales transactions, cash disbursements, and merchandise credits.


    Setup fees

    Fees charged for establishing a merchant account, including application fees, software licensing fees, and equipment purchases.


    Smart card

    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.


    Stored-value card

    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.


    Subscription

    A recurring payment that occurs on a regular, fixed schedule. Examples include memberships, charitable donations, and rent.


    Swipe discount rate

    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.


    Transaction

    An exchange or transfer of goods, services, or funds between a customer and a merchant.


    Transaction date

    The date on which a cardholder effects a card purchase of goods, services, or other things of value, or effects a cash disbursement.


    Transaction fee

    A charge for each credit card transaction, collected by the merchant account provider or ISO.


    Tokenization

    A process that replaces sensitive cardholder data with a string of unique characters to safeguard payment card information during a transaction.


    VAR

    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.


    Void

    Identifies a transaction canceled by a merchant before it settles through a customer’s payment card account.


    ZIP code

    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.


    3D Secure technology

    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-1111
    focusIfield(‘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)

    https://www.solapayments.com/ach-payments
    https://www.solapayments.com/features-platform
    https://solapayments.com/features-in-persons-payments/#EBTsystems
    https://www.cardknox.com/emv/
    https://www.cardknox.com/emv/
    https://solapayments.com/features-in-persons-payments/#EBTsystems
    https://www.cardknox.com/phonepay/
    https://solapayments.com/
    https://www.cardknox.com/supported-emv-equipment/
    https://solapayments.com/features-platforms/

    Reporting API

    Overview

    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.

    Credentials

    Universally Required Parameters

    Other Parameters

    Parameter
    Description
    Comment

    Endpoints

    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:

    Request Method

    Method: POST The Cardknox gateway requires the POST method to be used for enhanced security. We do not support the GET method.

    Pagination

    1. Submit the first request.

    2. If xRecordsReturned equals xReportingMaxTransactions, submit another report request and adjust the beginning date and time according to the last transaction returned.

    Filter Options

    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:

    Customize report parameters

    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 .

    Report Types

    Available report types include the following:

    Date-Based Reports

    Report:Approved

    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

    Report:Declined

    xCommand: Report:Declined

    The Report:Declined command returns the following transactions:

    • CC:Sale

    • CC:AuthOnly

    • CC:Capture

    • CC:PostAuth

    Required Parameters

    Report:Auth

    xCommand: ReportAuth

    The Report:Auth command returns the following transaction:

    • CC:AuthOnly

    The ReportAuth command only returns approved authorizations.

    Required Parameters

    Report:All

    xCommand: Report:All

    The Report:All command returns the following transactions:

    • CC:Sale

    • CC:AuthOnly

    • CC:Capture

    • CC:PostAuth

    Required Parameters

    Note: You can run a report against all accounts by adding the search parameter xSecondaryKeys:[comma-delimited xKeys] and use all the xKeys for all accounts for the following date-based reports

    Optional Field: xBatch:[batch#]to get only the transactions of a specific batch.

    Report:Deposit

    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.

    Transaction-Based Reports

    Single transaction

    • report:transaction

    xCommand: Report:Transaction

    Required Parameters

    Multiple transactions

    • report:transactions

    xCommand: Report:Transactions

    Reports queried without xBeginDate and xEndDate will only return transactions from the past 2 years.

    Required Parameters

    Related Transactions

    xCommand: Report:Related

    Required Parameters

    Gift:Approved

    xCommand: Report:GiftApproved

    Required Parameters

    Response Fields

    Gift:Summary

    xCommand: Report:GiftSummary

    Required Parameters

    Response Fields

    Liability

    xCommand: Report:Liability

    Required Parameters

    Response Fields

    Batch Report

    Obtain batch summary by date

    • report:batch

    xCommand: Report:Batch

    Required Parameters

    Send a Receipt for a Completed Transaction

    You can use the Reporting API feature to send a receipt for a completed transaction.

    Reporting URL

    Use the following Sola URL:

    Required Variables:

    Google Pay Response Objects

    For complete sample code please refer here

    Available Response Objects

    PaymentResponse Object

    This Object contains Google Pay response.

    TransactionInfo Object

    DisplayItem Object

    TransactionInfo example

    PaymentData Object

    SelectionOptionData Object

    PaymentMethodData Object

    CardInfo Object

    PaymentMethodTokenizationData Object

    PaymentData Example

    Address Object

    Address Example

    Full Response Object

    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

    https://x1.cardknox.com/report

    JSON

    /reportjson

    https://x1.cardknox.com/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

    https://x1.cardknox.com
    here
    https://x1.cardknox.com/report

    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

    TransactionInfo

    Yes

    Contains all transaction data. For more details please click on the link

    paymentData

    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

    CardInfo

    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]"
      }
    }
    billingParameters
    PaymentMethodData
    SelectionOptionData
    Address
    PaymentMethodTokenizationData

    Code Samples

    Programming Language

    • C#

    C#

    Java/Android

    Node.js

    PHP

    Python 2

    Python 3

    VB.NET

    Workflow

    Overview

    • Swift - SwiftUI

    Coming soon.

    Workflow Examples

    Example 1:

    Example 2:

    Example 1:

    Example 2:

    In Scope

    Swift - SwiftUI

    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:

    Swift - Storyboard

    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:

    Objective C - Storyboard

    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:

    Out of Scope

    Swift - SwiftUI 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” 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:

    Swift - Storyboard 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.

    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:

    Objective C - Storyboard 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.

    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:

    Examples

    In Scope Example Processes

    Selections
    Example 1
    Example 2

    In Scope Example 1

    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:

    In Scope Example 2

    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:

    Out of Scope Example Processes

    Selections
    Example 1
    Example 2

    Out of Scope Example 1

    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:

    Out of Scope Example 2

    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 Linking

    Overview

    • 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.

    Due to the necessity of the API key in this integration method, we strongly recommend reserving these features for integrations to be used solely on merchant-owned devices.

    2. Glossary

    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.

    3. Getting Started

    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:

    1. Checks whether the application is installed on the mobile device or not.

    2. If it’s not installed, the user is taken to the respective app store (AppStore for iOS or Google Play Store for Android).

    3. 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:

    4. Deep Link Activation and Flow

    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:

    1. Manually, by navigating to a predefined URL through a browser on a mobile device.

    2. By having a website with an HTML element that can handle URLs and specifying the predefined URL on that HTML element.

    Android only - adb tool 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

    4.1 Validation

    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:

    1. 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.

    2. At least one of the required parameters is invalid - User is presented with a UI that indicates which parameter failed validation.

    3. 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.

    4.2 Processing interface type options

    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.

    To enable Device processing screen only, ensure that EnableDeviceInsertSwipeTap > True and EnableKeyedEntry is enabled and set to false

    When both keyed and swipe user interfaces are available, each one contains an UI element to navigate to the other interface

    4.3 Transaction Processing

    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:

    1. 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.

    2. 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:

    4.4 Process Cancellation

    When the user taps Cancel in the application, a DeepLink cancellation is processed.

    5. Required Parameters

    6. Optional parameters

    Google Pay Request Objects

    For complete sample code please refer

    Available dictionary objects

    Java/Android
    Node.js
    PHP
    Python 2
    Python 3
    VB.NET
    //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

    Swift - Storyboard
    Objective C - Storyboard
    Swift - SwiftUI
    Swift - Storyboard
    Objective C - Storyboard
    Swift, Storyboard, cc:sale
    Objective C, Storyboard, cc:refund
    Swift, Storyboard, cc:sale
    Objective C, Storyboard, cc:sale

    Transaction Type

    Transaction Type

    possible values: true, false
  • 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

    https://docs.solapayments.com/api/transaction
    https://play.google.com/store/apps/details?id=com.gateway.cardknox.android
    https://apps.apple.com/us/app/cardknox-payments/id1358857120
    Example of a keyed user interface. Note that the top right corner icon navigates the user to the swipe user interface.
    Example of a swipe user interface which is scanning for nearby VP3300 card reader to connect to. Note that the button on the bottom navigates the user to the keyed user interface.
    Sola deep link - create a transaction form
    A successfully processed transaction summary. Clicking Done delivers the results back to the xRedirectURL URL.
    A successfully processed transaction that resulted in an error response from the Sola API. The error is displayed ‘as is’ and the user has an option to instruct the app to deliver the Sola API response to the xRedirectURL URL
    The UI presented in the application when the app delivers the results to xRedirectURL. User navigating back to the app from the browser would see this screen

    -

    Has to be lowercase.

    Supported values are all values supported by the Sola API.

    string

    iStatus

    Use: iStatus.success

    GPEnvironment

    Use: GPEnvironment.test

    GPButtonColor

    Use: GPButtonColor.white

    GPButtonType

    Use: GPButtonType.buy

    GPButtonSizeMode

    Use: GPButtonSizeMode.fill

    GPBillingAddressFormat

    Use: GPBillingAddressFormat.min

    Request objects

    GooglePayRequest

    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

    MerchantInfo Object

    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

    GPButtonLoadedResult Object

    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.

    BillingParameters Object

    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

    ShippingParameters Object

    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

    ShippingData Object

    Name

    Type

    Description

    shippingAddress

    An Address containing countryCode, postalCode, locality(city), administrativeArea(state).

    shippingOptionData

    An object containing a selected option

    ShippingData object example

    ShippingAddress Object

    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

    ShippingOptionData Object

    Name

    Type

    Description

    id

    String

    id of selected shipping option

    ButtonOptions Object

    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

    here

    EBT

    Overview

    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.

    The transactions below are not valid for EBT Online. To reference EBT Online, navigate to this page.

    Transactions

    EBT Food Stamp

    Sale

    POST ebtfs:sale

    xCommand = ebtfs:sale

    The Sale command is used to make a purchase on an EBT cardholder’s food stamp account.

    Request Body

    Name
    Type
    Description

    Credit

    POST ebtfs:credit

    xCommand = ebtfs:credit The Credit command is used to credit an EBT cardholder’s food stamp account.

    Request Body

    Name
    Type
    Description

    Balance

    POST ebtfs:balance

    xCommand = ebtfs:Balance

    The Balance command is used to check the balance on an EBT cash benefit account.

    Request Body

    Name
    Type
    Description

    Voucher

    POST ebtfs:voucher

    xCommand = ebtfs:voucher The Voucher command is used to process a manual EBT food stamp voucher.

    Request Body

    Name
    Type
    Description

    EBT Cash Benefits

    Sale

    POST ebtcb:sale

    xCommand = ebtcb:sale The Sale command is used to make a purchase on an EBT cardholder’s cash benefit account.

    Request Body

    Name
    Type
    Description

    Cash

    POST ebtcb:cash

    xCommand = ebtcb:Cash The Cash command enables a cash withdrawal from an EBT cardholder’s cash benefit account.

    Request Body

    Name
    Type
    Description

    Balance

    POST ebtcb:balance

    xCommand = ebtcb:Balance

    The Balance command is used to check the balance on an EBT cash benefit account.

    Request Body

    Name
    Type
    Description

    EBT Wic (eWic)

    Sale

    POST ebtw:sale

    xCommand = ebtw:sale The Sale command is used to make a purchase on an EBTW cardholder’s cash benefit account.

    Request Body

    Name
    Type
    Description

    Balance

    POST ebtw:balance

    xCommand = ebtw:Balance The Balance command is used to check the balance on an EBTW cash benefit account.

    Request Body

    Name
    Type
    Description

    Void

    POST ebtw:void

    xCommand = ebtw:Void The Void command voids a purchase made with an EBTW cardholder’s cash benefit account.

    Request Body

    Name
    Type
    Description

    iFields Integration

    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"; // MMYY
    prms.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"; // MMYY
    prms.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"; // MMYY
    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");
    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"; // MMYY
    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 = "cc:sale";
    prms.xAmount = 1.23;
    prms.xCardNum = "4444333322221111";
    prms.xExpDate = "1225"; // MMYY
    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!
    }
    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.android
    dck://app.cardknox.com/transaction?xAmount=1.0&xKey=CardknoxSupport_Test&xRedirectURL=https://www.test.com/&xCommand=cc:sale
    https://www.test.com/?xError=Required+parameter%3a+xKey&xResult=E&xStatus=Error
    https://www.test.com/?xError=Required+parameter%3a+xAmount&xResult=E&xStatus=Error
    https://www.test.com/?xError=Required+parameter%3a+xCommand&xResult=E&xStatus=Error
    https://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=Visa
    https://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=Visa
    const 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
    }
    View the Example
    View the Example
    View the Example
    View the Example
    white: A white button suitable for use on colorful backgrounds.
    : Google Pay button without additional text.

    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

    BillingParameters

    No

    Sets Billing parameters, including transactionId. For more information please click the link

    shippingParameters

    ShippingParameters

    No

    Sets various Shipping Options. For more information please click the link

    buttonOptions

    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

    GPBillingAddressFormat

    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.

    GPButtonSizeMode

    No

    From Google documentation:

    • static: Button has a static width and height (default).

    • fill: Button size changes to fill the size of its container.

    MerchantInfo
    GPButtonLoadedResult
    iStatus
    ShippingAddress
    ShippingOptionData
    GPButtonColor
    GPButtonType

    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"
    }
    Credit - Request Payload Example
    {
        "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"
    }
    Balance - Request Payload Example
    {
        "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"
    }
    Voucher - Request Payload Example
    {
        "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"
    }
    Sale - Request Payload Example
    {
        "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"
    }
    Cash - Request Payload Example
    { 
        "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" 
    }
    Balance - Request Payload Example
    { 
        "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" 
    }
    Sale - Request Payload Example
    { 
        "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" 
    }
    Balance - Request Payload Example
    { 
        "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" 
    }
    Void - Request Payload Example
    {
        "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>
    [email protected]

    Apple Pay iFields Integration

    <!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>    

    RMS (Retail Management Systems)

    System Requirements

    .Net Framework 4 and above

    Installation Instructions for Credit Cards

    Enable Sola payment processing on RMS point-of-sale systems.

    PART 1: Prepare each computer

    1. Run a Z Report:

      1. Open the Store Operations POS.

      2. Press F5.

      3. Select Print Z Report

    PART 2: Download and run the software

    1. Download the Sola Updater plugin:

    2. Right-click on the downloaded program (Updater.exe), then click Run as administrator and choose Yes when prompted.

    3. An input box will appear. Type fidelipayrms and click Enter.

    Installation Instructions for Other Payment Types

    The following steps will enable additional payment types on the Sola gateway.

    Installing Credit Card Capabilities

    1. Open the Store Operations Manager and go to Database > Tender Types.

    2. If Credit Card is not listed:

      1. Click on New.

    Installing EBT Capabilities

    PART 1: Configure or create EBTFS as a tender type

    1. Open the Store Operations Manager and go to Database > Tender Types.

    2. 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:

      1. Click on New.

    PART 2: Add an EBTFS button

    1. Go to Database > Registers > Custom POS Buttons.

    2. Click New.

    3. On the popup window, fill in several fields:

    Installing Gift Card Capabilities

    PART 1: Configure or create gift cards as a tender type

    1. Open the Store Operations Manager and go to Database > Tender Types.

    2. 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:

      1. Click on New.

    PART 2: Add a Gift Card button

    1. Navigate to Database > Registers > Custom POS Buttons.

    2. Click New.

    3. In the window the pops up, you’ll need to fill in several fields:

    PART 3: Set option to enter the price at POS

    1. Navigate to Database > Items.

    2. 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:

      1. Click on New.

    Installing Tokens

    The following steps will enable you to securely save cardholder information for future use.

    PART 1: Enable tokens on your POS

    1. Run C:\FPS_RMS_Plugin\FidelipayRMS.exe.

    2. Go to the FidelipayRMSSettings tab:

      1. EnableTokenization, 1

      2. DB_Database, [

    PART 2: Add a Tokens button

    1. Open the Store Operations Manager and go to Database > Registers > Custom POS Buttons.

    2. Click New.

    3. On the popup window, fill in several fields:

    Connecting a Credit Card Pin Pad

    PART 1: Download the device drivers For VeriFone Mx devices: 32 bit:

    64 bit:

    PART 2: Connect your terminal to RMS

    1. Navigate to C:\FPS_RMS_Plugin\FidelipayRMS.exe.

    2. Complete the form with the appropriate device settings.

    3. Restart RMS and run a test transaction.

    Add Sola variables to receipt

    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

    1. In Store Operations Manager, go to Database > Registers > Register List.

    2. Select a register that is currently used and on which you wish to base the receipt.

    3. Click Properties.

    4. Click on the Receipt Printer 1

    PART 2: Save the current receipt

    1. In the Store Operations Manager, go to Database > Registers > Receipt Formats.

    2. Select the sales receipt that is currently used.

    3. Click Properties.

    4. 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

    1. Open the receipt in a text editor.

    2. Choose the SUB in the XML receipt where you want to display the Cardknox information.

    3. 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

    1. Open Store Operations Manager and go to Database > Registers > Receipt Formats.

    2. On the right side of the window, click New.

    3. Type plugin_receipt into both the Title and Description fields.

    PART 5: Select the receipt format for each register

    1. Go to Database > Registers > Register List and complete the following steps for each register:

      1. Select the register and click Properties.

      2. Choose the Receipt Printer 1 tab.

    Display EBT Balance on Receipt

    To display the EBT balance on the RMS receipt:

    1. 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".

    2. 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:

    1. 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".

    2. 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:

    Additional Features

    Enable Cashback

    Cashback Prompt on device

    1. Navigate to Advanced Settings and set Allow Cashback = True

    2. Set Enable Cashback = True

    Add Cashback as an item

    1. Navigate to FidelipayRMSSettings tab

    2. Set Cashback Fee Item to a non inventory item

    3. Navigate to Advanced Settings. Set CashbackAmountIncludedInAmount to True

    Offline Transactions

    Enable Offline transaction

    1. Enable Offline Transactions in the FidelpayRMS Settings panel

    2. Click “Display Prompt Before Continue”: This will bring a pop up on RMS before continuing to Offline mode.

    3. Selecting "Require Customer Selection" will require a customer selected for offline.

    RMS database Version minimum SQL 2005

    eWIC

    Step 1: Create a new tender

    1. Navigate to the RMS Manager > Database > Tender Types

    2. Click on NEW

    3. Set Description as eWIC

    4. Set Tender Code as EBTW

    Step 2: Enable eWIC

    1. Enable eWIC in the FidelipayRMS Settings panel

    2. "Secondary UPC Field Name": This can be used to use the Sub description for the UPC or PLU for eWIC.

    3. "Discount item": Set a non-inventory item to be used for eWIC partial auth

    Apple Pay Hosted Checkout Objects Reference (Request)

    For complete sample code please refer here

    Available dictionary objects


    iStatus

    Use: iStatus.success

    APButtonColor

    Use: APButtonColor.black

    APButtonType

    Use: APButtonType.buy

    APRequiredFeatures

    Use: APRequiredFeatures.address_validation

    APErrorCode

    Use: APErrorCode.addressUnserviceable

    APErrorContactField

    Use: APErrorContactField.administrativeArea

    Request objects


    ApplePayRequest

    The Main object that contains all the information necessary to communicate with Apple Pay API.

    Request Examples

    Payment Request example

    onAPButtonLoaded callback example

    onGetTransactionInfo callback example

    onGetShippingMethods callback example

    onShippingContactSelected callback example

    onShippingMethodSelected callback example

    onPaymentMethodSelected callback example

    onBeforeProcessPayment callback example

    onValidateMerchant callback example

    onPaymentAuthorize callback example

    onPaymentComplete callback example

    onError callback example

    onCancel callback example


    ButtonOptions Object

    Button Options example


    APButtonLoadedResult Object


    ApplePayContactField

    Field names used for requesting contact information in a payment request.

    Available fields:

    • name

    • email

    • phone

    • postalAddress

    ApplePay Contact Field example

    PaymentContact Object

    ShippingContactResponse Object

    LineItem Object

    We’re now supporting Recurring and Deferred Payments as well as Subscriptions. These features are supported starting iOS 15.4.

    These features are available if support_recurring and/or support_subscription is part of list.

    Name
    Type
    Description

    ApplePayLineItemType

    • final - A line item representing the known, final cost.

    • pending - A line item representing an estimated or unknown cost.

    ApplePayRecurringPaymentDateUnit

    • year

    • month

    • day

    Recurring Line Item Example (Charging $20 starting today for the next year)

    ShippingMethod Object

    ShippingMethod example


    PaymentMethod Object


    PaymentMethodType

    A payment card’s type of payment.

    The payment method type value is one of:

    • debit

    • credit

    • prepaid

    • store

    Error Object

    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.

  • You will be prompted to enter your Sola key and Merchant ID. (Developers should use their Sola test key and 123456 for the MID for testing.)
    Type Credit Card in the Description field.
  • 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 the Style box, choose COM OBJECT (Session Object).
  • 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 the Style box, choose COM OBJECT (Session Object).
  • 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.

  • YourDatabaseName
    ]
  • DB_Username, [YourDatabaseUserName]

  • DB_Server, [YourServerIpAddress]

  • DB_Password [YourPassword]

  • Click Test Connection.

  • Close and save the Settings file.

  • For the Style box, choose COM OBJECT (Session Object).
  • 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.

  • tab.
  • The receipt currently in use can be found in the Receipt Format field.

  • In the Sales field, click the magnifying glass.
  • 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.

  • In the Receipt Format box, click the magnifying glass.
  • Select plugin_receipt and click OK.

  • After this has been completed for all of the registers, close the Registers window and restart the POS.

  • Designate the max amount allowed for Offline transactions.
  • Select the Transaction Type allowed in Offline mode.

  • "Discount reason code": Set a reason code to be used for eWIC partial auth
  • Ensure that your items lookup code matches the expected eWIC UPC or PLU code

  • https://cdn.cardknox.com/dl/updater.exe
    cdn.cardknox.com/pe/drivers/verifone/verifone_unified_driver_installer_32.msi
    cdn.cardknox.com/pe/drivers/verifone/verifone_unified_driver_installer_64.msi
    <IF>
          <CONDITION> Len(Session.Variable1) </CONDITION>
          <THEN>
              <TABLE>
                  <BORDER> tbNone </BORDER>
                  <COLUMNHEADER>
                      <ALIGNMENT> "&lt;"  </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

    hour
  • minute

  • 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

    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

    APButtonColor

    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

    LineItem

    A line item that represents the total for the payment.

    shippingMethods

    ShippingMethod[]

    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

    APErrorCode

    One of Apple Pay Error Codes

    contactField

    APErrorContactField

    One of Apple Pay Error Contact fields

    message

    String

    Error message displayed to the customer

    requiredFeatures
    requiredFeatures

    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 example
    onValidateMerchant: 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"
    }
    APRequiredFeatures[]
    ApplePayContactField[]
    ApplePayContactField[]
    APButtonLoadedResult
    here
    here
    here
    PaymentContact
    ShippingContactResponse
    requiredFeatures
    Error
    here
    ShippingMethod
    here
    PaymentMethod
    here
    here
    here
    here
    here
    here
    below
    here
    APButtonType
    Error

    EBT Online

    Overview

    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 .

    In order to use EBT Online, it must be activated on your account. To request activation, please contact support.

    Endpoints

    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.

    Request Method

    Method: POST Sola/Cardknox Gateway requires an HTTP POST method to be used for enhanced security. We do not support the GET method.

    Request / Commands to the Sola/Cardknox Gateway

    ebtonline:initiate

    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.

    Parameter Notes: *This field can be sent either on the initiate transaction or follow up command transaction **Required if xShipMethod is anything other than customer pickup


    ebtonline:fssale

    Process an EBT Online transaction to transfer funds from an EBT card to the retailer.

    Parameter Notes: *This field can be sent either on the initiate transaction or follow up command transaction **Required if xShipMethod is anything other than customer pickup

    ebtonline:cbsale

    Process an EBT Online cash benefits transaction to transfer funds from an EBT card to the retailer.

    Parameter Notes: *This field can be sent either on the initiate transaction or follow up command transaction **Required if xShipMethod is anything other than customer pickup

    ebtonline:balance

    Check the available balance on an EBT card

    Parameter Notes: *This field can be sent either on the initiate transaction or follow up command transaction **Required if xShipMethod is anything other than customer pickup

    ebtonline:refund

    Process an EBT online refund transaction to return funds from the retailer to the cardholder.

    ebtonline:void

    Process an EBT Online void transaction to cancel out a sale.

    Response Parameters

    Response Codes

    Responses that can be returned.

    Error Codes

    Errors that can be returned.

    PIN Pad Implementation

    Overview

    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

    This endpoint can only be called from the browser.

    Format: FormData

    Redirect Parameters


    Response/Redirect Parameters

    Workflow/Sample code

    Overview

    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.

    1) Submit an Initiate Request

    The ebtonline:initiate will begin the PIN process. Sola will return the necessary pieces to render a PIN pad for the user.

    Request

    Response

    2) Redirect the user to the PIN pad

    Redirect the user to the xPinPadURL for the user to enter their pin.

    Request

    Response

    3) Submit the final command to the gateway

    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

    Test Cards


    Frequently Asked Questions

    Can I view the EBT online commands in Sola reporting?

    The initiate and balance commands are available for internal users in the report:log and sale commands are available in all reports.

    What's the difference between a void and a refund?

    The void command voids the entire transaction, so no amount is allowed; a refund can partially refund the transaction, so an amount is allowed.

    Can I use a token instead of a card number for the initiate?

    Yes

    Are partial approvals supported?

    No

    Is there a separate command for food stamps and cash benefits?

    For balance, refund, and void, there is no need to specify. For sales, there is a separate command for food stamps (ebtonline:fssale) and cash benefits (ebtonline:cbsale).

    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

    here

    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

    Other
    Other

    Error Codes

    xErrorCode within API docs

    Gateway errors

    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

    Bank Declines

    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

    Android SDK

    Overview

    Sola (Cardknox) Android SDK is a mobile SDK targeted towards Android developers, allowing developers to process transactions with the Sola Transactions API.

    Due to the necessity of the API key in this integration method, we strongly recommend reserving these features for integrations to be used solely on merchant-owned devices.

    Getting started

    To start, download the SDK framework file:

    Integrate the SDK file into your Android Studio project by referring to the .

    Choose your integration path

    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

    Out of scope

    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.

    In scope

    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

    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.

    Payment Engine

    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.

    Transaction workflows

    Download our sample applications:

    Basic parameters

    Basic parameter functions

    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.

    Transaction required parameters

    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.

    Transaction optional parameters

    Optional transaction parameters further complement the transaction processing. All the parameters are sent to the Gateway during processing.

    Retrieving results with callbacks

    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:

    Callback subscriptions & result handling

    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.

    Transaction result callback subscription

    This callback delivers a “transaction processed response” object to the subscriber.

    Subscription can be made in the appropriate Fragment lifecycle method:

    Card reader event callback subscription

    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:

    Card reader events

    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.

    Scanned bluetooth device callback subscription

    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:

    Scan completed callback subscription

    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:

    Device status callback subscription

    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.

    Transaction status callback subscription

    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.

    Result as JSON callback subscription

    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.

    Payment engine LogCat logging callback subscription

    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 integration

    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:

    Available user interfaces

    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

    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.

    Post processing options

    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 integration

    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:

    Available commands

    • Check (ACH) commands

      • Reference:

    • Credit Card commands

    Custom UI integration

    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.

    Custom UI with Bluetooth

    The CardknoxSDKtype provides a function to obtain the Custom UI manager:

    Custom UI with USB

    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.

    Available commands

    Any of the following credit card commands are available for Custom UI:

    • cc:save

    • cc:credit

    • cc:authonly

    • cc:sale

    Reference:

    Custom UI flow

    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.

    Payment engine integration

    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.

    Versioning

    Developers can read from the cardknox.payments.sdk.BuildConfig class, properties are:

    Logging

    SDK verbose logging can be enabled or disabled with a function call:

    FAQ

    1. 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

    2. As a Cardknox SDK user, I’ve encountered errors during transaction processing. What response can I expect?

    Checksums

    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

    xEmail

    The customer’s email address.

    [email protected]

    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

    Reference: Credit Card
  • 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();

    scan completed callback - to be notified about all the scanned devices once the “scan for devices” process ends

    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

    Java app checksum

    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);

    Android SDK download
    technical documentation
    Java sample app
    Check (ACH)
    Credit Card
    Android SDK checksum
    Example of a keyed user interface. Keyed screen has a top right corner icon to navigate to the swipe screen.
    Example of a swipe user interface. The swipe screen contains a button on the bottom that navigates the user to the keyed user interface.
    Example of a success popup.
    Example of an error popup.
    Start scanning flow
    Stop scanning flow

    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()
    DEVICE - swipe, insert and tap a card

    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

    A descriptive error message is always accompanying this event.
    Transaction API
    Transaction API:
    SetVP3300StartTransactionMethod in Custom UI with USB section
    Custom UI with USB integration
    Custom UI with USB integration
    Custom UI with USB integration
    Custom UI with USB integration
    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();

    Credit Card

    Overview

    This page contains all API documentation for Credit Card (CC) transactions. For more information regarding account access, navigate to the Transaction API parent page.

    Transactions

    Sale

    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.

    Request Body

    Name
    Type
    Description

    For a full list of response codes, see the in the Introduction page.

    AuthOnly

    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.

    Request Body

    Name
    Type
    Description

    For a full list of response codes, see the in the Introduction page.

    Capture

    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.

    Request Body

    Name
    Type
    Description

    For a full list of response codes, see the in the Introduction page.

    SplitCapture

    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.

    Adjust

    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.

    Request Body

    Name
    Type
    Description

    Save

    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.

    Request Body

    Name
    Type
    Description

    AvsOnly ($0 Auth)

    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.

    Request Body

    Name
    Type
    Description

    Credit

    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 .

    Request Body

    Name
    Type
    Description

    Refund

    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.

    Request Body

    Name
    Type
    Description

    VoidRefund

    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.

    Request Body

    Name
    Type
    Description

    VoidRelease

    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.

    Request Body

    Name
    Type
    Description

    Void

    POST cc:void

    xCommand = cc:Void The Void command voids a transaction that has not yet settled using xRefNum.

    Request Body

    Name
    Type
    Description

    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

    authonly
    capture
    table
    capture
    Void Release
    table
    table
    split capture documentation
    [email protected]

    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"
    }
    Sale - Request Payload Example
    {
        "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"
    }
    AuthOnly - Request Payload Example
    {
        "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"
    }
    Capture - Request Payload Example
    {
        "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"
    }
    Capture - Response Payload
    {
        "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"
    }
    SplitCapture - Response Payload
    {
    "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"
    }
    Adjust - Request Payload Example
    {
        "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"
    }
    Save - Request Payload Example
    {
        "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"
    }
    Credit - Request Payload Example
    {
        "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"
    }
    
    
    Refund - Request Payload Example
    {
        "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"
    }
    VoidRefund - Request Payload Example
    {
        "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"
    }
    
    
    VoidRelease - Request Payload Example
    {
        "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"
    }
    Void - Request Payload Example
    {
        "xKey": "[xkeycredentials]",
        "xVersion": "4.5.9",
        "xSoftwareName": "YourSoftwareName",
        "xSoftwareVersion": "1.0.0",
        "xCommand": "cc:void",
        "xCustom01": "Register01",
        "xRefNum": "93827163"
    }
    see list of all supported currencies
    here
    see list of all supported currencies
    see list of all supported currencies

    iOS SDK

    Overview

    Sola iOS SDK is a mobile SDK targeted towards Swift mobile application developers; it allows developers to process transactions with the Sola Transactions API.

    Due to the necessity of the API key in this integration method, we strongly recommend reserving these features for integrations to be used solely on merchant-owned devices.

    Getting started

    To start, download the SDK framework file:

    Integrate the framework file into your XCode project by referring to the .

    Choose your integration path

    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

    Out of scope

    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.

    In scope

    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

    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”.

    Transaction workflows

    Click here to view the transaction workflows online.

    Download our sample application:

    Basic parameters

    Basic parameter functions

    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.

    Transaction required parameters

    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.

    Transaction optional parameters

    Optional transaction parameters further complement the transaction processing. All the parameters are being sent to the Gateway during processing.

    Retrieving results with callbacks

    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:

    Callback subscriptions & result handling

    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.

    Transaction result callback subscription

    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:

    Card reader event callback subscription

    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:

    Card reader events

    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.

    Scanned bluetooth device callback subscription

    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:

    Scan completed callback subscription

    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:

    Device status callback subscription

    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:

    Transaction status callback subscription

    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 integration

    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:

    Available user interfaces

    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.

    Post processing options

    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 integration

    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:

    Available commands

    • Check (ACH) commands

      • Reference:

    • Credit Card commands

    Custom UI integration

    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.

    Available commands

    Any of the following credit card commands are available for Custom UI:

    • cc:save

    • cc:credit

    • cc:authonly

    • cc:sale

    Reference:

    Custom UI flow

    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.

    Payment engine integration

    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.

    Versioning

    Developers can call the “get version” API to obtain the SDK Semantic Versioning ()

    Logging

    SDK verbose logging can be enabled or disabled with a function call:

    FAQ

    1. 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

    2. 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

    xEmail

    The customer’s email address.

    [email protected]

    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

    Reference: Credit Card
  • 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();

    scan completed callback - to be notified about all the scanned devices once the “scan for devices” process ends

    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];

    Swift download
    technical documentation
    Swift with SwiftUI app
    Check (ACH)
    Transaction API
    SemVer source
    Example of a keyed user interface. Keyed screen has a top right corner icon to navigate to the swipe screen.
    Example of a swipe user interface. The swipe screen contains a button on the bottom that navigates the user to the keyed user interface.
    Example of a success popup
    Example of an error popup
    Start scanning flow
    Stop scanning flow

    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

    An descriptive error message is always accompanying this event.
    https://docs.solapayments.com/api/transaction/credit-card
    Transaction API:

    Customer and Recurring API

    Overview

    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.

    Authorization

    Include your Sola API key in the Authorization header for all requests. You can generate an API key in the of the Sola Portal.

    Versioning

    Customer and Recurring API V2 is versioned to allow stability for integrators and flexibility for Sola to continue making improvements.

    Major Version

    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:

    Minor Version

    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

    Request Method

    Method:

    The Sola gateway requires the POST method to be used for enhanced security.

    We do not support the GET method.

    Base URL

    The base URL for all requests is

    Customer Endpoints

    /CreateCustomer

    Add a new customer record, which can then be linked to payment methods and schedules.

    Request Body (JSON)

    Sample Request

    Response Body (JSON)

    Sample Response

    /UpdateCustomer

    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.

    Request Body (JSON)

    Sample Request

    Response Body (JSON)

    Sample Response

    /GetCustomer

    Retrieves the details of a specific customer.

    Request Body (JSON)

    Sample Request

    Response Body (JSON)

    Sample Response

    /DeleteCustomer

    Deletes a customer record. You cannot delete a customer who has an active recurring schedule.

    Request Body (JSON)

    Sample Request

    Response Body (JSON)

    Sample Response

    /ListCustomers

    Lists customers created by a merchant.

    Request Body (JSON)

    Sample Request

    Response Body (JSON)

    Sample Response

    Payment Method Endpoints

    /CreatePaymentMethod

    Adds a new payment method to a customer’s account profile.

    Request Body (JSON)

    Sample Request

    Response Body (JSON)

    Sample Response

    /UpdatePaymentMethod

    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.

    Request Body (JSON)

    Sample Request

    Response Body (JSON)

    Sample Response

    /GetPaymentMethod

    Retrieves an existing payment method.

    Request Body (JSON)

    Sample Request

    Response Body (JSON)

    Sample Response

    /DeletePaymentMethod

    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.

    Request Body (JSON)

    Sample Request

    Response Body (JSON)

    Sample Response

    /ListPaymentMethods

    Return payment methods based on specific search parameters.

    Request Body (JSON)

    Sample Request

    Response Body (JSON)

    Sample Response

    Schedule Endpoints

    /CreateSchedule

    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.

    Request Body (JSON)

    Sample Request

    Response Body (JSON)

    Sample Response

    /UpdateSchedule

    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).

    Request Body (JSON)

    Sample Request

    Response Body (JSON)

    Sample Response

    /EnableSchedule

    Restart a schedule that was previously disabled.

    Request Body (JSON)

    Sample Request

    Response Body (JSON)

    Sample Response

    /DisableSchedule

    Stop, pause, cancel, or inactivate an active schedule.

    Request Body (JSON)

    Sample Request

    Response Body (JSON)

    Sample Response

    /DeleteSchedule

    Removes a schedule. You can only delete a schedule that is not active.

    Request Body (JSON)

    Sample Request

    Response Body (JSON)

    Sample Response

    /GetSchedule

    Retrieves the details for a schedule.

    Request Body (JSON)

    Sample Request

    Response Body (JSON)

    Sample Response

    /GetUpcomingPaymentDates

    Returns a list of upcoming payment dates (up to 100) for a specific schedule.

    Request Body (JSON)

    Sample Request

    Response Body (JSON)

    Sample Response

    /ListSchedules

    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.

    Request Body (JSON)

    Sample Request

    Response Body (JSON)

    Sample Response

    Transaction Endpoints

    /ProcessTransaction

    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.

    Request Body (JSON)

    Sample Request

    Response Body (JSON)

    Sample Response

    /GetTransaction

    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.

    Request Body (JSON)

    Sample Request

    Response Body (JSON)

    Sample Response

    /ListTransactions

    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.

    Request Body (JSON)

    Sample Request

    Response Body (JSON)

    Sample Response

    Merchant Endpoints

    /UpdateMerchant

    Changes the recurring report settings for the merchant, which includes:

    • Email address

    • Enabled status

    • Show Details setting

    Request Body (JSON)

    Sample Request

    Response Body (JSON)

    Sample Response

    /DescribeMerchant

    Returns the merchant's current configuration for recurring report settings (see ).

    Request Body (JSON)

    Sample Request

    { "SoftwareName" : "ACME Inc.", "SoftwareVersion" : "1.0" }

    Response Body (JSON)

    Sample Response

    Appendix A - Schedule Rules

    Fields

    RuleType

    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).

    Restrictions

    • DayOfWeek, DayOfMonth, and MonthOfYear can only be used when RuleType is On.

    • DayOfWeek can only be used for weekly schedules.

    Additional Notes

    • Weekdays begin with Monday and continue through Friday.

    • Weekends are Saturday and Sunday.

    • The following are the values for the days of the week:

    Example 1

    A monthly schedule that runs every 3 months on the first weekday of the month:

    Example 2

    A yearly schedule that runs every year on January 1st:

    Example 3

    A weekly schedule that runs every other Monday:

    Appendix B - Timeouts

    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.

    Email

    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.

    Email

    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.

    Email

    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.

    Email

    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.

    Email

    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.

  • Sunday = 1
  • 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

    Key Management section
    https://api.cardknox.com/v2
    https://api.cardknox.com/v2
    /UpdateMerchant

    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
      }
    }
    IsDeleted
  • Email

  • BillName

  • BillFirstName

  • BillLastName

  • BillMiddleName

  • BillCompany

  • BillStreet

  • BillStreet2

  • BillCity

  • BillState

  • BillZip

  • BillCountry

  • BillPhoneNumber

  • BillPhone

  • BillMobile

  • BillFax

  • PaymentMethodId
  • Token

  • TokenType

  • TokenAlias

  • Amount
  • IntervalCount

  • CustomerId

  • ScheduleId

  • BillFirstName

  • BillMiddleName

  • BillLastName

  • BillName

  • Email

  • BillCompany

  • CustomerNumber

  • ScheduleName

  • Description

  • IntervalType

  • StartDate

  • PaymentsRemaining

  • ToDate
  • CustomerId

  • ScheduleId

  • PaymentMethodId

  • TransactionId

  • /GetCustomer
    /GetPaymentMethod
    /CreateCustomer
    /CreatePaymentMethod
    Appendix A
    Appendix A
    Appendix A
    /CreateSchedule
    /GetSchedule
    /CreatePaymentMethod
    /GetTransaction