Text to Pay

Step 1: Prerequisites

Action Required

Before attempting Step 2, you will need to contact an Integration Specialist so they can set up a sandbox account for you. This account will include your custom branding information, such as your company logo, for display on the payment page generated by a Text to Pay transaction. They will also provide you API credentials linked to this account.

Step 2: Start a Text to Pay Transaction

Merchant server only

The code samples below show how you can start a Text to Pay transaction from your merchant server and generate a paymentPageId. The paymentPageId can be used for making additional server side calls to send the payment page link in an sms message or to cancel the Text to Pay transaction. All Text to Pay API requests are completed server side.

API Endpoints and Credentials

Environment URL
sandbox https://api.emergepay-sandbox.chargeitpro.com/virtualterminal/v1
production https://api.emergepay.chargeitpro.com/virtualterminal/v1

You will also need the id (OID) of your sandbox account and an authToken to authenticate with our API. There are more details about credentials here.

Supported Transactions

Currently a Text to Pay transaction is processed as a CreditSale transaction type by default. This is the only supported transaction type.

Start Text to Pay Input Fields

These fields are the fields sent in the transactionData object found in the request body.

NameDetailsRequiredDescription
amountType: stringYesThe base amount for the transaction request
externalTransactionIdType: stringYesVersion 4 uuid supplied with the request as your unique transaction identifier
promptTipType: booleanNoWhen set to "true", a tip prompt will be displayed in the customer facing payment page
pageExpirationType: integer or stringNoThe number of seconds until the payment page associated with the transaction expires. The default is 90 days.
pageDescriptionType: stringNoField for describing the product or service the customer is making a payment for. This description is displayed in the payment page.
billingNameType: stringNoThe customer's billing name
billingAddressType: stringNoThe customer's billing address associated with their card. Used for AVS verification.
billingPostalCodeType: stringNoThe customer's billing zip code associated with their card. Used for AVS verification.
transactionReferenceType: stringNoYour internal order number associated with the transaction
cashierIdType: stringNoThe id of the cashier initiating the transaction

Level 2 support

This request also supports additional fields for submitting Level 2 enhanced data. See the API Documentation for more details.

Start Text to Pay Response Fields

These are the fields returned in the response object.

NameDetailsDescription
paymentPageIdType: stringThe unique identifier of the Text to Pay transaction, to be used in later steps of the transaction process.
paymentPageUrlType: stringThe url of the payment page where the customer will enter their card details to complete the transaction. This url is returned so that the merchant can forward the link to the customer through whatever medium is preferred, ie email or WhatsApp.
// Code samples for starting a Text to Pay transaction
// install the module below with the following command:
// npm install emergepay-sdk@^1.10
const sdk = require('emergepay-sdk').emergepaySdk;

// Ensure these are set before trying to issue the request.
const oid = process.env.OID;
const authToken = process.env.TOKEN;
const environmentUrl = process.env.BASE_URL;

const emergepay = new sdk({ oid, authToken, environmentUrl });

emergepay.startTextToPayTransaction({  
  amount: "1.00",
  externalTransactionId: emergepay.getExternalTransactionId(),
  // Optional
  promptTip: false,
  pageDescription: "Thanks for your business. This payment is for invoice 1234.",
  pageExpiration: "300",
  billingAddress: "123 Main St",
  billingName: "John Smith",
  billingPostalCode: "90210",
  cashierId: "My Cashier",  
  transactionReference: "1234",
})
.then(response => {
    const { paymentPageId, paymentPageUrl } = response.data;
});
// install the module below with the following command:
// npm install emergepay-sdk@^1.10
import {
  emergepaySdk,
  StartTextToPayTransactionData,
  StartTextToPayTransactionResponse,
} from "emergepay-sdk";

// Ensure these are set before trying to issue the request.
const oid: string = process.env.OID;
const authToken: string = process.env.TOKEN;
const environmentUrl: string = process.env.BASE_URL;

const emergepay = new emergepaySdk({ oid, authToken, environmentUrl });

const request: StartTextToPayTransactionData = {
  amount: "1.00",
  externalTransactionId: emergepay.getExternalTransactionId(),
  // Optional
  promptTip: false,
  pageDescription: "Thanks for your business. This payment is for invoice 1234.",
  pageExpiration: "300",
  billingAddress: "123 Main St",
  billingName: "John Smith",
  billingPostalCode: "90210",
  cashierId: "My Cashier",  
  transactionReference: "1234",
};

emergepay.startTextToPayTransaction(request)
.then((response: StartTextToPayTransactionResponse) => {
    const { paymentPageId, paymentPageUrl } = response.data;
});
<?php

// Ensure these are set before trying to issue the request.
$oid = $_ENV['OID'];
$authToken = $_ENV['TOKEN'];
$environmentUrl = $_ENV['BASE_URL'];

$url = $environmentUrl . '/orgs/' . $oid . '/paymentpages';

// Configure the request body
// externalTransactionId and amount are required.
$body = [
  'transactionData' => [
    'amount' => '1.00',
    'externalTransactionId' => GUID(),
    // Optional
    'promptTip' => false,
    'pageDescription' => 'Thanks for your business. This payment is for invoice 1234.',
    'pageExpiration' => '300',
    'billingAddress' => '123 Main St',
    'billingName' => 'John Smith',
    'billingPostalCode' => '90210',
    'cashierId' => 'My Cashier',
    'transactionReference' => '1234',
  ]
];

$payload = json_encode($body);

//Configure the request
$request = curl_init($url);
curl_setopt($request, CURLOPT_HEADER, false);
curl_setopt($request, CURLOPT_RETURNTRANSFER, true);
curl_setopt($request, CURLOPT_HTTPHEADER, array('Content-Type: application/json', 'Content-Length: ' . strlen($payload), 'Authorization: Bearer ' . $authToken));
curl_setopt($request, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($request, CURLOPT_POSTFIELDS, $payload);

//Issue the request and get the result
$response = curl_exec($request);
echo $response;
curl_close($request);

//Helper function used to generate a GUID/UUID
//source: http://php.net/manual/en/function.com-create-guid.php#99425
function GUID()
{
    if (function_exists('com_create_guid') === true)
    {
        return trim(com_create_guid(), '{}');
    }

    return sprintf('%04X%04X-%04X-%04X-%04X-%04X%04X%04X', mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(16384, 20479), mt_rand(32768, 49151), mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(0, 65535));
}
public static async Task<object> StartTextToPayTransactionAsync()
{
  var response = new object();

  // Ensure these are set before trying to issue the request.
  var OID = Environment.GetEnvironmentVariable("OID");
  var AUTH_TOKEN = Environment.GetEnvironmentVariable("TOKEN");
  var ENDPOINT_URL = Environment.GetEnvironmentVariable("BASE_URL");

  string url = $"{ENDPOINT_URL}/orgs/{OID}/paymentpages";

  var contents = new
  {
    transactionData = new
    {
      amount = "1.00",
      externalTransactionId = Guid.NewGuid().ToString(),
      // Optional
      promptTip = false,
      pageDescription = "Thanks for your business. This payment is for invoice 1234.",
      pageExpiration = "300",
      billingAddress = "123 Main St",
      billingName = "John Smith",
      billingPostalCode = "90210",
      cashierId = "My Cashier",
      transactionReference = "1234",      
    }
  };

  try
  {
    using (var client = new HttpClient())
    {
      var transactionJson = JsonConvert.SerializeObject(contents);

      HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, url);
      request.Headers.Add("Authorization", $"Bearer {AUTH_TOKEN}");
      request.Content = new StringContent(transactionJson, Encoding.UTF8, "application/json");

      var httpResponse = await client.SendAsync(request);
      var data = await httpResponse.Content.ReadAsStringAsync();
      response = JsonConvert.DeserializeObject(data);
    }
  }
  catch (Exception exc)
  {
    throw exc;
  }

  return response;
}

Optional Request

This request is only required if you choose to send the payment page link to the customer by sms with a custom message. The path in the request url includes the paymentPageId from the initial request in Step 2: {environmentUrl}/orgs/{oid}/paymentpages/{paymentPageId}/text

Sender Identification

It is required by the mobile networks for campaign messaging that a sender always identifies themselves in each message sent to a receiver. This means the merchant’s DBA name should be included in the body of the text message so the customer can easily identify who is requesting payment.

Dedicated SMS Number

Each merchant will be issued a dedicated SMS sending number. This is done to scope receiver opt out handling at the merchant level. The mobile networks prohibit sending a receiver any more messages from a given phone number once the receiver has requested to opt on further messaging from that number.

Destination Number

We support sending to a single destination number throughout the lifecycle of a transaction. After sending your first message, if you choose to send additional messages through the Text Payment Link endpoint, you must include the same phone number as in your original request to the endpoint. If you would like to change the destination phone number you will need to cancel the transaction and create a new Text to Pay transaction.

NameDetailsRequiredDescription
toType: stringYesThe 10 digit destination phone number for the sms, including area code and a "1" prefixing the number
messageType: stringYesThe body of the sms message. We allow you to add the placeholder "{link}" in your message to designate where you would like the payment link embedded in the message. Otherwise we append the link to the end of the message.
// Code samples for running a Text Payment Link request
// install the module below with the following command:
// npm install emergepay-sdk@^1.10
const sdk = require('emergepay-sdk').emergepaySdk;

// Ensure these are set before trying to issue the request.
const oid: string = process.env.OID;
const authToken: string = process.env.TOKEN;
const environmentUrl: string = process.env.BASE_URL;

const paymentPageId = "value from Step 2";

const emergepay = new sdk({ oid, authToken, environmentUrl });

emergepay.textPaymentPage({  
  paymentPageId,
  to: "15551234567",
  message: "text message body",  
})
.then(response => {
    const { status, from, to } = response.data;
});
// install the module below with the following command:
// npm install emergepay-sdk@^1.10
import {
  emergepaySdk,
  TextPaymentPageData,
  TextPaymentPageResponse,
} from "emergepay-sdk";

// Ensure these are set before trying to issue the request.
const oid: string = process.env.OID;
const authToken: string = process.env.TOKEN;
const environmentUrl: string = process.env.BASE_URL;

const paymentPageId = "value from Step 2";

const emergepay = new emergepaySdk({ oid, authToken, environmentUrl });

const request: TextPaymentPageData = {
  paymentPageId,
  to: "15551234567",
  message: "text message body",
};

emergepay.textPaymentPage(request)
.then((response: TextPaymentPageResponse) => {
    const { status, from, to } = response.data;
});
<?php

// Ensure these are set before trying to issue the request.
$oid = $_ENV['OID'];
$authToken = $_ENV['TOKEN'];
$environmentUrl = $_ENV['BASE_URL'];

$paymentPageId = 'value from Step 2';

$url = $environmentUrl . '/orgs/' . $oid . '/paymentpages/' . $paymentPageId . '/text';

// Configure the request body
// all fields are required
$body = [
    'to' => '15551234567',
    'message' => 'text message body',
];

$payload = json_encode($body);

//Configure the request
$request = curl_init($url);
curl_setopt($request, CURLOPT_HEADER, false);
curl_setopt($request, CURLOPT_RETURNTRANSFER, true);
curl_setopt($request, CURLOPT_HTTPHEADER, array('Content-Type: application/json', 'Content-Length: ' . strlen($payload), 'Authorization: Bearer ' . $authToken));
curl_setopt($request, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($request, CURLOPT_POSTFIELDS, $payload);

//Issue the request and get the result
$response = curl_exec($request);
echo $response;
curl_close($request);

//Helper function used to generate a GUID/UUID
//source: http://php.net/manual/en/function.com-create-guid.php#99425
function GUID()
{
    if (function_exists('com_create_guid') === true)
    {
        return trim(com_create_guid(), '{}');
    }

    return sprintf('%04X%04X-%04X-%04X-%04X-%04X%04X%04X', mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(16384, 20479), mt_rand(32768, 49151), mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(0, 65535));
}
public static async Task<object> TextPaymentLinkAsync()
{
  var response = new object();

  // Ensure these are set before trying to issue the request.
  var OID = Environment.GetEnvironmentVariable("OID");
  var AUTH_TOKEN = Environment.GetEnvironmentVariable("TOKEN");
  var ENDPOINT_URL = Environment.GetEnvironmentVariable("BASE_URL");

  const string paymentPageId = "value from Step 2";

  string url = $"{ENDPOINT_URL}/orgs/{OID}/paymentpages/{paymentPageId}/text";

  // Configure the request body
  // all fields are required
  var contents = new
  {
    to = "15551234567",
    message = "text message body"
  };

  try
  {
    using (var client = new HttpClient())
    {
      var transactionJson = JsonConvert.SerializeObject(contents);

      HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, url);
      request.Headers.Add("Authorization", $"Bearer {AUTH_TOKEN}");
      request.Content = new StringContent(transactionJson, Encoding.UTF8, "application/json");

      var httpResponse = await client.SendAsync(request);
      var data = await httpResponse.Content.ReadAsStringAsync();
      response = JsonConvert.DeserializeObject(data);
    }
  }
  catch (Exception exc)
  {
    throw exc;
  }

  return response;
}
NameDetailsDescription
toType: stringThe "to" number from the request, indicating the number to which the sms was sent
fromType: stringThe merchant's dedicated sms sending number. This is the number from which the sms was sent
statusType: stringThe status of the sms request. A value of "queued" indicates the sms was received successfully by our sms provider.

Step 4: Cancel a Text to Pay Transaction

Optional Request

This request is only required if you choose to cancel the payment page link before the expiration date designated in the request in Step 2 (or the default 90 day expiration period if no date was set in the original request). This request can be sent whether or not a request has been made to the Text Payment Link endpoint. The path in the request url includes the paymentPageId from the initial request in Step 2: DELETE {environmentUrl}/orgs/{oid}/paymentpages/{paymentPageId}

Not Reversible

This request will finalize the transaction and is not reversible. You will not be able to make additional calls to modify the Text to Pay transaction and the customer will not be able to complete payment in the associated payment page after a successful call to the cancellation endpoint.

Cancel a Text to Pay Transaction Input Fields

NameDetailsRequiredDescription
messageType: stringNoA custom cancellation message to send the customer via sms. The message will be sent to the "to" number from the prior request to text the payment page link.
sendTextType: booleanNoA boolean indicating if you would like a cancellation message sent. If set to "true", and the "message" property is omitted, then a generic cancellation message is sent.
// Code samples for sending a Cancel a Text to Pay Transaction request
// install the module below with the following command:
// npm install emergepay-sdk@^1.10
const sdk = require('emergepay-sdk').emergepaySdk;

// Ensure these are set before trying to issue the request.
const oid = process.env.OID;
const authToken = process.env.TOKEN;
const environmentUrl = process.env.BASE_URL;

const paymentPageId = "value from Step 2";

const emergepay = new sdk({ oid, authToken, environmentUrl });

emergepay.cancelTextToPayTransaction({  
  paymentPageId,
  sendText: true,
  message: "canceling text to pay transaction",  
})
.then(response => {
    const transactionResult = response.data;
});
// install the module below with the following command:
// npm install emergepay-sdk@^1.10
import {
  emergepaySdk,
  CancelTextToPayTransactionData,
  TransactionResponse,
} from "emergepay-sdk";

// Ensure these are set before trying to issue the request.
const oid: string = process.env.OID;
const authToken: string = process.env.TOKEN;
const environmentUrl: string = process.env.BASE_URL;

const paymentPageId = "value from Step 2";

const emergepay = new emergepaySdk({ oid, authToken, environmentUrl });

const request: CancelTextToPayTransactionData = {
  paymentPageId,
  sendText: true,
  message: "canceling text to pay transaction",	
};

emergepay.cancelTextToPayTransaction(request)
.then((response: TransactionResponse) => {
    const transactionResult = response.data;
});
<?php

// Ensure these are set before trying to issue the request.
$oid = $_ENV['OID'];
$authToken = $_ENV['TOKEN'];
$environmentUrl = $_ENV['BASE_URL'];

$paymentPageId = 'value from Step 2';

$url = $environmentUrl . '/orgs/' . $oid . '/paymentpages/' . $paymentPageId;

// Configure the request body
$body = [
    'sendText' => true,
    'message' => 'canceling text to pay transaction',
];

$payload = json_encode($body);

//Configure the request
$request = curl_init($url);
curl_setopt($request, CURLOPT_HEADER, false);
curl_setopt($request, CURLOPT_RETURNTRANSFER, true);
curl_setopt($request, CURLOPT_HTTPHEADER, array('Content-Type: application/json', 'Content-Length: ' . strlen($payload), 'Authorization: Bearer ' . $authToken));
curl_setopt($request, CURLOPT_CUSTOMREQUEST, "DELETE");
curl_setopt($request, CURLOPT_POSTFIELDS, $payload);

//Issue the request and get the result
$response = curl_exec($request);
echo $response;
curl_close($request);

//Helper function used to generate a GUID/UUID
//source: http://php.net/manual/en/function.com-create-guid.php#99425
function GUID()
{
    if (function_exists('com_create_guid') === true)
    {
        return trim(com_create_guid(), '{}');
    }

    return sprintf('%04X%04X-%04X-%04X-%04X-%04X%04X%04X', mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(16384, 20479), mt_rand(32768, 49151), mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(0, 65535));
}
public static async Task<object> CancelTextToPayTransactionAsync()
{
  var response = new object();

  // Ensure these are set before trying to issue the request.
  var OID = Environment.GetEnvironmentVariable("OID");
  var AUTH_TOKEN = Environment.GetEnvironmentVariable("TOKEN");
  var ENDPOINT_URL = Environment.GetEnvironmentVariable("BASE_URL");

  const string paymentPageId = "value from Step 2";

  string url = $"{ENDPOINT_URL}/orgs/{OID}/paymentpages/{paymentPageId}";

  // Configure the request body
  // all fields are required
  var contents = new
  {
    sendText = true,
    message = "canceling text to pay transaction"
  };

  try
  {
    using (var client = new HttpClient())
    {
      var transactionJson = JsonConvert.SerializeObject(contents);

      HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Delete, url);
      request.Headers.Add("Authorization", $"Bearer {AUTH_TOKEN}");
      request.Content = new StringContent(transactionJson, Encoding.UTF8, "application/json");

      var httpResponse = await client.SendAsync(request);
      var data = await httpResponse.Content.ReadAsStringAsync();
      response = JsonConvert.DeserializeObject(data);
    }
  }
  catch (Exception exc)
  {
    throw exc;
  }

  return response;
}

Cancel a Text to Pay Transaction Result

Because this call is synchronous, the final transaction result will be returned. This will match the data format of the sample transaction result at the end of this article wrapped in a transactionResponse property. Unless the transaction is explicitly cancelled, the transaction result will need to be received via postback.

Step 5: Transaction Results

Postback required

Postback is the required method for retrieving a Text to Pay transaction result

Multiple postbacks

Unlike other integration methods, merchants may receive multiple postbacks for the same Text to Pay transaction. This is because if a consumer’s card declines when they are filling out the payment form, we allow the consumer to reenter another card to complete payment.

We forward all transaction results for Text to Pay, including declines, to the merchant’s postback endpoint. This allows the merchant and partner to accumulate a complete audit trail for any transaction. Because of this, the integration partner should be prepared to handle multiple postbacks for the same transaction. Transactions can be uniquely identified and matched to the original Text to Pay request using the externalTransactionId within the transactionResponse object of the postback payload.

Once a result is received with a resultStatus of "true" for a given transaction, there will be no more postbacks for that transaction.

Postback Validation

HMAC Signature Validation

Post-back results should be verified using the HMAC signature found in the request header.

  • one-way SHA-512 message digest
  • encrypted using a secret passphrase you setup with your integration specialist and is then base64 encoded
  • digest is included in the request header as hmac-signature

Verify HMAC signature

  1. Encrypt the request body using the SHA512 hash algorithm and your secret key
  2. Base64 encode the result
  3. Compare the resulting value with the hmac-signature header value

What's a 'secret passphrase'?

Similar to the OID and authToken, the secret passphrase is a unique variable that is tied to each individual merchant account.

These are code samples for implementing postback validation
var express = require("express");
var cors    = require("cors");
var crypto  = require("crypto");

var app = express();
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
app.use(cors());

app.post("/PostBackListener", (req, res) => {
    var hmacSignature = req.header("hmac-signature");
    var rawData = req.body;
    var jsonData = JSON.stringify(rawData);

    var signatureMatched = false;

    if (hmacSignature) {
        signatureMatched = verifyHmacSignature(hmacSignature, jsonData);
    }

    //if the hmac signature matched, the response body data is valid
    if (signatureMatched) {
        //do something with the transaction result
    }

    res.sendStatus(200);
});

function verifyHmacSignature(hmacSignature, data) {
    //this is the secret pass phrase you supplied to Gravity Payments
    var secretKey = "cipDemoListenerKey";

    var hmac = crypto.createHmac("sha512", secretKey);
    hmac.update(data);
    return hmac.digest("base64") === hmacSignature;
}

console.log("listening on port 5555");
app.listen(5555);
import * as express from 'express';
import * as cors from 'cors';
import * as crypto from 'crypto';

const app = express();
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
app.use(cors());

app.post("/PostBackListener", (req, res) => {
    const hmacSignature = req.header("hmac-signature");
    const rawData = req.body;
    const jsonData = JSON.stringify(rawData);

    let signatureMatched = false;

    if (hmacSignature) {
        signatureMatched = verifyHmacSignature(hmacSignature, jsonData);
    }

    //if the hmac signature matched, the response body data is valid
    if (signatureMatched) {
        //do something with the transaction result
    }

    res.sendStatus(200);
});

function verifyHmacSignature(hmacSignature: string, data: string): boolean {
    //this is the secret pass phrase you supplied to Gravity Payments
    const secretKey = "cipDemoListenerKey";

    const hmac = crypto.createHmac("sha512", secretKey);
    hmac.update(data);
    return hmac.digest("base64") === hmacSignature;
}

console.log("listening on port 5555");
app.listen(5555);
$headers = getallheaders();
$body = file_get_contents("php://input");
$jsonData = json_encode(json_decode($body));

$signatureMatched = false;

if (array_key_exists("hmac-signature", $headers)) {
    $hmacSignature = $headers["hmac-signature"];

    $signatureMatched = verifyHmacSignature($hmacSignature, $jsonData);
}

// if the hmac signature matched, the response body data is valid
if ($signatureMatched) {
    // do something with the transaction result
}

function verifyHmacSignature(string $hmacSignature, string $data) {
    // this is the secret pass phrase you supplied to Gravity Payments
    $secretKey = "yourSecretPassPhrase";

    $hmac = hash_hmac("sha512", $data, $secretKey, true);

    return base64_encode($hmac) == $hmacSignature;
}
[HttpPost]
public void PostBackListener()
{
  var reader = new StreamReader(Request.Body);
  var bodyContents = reader.ReadToEnd();
  var transactionResult = JsonConvert.DeserializeObject(bodyContents);
  var rawData = JsonConvert.DeserializeObject(bodyContents);
  var jsonData = JsonConvert.SerializeObject(rawData);

  //verify the hmac signature with our secret pass phrase
  bool hmacSignatureExists = Request.Headers.TryGetValue("hmac-signature", out var hmacSignature);
  bool signatureMatched = false;

  if (hmacSignatureExists)
  {
    string signature = hmacSignature.ToString();
    byte[] data = Encoding.UTF8.GetBytes(jsonData);
    signatureMatched = VerifyHmacSignature(signature, data);
  }

  //if the hmac signature matched, the response body data is valid
  if (signatureMatched)
  {
        //do something with the transaction result
  }
}

private bool VerifyHmacSignature(string hmacSignature, byte[] data)
{
  //this is the secret pass phrase you supplied to Gravity Payments
  const string secretKey = "yourSecretPassPhrase";

  using (HMACSHA512 hmac = new HMACSHA512(Encoding.UTF8.GetBytes(secretKey)))
  {
    byte[] computedHash = hmac.ComputeHash(data);
    string computedSignature = Convert.ToBase64String(computedHash);
    return hmacSignature == computedSignature;
  }
}

Example Transaction Result

{"accountCardType":"VS","accountEntryMethod":"Keyed","accountExpiryDate":"1027","amount":"0.01","amountBalance":"","amountProcessed":"0.01","amountTaxed":"0.00","amountTipped":"0.00","approvalNumberResult":"256171","avsResponseCode":"Y","avsResponseText":"Address: Match & 5 Digit Zip: Match","batchNumber":"0","billingName":"","cashier":"","cvvResponseCode":"P","cvvResponseText":"Not Processed","externalTransactionId":"4b07fa33-c03e-48c0-ba3c-0e02d98f5fb3","isPartialApproval":false,"maskedAccount":"************1111","resultMessage":"Approved","resultStatus":"true","transactionReference":"","transactionType":"CreditSale","uniqueTransId":"aec21bf6779544f4be812c29beba7024-a5300e56fb6b40ea9ee28b6c14e6e3ed"}