Docs
DocumentationAPI ReferenceAsk AI Assistant
  • Home
    • Get Your Business Started
    • Services and Supported Features
  • Documentation
    • Developer Quickstart
      • Authentication
      • Card Sales and Consent
      • Querying and Filtering
      • Payment Reminders
    • Getting Started
      • Integration Checklist
      • Integration Options
        • REST API
        • Android SDK
        • iOS SDK
        • React Native Wrapper
        • PayForm
        • Verifone
        • Virtual Terminal
      • Basics
        • Authentication
        • API Best Practices
        • API Input Validation
        • Testing Considerations
      • Client Admin Portal
    • Testing
      • Testing Overview
      • Global Payments Testing
      • First Data Testing
      • ACH Testing
    • Resources
      • Tools and Downloads
      • Vocabulary
      • Querying
      • Error Codes
      • Software Requirements
  • API Reference
    • REST API
      • Authentication
      • ACH
      • Card Operations
        • Process a Card Sale
      • Consent Annual
        • Create Annual Consent
      • Consent Recurring
        • Create Recurring Consent
      • Consent Subscription
      • International
      • PayForm
      • Query
        • Account
        • ACH
        • Batch
        • Consent Annual
        • Consent Recurring
        • Consent General
        • Recurring Schedule
        • Receipt
        • Transaction
        • Voice
        • Query General
        • Reconcile
      • Receipt
      • Recurring Schedule
      • Settlement
      • Text to Pay
  • Help
    • Customer Support
      • FAQ
Powered by GitBook

Copyright © Number

On this page
  • PCI SSC SSF
  • Software options
  • Desktop application
  • Browser-based installation
  • Virtual Terminal
  • Requesting a transaction from your custom web application
  • Creating your first EMV transaction
  • Resetting The Device
  • Middleware response types
  • Consuming the sale response
  • Consuming the consent response
  • Number Verifone SDK
  • Sample SDK Program
  • EMV Sale
  • Programming Considerations
  • Managing the Workflow
  • Custom Windows event log
  • Verifone power settings

Was this helpful?

Export as PDF
  1. Documentation
  2. Getting Started
  3. Integration Options

Verifone

Getting started with Verifone for Number

PreviousPayFormNextVirtual Terminal

Last updated 3 months ago

Was this helpful?

The Verifone card readers are small hand-held devices. They communicate with your computer on a USB port. A chip transaction is comprised of about a dozen transmissions between the host (your computer) and the device, and then finally to the Number cloud platform.

Using the Verifone card readers offers a highly secure method of collecting cardholder data.

Cardholder data is encrypted within the device itself, and remains encrypted as it travels across the Internet to our PCI Level One Compliant processing platform.

When a merchant supports a Verifone card reader, it helps eliminate chargebacks for transactions which were run through the device.

PCI SSC SSF

Software Security Framework (SSF) is a re-working of the existing PCI standard PA DSS. The PA DSS has been retired since June 30, 2021. Number's "Aspen 3.1" is the first application to achieve the PCI Councils SSF certification, and it provides an end-to-end encrypted solution.


Software options

Currently, we offer three different options for collecting payments with the Verifone card readers, all of which require a Windows OS on the host computer.

1

Standalone desktop application (upon request)

This application has automatic updates and allows you to collect payments, create card-on-file and payment plans, process a card-on-file, void or credit, settle transactions, and do reporting with an option to export to a PDF.

2

Browser-based interface

We developed a Windows service which uses Cross-Origin Resource Sharing (CORS) to communicate with the browser. The Win service will return a simple XML response for each transaction directly to the HTML/PHP/ASP.NET page for consumption by the host application.

As an integrator, this allows you to write simple client-side scripts within your own web applications to initiate transactions with a local Verifone. You can also use this service with our Virtual Terminal to avoid writing any code.

3

Number Verifone SDK

This DLL provides a means of collecting payments and creating card-on-file plans. Used in conjunction with your custom windows application, you can manage all aspects of your payment requirements.

Requirements

There are 2 categories of integrations which require two different sets of files

  1. Browser-based - install our Win service which contains all your dependencies, including the drivers and console installer.

  2. Desktop-based - install our SDK, then use separate installers for drivers and a custom event log.

Desktop application

Browser-based installation

For any browser-based Implementation using the Verifone, you will need to install the local win service. This includes our Virtual Terminal implementation as well as your own custom web applications.

To Begin: Download the compressed archive:

To install the Win service:

1

Connect your device to a free USB port.

2

Allow the device to initialize.

3

Extract the above archive to a location of your choice.

4

Locate the EXE file and right click on it to choose Run as administrator.

5

Wait for the application to finish, then reboot computer.

The above installation package does the following:

  1. Installs USB drivers for the Verifone.

  2. Creates a custom event log with Windows named EPmiddleware.

  3. Installs a certificate which encrypts data between the browser and the Windows service.

  4. Installs the EasyPay Verifone MiddleWare E2E 1041 Service which listens on port 8031.

Your website can now issue commands to the Win Service as is demonstrated using the sample site:

You can download the entire site here:

To run the Verifone demo website, you must have the Verifone Windows service installed.

Virtual Terminal

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

Requesting a transaction from your custom web application

You will find a script file named EasyPayVerifone.js in the sample VeriFone website provides the following functionality:

  1. EMV sale only

  2. EMV sale and save card

  3. Manual sale (keyed entry) sale only

  4. Manual sale and save card

  5. EMV save card only

  6. Reset the Middleware and Verifone

You can call these functions as follows:

// 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();
	});
});

Creating your first EMV transaction

In the script file named EasyPayVerifone.js you can inspect the function named EMVSaleCombo():

EMVSaleCombo(SaveCard)

It expects the following objects

  1. SaveCard ( true / false)

  2. SessionKey ( string )

  3. AccountHolder ( Json )

  4. EndCustomer ( can be the same as Accountholder )

  5. PurchaseDetails (Json)

  6. Amount ( can be numeric value or JSON object )

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:

{"Firstname":"Jim","Lastname":"Smith","address":{"Address1":"21 Elm St","Address2":"","City":"Farmindale","State":"CA","ZIP":"83765","Country":"USA"},"Phone":"207-453-4587"}

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:

{"REFID":"41-96875","RPGUID":"1265432","ServiceDesc":"SERVICE DESCRIPTION HERE"}

The Amount object supports both a simple number such as "103.41" or an object such as the following:

{"baseAmt":"100.43","feeAmt":"2.01","totalAmt":"102.44"}   

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:

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

Resetting The Device

The red Button on the Verifone can be used to Cancel the current operation and also to setup for the Ready State. Your software will be notified of the Reset should this Occur.

You can also call the function named UnlockVerifone(); which will reset both the software and the hardware so that you can once again enter the ready state.

If you ever send a command to the Verifone Middleware while it is still processing the previous one, it will respond with an error stating that is it BUSY. In the rare situation where the Middleware remains Busy for an unreasonable amount of time you can issue the UnlockVerifone(); command in order to return the device to the ready State. You can also press the red Button on the device 2 times to enter the ready state.

If you continue to receive a Busy response from the middleware, but you don't believe that waiting will yield productive results, you may use the unlockVerifone function to return the device to Ready state.

Middleware response types

For browser type Verifone operations, the middleware provides a response object in XML format. This object can be de-serialized or can be consumed as XML. Currently, there are two response object types:

  1. WidgetArgs - sale response when requesting an authorization for a non-zero dollar amount, with the option to save the card;

  2. WidgetArgs2 - consent response when requesting to only save the card.

Consuming the sale response

It is important to consume the WidgetArgs response in a particular order, starting with TxEventTyp.

Response example
<?xml version="1.0" encoding="utf-16"?>
<WidgetArgs xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <TxEventTyp>TxApproved</TxEventTyp>
    <ApprovedAmt>20</ApprovedAmt>
    <IsPartialApproval>false</IsPartialApproval>
    <RespMsg>APPROVED 801193</RespMsg>
    <ErrMsg />
    <TxnCode>801193</TxnCode>
    <TxID>19969</TxID>
    <ErrCode>0</ErrCode>
    <Mask>4663xxxxxxxx2741</Mask>
    <cardType>Visa</cardType>
    <ConsentResult>
        <ConsentCreated>true</ConsentCreated>
        <ConsentRequested>true</ConsentRequested>
        <ErrMsg />
        <ErrCode>0</ErrCode>
        <ConsentID>7849</ConsentID>
        <CardLast4>2741</CardLast4>
        <ExpDate>0528</ExpDate>
    </ConsentResult>
</WidgetArgs>

TxEventTyp string

The type of event that occurred during the transaction, indicating success or failure.

Values: TxApproved, TxDecline, TxReversed, PreSaleDeviceCode, PostSaleDeviceCode, TimeOut, AspenError, AuthFail, FunctionFail, Exception.


Here are actions to take for each possible value of TxEventTyp:

1

TxApproved

The sale was approved by the issuer. You should examine and store these values:

  • TxID - the unique ID of the transaction; needed to refund or void the transaction.

  • TxnCode - the transaction approval code.

  • ApprovedAmt - the $ amount charged to the card.

2

TxDecline

The sale was declined by the issuer. You should examine and store these values:

  • TxID - the unique ID of the declined transaction.

  • TxnCode - the transaction decline code.

3

TxReversed

The issuer approved the transaction, however, during the final interaction with the chip, the device required the transaction to be declined, and the transaction was voided (reversed).

4

PreSaleDeviceCode

An error occurred within the device prior to the transaction getting submitted to the issuer. Examine ErrCode and ErrMsg for more information.

5

PostSaleDeviceCode

An error occurred within the device after the transaction was submitted to the issuer. Examine ErrCode and ErrMsg for more information.

6

Timeout

The user waited too long to insert the card or interact with the device. Examine ErrCode and ErrMsg for more information.

7

AspenError

An error occurred on Number Aspen Cloud processing servers. Examine ErrCode and ErrMsg for more information.

8

AuthFail

When doing a save card only operation, the issuer declined to verify the card details when executing a $0 authorization. The card will not be saved. You should examine:

  • TxID - the unique ID of the declined transaction.

  • TxnCode - the transaction decline code.

9

FunctionFail

Returned when you supply improper or out of range values in the request, or when you execute a Verifone command while the previous action has not yet completed. Examine ErrCode and ErrMsg for more information.

10

Exception

An error was encountered in the local Windows service. Examine ErrCode and ErrMsg for more information.

Consuming the consent response

It is important to consume the WidgetArgs2 response in a particular order, starting with ConsentEventTyp.

Response example
<?xml version="1.0" encoding="utf-16"?>
<WidgetArgs2 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <ConsEventTyp>ConsentSuccess</ConsEventTyp>
    <AuthSuccess>true</AuthSuccess>
    <AuthMsg>APPROVED 632641|CVV||AVS|0</AuthMsg>
    <AuthTxID>16809</AuthTxID>
    <RespMsg>Success : Created Consent ID : 001270</RespMsg>
    <ErrMsg />
    <ConsentID>1270</TxnCode>
    <ErrCode>0</ErrCode>
    <Mask>4663xxxxxxxx2741</Mask>
    <cardType>Visa</cardType>
</WidgetArgs>

ConsentEventTyp string

The type of event that occurred during the save card on file operation, indicating success or failure.

Values: ConsentSuccess, ConsentFailed, PreConDeviceCode, PostConDeviceCode, TimeOut, AspenError, AuthFail, FunctionFail, Exception.


Here are actions to take for each possible value of ConsentEventTyp:

1

ConsentSuccess

The consent was created and card was saved successfully. You should examine and store ConsentID to be able to charge the customer later.

2

ConsentFailed

The consent was not created. Examine ErrCode and ErrMsg for more information.

3

PreConDeviceCode

An error occurred within the device prior to the card being submitted. Examine ErrCode and ErrMsg for more information.

4

PostConDeviceCode

An error occurred within the device after the data was submitted. Examine ErrCode and ErrMsg for more information.

5

Timeout

The user waited too long to insert the card or interact with the device. Examine ErrCode and ErrMsg for more information.

6

AspenError

An error occurred on Number Aspen Cloud processing servers. Examine ErrCode and ErrMsg for more information.

7

AuthFail

When doing a save card only operation, the issuer declined to verify the card details when executing a $0 authorization. The card will not be saved.

8

FunctionFail

Returned when you supply improper or out of range values in the request, or when you execute a Verifone command while the previous action has not yet completed. Examine ErrCode and ErrMsg for more information.

9

Exception

An error was encountered in the local Windows service. Examine ErrCode and ErrMsg for more information.


Number Verifone SDK

Important : You can not run both the Verifone Middleware and the Verifone SDK together at the same time. Both packages will need to have control over COM 9 so only one can be active at one time.

Installation

For you to directly interface with the Verifone using our SDK, you will need the Verifone drivers with the custom logging package, and the SDK reference files:

When installed, the first component will provide USB drivers and create a virtual COM 9 port. In addition, it will add a unique event log to the existing windows event log collection.

To install the first component, please do the following:

1

Connect your Verifone to the USB port which you plan to utilize.

2

Wait until the device is fully initialized.

3

Download and extract the ZIP file named Setup_USB_log.zip to the location of your choice.

4

Right click the EXE named Setup_USB_log.exe and choose Run as administrator.

5

After installation, there should be a new windows event log named EPmiddleWare.

6

With the Verifone plugged in you should also see an entry in the device manager attached to COM 9

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.

EP.Enterprise.Vx820Lib.dll

EP.Vx820.Common.dll

EP.Enterprise.Vx820Lib.dll.config

DPayments.DPaymentsSDK.dll

Number has developed a sample executable program using the SDK which allows you to authorize cards, save cards, and create payment plans:


Sample SDK Program

Initially you will need the following to begin processing cards

  • Number URL Endpoint ( API URL )

  • Account Code

  • Token

For testing you can use the default URL supplied but it is important that you consult with Number personnel to determine the best endpoint prior to going live. Your Account code and Token will be supplied to you for your sandbox account.

EMV Sale

Once you have authenticated you can proceed to the SALE page.

Take Notice of the MERCHID field as each Number Account can have one or more merchant records associated with it. For Live accounts you will be provided a deployment form which identifies these along with their identifier {1,2,3} etc.

For a typical Chip transaction, you only need to specify an amount and press INITIATE CHIP. The device should now prompt you to insert the CHIP. If you check the SAVE CARD checkbox then Number will VAULT the card details after the successful sale and return a CONSENT ID which you can use to authorize the card directly using our API at a later time. If you want to KEY IN the card details directly into the VeriFone, you will enter Account Holder Information then press INITIATE MANUAL TRANSACTION.

Programming Considerations

To reference the SDK

using EP.Enterprise.Vx820Lib;

Important : manage only one single instance of the class ( this allows you to operate on the COM 9 port )

private EP_Verifone_Mod EPVerifone;

Here are some steps required prior to doing a card authorization

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

} 

Now you can initiate a transaction

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

Wait for your transaction to complete and event will fire

 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
   }


}

For additional coding samples including creating recurring payment plans please refer to the sample SDK program

Managing the Workflow

Once you initiate a transaction the EPVerifone class will set the DeviceIsBusy flag to True. make sure you monitor this flag before attempting another transaction. EMV transactions can take time and you will expect the On_Device_Msg Event to Fire to alert you of the Results. If for some reason the DeviceIsBusy flag stays true for an unreasonable amount of time you should issue the UnLockAndReset(ref ErrStr) command which will reset both the SDK Software and the Verifone Device in order for you to once again enter the Ready State. There is also a Red Button on the Verifone device which you can press two times to reset the process and fire the On_Device_Msg Event.

Custom Windows event log

After installing all the dependencies for either the SDK or the browser-based approach,, you will notice a new Windows event log has been registered named EPmiddleWare.

This event log stores information about processed transactions as well as any errors encountered, and serves as a powerful troubleshooting component.

With the Verifone Windows event log installed, a merchant can export the log and send it to Number if any unexpected behavior is encountered.


Verifone power settings

Both the middleware service and the SDK will attempt to maintain a continuous connection to the Verifone device. If your hardware is suspended or enters sleep, this can cause issues. To avoid these, please make sure to modify your USB power settings.

Windows 10 and Windows 11

For Windows 10, you'll need to go to Control Panel > Power Options > Edit Plan Settings.

On Windows 11, open Control Panel > Hardware and Sound > Power Options > Edit Plan Settings.

Go to Advanced power settings and change the USB settings to disable USB selective suspend for your active power plan.

When using the Verifone, make sure that your machine is running the power plan with the modified settings. All power plans have separate power settings.

If you don't see the USB power settings on your machine, you might need to expose them.

  1. Run the Command Prompt as an administrator.

  2. Type the command below you into the elevated command prompt, and press Enter:

REG ADD HKLM\SYSTEM\CurrentControlSet\Control\Power\PowerSettings\2a737441-1930-4402-8d77-b2bebba308a3\48e6b7a6-50f5-4782-a5d4-53bb8f07e226 /v Attributes /t REG_DWORD /d 2 /f
  1. After running the command, reboot your computer, then reopen your advanced power settings following the steps listed above.

If you wish to use the standalone desktop application for Verifone, for installation files and instructions.

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.

contact Number
Verifone Middleware Installer
Sample Verifone Website
Sample Verifone Website Content
contact Number
USB drivers and Logging Package
SDK Interface
Sample Program Executable
Sample Program Source Code