.NET POS Integration via PayClient

The PayClient is an easy-to-use library to process transactions with the PayServer. It provides a high-level implementation of the PayProtocol (P3)for quick integration. You can:
  1. Install PayClient
  2. Select login and device
  3. Start a transaction
  4. Abort a transaction
Installing PayClient
The PayClient for .NET bundle contains prepackaged assemblies that must be added to your project. There are also external dependencies that you need to add manually (or use Nuget to add them automatically). After you add the required elements  to your project, you will have access to PayClient classes and can start integrating with PayServer. 
The PayClient targets .NET Framework 4 (and above) and should work on any Windows version that supports this version of the .NET Framework. 
The PayClient Sample App contains a small pre-build application that allows you to quickly test connectivity to PayServer. To perform the test, provide the PayServer remote address and your merchant credentials. 
PayClient Assemblies
The PayClient Assemblies include: 
  • Payworks.PayClient.Bridge.dll (Protocol and Models)
  • Payworks.PayClient.Core.dll (Client and Communication)
External Dependencies
The External Dependencies include:
  • NLog (https://www.nuget.org/packages/NLog/, see NLog.dll)
  • Json.NET (https://www.nuget.org/packages/Newtonsoft.Json/, see Newtonsoft.Json.dll)
  • WebSocketSharp (http://www.nuget.org/packages/WebSocketSharp, see websocket-sharp.dll)
When you add the dependencies manually, the resulting reference tree should look similar to the example shown below.
Selecting Login and Device
After adding the PayClient dependencies to your project , you are all set to integrate payments. The following instructions will guide you through the steps required to implement on your side. To use PayClient, configure PayServer to use 
P3_WEBSOCKET
 as the server protocol. 
Initializing a New PosClient 
Initialize a 
PosClient
 instance with your credentials and the address of your PayServer instance you have running. With this instance you have access to all functionality of the PayServer.
PosClient = new PosClient(PAY_SERVER_ADDRESS, PAY_SERVER_PORT);
Connecting to PayServer
Connect to the PayServer to establish a connection and initialize the PayServer with your credentials. After a successful connect you will receive a list of devices that are configured and available for you to use.
PosClient.ConnectAndLogin(MERCHANT_IDENTIFIER, MERCHANT_SECRET, Environment.TEST, (devices, error) => { //check for error //use devices for interaction Device = devices[0]; });
Disconnecting from PayServer
To close the session, disconnect from the server.
PosClient.Disconnect( (error) => { //check for error //this should normally always succeed });
Reconnecting to PayServer
To reconnect after a disconnect, initialize a new 
PosClient
 instance. 
Managing Devices
After a successful log in, you will receive a list of devices that are configured on the PayServer. You can then use the 
Device
 object to start a transaction. Each 
Device
 also contains meta information that has been configured on the server side. You can either choose the first device on the list or inspect the properties to select the device you would like to use. 
Starting a Transaction
You can start a new transaction through the 
ITransactionModule
 from the 
PosClient
.
When starting a new transaction, you provide the 
Device
 and the 
TransactionParameters
 that specify the amount, currency, and other parameters for the transaction. The 
Builder()
 will help you create a suitable set of parameters.
var transactionParameters = new TransactionParameters.Builder() .Charge(10.00m, Currency.EUR) .Subject("Box of chocolates") .CustomIdentifier("yourReferenceForTheTransaction") .Build();
With the created 
TransactionParameters
 you can then start the actual transaction. When starting a transaction, you must provide three callbacks that are used while processing the transaction:
  • The 
    TransactionStatusUpdated
     callback provides you with status information throughout the transaction that you need to show to the merchant.
  • The 
    TransactionActionRequired
     callback informs you that an action, like customer signature, is required for the transaction to continue.
  • The 
    TransactionCompleted
     callback lets you know that the transaction is finished.
In addition, an 
IInteractiveProcess
 is returned, which you can use to abort the transaction and submit a signature if the transaction requires it.
var transactionProcessParameters = new TransactionProcessParameters.Builder().Build(); InteractiveProcess = PosClient.GetTransactionModule().StartTransaction(Device, transactionParameters, transactionProcessParameters, (transaction, transactionProcessDetails, abortable) => { // transaction update information // abortable indicates if the transaction can be aborted in the current state // transactionProcessDetails.Information array indicates human-readable the state information: // always show those two status lines in your merchant-facing UI // transactionProcessDetails.Information[0] // transactionProcessDetails.Information[1] }, (actionType) => { // check for action type if (actionType == Transactions.Actions.ActionType.SIGNATURE) { // submit digital signature. // signature field takes a byte array (byte[]) InteractiveProcess.SubmitSignature(signature, (error) => { // check for error }); // or collect signature on the receipt after transaction InteractiveProcess.SubmitSignatureOnReceipt((error) => { // check for error }); } }, (transaction, transactionProcessDetails, error) => { // check for error if (error != null) { // error indicates that there was a error with the transaction processing // check error.Type and error.Message for more information } else { // Inspect the transaction.Status to get the overall result / transaction completed if (transaction.Status == TransactionStatus.APPROVED) // DECLINED / ABORTED { Console.WriteLine("APPROVED: " + transaction.Identifier); // Save the Transaction.Identifier for later REFUNDs // transaction.Identifier // Provide a printed receipt to the merchant and shopper // transaction.MerchantReceipt // transaction.CustomerReceipt } } });
Using Status Update Callback
The 
transactionProcessDetails.Information[]
 array of the 
TransactionStatusUpdated
 callback will always contain two strings that describe the current state of the transaction.
Make sure to always show those two status lines in your merchant-facing UI.
If you want to further customize your UI based on the state of a transaction, make use of the 
details
 enum that provides fixed workflow steps.
Providing Signature in Action Required Callback
The 
TransasctionActionRequired
 callback informs you that an action is required for the transaction to continue. The 
actionType
 indicates what type of action the transaction is expecting.
If the 
actionType
 is 
ActionType.SIGNATURE
, then you can provide the signature using the 
IInteractiveProcess
 that the 
StartTransaction
 returned as shown in the code snippet above. You can call 
SubmitSignature
 method that accepts a byte array as the digital signature or you can call the 
SubmitSignatureOnReceipt
 method if you want to accept a signature on the receipt after the transaction is complete.
You can also configure the behavior of Signature action in the PayServer.
Aborting a Transaction
Transactions can be aborted directly from the terminal. The feature is usually displayed on the card reader as a red "X". However, it is recommended that you enable the merchant to be able to abort transactions directly from the point-of-sale (POS) system. Not all transactions can be aborted and there are some restrictions on when a transaction can be aborted. The card schemes mandate when an transaction abort can be issued. 
Make use of the 
Abort()
 method on the 
IInteractiveProcess
 that was returned when you started the transaction.
After calling the abort method, wait for the direct callback and also for the 
TransactionCompleted
 callback of the transaction itself.
Aborting a transaction might take a few minutes, depending on its state. Do not assume that the transaction is over after call the method. There will always be a proper 
TransactionCompleted
 callback.
InteractiveProcess.Abort( (status, error) => { //check for error and status });