Only this pageAll pages
Powered by GitBook
1 of 93

NUMBER - Development Portal

Loading...

Loading...

Loading...

Documentation

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

API Reference

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Help

Loading...

Loading...

Developer Quickstart

Partnership isn’t just a word—it’s how we power payments.

Integrating payment services into your system is a complex task, and it grows all the more complex the more ideas and customization needs you have. We want to make that process as easy to follow as possible—from one developer to another.

See our Vocabulary to help you get started if you are new to payment services.

We've prepared this quickstart section to help you get started. We recommend going through all of the sections in order and then moving onto the Getting Started section to find out which integration option makes the most sense for you and how to implement it in your system.

Now, if you are ready to explore...

Authentication

Get Your Business Started

Find out how long it takes to get started with Number

At Number, we know that running a business means juggling countless tasks. That's why we've made our payment integration as simple and efficient as possible, so you can focus on what really matters—growing your business.

Implementation timeline

Before you start using our services, you might want to gain more insight into the work required to integrate. We've prepared a rough implementation timeline to help guide you in your decision-making.

You can find a detailed integration guide by visiting the section.

To get your business started with Number, follow these general steps for implementation:

Phase
Duration
Task

Home

Embedded Payments Starts Here

Embedded payments are at the heart of everything we do, enabling ISVs and SaaS providers to integrate tailored payment solutions directly and elegantly into their platforms.

We understand the critical nature of payment processing and are committed to maintaining seamless operations. Our dedicated support team is available around the clock to provide immediate assistance and resolve any issues, ensuring your business can operate without disruption.

Test your integration

1-2 weeks

Conduct unit testing to validate the integration functionality before going live.

Number inspection

1-2 meetings

The Number team always inspects our clients workflows prior to going live.

Go live

1 day

Switch to the production environment and update configuration as necessary.

Total integration tme

6-10 weeks

If you have multiple teams working on developing the integration, it can all be completed in as little as four weeks.

Obtain Sandbox credentials

1 day

Contact the Number team to obtain sandbox credentials for integration testing.

Choose integration options

1-2 days

Decide on integration options that best suit your business needs.

Develop a payment workflow

1-2 days

Outline all interaction points in your current workflow where payments might be collected.

Develop your integration

1-2 weeks 1 week (optional) 2-3 weeks 1 week

Create the front-end components necessary for user interactions. If you want to support Verifone card chip readers, implement EMV functionality provided by our Windows service or SDK. Write the server-side logic to handle payment processing, invoking our services. Develop data management. Setup logging according to our guides. Consult us to set up reporting and reconciliation processes.

Integration Checklist
Ease of integration

Number prioritizes straightforward and efficient integration. Check our quickstart guide and integration checklist to see how you can get started.

Integrate Number

Use our API, PayForm, Verifone service or mobile SDK to integrate Number into your system.

Services

Our comprehensive range of services is designed to meet various needs, ensuring users can find tailored solutions for every requirement.

Visit our Services and Supported Features page to compare our services and learn more about the supported features and payment methods.

Supported features

Our diverse payment features include:

  • Online payments

  • Card present payments

  • Storing a card on file

  • Surcharge payments

  • Recurring payments

  • Authorizing payments

  • Voiding (reversals)

  • Crediting (refunds)

  • Settlements

  • Reporting

  • Manual keyed transactions

Get your business started

Adoption is crucial for maximizing the benefits of any payment solution, and Number is designed with this in mind. Our platform emphasizes easy user adoption and streamlined customer onboarding, ensuring a smooth transition for both end-users and merchants.

See how you can Get Your Business Started.

Customer Support

Resources

Here are the articles in this section:

Tools and Downloads >

Vocabulary >

Querying >

Error Codes >

Software Requirements >

Developer Quickstart

Integration Checklist

REST API Reference

Verifone Win Service & SDK

Android Mobile SDK

iOS Mobile SDK

REST API

SOAP API

Android Mobile SDK

iOS Mobile SDK

PayForm Widget

Verifone Win Service & SDK

Virtual Terminal

Custom Desktop Application

Cover
Cover
Cover
Cover
Cover
Cover

Software Requirements

Minimum software requirements for running Number services

Number software is a collection of lightweight software products that can be customized to run on most platforms with minimal resource requirements. Although Number has a solution for most platforms, we do recommend the following requirements to run our products efficiently.

Computer specifications

Processor minimum: Intel i5 Gen 5 and AMD Ryzen 5 RAM minimum: 8GB (4GB free)

Operating systems

  • Microsoft Windows 8.1+

  • MacOS Sierra 10.12+

Browsers

  • Microsoft Edge v122.00+

  • Google Chrome v122.0.626.1.111+

  • Mozilla Firefox v123.01+

  • Safari version v17.3.1+

Consent Annual

Calculate surcharging or convenience feesCharge a stored cardCreate Annual Consent

Cancel a consent (Card On File)Modify an annual consentCreate an annual consent with manual card entry

Consent Subscription

Modify a consent subscription
Cancel a consent subscription

Card Operations

Process a Card Sale
Process a Refund

API Input Validation

Basic details about input validation in the APIs

The following string values are validated within the APIs and will only allow a finite set of characters. If you send characters which are not allowed, you can receive an ErrCode of 7123.

Field / fields
Allowed characters

Firstname, Lastname

Alphanumeric, single quote, minus sign, period, space, ampersand, comma, question mark, forward slash.

Company, Title

Alphanumeric, minus sign, period, pound sign, underscore, comma, ampersand, forward slash.

Address

Testing

Test your integration before going live.

Before you go live, you'll need to test your integration, and the Number team will need to validate it.

To help you with that, we've compiled all the information regarding transaction and consent verification, sandbox cards and test data, penny codes, and return codes into this section.

Here are the articles in this section:

Basics

How to correctly integrate with Number and our backend

If you choose to use the REST API, we recommend you to read about Authentication, API Best Practices, and API Input Validation. You may also want to refer to the resources about Querying and Error Codes once you start working on the integration.

Here are the articles in this section:

REST API

The API reference for the REST API

Our REST API can be used to integrate any frontend or backend application with Number and use all of our payment services. This way, you have full control over the presentation, and we'll handle the complex payment processes. We recommend following our REST API integration guide to get started. It'll teach you all of the generic concepts you need to correctly authenticate, consume API responses, and how to recognize and handle errors, alongside code examples.

Apply credit to an ACH transaction

post: https://easypay5.com/APIcardProcREST/v1.0.0/ACH/ApplyCredit

SessKey string required

A unique session key used for authentication in API calls. This key is generated upon successful authentication and must be included in all subsequent requests.

Example: A1842D663E9A4A72XXXXXXXX303541303234373138


Content-Type string required

Tools and Downloads

Compilation of all tools and downloads from the documentation

API

All links and downloads for the REST API.

REST API downloads

Getting Started

Before you get started

To get the most out of using Number services, you'll need to define the type of integration (or integrations) you need, and learn some basic concepts around how to integrate.

In the next sections, you can read about all of the and find our to give you an overview of all the steps required to start using our services.

For all major types of integrations, there are additional integration guides or user guides under their respective sections.

Here are the articles in this section:

Consent Recurring

International

Generate a receipt for an international transaction

post: https://easypay5.com/APIcardProcREST/v1.0.0/Intl/ReceiptGenerate

REFID will be the transaction ID ReceiptType will always be 23 for International

Consuming the Response The member named ReceiptHtml holds the receipt data Important you must replace all Unicode characters to consume clean HTML Example : CleanHtml = Regex.Replace(my, @"[^\u0000-\u007F]+", string.Empty);

SessKey string required

A unique session key used for authentication in API calls. This key is generated upon successful authentication and must be included in all subsequent requests.

Recurring Schedule

Cancel a consent subscription

Cancel an existing subscription consent

post: https://easypay5.com/APIcardProcREST/v1.0.0/ConsentSubscription/Cancel

SessKey string required

A unique session key used for authentication in API calls. This key is generated upon successful authentication and must be included in all subsequent requests.

Example: A1842D663E9A4A72XXXXXXXX303541303234373138


Content-Type string required

Process a Refund

Process a refund to a settled charge

post: https://easypay5.com/APIcardProcREST/v1.0.0/CardSale/ApplyCredit

Use this call to process a refund to a settled charge. You will need the Transaction ID and the amount to be refunded.

SessKey string required

A unique session key used for authentication in API calls. This key is generated upon successful authentication and must be included in all subsequent requests.

Example: A1842D663E9A4A72XXXXXXXX303541303234373138


Void an ACH transaction

post: https://easypay5.com/APIcardProcREST/v1.0.0/ACH/Void

SessKey string required

A unique session key used for authentication in API calls. This key is generated upon successful authentication and must be included in all subsequent requests.

Example: A1842D663E9A4A72XXXXXXXX303541303234373138


Content-Type string required

Settlement

ACH

Alphanumeric, minus sign, period, pound sign, underscore, comma, forward slash. Single quotes are stripped out.

City

Alpha, space, period.

State, Country

Alpha, space.

Zip

Alphanumeric, space, dash.

ClientRefID, RPGUID

Alphanumeric, minus sign, period, pound sign, comma, underscore, space, equal sign, ampersand. Single quotes are stripped out.

ServiceDescrip

Alphanumeric, space, underscore, period, pound sign, minus sign.

Authentication >

API Best Practices >

API Input Validation >

Example: application/json

Accept string required

Example: application/json

TxID integer optional

Example: 2


CreditAmount number · float optional

Example: 15.25

{
  "TxID": 2,
  "CreditAmount": 15.25
}
{
  "ACH_ApplyCreditResult": {
    "ErrCode": 0,
    "ErrMsg": "",
    "FunctionOk": true,
    "RespMsg": "APPROVED 67210758 TXID 000041",
    "TxApproved": true,
    "TxID": 41
  }
}
Create a recurring consent with manual card entry
Modify a recurring consent
Cancel a recurring consent
Example: A1842D663E9A4A72XXXXXXXX303541303234373138

Content-Type string required

Example: application/json


Accept string required

Example: application/json

REFID string optional

The transaction ID

Example: 5eef4782-5be1-11ef-bbc1-46647bd59a7a


ReceiptType integer optional

The type of receipt, 23 for international

Example: 23


Recipient integer · enum optional

The targeted recipient type

  • 1: Merchant

  • 2: Customer

  • 3: Both

Example: 1

{
  "REFID": "5eef4782-5be1-11ef-bbc1-46647bd59a7a",
  "ReceiptType": 23,
  "Recipient": 1
}
{
  "Intl_ReceiptGenerateResult": {
    "ErrCode": 0,
    "ErrMsg": "",
    "FunctionOk": true,
    "ReceiptHtml": "HTML",
    "RespMsg": "Successfully Returned Transaction Receipt Markup"
  }
}
Cancel a recurring payment schedule
Process scheduled payments
Modify a recurring payment schedule
Process selected scheduled payments

Example: application/json


Accept string required

Example: application/json

ConsentID integer optional

ID of the consent to be canceled

Example: 12

{
    "ConsentID": 4162
}
{
    "ConsentSubscription_CancelResult": {
        "CancelSuccess": true,
        "CancelledConsentID": 4162,
        "ErrCode": 0,
        "ErrMsg": "",
        "FunctionOk": true,
        "RespMsg": "Successfully DISABLED ConsentID 4162 : Card Number Removed"
    }
}
Content-Type string required

Example: application/json


Accept string required

Example: application/json

TxID integer optional

Transaction ID of the charge to be refunded

Example: 56


CreditAmount number · float optional

Amount to be refunded

Example: 5

{
  "TxID": 56,
  "CreditAmount": 5
}
{
  "Transaction_ApplyCreditResult": {
    "ErrCode": 0,
    "ErrMsg": "",
    "FunctionOk": true,
    "RespMsg": "Successful Credit Pending Transaction ID : 000057",
    "TxApproved": true,
    "TxID": 57
  }
}
Example: application/json

Accept string required

Example: application/json

TxID integer optional

Example: 35

{
  "TxID": 35
}
{
  "ACHTransaction_VoidResult": {
    "AuthID": "67210748",
    "ErrCode": 0,
    "ErrMsg": "",
    "FunctionOK": true,
    "RespMsg": "VOID APPROVED 67210748 TXID 35",
    "TxApproved": true,
    "TxID": 35
  }
}
Execute selective batch settlement
Execute batch settlement for all transactions
Create an ACH Sale
Apply credit to an ACH transaction
Void an ACH transaction
Create an ACH Combo Sale and Consent
Process payment with ACH annual consent

Testing Overview >

Global Payments Testing >

First Data Testing >

ACH Testing >

Process payment with ACH annual consent

post: https://easypay5.com/APIcardProcREST/v1.0.0/ACH/ProcPayment

{
  "ConsentID": 21,
  "ProcessAmount": 5.1
}
{
  "ACHConsentAnnual_ProcPaymentResult": {
    "ErrCode": 0,
    "ErrMsg": "",
    "FunctionOk": true,
    "RespMsg": "APPROVED 67210748 TXID 000035",
    "TxApproved": true,
    "TxID": 72,
    "uniqueTranID": "16790131F349BCBA"
  }
}

SessKey string required

A unique session key used for authentication in API calls. This key is generated upon successful authentication and must be included in all subsequent requests.

Example: A1842D663E9A4A72XXXXXXXX303541303234373138


Content-Type string required

Example: application/json


Accept string required

Example: application/json

ConsentID integer optional

Example: 21


ProcessAmount number · float optional

Example: 5.1

Query

Account profileBatch logsRecurring consentsConsent General QueryReceipt DetailsTransaction Full DetailVoiceReconcile

ACH transactionsAnnual consentRetrieve full details of a recurring consentRecurring SchedulesTransaction SearchTransaction ReceiptEnumeration values

Mobile SDK

All links and downloads for the mobile SDKs.


Payment widgets

All links and downloads for the PayForm and the legacy widget.

PayForm links

Widget links


Verifone

All links and downloads for the Verifone card reader:

Verifone service for browser implementation

Verifone Middleware Installer

Verifone example web site

Sample Verifone Website

Sample Verifone Website Content

Verifone SDK reference

USB drivers and Logging Package

SDK Interface

Verifone Sample for SDK

Sample Program Executable

Sample Program Source Code


Virtual Terminal

All links and downloads for the Virtual Terminal.

Integration Options
Integration Checklist

Authentication

Authenticate user and retrieve session key

post: https://easypay5.com/APIcardProcREST/v1.0.0/Authenticate

{
  "AcctCode": "EP911XXXX",
  "Token": "2148B239CF6846BDA5D141BF4A4CFBE8"
}
{
  "AuthenticateResult": {
    "AuthSuccess": true,
    "ErrCode": 0,
    "ErrMsg": "",
    "FunctionOk": true,
    "MerchantList": [
      {
        "Address": "45 spring street portland Maine 04101",
        "Descrip": "Test Merchant 1",
        "ID": 1,
        "Location": "Test Merchant 1",
        "TermID": "006"
      }
    ],
    "RespMsg": "SessKey Expires|4/18/2019 7:29:47 AM",
    "SessKey": "B9F24903C3BA4770AE303032303541303032353437",
    "ThisUser": {
      "APILocationID": 2210,

Content-Type string required

Example: application/json


Accept string required

Example: application/json

AcctCode string optional

Account code that never changes

Example: EP911XXXX


Token string optional

Token that expires every 2 years

Example: 2148B239CF6846BDA5D141BF4A4CFBE8

Querying and Filtering

Find the information you need through the API or Virtual Terminal

If you need to find a specific record in our database (such as a transaction or saved consent) or you need to find all records matching your criteria, you can either query our APIs programatically or use the Virtual Terminal to view and filter the records from its user interface.

REST API

To query records, you'll need to find a relevant method in the REST API reference.

When querying, you'll need to prepare the Query string. It should consist of variables that correspond to fields on the records and logical terms built using those variables.

All Query string variable options are fully described in the API reference under specific API methods and in the reference. You can use the variables to build logical terms, and you can build and join logical terms using "&&" for a logical AND or "||" for a logical OR.

Read about Number's query language in our reference.

Depending on the type of record you're querying (transaction, consent, ...), the variables you can use inside of a Query string will differ. The formatting rules do not change.

Example

As an example, if want to find settled ACH transactions made in January 2025 made using Verifone card readers, you can call or depending on which API you are using.

You can check the description of the Query string parameter or check the reference for section to find out that variable 'B' corresponds to transaction status, variable 'C' corresponds to date created, and 'U' corresponds to the transaction origin.

Each variable which requires an enum includes a description of valid values. Settled transactions have a transaction status of '2', and Verifone transactions have an origin of 'SDK'. To format the date correctly, follow the examples given for the variable.

You can combine the filters to build your Query string like so:


Virtual Terminal

You can filter consents, transactions, and other records through the Virtual Terminal user interface.

To log into the Virtual Terminal, you need to have a user account created through the Client Admin Portal as described in the quickstart guide.

Once you're logged in, see the navigation on the left and click on Scheduled to view scheduled payments, click on Settlement to view settlements, or expand Reports to find other reports. There, you'll be able to search and filter records using the user interface.

You can read more about using the Virtual Terminal in the guide.

Account profile

post: https://easypay5.com/APIcardProcREST/v1.0.0/Query/AccountProfile

{
  "AccountProfileQryResult": {
    "AccountProfile": {
      "AccountCode": "EP9116875",
      "AccountName": "EP DEV ACCT",
      "AutoSchedule": true,
      "AutoSettle": true,
      "AutoSettleHour": 0,
      "AutoSettleMinute": 0,
      "BatchReport": false,
      "DateCreated": "2024-12-01T11:19:01.000Z",
      "DateModified": "2024-12-01T11:19:01.000Z",
      "ID": 205,
      "IndustryCode": "",
      "TimeZone": "Dateline Standard Time",
      "TransReport": false
    },
    "ErrCode": 0,
    "ErrMsg": "",

SessKey string required

A unique session key used for authentication in API calls. This key is generated upon successful authentication and must be included in all subsequent requests.

Example: A1842D663E9A4A72XXXXXXXX303541303234373138


Content-Type string required

Example: application/json


Accept string required

Example: application/json

Cancel a recurring payment schedule

post: https://easypay5.com/APIcardProcREST/v1.0.0/RecurringSchedule/Cancel

{
  "SchedID": 10
}
{
  "RecurringSchedule_CancelResult": {
    "ErrCode": 0,
    "ErrMsg": "",
    "FunctionOk": true,
    "RespMsg": "Successful Cancel of SchedID 10 For $10.00 On 6/23/2019",
    "ScheduledPayment": {
      "AcctHolderID": 782,
      "AcctNo": 119,
      "ConsentID": 396,
      "ConsentType": "S",
      "DueOn": "2024-12-01T11:19:01.000Z",
      "ID": 282,
      "LastName": "Draper",
      "MerchID": 1,
      "OfTotalPayment": 100,
      "OfTotalPayments": 10,
      "PaymentAmt": 300,
      "PaymentNum": 1,

SessKey string required

A unique session key used for authentication in API calls. This key is generated upon successful authentication and must be included in all subsequent requests.

Example: A1842D663E9A4A72XXXXXXXX303541303234373138


Content-Type string required

Example: application/json


Accept string required

Example: application/json

SchedID integer optional

The unique identifier for the schedule to be canceled

Example: 10

Calculate surcharging or convenience fees

post: https://easypay5.com/APIcardProcREST/v1.0.0/ConsentAnnual/CalcFees

This API call is for merchant accounts that are specifically configured for surcharge and/or convenience fee processing. Prior to charging a card on file, you may use this method to properly calculate the intended fees (Surcharging or Convenience fees ).

Fees will be calculated based on the merchant configuration and the card type itself. It is important to show the calculated fees at the point of sale so that a cardholder can reject the sale if they desire.

You can specify a Alternate MerchID rather than use the merchant record originally designated when you saved the card. A Value Of ZERO will use the original Merchant record.

Once you have determined your fees you can then call the method named : Charge Stored Card with Options to authorize the sale.

{
  "ConsentID": 7849,
  "Amount": 52,
  "AlternateMerchID": 0
}
{
  "ConsentAnnual_CalcFeesResult": {
    "ErrCode": 0,
    "ErrMsg": "",
    "FunctionOk": true,
    "RespMsg": "Fees calculated for CREDIT Card 4663XXXXXXXX2741",
    "Amounts": {
      "BaseAmt": 52,
      "Surcharge": 1.04,
      "TotalAmt": 53.04
    }
  }
}

SessKey string required

A unique session key used for authentication in API calls. This key is generated upon successful authentication and must be included in all subsequent requests.

Example: A1842D663E9A4A72XXXXXXXX303541303234373138


Content-Type string required

Example: application/json


Accept string required

Example: application/json

ConsentID integer optional

ID for consent associated with the merchant account

Example: 7849


Amount number · float optional

Base $ amount for which fees are to be calculated

Example: 52


AlternateMerchID integer optional

ID of the merchant to collect the payment funds. Use 0 for the merchant on consent.

Modify a recurring payment schedule

post: https://easypay5.com/APIcardProcREST/v1.0.0/RecurringSchedule/Modify

{
  "SchedID": 10,
  "PaymentAmount": 10,
  "DueDate": "2023-07-10T00:00:00.000Z"
}
{
  "RecurringSchedule_ModifyResult": {
    "ErrCode": 0,
    "ErrMsg": "",
    "FunctionOk": true,
    "RespMsg": "Successful Reschedule of SchedID 10 For $10.00 On 7/10/2023",
    "ScheduledPayment": {
      "AcctHolderID": 782,
      "AcctNo": 119,
      "ConsentID": 396,
      "ConsentType": "S",
      "DueOn": "2024-12-01T11:19:01.000Z",
      "ID": 282,
      "LastName": "Draper",
      "MerchID": 1,
      "OfTotalPayment": 100,
      "OfTotalPayments": 10,
      "PaymentAmt": 300,
      "PaymentNum": 1,

SessKey string required

A unique session key used for authentication in API calls. This key is generated upon successful authentication and must be included in all subsequent requests.

Example: A1842D663E9A4A72XXXXXXXX303541303234373138


Content-Type string required

Example: application/json


Accept string required

Example: application/json

SchedID integer optional

The unique identifier for the schedule to be modified

Example: 10


PaymentAmount number · float optional

The new $ payment amount for the schedule

Example: 10


DueDate string · date optional

The new due date for the schedule

Transaction Receipt

Retrieve a transaction receipt

post: https://easypay5.com/APIcardProcREST/v1.0.0/Query/TransactionReceipt

{
  "TxID": 2,
  "ReceiptType": 2
}
{
  "TransactionReceiptQryResult": {
    "ErrCode": 0,
    "ErrMsg": "",
    "FunctionOk": true,
    "ReceiptHtml": "html",
    "RespMsg": "Successfully Returned Transaction Receipt Markup"
  }
}

SessKey string required

A unique session key used for authentication in API calls. This key is generated upon successful authentication and must be included in all subsequent requests.

Example: A1842D663E9A4A72XXXXXXXX303541303234373138


Content-Type string required

Example: application/json


Accept string required

Example: application/json

TxID integer optional

The unique identifier for the transaction

Example: 2


ReceiptType integer · enum optional

The type of receipt

  • 1: Transaction

Execute batch settlement for all transactions

post: https://easypay5.com/APIcardProcREST/v1.0.0/Settlement/ExecuteBatch_All

{
  "MerchID": 1
}
{
  "Settlement_ExecuteBatch_AllResult": {
    "BatchResult": {
      "BatchClose": 720191352,
      "BatchLogID": 103,
      "BatchNetAmount": 10,
      "BatchNum": 3,
      "BatchOpen": 720191352,
      "BatchTransCount": 1,
      "Code": "A",
      "RemainingUnsettled": 0,
      "ResultText": "OK 003 0720 0000                ",
      "TxLock": "7A639CD720CE4B14"
    },
    "ErrCode": 0,
    "ErrMsg": "",
    "FunctionOk": true,
    "RespMsg": "Successful Settlement : OK 006 0808 0000                ",
    "SettlementApproved": true

SessKey string required

A unique session key used for authentication in API calls. This key is generated upon successful authentication and must be included in all subsequent requests.

Example: A1842D663E9A4A72XXXXXXXX303541303234373138


Content-Type string required

Example: application/json


Accept string required

Example: application/json

MerchID integer optional

The merchant identifier

Example: 1

Receipt Details

post: https://easypay5.com/APIcardProcREST/v1.0.0/Query/ReceiptDetail

{
  "TxID": 12
}
{
  "ReceiptDetail_QueryResult": {
    "ErrCode": 0,
    "ErrMsg": "",
    "FunctionOk": true,
    "ReceiptInfo": {
      "AC": null,
      "AID": "A0000000031010",
      "ARC": "00",
      "AcctHolderID": 1,
      "CardHolder": "Sean Wood",
      "CardNumber": "1111",
      "CardType": "VI",
      "EndCustID": 12,
      "EndCustomer": "JOHN DOE",
      "EntryType": "MANUAL",
      "MerchAddress": "45 spring street",
      "MerchCity": "portland",
      "MerchDescrip": "Test Merchant 1",

SessKey string required

A unique session key used for authentication in API calls. This key is generated upon successful authentication and must be included in all subsequent requests.

Example: A1842D663E9A4A72XXXXXXXX303541303234373138


Content-Type string required

Example: application/json


Accept string required

Example: application/json

TxID integer optional

Transaction ID for which to retrieve the receipt details

Example: 12

Authentication

A quickstart guide to authenticating with Number services

Basics

To authenticate to our services, depending on your integration of choice, you might need the following:

1

Reconcile

Reconcile transactions

post: https://easypay5.com/APIcardProcREST/v1.0.0/Query/Reconcile

The reconcile Query is designed to be called at a specific periodic interval, perhaps once per day. We will return all the unique transaction IDs encountered during that interval. The query allows you to reconcile this list with data you have gathered during cardholder data interactions such as PayForm or Verifone Activity. If you find that a particular transaction is missing in your database you can call the TRANSACTION FULL DETAIL to consume any missing information.

You may specify either Credit Card or ACH transactions to be returned in the Query ( see qType parameter ) use "CARD" or "ACH". When choosing dates you can consider the StartDate to be Included in your data request however the EndDate will not. You will receive all data which runs up to but not including the end date. For example choosing the following dates will provide data for a single day on the calendar: "2024-12-01" "2024-12-02"

IMPORTANT: Do not call this method more than once a day. Excessive queries can cause your endpoint to be blocked. The max date range for this method is 31 days. The max records returned is 20,000. If you notice that the NumRecords returned equals 20000 then this means you have maxed out your query and you should use a smaller date range.

Receipt

Generate a transaction receipt

post: https://easypay5.com/APIcardProcREST/v1.0.0/Receipt/ReceiptGenerate

Use this call to request receipt details in HTML format for a particular TXID (Transaction ID). This method works for card on file documents as well as transaction receipts. You will need the TXID (Transaction ID) as well as a receipt type and a targeted recipient ( Customer or Merchant ).

The following will provide a customer receipt for TXID 123:

{ "REFID": 123, "ReceiptType": 1 (Sales Receipt) "Recipient": 1 (Customer Copy) }

Important you must replace all Unicode characters to consume clean HTML

Example : CleanHtml = Regex.Replace(my, @"[^\u0000-\u007F]+", string.Empty);

Process scheduled payments

post: https://easypay5.com/APIcardProcREST/v1.0.0/RecurringSchedule/ProcessScheduledPayments

SessKey string required

A unique session key used for authentication in API calls. This key is generated upon successful authentication and must be included in all subsequent requests.

Example: A1842D663E9A4A72XXXXXXXX303541303234373138


Content-Type string required

Cancel a consent (Card On File)

post: https://easypay5.com/APIcardProcREST/v1.0.0/ConsentAnnual/Cancel

Use this call to Cancel a consent (Card On File). You will need the ConsentID in order to execute this method.

SessKey string required

A unique session key used for authentication in API calls. This key is generated upon successful authentication and must be included in all subsequent requests.

Example: A1842D663E9A4A72XXXXXXXX303541303234373138


Enumeration values

Methods related querying general information such as enum values

post: https://easypay5.com/APIcardProcREST/v1.0.0/Query/Enum

SessKey string required

A unique session key used for authentication in API calls. This key is generated upon successful authentication and must be included in all subsequent requests.

Example: A1842D663E9A4A72XXXXXXXX303541303234373138


Content-Type string required

Customer Support

We are here to assist you with Number integration. Our dedicated support team is ready to answer all technical and business-related questions. You can count on our support 24/7.

Use one of the recommended contact options:


Voice

Retrieve voice settings

post: https://easypay5.com/APIcardProcREST/v1.0.0/Query/VoiceSettings

SessKey string required

A unique session key used for authentication in API calls. This key is generated upon successful authentication and must be included in all subsequent requests.

Example: A1842D663E9A4A72XXXXXXXX303541303234373138


Content-Type string required

Testing Considerations

Responses

When Processing using the API or the VeriFone Middleware you should be ready to consume the following types of responses:

  1. Approvals

Example: 0

2: Void
  • 3: Refund

  • 4: Annual Consent

  • 5: Recurring Consent

  • 6: Subscription

  • 7: ACH Transaction

  • 8: ACH Void

  • 9: ACH Refund

  • Example: 2

    Possible values: 1,2,3,4,5,6,7,8,9

    "AccountCode": "EP9116875",
    "AcctID": 205,
    "Alias": "vidya_Venkatraman",
    "CreatedBy": "ADMIN : vidya Venkatraman",
    "DateCreated": "2024-12-01T11:19:01.000Z",
    "DateModified": "2024-12-01T11:19:01.000Z",
    "Description": "EP DEV ACCT",
    "ExpirationDate": "2024-12-01T11:19:01.000Z",
    "ID": 2547,
    "IsExpired": false,
    "IsLockedOut": false,
    "TokenDescription": "EP DEV ACCT"
    }
    }
    }
    "FunctionOk": true,
    "RespMsg": "Successfully Returned Account profile for Account ID 205"
    }
    }
    "Period": "WEEKLY",
    "RPGUID": "adf98580-b4ab-42fc-bb99-01c89964afe9",
    "RStatus": "S",
    "SchedNum": 59,
    "Tries": 0,
    "TxID": -1
    }
    }
    }

    Example: 2023-07-10T00:00:00.000Z

    "Period": "WEEKLY",
    "RPGUID": "adf98580-b4ab-42fc-bb99-01c89964afe9",
    "RStatus": "S",
    "SchedNum": 59,
    "Tries": 0,
    "TxID": -1
    }
    }
    }
    }
    }
    "MerchEmail": "vidya",
    "MerchNumber": "700000000768",
    "MerchPhone": "2078548547",
    "MerchState": "Maine",
    "MerchTID": null,
    "MerchZip": "04101",
    "RefID": "",
    "TSI": "F800",
    "TVR": 8000,
    "TxAmount": 0,
    "TxDateTime": "2024-12-01T11:19:01.000Z",
    "TxID": 12,
    "TxStatus": "OPEN",
    "TxType": "CCAUTHONLY",
    "TxnCode": "297620"
    },
    "RespMsg": "Successfully Returned Receipt Detail for TxID 12"
    }
    }

    Integration Checklist >

    Integration Options >

    Basics >

    Client Admin Portal >

    SessKey string required

    A unique session key used for authentication in API calls. This key is generated upon successful authentication and must be included in all subsequent requests.

    Example: A1842D663E9A4A72XXXXXXXX303541303234373138


    Content-Type string required

    Example: application/json


    Accept string required

    Example: application/json

    StartDate object optional

    The start date

    Example: 2024-12-01T00:00:00.000Z


    EndDate object optional

    The end date

    Example: 2025-01-01T00:00:00.000Z


    qType string optional

    Type of transactions returned

    Example: CARD

    {
      "StartDate": "2024-12-01T00:00:00.000Z",
      "EndDate": "2025-01-01T00:00:00.000Z",
      "qType": "CARD"
    }
    {
      "ReconcileResult": {
        "ErrCode": 0,
        "ErrMsg": "",
        "FunctionOk": true,
        "NumRecords": 1,
        "RespMsg": "Successfully Returned Transaction Records : 1",
        "Transactions": [
          {
            "AMOUNT": 10,
            "CreatedOn": "2024-12-01T11:19:01.000Z",
            "Origin": "API",
            "TxID": -1,
            "TxSTATUS": "OPEN"
          }
        ]
      }
    }

    SessKey string required

    A unique session key used for authentication in API calls. This key is generated upon successful authentication and must be included in all subsequent requests.

    Example: A1842D663E9A4A72XXXXXXXX303541303234373138


    Content-Type string required

    Example: application/json


    Accept string required

    Example: application/json

    REFID integer optional

    The unique reference identifier for the transaction

    Example: 158


    ReceiptType integer · enum optional

    The type of receipt

    • 1: Transaction

    • 2: Void

    • 3: Refund

    • 4: Annual Consent

    • 5: Recurring Consent

    • 6: Subscription

    • 7: ACH Transaction

    • 8: ACH Void

    • 9: ACH Refund

    Example: 2


    Recipient integer · enum optional

    The targeted recipient type

    • 1: Merchant

    • 2: Customer

    • 3: Both

    Example: 1

    {
      "REFID": 158,
      "ReceiptType": 1,
      "Recipient": 1
    }
    {
      "ReceiptGenerateResult": {
        "ErrCode": 0,
        "ErrMsg": "",
        "FunctionOk": true,
        "ReceiptHtml": "html",
        "RespMsg": "Successfully Returned Transaction Receipt Markup"
      }
    }
    Example: application/json

    Accept string required

    Example: application/json

    MerchID integer optional

    The merchant identifier for processing payments

    Example: 1

    {
      "MerchID": 1
    }
    {
      "ProcessScheduledPaymentsResult": {
        "ApprovedPayments": [
          {
            "AcctNo": "1111",
            "CardHolder": "JOHN DOE",
            "CardType": "VI",
            "ConsentID": 6,
            "ConsentType": "S",
            "ErrMsg": "",
            "IsPartialApproval": false,
            "MerchID": 1,
            "PaymentAmt": 10,
            "PaymentDate": "2024-12-01T11:19:01.000Z",
            "PaymentNum": 1,
            "SEQ": "119",
            "SchedID": 1,
            "SchedNum": 1,
            "TxApproved": true,
            "TxID": 104,
            "TxnCode": 90944
          }
        ],
        "DeclinedPayments": [
          {
            "AcctNo": "1111",
            "CardHolder": "JOHN DOE",
            "CardType": "VI",
            "ConsentID": 6,
            "ConsentType": "S",
            "ErrMsg": "",
            "IsPartialApproval": false,
            "MerchID": 1,
            "PaymentAmt": 10,
            "PaymentDate": "2024-12-01T11:19:01.000Z",
            "PaymentNum": 1,
            "SEQ": "119",
            "SchedID": 1,
            "SchedNum": 1,
            "TxApproved": true,
            "TxID": 104,
            "TxnCode": 90944
          }
        ],
        "ErrCode": 0,
        "ErrMsg": "",
        "FunctionOk": true,
        "NumApproved": 2,
        "NumDeclined": 1,
        "NumPartialAuths": 0,
        "NumProcessed": 3,
        "RespMsg": "Total Processed: 3 Approved: 2 Declined: 1 Partial: 0"
      }
    }
    Content-Type string required

    Example: application/json


    Accept string required

    Example: application/json

    ConsentID integer optional

    ID of the consent to be canceled

    Example: 20

    {
      "ConsentID": 20
    }
    {
      "ConsentAnnual_CancelResult": {
        "CancelSuccess": true,
        "CancelledConsentID": 20,
        "ErrCode": 0,
        "ErrMsg": "",
        "FunctionOk": true,
        "RespMsg": "Successfully DISBALED ConsentID 20 : Card Number Removed"
      }
    }

    Example: application/json


    Accept string required

    Example: application/json

    Query string · enum optional

    The enumeration type to query.

    Example: TXStatus

    Possible values: ACHStatus

    ACHType

    AConsentType

    BatchSettleMode

    BatchSettleStatus

    ConsentType

    IntAction

    IntlAction

    IntlResult

    IntlStatus

    Period

    ReceiptType

    Recipient

    RecurSchedStatus

    TxStatus

    TxType

    {
      "Query": "TXStatus"
    }
    {
      "Enum_QueryResult": {
        "EnumItems": [
          {
            "EnumText": "ALL",
            "EnumValue": -1
          }
        ],
        "ErrCode": 0,
        "ErrMsg": "",
        "FunctionOk": true,
        "RespMsg": "Successfully Returned Enum Records : 6"
      }
    }

    Example: application/json


    Accept string required

    Example: application/json

    TxID integer optional

    The unique identifier for the transaction

    Example: 2

    {
      "TxID": 2
    }
    {
      "VoiceSettingsQryResult": {
        "ErrCode": 0,
        "ErrMsg": "",
        "FunctionOk": true,
        "RespMsg": "Successfully Returned Voice Settings",
        "VoiceSettings": {
          "AccountHolder": "Sean Wood",
          "BankNumber": "067600",
          "CardNumber": "wDgEk7v5w7c=is9fm7hewavmpQks4Y5qRMNDNKGGk7on",
          "ChargeAmount": 0,
          "ExpDate": "1028",
          "MerchantID": "27150000350101",
          "PhoneNumber": "1-800-944-1111"
        }
      }
    }
    Declines
  • Aspen Errors (non-zero error code)

  • Exceptions within your processing layer (Timeouts or other Comm issues )

  • For PayForm and Virtual Terminal, all of this is handled for you, however when using the API or the VeriFone your software must properly consume and handle the above conditions.

    Lets take a look at the API first

    If you attempt an API call such as VOID a credit card transaction you should first set up to handle the exception.

    You can easily test your ability to consume an Aspen Error by simply trying to Void a transaction that doesn’t exist. Try sending a large number beyond the number of transactions already committed.

    The response will look like the following. Notice the FunctionOK flag is false which will be your QUE to look at the error code and log this condition:

    Even if no error is encountered you still might not have the successful VOID as the card issuer may decline the reversal. Always make sure you check the TxApproved Flag .

    If the card issuer declines your reversal attempt you will notice that FunctionOK = True ( No Aspen Errors were encountered ) but TxApproved = False (issuer declined the reversal)

    In this case you will Monitor the RespMsg for any further information regarding the decline

    Here is the proper order when consuming the API response:

    1. Catch any exception in communicating to EasyPay ( perhaps a Timeout )

    2. Check status of FunctionOK flag ( If false then check and log error codes and error message)

    3. Check any TxApproved or other success flags for final discovery of approved operation

    Verifone testing

    To simulate a issuer decline using your test account you can send the following Amount ( $12345.67 ) . You will notice that the TxEventType = TxDecline and the RespMsg will describe the decline and the TxnCode will have a Decline Code.

    To simulate an Aspen Error using your test account you can send the following Amount ( $12345.68 )

    You will notice the TxEventType = AspenError , you will then monitor the ErrCode and ErrMsg

    To Simulate our site being unavailable you can always create a Temporary Host Entry for EasyPay5.com to a Fake IP address.

    Example : 99.99.99.99 easypay5.com

    After you attempt a transaction, you will see a TxEventType = Exception with a particular error code and error message which you can log.

    Remember to remove the host entry when finished.

    try
    {
        response = await httpClient.PostAsync(apiUrl, content);
    }
    catch (Exception ee)
    {
        return "Exception : " + ee.Message;
    }
    {
        "TxID": 53000
    }
    {"Transaction_VoidResult":{
        "ErrCode":6724,
        "ErrMsg":"ERROR:6724:HIGH:Could NOT retrieve transaction details for TXID 53000",
        "FunctionOk":false,
        "RespMsg":"",
        "TxApproved":false,
        "TxID":0
        }
    }
    An account code and token

    Using your unique key representing the Number account and the token generated from the Client Admin Portal, you'll be able to authenticate to the REST API.

    2

    API key

    When initializing either of the mobile SDKs, you'll need an API key provided by Number.

    3

    HMAC secret

    If you are PCI Compliant and want to use our REST API to collect cardholder data, some endpoints will require you to append additional data to the session header. You'll be able to generate this header using an HMAC secret provided by us.

    4

    Username and password

    When logging into the Virtual Terminal you'll need a username and password. When logging into the Client Admin Portal this will also require two-factor authentication using a text message to your mobile phone.


    REST API

    Here's a basic step-by-step guide on how to authenticate with our APIs:

    1

    Find your account code

    This will be provided by Number when you create an account with us.

    2

    Create a new token

    Use the Client Admin Portal to create a token. If you don't have access to the Client Admin Portal, contact the .

    3

    Send a request to authenticate and store the session key

    You'll need to provide your account code as AcctCode and token as Token.

    REST API:

    Handle the response and store the SessKey

    4

    Include the session key in your requests

    If you don't encounter a PCI Level 1 compliance warning in API reference page:

    For REST API, include a SessKey header with the stored value.

    In case you encounter the compliance warning in API reference page, as seen below:

    If you want to read more about authentication, see the Authentication guide


    Android and iOS SDK

    Authenticating with the mobile SDKs is very simple. Contact Number to get an API key, HMAC secret, and an optional Sentry DSN.

    After installing the SDK of your choice, you can configure and initialize the EasyPay class.

    Android

    iOS


    Virtual Terminal

    To log in and use the features of Virtual Terminal, you'll first need to create accounts for your users through the Client Admin Portal.

    To access the portal, Contact Number. You will be asked to provide the full name, e-mail address, and cell phone number for every individual you wish to have access to the portal. Those individuals will then be able to enter the portal and create new Virtual Terminal users through the portal by entering Manage Accounts > Users through the navigation on the left.

    Now, those users will be able to access the Virtual Terminal using the link below.

    AI Assistant - your 24/7 customer support

    The Number provides its customers with access to a modern AI assistant based on the technical documentation of our solution. Contact us to get access!

    [email protected] / tel. (866) 927-9344

    Cover

    24/7 Email Support Reach out to our support team at:

    We are available around the clock to provide guidance and resolve any technical issues you may encounter, with a commitment to responding within 24 hours.

    Cover

    Phone Support Call our support line at:

    (866) 927-9344

    Our experts are available Monday to Friday from 9:00 AM to 5:00 PM (EST) to help you with more complex integration challenges.

    Querying
    Querying
    Querying
    Authentication
    Virtual Terminal
    Virtual Terminal navigation
    Consent list and filters
    Transaction list and filters

    Services and Supported Features

    A short compilation of Number services and supported features

    REST API

    Characteristics: Enables integration of payment systems with external applications, allowing for full automation.

    Use Cases: Perfect for companies developing custom applications with embedded payment functionality that are adaptable to various programming environments.

    To learn how to use the API, see the integration guide.

    Supported features:

    Feature
    Description


    Android/iOS Mobile SDK

    Characteristics: Provides tools and libraries for integrating payment processing into mobile apps, with pre-built UI components and security features for Android and iOS.

    Use Cases: Ideal for developers aiming to offer seamless in-app payments, especially in e-commerce and subscription-based mobile applications.

    To learn to use mobile SDKs, see the and integration guides.

    Supported features:

    Feature
    Description


    PayForm

    Characteristics: A plug-and-play payment form that can be easily embedded on websites without advanced technical setup. Requires simple API integration to initiate the form.

    Use Cases: Ideal for businesses seeking a quick, simple way to accept online payments without extensive integration. Can be rendered in IFrame or as a top-level page.

    To learn to use the PayForm, see the configuration guide.

    Supported features:

    Feature
    Description


    Virtual Terminal

    Characteristics: Web application that provides comprehensive credit card processing functionality, including authorizations, credits, voids, and reporting, while supporting card swipers and chip readers for secure transactions.

    Use Cases: It is ideal for in-person/card-present transactions, allowing merchants to efficiently process payments directly at the point of sale with the Windows service installed.

    To learn to use the Virtual Terminal, see the user guide.

    You can also use our custom desktop application as an alternative to the Virtual Terminal. The desktop application supports much of the same features.

    It can be installed on user's computer, and it's beneficial for businesses who would rather not log into a browser application.

    To learn more about our custom desktop application, .

    Supported features:

    Feature
    Description


    Win Service and DLL

    Characteristics: Used by your application and a Verifone card reader to integrate Number payment functions.

    Use Cases: For developers integrating payment functionalities into card readers and custom applications.

    Learn more about integrating with Verifone in the integration guide.

    Supported features:

    Functionality
    Description

    Integration Checklist

    The comprehensive checklist to integrating with Number

    Integrating payment processing into your system can be a daunting task. To help you on this journey, we've prepared a checklist which describes all the steps required from creating a Number account to going live, including the design, development, and testing.

    1

    Create a Number account and obtain credentials: 1-2 days

    Sign up for a Number Sandbox account to gain access to the platform and its features. Ensure you have all necessary business information ready for registration.

    Contact us to sign up for a Number Sandbox account: / (866) 927-9344

    After account creation, retrieve the necessary credentials from the Number Client Admin Portal. This will be essential for encryption and authentication.

    2

    Choose your integration methods: 1-2 days

    Read about the and decide which one best suit your business needs. Options include:

    • REST API and the PayForm: Utilize the Number API and a customizable pre-built payment form that can be integrated directly into your site.

    • Verifone: Collect payments using Verifone card readers with our software.

    3

    Develop a payment workflow: 1-2 days

    Outline all interaction points in your current workflow where payments might be collected.

    Define your requirements for various types of payment processes and equipment (card readers, web payments, card-present transactions, back-office processes, and reporting mechanisms).

    4

    Develop the frontend components: 1-2 weeks

    If you are using the mobile SDKs or the Virtual Terminal, you can skip this step as you won't need to develop any additional frontend or UI components.

    Create the frontend components necessary for user interaction.

    5

    Develop the EMV integration: 1 week

    Unless you want to use Verifone card readers or other card readers, you can skip this step as you won't need the EMV integration.

    Implement EMV functionality provided by our Windows service or SDK to support chip card transactions. Read the guide to learn how to use these services.

    6

    Develop the backend integration: 2-3 weeks

    Depending on the scope of your integration, it might take less time. Also, you can skip this step if you only plan on only using the Virtual Terminal.

    Write the server-side logic to handle payment processing, invoking our services. Develop data management, coupling your users with the payment activities by storing consent or transaction IDs, and optionally storing transaction amounts for reconciliation.

    7

    Develop the processes for logging, reporting, and reconciliation: 1 week

    Set up basic logging where applicable. Consult us to set up reporting and reconciliation processes. They will allow you to track transactions and ensure financial accuracy.

    8

    Test your integration on a development environment: 1-2 weeks

    Before going live, thoroughly test your integration in a sandbox environment. Ensure that all payment flows work as expected and that you can handle various transaction scenarios. You can read more about using the sandbox in the section. Conduct unit testing to validate the integration functionality before going live, ensuring all components work as intended.

    9

    Number inspection: 1-2 meetings

    The Number team always inspects the workflow that our clients develop prior to going live.

    10

    Go live: 1 day

    Once testing is complete and you are satisfied with the implementation, switch to the production environment. Update your configuration as necessary.

    11

    Monitor and maintain: continuous

    Once you go live, monitor your integration to make sure there are no problems. Work on improvements and fixes as required.

    Modify an annual consent

    post: https://easypay5.com/APIcardProcREST/v1.0.0/ConsentAnnual/Modify

    {
      "ConsentID": 10,
      "ConsentMods": {
        "ExpMonth": 10,
        "ExpYear": 22,
        "Email": "[email protected]",
        "Zip": "04106",
        "CustomerRefID": "A1235456",
        "ServiceDescrip": "REST API Testor",
        "RPGUID": "adf98580-b4ab-42fc-bb99-01c89964afe9",
        "NumDays": 365,
        "LimitPerCharge": 10000,
        "LimitLifeTime": 100000
      }
    }
    {
      "ConsentAnnual_ModifyResult": {
        "ErrCode": 0,
        "ErrMsg": "",
        "FunctionOk": true,
        "ModifySuccess": true,
        "RespMsg": "Success : Modified Consent ID : 10"
      }
    }

    SessKey string required

    A unique session key used for authentication in API calls. This key is generated upon successful authentication and must be included in all subsequent requests.

    Example: A1842D663E9A4A72XXXXXXXX303541303234373138


    Content-Type string required

    Example: application/json


    Accept string required

    Example: application/json

    ConsentID integer optional

    ID of the consent to be modified

    Example: 10


    ConsentMods object optional

    ExpMonth integer optional

    Expiration month of the card

    Example: 10


    ExpYear integer optional

    Consent General Query

    post: https://easypay5.com/APIcardProcREST/v1.0.0/Query/ConsentGeneral

    Query general consent records using specific filter criteria.

    {
      "Query": "(A=-1)&&(G=1)&&(E>='3/29/2023')&&(E<'4/29/2023')"
    }
    {
      "ConsentGeneral_QueryResult": {
        "Consents": [
          {
            "AcctHolderFirstName": "Sean",
            "AcctHolderID": 1140,
            "AcctHolderLastName": "Tester",
            "AcctNo": "0055",
            "AuthTxID": 2175,
            "ConsentType": "S",
            "CreatedBy": "Sally_Smith",
            "CreatedOn": "2024-12-01T11:19:01.000Z",
            "CustID": 1165,
            "CustomerRefID": "A1523644",
            "EndDate": "2024-12-01T11:19:01.000Z",
            "ID": 568,
            "IsEnabled": true,
            "MerchID": 1,
            "ModifiedBy": ":",
    

    SessKey string required

    A unique session key used for authentication in API calls. This key is generated upon successful authentication and must be included in all subsequent requests.

    Example: A1842D663E9A4A72XXXXXXXX303541303234373138


    Content-Type string required

    Example: application/json


    Accept string required

    Example: application/json

    Query string optional

    A query string for obtaining specific consent records using Number's query language. Build logical terms and join them with '&&' for logical AND or '||' for logical OR. Use single quotes for text and date values. Refer to the variable chart for query composition:

    • A: MERCHANT ID - The merchant record you are interested in, e.g. (A=1).

    • B: START DATE - The date the consent becomes active, e.g. (B>='10/20/2024').

    • C: END DATE - The date the consent expires, e.g. (C<='10/20/2024').

    Batch logs

    post: https://easypay5.com/APIcardProcREST/v1.0.0/Query/BatchLog

    {
      "Query": "(C>='7/19/2023')&&(C<'7/20/2023')"
    }
    {
      "Batch_Log_QueryResult": {
        "BatchLogs": [
          {
            "BatchAmt": 110,
            "BatchClose": "020224054035",
            "BatchNO": 512,
            "BatchOpen": "020224054031",
            "BatchRecs": 3,
            "Code": "A",
            "CreatedBy": "AUTOSCHED",
            "CreatedOn": "2024-12-01T11:19:01.000Z",
            "FinishedOn": "2024-12-01T11:19:01.000Z",
            "ID": 612,
            "MerchID": 3,
            "Released": 0,
            "SettleResp": "APPROVAL Batch:512:Recs:3:$110.00",
            "TxLOCK": "7A639CD720CE4B14"
          }
    

    SessKey string required

    A unique session key used for authentication in API calls. This key is generated upon successful authentication and must be included in all subsequent requests.

    Example: A1842D663E9A4A72XXXXXXXX303541303234373138


    Content-Type string required

    Example: application/json


    Accept string required

    Example: application/json

    Query string optional

    A query string for obtaining specific batch log records using Number's query language. Build logical terms and join them with '&&' for logical AND or '||' for logical OR. Use single quotes for text and date values. Refer to the variable chart for query composition:

    • A: MERCHANT ID - The merchant record you are interested in, e.g. (A=545).

    • B: STATUS - The status of the batch log, e.g. (B=-1).

    Recurring Schedules

    post: https://easypay5.com/APIcardProcREST/v1.0.0/Query/RecurringSchedule

    {
      "Query": "(E=1)&&(H=4)"
    }
    {
      "RecurringSchedule_QueryResult": {
        "ErrCode": 0,
        "ErrMsg": "",
        "FunctionOk": true,
        "NumRecords": 3,
        "RespMsg": "Successfully Returned Transaction Records : 3",
        "Schedule": [
          {
            "AcctHolderID": 782,
            "AcctNo": 119,
            "ConsentID": 396,
            "ConsentType": "S",
            "DueOn": "2024-12-01T11:19:01.000Z",
            "ID": 282,
            "LastName": "Draper",
            "MerchID": 1,
            "OfTotalPayment": 100,
            "OfTotalPayments": 10,
    

    SessKey string required

    A unique session key used for authentication in API calls. This key is generated upon successful authentication and must be included in all subsequent requests.

    Example: A1842D663E9A4A72XXXXXXXX303541303234373138


    Content-Type string required

    Example: application/json


    Accept string required

    Example: application/json

    Query string optional

    A query string for obtaining specific recurring schedule records using Number's query language. Build logical terms and join them with '&&' for logical AND or '||' for logical OR. Use single quotes for text and date values. Refer to the variable chart for query composition:

    • A: CONSENT ID - The unique identifier for the consent associated with the recurring schedule, e.g. (A=545).

    • B: STATUS - The status of the recurring schedule, e.g. (B=-1).

    Charge a stored card

    post: https://easypay5.com/APIcardProcREST/v1.0.0/ConsentAnnual/ChargeStoredCard

    This Method allows the user to charge a stored Card.

    ConsentID Please supply the ID of the Consent ( or stored card data )

    AlternateMerchID Here you can use ZERO if you plan to charge the same merchant record which was specified when saving the Card Info. You can use a positive integer if you plan to charge a merchant record which differs from the one originally used.

    purchDetails If you want to attach new reference data to the transaction you may do so using the following fields:

    ServiceDescrip : description of the transaction ClientRefID : your user defined reference ID RPGUID : another user defined reference ID If you choose NOT to supply these fields ( use empty string ) the system will pull this data from the original stored card data.

    Amounts Here you will supply the amount of the transaction. You may supply FEES but only if these have been properly configured for each Merchant record.

    If you don't have FEES configured simply supply the BaseAmt and TotalAmt.

    If you do Have Fees Configured you can call the method named: Calculate Annual Consent Fees prior to calling this method.

    You can specify fee values up to and including those determined using the above method.

    If you specify values greater than those calculated above, then your value will be clamped.

    IMPORTANT : Always check your response to determine the fees which are APPROVED as this may differ from what was REQUESTED.

    User Here you can assign a user to the sale so that we record the person which is initiating the sale within the integrator software.

    SessKey string required

    A unique session key used for authentication in API calls. This key is generated upon successful authentication and must be included in all subsequent requests.

    Example: A1842D663E9A4A72XXXXXXXX303541303234373138


    Content-Type string required

    Example: application/json


    Recurring consents

    post: https://easypay5.com/APIcardProcREST/v1.0.0/Query/ConsentRecurring

    {
      "Query": "(E>='12/01/2023')&&(E<'12/31/2023')"
    }
    {
      "ConsentRecurring_QueryResult": {
        "Consents": [
          {
            "AcctHolderFirstName": "VI",
            "AcctHolderID": 1040,
            "AcctHolderLastName": "VI",
            "AcctNo": "8888",
            "AuthTxID": 1835,
            "CreatedBy": "Tester Savannah",
            "CreatedOn": "2024-12-01T11:19:01.000Z",
            "CustID": 1062,
            "CustRefID": "",
            "EndDate": "2024-12-01T11:19:01.000Z",
            "ID": 522,
            "IsEnabled": true,
            "MerchID": 1,
            "ModifiedBy": ":",
            "ModifiedOn": "2024-12-01T11:19:01.000Z",
    

    SessKey string required

    A unique session key used for authentication in API calls. This key is generated upon successful authentication and must be included in all subsequent requests.

    Example: A1842D663E9A4A72XXXXXXXX303541303234373138


    Content-Type string required

    Example: application/json


    Accept string required

    Example: application/json

    Query string optional

    A query string for obtaining specific consent records using Number's query language. Build logical terms and join them with '&&' for logical AND or '||' for logical OR. Use single quotes for text and date values. Refer to the variable chart for query composition:

    • A: MERCHANT ID - The merchant record you are interested in, e.g. (A=1).

    • B: START DATE - The date the consent becomes active, e.g. (B>='10/20/2024').

    • C: END DATE - The date the consent expires, e.g. (C<='10/20/2024').

    Process selected scheduled payments

    post: https://easypay5.com/APIcardProcREST/v1.0.0/RecurringSchedule/ProcessScheduledPaymentsSelective

    {
      "SchedIDs": [
        172
      ]
    }
    {
      "ProcessScheduledPaymentsSelectiveResult": {
        "ApprovedPayments": [
          {
            "AcctNo": "1111",
            "CardHolder": "JOHN DOE",
            "CardType": "VI",
            "ConsentID": 6,
            "ConsentType": "S",
            "ErrMsg": "",
            "IsPartialApproval": false,
            "MerchID": 1,
            "PaymentAmt": 10,
            "PaymentDate": "2024-12-01T11:19:01.000Z",
            "PaymentNum": 1,
            "SEQ": "119",
            "SchedID": 1,
            "SchedNum": 1,
            "TxApproved": true,
    

    SessKey string required

    A unique session key used for authentication in API calls. This key is generated upon successful authentication and must be included in all subsequent requests.

    Example: A1842D663E9A4A72XXXXXXXX303541303234373138


    Content-Type string required

    Example: application/json


    Accept string required

    Example: application/json

    SchedIDs integer[] optional

    The list of schedule IDs to process

    Example: [172]

    API Best Practices

    A list of best practices for working with the APIs

    Consuming the API Response

    When consuming the API response for any endpoint, you can follow a similar format. It'll allow you to correctly handle all types of responses and display the correct information in the user interface.

    1

    Create Annual Consent

    Create an annual consent with card present

    post: https://easypay5.com/APIcardProcREST/v1.0.0/ConsentAnnual/Create_CP

    For PCI compliant merchants only (AOC on file with Number required)

    SessKey string required

    A unique session key used for authentication in API calls. This key is generated upon successful authentication and must be included in all subsequent requests.

    Example: A1842D663E9A4A72XXXXXXXX303541303234373138


    Annual consent

    post: https://easypay5.com/APIcardProcREST/v1.0.0/Query/ConsentAnnual

    SessKey string required

    A unique session key used for authentication in API calls. This key is generated upon successful authentication and must be included in all subsequent requests.

    Example: A1842D663E9A4A72XXXXXXXX303541303234373138


    Content-Type string required

    Transaction Full Detail

    Retrieve full details of a transaction

    post: https://easypay5.com/APIcardProcREST/v1.0.0/Query/Transaction_FullDetail

    Use this call to return all the details for a single transaction. Details are separated into 3 distinct objects including:

    • AccountHolder (Card Holder)

    • EndCustomer (Optional user entity if not the actual cardholder such as a child or spouse receiving the services)

    Modify a consent subscription

    Modify an existing subscription consent

    post: https://easypay5.com/APIcardProcREST/v1.0.0/ConsentSubscription/Modify

    SessKey string required

    A unique session key used for authentication in API calls. This key is generated upon successful authentication and must be included in all subsequent requests.

    Example: A1842D663E9A4A72XXXXXXXX303541303234373138


    Content-Type string required

    ACH transactions

    post: https://easypay5.com/APIcardProcREST/v1.0.0/Query/ACHTransaction

    SessKey string required

    A unique session key used for authentication in API calls. This key is generated upon successful authentication and must be included in all subsequent requests.

    Example: A1842D663E9A4A72XXXXXXXX303541303234373138


    Content-Type string required

    Modify a recurring consent

    post: https://easypay5.com/APIcardProcREST/v1.0.0/ConsentRecurring/Modify

    SessKey string required

    A unique session key used for authentication in API calls. This key is generated upon successful authentication and must be included in all subsequent requests.

    Example: A1842D663E9A4A72XXXXXXXX303541303234373138


    Content-Type string required

    Testing Overview

    Transaction and consent verification using the Virtual Terminal.

    Testing integration

    After API, PayForm, or widget integration, it is important to login to our Virtual Terminal and make sure the transactions and consents appear correct. The Number Support Team can provide you with Virtual Terminal credentials.

    Text to Pay

    Create a payment link via SMS or email

    post: https://easypay5.com/APIcardProcREST/v1.0.0/Other/SMSPay

    This call allows you to create a tinyURL of the widget payment link that will display a message and payment form to the customer. The message and form that is displayed to the customer is easily configured by using the API call options.

    This API method allows users to accomplish three typical tasks:

    1. Send a SMS text with a message and Payment Link

    2. Send an email with message and Payment Link

    Retrieve full details of a recurring consent

    post: https://easypay5.com/APIcardProcREST/v1.0.0/Query/ConsentRecurring_FullDetail

    SessKey string required

    A unique session key used for authentication in API calls. This key is generated upon successful authentication and must be included in all subsequent requests.

    Example: A1842D663E9A4A72XXXXXXXX303541303234373138


    Content-Type string required

    (B=2)&&(C>='1/1/2025')&&(C<='1/31/2025')&&(U='SDK')

    Full expiration year of the card or the last 2 digits

    Example: 22


    Email string · email optional

    Email address associated with the consent

    Example: [email protected]


    Zip string optional

    ZIP code associated with the consent

    Example: 04106


    CustomerRefID string optional

    Customer reference ID

    Example: A1235456


    ServiceDescrip string optional

    Description of the service

    Example: REST API Testor


    RPGUID string optional

    A custom, user-defined reference ID or value.

    Example: adf98580-b4ab-42fc-bb99-01c89964afe9


    NumDays integer optional

    Number of days for the consent

    Example: 365


    LimitPerCharge number · float optional

    Limit per charge

    Example: 10000


    LimitLifeTime number · float optional

    Lifetime limit

    Example: 100000

    D: ACCOUNT HOLDER LAST NAME - Last name of the account holder, e.g. (D LIKE '%MITH') for all names that end with 'MITH'.

  • E: CREATED ON - The date the consent was created, e.g. (E<='10/20/2024').

  • F: CUSTOMER REFERENCE ID - User-defined value on the consent.

  • G: CONSENT TYPE - The type of consent, e.g. (G='-1').

    • -1: ALL

    • 1: ANNUAL

    • 2: ONE-TIME

    • 3: RECURRING

    • 4: SUBSCRIPTION

  • H: ENABLED - Indicates whether the consent is currently enabled, e.g. (H=1).

  • J: RPGUID - User-defined value on the consent.

  • K: ACCOUNT HOLDER FIRST NAME - First name of the account holder, e.g. (K LIKE 'ROB%') for all names that start with 'ROB'.

  • Z: CONSENT ID - The unique identifier for the consent, e.g. (Z=15875).

  • Example: (G=1)&&(B>'10/20/2024')

    "ModifiedOn": "2024-12-01T11:19:01.000Z",
    "NumDays": 2107,
    "RPGUID": "adf98580-b4ab-42fc-bb99-01c89964afe9",
    "ServiceDescrip": "REST Test",
    "StartDate": "2024-12-01T11:19:01.000Z"
    }
    ],
    "ErrCode": 0,
    "ErrMsg": "",
    "FunctionOk": true,
    "NumRecords": 1,
    "RespMsg": "Successfully Returned Consent Records : 1"
    }
    }
    -1: ALL
  • 1: FAILED

  • 2: APPROVED

  • C: CREATED ON - The date the batch log was created, e.g. (C>='3/2/2024')&&(C<='4/2/2024').

  • D: BATCH LOG ID - The unique identifier for the batch log, e.g. (D=1777).

  • E: BATCH NUMBER - The batch number for the batch log, e.g. (E=185).

  • Example: (B=1)&&(C>='3/2/2024')&&(C<='4/2/2024')

    ],
    "ErrCode": 0,
    "ErrMsg": "",
    "FunctionOk": true,
    "NumRecords": 9,
    "RespMsg": "Successfully Returned Batch Log Records : 9"
    }
    }
    -1: ALL
  • 1: SCHEDULED

  • 2: PAID

  • 3: FAILED

  • 4: CANCELLED

  • C: DUE DATE - The date the next payment is due, e.g. (C='10/20/2024').

  • D: ACCOUNT HOLDER LAST NAME - Last name of the account holder, e.g. (D LIKE '%MITH') for all names that end with 'MITH'.

  • E: MERCHANT ID - The unique identifier for the merchant associated with the recurring schedule, e.g. (E=1).

  • F: ACCOUNT NUMBER LAST 4 - The last 4 digits of the account number associated with the recurring schedule, e.g. (F='1234').

  • G: SCHEDULE ID - The unique identifier for the recurring schedule, e.g. (G=12).

  • H: TYPE - The type of recurring schedule, e.g. (H=-1).

    • -1: ALL

    • 3: RECURRING

    • 4: SUBSCRIPTION

  • Example: (H=3)&&(C>='10/20/2024')

    "PaymentAmt": 300,
    "PaymentNum": 1,
    "Period": "WEEKLY",
    "RPGUID": "adf98580-b4ab-42fc-bb99-01c89964afe9",
    "RStatus": "S",
    "SchedNum": 59,
    "Tries": 0,
    "TxID": -1
    }
    ]
    }
    }

    D: ACCOUNT HOLDER LAST NAME - Last name of the account holder, e.g. (D LIKE '%MITH') for all names that end with 'MITH'.

  • E: CREATED ON - The date the consent was created, e.g. (E<='10/20/2024').

  • F: CUSTOMER REFERENCE ID - User-defined value on the consent.

  • G: CONSENT TYPE - The type of consent, e.g. (G='-1').

    • -1: ALL

    • 1: ANNUAL

    • 2: ONE-TIME

    • 3: RECURRING

    • 4: SUBSCRIPTION

  • H: ENABLED - Indicates whether the consent is currently enabled, e.g. (H=1).

  • J: RPGUID - User-defined value on the consent.

  • K: ACCOUNT HOLDER FIRST NAME - First name of the account holder, e.g. (K LIKE 'ROB%') for all names that start with 'ROB'.

  • Z: CONSENT ID - The unique identifier for the consent, e.g. (Z=15875).

  • Example: (G=1)&&(B>'10/20/2024')

    "RAmtPaidSoFar": 300,
    "RLastPaymentAmt": 75,
    "RNumPayments": 4,
    "RPGUID": "adf98580-b4ab-42fc-bb99-01c89964afe9",
    "RPaymentAmt": 75,
    "RPeriod": "WEEKLY",
    "RTotalAmt": 300,
    "ServiceDescrip": "",
    "StartDate": "2024-12-01T11:19:01.000Z"
    }
    ],
    "ErrCode": 0,
    "ErrMsg": "",
    "FunctionOk": true,
    "NumRecords": 4,
    "RespMsg": "Successfully Returned Consent Records : 4"
    }
    }
    "TxID": 104,
    "TxnCode": 90944
    }
    ],
    "DeclinedPayments": [
    {
    "AcctNo": "1111",
    "CardHolder": "JOHN DOE",
    "CardType": "VI",
    "ConsentID": 6,
    "ConsentType": "S",
    "ErrMsg": "",
    "IsPartialApproval": false,
    "MerchID": 1,
    "PaymentAmt": 10,
    "PaymentDate": "2024-12-01T11:19:01.000Z",
    "PaymentNum": 1,
    "SEQ": "119",
    "SchedID": 1,
    "SchedNum": 1,
    "TxApproved": true,
    "TxID": 104,
    "TxnCode": 90944
    }
    ],
    "ErrCode": 0,
    "ErrMsg": "",
    "FunctionOk": true,
    "NumApproved": 1,
    "NumDeclined": 0,
    "NumPartialAuths": 0,
    "NumProcessed": 1,
    "RespMsg": "Total Processed: 1 Approved: 1 Declined: 0 Partial: 0"
    }
    }

    Crediting (refunds)

    Return funds to a customer's account after a transaction has been completed.

    Occurs when a customer returns a product or disputes a charge, and the merchant agrees to reimburse the amount paid.

    Settlements

    Finalizing a transaction by transferring funds from the buyer to the seller.

    Reporting

    Involves generating summaries and analyses of transaction data to help merchants track financial activities, manage cash flow, and ensure compliance.

    Authorizing payments

    Verifies cardholder information and checks funds to approve transactions securely.

    Voiding

    Cancels authorized transactions pre-settlement, stopping fund transfers.

    Crediting (refunds)

    Return funds to a customer's account after a transaction has been completed.

    Occurs when a customer returns a product or disputes a charge, and the merchant agrees to reimburse the amount paid.

    Settlements

    Finalizing a transaction by transferring funds from the buyer to the seller.

    Reporting

    Involves generating summaries and analyses of transaction data to help merchants track financial activities, manage cash flow, and ensure compliance.

    Recurring payments (automated payment plans)

    Automate payment plans.

    Online payments

    Enables businesses to accept payments through their web applications or platforms.

    Surcharge payments

    Allows businesses to add a surcharge or an extra fee to the transaction amount.

    Store card on file

    Facilitates storing a customer's card details securely for future transactions.

    Recurring payments (payment plans)

    Supports setting up automatic, recurring transactions, ideal for subscriptions or installment plans.

    Authorizing payments

    Authorizes transactions and verifies funds with the card issuer.

    Voiding

    Cancels authorized transactions pre-settlement, stopping fund transfers.

    Online payments

    Processes payments without needing a physical point-of-sale system, using a mobile interface (card not present transactions).

    Surcharge payments

    Allows businesses to add a surcharge or an extra fee to the transaction amount.

    Store card on file (after collecting cardholder data)

    Allows merchants to securely store and reuse cardholder information for future transactions if the user saves their card data.

    Online payments

    Provides a quick and simple way to accept payments directly through a highly configurable embedded form which can be used on your website.

    Store card on file (after collecting cardholder data)

    Allows merchants to securely store and reuse cardholder information for future transactions.

    Surcharge payments

    Allows businesses to add a surcharge or an extra fee to the transaction amount.

    Multiple payment types

    PayForm supports a range of payment options, including credit cards, ACH, Apple Pay, and Google Pay.

    Online payments

    Processes payments without needing a physical point-of-sale system, using a web interface.

    Card present

    Accepts card present payments using Verifone or a different USB card reader.

    Manual entry

    Accepts payments by manually entering card details.

    Surcharge payments

    Allows businesses to add a surcharge or an extra fee to the transaction amount.

    Store card on file (annual consent)

    Allows storing customer card information with their consent for recurring use

    Recurring payments (payment plans)

    Facilitates the automated scheduling of regular payments over time.

    Card present (via Verifone device)

    Processes physical or keyed card transactions using Verifone devices with the Windows service running in the background.

    Online payments (via browser-based interface)

    Supports transaction processing through a web interface, utilizing the Windows service for continuous operation.

    Manually keyed transactions

    Supports chip/tap/swipe and keyed card data.

    Surcharge payments

    Allows businesses to add a surcharge or an extra fee to the transaction amount.

    Authorizing payments

    Verifies cardholder information and checks funds to approve transactions securely.

    Store card on file

    Allows secure storage of card details for future transactions.

    REST API
    Android SDK
    iOS SDK
    PayForm
    Virtual Terminal
    contact the Number support team
    Verifone

    Mobile SDK: If you have a mobile application, use the Number SDK for in-app payments.

  • Virtual Terminal: A web application for processing payments directly through a browser.

  • You can find guides that will help you learn how to navigate each integration method on the Integration Options page.

    For example: PCI Level 1 clients can use a purely API integration, while others would need to implement a PayForm for collecting cardholder data directly through their website.

    [email protected]
    Integration Options
    Verifone
    Testing
    Accept string required

    Example: application/json

    ConsentID integer optional

    ID of the consent (or stored card data)

    Example: 8


    Amounts object optional


    purchDetails object optional


    AlternateMerchID integer optional

    Use 0 for the original merchant record or a positive integer for a different merchant record

    Example: 0


    User string optional

    The user initiating the sale. Used for reporting.

    Example: Samuel

    {
      "ConsentID": 8,
      "Amounts": {
        "BaseAmt": 52,
        "Surcharge": 1.04,
        "TotalAmt": 53.04
      },
      "purchDetails": {
        "ServiceDescrip": "Annual Checkup",
        "ClientRefID": "174356",
        "RPGUID": "99438332"
      },
      "AlternateMerchID": 0,
      "User": "Samuel"
    }
    {
      "ConsentAnnual_ChargeStoredCardResult": {
        "AVSresult": "Y",
        "AcquirerResponseEMV": null,
        "CVVresult": "",
        "ErrCode": 0,
        "ErrMsg": "",
        "FunctionOk": true,
        "IsPartialApproval": false,
        "RequiresVoiceAuth": false,
        "RespMsg": "APPROVED OK1400",
        "ResponseApprovedAmount": 0,
        "ResponseAuthorizedAmount": 53.04,
        "ResponseBalanceAmount": 0,
        "TxApproved": true,
        "TxID": 37,
        "TxnCode": "OK1400",
        "ApprovedAmounts": {
          "BaseAmt": 52,
          "Surcharge": 1.04,
          "TotalAmt": 53.04
        }
      }
    }
    Example: application/json

    Accept string required

    Example: application/json

    Query string optional

    A query string for obtaining specific transaction records using Number's query language. Build logical terms and join them with '&&' for logical AND or '||' for logical OR. Use single quotes for text and date values. Refer to the variable chart for query composition:

    • A: MERCHANT ID - The merchant record you are interested in, e.g. (A=1).

    • B: TRANSACTION STATUS - The status of the transaction, e.g. (B=1).

      • -1: ALL

      • 1: OPEN

      • 2: SETTLED

      • 3: FAILED

      • 4: RETURNED

      • 5: VOID

    • C: DATE CREATED - The date the transaction was created, e.g. (C>='7/5/2024 12:00:00 AM').

    • D: LAST NAME - Last name of the account holder, e.g. (D LIKE '%MITH') for all names that end with 'MITH'.

    • E: TRANSACTION LOCK - Lock status of the transaction, e.g. (E<>'0') for locked transactions.

    • H: TRANSACTION ID - The unique identifier for the transaction, e.g. (H=58258).

    • J: FIRST NAME - First name of the account holder, e.g. (J LIKE 'ROB%') for all names that start with 'ROB'.

    • K: TRANSACTION TYPE - The type of transaction, e.g. (K=-1).

      • -1: ALL

      • 1: ACHDEBIT

      • 2: ACHCREDIT

    • L: AMOUNT - The $ amount of the transaction, e.g. (L>100.00).

    • M: CLIENT REFERENCE ID - User-defined value on the transaction.

    • N: RPGUID - User-defined value on the transaction.

    • P: CONSENT ID - The Consent ID of card on file the transactions were charged against, e.g. (P=15875).

    • Q: ACCOUNT NUMBER LAST 4 - The last 4 digits of a credit card, e.g. (Q='4123').

    • R: APPROVAL CODE - The approval code for the transaction, e.g. (R='TAS626').

    • S: CUSTOMER LAST NAME - The last name of the customer, e.g. (S='SMITH').

    • T: CUSTOMER FIRST NAME - The first name of the customer, e.g. (T='FOSTER').

    • U: ORIGIN - The origin of the transaction, e.g. (U='API').

      • "API": REST / SOAP API

      • "WID": Widget

      • "VT": Virtual Terminal

    Example: (B=3)&&(E=1)&&(C>'2024-09-01')

    {
      "Query": "(H=1405)"
    }
    {
      "ACHTransaction_QueryResult": {
        "ErrCode": 0,
        "ErrMsg": "",
        "FunctionOk": true,
        "NumRecords": 1,
        "RespMsg": "Successfully Returned Transaction Records : 1",
        "Transactions": [
          {
            "AcctHolderID": 1127,
            "AcctLast4": "0277",
            "AcctType": "PersonalChecking",
            "Amt": 30.5,
            "AuthID": "69019079",
            "BatchLogID": 0,
            "BatchNO": 112,
            "BatchStatus": "N",
            "ChangedBy": null,
            "ChangedOn": "2024-12-01T11:19:01.000Z",
            "ConsentID": 0,
            "CreatedBy": "Token 37564",
            "CreatedOn": "2024-12-01T11:19:01.000Z",
            "Credits": 0,
            "CustName": "APIACH Sally",
            "EndCustID": 35348,
            "FirstName": "Sally",
            "ID": 1405,
            "LastName": "APIACH",
            "MerchID": 1,
            "Origin": "API       ",
            "REF_ID": "A97689#",
            "RPGUID": "adf98580-b4ab-42fc-bb99-01c89964afe9",
            "RefTxID": 0,
            "ResolvedOn": "2024-12-01T11:19:01.000Z",
            "ReturnReason": "",
            "SettledOn": "2024-12-01T11:19:01.000Z",
            "TXN_DATETIME": "2024-12-01T11:19:01.000Z",
            "TXstamp": "20240703",
            "TxSTATUS": "OPEN",
            "TxType": "ACHDEBIT",
            "UniqueID": "167901CDE082BC57",
            "UserID": 0,
            "ValMsg": "Success"
          }
        ]
      }
    }
    Example: application/json

    Accept string required

    Example: application/json

    ConsentID integer optional

    ID of the consent to be cancelled

    Example: 42

    ConsentMods object optional

    ExpMonth integer optional

    Expiration month of the card

    Example: 10


    ExpYear integer optional

    Expiration year of the card

    Example: 2028


    Email string · email optional

    Email associated with the consent

    Example: [email protected]


    Zip string optional

    ZIP code associated with the consent

    Example: 04101


    CustomerRefID string optional

    Customer reference ID

    Example: A123456


    ServiceDescrip string optional

    Description of the service

    Example: Test


    RPGUID string optional

    A custom, user-defined reference ID or value.

    Example: adf98580-b4ab-42fc-bb99-01c89964afe9

    {
      "ConsentID": 42,
      "ConsentMods": {
        "ExpMonth": 10,
        "ExpYear": 2028,
        "Email": "[email protected]",
        "Zip": "04101",
        "CustomerRefID": "A123456",
        "ServiceDescrip": "Test",
        "RPGUID": ""
      }
    }
    {
      "ConsentRecurring_ModifyResult": {
        "ErrCode": 0,
        "ErrMsg": "",
        "FunctionOk": true,
        "ModifySuccess": true,
        "RespMsg": "Success : Modified Consent ID : 42"
      }
    }
    Example: application/json

    Accept string required

    Example: application/json

    ConsentID integer optional

    Consent ID for which to retrieve full details

    Example: 24

    {
      "ConsentID": 24
    }
    {
      "ConsentRecurring_FullDetailResult": {
        "AccounttHolder": {
          "AccountNum": "wj8HlAYlMJI=jvje9l7qZuEFiDDeEDDym6ZdlL0DX8HX",
          "AcctMask": "4111XXXXXXXX1111",
          "Address1": "123 Fake St",
          "Address2": "",
          "CardType": "VI",
          "City": "PORTLAND",
          "Company": "",
          "CreatedOn": "2024-12-01T11:19:01.000Z",
          "Email": "[email protected]",
          "ExpDate": "1023",
          "Firstname": "Sean",
          "ID": 1,
          "LastChanged": "2024-12-01T11:19:01.000Z",
          "LastName": "Wood",
          "MerchID": 1,
          "Phone": "8777248472",
          "State": "ME",
          "Zip": "04106"
        },
        "ConsentRecurring": {
          "AcctHolderFirstName": "Sean",
          "AcctHolderID": 1,
          "AcctHolderLastName": "Wood",
          "AcctNo": "1111",
          "AuthTxID": 75,
          "CreatedBy": "vidya_Venkatraman",
          "CreatedOn": "2024-12-01T11:19:01.000Z",
          "CustID": 72,
          "CustRefID": "A123456",
          "EndDate": "2024-12-01T11:19:01.000Z",
          "ID": 24,
          "IsEnabled": true,
          "MerchID": 1,
          "ModifiedBy": ":",
          "ModifiedOn": "2024-12-01T11:19:01.000Z",
          "RAmtPaidSoFar": -1,
          "RLastPaymentAmt": 1000,
          "RNumPayments": 10,
          "RPGUID": "adf98580-b4ab-42fc-bb99-01c89964afe9",
          "RPaymentAmt": 1000,
          "RPeriod": "BI_WEEKLY",
          "RTotalAmt": 10000,
          "ServiceDescrip": "",
          "StartDate": "2024-12-01T11:19:01.000Z"
        },
        "EndCustomer": {
          "Address1": "123 Fake St.",
          "Address2": "          ",
          "City": "PORTLAND  ",
          "ClientRefID": "A123456",
          "Company": "",
          "CreatedOn": "2024-12-01T11:19:01.000Z",
          "Email": "[email protected]",
          "Firstname": "Sean",
          "ID": 72,
          "LastChanged": "2024-12-01T11:19:01.000Z",
          "LastName": "Wood",
          "MerchID": 1,
          "Phone": "8777248472",
          "Service": "",
          "State": "ME        ",
          "Zip": "04106          "
        },
        "ErrCode": 0,
        "ErrMsg": "",
        "FunctionOk": true,
        "RespMsg": "Successfully Returned Full Detail For Consent ID : 24"
      }
    }
    [email protected]

    Example: application/json


    Accept string required

    Example: application/json

    ConsentID integer optional

    ID of the consent to be modified

    Example: 12


    ConsentMods object optional

    ExpMonth integer optional

    Expiration month of the card

    Example: 10


    ExpYear integer optional

    Expiration year of the card

    Example: 2022


    Email string · email optional

    Email associated with the consent

    Example: [email protected]


    Zip string optional

    ZIP code associated with the consent

    Example: 04106


    RPGUID string optional

    A custom, user-defined reference ID or value.

    Example: adf98580-b4ab-42fc-bb99-01c89964afe9


    CustomerRefID string optional

    Customer reference ID

    Example: A123456


    ServiceDescrip string optional

    Description of the service

    Example: Test


    PaymentAmt number · float optional

    Payment $ amount

    Example: 10


    PaymentAdjustDate string · date-time optional

    Date and time for payment adjustment

    Example: 2019-04-29T11:26:11.093Z


    OnHold boolean optional

    Whether the consent is on hold

    Example: false

    In most cases you may only want to modify a single parameter such as PaymentAdjustDate or OnHold. You can supply a value of -1 or "-1" to any value which you do not want us to alter. The following example shows how to simply remove the hold from ConsentID 21:

    {
      "ConsentID": 12,
      "ConsentMods": {
        "ExpMonth": 10,
        "ExpYear": 2022,
        "Email": "[email protected]",
        "Zip": "04106",
        "RPGUID": "",
        "CustomerRefID": "A123456",
        "ServiceDescrip": "Test",
        "PaymentAmt": 10,
        "PaymentAdjustDate": "2019-04-29T11:26:11.093Z",
        "OnHold": false
      }
    }
    {
      "ErrCode": 0,
      "ErrMsg": "",
      "FunctionOk": true,
      "RespMsg": "Consent successfully modified"
    }
    {
    "ConsentID": 21,
    "ConsentMods": {
        "ExpMonth": -1,
        "ExpYear": -1,
        "Email": "-1",
        "Zip": "-1",
        "RPGUID": "-1",
        "CustomerRefID": "-1",
        "ServiceDescrip": "-1",
        "PaymentAmt": -1,
        "PaymentAdjustDate": "-1",
        "OnHold": false
       }
    }
    value.
    You'll need to prepare a secured header and use its value in place of the original
    SessKey
    .

    If the HMAC secret was not provided to you previously or you don't know how to find the value of UserID or DeviceID, contact Number.

    The format for the key is as follows: SessKey_Epoch_DeviceID_Hash. Include this key in the same way as you would include the SessKey (see case above).

    Number support team
    Catch all exceptions when calling the API

    These can be a result of problems communicating with our service or problems executing the client-side code.

    2

    Check for a null response

    Depending on your implementation, you might receive a null response indicating an unexpected error instead of an exception.

    3

    Check the value of FunctionOk

    This boolean flag is included in all API responses and indicates whether the operation executed without exceptions on our servers.

    If the value of FunctionOk is false, it indicates an error which was handled on the Number servers. In case of problems, you can display the ErrMsg and ErrCode to the user.

    4

    Check other success flags such as AuthSuccess or TxApproved

    These boolean flags will be included depending on the operation, and they indicate whether the operation was approved. You should use the friendly response message provided in the RspMsg field to display more information to the user.

    In case of transactions, TxApproved with the value of false indicates that the card issuer does not want to approve the transaction. You can also supplement your response with the decline code found in TxnCode.


    Logging

    It's important to correctly handle exceptions and log all the responses. Before you interface with our APIs, we recommend creating a simple logging utility. This way, there'll be a trail of breadcrumbs in case any issues arise in the future. Without logs, finding out what went wrong can be time consuming.

    Recommended way to log the responses

    1

    Create a utility class for logging

    It should contain a method that will take the API call name as well as FunctionOk, IsSuccess, RespMsg, ErrCode, and ErrMsg values. This will compile all of the information necessary to track any issue.

    Store the timestamp of the response and all of those values in a database record or as a row in a log file. When logging to a file, it's recommended to roll onto a new file on a monthly basis.

    2

    Use the utility class to log all API results

    Log all of the responses, including successful ones, using your utility class.

    Logging class example

    See the example below to give you more insight into how you might create your logging utility.


    Preventing duplicate charges

    Common issues we encounter include complaints about duplicate charges. This can happen when integrators process card-on-file transactions without proper safeguards that prevent submitting the same form multiple times.

    If there is button on a webpage that initiates a charge, and there is no mechanism preventing it from being clicked multiple times, the cardholder would be charged each time. To prevent this, it's crucial to disable the button immediately after it's pressed, ensuring that double taps do not occur.

    When processing card-on-file transactions, remember to lock the submit button after form submission to prevent multiple API calls and duplicate charges from occuring.

    You may also choose to include simple logic that checks ConsentID and TransactionAmount that would prevent the same combination from being processed multiple times within a short timeframe.

    Timeouts

    The mechanics of processing a credit card transaction involves many servers operating at separate geographical locations. Normally this is all accomplished within 2 seconds. Occasional delays will be encountered somewhere within the processing train. We submit each transaction to the Acquirer and then the card Issuer in order to get a decision. In the case where you receive a timeout from our gateway you should assume that the transaction was still successful. The best practice would be to query our system immediately after you receive a timeout or communication error to determine if the transaction was successful. If you are processing a stored card, then you can query by ConsentID. If you are passing cardholder data, you can Query by Reference ID or other elements. Employing this important logic will eliminate duplicate transactions and ensure your ledger agrees with ours.

    Content-Type string required

    Example: application/json


    Accept string required

    Example: application/json

    Track string optional

    Example: %B4788250000028291^VISA TEST/GOOD^231010100733000000?;4895390000000013=151210100000733?


    ConsentCreator object optional

    MerchID integer optional

    Example: 1


    CustomerRefID string optional

    Example: A1523644


    ServiceDescrip string optional

    Example: REST Test


    RPGUID string optional

    A custom, user-defined reference ID or value.

    Example: adf98580-b4ab-42fc-bb99-01c89964afe9


    StartDate string optional

    Date and time in Microsoft JSON date format (Unix timestamp and timezone offset).

    Example: 2024-12-01T11:19:01.000Z


    NumDays integer optional

    Example: 365


    LimitPerCharge number · float optional

    Example: 1000


    LimitLifeTime number · float optional

    Example: 100000

    AcctHolder object optional

    Firstname string optional

    Example: Sally


    Lastname string optional

    Example: APIACH


    Company string optional


    Title string optional


    EndCustomer object optional

    Firstname string optional

    Example: Sally


    Lastname string optional

    Example: APIACH


    Company string optional


    Title string optional


    {
      "Track": "%B4788250000028291^VISA TEST/GOOD^231010100733000000?;4895390000000013=151210100000733?",
      "ConsentCreator": {
        "MerchID": 1,
        "CustomerRefID": "A1523644",
        "ServiceDescrip": "REST Test",
        "RPGUID": "ad8c349f-a301-4fc8-956c-54b59a3f6440",
        "StartDate": "/Date(1566406242284-0400)/",
        "NumDays": 365,
        "LimitPerCharge": 1000,
        "LimitLifeTime": 100000
      },
      "AcctHolder": {
        "Firstname": "Sean",
        "Lastname": "Wood",
        "Company": "",
        "Title": "",
        "Url": "",
        "BillIngAdress": {
          "Address1": "123 Fake St",
          "Address2": "",
          "City": "PORTLAND",
          "State": "ME",
          "ZIP": "04106",
          "Country": "USA"
        },
        "Email": "[email protected]",
        "Phone": "8777248472"
      },
      "EndCustomer": {
        "Firstname": "Sean",
        "Lastname": "Wood",
        "Company": "",
        "Title": "",
        "Url": "",
        "BillIngAdress": {
          "Address1": "123 Fake St.",
          "Address2": "",
          "City": "PORTLAND",
          "State": "ME",
          "ZIP": "04106",
          "Country": "USA"
        },
        "Email": "[email protected]",
        "Phone": "8777248472"
      }
    }
    Example: application/json

    Accept string required

    Example: application/json

    Query string optional

    A query string for obtaining specific consent records using Number's query language. Build logical terms and join them with '&&' for logical AND or '||' for logical OR. Use single quotes for text and date values. Refer to the variable chart for query composition:

    • A: MERCHANT ID - The merchant record you are interested in, e.g. (A=1).

    • B: START DATE - The date the consent becomes active, e.g. (B>='10/20/2024').

    • C: END DATE - The date the consent expires, e.g. (C<='10/20/2024').

    • D: ACCOUNT HOLDER LAST NAME - Last name of the account holder, e.g. (D LIKE '%MITH') for all names that end with 'MITH'.

    • E: CREATED ON - The date the consent was created, e.g. (E<='10/20/2024').

    • F: CUSTOMER REFERENCE ID - User-defined value on the consent.

    • G: CONSENT TYPE - The type of consent, e.g. (G='-1').

      • -1: ALL

      • 1: ANNUAL

      • 2: ONE-TIME

    • H: ENABLED - Indicates whether the consent is currently enabled, e.g. (H=1).

    • J: RPGUID - User-defined value on the consent.

    • K: ACCOUNT HOLDER FIRST NAME - First name of the account holder, e.g. (K LIKE 'ROB%') for all names that start with 'ROB'.

    • Z: CONSENT ID - The unique identifier for the consent, e.g. (Z=15875).

    Example: (G=1)&&(B>'10/20/2024')

    {
      "Query": "(A=-1)&&(G=1)&&(H='True')"
    }
    {
      "ConsentAnnual_QueryResult": {
        "Consents": [
          {
            "AcctHolderFirstName": "JOHN",
            "AcctHolderID": 1,
            "AcctHolderLastName": "DOE",
            "AcctNo": "1111",
            "AuthTxID": 15,
            "CreatedBy": "John_Doe",
            "CreatedOn": "2024-12-01T11:19:01.000Z",
            "CustID": 15,
            "CustomerRefID": "A12345NO-99",
            "EndDate": "2024-12-01T11:19:01.000Z",
            "ID": 12,
            "IsEnabled": true,
            "LimitLifeTime": 1000000,
            "LimitPerCharge": 1000000,
            "MerchID": 1,
            "NumDays": 365,
            "RPGUID": "adf98580-b4ab-42fc-bb99-01c89964afe9",
            "ServiceDescrip": "",
            "StartDate": "2024-12-01T11:19:01.000Z"
          }
        ],
        "ErrCode": 0,
        "ErrMsg": "",
        "FunctionOk": true,
        "NumRecords": 2,
        "RespMsg": "Successfully Returned Consent Records : 2"
      }
    }
    Transaction (All Transaction details)
    {
      "TxID": 12
    }
    {
      "Transaction_FullDetailResult": {
        "AccountHolder": {
          "AccountNum": "wj8HlAYlMJI=jvje9l7qZuEFiDDeEDDym6ZdlL0DX8HX",
          "AcctMask": "4111XXXXXXXX1111",
          "Address1": "123 Fake St",
          "Address2": "",
          "CardType": "VI",
          "City": "PORTLAND",
          "Company": "",
          "CreatedOn": "2024-12-01T11:19:01.000Z",
          "Email": "[email protected]",
          "ExpDate": "1023",
          "Firstname": "Sean",
          "ID": 1,
          "LastChanged": "2024-12-01T11:19:01.000Z",
          "LastName": "Wood",
          "MerchID": 1,
    
    

    SessKey string required

    A unique session key used for authentication in API calls. This key is generated upon successful authentication and must be included in all subsequent requests.

    Example: A1842D663E9A4A72XXXXXXXX303541303234373138


    Content-Type string required

    Example: application/json


    Accept string required

    Example: application/json

    TxID integer optional

    Transaction ID for which to retrieve the receipt details

    Example: 12

    An example user name for the Virtual Terminal can look like this: VT4914533

    For more information about the Virtual Terminal, see the Virtual Terminal guide. You can access Virtual Terminal using the link below.


    Verifying transactions

    Once logged in, expand the Transactions tab in the navigation on the left, then click on Search.

    This will show the list of transactions created. Select the transaction to be verified, and click on Full Detail button under Transaction Operations. A pop up will open to show all the information about the transaction, account holder, and the end customer.

    Make sure the amount, last four digits of the credit card, card type, and expiration date are correct.

    Testing declines

    There are scenarios where the transaction can get declined due to various reasons like insufficient funds, card not allowed, lost/stolen card, etc. In such cases, the transaction would appear as FAILED.

    You can find penny codes for testing declines in the Global Payments Testing section.

    You can click Full Detail to try to find out the reason for decline by checking TxStatus, Flags, and other values.

    Testing partial auth

    Partial auth testing data

    To test a partial authorization, you can use one of these cards:

    Using the test cards, if you enter the amount of $2.78, you should get partial approval for $2.57, and if you enter the amount of $3.26, you should get a partial approval for $1.26.

    Testing receipts

    The receipt can also be printed in the Virtual Terminal by expanding the Receipts dropdown and clicking the Merchant or Customer button.


    Verifying consents

    Click on the Reports menu and choose Consents.

    Select the consent that needs to be verified from the grid. Click the Full Detail button and make sure the consent, account holder, and end customer details look correct.

    To view the consent agreement, click on the Merchant Consent or Customer Consent.

    Acquire the Payment Link and use it internally or externally

    For more details on the use of Text to Pay as well as some sample code is available on our documentation site located at https://easypaysoftware.com/en/text-to-pay.

    {
      "Msg": {
        "Person": {
          "Firstname": "EasyPay",
          "Lastname": "Tester",
          "Company": "",
          "Title": "",
          "Url": "",
          "BillIngAdress": {
            "Address1": "123 Fake St.",
            "Address2": "",
            "City": "Portland",
            "State": "ME",
            "ZIP": "04106",
            "Country": "USA"
          },
          "Email": "[email protected]",
          "Phone": "2076885025"
        },
        "MessageType": "TEXT",
    

    SessKey string required

    A unique session key used for authentication in API calls. This key is generated upon successful authentication and must be included in all subsequent requests.

    Example: A1842D663E9A4A72XXXXXXXX303541303234373138


    Content-Type string required

    Example: application/json


    Accept string required

    Example: application/json

    Msg object optional

    Integration Options

    Learn about how you can integrate with Number

    Before you start using our services, you'll want to decide which type of integration is most suited to your business case. We provide a plethora of ways to start using our services:

    • REST API

    • Mobile SDKs for Android and iOS

    • PayForm and legacy widgets

    • The Virtual Terminal web application

    • Custom desktop applications

    • Win service and DLL

    You don't have to limit yourself to one type of integration. Many integrators use our PayForm to collect the cardholder data, and then use our API for the rest. The Virtual Terminal can also be used for various functions such as processing payments, creating card-on-file plans (consents), and generating reports. You can find more details about each integration in the next few sections.

    Before you read about the specific integration options, we recommend having a look at the section below to help you clarify which options are relevant to your unique case.


    PCI Compliance

    What is PCI DSS?

    PCI compliance refers to adherence to the Payment Card Industry Data Security Standard (PCI DSS), which is a set of security standards related to processing, storing, and transmitting credit card information. The PCI DSS was developed by the Payment Card Industry Security Standards Council (PCI SSC), which was founded by major credit card companies like Visa, MasterCard, American Express, Discover, and JCB.

    Key aspects of PCI compliance include:

    1. Maintaining Secure Networks and Systems: Installing and maintaining a firewall configuration to protect cardholder data and not using vendor-supplied defaults for system passwords and other security parameters.

    2. Protecting Cardholder Data: Companies must protect stored cardholder data and encrypt transmission of cardholder data across open, public networks.

    PCI compliance helps protect cardholder data from theft and fraud, ensuring consumer trust and avoiding fines and penalties associated with non-compliance. Businesses of all sizes that handle credit card information are required to comply with PCI DSS.

    Integration choice based on compliance

    If you are not already handling cardholder data by yourself, Number can do that for you.

    Depending on whether or not you are handling the card holder data under your own documented PCI level one compliance program, you'll want to use different types of integrations.

    1. If you have your own PCI level one compliance program umbrella, you may use our APIs for all types of payment activities, including authorization of cards, issuing credits, reversal, reports, etc.

    2. Otherwise, you can use our PayForm web widget and other applications served under our PCI Level One platform to collect cardholder data, and use our API for any and all other payment-related activities.


    REST API

    The REST API will allow you to enable integration of Number payments with external applications, allowing for full automation and a high degree of customization.

    They allow a variety of functions:

    • Processing payments / voids / credits / settlements,

    • Running queries and reports,

    • Returning receipts and documents for signature,

    • Creating / modifying / processing payment plans.

    It's important to note that some API functionality will require you to collect cardholder data, such as , and that requires you to be PCI Level 1 compliant. You can overcome this by using our PayForm to collect all cardholder data securely.

    You can read more about implementation in the API integration guide:


    Mobile SDKs

    The mobile SDKs will allow you to integrate Number payments services into any Android and iOS application using the prebuilt payment UI components. Similar to PayForm, those components will allow you to collect cardholder data and process payments in a secure and PCI compliant way.

    In addition to the native Android and iOS SDKs, we offer a React Native wrapper which can be used to build a cross-platform app.

    If you need to integrate Number payments with a mobile application, we recommend using the SDKs.

    You can read more about implementation in the SDK integration guides:


    PayForm and legacy widgets

    A PayForm is the most convenient means of collecting cardholder data. By using our builder tool or our API, you'll be able to set the design and behavioral aspects of the form and we'lll return a URL which loads it into the view. The form will then use webhooks to POST the realtime data to the site of your choice.

    Once the cardholder data is collected, you can use other integrations, such as our APIs or the Virtual Terminal, to process consents, credit, void, and query transactions.

    We also have a widget as a legacy option to the PayForm. With this widget, users will enter their cardholder data directly into the Number platform, and your system can be updated in realtime. If you're just starting, we suggest using the PayForm as our modern option.

    We recommend using the PayForm to collect all cardholder data when integrating with web applications as it's secure, easy to get started, and offers a lot of customization.

    You can read more about implementation in the integration guides:


    Virtual Terminal

    The Virtual Terminal (VT) is a web application which you can access through your browser. It provides all types of credit card processing functionality:

    • Authorizations,

    • Voids / credits / settlements,

    • Reporting,

    • Payment plans (recurring / subscription consent),

    The VT is the fastest way to start trying out our payment services. Otherwise, it's ideal for businesses processing payments over the phone or at sales points lacking a physical terminal.

    You can read more about the Virtual Terminal in the user guide:


    Our custom desktop application

    We also have a custom desktop application which can be convenient in an office setting to collect card present payments. This application offers much of the same functionality as the Virtual Terminal. As opposed to the Virtual Terminal, the desktop app only requires you to authenticate once a day to keep your session.

    The application interfaces with VeriFone card readers. These devices accept EMV chip and contactless cards in addition to the usual card swipe and manual entry.

    to learn more about custom desktop applications.


    Win service and DLL

    If you wish, you can take advantage of our end-to-end encryption model used with the Verifone card reader and build around it by using our Windows service or referencing our Dynamic Link Library. They channel requests through our API and responses can be consumed at the client software level. This way, you can develop your own workflow and displays.

    You can read more about integrating with Verifone in the integration guide:

    Create an ACH Combo Sale and Consent

    post: https://easypay5.com/APIcardProcREST/v1.0.0/ACH/Combo

    This method creates both an ACH sale and consent. To create a consent only without processing the sale, set the Amount to zero.

    For member variable "AccountType" use the following values:

    1. Personal Checking = 1

    2. Personal Saving = 2

    3. Business Checking = 3

    4. Business Saving = 4

    SessKey string required

    A unique session key used for authentication in API calls. This key is generated upon successful authentication and must be included in all subsequent requests.

    Example: A1842D663E9A4A72XXXXXXXX303541303234373138


    Content-Type string required

    Example: application/json


    Create a recurring consent with manual card entry

    post: https://easypay5.com/APIcardProcREST/v1.0.0/ConsentRecurring/Create

    For PCI compliant merchants only (AOC on file with Number required)

    {
      "ccCardInfo": {
        "AccountNumber": "4111111111111111",
        "ExpMonth": 10,
        "ExpYear": 23,
        "CSV": "123",
        "Track": "%B4788250000028291^VISA TEST/GOOD^231010100733000000?;4895390000000013=151210100000733?"
      },
      "ConsentCreator": {
        "MerchID": 1,
        "CustomerRefID": "A123456",
        "ServiceDescrip": "",
        "RPGUID": "",
        "StartDate": "/Date(1564409121413-0400)/",
        "NumPayments": 10,
        "TotalAmount": 10000,
        "Period": 2
      },
      "AcctHolder": {
    
    

    SessKey string required

    A unique session key used for authentication in API calls. This key is generated upon successful authentication and must be included in all subsequent requests.

    Example: A1842D663E9A4A72XXXXXXXX303541303234373138


    Content-Type string required

    Example: application/json


    Accept string required

    Example: application/json

    ccCardInfo object optional

    AccountNumber string optional

    Example: 4111111111111111


    ExpMonth integer optional

    Example: 10


    ExpYear integer optional

    Example: 2028

    Payment Reminders

    Send payment reminders to clients through text or e-mail

    As an integrator, you may wish to send a payment reminder to a client through a text or e-mail which will allow them to pay the amount due. Here's an example reminder:

    You have a payment due to Merchant XYZ of $125.00 due on 10/4/2016. Please follow the link below to make the payment. https://easypay5.com/stdwidget/?SP=E8E5EC

    Once they receive the reminder, they can click the link that is sent along with the message to open a payment page. This will allow them to enter their card details and make a payment.

    After the payment is submitted, a transaction receipt would be sent to the e-mail address on file.

    Implementation

    To send a payment reminder using the REST API, use the endpoint.

    Request

    Both implementations use a similar body structure, and the fields are described below.

    Field name
    Description

    Response

    If you didn't catch any exceptions and your response is not null, check the value of FunctionOK. If FunctionOk is false, it indicates an error that was handled on the Number servers. You can find more details by looking at ErrMsg and ErrCode included in the response.

    You don't have to do anything else, the reminder was sent successfully. A friendly response message is included in RespMsg field, and the PaymentURL is also returned if you wish to store it.

    Client Admin Portal

    Getting started with the Client Admin Portal

    The Client Admin Portal gives the means to create, modify, and remove Virtual Terminal users, create new API tokens, and inspect active or expiring tokens.


    Accessing the portal

    To get access to the portal and create new accounts, contact the Number support team.

    You will be asked to provide the full name, e-mail address, and cell phone number for every individual you wish to have access to the portal. Each one of them will receive a text message containing their username and an e-mail containing their password with the URL of the portal.

    Our Admin Portal utilizes two-factor authentication. Users accessing the portal will be asked to enter their username, password, and a security code that will be sent via a text message to their cell phone.

    Integrator token renewal

    There are two methods to generate token renewals.

    Once you log in, you'll see a menu on the left with a Manage Tokens heading.

    The Active Tokens option allows you to view all of tokens that have been assigned to your accounts, their expiration date, and their current status. This can be useful for administrators to see what tokens are nearing their expiration. Columns can be sorted by clicking on the column header.

    The Token Renewal option allows you to select the accounts to issue new tokens to. It also provides you with a summary of the total number of active tokens that are assigned to each account.

    After selecting the accounts you wish to renew, you will see a summary with new token information.

    Next, you will be given the option to choose how the token information should be posted. You can copy the text from the screen manually or POST the token to a URL of your choice.

    When renewing multiple tokens, their info will be separated by pipe "|" characters.

    You can select POST classic to post your token to your URL with the classic method or POST JSON button to make an API call that will send a JSON array of tokens to your URL.

    POST JSON

    When you select POST JSON, we will create a JSON array named TOKENS and send it directly to the URL you specify. You can obtain this data by accessing the InputStream at your server endpoint.

    POST Classic

    Once you have made your selection, click on the Post Token URL button. You will be given a window in which you can enter a URL. If you have already provided us with one, that URL will be entered into the window by default. You may still manually enter a different URL at this point.

    Once you have the correct posting URL entered, click on the Post button. You'll see a parameter appended to your posting URL. This is what you will use to download your token file.

    The file will contain the token information in an encrypted format consisting of an initialization vector and the data itself, separated by an equals sign "=".

    When viewing the token from POST Classic, the first 12 characters are an initialization vector, including the equal sign "=" separator, the remaining are the encrypted message.

    As an integrator, you will have already been provided with a unique encryption key, also referred to as an EIndex. You can use it to decrypt the token file.

    Once decrypted, each token would now have the account name, account ID, token, token ID, and expiration date, with multiple tokens being separated by a pipe "|".

    The token ID is a reference number by which the Number support can look up your token should you require any assistance.

    Create an ACH Sale

    post: https://easypay5.com/APIcardProcREST/v1.0.0/ACH/Sale

    For member variable "AccountType" use the following values:

    1. Personal Checking = 1

    2. Personal Saving = 2

    3. Business Checking = 3

    FAQ

    Answers to frequently asked questions

    Integration Options

    What are the options available for integrating Number with Verifone card readers?

    Number offers four options: , , , and support.

    PayForm

    Initialize PayForm

    post: https://easypay5.com/APIcardProcREST/v1.0.0/CardSale/InitForm

    Call this method to initialize a payment form used for collecting payments, saving card-on-file data, or both. The call returns the URL used to open the form.

    For details on configurations and options, view our builder tool at

    SessKey string required

    A unique session key used for authentication in API calls. This key is generated upon successful authentication and must be included in all subsequent requests.

    Example: A1842D663E9A4A72XXXXXXXX303541303234373138

    Error Codes

    Links to error code reference

    Transaction response codes

    When using our services, you might end up with a transaction that was declined. This is usually signaled by a response with a TxApproved value of false and a decline code in the ErrCode field. You can then display the RespMsg to the user to explain the error.

    If you want to be able to tell when a specific type of error occurs, you can use our decline code reference and handle them accordingly.

    ACH
    namespace APITest
    {
      public static class LoggingUtil
      {
        private const string PATH = "C:\\Logs\\Payments\\";
    
        private static readonly object _locker = new();
    
        /// <summary>
        /// Log the API response and return logging success.
        /// </summary>
        /// <returns>True if logged successfully, otherwise false.</returns>
        public static bool LogResponse(string apiCallName, bool FunctionOK,
          bool IsSuccess, string RespMsg, int ErrorCode, string ErrMsg)
        {
          try
          {
            if (string.IsNullOrEmpty(RespMsg))
              RespMsg = "N/A";
    
            // Ensure the directory exists
            if (!Directory.Exists(PATH))
            {
              Directory.CreateDirectory(PATH);
            }
    
            string myMonthlyFileName = DateTime.Now.Year.ToString("D4")
              + "_" + DateTime.Now.Month.ToString("D2") + ".log";
            string timeStamp = DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss.ff");
            string message = timeStamp + "," + apiCallName + "," + FunctionOK.ToString() + ","
              + IsSuccess.ToString() + "," + RespMsg + "," + ErrorCode.ToString() + "," + ErrMsg;
            bool fileExists = File.Exists(PATH + myMonthlyFileName);
    
            lock (_locker)
            {
              // Use StreamWriter with 'using' statement to ensure proper resource disposal
              using (StreamWriter swriter = File.AppendText(PATH + myMonthlyFileName))
              {
                // Place a header in each new monthly log file
                if (!fileExists)
                  swriter.WriteLine("Timestamp,apiCallName,FunctionOK,IsSuccess,RespMsg,ErrorCode,ErrMsg");
    
                // Write the response as a new line
                swriter.WriteLine(message);
              }
            }
            return true;
          }
          catch (Exception ex)
          {
            // Optionally log or handle the exception here
            return false;
          }
        }
      }
    }
    
    {
      "ConsentAnnual_Create_CPResult": {
        "ConsentID": 28,
        "CreationSuccess": true,
        "ErrCode": 0,
        "ErrMsg": "",
        "FunctionOk": true,
        "PreConsentAuthMessage": "APPROVED 095710                 ",
        "PreConsentAuthSuccess": true,
        "PreConsentAuthTxID": 84,
        "RespMsg": "Success : Created Consent ID : 000028"
      }
    }
    {
      "SMSPaymentResult": {
        "ErrCode": 0,
        "ErrMsg": "",
        "FunctionOk": true,
        "PaymentUrl": null,
        "RespMsg": "Text Sent Successfully to 2078995025"
      }
    }
    {
      "ConsentRecurring_CreateResult": {
        "ConsentID": 22,
        "CreationSuccess": true,
        "ErrCode": 0,
        "ErrMsg": "",
        "FunctionOk": true,
        "MySched": [
          {
            "Remaining": 9000,
            "SchedID": 41,
            "paymentAmt": 1000,
            "paymentDate": "2024-12-01T11:19:01.000Z",
            "paymentNo": 1
          }
        ],
        "PreConsentAuthMessage": "APPROVED 298734                 ",
        "PreConsentAuthSuccess": true,
        "PreConsentAuthTxID": 66,
        "RespMsg": "Success : Created Recurring Consent ID : 000022"
      }
    }
    Url string optional

    BillIngAddress object optional


    Email string optional

    Example: [email protected]


    Phone string optional

    Example: 8775558472

    Url string optional

    BillIngAddress object optional


    Email string optional

    Example: [email protected]


    Phone string optional

    Example: 8775558472

    3: RECURRING
  • 4: SUBSCRIPTION

  • "Phone": "8777248472",
    "State": "ME",
    "Zip": "04106"
    },
    "EndCustomer": {
    "Address1": "123 Fake St.",
    "Address2": " ",
    "City": "PORTLAND ",
    "ClientRefID": "A123456",
    "Company": "",
    "CreatedOn": "2024-12-01T11:19:01.000Z",
    "Email": "[email protected]",
    "Firstname": "Sean",
    "ID": 72,
    "LastChanged": "2024-12-01T11:19:01.000Z",
    "LastName": "Wood",
    "MerchID": 1,
    "Phone": "8777248472",
    "Service": "",
    "State": "ME ",
    "Zip": "04106 "
    },
    "ErrCode": 0,
    "ErrMsg": "",
    "FunctionOk": true,
    "RespMsg": "Successfully Returned Transaction Detail Record",
    "Transaction": {
    "ACCT_FIRST_NAME": "JOHN",
    "ACCT_LAST_NAME": "DOE",
    "ACCT_NO": "4111XXXXXXXX1111",
    "AMOUNT": 0,
    "AVSr": "Y",
    "AcctHolderID": 1,
    "BatchLogID": 0,
    "BatchNO": -1,
    "BatchStatus": "N",
    "CARD_TYPE": "VI",
    "CASHBACK": 0,
    "CVVr": "",
    "CardPresent": false,
    "ConsentID": 0,
    "CreatedOn": "2024-12-01T11:19:01.000Z",
    "Credits": 0,
    "EMVPresent": false,
    "EMVRecTags": "",
    "EXP_DATE": "1028",
    "EndCustID": 12,
    "Flags": "",
    "HAuthorizedAmount": -1,
    "ID": 12,
    "IsLocked": false,
    "IsPartialApproval": false,
    "LAST_CHANGED_BY": "vidya_Venkatraman",
    "LastChangedOn": "2024-12-01T11:19:01.000Z",
    "MerchID": 1,
    "Origin": "WID",
    "PAYMENT_TYPE": "C",
    "PartialAuthApproved": -1,
    "PreAuthID": 0,
    "PrepaidBalance": -1,
    "REF_ID": "A97689#",
    "RPGUID": "adf98580-b4ab-42fc-bb99-01c89964afe9",
    "RefTxID": 0,
    "SALE_TAX": 0,
    "SEQ_NO": 16,
    "SERVER": "",
    "SURCHARGE": 0,
    "TIP": 0,
    "TXN_CODE": "297620",
    "TXN_DATE": 21219,
    "TXN_DATETIME": "2024-12-01T11:19:01.000Z",
    "TXN_TIME": "125122",
    "TxLOCK": "7A639CD720CE4B14",
    "TxSTATUS": "OPEN",
    "TxType": "CCAUTHONLY",
    "UserID": 2546
    }
    }
    }
    "RefID": "52520ABC",
    "RPGUID": "4c269391-a698-4e10-a1a8-0353ee80d1a6",
    "MessageBody": "",
    "AcctHolderID": 0,
    "Amount": 50,
    "ConsentID": 0,
    "DueOn": "1/12/2025",
    "EINDEX": "100",
    "MerchID": 1,
    "TXID": 0,
    "WType": "SW",
    "RedirectURL": "https://easypay7.com/PostingApp",
    "WidgetURL": "https://easypay5.com/stdwidget",
    "ExpiresOn": "2025-10-05T00:00:00.000Z",
    "SingleUse": 0,
    "OptParam": "VISIBLE|1EE7|READONLY|0000|STYLES|0000|OPTIONS|0601|COLORS|#ffffff,#428bca,#007bff,#212121,#ffffff,#212121,#ffffff",
    "Questions": []
    }
    }

    CSV string optional

    Example: 122


    Track string | nullable optional

    Example: %B4788250000028291^VISA TEST/GOOD^231010100733000000?;4895390000000013=151210100000733?

    ConsentCreator object optional

    MerchID integer optional

    Example: 1


    CustomerRefID string optional

    Example: A123456


    ServiceDescrip string optional


    RPGUID string optional

    A custom, user-defined reference ID or value.

    Example: adf98580-b4ab-42fc-bb99-01c89964afe9


    StartDate string optional

    Date and time in Microsoft JSON date format (Unix timestamp and timezone offset).

    Example: 2024-12-01T11:19:01.000Z


    NumPayments integer optional

    Example: 10


    TotalAmount number · float optional

    Example: 10000


    Period integer optional

    Example: 2

    AcctHolder object optional

    Firstname string optional

    Example: Sally


    Lastname string optional

    Example: APIACH


    Company string optional


    Title string optional


    Url string optional


    BillIngAddress object optional


    Email string optional

    Example: [email protected]


    Phone string optional

    Example: 8775558472

    EndCustomer object optional

    Firstname string optional

    Example: Sally


    Lastname string optional

    Example: APIACH


    Company string optional


    Title string optional


    Url string optional


    BillIngAddress object optional


    Email string optional

    Example: [email protected]


    Phone string optional

    Example: 8775558472

    "Firstname": "Sean",
    "Lastname": "Wood",
    "Company": "",
    "Title": "",
    "Url": "",
    "BillIngAdress": {
    "Address1": "123 Fake St",
    "Address2": "",
    "City": "PORTLAND",
    "State": "ME",
    "ZIP": "04106",
    "Country": "USA"
    },
    "Email": "[email protected]",
    "Phone": "8777248472"
    },
    "EndCustomer": {
    "Firstname": "Sean",
    "Lastname": "Wood",
    "Company": "",
    "Title": "",
    "Url": "",
    "BillIngAdress": {
    "Address1": "123 Fake St.",
    "Address2": "",
    "City": "PORTLAND",
    "State": "ME",
    "ZIP": "04106",
    "Country": "USA"
    },
    "Email": "[email protected]",
    "Phone": "8777248472"
    }
    }

    A Vulnerability Management Program: Using and regularly updating antivirus software.

  • Strong Access Control Measures: Access to cardholder data should be restricted by business need-to-know, with a unique ID assigned to each person with computer access, and restricted physical access to cardholder data.

  • Regular Monitoring and Network Tests: Tracking and monitoring all access to network resources and cardholder data, regularly testing security systems and processes.

  • An Information Security Policy: Companies must maintain a policy that addresses information security for all personnel.

  • Card-on-file (Annual consent).
    Processing a card sale with card present
    Contact us

    REST API >

    Android SDK >

    iOS SDK >

    React Native SDK >

    PayForm >

    Widgets >

    Virtual Terminal >

    Verifone >

    PCI Compliance

    4788 2500 0002 8291

    4055 0111 1111 1111

    6011 0009 9550 0000

    6011 2121 0000 0087

    5454 5454 5454 5454

    5405 2222 2222 2226

    5473 0000 0000 0007

    3714 4963 5398 431

    Cover
    Cover
    Cover
    Cover
    Cover
    Cover
    Cover
    Cover
    https://easypay5.com/reseteasypay5.com
    VT terminal reset
    Authentication Old
    string json;
    using (var reader = new StreamReader(Request.InputStream))
    {
        json = reader.ReadToEnd();
    }
    JSON array example
    "Tokens": [{"TokenID":"8961", "AccountCode":"EP8179234", "Token":"AB87E1D81559466E9165FCDA2B5B12C3", "AccountName":"CY FD TEST", "ExpirationDate":"11/22/2026 1:59:54 PM"}, {"TokenID":"8962", "AccountCode":"EP1519128", "Token":"EDB6D3FC1DE44A5C883BC718350C40BC", "AccountName":"CY TSYS TEST", "ExpirationDate":"11/22/2026 1:59:54 PM"}]
    Posting param example
    ?TokenFile=https://easypay5.com/ClientAdminPortalR101/Content/ManageTokens/Tempfile/f7048.txt
    Token data example
    xts/VQqO3XY=mJjvA64NIeJZRO8T2AwjcBwmiHSyWUPyxOwppWbObhz4Q99Oa/a/xz7dnVccGRtKSU4uee4vKYmRtpJWqOnpvxVyGEPPtliKJrnfqIsVVlrLO3/9PloUBzeorX3d9HvCsgX9QcO7fPGbt/rpbfTLeUtk5OJhguEMbre7g1MX1FlM4xGI3/Hq362Lpg2LIJ1KIXXArBSDhLAq5yAXjRFwjQTzV81UITTEZN+HLNklVIcqpVPa0IFhxg==
    Decrypted token example
    EASY PAY DYNA PRO TEST,EP4397937,533825D35E2B4EXXXXXXXXXX54A0AF73,4804,2/8/2017 2:50:06 PM|EASYPAY HEALTH CARE TEST,EP9948514,4C9AA0E6194847XXXXXXXXXXC3427D64,4805,2/8/2017 2:50:06 PM
    Accept string required

    Example: application/json

    ChargeDetails object optional

    AccountNumber string optional

    The account number associated with the bank account from which funds will be withdrawn.

    Example: 878460000256


    RoutingNumber string optional

    The routing number of the bank, used to identify the financial institution for the transaction.

    Example: 211274515


    Amount number · float optional

    The $ amount to be charged, specified in decimal format.

    Example: 10.25


    AccountType integer · enum optional

    The type of bank account. Possible values are:

    • 1: Personal Checking.

    • 2: Personal Saving.

    • 3: Business Checking.

    • 4: Business Saving.

    AcctHolder object optional

    Firstname string optional

    Example: Sally


    Lastname string optional

    Example: APIACH


    Company string optional


    Title string optional


    EndCustomer object optional

    Firstname string optional

    Example: Sally


    Lastname string optional

    Example: APIACH


    Company string optional


    Title string optional


    PurchItems object optional

    ServiceDescrip string optional

    A description of the service or item.

    Example: FROM API TESTER


    ClientRefID string optional

    A reference ID provided by the client for tracking purposes.

    Example: 12456AA


    RPGUID string optional

    A custom, user-defined reference ID or value.

    MerchID integer optional

    Example: 1

    {
      "ChargeDetails": {
        "AccountNumber": "878460000256",
        "RoutingNumber": "211274515",
        "Amount": 10.25,
        "AccountType": 1
      },
      "AcctHolder": {
        "Firstname": "Sally",
        "Lastname": "Smith",
        "Company": "",
        "Title": "",
        "Url": "",
        "BillIngAdress": {
          "Address1": "123 Test Road",
          "Address2": "",
          "City": "Portland",
          "State": "ME",
          "ZIP": "04005",
          "Country": "USA"
        },
        "Email": "[email protected]",
        "Phone": "8775558472"
      },
      "EndCustomer": {
        "Firstname": "Sally",
        "Lastname": "Smith",
        "Company": "",
        "Title": "",
        "Url": "",
        "BillIngAdress": {
          "Address1": "123 Test Road",
          "Address2": "",
          "City": "Portland",
          "State": "ME",
          "ZIP": "04005",
          "Country": "USA"
        },
        "Email": "[email protected]",
        "Phone": "8775558472"
      },
      "PurchItems": {
        "ServiceDescrip": "FROM API TESTER",
        "ClientRefID": "12456AA",
        "RPGUID": "3d3424a6-c5f3-4c28"
      },
      "MerchID": 1
    }

    Amount

    The $ amount to collect.

    ConsentID

    Not used, please fill with 0.

    DueOn

    The payment due date in mm/dd/yyyy or yyyy/mm/dd format to display to the customer.

    EINDEX

    This is your unique Integrator Key Index for encryption. It should be provided by Number when you make an account with us, otherwise .

    MerchID

    The unique identifier for the Merchant record.

    TXID

    Not used, please fill with 0.

    WType

    This specifies which payment widget to display, including custom widgets built for your company.

    RedirectURL

    This specifies where to redirect the user and post the results of the transaction.

    WidgetURL

    The endpoint for the widget payment form, including custom forms. and we will provide you with a value. You can start with

    ExpiresOn

    A date in yyyy-mm-dd format for when the payment link should no longer be available.

    SingleUse

    Indicates whether the payment link should only accept a single payment.

    OptParams

    Parameters which control the design and behavior of the payment form including the visible fields, read-only fields, color and styling, and submission options. See the section in the guide to learn how you can generate those parameters.

    Person

    The name, address, email, and phone number for the payee.

    MessageType

    The type of message for the payee.

    • EMAIL: Send an email with a link to the payment form

    • URLONLY: Only return a URL to the payment form in the response

    • TEXT: Send a text message with a link to the payment form

    RefID

    A custom user-defined field to save with the transaction.

    RPGUID

    Another custom user-defined field to save with the transaction.

    MessageBody

    The message to send. Use **Merch1** to insert merchant's name into your message template. If the body is left empty, a default generic message will be used:

    You have a Payment Due to [Merchant Name] of [Amount] due on [DueOn]. Please follow the link below to make the Payment. [Link Here]

    AcctHolderID

    Not used, please fill with 0.

    Business Saving = 4

    {
      "ChargeDetails": {
        "AccountNumber": "878460000256",
        "RoutingNumber": "211274515",
        "Amount": 10.25,
        "AccountType": 1
      },
      "AcctHolder": {
        "Firstname": "Sally",
        "Lastname": "Smith",
        "Company": "",
        "Title": "",
        "Url": "",
        "BillIngAdress": {
          "Address1": "123 Test Road",
          "Address2": "",
          "City": "Portland",
          "State": "ME",
          "ZIP": "04005",
          "Country": "USA"
    

    SessKey string required

    A unique session key used for authentication in API calls. This key is generated upon successful authentication and must be included in all subsequent requests.

    Example: A1842D663E9A4A72XXXXXXXX303541303234373138


    Content-Type string required

    Example: application/json


    Accept string required

    Example: application/json

    ChargeDetails object optional

    AccountNumber string optional

    The account number associated with the bank account from which funds will be withdrawn.

    Example: 878460000256


    RoutingNumber string optional

    The routing number of the bank, used to identify the financial institution for the transaction.

    Example: 211274515


    How do I implement the Number Verifone SDK in my application?

    To implement the Number Verifone SDK, download the DLL, include it in your project, and follow the integration guidelines provided in the Verifone integration guide to set up payment processing.

    Can I use Number and Verifone with a web application?

    Yes, Number provides a browser-based interface that allows integration with web applications using Cross-Origin Resource Sharing (CORS) to communicate with Verifone devices.

    You can find the full implementation details in the Verifone integration guide.

    Security and Compliance

    How does Number ensure the security of cardholder data?

    Number utilizes end-to-end encryption (P2PE) to secure cardholder data, ensuring it remains encrypted during transmission to the PCI Level One compliant processing platform.

    What is HMAC, and why is it important in the Number API?

    HMAC (Hash-based Message Authentication Code) is used to create a hash that verifies the authenticity of requests when passing cardholder data through the Number API.

    What are the requirements for passing cardholder data through the Number API?

    To pass cardholder data through the Number API, you need a session key, HMAC secret, and RSA Certificate to encrypt the credit card number before transmission.

    You can read more in section of our Authentication guide.

    How can I manage token renewal for Number?

    You can manage token renewal through the Number Client Admin Portal, where you can create new tokens and view existing ones. Tokens expire every six months.

    You can read more about token renewal in our Client Admin Portal guide.

    Session Management

    How do I manage session keys when using the Number API?

    Call the authenticate method to obtain a session key using your account code and token. The session will be valid for 25 hours or until you change your IP. If you receive error codes 5030 or 5050, re-authenticate to obtain a new session key.

    Read more in our Authentication guide.

    What should I do if my session key expires?

    If your session key expires, you will need to authenticate again to obtain a new session key. Monitor for expiration codes to ensure continuous access.

    Read more in our Authentication guide.

    What happens if I exceed the number of unsuccessful authentication attempts?

    If you exceed six unsuccessful authentication attempts, your IP address will be locked out, requiring manual intervention from Number support to unlock it.

    Read more in the section of our Authentication guide.

    How can I check if my authentication was successful?

    After authentication, check the FunctionOK and AuthSuccess flags. If both are true, you will receive a session key; otherwise, read the error messages and abort the process.

    Payment Processing

    What types of transactions can I process using Number?

    Number allows you to process various types of transactions, including authorizations, credits, voids, settlements, and recurring payments through card-on-file plans

    How do I handle refunds using the Number system?

    To process refunds, you can use the Number API to initiate a credit transaction against the original payment. Ensure you have the original transaction ID to reference during the refund process.

    What is the process for creating card-on-file payment plans using Number?

    You can create card-on-file payment plans using a variety of channels such as the Virtual Terminal, our APIs, PayForm, widgets, and the Win service for Verifone. All of those options allow you to manage recurring payments and consent agreements.

    To find out more, we recommend reading the Card Sales and Consent quickstart guide.

    How can I ensure that my transactions are secure?

    Number employs end-to-end encryption (P2PE) for all transactions, ensuring that cardholder data is encrypted during transmission between the Verifone device and the Number cloud servers.

    Reconciliation

    How can I ensure that my database contains accurate transaction data?

    We recomend that your system periodically query our database to ensure you have accurate data. Webhooks are provided for real-time notifications, but you can augment this with transaction queries.

    Read more about reconciliation in section of the Querying reference.


    Content-Type string required

    Example: application/json


    Accept string required

    Example: application/json

    InitParams object optional

    MerchID integer required

    Use 1 unless your account has multiple merchant records. The merchant ID for the transaction.

    Example: 1


    WTYPE string · enum required

    The widget type for the PayForm

    • PF: Regular PayForm

    • PA: International PayForm

    Example: PF

    Possible values: PF PA


    PostURL string optional

    The URL where real-time values will be posted after payment completion.

    Example: https://easypay7.com/swidget/JsonGet.aspx


    RedirectURL string optional

    The URL to redirect to after processing the payment.

    Example: https://easypay8.com/CYWidget/


    REF_ID string optional

    A custom, user-defined reference ID or value.

    Example: A97689#


    RPGUID string optional

    A custom, user-defined reference ID or value.

    Example: adf98580-b4ab-42fc-bb99-01c89964afe9


    EndPoint string required

    Points to a specific web app on our servers. Should always have the value of PayForm/PF.aspx.

    Example: PayForm/PF.aspx


    EINDEX string optional

    Integrator key index for encryption assigned when integrator account is first created, received with the initial login credentials

    Example: 100

    Amounts object optional

    BaseAmt number · float optional

    The base $ amount for the transaction before any additional charges.

    Example: 52


    Surcharge number · float optional

    The surcharge $ amount added to the base amount, if applicable. Adjusted based on the total.

    Example: 1.04


    TotalAmt number · float optional

    The total $ amount to be charged, which includes the base amount and any surcharges.

    Payer object optional

    Firstname string optional

    The first name of the payer.

    Example: John


    Lastname string optional

    The last name of the payer.

    Example: Doe


    Email string optional

    The email of the payer.


    WidOptions object required

    eVisible string required

    Hex digits controlling field visibility.

    Example: 0665


    eReadOnly string required

    Hex digits dictating read-only fields.

    Example: 0040


    eStyles string required

    Hex digits controlling form styling.

    https://easypay8.com/byopayform/
    {
      "InitParams": {
        "MerchID": 1,
        "WTYPE": "PF",
        "PostURL": "https://easypay7.com/swidget/JsonGet.aspx",
        "RedirectURL": "https://easypay8.com/CYWidget/",
        "REF_ID": "A97689#",
        "RPGUID": "92e1e15c-f64a-466b-8733-9b518b9f374c",
        "EndPoint": "PayForm/PF.aspx",
        "EINDEX": "300",
        "Amounts": {
          "Amount": 20,
          "Surcharge": 0,
          "TotalAmt": 20
        },
        "Payer": {
          "Firstname": "John Doe",
          "Lastname": "",
          "BillingAddress": {
            "StreetAddress": "",
            "City": "",
            "State": "",
            "ZIP": "04048",
            "Country": ""
          },
          "Email": "",
          "Phone": ""
        },
        "WidOptions": {
          "eVisible": "0665",
          "eReadOnly": "0040",
          "eStyles": "0001",
          "eSubmission": "0A01",
          "eColors": "#ffffff,#428bca,#007bff,#212121,#ffffff,#212121,#ffffff"
        }
      }
    }

    Global Payments decline codes

    These codes are used when processing transactions through the Global Payments system. For Global Payments transaction decline codes, see.

    First Data decline codes

    These codes are relevant when dealing with transactions processed by First Data. For First Data transaction decline codes, see .

    ACH decline codes

    These codes are specifically for Automated Clearing House (ACH) transactions. For ACH decline codes, see .

    Cancel a recurring consent

    post: https://easypay5.com/APIcardProcREST/v1.0.0/ConsentRecurring/Cancel

    SessKey string required

    A unique session key used for authentication in API calls. This key is generated upon successful authentication and must be included in all subsequent requests.

    Example: A1842D663E9A4A72XXXXXXXX303541303234373138


    Content-Type string required

    {
      "ACHTransaction_ComboResult": {
        "AuthID": "69017501",
        "ConsentID": 1247,
        "ErrCode": 0,
        "ErrMsg": "",
        "FunctionOk": true,
        "RespMsg": "TxID 1381 Approved and ConsentID 1247 Created",
        "TxApproved": true,
        "TxID": 1381,
        "uniqueTranID": "16790131F349BCBA"
      }
    }
    {
      "ACHTransactionResult": {
        "AuthID": "69017501",
        "ErrCode": 0,
        "ErrMsg": "",
        "FunctionOk": true,
        "RespMsg": "TxID 1381 Approved",
        "TxApproved": true,
        "TxID": 1381,
        "uniqueTranID": "16790131F349BCBA"
      }
    }
    {
      "PaymentInitResult": {
        "ErrCode": 0,
        "ErrMsg": "",
        "FunctionOk": true,
        "PaymentUrl": "https://easypay5.com/swidget/?eGUID=239F97C4&CS=021&Digest=tru49A2ncbyvHoaIa6T81Q",
        "RespMsg": "successfully returned payment Url"
      }
    }
    Url string optional

    BillIngAdress object optional


    Email string optional

    Example: [email protected]


    Phone string optional

    Example: 8775558472

    Url string optional

    BillIngAdress object optional


    Email string optional

    Example: [email protected]


    Phone string optional

    Example: 8775558472

    Example: adf98580-b4ab-42fc-bb99-01c89964afe9

    Example: 53.04

    Phone string optional

    The phone of the payer.


    BillingAddress object optional

    Example: 0001

    eSubmission string required

    Hex digits controlling submission options.

    Example: 0A01


    eColors string required

    String controlling optional color schemes.

    Example: #ffffff,#428bca,#007bff,#212121,#ffffff,#212121,#ffffff

    Amount number · float optional

    The $ amount to be charged, specified in decimal format.

    Example: 10.25


    AccountType integer · enum optional

    The type of bank account. Possible values are:

    • 1: Personal Checking.

    • 2: Personal Saving.

    • 3: Business Checking.

    • 4: Business Saving.

    AcctHolder object optional

    Firstname string optional

    Example: Sally


    Lastname string optional

    Example: APIACH


    Company string optional


    Title string optional


    Url string optional


    BillIngAdress object optional


    Email string optional

    Example: [email protected]


    Phone string optional

    Example: 8775558472

    EndCustomer object optional

    Firstname string optional

    Example: Sally


    Lastname string optional

    Example: APIACH


    Company string optional


    Title string optional


    Url string optional


    BillIngAdress object optional


    Email string optional

    Example: [email protected]


    Phone string optional

    Example: 8775558472

    PurchItems object optional

    ServiceDescrip string optional

    A description of the service or item.

    Example: FROM API TESTER


    ClientRefID string optional

    A reference ID provided by the client for tracking purposes.

    Example: 12456AA


    RPGUID string optional

    A custom, user-defined reference ID or value.

    Example: adf98580-b4ab-42fc-bb99-01c89964afe9

    MerchID integer optional

    Example: 1

    },
    "Email": "[email protected]",
    "Phone": "8775558472"
    },
    "EndCustomer": {
    "Firstname": "Sally",
    "Lastname": "Smith",
    "Company": "",
    "Title": "",
    "Url": "",
    "BillIngAdress": {
    "Address1": "123 Test Road",
    "Address2": "",
    "City": "Portland",
    "State": "ME",
    "ZIP": "04005",
    "Country": "USA"
    },
    "Email": "[email protected]",
    "Phone": "8775558472"
    },
    "PurchItems": {
    "ServiceDescrip": "FROM API TESTER",
    "ClientRefID": "12456AA",
    "RPGUID": "3d3424a6-c5f3-4c28"
    },
    "MerchID": 1
    }
    Example: application/json

    Accept string required

    Example: application/json

    ConsentID integer optional

    ID of the consent to be cancelled

    Example: 23

    {
      "ConsentID": 23
    }
    {
      "ConsentRecurring_CancelResult": {
        "CancelSuccess": true,
        "CancelledConsentID": 23,
        "ErrCode": 0,
        "ErrMsg": "",
        "FunctionOk": true,
        "RespMsg": "Successfully DISBALED ConsentID 23 : Card Number Removed"
      }
    }
    contact Number customer support
    Contact Number for more information.
    Contact Number
    https://easypay5.com/stdwidget/
    PayForm

    Process a Card Sale

    Process a card sale with card present

    post: https://easypay5.com/APIcardProcREST/v1.0.0/CardSale/CardPresent

    For PCI compliant merchants only (AOC on file with Number required)

    {
      "Track": "%B4788250000028291^VISA TEST/GOOD^231010100733000000?;4895390000000013=151210100000733?",
      "AcctHolder": {
        "Firstname": "Sean",
        "Lastname": "Wood",
        "Company": "",
        "Title": "",
        "Url": "",
        "BillIngAdress": {
          "Address1": "123 Fake St.",
          "Address2": "",
          "City": "PORTLAND",
          "State": "ME",
          "ZIP": "04106",
          "Country": "USA"
        },
        "Email": "[email protected]",
        "Phone": "8777248472"
      },
    
    

    SessKey string required

    A unique session key used for authentication in API calls. This key is generated upon successful authentication and must be included in all subsequent requests.

    Example: A1842D663E9A4A72XXXXXXXX303541303234373138


    Content-Type string required

    Example: application/json


    Accept string required

    Example: application/json

    Track string optional

    Example: %B4788250000028291^VISA TEST/GOOD^231010100733000000?;4895390000000013=151210100000733?


    AcctHolder object optional

    AccountNum string optional

    The unique account number associated with the account holder.

    Example: wj8HlAYlMJI=jvje9l7qZuEFiDDeEDDym6ZdlL0DX8HX


    AcctMask

    Transaction Search

    Search for transactions based on parameters

    post: https://easypay5.com/APIcardProcREST/v1.0.0/Query/Transaction

    Easy Pay provides a variety of ways to search for and query transactions. To view a complete list of options, view the https://easypaysoftware.com/en/Querying Query Guide.

    Use this call to search for transactions based on one or more parameters. A collection of transaction objects is returned. Transactions can be searched using several different parameters including the following.

    • ID ( TxID ) ( Unique Identifier for the transaction )

    • TRANSACTION STATUS ( OPEN , VOID, SETTLED, FAILED )

    • DATE CREATED

    • CARDHOLDER LAST NAME / FIRST NAME

    • BATCH NUMBER ( Settlement group )

    • TRANSACTION TYPE ( CCSALE, CCCREDIT , CCAUTHONLY)

    • APPROVAL CODE / DECLINE CODE

    • AMOUNT

    • Reference ID (User defined field which can be searchable)

    • RPGUID (Another user defined field which can be searchable)

    • Last 4 Digits of the Card

    SessKey string required

    A unique session key used for authentication in API calls. This key is generated upon successful authentication and must be included in all subsequent requests.

    Example: A1842D663E9A4A72XXXXXXXX303541303234373138


    Content-Type string required

    Example: application/json


    {
      "CreditCardSale_CardPresentResult": {
        "AVSresult": "Y",
        "AcquirerResponseEMV": null,
        "CVVresult": "",
        "ErrCode": 0,
        "ErrMsg": "",
        "FunctionOk": true,
        "IsPartialApproval": false,
        "RequiresVoiceAuth": false,
        "RespMsg": "APPROVED 092682",
        "ResponseApprovedAmount": "-1Pl",
        "ResponseAuthorizedAmount": -1,
        "ResponseBalanceAmount": -1,
        "TxApproved": true,
        "TxID": 44,
        "TxnCode": 92682
      }
    }
    string
    optional

    The masked version of the account number for security purposes.

    Example: 4111XXXXXXXX1111


    Address1 string optional

    The primary address line of the account holder.

    Example: 123 Fake St


    Address2 string optional

    The secondary address line of the account holder, if applicable.


    CardType string optional

    The type of card associated with the account (e.g., Visa, MasterCard).

    Example: VI


    City string optional

    The city where the account holder resides.

    Example: PORTLAND


    Company string optional

    The name of the company associated with the account holder, if applicable.


    CreatedOn string optional

    Date and time in Microsoft JSON date format (Unix timestamp and timezone offset).

    Example: 2024-12-01T11:19:01.000Z


    Email string optional

    The email address of the account holder.

    Example: [email protected]


    ExpDate string optional

    The expiration date of the card in MMYY format.

    Example: 1023


    Firstname string optional

    The first name of the account holder.

    Example: Sean


    ID integer optional

    The unique identifier for the account holder in the system.

    Example: 1


    LastChanged string optional

    Date and time in Microsoft JSON date format (Unix timestamp and timezone offset).

    Example: 2024-12-01T11:19:01.000Z


    LastName string optional

    The last name of the account holder.

    Example: Wood


    MerchID integer optional

    The unique identifier for the merchant associated with the account.

    Example: 1


    Phone string optional

    The phone number of the account holder.

    Example: 8777248472


    State string optional

    The state where the account holder resides.

    Example: ME


    Zip string optional

    The postal code for the account holder's address.

    Example: 04106

    EndCustomer object optional

    AccountNum string optional

    The unique account number associated with the account holder.

    Example: wj8HlAYlMJI=jvje9l7qZuEFiDDeEDDym6ZdlL0DX8HX


    AcctMask string optional

    The masked version of the account number for security purposes.

    Example: 4111XXXXXXXX1111


    Address1 string optional

    The primary address line of the account holder.

    Example: 123 Fake St


    Address2 string optional

    The secondary address line of the account holder, if applicable.


    CardType string optional

    The type of card associated with the account (e.g., Visa, MasterCard).

    Example: VI


    City string optional

    The city where the account holder resides.

    Example: PORTLAND


    Company string optional

    The name of the company associated with the account holder, if applicable.


    CreatedOn string optional

    Date and time in Microsoft JSON date format (Unix timestamp and timezone offset).

    Example: 2024-12-01T11:19:01.000Z


    Email string optional

    The email address of the account holder.

    Example: [email protected]


    ExpDate string optional

    The expiration date of the card in MMYY format.

    Example: 1023


    Firstname string optional

    The first name of the account holder.

    Example: Sean


    ID integer optional

    The unique identifier for the account holder in the system.

    Example: 1


    LastChanged string optional

    Date and time in Microsoft JSON date format (Unix timestamp and timezone offset).

    Example: 2024-12-01T11:19:01.000Z


    LastName string optional

    The last name of the account holder.

    Example: Wood


    MerchID integer optional

    The unique identifier for the merchant associated with the account.

    Example: 1


    Phone string optional

    The phone number of the account holder.

    Example: 8777248472


    State string optional

    The state where the account holder resides.

    Example: ME


    Zip string optional

    The postal code for the account holder's address.

    Example: 04106

    Amounts object optional

    TotalAmt number optional

    The total $ amount to be charged.

    Example: 10


    SalesTax number optional

    Example: 0


    Surcharge number optional

    The surcharge $ amount added to the base amount, if applicable.

    Example: 0


    Tip number optional

    Example: 0


    CashBack number optional

    Example: 0


    ClinicAmount number optional

    Example: 0


    VisionAmount number optional

    Example: 0


    PrescriptionAmount number optional

    Example: 0


    DentalAmount number optional

    Example: 0


    TotalMedicalAmount number optional

    Example: 0

    PurchItems object optional

    ServiceDescrip string optional

    A description of the service or item.

    Example: FROM API TESTER


    ClientRefID string optional

    A reference ID provided by the client for tracking purposes.

    Example: 12456AA


    RPGUID string optional

    A custom, user-defined reference ID or value.

    Example: adf98580-b4ab-42fc-bb99-01c89964afe9

    MerchID integer optional

    Example: 1

    "EndCustomer": {
    "Firstname": "Sean",
    "Lastname": "Wood",
    "Company": "",
    "Title": "",
    "Url": "",
    "BillIngAdress": {
    "Address1": "123 Fake St.",
    "Address2": "",
    "City": "PORTLAND",
    "State": "ME",
    "ZIP": "04106",
    "Country": "USA"
    },
    "Email": "[email protected]",
    "Phone": "8777248472"
    },
    "Amounts": {
    "TotalAmt": 10,
    "SalesTax": 0,
    "Surcharge": 0,
    "Tip": 0,
    "CashBack": 0,
    "ClinicAmount": 0,
    "VisionAmount": 0,
    "PrescriptionAmount": 0,
    "DentalAmount": 0,
    "TotalMedicalAmount": 0
    },
    "PurchItems": {
    "ServiceDescrip": "FROM API TESTER",
    "ClientRefID": "",
    "RPGUID": "a8e2bbfc-e423-4a84-a9e9-2a6e08153368"
    },
    "MerchID": 1
    }
    Accept string required

    Example: application/json

    Query string optional

    A query string for obtaining specific transaction records using Number's query language. Build logical terms and join them with '&&' for logical AND or '||' for logical OR. Use single quotes for text and date values. Refer to the variable chart for query composition:

    • A: MERCHANT ID - The merchant record you are interested in, e.g. (A=1).

    • B: TRANSACTION STATUS - The status of the transaction, e.g. (B=1).

      • -1: ALL

      • 1: OPEN

      • 2: SETTLED

      • 3: FAILED

      • 4: RETURNED

      • 5: VOID

    • C: DATE CREATED - The date the transaction was created, e.g. (C>='7/5/2024 12:00:00 AM').

    • D: LAST NAME - Last name of the account holder, e.g. (D LIKE '%MITH') for all names that end with 'MITH'.

    • E: TRANSACTION LOCK - Lock status of the transaction, e.g. (E<>'0') for locked transactions.

    • H: TRANSACTION ID - The unique identifier for the transaction, e.g. (H=58258).

    • J: FIRST NAME - First name of the account holder, e.g. (J LIKE 'ROB%') for all names that start with 'ROB'.

    • K: TRANSACTION TYPE - The type of transaction, e.g. (K=-1).

      • -1: ALL

      • 1: ACHDEBIT

      • 2: ACHCREDIT

    • L: AMOUNT - The $ amount of the transaction, e.g. (L>100.00).

    • M: CLIENT REFERENCE ID - User-defined value on the transaction.

    • N: RPGUID - User-defined value on the transaction.

    • P: CONSENT ID - The Consent ID of card on file the transactions were charged against, e.g. (P=15875).

    • Q: ACCOUNT NUMBER LAST 4 - The last 4 digits of a credit card, e.g. (Q='4123').

    • R: APPROVAL CODE - The approval code for the transaction, e.g. (R='TAS626').

    • S: CUSTOMER LAST NAME - The last name of the customer, e.g. (S='SMITH').

    • T: CUSTOMER FIRST NAME - The first name of the customer, e.g. (T='FOSTER').

    • U: ORIGIN - The origin of the transaction, e.g. (U='API').

      • "API": REST / SOAP API

      • "WID": Widget

      • "VT": Virtual Terminal

    Example: (B=3)&&(E=1)&&(C>'2024-09-01')

    {
      "Query": "(A=-1)&&(B=-1)&&(C>='4/13/2023')&&(C<'4/29/2023')"
    }
    {
      "Transaction_QueryResult": {
        "ErrCode": 0,
        "ErrMsg": "",
        "FunctionOk": true,
        "NumRecords": 5,
        "RespMsg": "Successfully Returned Transaction Records : 5",
        "Transactions": [
          {
            "ACCT_FIRST_NAME": "Sean",
            "ACCT_LAST_NAME": "Wood",
            "ACCT_NO": "4788XXXXXXXX8291",
            "AMOUNT": 10,
            "AVSr": "Y",
            "AcctHolderID": 3,
            "BatchLogID": 0,
            "BatchNO": 0,
            "BatchStatus": "N",
            "CARD_TYPE": "VI",
            "CASHBACK": 0,
            "CVVr": "",
            "CardPresent": true,
            "ConsentID": 0,
            "CreatedOn": "2024-12-01T11:19:01.000Z",
            "Credits": 0,
            "EMVPresent": false,
            "EMVRecTags": "",
            "EXP_DATE": "1028",
            "EndCustID": 44,
            "Flags": "",
            "HAuthorizedAmount": -1,
            "ID": 44,
            "IsLocked": false,
            "IsPartialApproval": false,
            "LAST_CHANGED_BY": "vidya_Venkatraman",
            "LastChangedOn": "2024-12-01T11:19:01.000Z",
            "MerchID": 1,
            "Origin": "API",
            "PAYMENT_TYPE": "C",
            "PartialAuthApproved": -1,
            "PreAuthID": 0,
            "PrepaidBalance": -1,
            "REF_ID": "A97689#",
            "RPGUID": "adf98580-b4ab-42fc-bb99-01c89964afe9",
            "RefTxID": 0,
            "SALE_TAX": 0,
            "SEQ_NO": 51,
            "SERVER": "",
            "SURCHARGE": 0,
            "TIP": 0,
            "TXN_CODE": 92682,
            "TXN_DATE": 42419,
            "TXN_DATETIME": "2024-12-01T11:19:01.000Z",
            "TXN_TIME": 82544,
            "TxLOCK": "7A639CD720CE4B14",
            "TxSTATUS": "OPEN",
            "TxType": "CCSALE",
            "UserID": 2547
          }
        ]
      }
    }

    Card Sales and Consent

    Learn to make credit card sales and collect consent with Number

    Card present sales and consent

    To make sales or collect consent when a card is present using Number, you have several options:

    1

    Integration with a Verifone card reader

    You can use Verifone card readers. They are secure devices that connect to your computer via USB. They encrypt cardholder data during transmission to ensure security.

    2

    USB card reader through the Virtual Terminal or our desktop app

    When you have a USB card reader connected to your machine, you can log into the Virtual Terminal to make card present sales and to collect consent.

    We also have a custom desktop application which can be convenient in an office setting to collect card present payments. It offers similar functionality to the Virtual Terminal.

    3

    Custom integration with our REST API

    Our REST API offers methods for handling card present transactions.

    If you have your own PCI level one compliance program, you may write your own custom code calling our APIs to collect card present payments and consent. You can read more about PCI compliance in the short section of our guide.

    Verifone integration

    There are a few approaches to integration, You can either use the browser-based interface option or the Desktop integration with SDK .

    For an in-depth tutorial on how to integrate and use your Verifone card reader with Number, see our integration guide.

    Before you start, you'll need to download the Verifone Windows service to your machine, connect your card reader device to a free USB port, allow it to initialize, extract the archive with the service and run the EXE as an administrator. After the installation is complete, reboot the system.

    You can issue commands to the service by calling https://localhost:8031 from your website.

    Verifone card present sales

    Here's an simplified example of how you can invoke the service for a card present sale:

    Verifone card present annual consent

    Here's an simplified example of how you can invoke the service to collect annual consent:

    Virtual Terminal or desktop application

    When you want to use your Verifone with the Virtual Terminal, you have to first install the very same Windows service that is used when doing a Verifone browser-based integration. After installation, to get the card reader features activated.

    To learn more about using the Virtual Terminal, see the user guide.

    Read more about using our custom desktop application for sales in the guide or to get access.

    Virtual Terminal card present sales

    When you visit the Virtual Terminal, log in and expand Credit Cards in the navigation on the left. You'll see options for a sale, an EMV sale, authorization, forced auth, and adjustments.

    As long as your USB card reader is connected to your machine, it will seamlessly integrate with the Virtual Terminal for card present transactions.

    Virtual Terminal card present consent

    When you visit the Virtual Terminal, log in and expand Consents in the navigation on the left. You'll see options for annual consent, EMV annual consent, and one-time consent. You can also expand the Recurring tab to find options to create recurring consent, EMV recurring consent, and subscription consent.

    As long as your USB card reader is connected to your machine, it will seamlessly integrate with the Virtual Terminal for card present transactions.

    REST API integration

    Our APIs are useful for any Integration as you can apply a credit, void, query, charge a stored card etc. For integrators who are PCI Level one compliant you may also pass cardholder data directly through the API. Most integrations will use our PayForms to collect Cardholder data while the API will be used for all remaining activity.

    To learn more about our APIs, see the integration guide.

    When you scan the credit card and collect the track data alongside the other payment details, if using the REST API, prepare the HMAC secured header like shown in quickstart guide, and encrypt the card number using our RSA certificate.

    Follow the instructions in the API reference to prepare and handle the request.

    API card present sales

    You can use the following API operations:

    • For the REST API, use

    API card present consent

    You can use the following API operations:

    • For the REST API, you can use and .


    Manual card sales and consent

    To make credit card sales and collect consent using Number when you want to enter the card details manually, you have the following options:

    1

    PayForm widget

    You can configure and customize our PayForm widget and redirect your users to a separate page with the form or embed it as an IFrame in your existing web application.

    2

    PayForm widget

    The PayForm is designed to be a highly flexible and secure payment form for your users. To start collecting payments and consent with the PayForm, you'll want to use our builder tool for configuration, then our REST API to generate a payment URL.

    Learn more about how to configure and use the PayForm in the guide.

    You can read about configuration specifics in the section of our full PayForm guide. For the purpose of this tutorial, you can follow the example below; we'll briefly explain each configuration step.

    PayForm manual card sale

    In the example below, the PayForm has been setup for an instant card payment.

    1

    Visible and read-only fields

    The cardholder will need to provide their first and last names, full address, email, and click a checkbox to agree to pay and give their permissions to receive an email.

    Additionally, they'll see the amount field, but it'll be read-only.

    2

    The JSON will look like the following:

    This JSON can be used to make a REST API request to generate the actual payment form.

    You may re-use this JSON to generate the same type of form for multiple different users. You may also want to dynamically configure values like the amounts from your code.

    To generate a PayForm, make a request to .

    If you include a valid session key, the PayForm will be accessible under the PaymentUrl included in the response. You can embed it into your site or redirect the user to the page.

    Once the user fills out and submits the form, we'll handle the payment.

    If you want to handle the query string when redirecting back to your website to store the transaction ID in your database, read the section of our full PayForm guide.

    PayForm manual consent

    To use the PayForm to save a card on file, follow the steps in , change the transaction type to collecting cardholder data, and skip the amount field.

    You may also collect an instant payment and consent at the same time by choosing the combo widget as your transaction type.

    Virtual Terminal or desktop application

    The Virtual Terminal is a web application that allows you to manually enter credit card details and process transactions through your browser.

    To learn more about using the Virtual Terminal, see the user guide.

    Read more about using our custom desktop application for sales in the guide or to get access.

    Virtual Terminal manual card sale

    When you visit the Virtual Terminal, log in and expand Credit Cards in the navigation on the left. You'll see options for a sale, an EMV sale, authorization, forced auth, and adjustments. Follow the instructions and manually enter the cardholder details to make a sale.

    Virtual Terminal manual consent

    Using the Virtual Terminal, you can create annual, one-time, recurring, and subscription consents. Log in and expand Consents and Recurring tabs on the left side of the screen. Choose the type of consent you're interested in and follow the instructions to manually enter the cardholder details and store a card on file.

    Android / iOS SDK integration

    If you are developing an Android or iOS application, you can utilize our SDKs to charge credit cards and collect consent manually by having users enter their own details.

    We recommend following the and guides to learn how to integrate Number with your mobile applications.

    Mobile manual card sale

    The relevant methods are described in section of the guide and section of the guide.

    Mobile manual consent annual

    The relevant methods are described in section of the guide and section of the guide.

    REST API integration

    If you wish to have more control over the integration and you are PCI Level 1 compliant, you can try using our APIs. They provide methods for all payment types available using our other services, including manual card sales and collecting different types of consent.

    To learn more about our APIs, see the integration guide.

    After authenticating, when you collect cardholder data alongside the other payment details, if using the REST API, prepare the HMAC secured header like shown in quickstart guide, and encrypt the card number using our RSA certificate. Follow the instructions in the API reference to prepare and handle the request.

    Manual card sale

    You can use the following API operations:

    • For the REST API, use .

    Manual consent

    You can use the following API operations:

    • For the REST API, use for annual consent and for recurring consent.

    Execute selective batch settlement

    post: https://easypay5.com/APIcardProcREST/v1.0.0/Settlement/ExecuteBatch_Selective

    {
      "TransactionIDs": [
        52
      ],
      "MerchID": 1
    }
    {
      "Settlement_ExecuteBatch_SelectiveResult": {
        "BatchResult": {
          "BatchClose": 720191352,
          "BatchLogID": 103,
          "BatchNetAmount": 10,
          "BatchNum": 3,
          "BatchOpen": 720191352,
          "BatchTransCount": 1,
          "Code": "A",
          "RemainingUnsettled": 0,
          "ResultText": "OK 003 0720 0000                ",
          "TxLock": "7A639CD720CE4B14"
        },
        "ErrCode": 0,
        "ErrMsg": "",
        "FunctionOk": true,
        "RespMsg": "Successful Settlement : OK 003 0720 0000                ",
        "SettlementApproved": true
    

    SessKey string required

    A unique session key used for authentication in API calls. This key is generated upon successful authentication and must be included in all subsequent requests.

    Example: A1842D663E9A4A72XXXXXXXX303541303234373138


    Content-Type string required

    Example: application/json


    Accept string required

    Example: application/json

    TransactionIDs integer[] optional

    List of transaction IDs to be settled

    Example: [52]


    MerchID integer optional

    The merchant identifier

    Example: 1

    Text to Pay Old

    Querying

    Reference to the Number query language

    Introduction

    Number provides a robust query language for filtering specific records using the APIs.

    Example

    To return all settled transaction records created in June 2024, you can use the query below:

    Transaction query
    Reconciliation
    }
    }
    ACH Transaction Query
    Virtual Terminal or our desktop application

    The Virtual Terminal website allows you to handle manual card sales and consent collection by default. This approach requires no coding and is perfect for a physical point-of-sale.

    We also have a custom desktop application which can be convenient way to collect manual card payments and consent. It offers much of the same functionality as the Virtual Terminal.

    3

    Android or iOS SDK integration

    If you have a mobile application that needs to handle payments and consent, our SDKs implement secure forms which can collect cardholder information from your users.

    4

    REST API integration

    For more customization, you can call our API for sales and consent.

    If you have your own PCI level one compliance program, you may write your own custom code calling our API to collect manual card payments and consent. You can read more about PCI compliance in the short PCI Compliance section of our integration guide.

    Submission options

    The PayForm will redirect the user to an external URL. An encrypted query string containing the POST data will also be appended to the URL

    3

    Styling and colors

    The styling and colors were left as default, only switching out the button background and border to different shades of green.

    4

    Pre-filled values

    The amount will be pre-filled as $25, the redirect URL is using an example URL to your website, and the EIndex is using the sandbox value for encryption key. Endpoint value should always be left as default.

    Integration Options
    Verifone
    contact the Number support team
    Virtual Terminal
    Integration Options
    contact Number
    REST API
    Authentication
    PayForm
    Virtual Terminal
    Integration Options
    contact Number
    Android SDK
    iOS SDK
    Android SDK
    iOS SDK
    Android SDK
    iOS SDK
    REST API
    Authentication
    PCI Compliance
    PayForm manual card sale

    Format

    Queries in the Number query language consist of the following:

    1

    Filters and values

    Each letter represents a query parameter (filter). You can follow it up by

    • an equal sign "=" for equality comparison,

    • ">", ">=", "<", and "<=" for comparison of numeric values and dates,

    • the "LIKE" keyword for SQL-like string comparison.

    Use single quotes for text and date values.

    2

    Logical operators

    You can build and join logical terms with two ampersand characters "&&" for logical AND or two pipe characters "||" for logical OR.

    Refer to the variable charts below or the API reference for query composition. They list and describe all of the query parameters that you can use in each scenario.


    Reconciliation

    Reconciliation is the process of ensuring that the transaction records in your system match those in the Number database. This is important for maintaining accurate financial records and can be done periodically, such as once a day or week.

    When using Number's widgets, it may be desirable to perform periodic reconciliation. A typical reconciliation query might include specific parameters to filter records based on criteria like merchant ID, transaction status, and date range to avoid excessive data retrieval, which could lead to errors.

    For effective reconciliation, it is recommended to periodically query the database and utilize webhooks for real-time notifications to keep your records up to date .

    Example

    Here is a typical Reconciliation query

    • (A=2) is used to return records created under merchant record 2

    • (U='WID') is used to pull records with an ORIGIN of widget

    • (C>='6/1/2024') is a date range to avoid returning an exceessive records

    • ((B=1)||(B=2)) is used to pull back OPEN or SETTLED transactions


    Transaction query

    Obtain specific transaction records using Number's query language.

    Variable
    Parameter
    Description

    A

    MERCHANT ID

    The merchant record you are interested in, e.g. (A=1).

    B

    TRANSACTION STATUS

    The status of the transaction, e.g. (B=1). * -1: ALL * 1: OPEN * 2: SETTLED * 3: FAILED * 4: LOCKED * 5: VOID

    C

    DATE CREATED

    The date the transaction was created, e.g. (C>='7/5/2024 12:00:00 AM').

    D

    LAST NAME


    Consent query

    Obtain specific consent records using Number's query language

    Variable
    Parameter
    Description

    A

    MERCHANT ID

    The merchant record you are interested in, e.g. (A=1).

    B

    START DATE

    The date the consent becomes active, e.g. (B>='10/20/2024').

    C

    END DATE

    The date the consent expires, e.g. (C<='10/20/2024').

    D

    ACCOUNT HOLDER LAST NAME


    Recurring schedule query

    Obtain specific recurring schedule records using Number's query language.

    Variable
    Parameter
    Description

    A

    CONSENT ID

    The unique identifier for the consent associated with the recurring schedule, e.g. (A=545).

    B

    STATUS

    The status of the recurring schedule, e.g. (B=-1). * -1: ALL * 1: SCHEDULED * 2: PAID * 3: FAILED * 4: CANCELLED

    C

    DUE DATE

    The date the next payment is due, e.g. (C='10/20/2024').

    D

    ACCOUNT HOLDER LAST NAME


    Batch log query

    Obtain specific batch log records using Number's query language.

    Variable
    Parameter
    Description

    A

    MERCHANT ID

    The merchant record you are interested in, e.g. (A=545).

    B

    STATUS

    The status of the batch log, e.g. (B=-1). * -1: ALL * 1: FAILED * 2: APPROVED

    C

    CREATED ON

    The date the batch log was created, e.g. (C>='3/2/2024')&&(C<='4/2/2024').

    D

    BATCH LOG ID

    Authentication

    How to authenticate with the Number backend

    The REST API provides their own methods for authenticating with Number. You will need to use them to receive a SessKey. To authenticate, you need to provide your AccountCode and Token.




    As a result of authentication, you will obtain a session key. This key is required to prove your identity when using any of the other methods provided by our backend.



    It is required that you manage a session key throughout any 24-hour period:

    You will need to reauthenticate when one of the following two errors occurs:

    Error 5030: Expired session - session key has expired after 25 hours

    Error 5050: Unauthorized - your IP has changed since you last authenticated

    The system will lock your IP out if you send 6 unsuccessful authentication attempts in a row. Always abort unsuccessful authentication attempts instead of retrying and notify the user. Only the Number support team can remove the lock from a merchant.

    We recommend that either manage a session key object for 24 hours or simply use the key until you receive one of above errors at which time you will RE-Authenticate.


    HMAC and RSA

    The HMAC and RSA section only applies to using the REST API.

    If you are not passing cardholder data through the REST API, you only need the session key to authenticate and connect to your account. Otherwise, you need to use a signature secured by an HMAC secret and and encrypt the cardholder data using our RSA certificate.

    HMAC header

    When required to secure the request, the SessKey header will need to include additional data.



    This altered key should be passed instead of the plain session key using a header with the same name, SessKey. Here are some examples of creating the header signature:

    RSA encryption

    When the REST API traffic originates from unknown networks or mobile devices, we also mandate that any credit card numbers be encrypted prior to building your request. You can download our RSA 2048 certificate and use the public key to encrypt the cardholder information.

    When passing cardholder data through our REST API, only the credit card number needs to be encrypted using RSA, the expiration date and CVV can be left as is.

    When encrypting sensitive cardholder data, use RSA encryption padding of OaepSHA1. Encrypted card numbers will always have 512 bytes.

    Examples of RSA encryption:

    Encrypted test cards

    Here are some test cards with encrypted card numbers for . Before you implement encryption, you can use them for testing in the Sandbox environment.

    You can read more about testing in the section.

    Card number: 4761 5300 0111 1118

    Card number: 5137 2211 1111 6668

    Card number: 6011 2087 0111 7775

    Card number: 3710 3008 9111 338


    Lockouts

    When you authenticate, you will receive FunctionOK and AuthSuccess flags in the response. You should handle the response as follows:

    1. Check the FunctionOK flag.

      1. If false, read the ErrMsg and ErrCode, and abort.

      2. If true, read the AuthSuccess flag.

    Once again, it's important to abort unsuccessful authentication attempts and notify the user that new credentials need to be applied to the product.

    The system will lock your IP after 6 unsuccessful attempts in a row. When a lockout occurs, our support department will need to manually audit it to determine if it's safe to remove the lock.


    Token Renewal

    The Client Admin Portal will allow you to create and manage all of your tokens. There is no limit to the number of tokens you can create. We recommend creating a separate token for each individual processing location (IP address).

    Each token has a lifespan of 2 years since it was generated and will need to be replaced afterwards. This can only be done by physically logging into The Client Admin Portal. To make the process faster, The Client Admin Portal provides a way to POST new tokens to your web server to help automate a part of the renewal process.

    To learn how to use the Client Admin Portal to renew tokens, see the guide.

    HMAC and RSA
    Lockouts

    Virtual Terminal

    Getting started with Virtual Terminal for Number

    The Virtual Terminal is a web application that provides all types of credit card processing functionality. The VT is the fastest way to start trying out our payment services.

    When you log in to the Virtual Terminal, you are brought to the home screen. The number of open transactions and scheduled payments due display at the top of the screen. Your default merchant and user roles are listed just below, along with the expiration date of your password.


    Payments

    Instructions on how to manage various payments using the Virtual Terminal.

    Before you start, you may want to read about using your Verifone device with the Virtual Terminal in the guide.

    Non-EMV payments

    Make non-EMV manual sales using the Virtual Terminal.

    Click the Credit Cards tab on the left side of the screen, then Sale. Manually enter all of the information from your keyboard, and enter the $ amount to be charged.

    A guest ID or a service description can also be added here and searched for later. The ID will also print on the receipt, and the service description will print on the settlement report.

    EMV payments

    Make EMV payments using the Virtual Terminal.

    Click the Credit Cards tab on the left side of the screen, then on Sale-EMV. You will then need to click on Insert Chip or Manual Card Entry.

    Clicking on Insert Chip will prompt the end-user or customer to insert or tap their card for contactless payments. For Manual Card Entry, the end user must enter the full card number, expiration date, and CVV code by pressing the green enter button on the Verifone after each entry.


    Surcharging

    Surcharge and convenience fees are automatically calculated during a credit card sale, both manual entry and EMV, as well as when charging an existing card on file.

    The surcharge / convenience fee is automatically calculated based on the percentage set in the Client Admin Portal and the card type used. The Virtual Terminal will also ensure that fee does not go over the card brand rules of 3%.

    Users have the option to waive the fee on any transaction if required. The fee can be waived before processing by checking the Waive Fee box on the form.

    The receipt will detail the charge amounts including the base amount, fee, and total amount charged. Rules require that the fee amount is visible to the customer. In addition to the receipts, the Virtual Terminal reporting and detail views show the fee as part of the total amount.


    Create consents

    All consent types allow a card to be charged without the card or customer being present. Consents can be created by swiping the card or manually entering the information.

    A consent receipt is always created by the system for your customer to sign. We encourage your office to get signatures for consents whenever possible.

    An email address can be added to the consent so your customer will receive a receipt when the consent has been used.

    Annual and one-time

    Creating annual and one-time consents allows your office to charge a card at a later date. This can be useful in situations where you expect a balance to be due after services have been provided.

    An annual consent can be used multiple times, and a one-time consent can only be used once.

    Both annual and one-time consents are valid until the card expires or 365 days have passed.

    Create an annual consent or a one-time consent

    Click the Consents tab on the left side of the screen, then Create Annual Consent, Create Annual: EMV, or Create One-Time Consent depending on the type of consent you need and payment method.

    Annual consents require that a max charge be determined as a limit per transaction. This can be any $ amount determined by your office.

    An email address can also be added to the consent so your customer will receive a receipt when the consent has been used.

    Fixed recurring

    Creating a fixed recurring consent allows your office to set up a payment plan with your customer. This can be useful in situations where your customer has an outstanding balance due.

    Fixed recurring consents can be setup for any length of time.

    Create a fixed recurring consent

    Click the Recurring tab on the left side of the screen, then Create Recurring Consent or Create Recurring: EMV based on the payment method.

    An email address can be added to the consent so your customer will receive a receipt

    Subscription

    Creating a subscription consent allows your office to set up a re-occurring payment indefinitely. This can be useful in situations where your customer makes a regular donation or payment to your organization.

    The subscription consent end date is always automatically set to the card expiration date.

    Create a subscription consent

    Click the Recurring tab on the left side of the screen, then Create Subscription.

    Subscription payments can be processed manually or automatically depending on your preference. You can change the payment amount as well as the scheduled dates for your subscription consent.

    To alter the schedule, you will modify the Payment Adjust Date. The system will discard the previously scheduled payment plan and calculate a new one. Only those scheduled payments for today and beyond will get processed, and it will not attempt to process payments for dates in the past.

    You can also place a subscription on hold. This will pause all processing until the hold is released. Once released, payments will resume for all present and future payments as calculated using your dates and amounts.


    Consent list

    The consent list is where you will manage your consents after they have been created. The query filter can be used to search your consent list.

    Click the Reports tab on the left side of the screen, then Consents.

    Consent operations

    In the Consent Operations box right above the table, there are several options available to help you manage your consents. The availability of each option will vary depending on whether the selected consent is annual or recurring.

    1

    Edit

    The edit screen allows you to add or change the email address associated with consent, update the billing zip code and expiration date, add or change the reference ID and service description.

    2

    Receipts

    Allows you to reprint the consent agreement. You can choose between the customer, merchant, and dual receipt options.


    Scheduled payments

    The scheduled payments view is where you will view and manage all scheduled payments.

    Click the Scheduled option on the left side of the screen.

    Schedule Operations

    Run fixed recurring consents and subscriptions.

    Scheduled payments can also be run automatically on the day they are due. and we'll turn this feature on up for you.

    Filter the consents you want to run by date range and consent type. Once you have the consents you want to charge filtered, you can click Process All to process all payments due. You can also individually select consents and run them by clicking Process Selected.

    The option to Reschedule or Cancel Payment are also available.

    Failed Payments

    If a customer’s card is declined, you will receive a notification report.

    Payment History

    Displays a history of payments run on a particular consent through the Scheduled Payments option.


    Transaction list

    The transaction list is where you will view and manage the transactions.

    Click the Reports tab on the left side of the screen, then Transactions.

    Transaction operations

    In the Transaction Operations box right above the table, there are several options available to help you manage your transactions.

    1

    Void

    Voids can be performed the same day as the transaction before settlement.

    Receipts

    Reprint the receipts. You can choose between the customer, merchant, and dual receipt options.

    Transaction filter

    Filter transactions based on the merchant the transaction was processed under, the date range, transaction status, and transaction type.

    Transaction status and type filters

    For filtering by transaction status and transaction type, see the table below.

    TxStatus
    TxType

    Transaction search

    Search your database, create reports based on results, void, credit, and reprint receipts.

    Search for

    Find the search value in a specific field by using the Search for a dropdown.

    Search field type

    Search value

    The value to search for in the specified field.

    Search type

    Choose the desired comparison type for search.


    Settlements

    View and manage the settlements.

    Click the Settlement option on the left side of the screen.

    Manually settle transactions.

    Select the appropriate merchant account.

    Select individual transactions, and click Settle Selected. Click Settle All to settle all open transactions, or click Preview Batch to see what will be settled.


    Batch history

    Displays a list of your settlements and allows for reprinting of batch reports.

    Click on the Reports tab on the left side of your screen, then Batch History.


    Miscellaneous

    In the upper right-hand corner of the screen, there is a menu of miscellaneous operations.

    1

    My Settings

    Update your name, email, cellphone number, and change your password

    2


    Lockouts

    In order to protect our client’s information, it is necessary for us to lockout users who cannot provide correct credentials. A lockout will occur if incorrect credentials are entered 6 times in a row.

    There are two types of lockouts:

    • User lockout occurs when a user entered their password incorrectly for 6 successive attempts.

    • Endpoint lockout causes your entire office to be locked out because the username entered was unknown to our system, and used for 6 successive attempts.

    If you are experiencing problems authenticating, contact your administrator to reset your credentials. We recommend to do this before the 6th attempt which could cause a lockout.

    If you do experience a user lockout, you will need to follow these steps to continue:

    1

    Get new credentials

    Obtain new or updated credentials from your administrator

    2

    If you do experience an endpoint lockout, you will first need to need to call the to get the lock removed, then follow the instructions for a user lockout.

    Expired passwords

    As an additional security precaution, passwords expire after 4 months. You can see your password expiration date every time you log into the Virtual Terminal.

    You may choose to change your password as often as you wish, however you must change your password every 4 months at a minimum. Entering an expired password 6 times in succession will cause a user lockout as described above.

    Vocabulary

    A glossary of key payment terms and terms specific to Number

    Payment terms

    A general list of terms specific to the payment industry.

    A

    • Authorizing payments: The process of verifying cardholder information and checking funds to securely approve transactions.

    C

    • Card present: Transactions where the physical card is present during the payment process, typically requiring a card reader.

    • Consent: Permission granted by the customer to store their card information for future transactions.

    • Crediting (refunds): The return of funds to a customer's account after a transaction has been completed, typically occurring when a product is returned or a charge is disputed.

    I

    • ISVs (Independent Software Vendors): Companies that develop software applications that may integrate with payment processing services.

    M

    • Manual entry (card not-present): The process of accepting payments by manually entering card details.

    • Merchants: Businesses or individuals that sell goods or services and accept payments from customers.

    P

    • PayFac (Payment Facilitator): A service provider that allows merchants to accept payments without needing to establish a direct relationship with a payment processor.

    • Payment processor: A company that handles transactions between the merchant and the customer's bank, facilitating payment processing.

    R

    • Recurring payments (payment plans): Automated scheduling of regular payments over time, ideal for subscriptions or installment plans.

    • Reporting: The generation of summaries and analyses of transaction data to help merchants track financial activities and manage cash flow.

    S

    • SaaS providers: Companies that offer software solutions delivered over the Internet, often including payment processing functionalities.

    • Settlements: The finalization of a transaction by transferring funds from the buyer to the seller.

    • Store card on file: The secure storage of a customer's card details for future transactions, often requiring annual consent.

    • Surcharge payments

    V

    • Verifone: A brand of payment terminals and devices used for processing card present transactions.

    • Void (reversal): This act will cancel a previously approved authorization prior to nightly settlement


    Number terms

    A list of terms specific to Number services or other terms in context of Number services..

    A

    • Account code: The unique key which represents your Number account. This code will never change throughout the life of your account. Each Account Code is 2 letters and 7 numbers.

    C

    • Client Admin Portal: A web interface for managing Virtual Terminal users and API tokens, allowing administrators to create, modify, and remove user accounts while ensuring secure access through two-factor authentication.

    L

    • Lockouts: A lock caused by entering incorrect password or username 6 times in a row when attempting to authenticate. Depending on the source and type of the lockout, a single Virtual Terminal user might be locked out or everyone in your office.

    M

    • MID (Merchant ID): Each Number account can support multiple merchant records, each with their unique identifier. Each record can be a separate location center which will generate a separate daily settlement report.

    P

    • PayForm: A modern tool for securely collecting cardholder data, allowing customization and real-time updates to your system.

    S

    • Session key: A unique key used for authentication in API calls. This key is generated upon successful authentication and must be included in all subsequent requests.

    T

    • Token: A 32-characater hexadecimal string generated from the Client Admin Portal which acts as a password when authenticating to our APIs. Tokens expire after a 2 year period and can be renewed from the Client Admin Portal.

    V

    • Virtual Terminal: A web application that provides various credit card processing functionalities, including authorizations, voids, credits, and reporting.

    W

    • Widget 3DES encryption key: Encryption key used in conjunction with 3DES cryptography to encrypt data for use in our web widgets. Each integrator is assigned a unique key and an index.

    • Widget AES encryption key: Encryption key used in conjunction with AES cryptography to encrypt data for use in our web widgets. Each integrator is assigned a unique key and an index.

    React Native Wrapper

    The React Native Mobile SDK wrapper provides a bridge between a React Native based application and the native Number mobile SDK libraries.

    Number's and SDK libraries are required for use of the wrapper. It is highly recommended that you review the core SDK products before proceeding.


    PayForm JSON example
    {
      "InitParams": {
        "MerchID": 1,
        "WTYPE": "PF",
        "PostURL": "",
        "RedirectURL": "https://yourwebsite.com/success",
        "REF_ID": "",
        "RPGUID": "",
        "EndPoint": "PayForm/PF.aspx",
        "EINDEX": "300",
        "Amounts": {
          "Amount": 25,
          "Surcharge": 0,
          "TotalAmt": 25
        },
        "Payer": {
          "Firstname": "",
          "Lastname": "",
          "BillingAddress": {
            "StreetAddress": "",
            "City": "",
            "State": "",
            "ZIP": "",
            "Country": ""
          },
          "Email": "",
          "Phone": ""
        },
        "WidOptions": {
          "eVisible": "6E7F",
          "eReadOnly": "0040",
          "eStyles": "0001",
          "eSubmission": "0201",
          "eColors": "#ffffff,#6cca44,#59ff00,#212121,#ffffff,#212121,#ffffff"
        }
      }
    }
    (A=1)&&(C>='6/1/2024')&&(C<'7/1/2024')&&(B=2)
    (A=2)&&(U='WID')&&(C>='6/1/2024')&&((B=1)||(B=2))
    Query example
    (G=1)&&(B>'10/20/2024')
    Query example
    (G=1)&&(B>'10/20/2024')
    Query example
    (H=3)&&(C>='10/20/2024')
    : An extra fee added to the transaction amount by businesses.

    Last name of the account holder, e.g. (D LIKE '%MITH') for all names that end with 'MITH'.

    E

    TRANSACTION LOCK

    Lock status of the transaction, e.g. (E<>'0') for locked transactions.

    F

    BATCH LOG ID

    Reference to a batch settlement record, e.g. (F=817).

    H

    TRANSACTION ID

    The unique identifier for the transaction, e.g. (H=58258).

    J

    FIRST NAME

    First name of the account holder, e.g. (J LIKE 'ROB%') for all names that start with 'ROB'.

    K

    TRANSACTION TYPE

    The type of transaction, e.g. (K=-1). * -1: ALL * 1: CCAUTHONLY * 2: CCSALE * 3: CCFORCE * 4: CCVOICE * 5: CCADJUST * 6: CCCREDIT

    L

    AMOUNT

    The $ amount of the transaction, e.g. (L>100.00).

    M

    CLIENT REFERENCE ID (PATIENT ID)

    User-defined value on the transaction.

    N

    RPGUID

    User-defined value on the transaction.

    P

    CONSENT ID

    The consent ID of card on file the transactions were charged against, e.g. (P=15875).

    Q

    CREDIT CARD LAST 4

    The last 4 digits of a credit card, e.g. (Q='4123').

    R

    APPROVAL CODE

    The approval code for the transaction, e.g. (R='TAS626').

    S

    CUSTOMER LAST NAME

    The last name of the customer, e.g. (S='SMITH').

    T

    CUSTOMER FIRST NAME

    The first name of the customer, e.g. (T='FOSTER').

    U

    ORIGIN

    The origin of the transaction, e.g. (U='API'). * "API": REST API * "WID": Widget * "VT": Virtual Terminal * "MOBL": Mobile SDK * "SDK": Verifone * "AUTO": Automatically scheduled from a payment plan

    W

    BATCH NUMBER

    The batch number for the batch settlement, e.g. (W=762).

    Last name of the account holder, e.g. (D LIKE '%MITH') for all names that end with 'MITH'.

    E

    CREATED ON

    The date the consent was created, e.g. (E<='10/20/2024').

    F

    CUSTOMER REFERENCE ID (PATIENT ID)

    User-defined value on the consent.

    G

    CONSENT TYPE

    The type of consent, e.g. (G='-1'). * -1: ALL * 1: ANNUAL * 2: ONE-TIME * 3: RECURRING * 4: SUBSCRIPTION

    H

    ENABLED

    Indicates whether the consent is currently enabled, e.g. (H=1).

    J

    RPGUID

    User-defined value on the consent.

    K

    ACCOUNT HOLDER FIRST NAME

    First name of the account holder, e.g. (K LIKE 'ROB%') for all names that start with 'ROB'.

    Z

    CONSENT ID

    The unique identifier for the consent, e.g. (Z=15875).

    Last name of the account holder, e.g. (D LIKE '%MITH') for all names that end with 'MITH'.

    E

    MERCHANT ID

    The unique identifier for the merchant associated with the recurring schedule, e.g. (E=1).

    F

    ACCOUNT NUMBER LAST 4

    The last 4 digits of the account number associated with the recurring schedule, e.g. (F='1234').

    G

    SCHEDULE ID

    The unique identifier for the recurring schedule, e.g. (G=12).

    H

    TYPE

    The type of recurring schedule, e.g. (H=-1). * -1: ALL * 3: RECURRING * 4: SUBSCRIPTION

    The unique identifier for the batch log, e.g. (D=1777).

    E

    BATCH NUMBER

    The batch number for the batch log, e.g. (E=185).

    PayForm builder

    If AuthSuccess is false, read RspMsg and abort.

  • If AuthSuccess is true, save the SessKey value.

  • First Data Testing
    Testing
    Client Admin Portal
    using System.Security.Cryptography;
    using System.Security.Cryptography.X509Certificates;
    using System.Text;
    
    // Example card number to encrypt
    string myCardNumber = "4111111111111111";
    
    X509Store store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
    X509Certificate2? myCert = null;
    
    store.Open(OpenFlags.ReadOnly);
    bool certFound = false;
    
    // Search for cert within store either by thumbprint or subject 
    foreach (X509Certificate2 cert in store.Certificates)
    {
      if (cert.Subject.Contains("mobile.easypay5.com"))
      {
        myCert = cert;
        certFound = true;
        break;
      }
    }
    
    if (!certFound || myCert == null)
    {
      MessageBox.Show("Unable to find the certificate");
      return;
    }
    
    byte[] plainBytes = Encoding.UTF8.GetBytes(myCardNumber);
    RSA? rsaPublicKey = myCert.GetRSAPublicKey();
    
    if (rsaPublicKey == null)
    {
      MessageBox.Show("Unable to get RSA public key from the certificate");
      return;
    }
    
    // Use the OaepSHA1 RSA encryption padding
    byte[] encryptedBytes = rsaPublicKey.Encrypt(plainBytes,
      RSAEncryptionPadding.OaepSHA1);
    
    // Convert to Base64 before sending to the API
    string encryptedString = Convert.ToBase64String(encryptedBytes);
    
    // Example payload for the API
    string jsonPayload = $@"
    {{
        ""ccCardInfo"": {{
            ""AccountNumber"": ""{encryptedString}"",
            ""ExpMonth"": 10,
            ""ExpYear"": 2028,
            ""CSV"": ""122""
        }}
    }}";
    
    package NumberEncrypt;
    
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.nio.charset.StandardCharsets;
    import java.security.InvalidKeyException;
    import java.security.KeyStore;
    import java.security.KeyStoreException;
    import java.security.NoSuchAlgorithmException;
    import java.security.cert.Certificate;
    import java.security.cert.CertificateException;
    import java.security.cert.X509Certificate;
    import java.util.Base64;
    import java.util.Enumeration;
    import javax.crypto.BadPaddingException;
    import javax.crypto.Cipher;
    import javax.crypto.IllegalBlockSizeException;
    import javax.crypto.NoSuchPaddingException;
    
    public class EncryptCard {
    
      public static void main(String[] args) {
    
        CertificateDetails certDetails = getCertificateDetails(
          "C:\\Users\\BobSmith\\Downloads\\mobile_easypay5_com.cer", "");
        String myCardNumber = "4111111111111111";
        byte[] plainbytes = myCardNumber.getBytes(StandardCharsets.UTF_8);
        try {
          Cipher cipher = Cipher.getInstance(
            "RSA/ECB/OAEPWithSHA-1AndMGF1Padding");
          cipher.init(Cipher.ENCRYPT_MODE,
            certDetails.getX509Certificate().getPublicKey());
          byte[] encryptedBytes = cipher.doFinal(plainbytes);
          String eBytesString = Base64.getEncoder()
            .encodeToString(encryptedBytes);
          System.out.println(eBytesString);
    
        }
        catch (NoSuchAlgorithmException e) {
          e.printStackTrace();
        }
        catch (NoSuchPaddingException e) {
          e.printStackTrace();
        }
        catch (InvalidKeyException e) {
          e.printStackTrace();
        }
        catch (IllegalBlockSizeException e) {
          e.printStackTrace();
        }
        catch (BadPaddingException e) {
          e.printStackTrace();
        }
      }
    
      public static CertificateDetails getCertificateDetails(
        String jksPath, String jksPassword) {
    
        CertificateDetails certDetails = null;
        try {
          // Provide location of Java Keystore and password for access
          KeyStore keyStore = KeyStore.getInstance("Windows-MY");
          keyStore.load(
            new FileInputStream(jksPath), jksPassword.toCharArray());
    
          // Iterate over all aliases
          Enumeration<String> aliasEnum = keyStore.aliases();
          String alias = "";
          while (aliasEnum.hasMoreElements()) {
            alias = (String)aliasEnum.nextElement();
            if (alias.contains("mobile.easypay5.com")) {
              break;
            }
          }
          Certificate[] certChain = keyStore.getCertificateChain(alias);
          certDetails = new CertificateDetails();
          certDetails.setX509Certificate((X509Certificate)certChain[0]);
        }
        catch (KeyStoreException e) {
          e.printStackTrace();
        }
        catch (NoSuchAlgorithmException e) {
          e.printStackTrace();
        }
        catch (CertificateException e) {
          e.printStackTrace();
        }
        catch (FileNotFoundException e) {
          e.printStackTrace();
        }
        catch (IOException e) {
          e.printStackTrace();
        }
    
        return certDetails;
      }
    }
    
    package NumberEncrypt;
    
    import java.security.PrivateKey;
    import java.security.cert.X509Certificate;
    
    public class CertificateDetails {
    
      private PrivateKey privateKey;
      private X509Certificate x509Certificate;
      public PrivateKey getPrivateKey() {
        return privateKey;
      }
      public void setPrivateKey(PrivateKey privateKey) {
        this.privateKey = privateKey;
      }
      public X509Certificate getX509Certificate() {
        return x509Certificate;
      }
      public void setX509Certificate(X509Certificate x509Certificate) {
        this.x509Certificate = x509Certificate;
      }
    }
    const crypto = require("crypto");
    const fs = require("fs");
    ​
    var myCardNumber = "4761530001111118";
    ​
    try {
      const publicKey = Buffer.from(
        fs.readFileSync("mobile.easypay5.com.pem", { encoding: "utf-8" })
      );
    ​
      const encryptedData = crypto.publicEncrypt({
          key: publicKey,
          padding: crypto.constants.RSA_PKCS1_OAEP_PADDING,
          oaepHash: 'sha1',
        },
        Buffer.from(myCardNumber) // Convert the string to a buffer
      );
    ​
      const encryptedString = encryptedData.toString("base64");
    }
    catch (error) {
      console.error("Error encrypting card data:", error);
    }
    Encrypted string
    K8ELXxBJGpgO02O9Rw3XYe32D4msyv2lBO/SaQyx2vkPjFdy8hBjOxKQ9Q9NMQro9HotSzdev0Legr+iwevfvMnZINZMAy7ufNA4CniT3YcNdOYbzATBD1iTTiLcf+/we9QHsuo70R7Mij9oONFdh5UX948v89ZQMc95RyXtXpU1sUXkf/GG+gm9XFG0y09pb7KCIwa8vxhbMej0I7k7xhR3t6651XWec7H4NVE6jqMOSK7S3/cuqU9eHhqOD24f3X8xnzrGQUTGEvfk63bsH4UgXq/lEo27yMSi0FpsBLyw7fE/1FsFQG58HgMoXmwdjGtHPSH4/xUXJHtihkKHi8Ge9Zch7k9v7ZiAAe48qUPmFs2bOH3XV3jtvPo3fX64vz3Ode37oehe06+MmQR7ho+cR/r/IDAA74zQWRgYfDL79UhaLEMCQ7mcoxGlRgz5gfOy1inD1mL14lPlH8FcTDcnlDBtwakzlSP8NrmtFGvz3gV9T3d9nAP2yBvP4qXF875rGhiXgQ8HQHAit0SyxMuqdNtnScUbTu4iUHqQr4xtsiOQ/MoJIFgygtPs4ndEpNAeImvr7+DgFQvhkZyDWJBQ8qqpv4vlO3pDAJ6/7UzSmSD5D9vjdFj9tAAf72cXLtu1STcB7XKzzrG696kBdYAWhoF/z72n1n4AtZGWMf0=
    Encrypted string
    WkPwbAzt1xZxECR4tdWOZDi219AiFmKq8qn6/MwwMPSeqkcRInqFMp3DxmM33G7pPrsvkIZA5zwk/tPLjjKkPDE1czVdVHA8yxYra6ggiGnjlASrxKdDGz6vaujGOnnex3cjXxV4mGC2gEhERTaFyXVlJDpM2jh/fdbXpg11n0BwmFBzgReTAV5BsS87vOqLfHjg9evm4lTIlYoqKR6DcGLn27Wd2ExwQu6V8nc8rkR6hwqEXsz3BFsbDtUhLeeWZdsEtZfKbAMzVAjwhUIbtsm4NOLLyQ5aSVc3P48FuW5GU9OZJD1MeicdsD+DFYmQk77UkEWEcKm9hogzf66sgrLAhY+TXg4iO4X0BJb8AJQRV0m9Am3VaemOIX/zw851AacwWxVNgYwrxbzcik9ODZR5GR8pHwXsPfeED2XISzGyfBdpv/5gqs5wTAlpZc0yW0nDShx9j+nmUJGVrd3RMHJddOe5+8HIWHFqAh3cQ6DBPe4FgBrTTtM44FlG+PuCRcVW6eQrnUr/llnWJdrUT5wKvGodewJCZv5JAdY9JZk9uj/qyITnDXVDC7uxxdHQgdq8yqjLZ/6iUoSu/dFFIflXmc/QFF13kRX74+XzYkMdEhUWQQ73R2KUKuTtO0jPMW5f+52UVJmUjEKYcggB8PcapFXAToKY0WaQhoSwOi0=
    Encrypted string
    FFcT8XK/lbjN6oBxp7qY4DND1QYeejnjcaYxCfVVaRQ4tqgE6SrOSGqvpfkOXWbacOHDd26SF+lNGx2Uj7UxMRglY/6AjsMfWfffG15kyfKNLJIPwiLklpNwKgOH3J9z8CHYXF1G7gQR/q4Z42z851iFB7DNGfPJ7iZk+ZPh4YEer+R+ZH2nlLx0GVcbI6YOXtCgNLC8LJd8brzrmqKyA/0ZrJJaD+PmiK6rZxcHdPqIdx1Bc+x7y54GTd6LpigGVtnS65PKPzjIjfXYpTgyBQhbqIpy6qu5r6G3CwWupYjdXV4xX3GzTsQDX3byoSssRdQEmDeUa78iIlk3QbHHJn81SdorHaUI34uU1c0D5eqWzVSh4aAhrnTjDlx0ecS1Wn0cPpMvDxVZI3pEq3TrnuUQZgvcHJDMsZ3Dn1pviQnah272d3bh8uL8u/Drb7FLREgK7o8ZlV/rcPGgf++8N7CMEyZgIfVWuXc8EVRHA2KWuSTKgFfNyWX7GAF41f1EYEYn7dMd8EZcv6atpXNuLhsIAyKUeVoYO8nhBLHmtNBvKm2Ly5CSW344MiKUjmpR8+FpuBgLyJrVHkAaZmKLKcmaKqVEcVzqq+uiN0RhXWnkiUyODKdaP+LQjsNzmdbieW0ZaXJJPOkmMrgbuOfeDv6B9MUEW3UOoUEFAY48+Kg=
    Encrypted string
    hWp5QKogAb7jkP85oHB7q+yYLw75IXVBzhGdQ0oZUUNk+z1uVLWK3ZyFwoi1Op8f5naINaHZ9T0ke2OW7Ydh7aYo3nTmhXVkM8LdYB3OUcvscj92HB5CHiWo1jBG0Jv4+vicBfOFT404r4MLwIqpdJVrr0URS0sSbSSPo34vk31GS9mihi+8UBzRXip8WKgnS5003grbvYf7tqGGK4YwrxCIgZRGqGIIrjqhrILBwn3zUmCjFuMItiNJ+VhnrThBeIXk9Lb8+FqzzZw63sIW41m4xOuVa4ZMB/4EpuG84BsA2V1WukRWzQRCo2CFYn55T96/GRdUrz3tGWEVs3NfXs4116IcK5fwYNBt/n0gVhmji4TU4JjUl64XS9gjfnPHGm3YsuOIuHL4Kapklp6UpDh/bVt795zMisGvlYEWazjflsO6MkDE+lgwt5XNs0kGVdWql9OHYSxAcmEmgZ4/ERf4dmgp/3TN5cMh4KZWGnEeWapcUtWWRISnHCCnkOpvz3wDsjH/96zb9DsYsXJ+92u76tCo3PNOMcD/cyEwMpqpjqjg/Z0a1YcS/anEXdGGwoXy65VCEALLy8mAct7whyQeValIPXeNq7sEbU2Y+LO8pevIfepDjChC5lVm4r/vUJOWq0ZvOCfUgHpRKqLS+zq0AYC0xP1Y8Xe1L+yT1zY=
    Full Detail

    Displays all of the information associated with the consent.

    3

    Cancel Consent

    This option will open a dialog box to confirm you want to cancel the consent.

    4

    List Transactions

    Lists transactions that have been processed on the selected consent.

    5

    Edit Schedule

    This option will open a dialog box that lists the payment schedule for a fixed recurring consent. We recommend using this to postpone a payment or two.

    If your customer wants to change the schedule completely, it is recommended that you cancel the existing consent and create a new one.

    6

    Charge

    Use when you want to charge an amount to annual and one-time consents.

    Transactions under
    HOST
    with a surcharge can only be voided within 20 minutes of the transaction's approval.
    2

    Credit

    Credits (refunds) can be processed after settlement.

    3

    Full Detail

    Displays all the transaction details.

    Contact Us

    Displays our support phone number and allows you to send us a secure email.

    3

    Logout

    Log out and end your session with the Virtual Terminal. An open session will automatically log the user out after 15 minutes of inactivity.

    Remember to always log out or lock your computer when walking away from your workstation!

    Reset the terminal

    Visit the reset page to clear any cookies that have been set on your terminal.

    3

    Try using your new credentials

    Login with the new or updated credentials.

    OPEN - An authorized transaction that has not been settled.

    CCAUTHONLY - Authorization only, not a live transaction.

    SETTLED - A finalized transaction sent for deposit to your account.

    CCSALE - An authorized transaction.

    FAILED - Transaction did not receive an authorization.

    CCFORCE - Number Support team use only.

    LOCKED - Transaction has an error.

    CCVOICE - Transaction authorized by voice authorization operator.

    VOID - Transaction was voided.

    CCADJUST - A credit issued through administrative adjustment. Number Support team use only.

    HOST - Transactions with surcharge or a convenience fee.

    CCCREDIT - A credit transaction refunded to customer card.

    Acct LastName - Last name of the cardholder.

    Acct FirstName - First name of the cardholder.

    Cust LastName - Last name of the customer (if different than cardholder).

    Cust FirstName - First name of the customer (if different than cardholder).

    RefID - The custom user-defined value entered at the time of transaction.

    Amount - The $ amount of the transaction.

    Verifone
    Contact Number
    Number support team
    The base, surcharge, and total amounts on the receipt
    The base, surcharge, and total amounts in the transaction list
    The base, surcharge, and total amounts in transaction details
    Installation

    Requirements

    1. Mac OS based workstation v15 or newer

    2. Xcode v16.2 or newer

    3. Android Studio Ladybug Feature Drop | 2024.2.2 or newer

    4. React Native CLI

    5. React Native v0.77 without new architecture enabled

    6. Node v18.19.0 or newer

    7. npm v10.8.2 or newer

    Prerequisites

    Before beginning your implementation you will need a Number account. It should include the following:

    1. Session Key: this authenticates you to a particular account.

    2. HMAC secret: used to create a hash which proves your request is authentic.

    3. RSA Certificate: to encrypt the credit card number prior to transmission.

    4. A sentry.io key: used for logging events and errors.

    5. Merchant record or merchant ID: Each Number account can support multiple merchant records.

    Each merchant record can be a separate location center which generates a separate daily settlement report. Many of our API calls require that you specify which merchant ID to use.

    Installation instructions

    1

    Setup your environment

    Make sure you have completed the React Native - Environment Setup instructions until the "Creating a new application" step before proceeding.

    2

    Install components

    For iOS

    From the project's root folder, run npm install. This will load the node_modules packages that are listed in the package.json file. Change directories to the iOS folder and run pod install.

    3

    Configure keys

    In the app.tsx file, pass your configuration toEasyPayModule.configureSecrets:


    Getting started

    Start your application

    First, you will need to start the Metro Server, the JavaScript bundler that ships with React Native. To start Metro, run the following command from the root of your React Native project:

    Let the Metro Bundler run in its own terminal. To run the app, open a new terminal from the root of your React Native project and run one of the following commands:

    If everything is set up correctly, you should see your new app running in your Android Emulator or iOS Simulator.

    This is one way to run your app — you can also run it directly from within Android Studio and Xcode respectively. To launch the wrapper in XCode, click on the EasyPayRN.xcworkspace file.

    Certificates

    When API traffic originates from unknown networks or mobile devices, we mandate that any credit card numbers be encrypted prior to transmission to Number. We will provide an RSA 2048 certificate which is used by Number's Android and iOS SDKs to automatically encrypt the card data.

    During the initialization, the process of downloading the certificate is starting. Proceeding with any call before downloading has finished will result in an error RsaCertificateError.failedToLoadCertificateData.

    To test the certificate download, call:

    Using the widgets

    Number's prebuilt payment UI components allow you to collect and process credit card information in a secure way.

    Managing cards

    For managing saved cards without making a payment, the following initializer should be used:

    The config and payment objects are used for passing additional payment details not visible for the end user. Either customerReferenceId or rpguid must be provided to get the list of consents of a specific customer.

    In case of of incorrect data, CardSelectionViewControllerInitError will be thrown.

    Collecting payments

    For managing saved cards and collecting a payment, following initializer should be used:

    Event emitters

    Communication between the Number SDK widgets and the React Native wrapper is handled via event emitters. These event emitters allow you to respond to user events such as a payment being processed.

    The EasyPayModule.swift file contains functions that map to the iOS SDK's CardPaymentDelegate and CardSelectionDelegate protocols. These functions send events that are received in the wrapper's JavaScript code.

    On the React Native side, configure event listeners to respond to the raised events:

    Android
    iOS

    Create an annual consent with manual card entry

    post: https://easypay5.com/APIcardProcREST/v1.0.0/ConsentAnnual/Create_MAN

    For PCI compliant merchants only (AOC on file with Number required)

    {
      "ccCardInfo": {
        "AccountNumber": "4111111111111111",
        "ExpMonth": 10,
        "ExpYear": 2022,
        "CSV": "122"
      },
      "ConsentCreator": {
        "MerchID": 1,
        "CustomerRefID": "A1523644",
        "ServiceDescrip": "REST Test",
        "RPGUID": "4c269391-a698-4e10-a1a8-0353ee80d1a6",
        "StartDate": "/Date(1563800567934-0400)/",
        "NumDays": 365,
        "LimitPerCharge": 1000,
        "LimitLifeTime": 100000
      },
      "AcctHolder": {
        "Firstname": "Sean",
    
    

    SessKey string required

    A unique session key used for authentication in API calls. This key is generated upon successful authentication and must be included in all subsequent requests.

    Example: A1842D663E9A4A72XXXXXXXX303541303234373138


    Content-Type string required

    Example: application/json


    Accept string required

    Example: application/json

    ccCardInfo object optional

    AccountNumber string optional

    Example: 4111111111111111

    ExpMonth integer optional

    Example: 10

    ExpYear integer optional

    Example: 2028

    PayForm

    Getting started with PayForm for Number

    The PayForm is designed to be a highly flexible and secure payment form for your users. It is designed to rendered in the browser and integrated with your existing web content.

    Collecting a payment or saving a card on file is a two-step process: a call is made to our REST API to initialize the payment parameters, and a payment link is generated.

    You control all of the operational and design parameters of the PayForm:

    1. Form styling

    2. Field visibility and read-only parameters

    PayForm builder
    Redirect with query string
    Create Annual Consent
    Create Annual Consent
    Process a Card Sale Old
    Process a Card Sale Old
    Create Recurring Consent
    Create Recurring Consent
    PayForm Old
    # using npm
      npm start
    
    # OR using Yarn
      yarn start
    # using npm
      npm run android
    
    # OR using Yarn
      yarn android
    # using npm
      npm run ios
    
    # OR using Yarn
      yarn ios
    EasyPayModule.loadCertificate()
    await EasyPayModule.manageAndSelect(config, user, payment, address)
     # testing from App.tsx
      const testManageAndSelect = async () => {
        try {
          const config = {
            rpguid: "3d3424a6-c5f3-4c28",
            customerReferenceId: "12456",
            merchantId: "1"
          };
          const user = {
            endCustomerFirstName: "Simple",
            endCustomerLastName: "Simon",
          }
          const payment = {
            limitPerCharge: "1000.0",
            limitLifetime: "10000.0",
            // cardId: 123 // optional
          }
          const address = {
            endCustomerAddress1: "A1",
            endCustomerAddress2: "",
            endCustomerCity: "Newark",
            endCustomerState: "AZ",
            endCustomerZip: "90210",
          }
          await EasyPayModule.manageAndSelect(config, user, payment, address)
        } 
       catch (error) {
         console.log(error)
       }
      }
    await EasyPayModule.pay (config, user, payment, address)
    # testing from App.tsx
      const testManageAndPay = async () => {
        try {
          const config = {
            rpguid: "3d3424a6-c5f3-4c28",
            customerReferenceId: "12456",
            merchantId: "1"
          };
          const user = {
            endCustomerFirstName: "Simple",
            endCustomerLastName: "Simon",
          }
          const payment = {
            amount: "25.99",
            limitPerCharge: "1000.0",
            limitLifetime: "10000.0",
            // cardId: 123 // optional
          }
          const address = {
            endCustomerAddress1: "A1",
            endCustomerAddress2: "",
            endCustomerCity: "Newark",
            endCustomerState: "AZ",
            endCustomerZip: "90210",
          }
          await EasyPayModule.pay (config, user, payment, address)
        } 
        catch (error) {
          console.log(error)
        }
      }
    //MARK: - CardSelectionDelegate
    
    func didSelectCard(consentId: String) {
      RNEventEmitter.emitter.sendEvent(
        withName: "onCardSelected",
        body: ["consentId": consentId])
    
    }
    
    func didDeleteCard(consentId: Int, success: Bool) {
      if success {
        RNEventEmitter.emitter.sendEvent(
          withName: "onCardDeleted",
          body: ["consentId": consentId])
      }
    }
    
    func didSaveCard(
      consentId: Int?,
      expMonth: Int?,
      expYear: Int?,
      last4digits: String?,
      success: Bool
    ) {
      if !success {
        return
      }
      guard let cid = consentId else { return }
      var body: [String: Any] = ["consentId": cid]
    
      if let month = expMonth {
        body["expMonth"] = month
      }
      if let year = expYear {
        body["expYear"] = year
      }
      if let digits = last4digits {
        body["last4digits"] = digits
      }
    
      RNEventEmitter.emitter.sendEvent(
        withName: "onCardSaved",
        body: body)
    }
    
    //MARK: - CardPaymentDelegate
    
    func didPayWithCard(
      consentId: Int?,
      paymentData: PaymentData?,
      success: Bool
    ) {
      if !success {
        return
      }
    
      //guard let cid = consentId else { return }
      var cid = 0
      if consentId != nil {
        cid = consentId ?? 0
      }
    
      let body: [String: Any?] = [
        "consentId": cid,
        "functionOk": paymentData?.functionOk == true,
        "txApproved": paymentData?.txApproved == true,
        "responseMessage": paymentData?.responseMessage,
        "errorMessage": paymentData?.errorMessage,
        "errorCode": paymentData?.errorCode,
        "txnCode": paymentData?.txnCode,
        "avsResult": paymentData?.avsResult,
        "cvvResult": paymentData?.cvvResult,
        "acquirerResponseEMV": paymentData?.acquirerResponseEMV,
        "txId": paymentData?.txId,
        "requiresVoiceAuth": paymentData?.requiresVoiceAuth == true,
        "isPartialApproval": paymentData?.isPartialApproval == true,
        "responseAuthorizedAmount": paymentData?.responseAuthorizedAmount,
        "responseApprovedAmount": paymentData?.responseApprovedAmount,
      ]
    
      RNEventEmitter.emitter.sendEvent(
        withName: "onCardPaid",
        body: body.compactMapValues({ $0 }))
    
    }
    
    # testing from App.tsx
    
        // iOS Events
        const selectionListener = nativeEventEmitter.addListener('onCardSelected', (data: {
            consentId: String;
        }) => {
            console.log('Card Selected', data.consentId);
        });
        const deleteListener = nativeEventEmitter.addListener('onCardDeleted', (data: {
            consentId: String;
        }) => {
            console.log('Card Deleted', data.consentId);
        });
        const saveListener = nativeEventEmitter.addListener('onCardSaved', (data: {
            consentId: String;
        }) => {
            console.log('Card Saved', data.consentId);
            /* See also:
              consentId
              expMonth
              expYear
              last4Digits
            */
        });
        const paidListener = nativeEventEmitter.addListener('onCardPaid', (data: {
            consentId: string;
            functionOk: boolean;
            txApproved: boolean;
            responseMessage: string;
            errorMessage: string;
            errorCode: int;
            txnCode: string;
            avsResult: string;
            cvvResult: string;
            acquirerResponseEMV: string;
            txId: int;
            requiresVoiceAuth: boolean;
            isPartialApproval: boolean;
            responseAuthorizedAmount: number;
            responseApprovedAmount: number;
    
        }) => {
    
            console.log('functionOK', data.functionOk);
            console.log('Consent ID', data.consentId);
            console.log('Transaction ID', data.txId);
        });
    
        // Android Events
        const manageErrorListener = nativeEventEmitter.addListener('onManageError', (data: {
            error: String;
        }) => {
            console.log('Manage error', data.error);
        });
    
        const manageResultListener = nativeEventEmitter.addListener('onManageResult', (data: {
            selectedConsentId ? : number;
        }) => {
            console.log('Selected Consent Id', data.selectedConsentId);      
        });
    
        const paymentErrorListener = nativeEventEmitter.addListener('onPaymentError', (data: {
            error: String;
        }) => {
            console.log('Payment error', data.error);
        });
        const paymentCancelListener = nativeEventEmitter.addListener('onPaymentCancelled', () => {
            console.log('Payment cancelled');
        });
        const paymentResultListener = nativeEventEmitter.addListener('onPaymentResult', (result: {
            data: {
                errorMessage: string;
                responseMessage: string;
                txApproved: boolean;
                txId: number;
                txCode: string;
                avsResult: string;
                acquirerResponseEmv: string;
                cvvResult: string;
                isPartialApproval: boolean;
                requiresVoiceAuth: boolean;
                responseApprovedAmount: number;
                responseAuthorizedAmount: number;
                responseBalanceAmount: number;
            };
        }) => {        
            console.log('Payment result', result.data);
        });
    {
      "ConsentAnnual_Create_MANResult": {
        "ConsentID": 18,
        "CreationSuccess": true,
        "ErrCode": 0,
        "ErrMsg": "",
        "FunctionOk": true,
        "PreConsentAuthMessage": "APPROVED 297311                 ",
        "PreConsentAuthSuccess": true,
        "PreConsentAuthTxID": 61,
        "RespMsg": "Success : Created Consent ID : 000018"
      }
    }

    CSV string optional

    Example: 122

    ConsentCreator object optional

    MerchID integer optional

    Example: 1

    CustomerRefID string optional

    Example: A1523644

    ServiceDescrip string optional

    Example: REST Test

    RPGUID string optional

    A custom, user-defined reference ID or value.

    Example: adf98580-b4ab-42fc-bb99-01c89964afe9

    StartDate string optional

    Date and time in Microsoft JSON date format (Unix timestamp and timezone offset).

    Example: 2024-12-01T11:19:01.000Z

    NumDays integer optional

    Example: 365

    LimitPerCharge number · float optional

    Example: 1000

    LimitLifeTime number · float optional

    Example: 100000

    AcctHolder object optional

    Firstname string optional

    Example: Sally

    Lastname string optional

    Example: APIACH

    Company string optional

    Title string optional

    Url string optional

    BillIngAddress object optional

    Email string optional

    Example: [email protected]

    Phone string optional

    Example: 8775558472

    EndCustomer object optional

    Firstname string optional

    Example: Sally

    Lastname string optional

    Example: APIACH

    Company string optional

    Title string optional

    Url string optional

    BillIngAddress object optional

    Email string optional

    Example: [email protected]

    Phone string optional

    Example: 8775558472

    "Lastname": "Wood",
    "Company": "",
    "Title": "",
    "Url": "",
    "BillIngAdress": {
    "Address1": "123 Fake St",
    "Address2": "",
    "City": "PORTLAND",
    "State": "ME",
    "ZIP": "04106",
    "Country": "USA"
    },
    "Email": "[email protected]",
    "Phone": "8777248472"
    },
    "EndCustomer": {
    "Firstname": "Sean",
    "Lastname": "Wood",
    "Company": "",
    "Title": "",
    "Url": "",
    "BillIngAdress": {
    "Address1": "123 Fake St.",
    "Address2": "",
    "City": "PORTLAND",
    "State": "ME",
    "ZIP": "04106",
    "Country": "USA"
    },
    "Email": "[email protected]",
    "Phone": "8777248472"
    }
    }
    # in a terminal window
      npm install
    
      cd ios
      pod install
    EasyPayModule.configureSecrets("YOUR_API_KEY", "YOUR_HMAC_SECRET", "SENTRY_DSN", true)

    Initial data (cardholder names, $ amounts, etc.)

  • User-defined data (ReferenceID, etc.)

  • Defined methods for receiving a real-time update after transactions are authorized

  • You can then present the PayForm in one of two ways:

    As an iFrame on your website

    As a direct link to the PayForm

    To generate a PayForm, you can make a call to our REST API using a request body generated on the PayForm builder website.


    PayForm builder

    It might be difficult to prepare a PayForm request by yourself at first. To make it easy and to get started, we've prepared a tool which can generate your form for you.

    This is the PayForm wizard tool:

    This is a second option for creating PayForm configuration:

    Transaction types

    There are three operation types you can choose from:

    • Collect an instant payment using credit cards, ACH, Google Pay or Apple Pay;

    • Save accountholder data to be charged later (card-on-file, account on file);

    • Both saving the accountholder data and collecting instant payment.

    This choice will also pre-determine some of the required fields and submission options for you.

    Visible and read-only fields

    There is a number of fields you can have added to your form. For some of the fields, you can choose to provide a default value, and to mark them as read-only.

    Field name
    Description
    Read-only option

    First Name

    Cardholder first name. If only First Name is visible, field will be changed to Full Name.

    yes

    Last Name

    Cardholder last name. If only Last Name is visible, field will be changed to Full Name.

    yes

    Address

    Cardholder street address.

    yes

    City

    Cardholder city.

    Submission options

    Based on your requirements, you can choose from many submission options explained below.

    Submission option
    Description

    Redirect external

    After submitting, the user will be redirected to a provided external URL. An encrypted string containing the POST data is appended to the URL to be consumed by the merchant.

    Redirect internal - receipt combo

    After submitting, the user will be redirected to an internal page displaying a combination receipt for merchant and customer. An encrypted string containing the POST data is appended to the URL to be consumed by the merchant.

    This can also be used in conjunction with Silent Post for the purpose of transmitting data.

    Redirect internal - receipt customer

    After submitting, the user will be redirected to an internal page displaying a receipt for the customer. An encrypted string containing the POST data is appended to the URL to be consumed by the merchant. This can also be used in conjunction with Silent Post for the purpose of transmitting data.

    Redirect internal - success message

    After submitting, the user will be redirected to an internal page displaying a success message and a check mark image. An encrypted string containing the POST data is appended to the URL to be consumed by the merchant. Sometimes used with desktop apps which use embedded browsers.

    Silent post

    After submitting, an encrypted string containing the POST data is sent to the provided URL to be consumed by the merchant.

    The data is transmitted in the background. The user is not redirected.

    Post message

    When the PayForm is inside of an iFrame, after submitting, an encrypted string containing the POST data is sent to the parent page to be consumed by the merchant. The user is not redirected.

    Style and colors

    We care about making sure that the PayForm can match the style of your branding. You'll notice that some options are mutually exclusive.

    Here is a list of all non-default customization options that can affect the look of the PayForm:

    Customization element
    Options

    Label position

    Left of the text box, above the text box, within the text box.

    Text box corners

    Semiround, round, semiround subtle.

    Font family

    Serif Font, Roboto font.

    Required field indicators

    Show.

    Hide buttons

    Hide both buttons, hide cancel button.

    Text box size

    Tall text boxes, short text boxes.

    Pre-filled values

    Depending on your needs, you might want to have some of the values pre-filled with defaults. This will allow you to provide a default for the First Name, Last Name, Address, City, State, Zip, Amount, REFID, RPGUID, and Email.

    Additionally, in this part of the builder, you can set values for the hidden config fields used by the form: Endpoint, Redirect URL, Post URL, and EIndex.

    Hidden config field
    Description

    Endpoint

    Points to specific web application on our server. Number will provide guidance.

    Redirect URL

    A URL to redirect the user after the payment is processed, if applicable.

    Post URL

    A URL to POST the real-time values after the payment is completed, if applicable.

    EIndex

    Integrator key index for encryption assigned when integrator account is first created, received with the initial login credentials


    PayForm API request

    Once you have the request ready, you can call our REST API to generate the PayForm and the PaymentURL that you can use to access it. See the reference to PayForm Old endpoint.

    Here's an example PayForm generated using the endpoint:

    Consuming data from the PayForm

    After the payment form has been submitted and credit card authorization is completed, you can opt to gather real-time information using JSON post, redirect with query string, or a post message to your parent page.

    When configuring the form, you may provide one or both of the following URLs:

    • POST URL where we will POST values as either JSON stream or by appending a query string,

    • Redirect URL to redirect to the page of your choice after transaction is completed, with or without a query string appended.

    JSON post

    Using JSON post, you'll be able to provide a POST URL for our servers to stream the data to. Then, you can tap into the request input stream to receive your JSON string.

    Here's an example of the result and how to tap into the input stream:

    Redirect with query string

    If you don't choose to use JSON post, we will web request your page and add query parameters to the URL. In order for you to validate the information, when configuring the form, you can choose from the following:

    • If you supply EIndex, which is a value that defines your unique AES 256 encryption key as described above, you can read query string values as encrypted parameters (the encrypted message m, and the initialization vector i);

    • Otherwise, we will supply the query parameters with no encryption and you will be able to query our API to ensure that 1. those values exist and 2. they were created in the last few moments.

    When you are receiving transaction data that is not encrypted, you should validate it before storing any details to avoid malicious actors creating unqualified data.

    In case you're not using encryption, we recommend validating the information.

    1

    Retrieve and validate the transaction details

    Using the TransactionID returned by the PayForm, you can call our REST API to retrieve full transaction details to get all of the information regarding the transaction.

    Then, you can confirm if a transaction with the selected ID exists, and if the CreatedOn date roughly matches the current time or the time the PayForm was submitted.

    2

    Retrieve and validate the consent details (if the card was saved)

    If ConsentID was returned alongside the TransactionID, you can use the REST API to to get all of the information regarding the consent.

    Then, you can confirm if a consent with the selected ID exists, and if the CreatedOn date roughly matches the current time or the time the PayForm was submitted.

    With this, you can avoid malicious actors filling your database with unqualified transaction data.

    Post message

    In this method, the PayForm you have rendered in your iFrame will message your parent page directly.

    Here are example scripts for your parent page to listen for the message provided by the PayForm:

    If your implementation is using encryption, after decrypting, you'll get a string which can look like this:

    If you are not using encryption, it will contain 2 URL parameters instead, and can look like this:

    Requesting additional transaction and consent details

    Having the TransactionID (TxID) and ConsentID, you can use our REST API to:

    • Gather additional informating concerning the sale;

      • For the REST API, you can use full transaction details, and full consent details methods;

    • Provide a receipt;

      • For the REST API, you can use generate a transaction receipt method;

    iOS SDK

    Getting started with iOS SDK for Number

    The EasyPay iOS SDK offers access to the Number API for effortless integration with any iOS application. For Android integration, refer to the .


    Installation

    1. Charge credit card
    3. Create annual consent
    {
      "ConsentID": 33,
      "TransactionID": 21008,
      "CardNumber": "4511",
      "CardType": "Visa",
      "ExpireDate": "12/28",
      "Amount": 56.20,
      "Surcharge": 0.0,
      "CardholderFirstName": "Nancy",
      "CardholderLastName": "Draper",
      "CustomerFirstName": "",
      "CustomerLastName": "",
      "Email": "[email protected]",
      "REFID": "764532#1",
      "RPGUID": "38976345",
      "ApprovalCode": "OK5013"
    }
    public void ProcessPayFormInput(object sender, EventArgs e)
    {
      string json;
      using (var reader = new StreamReader(Request.InputStream))
      {
        json = reader.ReadToEnd();
      }
      // Process the input
    }
    // Listen for post messages from an iFrame
    window.addEventListener('message', (event) => {
      const resultsMessage = document.getElementById('results');
    
      // Ensure the message is from a trusted origin
      const trustedOrigin = 'https://easypay5.com'; // use PayForm origin
      if (event.origin !== trustedOrigin) {
        console.warn('Received message from untrusted origin:', event.origin);
        return;
      }
    
      // Update the innerHTML with the message data
      resultsMessage.innerHTML = event.data;
    
      // Optionally, handle the message data further
      // alert(event.data);
    });
    // addEventListener support for IE8
    function bindEvent(element, eventName, eventHandler) {
      if (element.addEventListener) {
        element.addEventListener(eventName, eventHandler, false);
      }
      else if (element.attachEvent) {
        element.attachEvent('on' + eventName, eventHandler);
      }
    }
    
    // Listen to message from child window
    bindEvent(window, 'message', function(e) {
      var resultsMessage = document.getElementById('results');
      resultsMessage.innerHTML = e.data;
      // Optionally, handle the message data further
      // alert(e.data);
    });
    
    TXID|174|CONSENTID|213|CARDNO|5339|CARDTYPE|Amex|FIRSTNAME|Bob|LASTNAME|smith|REFID|7899
    ?txid=123&cid=321
    Requirements
    • Xcode 15 or above

    • Compatible with iOS 13.0 or above

    Configuration

    1

    Setup with Swift Package Manager

    2

    Setup with Cocoapods


    Get started

    Integration

    1

    Prerequisites - get HMAC secret, API key and optional Sentry DSN from Number.

    2
    3

    During the initialization, the process of downloading the certificate is starting. Proceeding with any call before downloading has finished will result in an error RsaCertificateError.failedToLoadCertificateData.

    You can check the status of downloading by accessing the following enum:

    4

    To enable jailbreak detection, please set isProduction = true when initializing the library and add the following URL schemes to main Info.plist.

    Using widgets

    Number's prebuilt payment UI components allow you to collect and process credit card information and payments in a secure way.

    Managing cards

    For managing saved cards without paying, the following initializer should be used:

    preselectedCardId is an optional parameter that allows to mark a card as selected by passing the ConsentId of this card. If nil or incorrect, the selection will be ignored.

    paymentDetails parameter is used for passing additional payment details not visible for the end user. Either customerReferenceId or rpguid must be provided to get the list of consents of a specific customer. In case of of incorrect initialization data, CardSelectionViewControllerInitError will be thrown.

    If you would like to receive callbacks, conform to CardSelectionDelegate with following methods:

    Managing cards and payment

    For managing saved cards and paying, following initializer should be used:

    amount should be higher than 0 and it is required parameter.

    preselectedCardId is an optional parameter that allows to mark a card as selected by passing the ConsentId of this card. If nil or incorrect, the selection will be ignored.

    paymentDetails parameter is used for passing additional payment details not visible for the end user. Either customerReferenceId or rpguid must be provided to get the list of consents of a specific customer. In case of of incorrect initialization data, CardSelectionViewControllerInitError will be thrown.

    If you would like to receive callbacks, conform to CardPaymentDelegate with following methods:

    Screenshots

    Save Card

    Manage Cards

    Store and Pay


    Common components

    SecureTextField component

    The SDK's widgets use a component called SecureTextField which ensures a safe input of credit card numbers. It is a subclass of UITextField which enables freedom of styling as needed.

    Setting up requires configuring the certificate once it was downloaded to encrypt credit card data.

    To receive the encrypted card string required to send to the API, you can use the following method:

    Data in the SecureTextField component is already encrypted and can be used in the API calls without any additional encryption.


    Common objects

    Below you'll find code describing some of the objects that are commonly used in requests or responses. You can use it as a reference. The code includes parameter names and types.

    CreditCardInfo

    The object consists of the following fields:

    AccountHolder

    The object consists of the following fields:

    BillingAddress

    The object consists of the following fields:

    EndCustomer

    The object consists of the following fields:

    EndCustomerBillingAddress

    The object consists of the following fields:

    Amounts

    The object consists of the following fields:

    PurchItems

    The object consists of the following fields:

    CreateConsentAnnual

    The object consists of the following fields:

    AnnualEndCustomer

    The object consists of the following fields:

    AnnualEndCustomerBillingAddress

    The object consists of the following fields:


    Publics methods in the SDK

    Configuration

    These methods allow you to configure the SDK secrets and load the certificate.

    1. Charge credit card

    This method processes a credit card card sale when the credit card details are entered manually. Details include the card number, expiration date, CVV, card holder name and address.

    REST API equivalent: Process a Card Sale Old

    Request parameters

    • TransactionRequest

      • creditCardInfo: CreditCardInfo

      • accountHolder: AccountHolder

      • endCustomer: ?

      • amounts:

      • purchItems:

      • merchantId: Int

    Response body

    The response will be serialized to CardSaleManualResponseModel and include:

    2. List annual consents

    A query that returns annual consent details. Depending on the query sent, a single consent or multiple consents may be returned.

    REST API equivalent:

    Request body

    • AnnualQueryHelper

      • merchantId: String

      • customerReferenceId: String?

      • rpguid: String?

      • endDate: Date?

      Either customerReferenceId or rpguid must be provided to get the list of consents of a specific customer.

    Response body

    The response will be serialized to ConsentAnnualListingResponseModel and include:

    And the ConsentAnnual consists of the following fields:

    3. Create annual consent

    This method creates an annual consent by sending the credit card details, which include: card number, expiration date, CVV, and card holder contact data. It is not created by swiping the card through a reader device.

    REST API equivalent: Create Annual Consent

    Request body

    • CreateConsentAnnualManualRequestModel

      • creditCardInfo: CreditCardInfo

      • consentAnnualCreate: CreateConsentAnnual

      • accountHolder:

      • endCustomer: ?

    Response body

    The response will be serialized to CreateConsentAnnualResponseModel and include:

    4. Cancel annual consent

    Cancels an annual consent. Credit card data is removed from the system after the cancellation is complete.

    REST API equivalent:

    Request parameters

    • CancelConsentAnnualManualRequestModel

      • consentId: Int

    Response body

    The response will be serialized to CancelConsentAnnualResponseModel and include:

    5. Process payment for an annual consent

    This method uses the credit card stored on file to process a payment for an existing consent.

    REST API equivalent:

    Request body

    • ProcessPaymentAnnualRequestModel

      • consentId: Int

      • processAmount: String

    Response body

    The response will be serialized to ProcessPaymentAnnualResponseModel and include:


    How to properly consume the API response

    The response must be consumed in the intended order and format. Clients who deviate from this can experience unwanted behavior.

    If there is no TxApproved flag, then you can omit the last evaluation. More information about consuming the API response can be found in Consuming the API response section.


    Possible errors

    RsaCertificateError

    Error name
    Suggested solution

    failedToLoadCertificateData

    Check certificate status, wait until the full download before proceeding with calls, try to download it again manually.

    failedToCreateCertificate

    Contact Number.

    failedToExtractPublicKey

    Contact Number.

    AuthenticationError

    Error name
    Suggested solution

    missingSessionKeyOrExpired

    Check if you have provided the correct apiKey and hmacSecret, contact Number to receive updated secrets.

    NetworkingError

    Error name
    Suggested solution

    unsuccesfulRequest

    Check HTTP status code.

    noDataReceived

    Data from backend was empty, contact Number.

    dataDecodingFailure

    Data from backend was not decoded properly, contact Number.

    invalidCertificatePathURL

    Contact Number.


    Semantic versioning

    The SDK follows semantic versioning with a three-part version number: MAJOR.MINOR.PATCH.

    • MAJOR version is incremented when there are incompatible API changes,

    • MINOR version is incremented when functionality is added in a backwards-compatible manner,

    • PATCH version is incremented when there are backwards-compatible bug fixes.

    Android SDK integration guide

    yes

    State

    Cardholder state.

    yes

    Zip Code

    Cardholder zip code.

    yes

    Amount

    A total $ amount to charge, when applicable to the chosen transaction type.

    yes

    REFID

    A user-defined custom field

    yes

    RPGUID

    A hidden user-defined custom field

    yes

    Expiration

    Expiration date on the card, required.

    -

    CVV

    Security code on the back of the card, required.

    -

    Agree to Pay confirmation

    Adds a checkbox that will be required to submit and complete the instant card payment.

    -

    Agree to Save Card on File confirmation

    Adds a checkbox that will be required to successfully save the card on file.

    -

    Email

    Cardholder email address.

    yes

    Auth to Email

    Permission to send an email.

    -

    Logos

    Adds EasyPay Solutions, PCI Certified, and Digicert Secured logos to the form.

    -

    Require AVS full match

    To submit the PayForm, a full AVS match must be submitted. This requires the Address and Zip Code to match exactly what is on record with the issuer for the card.

    Require AVS partial match

    To submit the PayForm, a partial AVS match must be submitted. This requires that, at a minimum, there is a Zip Code match achieved.

    Require CVV match

    To submit the PayForm, a full CVV match must be achieved. The transaction will be voided if the CVV does not fully match what is on file with the card issuer.

    Payment widget

    This PayForm will collect a one-time payment. Automatically set when choosing the transaction type.

    Save Card on File widget

    This PayForm will save the card on file for future use. Automatically set when choosing the transaction type.

    JSON post

    Replace the encrypted POST data with a JSON object to be consumed.

    Send only Transaction ID / Consent ID

    Only include the TxID and ConsentID in the data to be consumed.

    Background color Button background color Button border color Button text color Label text color Text box text color Text box background color

    Any RGB value (can be selected using the color picker).

    get full detail of annual consent

    ACH Testing

    Response code reference for ACH.

    Returned check codes

    Number checks for status change on all OPEN ACH transactions daily. Once we detect a status change, we send a report to the merchant. The report shows settled and/or returned checks.

    Returned checks will show the below mentioned codes. Below table shows how to generate the return codes using the specified routing and account number in the testing environment.

    Code
    Code description
    Routing
    Account number


    Complete list of return codes

    Below you'll find a reference list to every possible return code value.

    Return Description
    Return Code

    Complete list of return codes
    .package(url: "https://github.com/Easy-Pay-Solutions/Mobile-SDK-IOS.git", from: "1.0.6")
    pod 'EasyPay'
    EasyPay.shared.certificateStatus
     CardSelectionViewController(selectionDelegate: AnyObject, preselectedCardId: Int?, paymentDetails: AddAnnualConsentWidgetModel) throws
    func didSelectCard(consentId: String) {}
    func didDeleteCard(consentId: Int, success: Bool) {}
    func didSaveCard(consentId: Int?, 
                     expMonth: Int?,
                     expYear: Int?,
                     last4digits: String?,
                     success: Bool)  {}
    CardSelectionViewController(amount: String, paymentDelegate: AnyObject, preselectedCardId: Int?, paymentDetails: AddAnnualConsentWidgetModel) throws
    func didPayWithCard(consentId: Int?, paymentData: PaymentData?, success: Bool) {}
    func didDeleteCard(consentId: Int, success: Bool) {}
    nameOfYourTextField.setupConfig(EasyPay.shared.config)
    nameOfYourTextField.encryptCardData()
    let accountNumber: String //credit card number encoded in base 64
    let expirationMonth: Int?
    let expirationYear: Int?
    let cvv: String
    let firstName: String
    let lastName: String
    let company: String?
    let billingAddress: BillingAddress
    let email: String?
    let phone: String?
    let address1: String
    let address2: String?
    let city: String?
    let state: String?
    let zip: String
    let country: String?
    let firstName: String?
    let lastName: String?
    let company: String?
    let billingAddress: EndCustomerBillingAddress?
    let email: String?
    let phone: String?
    let address1: String?
    let address2: String?
    let city: String?
    let state: String?
    let zip: String?
    let country: String?
    let totalAmount: String
    let salesAmount: String?
    let surcharge: String?
    let serviceDescription: String?
    let clientRefId: String?
    let rpguid: String?
    let merchID: Int?
    let customerRefID: String?
    let serviceDescrip: String?
    let rpguid: String?
    let startDate: String //Timestamp in milliseconds in format \/Date(1710936735853)\/
    let limitPerCharge: String
    let limitLifeTime: String
    let firstName: String?
    let lastName: String?
    let company: String?
    let billingAddress: AnnualEndCustomerBillingAddress?
    let email: String?
    let phone: String?
    let address1: String?
    let address2: String?
    let city: String?
    let state: String?
    let zip: String?
    let country: String?
    EasyPay.shared.configureSecrets(apiKey: String, hmacSecret: String)
    EasyPay.shared.loadCertificate(_ completion: @escaping (Result<Data, Error>) -> Void)
    EasyPay.apiClient.chargeCreditCard(request: CardSaleManualRequest,
                                       completion: @escaping (Result<CreditCardSaleResponse, Error>) -> Void)
    public let avsResult: String
    public let acquirerResponseEMV: String?
    public let cvvResult: String
    public let errorCode: Int
    public let errorMessage: String
    public let functionOk: Bool
    public let isPartialApproval: Bool
    public let requiresVoiceAuth: Bool
    public let responseMessage: String
    public let responseApprovedAmount: Double
    public let responseAuthorizedAmount: Double
    public let responseBalanceAmount: Double
    public let txApproved: Bool
    public let txId: Int
    public let txnCode: String
    EasyPay.apiClient.listAnnualConsents(request: ConsentAnnualListingRequest,
                                         completion: @escaping (Result<ListingConsentAnnualResponse, Error>) -> Void)
    public let functionOk: Bool?
    public var responseMessage: String?
    public let errorMessage: String?
    public let errorCode: Int?
    public let numberOfRecords: Int?
    public let consents: [ConsentAnnual]?
    public let id: Int?
    public let accountHolderId: Int?
    public let customerId: Int?
    public let merchantId: Int?
    public let customerRefId: String?
    public let rpguid: String?
    public let serviceDescription: String?
    public let accountHolderLastName: String?
    public let accountHolderFirstName: String?
    public let isEnabled: Bool?
    public let startDate: String?
    public let endDate: String?
    public let numberOfDays: Int?
    public let limitPerCharge: Double?
    public let limitLifeTime: Double?
    public let authTxID: Int?
    public let createdOn: String?
    public let createdBy: String?
    public let accountNumber: String?
    EasyPay.apiClient.createAnnualConsent(request: CreateConsentAnnualRequest,
                                          completion: @escaping (Result<CreateConsentAnnualResponse, Error>) -> Void)
    public let functionOk: Bool
    public let responseMessage: String
    public let errorMessage: String
    public let errorCode: Int
    public let creationSuccess: Bool
    public let preConsentAuthSuccess: Bool
    public let preConsentAuthMessage: String
    public let preConsentAuthTxId: Int
    public let consentId: Int
    EasyPay.apiClient.cancelAnnualConsent(request: CancelConsentAnnualRequest,
                                          completion: @escaping (Result<CancelConsentAnnualResponse, Error>) -> Void)
    public let functionOk: Bool?
    public let responseMessage: String?
    public let errorMessage: String?
    public let errorCode: Int?
    public let cancelledConsentId: Int?
    public let cancelSuccess: Bool?
    EasyPay.apiClient.processPaymentAnnualConsent(request: ProcessPaymentAnnualRequest,
                                                  completion: @escaping (Result<ProcessPaymentAnnualResponse, Error>) -> Void)
    public let functionOk: Bool?
    public let txApproved: Bool?
    public let responseMessage: String?
    public let errorMessage: String?
    public let errorCode: Int?
    public let txnCode: String?
    public let avsResult: String?
    public let cvvResult: String?
    public let acquirerResponseEMV: String?
    public let txId: Int?
    public let requiresVoiceAuth: Bool?
    public let isPartialApproval: Bool?
    public let responseAuthorizedAmount: Double?
    public let responseBalanceAmount: Double?
    public let responseApprovedAmount: Double?
    if response.data.errorMessage != "" && response.data.errorCode != 0 {
        //This indicates an error which was handled on the Number servers, consume the ErrCode and the ErrMsg 
        return
    } else if response.data.functionOk == true && response.data.txApproved == false {
        //This indicates a declined authorization, display the TXID, RspMsg (friendly decline message), also the decline Code (TxnCode)
    } else {
       //Transaction has been approved, display the TXID,  and approval code (also in TXNCODE)  
    }

    021000021

    1234 5678 9012 3455

    R05

    Unauthorized CCD

    021000021

    1234 5678 9012 3456

    R07

    ACH authorization has been revoked

    021000021

    1234 5678 9012 3457

    L04

    Refer to Maker ICL

    021000021

    1234 5678 9012 3458

    L09

    Unauthorized ICL

    021000021

    1234 5678 9012 3459

    R01

    Insufficient Funds

    122000661

    1234 5678 9012 3450

    R09

    Insufficient collected funds in account

    122000661

    1234 5678 9012 3451

    R02

    Receiver's account is closed

    122000661

    1234 5678 9012 3452

    R05

    Unauthorized CCD

    122000661

    1234 5678 9012 3453

    L04

    Refer to Maker ICL

    122000661

    1234 5678 9012 3454

    L09

    Unauthorized ICL

    122000661

    1234 5678 9012 3455

    C01

    Account number

    122000661

    1234 5678 9012 3456

    R08

    Payment on this item has been stopped

    122000661

    1234 5678 9012 3457

    R01

    Insufficient Funds

    122000661

    1234 5678 9012 3458

    C03

    Transit/Routing Number & Account Number

    122000661

    1234 5678 9012 3459

    R01

    Insufficient Funds

    011100106

    1234 5678 9012 3450

    R09

    Insufficient collected funds in account

    011100106

    1234 5678 9012 3451

    R02

    Receiver's account is closed

    011100106

    1234 5678 9012 3452

    R05

    Unauthorized CCD

    011100106

    1234 5678 9012 3453

    L04

    Refer to Maker ICL

    011100106

    1234 5678 9012 3454

    L09

    Unauthorized ICL

    011100106

    1234 5678 9012 3455

    C01

    Account number

    011100106

    1234 5678 9012 3456

    R08

    Payment on this item has been stopped

    011100106

    1234 5678 9012 3457

    R01

    Insufficient Funds

    011100106

    1234 5678 9012 3458

    C03

    Transit/Routing Number & Account Number

    011100106

    1234 5678 9012 3459

    Incorrect transit/routing number, bank account number and payment code

    C07

    Incorrect individual ID number

    C09

    Incorrect company name

    C10

    Incorrect company identification

    C11

    Incorrect company name and company ID

    C12

    Fraudulent ICL

    L06

    ICL Hold

    L07

    ICL Other

    L08

    Unauthorized ICL

    L09

    Non-Negotiable Item

    L88

    Other

    L99

    Insufficient funds

    R01

    Receiver's account is closed

    R02

    No account on file

    R03

    Invalid account number

    R04

    Unauthorized CCD

    R05

    Returned at bank's request

    R06

    ACH authorization has been revoked

    R07

    Payment on this item has been stopped

    R08

    Insufficient collected funds in account

    R09

    Customer advises not authorized

    R10

    Check truncation return (specify)

    R11

    Branch sold to another financial institution

    R12

    RDFI is not an ACH member(If this was a check by p

    R13

    Representative payee deceased or no longer able to

    R14

    Beneficiary or account holder other than represent

    R15

    Account funds have been frozen

    R16

    Item returned because of invalid data

    R17

    Improper effective date

    R18

    Amount field error

    R19

    Non-transaction account

    R20

    Invalid company identification

    R21

    Invalid individual ID number

    R22

    Payment refused by biller

    R23

    Duplicate entry

    R24

    Addenda record error

    R25

    Mandatory field error

    R26

    Trace number error

    R27

    Routing/transit number check digit error

    R28

    Corporate customer advises not authorized

    R29

    Receiver not participant in check truncation program

    R30

    Permissible return entry

    R31

    RDFI non-settlement

    R32

    Return of item

    R33

    Limited participation ODFI

    R34

    Return of improper debit entry

    R35

    Return of improper credit entry

    R36

    Source Presented for Payment

    R37

    Stop payment on source document

    R38

    Improper Source Document

    R39

    Return of item by government agency

    R40

    Invalid tansaction code

    R41

    Routing/transit number check digit error

    R42

    Invalid account number

    R43

    Invalid individual ID

    R44

    Invalid individual name or company name

    R45

    Invalid representative payee indicator code

    R46

    Duplicate enrollment

    R47

    Reserved

    R49

    State law affecting RCK acceptance

    R50

    Item is ineligible

    R51

    Stop payment on item

    R52

    Item and A.C.H. Entry Presented for Payment

    R53

    Misrouted return

    R61

    Incorrect trace number

    R62

    Incorrect dollar amount

    R63

    Incorrect individual identification

    R64

    Incorrect tranaction code

    R65

    Incorrect company identification

    R66

    Duplicate return

    R67

    Untimely return

    R68

    Multiple error return - return contains multiple errors

    R69

    Permissible return entry not accepted

    R70

    Misrouted dishonored return

    R71

    Untimely return

    R72

    Timely original return

    R73

    Corrected return

    R74

    Cross-border payment coding error

    R80

    Non-participant in cross-border program

    R81

    Invalid foreign receiving depository financial institution

    R82

    Foreign receiving depository financial institution

    R83

    Indicates a returned PAC (pre-authorized check)

    R98

    Indicates a returned PAC (pre-authorized check)

    R99

    Other

    RCC

    R01

    Insufficient funds

    021000021

    1234 5678 9012 3451

    R09

    Insufficient collected funds in account

    021000021

    1234 5678 9012 3452

    R09

    Insufficient collected funds in account

    021000021

    1234 5678 9012 3453

    R02

    Receiver's account is closed

    021000021

    1234 5678 9012 3454

    R03

    Incorrect bank account number

    C01

    Incorrect transit/routing number

    C02

    Incorrect transit/routing number and bank account number

    C03

    Bank account name change

    C04

    Incorrect payment code

    C05

    Incorrect bank account number and transit code

    C06

    No account on file

    EndCustomer
    Amounts
    PurchItems
    AccountHolder
    AnnualEndCustomer
    https://easypay8.com/byopayform/easypay8.com
    Legacy Builder
    <key>LSApplicationQueriesSchemes</key>
    <array>
        <string>undecimus</string>
        <string>sileo</string>
        <string>zbra</string>
        <string>filza</string>
        <string>activator</string>
    </array>
    https://easypay8.com/payformwizard/easypay8.com
    PayForm Builder
    Logo
    Query Old
    Consent Annual Older
    Consent Annual Older
    Desktop application
    Number Verifone SDK
    Browser-based installation
    Virtual Terminal

    Verifone

    Getting started with Verifone for Number

    The Verifone card readers are small hand-held devices. They communicate with your computer on a USB port. A chip transaction is comprised of about a dozen transmissions between the host (your computer) and the device, and then finally to the Number cloud platform.

    Using the Verifone card readers offers a highly secure method of collecting cardholder data.

    Cardholder data is encrypted within the device itself, and remains encrypted as it travels across the Internet to our PCI Level One Compliant processing platform.

    When a merchant supports a Verifone card reader, it helps eliminate chargebacks for transactions which were run through the device.

    PCI SSC SSF

    Software Security Framework (SSF) is a re-working of the existing PCI standard PA DSS. The PA DSS has been retired since June 30, 2021. Number's "Aspen 3.1" is the first application to achieve the PCI Councils SSF certification, and it provides an end-to-end encrypted solution.


    Software options

    Currently, we offer three different options for collecting payments with the Verifone card readers, all of which require a Windows OS on the host computer.

    1

    Standalone desktop application (upon request)

    This application has automatic updates and allows you to collect payments, create card-on-file and payment plans, process a card-on-file, void or credit, settle transactions, and do reporting with an option to export to a PDF.

    2

    Browser-based interface

    We developed a Windows service which uses Cross-Origin Resource Sharing (CORS) to communicate with the browser. The Win service will return a simple XML response for each transaction directly to the HTML/PHP/ASP.NET page for consumption by the host application.

    As an integrator, this allows you to write simple client-side scripts within your own web applications to initiate transactions with a local Verifone. You can also use this service with our Virtual Terminal to avoid writing any code.

    Requirements

    There are 2 categories of integrations which require two different sets of files

    1. Browser-based - install our Win service which contains all your dependencies, including the drivers and console installer.

    2. Desktop-based - install our SDK, then use separate installers for drivers and a custom event log.

    Desktop application

    If you wish to use the standalone desktop application for Verifone, for installation files and instructions.

    Browser-based installation

    For any browser-based Implementation using the Verifone, you will need to install the local win service. This includes our Virtual Terminal implementation as well as your own custom web applications.

    To Begin: Download the compressed archive:

    To install the Win service:

    1

    Connect your device to a free USB port.

    2

    Allow the device to initialize.

    3

    Extract the above archive to a location of your choice.

    4

    The above installation package does the following:

    1. Installs USB drivers for the Verifone.

    2. Creates a custom event log with Windows named EPmiddleware.

    3. Installs a certificate which encrypts data between the browser and the Windows service.

    4. Installs the EasyPay Verifone MiddleWare E2E 1042 Service which listens on port 8031.

    Your website can now issue commands to the Win Service as is demonstrated using the sample site:

    You can download the entire site here:

    To run the Verifone demo website, you must have the Verifone Windows service installed.

    Virtual Terminal

    You can use our Virtual Terminal together with the Windows service. It has built-in support for Verifone. This way, you won't have to build your own UI or write any code. After installing the service, to have this feature activated.

    You can read more about using the Virtual Terminal in the guide.

    Requesting a transaction from your custom web application

    You will find a script file named EasyPayVerifone.js in the sample VeriFone website provides the following functionality:

    1. EMV sale only

    2. EMV sale and save card

    3. Manual sale (keyed entry) sale only

    4. Manual sale and save card

    You can call these functions as follows:

    Creating your first EMV transaction

    In the script file named EasyPayVerifone.js you can inspect the function named EMVSaleCombo():

    EMVSaleCombo(SaveCard)

    It expects the following objects

    1. SaveCard ( true / false)

    2. SessionKey ( string )

    3. AccountHolder ( Json )

    4. EndCustomer ( can be the same as Accountholder )

    The SessionKey is obtained by using our API to Authenticate. Your Server can pass this down to your client side script.

    The AccountHolder object looks like this. Note the embedded address object:

    The End Customer object is identical to the Accountholder object . You may not have two objects so you can set both to the same value.

    The PurchaseDetails object provides two user defined fields and a service description for your use and this object looks like this:

    The Amount object supports both a simple number such as "103.41" or an object such as the following:

    If you don’t plan to collect processing fees then you can just send a simple numeric value.

    Once you have compiled all Json Object data you make your call to the local windows service as is outlined in the EasyPayVerifone.js script file.

    Here is a sample URL GET request:

    Resetting The Device

    The red Button on the Verifone can be used to Cancel the current operation and also to setup for the Ready State. Your software will be notified of the Reset should this Occur.

    You can also call the function named UnlockVerifone(); which will reset both the software and the hardware so that you can once again enter the ready state.

    If you ever send a command to the Verifone Middleware while it is still processing the previous one, it will respond with an error stating that is it BUSY. In the rare situation where the Middleware remains Busy for an unreasonable amount of time you can issue the UnlockVerifone(); command in order to return the device to the ready State. You can also press the red Button on the device 2 times to enter the ready state.

    If you continue to receive a Busy response from the middleware, but you don't believe that waiting will yield productive results, you may use the unlockVerifone function to return the device to Ready state.

    Middleware response types

    For browser type Verifone operations, the middleware provides a response object in XML format. This object can be de-serialized or can be consumed as XML. Currently, there are two response object types:

    1. WidgetArgs - sale response when requesting an authorization for a non-zero dollar amount, with the option to save the card;

    2. WidgetArgs2 - consent response when requesting to only save the card.

    Consuming the sale response

    It is important to consume the WidgetArgs response in a particular order, starting with TxEventTyp.


    TxEventTyp string

    The type of event that occurred during the transaction, indicating success or failure.

    Values: TxApproved, TxDecline, TxReversed, PreSaleDeviceCode, PostSaleDeviceCode, TimeOut, AspenError, AuthFail, FunctionFail, Exception.


    Here are actions to take for each possible value of TxEventTyp:

    1

    TxApproved

    The sale was approved by the issuer. You should examine and store these values:

    • TxID - the unique ID of the transaction; needed to refund or void the transaction.

    • TxnCode - the transaction approval code.

    Consuming the consent response

    It is important to consume the WidgetArgs2 response in a particular order, starting with ConsentEventTyp.


    ConsentEventTyp string

    The type of event that occurred during the save card on file operation, indicating success or failure.

    Values: ConsentSuccess, ConsentFailed, PreConDeviceCode, PostConDeviceCode, TimeOut, AspenError, AuthFail, FunctionFail, Exception.


    Here are actions to take for each possible value of ConsentEventTyp:

    1

    ConsentSuccess

    The consent was created and card was saved successfully. You should examine and store ConsentID to be able to charge the customer later.

    2

    ConsentFailed

    The consent was not created. Examine ErrCode and ErrMsg for more information.


    Number Verifone SDK

    Important : You can not run both the Verifone Middleware and the Verifone SDK together at the same time. Both packages will need to have control over COM 9 so only one can be active at one time.

    Installation

    For you to directly interface with the Verifone using our SDK, you will need the Verifone drivers with the custom logging package, and the SDK reference files:

    When installed, the first component will provide USB drivers and create a virtual COM 9 port. In addition, it will add a unique event log to the existing windows event log collection.

    To install the first component, please do the following:

    1

    Connect your Verifone to the USB port which you plan to utilize.

    2

    Wait until the device is fully initialized.

    3

    Download and extract the ZIP file named Setup_USB_log.zip to the location of your choice.

    4

    To use the SDK, you only need to directly interface to the file named EP.Enterprise.Vx820.dll. The other files are dependencies. Make sure to extract all 4 of the files to the location of your choice.

    Number has developed a sample executable program using the SDK which allows you to authorize cards, save cards, and create payment plans:


    Sample SDK Program

    Initially you will need the following to begin processing cards

    • Number URL Endpoint ( API URL )

    • Account Code

    • Token

    For testing you can use the default URL supplied but it is important that you consult with Number personnel to determine the best endpoint prior to going live. Your Account code and Token will be supplied to you for your sandbox account.

    EMV Sale

    Once you have authenticated you can proceed to the SALE page.

    Take Notice of the MERCHID field as each Number Account can have one or more merchant records associated with it. For Live accounts you will be provided a deployment form which identifies these along with their identifier {1,2,3} etc.

    For a typical Chip transaction, you only need to specify an amount and press INITIATE CHIP. The device should now prompt you to insert the CHIP. If you check the SAVE CARD checkbox then Number will VAULT the card details after the successful sale and return a CONSENT ID which you can use to authorize the card directly using our API at a later time. If you want to KEY IN the card details directly into the VeriFone, you will enter Account Holder Information then press INITIATE MANUAL TRANSACTION.

    Programming Considerations

    To reference the SDK

    using EP.Enterprise.Vx820Lib;

    Important : manage only one single instance of the class ( this allows you to operate on the COM 9 port )

    private EP_Verifone_Mod EPVerifone;

    Here are some steps required prior to doing a card authorization

    Now you can initiate a transaction

    Wait for your transaction to complete and event will fire

    For additional coding samples including creating recurring payment plans please refer to the sample SDK program

    Managing the Workflow

    Once you initiate a transaction the EPVerifone class will set the DeviceIsBusy flag to True. make sure you monitor this flag before attempting another transaction. EMV transactions can take time and you will expect the On_Device_Msg Event to Fire to alert you of the Results. If for some reason the DeviceIsBusy flag stays true for an unreasonable amount of time you should issue the UnLockAndReset(ref ErrStr) command which will reset both the SDK Software and the Verifone Device in order for you to once again enter the Ready State. There is also a Red Button on the Verifone device which you can press two times to reset the process and fire the On_Device_Msg Event.

    Custom Windows event log

    After installing all the dependencies for either the SDK or the browser-based approach,, you will notice a new Windows event log has been registered named EPmiddleWare.

    This event log stores information about processed transactions as well as any errors encountered, and serves as a powerful troubleshooting component.

    With the Verifone Windows event log installed, a merchant can export the log and send it to Number if any unexpected behavior is encountered.


    Verifone power settings

    Both the middleware service and the SDK will attempt to maintain a continuous connection to the Verifone device. If your hardware is suspended or enters sleep, this can cause issues. To avoid these, please make sure to modify your USB power settings.

    Windows 10 and Windows 11

    For Windows 10, you'll need to go to Control Panel > Power Options > Edit Plan Settings.

    On Windows 11, open Control Panel > Hardware and Sound > Power Options > Edit Plan Settings.

    Go to Advanced power settings and change the USB settings to disable USB selective suspend for your active power plan.

    When using the Verifone, make sure that your machine is running the power plan with the modified settings. All power plans have separate power settings.

    If you don't see the USB power settings on your machine, you might need to expose them.

    1. Run the Command Prompt as an administrator.

    2. Type the command below you into the elevated command prompt, and press Enter:

    3

    Number Verifone SDK

    This DLL provides a means of collecting payments and creating card-on-file plans. Used in conjunction with your custom windows application, you can manage all aspects of your payment requirements.

    Locate the EXE file and right click on it to choose Run as administrator.

    5

    Wait for the application to finish, then reboot computer.

    EMV save card only
  • Reset the Middleware and Verifone

  • PurchaseDetails (Json)
  • Amount ( can be numeric value or JSON object )

  • ApprovedAmt - the $ amount charged to the card.

    2

    TxDecline

    The sale was declined by the issuer. You should examine and store these values:

    • TxID - the unique ID of the declined transaction.

    • TxnCode - the transaction decline code.

    3

    TxReversed

    The issuer approved the transaction, however, during the final interaction with the chip, the device required the transaction to be declined, and the transaction was voided (reversed).

    4

    PreSaleDeviceCode

    An error occurred within the device prior to the transaction getting submitted to the issuer. Examine ErrCode and ErrMsg for more information.

    5

    PostSaleDeviceCode

    An error occurred within the device after the transaction was submitted to the issuer. Examine ErrCode and ErrMsg for more information.

    6

    Timeout

    The user waited too long to insert the card or interact with the device. Examine ErrCode and ErrMsg for more information.

    7

    AspenError

    An error occurred on Number Aspen Cloud processing servers. Examine ErrCode and ErrMsg for more information.

    8

    AuthFail

    When doing a save card only operation, the issuer declined to verify the card details when executing a $0 authorization. The card will not be saved. You should examine:

    • TxID - the unique ID of the declined transaction.

    • TxnCode - the transaction decline code.

    9

    FunctionFail

    Returned when you supply improper or out of range values in the request, or when you execute a Verifone command while the previous action has not yet completed. Examine ErrCode and ErrMsg for more information.

    10

    Exception

    An error was encountered in the local Windows service. Examine ErrCode and ErrMsg for more information.

    3

    PreConDeviceCode

    An error occurred within the device prior to the card being submitted. Examine ErrCode and ErrMsg for more information.

    4

    PostConDeviceCode

    An error occurred within the device after the data was submitted. Examine ErrCode and ErrMsg for more information.

    5

    Timeout

    The user waited too long to insert the card or interact with the device. Examine ErrCode and ErrMsg for more information.

    6

    AspenError

    An error occurred on Number Aspen Cloud processing servers. Examine ErrCode and ErrMsg for more information.

    7

    AuthFail

    When doing a save card only operation, the issuer declined to verify the card details when executing a $0 authorization. The card will not be saved.

    8

    FunctionFail

    Returned when you supply improper or out of range values in the request, or when you execute a Verifone command while the previous action has not yet completed. Examine ErrCode and ErrMsg for more information.

    9

    Exception

    An error was encountered in the local Windows service. Examine ErrCode and ErrMsg for more information.

    Right click the EXE named Setup_USB_log.exe and choose Run as administrator.

    5

    After installation, there should be a new windows event log named EPmiddleWare.

    6

    With the Verifone plugged in you should also see an entry in the device manager attached to COM 9

  • After running the command, reboot your computer, then reopen your advanced power settings following the steps listed above.

  • EP.Enterprise.Vx820Lib.dll

    EP.Vx820.Common.dll

    EP.Enterprise.Vx820Lib.dll.config

    DPayments.DPaymentsSDK.dll

    contact Number
    Verifone Middleware Installer
    Sample Verifone Website
    Sample Verifone Website Content
    contact Number
    Virtual Terminal
    USB drivers and Logging Package
    SDK Interface
    Sample Program Executable
    Sample Program Source Code
    // EMV Sale Only
    $(document).ready(function () {
    	$('#EMVSaleOnly').click(function () {
    		EMVSaleCombo(false);
    	});
    });
    // EMV Sale and Save Card
    $(document).ready(function () {
    	$('#EMVSaleAndSave').click(function () {
    		EMVSaleCombo(true);
    	});
    });
    // Manual Sale Only
    $(document).ready(function () {
    	$('#ManualSaleOnly').click(function () {
    		ManualSaleCombo(false);
    	});
    });
    // Manual Sale and Save Card
    $(document).ready(function () {
    	$('#ManualSaleAndSave').click(function () {
    		ManualSaleCombo(true);
    	});
    });
    // EMV Save Card Only
    $(document).ready(function () {
    	$('#SaveCardOnly').click(function () {
    		SaveCardChip();
    	});
    });
    // Unlock Middleware and Reset Verifone
    $(document).ready(function () {
    	$('#UnlockButton').click(function () {
    		UnlockVerifone();
    	});
    });
    {"Firstname":"Jim","Lastname":"Smith","address":{"Address1":"21 Elm St","Address2":"","City":"Farmindale","State":"CA","ZIP":"83765","Country":"USA"},"Phone":"207-453-4587"}
    {"REFID":"41-96875","RPGUID":"1265432","ServiceDesc":"SERVICE DESCRIPTION HERE"}
    {"baseAmt":"100.43","feeAmt":"2.01","totalAmt":"102.44"}   
    https://localhost:8031/VerifoneSVC/service/GetEmvComboJson?SessKey=&AcctHolderJson={"Firstname":"Jim","Lastname":"Smith","address":{"Address1":"21 Elm St","Address2":"","City":"Farmindale","State":"CA","ZIP":"83765","Country":"USA"},"Phone":"207-453-4587"}&EndCustJson={"Firstname":"Jim","Lastname":"Smith","address":{"Address1":"21 Elm St","Address2":"","City":"Farmindale","State":"CA","ZIP":"83765","Country":"USA"},"Phone":"207-453-4587"}&PurchDetailsJson={"REFID":"41-96875","RPGUID":"","ServiceDesc":"SERVICE DESCRIPTION HERE"}&MerchID=1&Amount={"baseAmt":"100.43","feeAmt":"2.01","totalAmt":"102.44"}&SaveCard=false
    Response example
    <?xml version="1.0" encoding="utf-16"?>
    <WidgetArgs xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
        <TxEventTyp>TxApproved</TxEventTyp>
        <ApprovedAmt>20</ApprovedAmt>
        <IsPartialApproval>false</IsPartialApproval>
        <RespMsg>APPROVED 801193</RespMsg>
        <ErrMsg />
        <TxnCode>801193</TxnCode>
        <TxID>19969</TxID>
        <ErrCode>0</ErrCode>
        <Mask>4663xxxxxxxx2741</Mask>
        <cardType>Visa</cardType>
        <ConsentResult>
            <ConsentCreated>true</ConsentCreated>
            <ConsentRequested>true</ConsentRequested>
            <ErrMsg />
            <ErrCode>0</ErrCode>
            <ConsentID>7849</ConsentID>
            <CardLast4>2741</CardLast4>
            <ExpDate>0528</ExpDate>
        </ConsentResult>
    </WidgetArgs>
    Response example
    <?xml version="1.0" encoding="utf-16"?>
    <WidgetArgs2 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
        <ConsEventTyp>ConsentSuccess</ConsEventTyp>
        <AuthSuccess>true</AuthSuccess>
        <AuthMsg>APPROVED 632641|CVV||AVS|0</AuthMsg>
        <AuthTxID>16809</AuthTxID>
        <RespMsg>Success : Created Consent ID : 001270</RespMsg>
        <ErrMsg />
        <ConsentID>1270</TxnCode>
        <ErrCode>0</ErrCode>
        <Mask>4663xxxxxxxx2741</Mask>
        <cardType>Visa</cardType>
    </WidgetArgs>
    private void Form1_Load(object sender, EventArgs e)
    {
    
    	// Instantiate Class . .assumes that this form will manage one instance of the class . . Only One instance should exist  . .  
    	EPVerifone = new EP_Verifone_Mod();
    
    	// subscribe to event which provides info concerning the transaction 
    	EPVerifone.OnDeviceMsg += new EP_Verifone_Mod.TxHandler(On_Device_Msg);
    
    	// subscribe to event which tells you when the card was removed  
    	EPVerifone.OnCardRemoved += new EP_Verifone_Mod.CardRemovedHandler(On_Card_Removed);
    
    	/// attempt to initiate the com port 
    	if (!EPVerifone.InitComPort())
    	{
    		MessageBox.Show(EPVerifone.Err.SafeMessage);
    		return;
    	}
    
    	/// attempt to open the com port 
    	if (!EPVerifone.OpenPort())
    	{
    		MessageBox.Show(EPVerifone.Err.SafeMessage);
    		return;
    	}
    
    	// do basic configuration ; which EasyPay API to use 
    	EPVerifone.Url = EasyPayParams.APIurl;
    
    	/// set ASPEN credentials 
    	EPVerifone.Credentials.AccountCode = EasyPayParams.AccountCode;
    	EPVerifone.Credentials.Token = EasyPayParams.Token;
    
    	/// this will Initialize the module and validate your settings 
    	if (!EPVerifone.InitMod())
    	{
    		MessageBox.Show(EPVerifone.Err.SafeMessage);
    		return;
    	}
    
    } 
    private void Btn_InitChipTx_Click(object sender, EventArgs e)
    {
    	 //ensure your amount, fee, total are correct 
    	if (!figureAmounts()) {
    		return;
    	}
    	
    	/// clear previous responses
    	ClearResponseTbox();
    
    	/// IMPORTANT !!  make sure the class is not already working on a transaction 
    	if (EPVerifone.DeviceIsBusy)
    	{   /// not you can use the UNLOCK command if class not responding 
    		MessageBox.Show("Please wait for previous Transaction to complete");
    		return;
    	}
    
    	/// attempt to open the com port IF NECCESARY 
    	if (!EPVerifone.OpenPort())
    	{
    		MessageBox.Show(EPVerifone.Err.SafeMessage);
    		return;
    	}
    
    	// set up a new transaction 
    	EmvParams Params = new EmvParams();
    
    	/// decide if you also want EasyPay to Save the card for Furure Payments 
    	if (Chk_SaveCard.Checked) {
    		Params.QuickSaveCard = true;
    	}
    
    	string Amt1 = Txt_Amount.Text.Replace("$", "").Replace(" ", "").Replace(",", "");
    	decimal Amt2 = 0;
    
    
    	if (!decimal.TryParse(Amt1, out Amt2)) {
    		return;
    	}
    
    	if (Amt2 < 0.01M)
    	{
    		// need more than zero  
    		return;
    	}
    
    	Params.Amounts = new EP_Amounts1(Amt, Fee, Total);
    
    	Params.TxAmount = Params.Amounts.TotalAmt;
    	Params.MerchID = (int)NumericMerchID.Value;
    	Params.AcctHolder = new EP_Person();
    	Params.AcctHolder.Firstname = txtFirstName.Text.Trim();
    	Params.AcctHolder.Lastname = txtLastName.Text.Trim();
    	Params.AcctHolder.BillIngAdress = new EP_Address();
    	Params.AcctHolder.BillIngAdress.Address1 = txtAddress.Text.Trim();
    	Params.AcctHolder.BillIngAdress.City = txtCity.Text.Trim();
    	Params.AcctHolder.BillIngAdress.State = txtState.Text.Trim();
    	Params.AcctHolder.BillIngAdress.ZIP = txtZip.Text.Trim();
    	Params.AcctHolder.Email = Txt_Email.Text.Trim();
    
    	Params.EndCustomer = new EP_Person();
    
    	Params.EndCustomer.Firstname = txtCustFirstName.Text.Trim();
    	Params.EndCustomer.Lastname = txtCustLastName.Text.Trim();
    	Params.EndCustomer.BillIngAdress = new EP_Address();
    	Params.EndCustomer.BillIngAdress.Address1 = txtCustAddress.Text.Trim();
    	Params.EndCustomer.BillIngAdress.City = txtCustCity.Text.Trim();
    	Params.EndCustomer.BillIngAdress.State = txtCustState.Text.Trim();
    	Params.EndCustomer.BillIngAdress.ZIP = txtCustZip.Text.Trim();
    
    	Params.RefID = txtRefID.Text.Trim();
    	Params.RPGUID = txtRPGUID.Text.Trim();
    	Params.ServiceDesc = txtServiceDesc.Text.Trim();
    
    
    	/// in case you want to log your request 
    	string MyString = Serialize(Params);
    
    	/// initiate the transaction and wait for the event to fire . .
    	if (!EPVerifone.InitiateEmvPayment(Params))
    	{
    		MessageBox.Show(EPVerifone.Err.SafeMessage);
    		return;
    	}
    }
     private void On_Device_Msg(object e, TxArgs MyArgs)
     {
        /// This event Fires when Device has completed processing transaction ( fires in a separate thread ) 
      
        /// update textboxes from a foriegn thread 
       if (TxtApprovedAmt.InvokeRequired)
           TxtApprovedAmt.Invoke((MethodInvoker)delegate { TxtApprovedAmt.Text = MyArgs.ApprovedAmt.ToString("c"); });
       else
           TxtApprovedAmt.Text = MyArgs.ApprovedAmt.ToString("c");
    
       if (TxtResponseType.InvokeRequired)
           TxtResponseType.Invoke((MethodInvoker)delegate { TxtResponseType.Text = MyArgs.TxEventType.ToString(); });
       else
           TxtResponseType.Text = MyArgs.TxEventType.ToString();
    
       if (TxtIsPartialApproval.InvokeRequired)
           TxtIsPartialApproval.Invoke((MethodInvoker)delegate { TxtIsPartialApproval.Text = MyArgs.IsPartialApproval.ToString(); });
       else
           TxtIsPartialApproval.Text = MyArgs.IsPartialApproval.ToString();
    
       if (TxtErrMsg.InvokeRequired)
           TxtErrMsg.Invoke((MethodInvoker)delegate { TxtErrMsg.Text = MyArgs.ErrMsg; });
       else
           TxtErrMsg.Text = MyArgs.ErrMsg;
    
       if (TxtErrorCode.InvokeRequired)
           TxtErrorCode.Invoke((MethodInvoker)delegate { TxtErrorCode.Text = MyArgs.ErrCode.ToString(); });
       else
           TxtErrorCode.Text = MyArgs.ErrCode.ToString();
    
       if (TxtResponseMessage.InvokeRequired)
           TxtResponseMessage.Invoke((MethodInvoker)delegate { TxtResponseMessage.Text = MyArgs.RespMsg; });
       else
           TxtResponseMessage.Text = MyArgs.RespMsg;
    
       if (TxtTxID.InvokeRequired)
           TxtTxID.Invoke((MethodInvoker)delegate { TxtTxID.Text = MyArgs.TxID.ToString(); });
       else
           TxtTxID.Text = MyArgs.TxID.ToString();
    
       if (TxtTxnCode.InvokeRequired)
           TxtTxnCode.Invoke((MethodInvoker)delegate { TxtTxnCode.Text = MyArgs.TxnCode; });
       else
           TxtTxnCode.Text = MyArgs.TxnCode;
    
    
       /// GET CARD DETAILS HERE FOR CHIP OR MANUAL 
       TxHist lastTrans = EPVerifone.LastTransaction;
    
       TxEntryTypes EntryType = lastTrans.TxEntryTyp;
       if (EntryType == TxEntryTypes.EMV)
       {
          ///  must wait for card removed event to fire before you close port ( if at all)  , ( always use ClosePortSoft method ) 
       }
       else {
          ///  if it is not a chip transaction you can close the port if needed ( you dont have to close the port at all , but if you do always use the ClosePortSoft method )  
       }
    
       
       /// if a request was made to save the card you can gather the important paramters 
       string ConsentResults = "ConsentRequested=" + MyArgs.ConsentResult.ConsentRequested.ToString() + "; ConsentCreated=" + MyArgs.ConsentResult.ConsentCreated.ToString() + "; ConsentID=" + MyArgs.ConsentResult.ConsentID.ToString() + "; CardLast4=" + MyArgs.ConsentResult.CardLast4 + "; ExpDate=" + MyArgs.ConsentResult.ExpDate + "; ErrCode=" + MyArgs.ConsentResult.ErrCode + "; ErrMsg=" + MyArgs.ConsentResult.ErrMsg;
    
       /// if a request was made to save the card you can gather the important paramters 
       if (MyArgs.ConsentResult.ConsentRequested)
       {
           if (TxtSavedCardResults.InvokeRequired)
               TxtSavedCardResults.Invoke((MethodInvoker)delegate { TxtSavedCardResults.Text = ConsentResults; });
           else
               TxtSavedCardResults.Text = ConsentResults;
       }
    
       /// here we can gather info about the card which was processed 
        if (MyArgs.TxEventType == TxEventType.TxApproved || MyArgs.TxEventType == TxEventType.TxDecline)
       {
     
          string AcctNum =  lastTrans.CardNum;
          string CardType =  lastTrans.CardType;
          string Fname =  lastTrans.FirstName;
          string LastName =  lastTrans.LastName;
       }
       else
       {
          //  no need to look at Card details since no authorization was performed
       }
    
    
    }
    REG ADD HKLM\SYSTEM\CurrentControlSet\Control\Power\PowerSettings\2a737441-1930-4402-8d77-b2bebba308a3\48e6b7a6-50f5-4782-a5d4-53bb8f07e226 /v Attributes /t REG_DWORD /d 2 /f
    1. Charge credit card
    3. Create annual consent

    REST API

    Getting started with the REST API for Number

    Our REST API allows full integration of Number services with a high degree of customization. You can use our REST API reference to learn about specific methods in the API.

    Before you continue this section, we recommend reading sections about authentication, best practices, and input validation.

    Examples

    Authenticate

    An example of using the method.

    Process Annual Consent

    An example of using method.

    Void Transaction

    An example of using method.

    Credit Transaction

    An example of using method.

    Query Transaction

    An example of using method.

    Consent General Query

    An example of using method.

    Generate Receipt

    An example of using method.

    Download our Postman Collections

    The Complete Postman Collection

    The complete postman collection includes sample requests for all of the API calls listed on this site.

    Download the Complete Postman Collection:

    The Essentials Postman Collection

    The essentials postman collection includes sample requests to get you started with the essential API calls. The essentials collection includes:

    • Authentication

    • Voiding an open sale transaction

    • Crediting a previously settled sale transaction

    • Process an annual consent payment

    Download the Essentials Postman Collection:

    Android SDK

    Getting started with Android SDK for Number

    The EasyPay Android SDK offers access to the Number API for seamless integration with any and all Android applications. For iOS integration, refer to the .


    Installation

    Annual consent query
  • Transaction query

  • Generate a receipt

  • Authenticate
    ConsentAnnual_ProcPayment
    CardSale_Void
    CardSale_ApplyCredit
    Query_Transaction
    Query_ConsentGeneral
    ReceiptGenerate
    13KB
    RESTAPI.postman_collection_v2.zip
    archive
    Open
    2KB
    SampleRESTAPI.postman_collection.zip
    archive
    Open
    private void Authenticate() {
      /// create request with account code and Token 
      string jsonContent = "{\"AcctCode\":\"EP9142446\",\"Token\":\"F31D16BA862F4EC6AE95CB90450C826A\"}";
    
      byte[] data = Encoding.UTF8.GetBytes(jsonContent);
    
      // Specify Number Endpoint 
      string MyUrl = "https://easypay5.com/APIcardProcREST/v1.0.0/Authenticate";
    
      // create a webrequest 
      WebRequest request = WebRequest.Create(MyUrl);
      request.Method = "POST";
      request.ContentType = "application/json";
      request.ContentLength = data.Length;
      string responseContent = null;
    
    
      ///  Important to handle any exceptions 
      try
      {
        // execute request 
        using (Stream stream = request.GetRequestStream())
        {
          stream.Write(data, 0, data.Length);
        }
        using (WebResponse response = request.GetResponse())
        {
          using (Stream stream = response.GetResponseStream())
          {
            using (StreamReader sr = new StreamReader(stream))
            {
              responseContent = sr.ReadToEnd();
            }
          }
        }
      }
      catch (Exception ee)
      {
        ///  consume any communication exceptions and abort
        MessageBox.Show("Communication Exception : " + ee.Message);
        /// important to insert your Logging function here
        return;
    
      }
    
      /// parse Json in any number of ways  , we use Newtonsoft 
      var AuthResp = Newtonsoft.Json.JsonConvert.DeserializeObject<dynamic>(responseContent);
    
      var MyResp = AuthResp.AuthenticateResult;
    
      ///  here are the important values to consume
      bool FunctionOk = (bool)MyResp.FunctionOk;
      bool AuthSuccess = (bool)MyResp.AuthSuccess;
      int ErrCode = (int)MyResp.ErrCode;
      string ErrMsg = (string)MyResp.ErrMsg;
      string RespMsg = (string)MyResp.RespMsg;
    
      //Check for unexpected Errors on cloud servers. If errors found log Error info and abort;
      if (!FunctionOk)
      {
        MessageBox.Show("Aspen Error : " + ErrMsg + " : ErrorCode: " + ErrCode);
        /// important to insert your Logging function here
        return;
      }
    
      //Check for failures such as Invalid or Expired Credentials or Inactive Account.
      if (!AuthSuccess)
      {
        MessageBox.Show("Failed Authentication : " + RespMsg);
        /// important to insert your Logging function here
        return;
      }
    
      /// Arriving here means that the Authentication was successful. You will retrieve a SessionKey and 
      /// a list of Merchant Records associated with this account. The session key will be used for all
      /// subsequent API calls within the next 25 hours 
      string SessKey = (string)MyResp.SessKey;
      var MerchantList = MyResp.MerchantList;
    }
    public static async Task<string> Authenticate()
    {
      string responseData = string.Empty;
    
      HttpClient httpClient = new HttpClient();
      /// Number Endpoint
      string apiUrl = "https://easypay5.com/APIcardProcREST/v1.0.0/Authenticate";
    
      // Here is your account code and Token used to authenticate 
      string jsonContent = "{\"AcctCode\":\"EP9142446\",\"Token\":\"F31D16BA862F4EC6AE95CB90450C826A\"}";
    
      HttpResponseMessage response = new HttpResponseMessage();
      HttpContent content = new StringContent(jsonContent, Encoding.UTF8, "application/json");
    
      ///  important exception handling will provide info for communication issues  
      try
      {
        response = await httpClient.PostAsync(apiUrl, content);
      }
      catch (Exception ee) {
        return "Exception : " + ee.Message;
      }
    
      if (response.IsSuccessStatusCode)
      {
        // Handle successful POST response
        responseData = await response.Content.ReadAsStringAsync();
      }
      else
      {
        return "http error code " + response.StatusCode;
      }
    
      //  now you can parse the Json Response in a number of ways ( we will use newtonsoft )
      var AuthResp = Newtonsoft.Json.JsonConvert.DeserializeObject<dynamic>(responseData);
      var MyResp = AuthResp.AuthenticateResult;
    
      ///  here are the important values 
      bool FunctionOk = (bool)MyResp.FunctionOk;
      bool AuthSuccess = (bool)MyResp.AuthSuccess;
      int ErrCode = (int)MyResp.ErrCode;
      string ErrMsg = (string)MyResp.ErrMsg;
      string RespMsg = (string)MyResp.RespMsg;
    
      //Check for Aspen Errors on cloud servers. If errors found log Error info and abort;
      if (!FunctionOk)
      {
        return "Aspen Error : " + ErrMsg + " : ErrorCode:" + ErrCode;
      }
    
      //Check for failures such as Invalid or Expired Credentials or Inactive Account.
      if (!AuthSuccess)
      {
        return " Invalid Authentication : " + RespMsg;
      }
    
      /// Arriving here means that the Authentication was successful. You will retrieve a SessionKey and 
      /// a list of Merchant Records associated with this account. The session key will be used for all
      /// subsequent API calls
      string SessKey = (string)MyResp.SessKey;
      var MerchantList = MyResp.MerchantList;
    
      return "Success : " + SessKey;
    }
    'use strict';
    
    const http = require('http');
    const https = require('https');
    
    const port = process.env.PORT || 1337;
    
    http.createServer((req, res) => {
        let body = '';
    
        // AcctCode and Token supplied by Number
        const data = JSON.stringify({
            AcctCode: 'EP8449374',
            Token: '645E3CC4FD04472182C4161BA624C565'
        });
    
        const options = {
            host: 'easypay5.com',
            port: 443,
            path: '/APIcardProcREST/v1.0.0/Authenticate',
            method: 'POST',
            timeout: 2000,
            headers: {
                'Content-Type': 'application/json',
                'Content-Length': Buffer.byteLength(data)
            }
        };
    
        const postReq = https.request(options, (postRes) => {
            postRes.setEncoding('utf8');
    
            postRes.on('data', (chunk) => {
                body += chunk;
            });
    
            postRes.on('end', () => {
                try {
                    if (body === 'Bad Request') {
                        console.error('Bad request');
                        res.writeHead(400, { 'Content-Type': 'text/plain' });
                        res.end('Bad Request');
                        return;
                    }
    
                    const obj = JSON.parse(body);
    
                    if (!obj) {
                        console.error('Communication Error: Null Object');
                        res.writeHead(500, { 'Content-Type': 'text/plain' });
                        res.end('Communication Error: Null Object');
                        return;
                    }
    
                    const { AuthenticateResult } = obj;
    
                    if (!AuthenticateResult.FunctionOk) {
                        console.error(`${AuthenticateResult.ErrMsg} ${AuthenticateResult.ErrCode}`);
                        res.writeHead(500, { 'Content-Type': 'text/plain' });
                        res.end(`${AuthenticateResult.ErrMsg} ${AuthenticateResult.ErrCode}`);
                        return;
                    }
    
                    if (!AuthenticateResult.AuthSuccess) {
                        console.error(AuthenticateResult.RespMsg);
                        res.writeHead(401, { 'Content-Type': 'text/plain' });
                        res.end(AuthenticateResult.RespMsg);
                        return;
                    }
    
                    console.log(`SessKey: ${AuthenticateResult.SessKey}`);
                    res.writeHead(200, { 'Content-Type': 'text/plain' });
                    res.end(`SessKey: ${AuthenticateResult.SessKey}`);
                } catch (error) {
                    console.error('Error parsing response:', error);
                    res.writeHead(500, { 'Content-Type': 'text/plain' });
                    res.end('Internal Server Error');
                }
            });
        });
    
        postReq.on('error', (error) => {
            console.error('Request error:', error);
            res.writeHead(500, { 'Content-Type': 'text/plain' });
            res.end('Request Error');
        });
    
        postReq.on('timeout', () => {
            console.error('Request timed out');
            res.writeHead(504, { 'Content-Type': 'text/plain' });
            res.end('Request Timeout');
        });
    
        postReq.write(data);
        postReq.end();
    }).listen(port, () => {
        console.log(`Server listening on port ${port}`);
    });
    public static async Task<string> ProcessConsent( )
    {
      string responseData = string.Empty;
    
      HttpClient httpClient = new HttpClient();
    
      /// Number Endpoint
      string apiUrl = "https://easypay5.com/APIcardProcREST/v1.0.0/ConsentAnnual/ProcPayment";
      
      // Here is your consentID and amount of purchase
      string jsonContent = "{\"ConsentID\": 1 ,\"ProcessAmount\": 52.00 }";
    
      HttpContent content = new StringContent( jsonContent, System.Text.Encoding.UTF8, "application/json");
      HttpResponseMessage response = new HttpResponseMessage();
    
      // add your session Key to Header
      httpClient.DefaultRequestHeaders.Add("SessKey", "8D85FD7E140A4098AB303330323241303430333238");
    
      try
      {
        response = await httpClient.PostAsync(apiUrl, content);
      }
      catch (Exception ee)
      {
        return "Exception : " + ee.Message;
      }
    
      if (response.IsSuccessStatusCode)
      {
        // Handle successful POST response
        responseData = await response.Content.ReadAsStringAsync();
      }
      else
      {
        // handle http error
        return "http error code " + response.StatusCode;
      }
    
    
      var saleResponse = Newtonsoft.Json.JsonConvert.DeserializeObject<dynamic>(responseData);
    
      var procPaymentResult = saleResponse.ConsentAnnual_ProcPaymentResult;
    
      // Here are some of the important values 
      bool FunctionOk = (bool)procPaymentResult.FunctionOk;
      bool TxApproved = (bool)procPaymentResult.TxApproved;
      int ErrCode = (int)procPaymentResult.ErrCode;
      string ErrMsg = (string)procPaymentResult.ErrMsg;
      string RespMsg = (string)procPaymentResult.RespMsg;
    
      int TxID = (int)procPaymentResult.TxID;
      string TxnCode = (string)procPaymentResult.TxnCode;
    
    
    
      //Check for Aspen Errors on cloud servers. If errors found log Error info and abort;
      if (!FunctionOk)
      {
        return "Aspen Error : " + ErrMsg + " : ErrorCode:" + ErrCode;
      }
    
      //check for card issuer decline 
      if (!TxApproved)
      {
        return "Declined Transaction : " + RespMsg + " : " + TxnCode;
      }
    
    
      return "Approved Transaction " + TxID.ToString() + " : Approval Code " + TxnCode;
    
    }
    'use strict';
    
    const http = require('http');
    const https = require('https');
    
    const port = process.env.PORT || 1337;
    
    http.createServer((req, res) => {
        let body = '';
    
    	const sessKey = '89C8356BB8A84FE9B5303231333441303331343335'
        const data = JSON.stringify({
            ConsentID: 1,
            ProcessAmount: 5.00
        });
    
        const options = {
            host: 'easypay5.com',
            port: 443,
            path: '/APIcardProcREST/v1.0.0/ConsentAnnual/ProcPayment',
            method: 'POST',
            timeout: 2000,
            headers: {
                'Content-Type': 'application/json',
                'Content-Length': Buffer.byteLength(data),
                'Accept': 'application/json',
                'SessKey': sessKey
            }
        };
    
        const postReq = https.request(options, (postRes) => {
            postRes.setEncoding('utf8');
    
            postRes.on('data', (chunk) => {
                body += chunk;
            });
    
            postRes.on('end', () => {
                try {
                    if (body === 'Bad Request') {
                        console.error('Bad request');
                        res.writeHead(400, { 'Content-Type': 'text/plain' });
                        res.end('Bad Request');
                        return;
                    }
    
                    const obj = JSON.parse(body);
    
                    if (!obj) {
                        console.error('Communication Error: Null Object');
                        res.writeHead(500, { 'Content-Type': 'text/plain' });
                        res.end('Communication Error: Null Object');
                        return;
                    }
    
                    const { ConsentAnnual_ProcPaymentResult } = obj;
    
                    if (!ConsentAnnual_ProcPaymentResult.FunctionOk) {
                        console.error(`${ConsentAnnual_ProcPaymentResult.ErrMsg} : ${ConsentAnnual_ProcPaymentResult.ErrCode}`);
                        res.writeHead(500, { 'Content-Type': 'text/plain' });
                        res.end(`${ConsentAnnual_ProcPaymentResult.ErrMsg} : ${ConsentAnnual_ProcPaymentResult.ErrCode}`);
                        return;
                    }
    
                    if (!ConsentAnnual_ProcPaymentResult.TxApproved) {
                        console.error(ConsentAnnual_ProcPaymentResult.RespMsg);
                        console.error(`Decline code: ${ConsentAnnual_ProcPaymentResult.TxnCode}`);
                        res.writeHead(402, { 'Content-Type': 'text/plain' });
                        res.end(`Declined: ${ConsentAnnual_ProcPaymentResult.RespMsg}`);
                        return;
                    }
    
                    console.log(`Successful Transaction: ${ConsentAnnual_ProcPaymentResult.RespMsg}`);
                    console.log(`Approval code: ${ConsentAnnual_ProcPaymentResult.TxnCode}`);
                    res.writeHead(200, { 'Content-Type': 'text/plain' });
                    res.end(`Success: ${ConsentAnnual_ProcPaymentResult.RespMsg}`);
                } catch (error) {
                    console.error('Error parsing response:', error);
                    res.writeHead(500, { 'Content-Type': 'text/plain' });
                    res.end('Internal Server Error');
                }
            });
        });
    
        postReq.on('error', (error) => {
            console.error('Request error:', error);
            res.writeHead(500, { 'Content-Type': 'text/plain' });
            res.end('Request Error');
        });
    
        postReq.on('timeout', () => {
            console.error('Request timed out');
            res.writeHead(504, { 'Content-Type': 'text/plain' });
            res.end('Request Timeout');
        });
    
        postReq.write(data);
        postReq.end();
    }).listen(port, () => {
        console.log(`Server listening on port ${port}`);
    });
    public static async Task TransactionVoid(string sessKey, int txID)
    {
      using HttpClient httpClient = new HttpClient();
      string apiUrl = "https://easypay5.com/APIcardProcREST/v1.0.0/CardSale/Void";
    
      string jsonContent = $$"""
        {"TxID":{{txID}}}
      """;
    
      HttpContent content = new StringContent(
        jsonContent, System.Text.Encoding.UTF8, "application/json");
      httpClient.DefaultRequestHeaders.Add("SessKey", sessKey);
      HttpResponseMessage response = await httpClient
        .PostAsync(apiUrl, content);
    
      if (!response.IsSuccessStatusCode)
      {
        MessageBox.Show("Error code: " + response.StatusCode);
        // <Insert your Logging function here>
        return;
      }
    
      var voidResponse = Newtonsoft.Json.JsonConvert
        .DeserializeObject<dynamic>(
          await response.Content.ReadAsStringAsync());
      var voidResult = voidResponse.Transaction_VoidResult;
    
      // Here are some of the important values 
      bool functionOk = (bool)voidResult.FunctionOk;
      int errCode = (int)voidResult.ErrCode;
      string errMsg = (string)voidResult.ErrMsg;
      string respMsg = (string)voidResult.RespMsg;
    
      bool txApproved = (bool)voidResult.TxApproved;
      int resultTxId = (int)voidResult.TxID;
    
      // Check for unexpected error on server
      if (!functionOk)
      {
        MessageBox.Show(errMsg + " ErrorCode: " + errCode);
        // <Insert your Logging function here>
        return;
      }
    
      // Check for declined transaction
      if (!txApproved)
      {
        MessageBox.Show(respMsg + " Decline Code: " + txnCode);
        // <Insert your Logging function here>
        return;
      }
      else
      {
        MessageBox.Show(respMsg + " Approval Code: " + txnCode);
        // <Insert your Logging function here>
        // <Do something with the response if needed>
        return;
      }
    }
    public static async Task TransactionCredit(
      string sessKey, int txID, decimal creditAmount)
    {
      using HttpClient httpClient = new HttpClient();
      string apiUrl = "https://easypay5.com/APIcardProcREST/v1.0.0/CardSale/ApplyCredit";
    
      string jsonContent = $$"""
        {"TxID":{{txID}},"CreditAmount":{{creditAmount}}}
      """;
    
      HttpContent content = new StringContent(
        jsonContent, System.Text.Encoding.UTF8, "application/json");
      httpClient.DefaultRequestHeaders.Add("SessKey", sessKey);
      HttpResponseMessage response = await httpClient
        .PostAsync(apiUrl, content);
    
      if (!response.IsSuccessStatusCode)
      {
        MessageBox.Show("Error code: " + response.StatusCode);
        // <Insert your Logging function here>
        return;
      }
    
      var creditResponse = Newtonsoft.Json.JsonConvert
        .DeserializeObject<dynamic>(
          await response.Content.ReadAsStringAsync());
      var creditResult = creditResponse.Transaction_ApplyCreditResult;
    
      // Here are some of the important values 
      bool functionOk = (bool)creditResult.FunctionOk;
      int errCode = (int)creditResult.ErrCode;
      string errMsg = (string)creditResult.ErrMsg;
      string respMsg = (string)creditResult.RespMsg;
    
      bool txApproved = (bool)creditResult.TxApproved;
      int resultTxId = (int)creditResult.TxID;
    
      // Check for unexpected error on server
      if (!functionOk)
      {
        MessageBox.Show(errMsg + " ErrorCode: " + errCode);
        // <Insert your Logging function here>
        return;
      }
    
      // Check for declined transaction
      if (!txApproved)
      {
        MessageBox.Show(respMsg + " Decline Code: " + txnCode);
        // <Insert your Logging function here>
        return;
      }
      else
      {
        MessageBox.Show(respMsg + " Approval Code: " + txnCode);
        // <Insert your Logging function here>
        // <Do something with the response if needed>
        return;
      }
    }
    public static async Task TransactionQuery(string sessKey, string query)
    {
      using HttpClient httpClient = new HttpClient();
      string apiUrl = "https://easypay5.com/APIcardProcREST/v1.0.0/Query/Transaction";
    
      string jsonContent = $$"""
        {"Query":"{{query}}"}
      """;
    
      HttpContent content = new StringContent(
        jsonContent, System.Text.Encoding.UTF8, "application/json");
      httpClient.DefaultRequestHeaders.Add("SessKey", sessKey);
      HttpResponseMessage response = await httpClient
        .PostAsync(apiUrl, content);
    
      if (!response.IsSuccessStatusCode)
      {
        MessageBox.Show("Error code: " + response.StatusCode);
        // <Insert your Logging function here>
        return;
      }
    
      var queryResponse = Newtonsoft.Json.JsonConvert
        .DeserializeObject<dynamic>(
          await response.Content.ReadAsStringAsync());
      var queryResult = queryResponse.Transaction_QueryResult;
    
      // Here are some of the important values 
      bool functionOk = (bool)queryResult.FunctionOk;
      int errCode = (int)queryResult.ErrCode;
      string errMsg = (string)queryResult.ErrMsg;
      string respMsg = (string)queryResult.RespMsg;
    
      // Check for unexpected error on server
      if (!functionOk)
      {
        MessageBox.Show(errMsg + " ErrorCode: " + errCode);
        // <Insert your Logging function here>
        return;
      }
    
      var transactions = queryResult.Transactions;
      
      // <Display your transactions here>
    }
    public static async Task ConsentGeneralQuery(string sessKey, string query)
    {
      using HttpClient httpClient = new HttpClient();
      string apiUrl = "https://easypay5.com/APIcardProcREST/v1.0.0/Query/ConsentGeneral";
    
      string jsonContent = $$"""
        {"Query":"{{query}}"}
      """;
    
      HttpContent content = new StringContent(
        jsonContent, System.Text.Encoding.UTF8, "application/json");
      httpClient.DefaultRequestHeaders.Add("SessKey", sessKey);
      HttpResponseMessage response = await httpClient
        .PostAsync(apiUrl, content);
    
      if (!response.IsSuccessStatusCode)
      {
        MessageBox.Show("Error code: " + response.StatusCode);
        // <Insert your Logging function here>
        return;
      }
    
      var queryResponse = Newtonsoft.Json.JsonConvert
        .DeserializeObject<dynamic>(
          await response.Content.ReadAsStringAsync());
      var queryResult = queryResponse.ConsentGeneral_QueryResult;
    
      // Here are some of the important values 
      bool functionOk = (bool)queryResult.FunctionOk;
      int errCode = (int)queryResult.ErrCode;
      string errMsg = (string)queryResult.ErrMsg;
      string respMsg = (string)queryResult.RespMsg;
    
      // Check for unexpected error on server
      if (!functionOk)
      {
        MessageBox.Show(errMsg + " ErrorCode: " + errCode);
        // <Insert your Logging function here>
        return;
      }
    
      var consents = queryResult.Consents;
    
      // <Display your consents here>
    }
    
    public static async Task ShowReceipt(
      string sessKey, int refID, int receiptType, int recipient)
    {
      /* ReceiptType 1 TRANSACTION RECEIPT
       * ReceiptType 2 VOID RECEIPT
       * ReceiptType 3 REFUND RECEIPT
       * ReceiptType 4 ANNUAL RECEIPT
       * ReceiptType 5 RECURRING RECEIPT
       * ReceiptType 6 SUBSCRIPTION RECEIPT
       
       * Recipient 1 MERCHANT COPY
       * Recipient 2 CUSTOMER COPY
       * Recipient 3 DUAL COPY */
    
    
      using HttpClient httpClient = new HttpClient();
      string apiUrl = "https://easypay5.com/APIcardProcREST/v1.0.0/Receipt/ReceiptGenerate";
    
      string jsonContent = $$"""
        {"REFID":{{refID}}, "ReceiptType":{{receiptType}}, "Recipient":{{recipient}}}
      """;
    
      HttpContent content = new StringContent(
        jsonContent, System.Text.Encoding.UTF8, "application/json");
      httpClient.DefaultRequestHeaders.Add("SessKey", sessKey);
      HttpResponseMessage response = await httpClient
        .PostAsync(apiUrl, content);
    
      if (!response.IsSuccessStatusCode)
      {
        MessageBox.Show("Error code: " + response.StatusCode);
        // <Insert your Logging function here>
        return;
      }
    
      var receiptResponse = Newtonsoft.Json.JsonConvert
        .DeserializeObject<dynamic>(
          await response.Content.ReadAsStringAsync());
      var receiptResult = receiptResponse.ReceiptGenerateResult;
    
      // Here are some of the important values 
      bool functionOk = (bool)receiptResult.FunctionOk;
      int errCode = (int)receiptResult.ErrCode;
      string errMsg = (string)receiptResult.ErrMsg;
      string respMsg = (string)receiptResult.RespMsg;
    
      // Check for unexpected error on server
      if (!functionOk)
      {
        MessageBox.Show(errMsg + " ErrorCode: " + errCode);
        // <Insert your Logging function here>
        return;
      }
    
      /* Receipt generation successful. 
       * You may now add the HTML to your page.
       * <Logic to display HTML, e.g. 
       *  webBrowser1.DocumentText = response.ReceiptHtml;> */
    }
    
    'use strict';
    
    const http = require('http');
    const https = require('https');
    
    const port = process.env.PORT || 1337;
    
    http.createServer((req, res) => {
        let body = '';
    
        // ReceiptType 1 TRANSACTION RECEIPT
        // ReceiptType 2 VOID RECEIPT
        // ReceiptType 3 REFUND RECEIPT
        // ReceiptType 4 ANNUAL CONSENT AGREEMENT
        // ReceiptType 5 RECURRING CONSENT AGREEMENT
        // ReceiptType 6 SUBSCRIPTION CONSENT AGREEMENT
        // Recipient 1 MERCHANT COPY
        // Recipient 2 CUSTOMER COPY
        // Recipient 3 DUAL COPY
    
        const data = JSON.stringify({
            REFID: 1,
            ReceiptType: 1,
            Recipient: 1
        });
    
        const options = {
            host: 'easypay5.com',
            port: 443,
            path: '/APIcardProcREST/v1.0.0/Receipt/ReceiptGenerate',
            timeout: 2000,
            method: 'POST',
            headers: {
                'Content-Type': 'application/json',
                'Content-Length': Buffer.byteLength(data),
                'Accept': 'application/json',
                'SessKey': '89C8356BB8A84FE9B5303231333441303331343335'
            }
        };
    
        const postReq = https.request(options, (postRes) => {
            let responseBody = '';
    
            postRes.on('data', (chunk) => {
                responseBody += chunk;
            });
    
            postRes.on('end', () => {
                try {
                    if (responseBody === 'Bad Request') {
                        console.error('Bad request');
                        res.writeHead(400, { 'Content-Type': 'text/plain' });
                        res.end('Bad Request');
                        return;
                    }
    
                    const obj = JSON.parse(responseBody);
    
                    if (!obj) {
                        console.error('Communication Error: Null Object');
                        res.writeHead(500, { 'Content-Type': 'text/plain' });
                        res.end('Communication Error: Null Object');
                        return;
                    }
    
                    const { ReceiptGenerateResult } = obj;
    
                    if (!ReceiptGenerateResult.FunctionOk) {
                        console.error(`${ReceiptGenerateResult.ErrMsg} : ${ReceiptGenerateResult.ErrCode}`);
                        res.writeHead(500, { 'Content-Type': 'text/plain' });
                        res.end(`${ReceiptGenerateResult.ErrMsg} : ${ReceiptGenerateResult.ErrCode}`);
                        return;
                    }
    
                    console.log(ReceiptGenerateResult.RespMsg);
                    const receiptHtml = ReceiptGenerateResult.ReceiptHtml;
                    res.writeHead(200, { 'Content-Type': 'text/html' });
                    res.end(receiptHtml);
                } catch (error) {
                    console.error('Error parsing response:', error);
                    res.writeHead(500, { 'Content-Type': 'text/plain' });
                    res.end('Internal Server Error');
                }
            });
        });
    
        postReq.on('error', (error) => {
            console.error('Request error:', error);
            res.writeHead(500, { 'Content-Type': 'text/plain' });
            res.end('Request Error');
        });
    
        postReq.on('timeout', () => {
            console.error('Request timed out');
            res.writeHead(504, { 'Content-Type': 'text/plain' });
            res.end('Request Timeout');
        });
    
        postReq.write(data);
        postReq.end();
    }).listen(port, () => {
        console.log(`Server listening on port ${port}`);
    });
    Requirements
    • Android 6.0 (API level 23) and above

    • Gradle 8.2 and above

    • Android Gradle Plugin 8.2.1

    • Kotlin 1.9.22 and above

    Configuration

    Add easypay to your dependencies in the build.gradle file.


    Get started

    Integration

    1

    Prerequisites - get API key, HMAC secret and optional Sentry DSN from Number.

    2
    3

    During initialization, the RSA certificate download begins. Proceeding with any call before downloading has finished will result with an exception RSA_CERTIFICATE_NOT_FETCHED.

    You can check the download status by accessing the following enum:

    Using widgets

    PaymentSheet

    Number's prebuilt payment UI component that allows you to collect credit card information in a secure way and process payments.

    1

    Initialize a PaymentSheet inside onCreate of your checkout Fragment or Activity, passing a method to handle the payment result.

    2

    When the customer taps the payment button, call present method on the PaymentSheet instance with your configuration. PaymentSheet.Configuration requires the following parameters:

    • AmountsParam - total $ amount of the payment;

    • ConsentCreatorParam - annual consent details, that contains the following:

      • limitLifeTime - the maximum $ amount that can be charged in total,

    Other parameters are optional.

    3

    Handle the payment result in the onPaymentSheetResult method.

    CustomerSheet

    Number's prebuilt UI component that lets your customers manage their saved credit cards.

    1

    Initialize a CustomerSheet inside onCreate of your checkout Fragment or Activity, passing a method to handle the customer sheet result.

    2

    To present the customer sheet, call the present method on the CustomerSheet instance, passing your configuration. CustomerSheet.Configuration requires the following parameters:

    • ConsentCreatorParam - annual consent details, that contains the following:

      • limitLifeTime - the maximum $ amount that can be charged in total,

      • limitPerCharge - the maximum $ amount that can be charged per transaction,

    Other parameters are optional.

    3

    Handle the customer sheet result in the onCustomerSheetResult method.

    Screenshots

    Save Card

    Manage Cards

    Store and Pay


    Common components

    SecureTextField component

    The SDK's widgets use a component called SecureTextField which ensures a safe input of credit card number. It is a subclass of TextInputEditText which enables freedom of styling as needed.

    SecureTextField supports only XML layout configuration:

    To get the SecureData from the SecureTextField, use the following property:

    Data in the SecureTextField component is already encrypted and can be used in the API calls without any additional encryption.


    Common objects

    Below you'll find code describing some of the objects that are commonly used in requests or responses. You can use it as a reference. The code includes parameter names, types, and some validation rules.

    SecureData

    Most commonly used as SecureData<String> coming from the SecureTextField component.

    CreditCardInfoParam

    AccountHolderDataParam

    AccountHolderBillingAddressParam

    EndCustomerDataParam

    EndCustomerBillingAddressParam

    AmountsParam

    PurchaseItemsParam

    ConsentCreatorParam


    Public methods in the Android SDK

    1. Charge credit card

    This method processes a credit card when the credit card details are entered manually. Details include the card number, expiration date, CVV, card holder name and address.

    REST API equivalent: Process a Card Sale Old

    Request parameters

    • ChargeCreditCardBodyParams

      • encryptedCardNumber: SecureData<String>

      • creditCardInfo: CreditCardInfoParam

      • accountHolder:

      • endCustomer: ?

      • amounts:

      • purchaseItems:

      • merchantId: Int

    Response body

    The response body will be serialized to ChargeCreditCardResult.

    2. List annual consents

    A query that returns annual consent details. Depending on the query sent, a single consent or multiple consents may be returned.

    REST API equivalent: Query Old

    Request parameters

    • ListAnnualConsentsBodyParams

      • merchantId: Int?

      • customerReferenceId: String?

      • rpguid: String?

      Either customerReferenceId or rpguid must be provided to get the list of consents of a specific customer.

    Response body

    The response body will be serialized to ListAnnualConsentsResult.

    And the AnnualConsent looks like the following:

    3. Create annual consent

    This method creates an annual consent by sending the credit card details, which include: card number, expiration date, CVV, and card holder contact data. It is not created by swiping the card through a reader device.

    REST API equivalent: Create Annual Consent

    Request parameters

    • CreateAnnualConsentBodyParams

      • encryptedCardNumber: SecureData<String>

      • creditCardInfo: CreditCardInfoParam

      • accountHolder:

      • endCustomer: ?

      • consentCreator:

    Response body

    The response body will be serialized to CreateAnnualConsentResult.

    4. Cancel annual consent

    Cancels an annual consent. Credit card data is removed from the system after the cancellation is complete.

    REST API equivalent: Consent Annual Older

    Request parameters

    • CancelAnnualConsentBodyParams

      • consentId: Int

    Response body

    The response body will be serialized to CancelAnnualConsentResult.

    5. Process payment for an annual consent

    This method uses the credit card stored on file to process a payment for an existing consent.

    REST API equivalent: Consent Annual Older

    Request parameters

    • ProcessPaymentAnnualBodyParams

      • consentId: Int

    Response body

    The response body will be serialized to ProcessPaymentAnnualResult.


    How to properly consume the API response

    All requests are suspended functions, so they should be called from coroutine scope. The result of the request is wrapped in a NetworkResource object, which can be handled in the following way:


    Possible exceptions

    EasyPaySdkException

    Exceptions that are thrown by the SDK.

    Exception name
    Suggested solution

    EASY_PAY_CONFIGURATION_NOT_INITIALIZED

    Check if EasyPay.init(...) method has been called.

    MISSED_SESSION_KEY

    Check if correct SESSION_KEY has been provided in the EasyPay.init(...) method.

    MISSED_HMAC_SECRET

    Check if correct HMAC_SECRET has been provided in the EasyPay.init(...) method.

    RSA_CERTIFICATE_NOT_FETCHED

    RSA certificate might not be fetched yet. Check the status by calling the EasyPayConfiguration.getInstance().getRsaCertificateFetchingStatus() method.

    RSA_CERTIFICATE_FETCH_FAILED

    Contact Number.

    RSA_CERTIFICATE_PARSING_ERROR

    Contact Number.

    EasyPayApiException

    Exceptions that are thrown by the Number API.


    Semantic versioning

    The SDK follows semantic versioning with a three-part version number: MAJOR.MINOR.PATCH.

    • MAJOR version is incremented when there are incompatible API changes,

    • MINOR version is incremented when functionality is added in a backwards-compatible manner,

    • PATCH version is incremented when there are backwards-compatible bug fixes.


    Feature flags

    Rooted device detection

    To enable rooted device detection, call the following method before calling EasyPay.init(...):

    iOS SDK integration guide
    EasyPayConfiguration.getInstance().getRsaCertificateFetchingStatus()
    import com.easypaysolutions.payment_sheet.PaymentSheet
    import com.easypaysolutions.payment_sheet.utils.PaymentSheetResult
    
    class PaymentSheetFragment : Fragment() {
        private lateinit var paymentSheet: PaymentSheet
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            paymentSheet = PaymentSheet(this, ::onPaymentSheetResult)
        }
        
        private fun onPaymentSheetResult(paymentSheetResult: PaymentSheetResult) {
            // implemented in the next steps
        }
    }
    import com.easypaysolutions.customer_sheet.CustomerSheet
    import com.easypaysolutions.customer_sheet.utils.CustomerSheetResult
    
    class CustomerSheetFragment : Fragment() {
        private lateinit var customerSheet: CustomerSheet
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            customerSheet = CustomerSheet(this, ::onCustomerSheetResult)
        }
        
        private fun onCustomerSheetResult(customerSheetResult: CustomerSheetResult) {
            // implemented in the next steps
        }
    }
    dependencies {
        implementation 'com.easypaysolutions:easypay:1.1.5'
        
        // If you want to use widgets, add the following line
        implementation 'com.easypaysolutions:easypay-widgets:1.1.5'
    }
    <com.easypaysolutions.utils.secured.SecureTextField
        ... />
    val secureData = secureTextField.secureData
    data class SecureData<T> internal constructor(
        val data: T,
    )
    data class CreditCardInfoParam(
        @ValidateNumberGreaterThanZero
        @ValidateLength(maxLength = 2)
        val expMonth: Int,
    
        @ValidateNumberGreaterThanZero
        @ValidateLength(maxLength = 4)
        val expYear: Int,
    
        @ValidateLength(maxLength = 4)
        @ValidateNotBlank
        val csv: String,
    )
    data class AccountHolderDataParam(
        @ValidateLength(maxLength = 75)
        @ValidateRegex(regex = FIRST_OR_LAST_NAME)
        val firstName: String? = null,
    
        @ValidateLength(maxLength = 75)
        @ValidateRegex(regex = FIRST_OR_LAST_NAME)
        val lastName: String? = null,
    
        @ValidateLength(maxLength = 100)
        @ValidateRegex(regex = COMPANY)
        val company: String? = null,
    
        val billingAddress: AccountHolderBillingAddressParam,
    
        @ValidateLength(maxLength = 150)
        @ValidateRegex(regex = EMAIL)
        val email: String? = null,
    
        @ValidateLength(maxLength = 16)
        @ValidateRegex(regex = ONLY_NUMBERS)
        val phone: String? = null,
    )
    data class AccountHolderBillingAddressParam(
        @ValidateLength(maxLength = 100)
        @ValidateRegex(regex = ADDRESS1)
        @ValidateNotBlank
        val address1: String,
    
        @ValidateLength(maxLength = 100)
        @ValidateRegex(regex = ADDRESS2)
        val address2: String? = null,
    
        @ValidateLength(maxLength = 75)
        @ValidateRegex(regex = CITY)
        val city: String? = null,
    
        @ValidateLength(maxLength = 75)
        @ValidateRegex(regex = COUNTRY_OR_STATE)
        val state: String? = null,
    
        @ValidateLength(maxLength = 20)
        @ValidateRegex(regex = ZIP_CODE)
        @ValidateNotBlank
        val zip: String,
    
        @ValidateLength(maxLength = 75)
        @ValidateRegex(regex = COUNTRY_OR_STATE)
        val country: String? = null,
    )
    data class EndCustomerDataParam(
        @ValidateLength(maxLength = 75)
        @ValidateRegex(regex = FIRST_OR_LAST_NAME)
        val firstName: String? = null,
    
        @ValidateLength(maxLength = 75)
        @ValidateRegex(regex = FIRST_OR_LAST_NAME)
        val lastName: String? = null,
    
        @ValidateLength(maxLength = 100)
        @ValidateRegex(regex = COMPANY)
        val company: String? = null,
    
        val billingAddress: EndCustomerBillingAddressParam,
    
        @ValidateLength(maxLength = 150)
        @ValidateRegex(regex = EMAIL)
        val email: String? = null,
    
        @ValidateLength(maxLength = 16)
        @ValidateRegex(regex = ONLY_NUMBERS)
        val phone: String? = null,
    )
    data class EndCustomerBillingAddressParam(
        @ValidateLength(maxLength = 100)
        @ValidateRegex(regex = ADDRESS1)
        val address1: String,
    
        @ValidateLength(maxLength = 100)
        @ValidateRegex(regex = ADDRESS2)
        val address2: String? = null,
    
        @ValidateLength(maxLength = 75)
        @ValidateRegex(regex = CITY)
        val city: String? = null,
    
        @ValidateLength(maxLength = 75)
        @ValidateRegex(regex = COUNTRY_OR_STATE)
        val state: String? = null,
    
        @ValidateLength(maxLength = 20)
        @ValidateRegex(regex = ZIP_CODE)
        val zip: String,
    
        @ValidateLength(maxLength = 75)
        @ValidateRegex(regex = COUNTRY_OR_STATE)
        val country: String? = null,
    )
    data class AmountsParam(
        @ValidateNumberGreaterThanZero
        val totalAmount: Double,
        val salesTax: Double? = null,
        val surcharge: Double? = null,
    )
    data class PurchaseItemsParam(
        @ValidateLength(maxLength = 200)
        @ValidateRegex(regex = SERVICE_DESCRIPTION)
        val serviceDescription: String? = null,
    
        @ValidateLength(maxLength = 75)
        @ValidateRegex(regex = CLIENT_REF_ID_OR_RPGUID)
        val clientRefId: String? = null,
    
        @ValidateLength(maxLength = 75)
        @ValidateRegex(regex = CLIENT_REF_ID_OR_RPGUID)
        val rpguid: String? = null,
    )
    data class ConsentCreatorParam(
        val merchantId: Int,
    
        @ValidateLength(maxLength = 200)
        @ValidateRegex(regex = RegexPattern.SERVICE_DESCRIPTION)
        val serviceDescription: String? = null,
    
        @ValidateLength(maxLength = 75)
        @ValidateRegex(regex = RegexPattern.CLIENT_REF_ID_OR_RPGUID)
        val customerReferenceId: String? = null,
    
        @ValidateLength(maxLength = 75)
        @ValidateRegex(regex = RegexPattern.CLIENT_REF_ID_OR_RPGUID)
        val rpguid: String? = null,
        val startDate: Date,
    
        @ValidateNumberGreaterThanZero
        val limitPerCharge: Double,
    
        @ValidateNumberGreaterThanZero
        val limitLifeTime: Double,
    )
    ChargeCreditCard().chargeCreditCard(params: ChargeCreditCardBodyParams): NetworkResource<ChargeCreditCardResult>
    data class ChargeCreditCardResult internal constructor(
        @SerializedName("FunctionOk")
        override val functionOk: Boolean,
    
        @SerializedName("ErrCode")
        override val errorCode: Int,
    
        @SerializedName("ErrMsg")
        override val errorMessage: String,
    
        @SerializedName("RespMsg")
        override val responseMessage: String,
    
        @SerializedName("TxApproved")
        override val txApproved: Boolean,
    
        @SerializedName("TxID")
        override val txId: Int,
    
        @SerializedName("TxnCode")
        override val txCode: String,
    
        @SerializedName("AVSresult")
        val avsResult: String,
    
        @SerializedName("AcquirerResponseEMV")
        val acquirerResponseEmv: String?,
    
        @SerializedName("CVVresult")
        val cvvResult: String,
    
        @SerializedName("IsPartialApproval")
        val isPartialApproval: Boolean,
    
        @SerializedName("RequiresVoiceAuth")
        val requiresVoiceAuth: Boolean,
    
        @SerializedName("ResponseApprovedAmount")
        val responseApprovedAmount: Double,
    
        @SerializedName("ResponseAuthorizedAmount")
        val responseAuthorizedAmount: Double,
    
        @SerializedName("ResponseBalanceAmount")
        val responseBalanceAmount: Double,
    )
    ListAnnualConsents().listAnnualConsents(params: ListAnnualConsentsBodyParams): NetworkResource<ListAnnualConsentsResult>
    data class ListAnnualConsentsResult internal constructor(
        @SerializedName("FunctionOk")
        override val functionOk: Boolean,
    
        @SerializedName("ErrCode")
        override val errorCode: Int,
    
        @SerializedName("ErrMsg")
        override val errorMessage: String,
    
        @SerializedName("RespMsg")
        override val responseMessage: String,
    
        @SerializedName("NumRecords")
        val numRecords: Int,
    
        @SerializedName("Consents")
        val consents: List<AnnualConsent>,
    )
    data class AnnualConsent internal constructor(
        @SerializedName("AcctHolderFirstName")
        val accountHolderFirstName: String,
    
        @SerializedName("AcctHolderID")
        val accountHolderId: Int,
    
        @SerializedName("AcctHolderLastName")
        val accountHolderLastName: String,
    
        @SerializedName("AcctNo")
        val accountNumber: String,
    
        @SerializedName("AuthTxID")
        val authTxId: Int,
    
        @SerializedName("CreatedBy")
        val createdBy: String,
    
        @SerializedName("CreatedOn")
        var createdOn: String,
    
        @SerializedName("CustID")
        val customerId: Int,
    
        @SerializedName("CustomerRefID")
        val customerReferenceId: String,
    
        @SerializedName("EndDate")
        var endDate: String,
    
        @SerializedName("ID")
        val id: Int,
    
        @SerializedName("IsEnabled")
        val isEnabled: Boolean,
    
        @SerializedName("LimitLifeTime")
        val limitLifeTime: Double,
    
        @SerializedName("LimitPerCharge")
        val limitPerCharge: Double,
    
        @SerializedName("MerchID")
        val merchId: Int,
    
        @SerializedName("NumDays")
        val numDays: Int,
    
        @SerializedName("RPGUID")
        val rpguid: String,
    
        @SerializedName("ServiceDescrip")
        val serviceDescription: String,
    
        @SerializedName("StartDate")
        var startDate: String,
    )
    CreateAnnualConsent().createAnnualConsent(params: CreateAnnualConsentBodyParams): NetworkResource<CreateAnnualConsentResult>
    data class CreateAnnualConsentResult internal constructor(
        @SerializedName("FunctionOk")
        override val functionOk: Boolean,
    
        @SerializedName("ErrCode")
        override val errorCode: Int,
    
        @SerializedName("ErrMsg")
        override val errorMessage: String,
    
        @SerializedName("RespMsg")
        override val responseMessage: String,
    
        @SerializedName("ConsentID")
        val consentId: Int,
    
        @SerializedName("CreationSuccess")
        val creationSuccess: Boolean,
    
        @SerializedName("PreConsentAuthMessage")
        val preConsentAuthMessage: String,
    
        @SerializedName("PreConsentAuthSuccess")
        val preConsentAuthSuccess: Boolean,
    
        @SerializedName("PreConsentAuthTxID")
        val preConsentAuthTxId: Int,
    )
    CancelAnnualConsent().cancelAnnualConsent(params: CancelAnnualConsentBodyParams): NetworkResource<CancelAnnualConsentResult>
    data class CancelAnnualConsentResult internal constructor(
        @SerializedName("FunctionOk")
        override val functionOk: Boolean,
    
        @SerializedName("ErrCode")
        override val errorCode: Int,
    
        @SerializedName("ErrMsg")
        override val errorMessage: String,
    
        @SerializedName("RespMsg")
        override val responseMessage: String,
    
        @SerializedName("CancelSuccess")
        val cancelSuccess: Boolean,
    
        @SerializedName("CancelledConsentID")
        val cancelledConsentId: Int,
    )
    ProcessPaymentAnnual().processPaymentAnnual(params: ProcessPaymentAnnualBodyParams): NetworkResource<ProcessPaymentAnnualResult>
    data class ProcessPaymentAnnualResult internal constructor(
        @SerializedName("FunctionOk")
        override val functionOk: Boolean,
    
        @SerializedName("ErrCode")
        override val errorCode: Int,
    
        @SerializedName("ErrMsg")
        override val errorMessage: String,
    
        @SerializedName("RespMsg")
        override val responseMessage: String,
    
        @SerializedName("TxApproved")
        override val txApproved: Boolean,
    
        @SerializedName("TxID")
        override val txId: Int,
    
        @SerializedName("TxnCode")
        override val txCode: String,
    
        @SerializedName("AVSresult")
        val avsResult: String,
    
        @SerializedName("AcquirerResponseEMV")
        val acquirerResponseEmv: String?,
    
        @SerializedName("CVVresult")
        val cvvResult: String,
    
        @SerializedName("IsPartialApproval")
        val isPartialApproval: Boolean,
    
        @SerializedName("RequiresVoiceAuth")
        val requiresVoiceAuth: Boolean,
    
        @SerializedName("ResponseApprovedAmount")
        val responseApprovedAmount: Double,
    
        @SerializedName("ResponseAuthorizedAmount")
        val responseAuthorizedAmount: Double,
    
        @SerializedName("ResponseBalanceAmount")
        val responseBalanceAmount: Double,
    )
    viewModelScope.launch {
        // Example of suspended function call
        val result = ChargeCreditCard().chargeCreditCard(params)
        when (result) {
            is NetworkResource.Status.SUCCESS -> {
                // Handle success
            }
            is NetworkResource.Status.ERROR -> {
                // Handle error
            }
            is NetworkResource.Status.DECLINED -> {
                // Handle declined
            }
        }
    }
    EasyPayFeatureFlagManager.setRootedDeviceDetectionEnabled(true)

    limitPerCharge - the maximum $ amount that can be charged per transaction,

  • merchantId - the ID of the merchant that the consent is created for,

  • startDate - the date when the consent is created,

  • customerReferenceId or consentId to identify the customer.

  • merchantId - the ID of the merchant that the consent is created for,

  • startDate - the date when the consent is created,

  • customerReferenceId or consentId to identify the customer.

  • AccountHolderDataParam
    EndCustomerDataParam
    AmountsParam
    PurchaseItemsParam
    AccountHolderDataParam
    EndCustomerDataParam
    ConsentCreatorParam
    // ...
    import com.easypaysolutions.repositories.annual_consent.create.ConsentCreatorParam
    import com.easypaysolutions.repositories.charge_cc.AmountsParam
    
    class PaymentSheetFragment : Fragment() {
        // ...
        
        private fun presentPaymentSheet() {
            val totalAmount: Double = 1000.0
            val consentCreator = ConsentCreatorParam(
                limitLifeTime = 100000.0,
                limitPerCharge = 1000.0,
                merchantId = 1,
                startDate = Date(),
                customerReferenceId = "CUSTOMER_REFERENCE_ID"
            )
        
            val config = PaymentSheet.Configuration
                .Builder()
                .setAmounts(AmountsParam(totalAmount))
                .setConsentCreator(consentCreator)
                .build()
                
            paymentSheet.present(config)
        }
    }
    // ...
    class PaymentSheetFragment : Fragment() {
        // ...
        
        private fun onPaymentSheetResult(paymentSheetResult: PaymentSheetResult) {
            when (paymentSheetResult) {
                is PaymentSheetResult.Failed -> {
                    // Handle failure
                }
        
                is PaymentSheetResult.Completed -> {
                    // Handle successful payment
                }
        
                is PaymentSheetResult.Canceled -> {
                    // Handle cancellation
                }
            }
        }
    }
    // ...
    import com.easypaysolutions.repositories.annual_consent.create.ConsentCreatorParam
    
    class CustomerSheetFragment : Fragment() {
        // ...
        
        private fun presentCustomerSheet() {
            val consentCreator = ConsentCreatorParam(
                limitLifeTime = 100000.0,
                limitPerCharge = 1000.0,
                merchantId = 1,
                startDate = Date(),
                customerReferenceId = "CUSTOMER_REFERENCE_ID"
            )
        
            val config = CustomerSheet.Configuration
                .Builder()
                 .setConsentCreator(consentCreator)
                .build()
                
            customerSheet.present(config)
        }
    }
    // ...
    class CustomerSheetFragment : Fragment() {
        // ...
        
        private fun onCustomerSheetResult(customerSheetResult: CustomerSheetResult) {
            when (customerSheetResult) {
                is CustomerSheetResult.Failed -> {
                    // Handle failure
                }
    
                is CustomerSheetResult.Selected -> {
                    // Handle selected card - customerSheetResult.annualConsentId
                }
            }
        }
    }
    Response codes
    Decline codes

    First Data Testing

    Cards for testing, response code reference, and penny codes for First Data.

    Test Cards

    You can use the below cards for testing with First Data.

    Visa

    4005 5200 0000 0939

    MasterCard

    To get AVS and CVV match use the following:

    Address - 1307 Broad Hollow Road

    Zip - 11747

    CVV - 123

    CVV FOR AMEX - 1234


    Response codes

    Below you'll find a reference list to every possible response code value.

    Response code
    Description

    Generating declines

    When using the test cards below, transactions above $100.00 will receive a response with a specific decline code. The transaction amount sent in the transaction request message is used to determine which error response code will be received in your response.

    To request an error response code, the last three digits of the transaction amount should be the response code you wish to receive. For example, a transaction amount of $101.16 will return a response with the response code of 116.

    Card Brand
    Number
    CVV


    Partial authorization

    Partial auth test cards

    To test a partial authorization, use these cards and request values:

    Card brand
    Card number
    EXP date
    CVV
    Request
    Partial approval

    Address Verification Services

    To receive a FULL AVS AND CVV MATCH, please use the following address, zip code, card numbers and CVV:

    ADDRESS: 1307 Broad Hollow Road ZIP: 11747

    Global Payments Testing

    Cards for testing, response code reference, and penny codes for Global Payments.

    Test cards

    You can use the cards below to receive a full CVV match during testing.

    Card brand
    Card number
    EXP Date
    CVV

    102

    Suspected fraud

    103

    Unable to process TeleCheck recurring transaction with this payment type (not associated with insufficient or uncollected funds)

    104

    Restricted card

    105

    Call acquirer's security department

    106

    Allowable PIN tries exceeded

    107

    Call for authorization

    108

    Refer to issuer's special conditions

    109

    Invalid merchant. The merchant is not in the merchant database or the merchant is not permitted to use this particular card

    110

    Invalid amount

    111

    Invalid Host Totals Date

    112

    DES Encryption not allowed from the device / terminal

    113

    Host Totals are Incomplete

    114

    Invalid account type

    116

    Not sufficient funds

    117

    Incorrect PIN or PIN length error

    118

    No card record

    119

    Transaction not permitted to cardholder

    120

    Transaction not permitted to terminal

    121

    Exceeds withdrawal amount limit

    122

    Security violation

    123

    Exceeds withdrawal frequency limit

    124

    Violation of law

    129

    Suspected counterfeit card

    130

    Invalid terminal

    131

    Invalid account number

    132

    Unmatched card expiry date

    133

    The TPP ID was not found

    134

    Not sufficient funds

    150

    Invalid merchant set up

    151

    Activation failed

    152

    Exceeds limit

    153

    Already redeemed

    154

    Over monthly limit

    155

    Recharge amount exceeded

    156

    Max number of recharges exceeded

    157

    Invalid entry

    208

    Lost Card / Lost Check

    209

    Stolen card

    211

    Invalid SKU number.

    212

    Missing conditional data.

    213

    Invalid account number for card type.

    214

    Invalid payment type/card type for merchant ID.

    215

    Invalid transaction for Merchant ID.

    216

    Invalid TransArmor request. Not supported for given Payment Type, or Merchant is not enabled for Transarmor

    217

    Missing or invalid secure payment data.

    218

    Merchant ID not enabled for Secure Code.

    219

    Invalid Merchant Category Code

    220

    Customer service phone number missing.

    221

    Merchant not enabled for soft descriptors, account updater or optimization processing.

    222

    Partial auth not allowed.

    223

    Customer under 18 years old.

    224

    Account blocked – possible compromise.

    225

    Bill-to address does not match ship-to.

    226

    Invalid preapproval number.

    227

    Invalid email address.

    228

    Need more ID – request full SSN.

    229

    Previously declined/closed account.

    230

    One time stop payment requested by cardholder.

    231

    Stop payment requested for all payments.

    232

    Stop all payments – account closed.

    233

    Auth response date not valid.

    234

    Issuance under minimum amount.

    235

    Outstanding auth – funds on hold.

    236

    Activation amount incorrect.

    237

    Deny – new card issued.

    238

    BIN blocked.

    242

    Customer opt-out.

    243

    Institution does not accept ACH payments.

    244

    Original transaction not approved.

    245

    Invalid MICR data.

    246

    Declined due to high risk.

    247

    Declined due to stand-in rules.

    248

    Conditional Approval – Hold shipping for 24 hours

    250

    Re-authorization request is declined. Original Auth could not be found.

    251

    Re-authorization request is declined. The customer account number, merchant id, or amount did not match the original authorization.

    252

    Re-authorization request is declined. The amount significantly exceeds the original request amount.

    253

    Re-authorization request is declined. The timeframes for re-authorization have been exceeded.

    254

    Counter Offer to Supply Personal Guaranty.

    300

    Invalid EAN or SCV.

    301

    Lock has expired on prepaid card.

    302

    Account closed. The account was closed, probably because the account balance was $0.00

    303

    Unknown account. The account could not be located or the account does not exist in the account table

    304

    Inactive account. The account has not been activated by an approved location

    308

    Already active. The card is already active and does not need to be reactivated

    311

    Not lost or stolen

    315

    Bad mag stripe. The mag stripe could not be parsed for account information

    316

    Incorrect location. There was a problem with the merchant location

    317

    Max balance exceeded. The transaction, if completed, would cause the account balance to be exceeded by the max_balance as specified in the promotion. Some merchants set the max_balance to a value twice the max transaction amount

    318

    Invalid amount. There was a problem with the amount field in the transaction format – more or less than min/max amounts specified in the promotion for that transaction

    319

    Invalid clerk. The clerk field was either missing, when required, or the content did not match the requirements

    320

    Invalid password

    321

    Invalid new password. The new password does not meet the minimum security criteria

    322

    Exceeded account reloads. The clerk/user/location was only permitted to reload some number of accounts. That number was exceeded. (See your Business Manager in order to extend this limit.)

    323

    Password retry exceeded. The user account has been frozen because the user attempted access and was denied. Seek management assistance

    326

    Incorrect transaction version or format number for POS transactions

    327

    Request not permitted by this account

    328

    Request not permitted by this merchant location

    329

    Bad_repay_date

    330

    Bad checksum. The checksum provided is incorrect

    331

    Balance not available (denial). Due to an internal Fiserv Prepaid Closed Loop issue, information from this account could not be retrieved

    332

    Account locked

    333

    No previous transaction. The void or reversal transaction could not be matched to a previous (original) transaction. In the case of a redemption, the corresponding locking transaction could not be identified

    334

    Already reversed

    336

    Bad Authorization ID. The Authorization ID test failed

    337

    Too many transactions requested

    338

    No transactions available/no more transactions available. There are no transactions for this account or there are no transactions as determined by the specified first transaction number

    339

    Transaction history not available

    340

    New password required

    341

    Invalid status change. The status change requested (e.g. lost/stolen, freeze active card) cannot be performed

    342

    Void of activation after account activity

    343

    No phone service. Attempted a calling card transaction on an account which is not configured for calling card activity

    344

    Internet access disabled

    345

    Invalid Date or Time

    350

    Additional customer authentication required or, Customer Authentication Required (Decline – Discover only)

    351

    Customer PIN authentication required

    355

    Invalid currency. The provided currency is invalid.

    356

    Currency Not Supported

    357

    Currency conversion error

    359

    The terminal transaction number did not match (on a void or reversal).

    367

    Target embossed card entered and Transaction count entered do not match

    368

    No account link

    369

    Invalid time zone

    370

    Account on hold or subscriber not active

    372

    Promo location restricted

    373

    Invalid Card Account

    374

    Product code(s) restricted

    375

    Bad Post Date. The Post Date is not a valid date.

    376

    Account status is void lock

    377

    Already active and reloadable

    378

    Account is Purged. The Account record was purged from the database.

    380

    Bulk activation error

    381

    Bulk activation un-attempted error

    382

    Bulk activation package amount error

    383

    Store location zero not allowed

    384

    Account row locked

    385

    Accepted but not yet processed

    402

    TransArmor Service Unavailable

    403

    TransArmor Invalid Token or Account Number

    404

    TransArmor Key Error

    414

    Void/Full Reversal request unable to process due to network cut-off window elapsed. A Refund transaction is necessary to reconcile the cardholder’s account. Applicable to Debit networks only.

    430

    Prepaid Card Amount Over EU AMLD (Anti-Money Laundering Directive) Limit

    500

    Decline

    501

    Date of Birth Error for Check Processing

    502

    Invalid State Code

    503

    New Account Information

    504

    Do not try again

    505

    Please retry

    506

    Invalid Checking Account Number

    507

    New Account Information available

    508

    Try again later – Declined: Association‘s payment cancellation advice code provided. Applies to recurring authorizations only. These are examples of what may have occurred: the account is over the credit limit try again in 72 hours.

    509

    Do not try again – Applies to recurring authorizations only. The card has expired

    510

    New Account Information – Applies to recurring authorizations only. The card has expired.

    511

    Try again later – Applies to recurring authorizations only. The card has expired. Get the new expiration date and try again.

    512

    Service not allowed or invalid surcharge amount

    513

    Decline. Transaction not permitted to acquirer or terminal.

    514

    Do not try again – Applies to recurring authorizations only. There was security violation.

    515

    Declined. No term record on Fiserv system

    516

    Please retry – Reasons for this error are one of the following: Format Error, Unable to route transaction, Switch or issuer unavailable, System Busy, Timeout

    517

    CVV2 Declined

    518

    Invalid account/date or sales date in future

    519

    Invalid Effective Date

    520

    Reversal Rejected. Do not try again.

    521

    Enter lesser amount

    522

    Cash Back greater than total Transaction amount

    523

    Crypto box is offline

    524

    Debit Switch unavailable Timeout Retry – Communications link to debit/EBT network gateway is down or responded with a “System Malfunction (96)” message.

    525

    Debit/EBT network gateway cannot get through to the ISSUER.

    526

    Undefined Card – Debit/EBT network gateway cannot route card based on Merchant Entitlement

    527

    Network Response indicates that Merchant ID / SE is invalid

    528

    Debit/EBT transaction count exceeds pre-determined limit in specified time/ Withdrawal limit exceeded.

    529

    Resubmission of transaction violates debit/EBT network frequency

    530

    The authorizing network has a problem decrypting the cryptogram in the request

    531

    Retry with 3DS data

    532

    The DUKPT Base Derivation key is missing or incorrect in the PIN pad, PIN key synchronization error, or Master session PIN key is missing.

    533

    Invalid encryption key offset sent by merchant

    534

    Invalid master session key id sent by merchant

    539

    No Checking Account

    540

    Edit Honor

    541

    No Savings Account

    542

    DUKPT: An error while processing the PIN block that is not related to the point-of-sale equipment. Contact the Help Desk for assistance.

    550

    Invalid Vehicle

    551

    Invalid Driver

    552

    Invalid Product

    553

    Exceeds transaction total limit per product class.

    554

    Over daily limit

    555

    Invalid Date/Time

    556

    Exceeds quantity

    557

    Invalid prompt entry

    558

    Invalid Track 2 data

    559

    Voyager ID problem

    560

    Invalid Odometer

    561

    Invalid Restriction Code

    562

    Pay at pump not allowed

    563

    Over fuel limit

    564

    Over cash limit

    565

    Fuel price error

    566

    Y or N required

    567

    Over repair limit

    568

    Over additive limit

    569

    Invalid user

    570

    Before 1400 and can't cut. Wait until 2:00 pm Eastern.

    571

    Cut time too close to 1400

    572

    Checker/Manager not found

    573

    Security insufficient

    574

    No transaction security record

    575

    Insufficient data

    576

    Merchant has mail pending

    577

    No messages pending

    578

    The Visa OCT / MasterCard MoneySend activity has exceeded preset transaction count or amount limit within a rolling 24-hour period for given merchant.

    579

    The Visa OCT / MasterCard MoneySend activity has exceeded preset transaction count or amount limit within a rolling 7-day period for given merchant.

    580

    The Visa OCT / MasterCard MoneySend activity has exceeded preset transaction count or amount limit within a rolling 30-day period for given merchant.

    581

    The Visa OCT / MasterCard MoneySend Funding activity has exceeded preset transaction count or amount limit within a rolling 24- hour period for this account number.

    582

    The Visa OCT / MasterCard MoneySend Funding activity has exceeded preset transaction count or amount limit within a rolling 7- day period for this account number.

    583

    The Visa OCT / MasterCard MoneySend Funding activity has exceeded preset transaction count or amount limit within a rolling 30- day period for this account number.

    584

    The Visa OCT / MasterCard MoneySend Payment activity has exceeded preset transaction count or amount limit within a rolling 24- hour period for this account number.

    585

    The Visa OCT / MasterCard MoneySend Payment activity has exceeded preset transaction count or amount limit within a rolling 7- day period for this account number.

    586

    The Visa OCT / MasterCard MoneySend Payment activity has exceeded preset transaction count or amount limit within a rolling 30- day period for this account number.

    587

    The single transaction amount limit was exceeded for a Visa OCT/ MasterCard MoneySend transaction for given merchant.

    588

    All Visa OCT / MasterCard MoneySend transactions are blocked for a rolling 24 hour period, or 7 day period (current and prior 6 days), or 30 day period (current and prior 29 days) for given merchant.

    601

    Invalid Batch Number/ Invalid Batch ID or Invalid OpenBatch

    602

    No Open Batch

    603

    Close Unavailable

    604

    Close Not Valid

    701

    Approved EMV Key Load

    702

    EMV Key Download Error

    703

    Approved EMV Key Load, more key load data pending

    704

    Pick Up Card

    708

    Honor With Authentication

    721

    Invalid ZIP Code

    722

    Invalid value in the field / Host Totals Declined

    723

    Driver's License or ID is Required

    724

    Referred – Not Active

    726

    Unable to Locate Record On File

    727

    Refer – Call Authorization

    728

    Referred – Skip Trace Info

    729

    Hard Negative Info On File

    731

    Rejected Lost/Stolen Checks

    740

    Totals Unavailable

    767

    Hard Capture; Pick Up

    771

    Amount Too Large

    772

    Duplicate Return

    773

    Unsuccessful

    774

    Duplicate Reversal

    775

    Subsystem Unavailable

    776

    Duplicate Completion

    782

    Count Exceeds Limit

    785

    No reason to decline– applicable to $0.00 verification requests and may be returned on Online Refund responses. Should be treated as an approval.

    790

    Not approved. Used only in Visa bill/recurring payment. Merchant must not resubmit same transaction but may continue billing process in subsequent billing period.

    791

    Not approved. Used only in Visa bill/recurring payment. Merchant must stop recurring payment requests.

    792

    See attendant.

    800

    Deferred authorization not cancelled 801 Over merchandise limit

    802

    Imprint card

    803

    Not on file

    804

    Fuel only

    805

    Velocity exceeded

    806

    Authorization ID needed

    807

    Over non-fuel limit

    808

    Invalid location

    809

    Over card velocity count

    810

    Over card velocity amount

    811

    Over issuer velocity count

    812

    Over issuer velocity amount

    813

    Over merchant daily velocity count

    814

    Over merchant daily velocity amount

    815

    Over merchant daily velocity both

    816

    Over merchant product velocity amount

    817

    Over merchant product velocity count

    818

    Over merchant product velocity both

    819

    Over chain daily velocity count

    820

    Over chain daily velocity amount

    821

    Over chain daily velocity both

    822

    Over chain product velocity count

    823

    Over chain product velocity both

    824

    Over chain product velocity amount

    825

    No chain ID for chain merchant

    826

    Signature required

    827

    Velocity exception error – pay inside

    828

    Exceeds merchant count for period – pay inside

    829

    Exceeds merchant amount for period – pay inside

    830

    Exceeds merchant count and amount for period – pay inside

    831

    Exceeds zip code count for period – pay inside

    832

    Exceeds zip code amount for period – pay inside

    833

    Exceeds zip code count and amount for period – pay inside

    834

    Exceeds state count for period – pay inside

    835

    Exceeds state amount for period – pay inside

    836

    Exceeds state count and amount for period – pay inside

    837

    Exceeds global count for period – pay inside

    838

    Exceeds global amount for period – pay inside

    839

    Exceeds global count and amount for period – pay inside

    840

    Unknown velocity error – pay inside

    902

    Invalid transaction. This merchant, card or terminal is not permitted to perform this transaction, or the transaction type is invalid, or Fiserv is unable to route a refund request to the network, or there is an issue with the xml message.

    If a 902 is returned when submitting a completion for the second time, the first completion submitted has been successfully applied, even if the device did not receive a response in the first completion.

    903

    Invalid Reversal Transaction – transaction already settled

    904

    Format error.

    905

    Unsupported message. Transaction was rejected. Call your helpdesk or operations support.

    906

    System Error. There is a problem with the host processing system. Call your helpdesk or operations support.

    907

    Card issuer or switch inoperative or processor not available

    908

    Transaction destination not found for routing.

    909

    System malfunction or timeout

    911

    Card issuer timed out.

    913

    Duplicate transaction.

    914

    Void/Full Reversal request unable to process due to settlement already occurred. A Refund transaction may be necessary to reconcile the cardholder's account.

    915

    Timeout Reversal not supported. Resend the original transaction with the same Reference Number that timed out. Do not retry the timeout reversal

    916

    Void/Full Reversal request unable to process since the Original Authorization was not found.

    920

    Security H/W or S/W error – try again

    921

    Security H/W or S/W error – no action

    923

    Request in progress

    924

    Limit check failed

    940

    Error.

    941

    Invalid issuer.

    942

    Customer cancellation

    944

    Invalid response

    950

    Violation of business arrangement

    954

    CCV failed.

    958

    CCV2 failed

    959

    CAV failed

    963

    Acquirer channel unavailable

    American Express

    371030089111338

    1234

    Diners Club

    36185900011112

    123

    $612.64

    $306.32

    5405 0011 1111 1116

    Discover

    6011 2087 0111 1117

    Amex

    3759 8765 4111 116

    000

    Approve

    001

    Schema Validation Error

    002

    Approve for partial amount

    003

    Approve VIP

    100

    Do not honor

    101

    Expired card

    Visa

    4005571702222222

    123

    Pin Debit

    4017779991113335

    123

    MasterCard

    5137221111116668

    123

    Discover

    6011208701117775

    123

    6011 2087 0333 1119

    12/28

    -

    $1169.10

    $584.55

    4005 5717 0222 2222

    12/28

    Visa

    4005 5200 0000 0939

    123

    MasterCard

    5405 0011 1111 1116

    123

    Discover

    6011 2087 0111 1117

    123

    Amex

    3759 8765 4111 116

    1234

    -

    Track Data

    4012 0000 9876 5439

    12/28

    999

    %B4012000098765439^TSYS PAYMENT^25121011796251900000?;4012000098765439=25121011796251900000?

    4012 8818 8881 8888

    12/28

    999

    %B4012881888818888^TSYS PAYMENT^25121011796251900000?;4012881888818888=25121011796251900000?

    5146 3150 0000 0055

    12/28

    998

    %B5146315000000055^TSYS PAYMENT^251210100000?;5146315000000055=251210100000?

    5146 3122 0000 0035


    Penny codes

    When using previously specified test cards, you can test for all various types of responses using the following penny codes. Each penny code specifies the request value for a specific response.

    You may use test cards in conjunction with penny codes to confirm that your application handles all different types of response codes correctly.

    Request value
    Response code
    Response text

    $0.00

    85

    Card Ok

    $0.01

    01

    Call Issuer

    $0.02

    02

    Call Issuer, Special Cond.

    $0.03

    Request value
    Response code
    Response text
    Request value
    Response code
    Response text
    Request value
    Response code
    Response text


    AVS responses

    Below you'll find a reference list to every possible Address Verification Service (AVS) response value.

    Response Code
    Customer zip
    Response text

    Z

    85284

    Zip Match

    U

    99999

    Ver Unavailable

    G

    99998

    Ver Unavailable

    B

    999970001

    To receive a full AVS and CVV match, please use the following test card and address:

    Card brand
    Card number
    EXP Date
    CVV
    Address
    Zip code

    4012 0000 9876 5439

    12/28

    999

    8320

    85284


    Partial authorization

    Partial auth test cards

    To test partial authorization, use these cards and request values:

    Card brand
    Card number
    EXP date
    CVV
    Request
    Partial approval

    6011 0009 9302 6909

    01/28

    999

    $10.10

    $10.00

    5146 3126 2000 0045

    01/28


    Decline codes

    Below you'll find a reference list to every possible decline code value.

    Response code
    Authorization response
    Response definition

    00

    APPROVAL

    Approved and completed

    01

    CALL

    Refer to issuer

    02

    CALL

    Refer to issuer - Special condition

    03

    TERM ID ERROR

    $0.14

    14

    Invalid Account

    $0.29

    54

    Expired Card

    $0.30

    92

    Invalid Routing

    $0.31

    12

    Invalid Transaction

    $0.39

    15

    No Such Issuer

    $32.85

    08

    Honor With ID

    CID Format Error

    $0.19

    80

    No Financial Impact

    $0.20

    05

    Decline

    $0.29

    54

    Expired Card

    $0.44

    58

    Serv Not Allowed

    $1.00

    00

    Approved and completed

    $1.01

    00

    Approved and completed

    $1.02

    11

    VIP approval

    $1.03

    08

    Honor MasterCard with ID

    $1.04

    03

    Invalid Merchant ID

    $1.05

    01

    Refer to issuer

    $1.06

    01

    Refer to issuer

    $1.07

    05

    Do not honor

    $1.08

    05

    Do not honor

    $1.09

    03

    Invalid Merchant ID

    $1.10

    06

    General error

    $1.11

    75

    Allowable number of PIN-entry tries exceeded

    $1.12

    55

    Incorrect PIN

    $1.13

    57

    Transaction not permitted - Card

    $1.14

    96

    System malfunction

    $1.15

    91

    Issuer or switch unavailable

    $12.00

    00

    Approved and completed

    $15.00

    10

    Partial approval for the authorized amount returned in Group III version 022

    $10.05

    05

    Do not honor

    $10.07

    07

    Pick up card, special condition (fraud account)

    $10.08

    06

    General error

    $10.10

    10

    Partial approval for the authorized amount returned in Group III version 022

    $10.11

    00

    Approved and completed

    $10.12

    12

    Invalid transaction

    $10.13

    13

    Invalid amount

    $10.14

    14

    Invalid card number

    $10.15

    06

    General error

    $10.19

    19

    Re-enter transaction

    $10.30

    30

    Transaction was improperly formatted

    $10.31

    15

    No such issuer

    $10.33

    06

    General error

    $10.34

    06

    General error

    $10.35

    06

    General error

    $10.36

    06

    General error

    $10.37

    06

    General error

    $10.38

    75

    Allowable number of PIN-entry tries exceeded

    $10.39

    39

    No credit account

    $10.40

    12

    Invalid transaction

    $10.41

    41

    Lost card, pick up (fraud account)

    $10.43

    43

    Stolen card, pick up (fraud account)

    $10.51

    05

    Do not honor

    $10.53

    53

    No savings account

    $10.54

    54

    Expired card

    $10.55

    55

    Incorrect PIN

    $10.56

    14

    Invalid card number

    $10.57

    57

    Transaction not permitted - Card

    $10.58

    58

    Transaction not permitted - Terminal

    $10.59

    05

    Do not honor

    $10.60

    01

    Refer to issuer

    $10.61

    61

    Exceeds approval amount limit

    $10.62

    62

    Invalid service code, restricted

    $10.63

    63

    Security violation

    $10.66

    77

    Inconsistent, reversed or repeat data

    $10.65

    65

    Exceeds withdrawal frequency limit

    $10.66

    01

    Refer to issuer

    $10.67

    04

    Pick up card (no fraud)

    $10.68

    06

    General error

    $10.67

    04

    Pick up card (no fraud)

    $10.68

    06

    General error

    $10.75

    75

    Allowable number of PIN-entry tries exceeded

    $10.76

    14

    Invalid card number

    $10.77

    14

    Invalid card number

    $10.78

    14

    Invalid card number

    $10.79

    85

    No reason to decline

    $10.87

    91

    Issuer or switch unavailable

    $10.91

    91

    Issuer or switch unavailable

    $10.92

    92

    Destination not found

    $10.93

    93

    Violation, cannot complete

    $10.94

    94

    Unable to locate, no match

    $10.96

    96

    System malfunction

    $10.97

    D3

    Transaction failure due to missing or invalid 3D-Secure cryptogram

    12/28

    998

    %B5146312200000035^TSYS PAYMENT^251210100000?;5146312200000035=251210100000?

    5146 3126 2000 0045

    12/28

    998

    %B5146312620000045^TSYS PAYMENT^251210100000?;5146312620000045=251210100000?

    3714 4963 5392 376

    12/28

    9997

    %B371449635392376^TSYS PAYMENT^251210100000?;371449635392376=251210100000?

    6011 0009 9302 6909

    12/28

    996

    %B6011000993026909^TSYS PAYMENT^251210100000?;6011000993026909=251210100000?

    28

    File Temp. Unavailable

    $0.04

    91

    Issuer Unavailable or Inoperative, No STIP

    $0.05

    04

    Pick Up Card

    $0.06

    07

    Pick Up Card, Special Cond.

    $0.07

    41

    Pick Up Card, Lost

    $0.08

    43

    Pick Up Card, Stolen

    $0.09

    06

    General Error

    $0.10

    79

    Already Reversed

    $0.11

    13

    Invalid amount

    $0.12

    83

    Can't Verify PIN

    $0.13

    86

    Can't Verify PIN

    $0.14

    14

    Invalid Account Number

    $0.15

    82

    Incorrect CVV

    $0.16

    N3

    Cashback Not Available

    $0.17

    06

    General Error

    $0.18

    EC

    CID Format Error

    $0.19

    80

    No Financial Impact

    $0.20

    05

    Decline

    $0.21

    51

    Decline

    $0.22

    N4

    Decline

    $0.23

    61

    EXC APPR AMT LIM

    $0.24

    62

    Decline

    $0.25

    65

    EXC W/D FREQ LIM

    $0.26

    93

    Decline

    $0.27

    81

    Encryption Error

    $0.28

    06

    General Error

    $0.29

    54

    Expired Card

    $0.30

    92

    Invalid Routing

    $0.31

    12

    Invalid Trans

    $0.32

    78

    No Account

    $0.33

    21

    No action taken

    $0.34

    76

    Unsolic Reversal

    $0.35

    77

    No action taken

    $0.36

    52

    No Check Account

    $0.37

    39

    No Credit Acct

    $0.38

    53

    No Save Acct

    $0.39

    15

    No Such Issuer

    $0.40

    75

    PIN Exceeded

    $0.41

    19

    RE-ENTER

    $0.42

    63

    SEC Violation

    $0.43

    57

    Txn not permitted

    $0.44

    58

    Serv Not Allowed

    $0.45

    96

    System Error

    $0.46

    03

    Term ID Error

    $0.47

    55

    Wrong PIN

    $0.48

    N7

    CVV Mismatch

    $0.49

    85

    Card OK

    $0.50*

    00

    APPROVAL

    $0.54

    94

    Duplicate Transaction

    $0.96

    R0

    Stop Recurring

    $0.97

    R1

    Revoke Auth Order

    $1.12

    05

    Decline

    $1.13

    05

    Decline

    $1.30

    00

    Approval

    $1.31

    00

    Approval

    $1.34

    30

    Msg Format Error

    $10.00

    00

    Approval

    $32.48

    00

    Approval

    $32.88

    25

    No Card Number

    $1.34

    30

    Msg Format Error

    $32.85

    11

    Approval

    $64.01

    89

    Ineligible GIV

    $64.02

    H6

    Fail Get BDK

    $64.03

    H7

    Fail Get KPEI

    $64.04

    H8

    Encryption Error

    $64.05

    N9

    System Error

    $64.06

    N6

    N6 Error

    $64.10

    46

    Closed Account

    $64.11

    59

    Suspected Fraud

    $64.12

    6P

    Verification Data Failed

    $0.01

    01

    Call Issuer

    $0.05

    04

    Capture Card

    $0.07

    41

    Lost Card

    $0.08

    43

    $0.05

    04

    Pick Up Card

    $0.11

    13

    Invalid amount

    $0.14

    14

    Invalid Account Number

    $0.18

    $10.01

    06

    General error

    $10.02

    06

    General error

    $10.03

    03

    Invalid Merchant ID

    $10.04

    04

    Address Match

    C

    999970002

    Serv Unavailable

    D

    999970003

    Exact Match

    I

    999970004

    Ver Unavailable

    M

    999970005

    Exact Match

    P

    999970006

    Zip Match

    A

    999970007

    Address Match

    Y

    999970008

    Exact Match

    998

    $11.10

    $5.55

    Invalid Merchant ID

    04

    HOLD-CALL

    Pick up card (no fraud)

    05

    DECLINE

    Do not honor

    06

    ERROR

    General error

    07

    HOLD-CALL

    Pick up card, special condition (fraud account)

    08

    APPROVAL

    Honor MasterCard with ID

    10

    PARTIAL APPROVAL

    Partial approval for the authorized amount returned in Group III version 022

    11

    APPROVAL

    VIP approval

    12

    INVALID TRANS

    Invalid transaction

    13

    AMOUNT ERROR

    Invalid amount

    14

    CARD NO. ERROR

    Invalid card number

    15

    NO SUCH ISSUER

    No such issuer

    19

    RE ENTER

    Re-enter transaction

    21

    NO ACTION TAKEN

    Unable to back out transaction

    25

    NO CARD NUMBER

    Unable to locate the account number

    28

    NO REPLY

    File is temporarily unavailable

    30

    MSG FORMAT ERROR

    Transaction was improperly formatted

    39

    NO CREDIT ACCT

    No credit account

    41

    HOLD-CALL

    Lost card, pick up (fraud account)

    43

    HOLD-CALL

    Stolen card, pick up (fraud account)

    46

    CLOSED ACCOUNT

    Closed account

    51

    DECLINE

    Insufficient funds

    52

    NO CHECK ACCOUNT

    No checking account

    53

    NO SAVE ACCOUNT

    No savings account

    54

    EXPIRED CARD

    Expired card

    55

    WRONG PIN

    Incorrect PIN

    57

    SERV NOT ALLOWED

    Transaction not permitted - Card

    58

    SERV NOT ALLOWED

    Transaction not permitted - Terminal

    59

    SUSPECTED FRAUD

    Suspected fraud

    61

    EXP APPR AMT LIM

    Exceeds approval amount limit

    62

    DECLINE

    Invalid service code, restricted

    63

    SEC VIOLATION

    Security violation

    65

    EXC W/D FREQ LIM

    Exceeds withdrawal frequency limit

    6P

    VERIF DATA FAILD

    Verification data failed

    75

    PIN EXCEEDED

    Allowable number of PIN-entry tries exceeded

    76

    UNSOLIC REVERSAL

    Unable to locate, no match

    77

    NO ACTION TAKEN

    Inconsistent, reversed or repeat data

    78

    NO ACCOUNT

    Blocked, first used transaction from new cardholder, and card not properly unblocked

    79

    ALREADY REVERSED

    Already reversed at switch

    80

    NO IMPACT

    No Financial impact (used in reversal responses to decline originals)

    81

    ENCRYPTION ERROR

    Cryptographic error

    82

    INCORRECT CVV

    CVV data is not correct OR Offline PIN authentication interrupted

    83

    CAN'T VERIFY PIN

    Cannot verify PIN

    85

    CARD OK

    No reason to decline

    86

    CAN'T VERIFY PIN

    Cannot verify PIN

    91

    NO REPLY

    Issuer or switch unavailable

    92

    INVALID ROUTING

    Destination not found

    93

    DECLINE

    Violation, cannot complete

    94

    DUPLICATE TRANS

    Unable to locate, no match

    96

    SYSTEM ERROR

    System malfunction

    A1

    ACTIVATED

    POS device authentication successful

    A2

    NOT ACTIVATED

    POS device authentication not successful

    A3

    DEACTIVATED

    POS device deactivation successful

    B1

    SRCHG NOT ALLOWED

    Surcharge amount not permitted on debit cards or EBT food stamps

    B2

    SRCHRG NOT ALLOWED

    Surcharge amount not supported by debit network issuer

    CV

    FAILURE CV

    Card Type Verification Error

    D3

    SECUR CRYPT FAIL

    Transaction failure due to missing or invalid 3D-Secure cryptogram

    E1

    ENCR NOT CONFIGD

    Encryption is not configured

    E2

    TERM NOT AUTHENT

    Terminal is not authenticated

    E3

    DECRYPT FAILURE

    Data could not be decrypted

    EA

    ACCT LENGTH ERR

    Verification error

    EB

    CHECK DIGIT ERR

    Verification error

    EC

    CID FORMAT ERROR

    Verification error

    H1

    SERV NOT ALLOWED

    Contact Merchant Services/ Technical Support

    H2

    SERV NOT ALLOWED

    Contact Merchant Services/ Technical Support

    H3

    SERV NOT ALLOWED

    Contact Merchant Services/ Technical Support

    H4

    SERV NOT ALLOWED

    Contact Merchant Services/ Technical Support

    H5

    SERV NOT ALLOWED

    Contact Merchant Services/ Technical Support

    H6

    SERV NOT ALLOWED

    Contact Merchant Services/ Technical Support

    H7

    SERV NOT ALLOWED

    Contact Merchant Services/ Technical Support

    H8

    SERV NOT ALLOWED

    Contact Merchant Services/ Technical Support

    H9

    SERV NOT ALLOWED

    Contact Merchant Services/ Technical Support

    HV

    FAILURE HV

    Hierarchy Verification Error

    K0

    TOKEN RESPONSE

    Token request was processed

    K1

    TOKEN NOT CONFIG

    Tokenization is not configured

    K2

    TERM NOT AUTHEN

    Terminal is not authenticated

    K3

    TOKEN FAILURE

    Data could not be de-tokenized

    M0

    DOM DBT NOT ALWD

    Mastercard: Canada region-issued Domestic Debit Transaction not allowed

    N3

    CACHBACK NOT AVL

    Cash back service not available

    N4

    DECLINE

    Exceeds issuer withdrawal limit

    N7

    CVV2 MISMATCH

    CVV2 Value supplied is invalid

    P0

    SERV NOT ALLOWED

    Contact Merchant Services/ Technical Support

    P1

    SERV NOT ALLOWED

    Contact Merchant Services/ Technical Support

    P2

    SERV NOT ALLOWED

    Contact Merchant Services/ Technical Support

    P3

    SERV NOT ALLOWED

    Contact Merchant Services/ Technical Support

    P4

    SERV NOT ALLOWED

    Contact Merchant Services/ Technical Support

    P5

    SERV NOT ALLOWED

    Contact Merchant Services/ Technical Support

    P6

    SERV NOT ALLOWED

    Contact Merchant Services/ Technical Support

    P7

    MISSING SERIAL NUM

    The terminal has not yet completed the boarding process. The Serial Number has not been set up.

    Q1

    CARD AUTH FAIL

    Card authentication failed

    R0

    STOP RECURRING

    Customer requested stop of specific recurring payment

    R1

    STOP RECURRING

    Customer requested stop of all recurring payments from specific merchant

    R3

    STOP ALL RECUR

    All recurring payments have been canceled for the card number in the request

    S0

    INACTIVE CARD

    The PAN used in the transaction is inactive.

    S1

    MOD 10 FAIL

    The Mod-10 check failed.

    S5

    DCLN NO PRE AUTH

    Decline - no preauthorization found.

    S9

    MAX BALANCE

    Maximum working balance exceeded

    SA

    SHUT DOWN

    The Authorization Server is shut down.

    SB

    INVALID STATUS

    Invalid card status - status is other than active

    SC

    UNKNOWN STORE

    Unknown dealer/store code - special edit.

    SD

    TOO MANY RCHRGS

    Maximum number of recharges is exceeded.

    SE

    ALREADY USED

    Card was already used.

    SF

    NOT MANUAL

    Manual transactions not allowed.

    SH

    TYPE UNKNOWN

    Transaction type was unknown.

    SJ

    INVALID TENDER

    An invalid tender type was submitted.

    SK

    CUSTOMER TYPE

    An invalid customer type was submitted.

    SL

    PIN LOCKED

    PIN was locked.

    SM

    MAX REDEMPTS

    The maximum number of redemptions was exceeded.

    SP

    MAX PAN TRIES

    The maximum number of PAN tries was exceeded.

    SR

    ALREADY ISSUED

    The card was already issued.

    SS

    NOT ISSUED

    The card was not issued.

    T0

    APPROVAL

    First check is okay and has been converted.

    T1

    CANNOT CONVERT

    The check is okay but cannot be converted. This is a declined transaction.

    T2

    INVALIDABA

    Invalid ABA number, not an ACH participant.

    T3

    AMOUNT ERROR

    Amount greater than the limit.

    V1

    FAILURE VM

    Daily threshold exceeded.

    Stolen Card

    EC

    Pick up card (no fraud)