Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
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.
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...
AuthenticationFind 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.
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.
To get your business started with Number, follow these general steps for implementation:
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.

Number prioritizes straightforward and efficient integration. Check our quickstart guide and integration checklist to see how you can get started.
Use our API, PayForm, Verifone service or mobile SDK to integrate Number into your system.
Our comprehensive range of services is designed to meet various needs, ensuring users can find tailored solutions for every requirement.
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
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.

Here are the articles in this section:

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






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.
Processor minimum: Intel i5 Gen 5 and AMD Ryzen 5 RAM minimum: 8GB (4GB free)
Microsoft Windows 8.1+
MacOS Sierra 10.12+
Microsoft Edge v122.00+
Google Chrome v122.0.626.1.111+
Mozilla Firefox v123.01+
Safari version v17.3.1+
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.
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
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:
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:
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.
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
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.
Here are the articles in this section:
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.
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 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
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
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 >
application/jsonAccept 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
}
}A1842D663E9A4A72XXXXXXXX303541303234373138Content-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"
}
}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"
}
}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
}
}application/jsonAccept 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
}
}Testing Overview >
Global Payments Testing >
First Data Testing >
ACH Testing >


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
All links and downloads for the mobile SDKs.
All links and downloads for the PayForm and the legacy widget.
All links and downloads for the Verifone card reader:
All links and downloads for the Virtual Terminal.

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
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.
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.
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:
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.
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
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
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.
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
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
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
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
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.
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);
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
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
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
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
Example: 0
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
Example: 2023-07-10T00:00:00.000Z
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"
}
}application/jsonAccept 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"
}
}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"
}
}
}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:
Catch any exception in communicating to EasyPay ( perhaps a Timeout )
Check status of FunctionOK flag ( If false then check and log error codes and error message)
Check any TxApproved or other success flags for final discovery of approved operation
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
}
}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.
Here's a basic step-by-step guide on how to authenticate with our APIs:
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.
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.

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


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.

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.




A short compilation of Number services and supported features
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.
Supported features:
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.
Supported features:
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.
Supported features:
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.
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:
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.
Supported features:
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.
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.
After account creation, retrieve the necessary credentials from the Number Client Admin Portal. This will be essential for encryption and authentication.
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.
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).
Develop the frontend components: 1-2 weeks
Create the frontend components necessary for user interaction.
Develop the EMV integration: 1 week
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.
Develop the backend integration: 2-3 weeks
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.
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.
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.
Number inspection: 1-2 meetings
The Number team always inspects the workflow that our clients develop prior to going live.
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.
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.
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:
10ExpYear integer optional
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').
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).
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).
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
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').
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]
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
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
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 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
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
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
Transaction and consent verification using the Virtual Terminal.
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:
Send a SMS text with a message and Payment Link
Send an email with message and Payment Link
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')
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')
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')
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')
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.
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.
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.
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
}
}
}application/jsonAccept 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"
}
]
}
}application/jsonAccept 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:
10ExpYear integer optional
Expiration year of the card
Example:
2028Email string · email optional
Email associated with the consent
Example:
[email protected]Zip string optional
ZIP code associated with the consent
Example:
04101CustomerRefID string optional
Customer reference ID
Example:
A123456ServiceDescrip string optional
Description of the service
Example:
TestRPGUID 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"
}
}application/jsonAccept 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"
}
}
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:
10ExpYear integer optional
Expiration year of the card
Example:
2022Email string · email optional
Email associated with the consent
Example:
[email protected]Zip string optional
ZIP code associated with the consent
Example:
04106RPGUID string optional
A custom, user-defined reference ID or value.
Example:
adf98580-b4ab-42fc-bb99-01c89964afe9CustomerRefID string optional
Customer reference ID
Example:
A123456ServiceDescrip string optional
Description of the service
Example:
TestPaymentAmt number · float optional
Payment $ amount
Example:
10PaymentAdjustDate string · date-time optional
Date and time for payment adjustment
Example:
2019-04-29T11:26:11.093ZOnHold 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
}
}SessKeyIf 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).
These can be a result of problems communicating with our service or problems executing the client-side code.
FunctionOkThis 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.
AuthSuccess or TxApprovedThese 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.
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.
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.
See the example below to give you more insight into how you might create your logging utility.
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:
1CustomerRefID string optional
Example:
A1523644ServiceDescrip string optional
Example:
REST TestRPGUID string optional
A custom, user-defined reference ID or value.
Example:
adf98580-b4ab-42fc-bb99-01c89964afe9StartDate string optional
Date and time in Microsoft JSON date format (Unix timestamp and timezone offset).
Example:
2024-12-01T11:19:01.000ZNumDays integer optional
Example:
365LimitPerCharge number · float optional
Example:
1000LimitLifeTime number · float optional
Example:
100000
AcctHolder object optional
Firstname string optional
Example:
SallyLastname string optional
Example:
APIACHCompany string optional
Title string optional
EndCustomer object optional
Firstname string optional
Example:
SallyLastname string optional
Example:
APIACHCompany 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"
}
}application/jsonAccept 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"
}
}{
"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
For more information about the Virtual Terminal, see the Virtual Terminal guide. You can access Virtual Terminal using the link below.
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.
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 click Full Detail to try to find out the reason for decline by checking TxStatus, Flags, and other values.
To test a partial authorization, you can use one of these cards:
The receipt can also be printed in the Virtual Terminal by expanding the Receipts dropdown and clicking the Merchant or Customer button.
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
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 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.
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.
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.
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.
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.
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:
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:
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:
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:
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.
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:
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:
Personal Checking = 1
Personal Saving = 2
Business Checking = 3
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
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:
4111111111111111ExpMonth integer optional
Example:
10ExpYear integer optional
Example:
2028
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.
To send a payment reminder using the REST API, use the endpoint.
Both implementations use a similar body structure, and the fields are described below.
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.
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.
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.
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.
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.
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.
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 "=".
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 "|".
post: https://easypay5.com/APIcardProcREST/v1.0.0/ACH/Sale
For member variable "AccountType" use the following values:
Personal Checking = 1
Personal Saving = 2
Business Checking = 3
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
Links to error code reference
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.
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"
}
}BillIngAddress object optional
Email string optional
Example: [email protected]
Phone string optional
Example: 8775558472
BillIngAddress object optional
Email string optional
Example: [email protected]
Phone string optional
Example: 8775558472
4: SUBSCRIPTION
CSV string optional
Example: 122
Track string | nullable optional
Example: %B4788250000028291^VISA TEST/GOOD^231010100733000000?;4895390000000013=151210100000733?
ConsentCreator object optional
MerchID integer optional
Example:
1CustomerRefID string optional
Example:
A123456ServiceDescrip string optional
RPGUID string optional
A custom, user-defined reference ID or value.
Example:
adf98580-b4ab-42fc-bb99-01c89964afe9StartDate string optional
Date and time in Microsoft JSON date format (Unix timestamp and timezone offset).
Example:
2024-12-01T11:19:01.000ZNumPayments integer optional
Example:
10TotalAmount number · float optional
Example:
10000Period integer optional
Example:
2
AcctHolder object optional
Firstname string optional
Example:
SallyLastname string optional
Example:
APIACHCompany 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:
SallyLastname string optional
Example:
APIACHCompany string optional
Title string optional
Url string optional
BillIngAddress object optional
Email string optional
Example:
[email protected]Phone string optional
Example:
8775558472
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.

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













string json;
using (var reader = new StreamReader(Request.InputStream))
{
json = reader.ReadToEnd();
}"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"}]?TokenFile=https://easypay5.com/ClientAdminPortalR101/Content/ManageTokens/Tempfile/f7048.txtxts/VQqO3XY=mJjvA64NIeJZRO8T2AwjcBwmiHSyWUPyxOwppWbObhz4Q99Oa/a/xz7dnVccGRtKSU4uee4vKYmRtpJWqOnpvxVyGEPPtliKJrnfqIsVVlrLO3/9PloUBzeorX3d9HvCsgX9QcO7fPGbt/rpbfTLeUtk5OJhguEMbre7g1MX1FlM4xGI3/Hq362Lpg2LIJ1KIXXArBSDhLAq5yAXjRFwjQTzV81UITTEZN+HLNklVIcqpVPa0IFhxg==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 PMExample: application/json
ChargeDetails object optional
AccountNumber string optional
The account number associated with the bank account from which funds will be withdrawn.
Example:
878460000256RoutingNumber string optional
The routing number of the bank, used to identify the financial institution for the transaction.
Example:
211274515Amount number · float optional
The $ amount to be charged, specified in decimal format.
Example:
10.25AccountType 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:
SallyLastname string optional
Example:
APIACHCompany string optional
Title string optional
EndCustomer object optional
Firstname string optional
Example:
SallyLastname string optional
Example:
APIACHCompany string optional
Title string optional
PurchItems object optional
ServiceDescrip string optional
A description of the service or item.
Example:
FROM API TESTERClientRefID string optional
A reference ID provided by the client for tracking purposes.
Example:
12456AARPGUID 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:
878460000256RoutingNumber string optional
The routing number of the bank, used to identify the financial institution for the transaction.
Example:
211274515
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:
1WTYPE string · enum required
The widget type for the PayForm
PF: Regular PayForm
PA: International PayForm
Example:
PFPossible values:
PF PAPostURL string optional
The URL where real-time values will be posted after payment completion.
Example:
https://easypay7.com/swidget/JsonGet.aspxRedirectURL 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-01c89964afe9EndPoint string required
Points to a specific web app on our servers. Should always have the value of PayForm/PF.aspx.
Example:
PayForm/PF.aspxEINDEX 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:
52Surcharge number · float optional
The surcharge $ amount added to the base amount, if applicable. Adjusted based on the total.
Example:
1.04TotalAmt 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:
JohnLastname string optional
The last name of the payer.
Example:
DoeEmail string optional
The email of the payer.
WidOptions object required
eVisible string required
Hex digits controlling field visibility.
Example:
0665eReadOnly string required
Hex digits dictating read-only fields.
Example:
0040eStyles string required
Hex digits controlling form styling.
{
"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"
}
}
}These codes are used when processing transactions through the Global Payments system. For Global Payments transaction decline codes, see.
These codes are relevant when dealing with transactions processed by First Data. For First Data transaction decline codes, see .
These codes are specifically for Automated Clearing House (ACH) transactions. For ACH decline codes, see .
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"
}
}BillIngAdress object optional
Email string optional
Example: [email protected]
Phone string optional
Example: 8775558472
BillIngAdress object optional
Email string optional
Example: [email protected]
Phone string optional
Example: 8775558472
adf98580-b4ab-42fc-bb99-01c89964afe9Example: 53.04
Phone string optional
The phone of the payer.
BillingAddress object optional
0001eSubmission 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
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:
SallyLastname string optional
Example:
APIACHCompany 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:
SallyLastname string optional
Example:
APIACHCompany 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 TESTERClientRefID string optional
A reference ID provided by the client for tracking purposes.
Example:
12456AARPGUID string optional
A custom, user-defined reference ID or value.
Example:
adf98580-b4ab-42fc-bb99-01c89964afe9
MerchID integer optional
Example: 1
application/jsonAccept 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"
}
}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=jvje9l7qZuEFiDDeEDDym6ZdlL0DX8HXAcctMask
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
}
}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=jvje9l7qZuEFiDDeEDDym6ZdlL0DX8HXAcctMask string optional
The masked version of the account number for security purposes.
Example:
4111XXXXXXXX1111Address1 string optional
The primary address line of the account holder.
Example:
123 Fake StAddress2 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:
VICity string optional
The city where the account holder resides.
Example:
PORTLANDCompany 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.000ZEmail 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:
1023Firstname string optional
The first name of the account holder.
Example:
SeanID integer optional
The unique identifier for the account holder in the system.
Example:
1LastChanged string optional
Date and time in Microsoft JSON date format (Unix timestamp and timezone offset).
Example:
2024-12-01T11:19:01.000ZLastName string optional
The last name of the account holder.
Example:
WoodMerchID integer optional
The unique identifier for the merchant associated with the account.
Example:
1Phone string optional
The phone number of the account holder.
Example:
8777248472State string optional
The state where the account holder resides.
Example:
MEZip 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:
10SalesTax number optional
Example:
0Surcharge number optional
The surcharge $ amount added to the base amount, if applicable.
Example:
0Tip number optional
Example:
0CashBack number optional
Example:
0ClinicAmount number optional
Example:
0VisionAmount number optional
Example:
0PrescriptionAmount number optional
Example:
0DentalAmount number optional
Example:
0TotalMedicalAmount number optional
Example:
0
PurchItems object optional
ServiceDescrip string optional
A description of the service or item.
Example:
FROM API TESTERClientRefID string optional
A reference ID provided by the client for tracking purposes.
Example:
12456AARPGUID string optional
A custom, user-defined reference ID or value.
Example:
adf98580-b4ab-42fc-bb99-01c89964afe9
MerchID integer optional
Example: 1
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
}
]
}
}Learn to make credit card sales and collect consent with Number
To make sales or collect consent when a card is present using Number, you have several options:
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.
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.
There are a few approaches to integration, You can either use the browser-based interface option or the Desktop integration with SDK .
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.
Here's an simplified example of how you can invoke the service for a card present sale:
Here's an simplified example of how you can invoke the service to collect annual consent:
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.
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.
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.
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.
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.
You can use the following API operations:
For the REST API, use
You can use the following API operations:
For the REST API, you can use and .
To make credit card sales and collect consent using Number when you want to enter the card details manually, you have the following options:
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.
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.
In the example below, the PayForm has been setup for an instant card payment.
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.
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.
The Virtual Terminal is a web application that allows you to manually enter credit card details and process transactions through your browser.
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.
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.
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.
The relevant methods are described in section of the guide and section of the guide.
The relevant methods are described in section of the guide and section of the guide.
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.
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.
You can use the following API operations:
For the REST API, use .
You can use the following API operations:
For the REST API, use for annual consent and for recurring consent.
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
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.
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.
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











Queries in the Number query language consist of the following:
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.
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
Obtain specific transaction records using Number's query language.
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
Obtain specific consent records using Number's query language
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
Obtain specific recurring schedule records using Number's query language.
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
Obtain specific batch log records using Number's query language.
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
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.
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.
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:
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 encrypting sensitive cardholder data, use RSA encryption padding of OaepSHA1. Encrypted card numbers will always have 512 bytes.
Examples of RSA encryption:
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
When you authenticate, you will receive FunctionOK and AuthSuccess flags in the response. You should handle the response as follows:
Check the FunctionOK flag.
If false, read the ErrMsg and ErrCode, and abort.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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
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.
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.
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.
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.
Allows you to reprint the consent agreement. You can choose between the customer, merchant, and dual receipt options.
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.
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.
If a customer’s card is declined, you will receive a notification report.
Displays a history of payments run on a particular consent through the Scheduled Payments option.
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.
In the Transaction Operations box right above the table, there are several options available to help you manage your transactions.
Reprint the receipts. You can choose between the customer, merchant, and dual receipt options.
Filter transactions based on the merchant the transaction was processed under, the date range, transaction status, and transaction type.
For filtering by transaction status and transaction type, see the table below.
Search your database, create reports based on results, void, credit, and reprint receipts.
Find the search value in a specific field by using the Search for a dropdown.
The value to search for in the specified field.
Choose the desired comparison type for search.
View and manage the settlements.
Click the Settlement option on the left side of the screen.
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.
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.
In the upper right-hand corner of the screen, there is a menu of miscellaneous operations.
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 do experience a user lockout, you will need to follow these steps to continue:
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.
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.
A glossary of key payment terms and terms specific to Number
A general list of terms specific to the payment industry.
Authorizing payments: The process of verifying cardholder information and checking funds to securely approve transactions.
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.
ISVs (Independent Software Vendors): Companies that develop software applications that may integrate with payment processing services.
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.
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.
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.
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
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
A list of terms specific to Number services or other terms in context of Number services..
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.
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.
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.
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.
PayForm: A modern tool for securely collecting cardholder data, allowing customization and real-time updates to your system.
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.
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.
Virtual Terminal: A web application that provides various credit card processing functionalities, including authorizations, voids, credits, and reporting.
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.
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.
{
"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))(G=1)&&(B>'10/20/2024')(G=1)&&(B>'10/20/2024')(H=3)&&(C>='10/20/2024')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).
If AuthSuccess is false, read RspMsg and abort.
If AuthSuccess is true, save the SessKey value.


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);
}K8ELXxBJGpgO02O9Rw3XYe32D4msyv2lBO/SaQyx2vkPjFdy8hBjOxKQ9Q9NMQro9HotSzdev0Legr+iwevfvMnZINZMAy7ufNA4CniT3YcNdOYbzATBD1iTTiLcf+/we9QHsuo70R7Mij9oONFdh5UX948v89ZQMc95RyXtXpU1sUXkf/GG+gm9XFG0y09pb7KCIwa8vxhbMej0I7k7xhR3t6651XWec7H4NVE6jqMOSK7S3/cuqU9eHhqOD24f3X8xnzrGQUTGEvfk63bsH4UgXq/lEo27yMSi0FpsBLyw7fE/1FsFQG58HgMoXmwdjGtHPSH4/xUXJHtihkKHi8Ge9Zch7k9v7ZiAAe48qUPmFs2bOH3XV3jtvPo3fX64vz3Ode37oehe06+MmQR7ho+cR/r/IDAA74zQWRgYfDL79UhaLEMCQ7mcoxGlRgz5gfOy1inD1mL14lPlH8FcTDcnlDBtwakzlSP8NrmtFGvz3gV9T3d9nAP2yBvP4qXF875rGhiXgQ8HQHAit0SyxMuqdNtnScUbTu4iUHqQr4xtsiOQ/MoJIFgygtPs4ndEpNAeImvr7+DgFQvhkZyDWJBQ8qqpv4vlO3pDAJ6/7UzSmSD5D9vjdFj9tAAf72cXLtu1STcB7XKzzrG696kBdYAWhoF/z72n1n4AtZGWMf0=WkPwbAzt1xZxECR4tdWOZDi219AiFmKq8qn6/MwwMPSeqkcRInqFMp3DxmM33G7pPrsvkIZA5zwk/tPLjjKkPDE1czVdVHA8yxYra6ggiGnjlASrxKdDGz6vaujGOnnex3cjXxV4mGC2gEhERTaFyXVlJDpM2jh/fdbXpg11n0BwmFBzgReTAV5BsS87vOqLfHjg9evm4lTIlYoqKR6DcGLn27Wd2ExwQu6V8nc8rkR6hwqEXsz3BFsbDtUhLeeWZdsEtZfKbAMzVAjwhUIbtsm4NOLLyQ5aSVc3P48FuW5GU9OZJD1MeicdsD+DFYmQk77UkEWEcKm9hogzf66sgrLAhY+TXg4iO4X0BJb8AJQRV0m9Am3VaemOIX/zw851AacwWxVNgYwrxbzcik9ODZR5GR8pHwXsPfeED2XISzGyfBdpv/5gqs5wTAlpZc0yW0nDShx9j+nmUJGVrd3RMHJddOe5+8HIWHFqAh3cQ6DBPe4FgBrTTtM44FlG+PuCRcVW6eQrnUr/llnWJdrUT5wKvGodewJCZv5JAdY9JZk9uj/qyITnDXVDC7uxxdHQgdq8yqjLZ/6iUoSu/dFFIflXmc/QFF13kRX74+XzYkMdEhUWQQ73R2KUKuTtO0jPMW5f+52UVJmUjEKYcggB8PcapFXAToKY0WaQhoSwOi0=FFcT8XK/lbjN6oBxp7qY4DND1QYeejnjcaYxCfVVaRQ4tqgE6SrOSGqvpfkOXWbacOHDd26SF+lNGx2Uj7UxMRglY/6AjsMfWfffG15kyfKNLJIPwiLklpNwKgOH3J9z8CHYXF1G7gQR/q4Z42z851iFB7DNGfPJ7iZk+ZPh4YEer+R+ZH2nlLx0GVcbI6YOXtCgNLC8LJd8brzrmqKyA/0ZrJJaD+PmiK6rZxcHdPqIdx1Bc+x7y54GTd6LpigGVtnS65PKPzjIjfXYpTgyBQhbqIpy6qu5r6G3CwWupYjdXV4xX3GzTsQDX3byoSssRdQEmDeUa78iIlk3QbHHJn81SdorHaUI34uU1c0D5eqWzVSh4aAhrnTjDlx0ecS1Wn0cPpMvDxVZI3pEq3TrnuUQZgvcHJDMsZ3Dn1pviQnah272d3bh8uL8u/Drb7FLREgK7o8ZlV/rcPGgf++8N7CMEyZgIfVWuXc8EVRHA2KWuSTKgFfNyWX7GAF41f1EYEYn7dMd8EZcv6atpXNuLhsIAyKUeVoYO8nhBLHmtNBvKm2Ly5CSW344MiKUjmpR8+FpuBgLyJrVHkAaZmKLKcmaKqVEcVzqq+uiN0RhXWnkiUyODKdaP+LQjsNzmdbieW0ZaXJJPOkmMrgbuOfeDv6B9MUEW3UOoUEFAY48+Kg=hWp5QKogAb7jkP85oHB7q+yYLw75IXVBzhGdQ0oZUUNk+z1uVLWK3ZyFwoi1Op8f5naINaHZ9T0ke2OW7Ydh7aYo3nTmhXVkM8LdYB3OUcvscj92HB5CHiWo1jBG0Jv4+vicBfOFT404r4MLwIqpdJVrr0URS0sSbSSPo34vk31GS9mihi+8UBzRXip8WKgnS5003grbvYf7tqGGK4YwrxCIgZRGqGIIrjqhrILBwn3zUmCjFuMItiNJ+VhnrThBeIXk9Lb8+FqzzZw63sIW41m4xOuVa4ZMB/4EpuG84BsA2V1WukRWzQRCo2CFYn55T96/GRdUrz3tGWEVs3NfXs4116IcK5fwYNBt/n0gVhmji4TU4JjUl64XS9gjfnPHGm3YsuOIuHL4Kapklp6UpDh/bVt795zMisGvlYEWazjflsO6MkDE+lgwt5XNs0kGVdWql9OHYSxAcmEmgZ4/ERf4dmgp/3TN5cMh4KZWGnEeWapcUtWWRISnHCCnkOpvz3wDsjH/96zb9DsYsXJ+92u76tCo3PNOMcD/cyEwMpqpjqjg/Z0a1YcS/anEXdGGwoXy65VCEALLy8mAct7whyQeValIPXeNq7sEbU2Y+LO8pevIfepDjChC5lVm4r/vUJOWq0ZvOCfUgHpRKqLS+zq0AYC0xP1Y8Xe1L+yT1zY=Displays all of the information associated with the consent.
Displays our support phone number and allows you to send us a secure email.
Visit the reset page to clear any cookies that have been set on your terminal.
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.
















Mac OS based workstation v15 or newer
Xcode v16.2 or newer
Android Studio Ladybug Feature Drop | 2024.2.2 or newer
React Native CLI
React Native v0.77 without new architecture enabled
Node v18.19.0 or newer
npm v10.8.2 or newer
Before beginning your implementation you will need a Number account. It should include the following:
Session Key: this authenticates you to a particular account.
HMAC secret: used to create a hash which proves your request is authentic.
RSA Certificate: to encrypt the credit card number prior to transmission.
A sentry.io key: used for logging events and errors.
Merchant record or merchant ID: Each Number account can support multiple merchant records.
Setup your environment
Make sure you have completed the React Native - Environment Setup instructions until the "Creating a new application" step before proceeding.
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.
Configure keys
In the app.tsx file, pass your configuration toEasyPayModule.configureSecrets:
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.
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:
Number's prebuilt payment UI components allow you to collect and process credit card information in a secure way.
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.
For managing saved cards and collecting a payment, following initializer should be used:
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:
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:
4111111111111111ExpMonth integer optional
Example:
10ExpYear integer optional
Example:
2028
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:
Form styling
Field visibility and read-only parameters
# 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 iosEasyPayModule.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:
1CustomerRefID string optional
Example:
A1523644ServiceDescrip string optional
Example:
REST TestRPGUID string optional
A custom, user-defined reference ID or value.
Example:
adf98580-b4ab-42fc-bb99-01c89964afe9StartDate string optional
Date and time in Microsoft JSON date format (Unix timestamp and timezone offset).
Example:
2024-12-01T11:19:01.000ZNumDays integer optional
Example:
365LimitPerCharge number · float optional
Example:
1000LimitLifeTime number · float optional
Example:
100000
AcctHolder object optional
Firstname string optional
Example:
SallyLastname string optional
Example:
APIACHCompany 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:
SallyLastname string optional
Example:
APIACHCompany string optional
Title string optional
Url string optional
BillIngAddress object optional
Email string optional
Example:
[email protected]Phone string optional
Example:
8775558472

# in a terminal window
npm install
cd ios
pod installEasyPayModule.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
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:
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.
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.
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.
Based on your requirements, you can choose from many submission options explained below.
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.
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:
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.
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.
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
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:
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.
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:
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.
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.
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.
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:
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;
{
"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=321Xcode 15 or above
Compatible with iOS 13.0 or above
Setup with Swift Package Manager
Setup with Cocoapods
Prerequisites - get HMAC secret, API key and optional Sentry DSN from Number.
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:
To enable jailbreak detection, please set isProduction = true when initializing the library and add the following URL schemes to main Info.plist.
Number's prebuilt payment UI components allow you to collect and process credit card information and payments in a secure way.
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:
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:
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:
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.
The object consists of the following fields:
The object consists of the following fields:
The object consists of the following fields:
The object consists of the following fields:
The object consists of the following fields:
The object consists of the following fields:
The object consists of the following fields:
The object consists of the following fields:
The object consists of the following fields:
The object consists of the following fields:
These methods allow you to configure the SDK secrets and load the certificate.
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
TransactionRequest
creditCardInfo: CreditCardInfo
accountHolder: AccountHolder
endCustomer: ?
amounts:
purchItems:
merchantId: Int
The response will be serialized to CardSaleManualResponseModel and include:
A query that returns annual consent details. Depending on the query sent, a single consent or multiple consents may be returned.
REST API equivalent:
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.
The response will be serialized to ConsentAnnualListingResponseModel and include:
And the ConsentAnnual consists of the following fields:
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
CreateConsentAnnualManualRequestModel
creditCardInfo: CreditCardInfo
consentAnnualCreate: CreateConsentAnnual
accountHolder:
endCustomer: ?
The response will be serialized to CreateConsentAnnualResponseModel and include:
Cancels an annual consent. Credit card data is removed from the system after the cancellation is complete.
REST API equivalent:
CancelConsentAnnualManualRequestModel
consentId: Int
The response will be serialized to CancelConsentAnnualResponseModel and include:
This method uses the credit card stored on file to process a payment for an existing consent.
REST API equivalent:
ProcessPaymentAnnualRequestModel
consentId: Int
processAmount: String
The response will be serialized to ProcessPaymentAnnualResponseModel and include:
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.
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.
missingSessionKeyOrExpired
Check if you have provided the correct apiKey and hmacSecret, contact Number to receive updated secrets.
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.
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.
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.
-
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).




Response code reference for ACH.
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.
Below you'll find a reference list to every possible return code value.
.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) throwsfunc 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) throwsfunc 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: Stringlet 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: Stringlet 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: StringEasyPay.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: IntEasyPay.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






<key>LSApplicationQueriesSchemes</key>
<array>
<string>undecimus</string>
<string>sileo</string>
<string>zbra</string>
<string>filza</string>
<string>activator</string>
</array>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.
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.
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.
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.
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.
There are 2 categories of integrations which require two different sets of files
Browser-based - install our Win service which contains all your dependencies, including the drivers and console installer.
Desktop-based - install our SDK, then use separate installers for drivers and a custom event log.
If you wish to use the standalone desktop application for Verifone, for installation files and instructions.
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:
Connect your device to a free USB port.
Allow the device to initialize.
Extract the above archive to a location of your choice.
The above installation package does the following:
Installs USB drivers for the Verifone.
Creates a custom event log with Windows named EPmiddleware.
Installs a certificate which encrypts data between the browser and the Windows service.
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.
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.
You will find a script file named EasyPayVerifone.js in the sample VeriFone website provides the following functionality:
EMV sale only
EMV sale and save card
Manual sale (keyed entry) sale only
Manual sale and save card
In the script file named EasyPayVerifone.js you can inspect the function named EMVSaleCombo():
EMVSaleCombo(SaveCard)
It expects the following objects
SaveCard ( true / false)
SessionKey ( string )
AccountHolder ( Json )
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:
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.
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:
WidgetArgs - sale response when requesting an authorization for a non-zero dollar amount, with the option to save the card;
WidgetArgs2 - consent response when requesting to only save the card.
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:
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.
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:
ConsentSuccess
The consent was created and card was saved successfully. You should examine and store ConsentID to be able to charge the customer later.
ConsentFailed
The consent was not created. Examine ErrCode and ErrMsg for more information.
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:
Connect your Verifone to the USB port which you plan to utilize.
Wait until the device is fully initialized.
Download and extract the ZIP file named Setup_USB_log.zip to the location of your choice.
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:
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.
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.
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
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.
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.
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.
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.
Run the Command Prompt as an administrator.
Type the command below you into the elevated command prompt, and press Enter:
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.
Wait for the application to finish, then reboot computer.
Reset the Middleware and Verifone
Amount ( can be numeric value or JSON object )
ApprovedAmt - the $ amount charged to the card.
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.
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).
PreSaleDeviceCode
An error occurred within the device prior to the transaction getting submitted to the issuer. Examine ErrCode and ErrMsg for more information.
PostSaleDeviceCode
An error occurred within the device after the transaction was submitted to the issuer. Examine ErrCode and ErrMsg for more information.
Timeout
The user waited too long to insert the card or interact with the device. Examine ErrCode and ErrMsg for more information.
AspenError
An error occurred on Number Aspen Cloud processing servers. Examine ErrCode and ErrMsg for more information.
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.
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.
Exception
An error was encountered in the local Windows service. Examine ErrCode and ErrMsg for more information.
PreConDeviceCode
An error occurred within the device prior to the card being submitted. Examine ErrCode and ErrMsg for more information.
PostConDeviceCode
An error occurred within the device after the data was submitted. Examine ErrCode and ErrMsg for more information.
Timeout
The user waited too long to insert the card or interact with the device. Examine ErrCode and ErrMsg for more information.
AspenError
An error occurred on Number Aspen Cloud processing servers. Examine ErrCode and ErrMsg for more information.
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.
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.
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.
After installation, there should be a new windows event log named EPmiddleWare.
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

// 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<?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><?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









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.
An example of using the method.
An example of using method.
An example of using method.
An example of using method.
An example of using method.
An example of using method.
An example of using method.
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:
Transaction query
Generate a receipt
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}`);
});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
Add easypay to your dependencies in the build.gradle file.
Prerequisites - get API key, HMAC secret and optional Sentry DSN from Number.
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:
Number's prebuilt payment UI component that allows you to collect credit card information in a secure way and process payments.
Initialize a PaymentSheet inside onCreate of your checkout Fragment or Activity, passing a method to handle the payment result.
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.
Handle the payment result in the onPaymentSheetResult method.
Number's prebuilt UI component that lets your customers manage their saved credit cards.
Initialize a CustomerSheet inside onCreate of your checkout Fragment or Activity, passing a method to handle the customer sheet result.
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.
Handle the customer sheet result in the onCustomerSheetResult method.
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:
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.
Most commonly used as SecureData<String> coming from the SecureTextField component.
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
ChargeCreditCardBodyParams
encryptedCardNumber: SecureData<String>
creditCardInfo: CreditCardInfoParam
accountHolder:
endCustomer: ?
amounts:
purchaseItems:
merchantId: Int
The response body will be serialized to ChargeCreditCardResult.
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
ListAnnualConsentsBodyParams
merchantId: Int?
customerReferenceId: String?
rpguid: String?
Either customerReferenceId or rpguid must be provided to get the list of consents of a specific customer.
The response body will be serialized to ListAnnualConsentsResult.
And the AnnualConsent looks like the following:
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
CreateAnnualConsentBodyParams
encryptedCardNumber: SecureData<String>
creditCardInfo: CreditCardInfoParam
accountHolder:
endCustomer: ?
consentCreator:
The response body will be serialized to CreateAnnualConsentResult.
Cancels an annual consent. Credit card data is removed from the system after the cancellation is complete.
REST API equivalent: Consent Annual Older
CancelAnnualConsentBodyParams
consentId: Int
The response body will be serialized to CancelAnnualConsentResult.
This method uses the credit card stored on file to process a payment for an existing consent.
REST API equivalent: Consent Annual Older
ProcessPaymentAnnualBodyParams
consentId: Int
The response body will be serialized to ProcessPaymentAnnualResult.
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:
Exceptions that are thrown by the SDK.
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.
Exceptions that are thrown by the Number API.
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.
To enable rooted device detection, call the following method before calling EasyPay.init(...):
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.secureDatadata 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.




// ...
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
}
}
}
}Cards for testing, response code reference, and penny codes for First Data.
You can use the below cards for testing with First Data.
Visa
4005 5200 0000 0939
MasterCard
Below you'll find a reference list to every possible response code value.
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.
To test a partial authorization, use these cards and request values:
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
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
-
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
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.
$0.00
85
Card Ok
$0.01
01
Call Issuer
$0.02
02
Call Issuer, Special Cond.
$0.03
Below you'll find a reference list to every possible Address Verification Service (AVS) response value.
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:
To test partial authorization, use these cards and request values:
Below you'll find a reference list to every possible decline code value.
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)