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.
Name | Details | Required | Description |
---|---|---|---|
amount | Type: string | Yes | The base amount for the transaction request |
externalTransactionId | Type: string | Yes | Version 4 uuid supplied with the request as your unique transaction identifier |
promptTip | Type: boolean | No | When set to "true", a tip prompt will be displayed in the customer facing payment page |
pageExpiration | Type: integer or string | No | The number of seconds until the payment page associated with the transaction expires. The default is 90 days. |
pageDescription | Type: string | No | Field for describing the product or service the customer is making a payment for. This description is displayed in the payment page. |
billingName | Type: string | No | The customer's billing name |
billingAddress | Type: string | No | The customer's billing address associated with their card. Used for AVS verification. |
billingPostalCode | Type: string | No | The customer's billing zip code associated with their card. Used for AVS verification. |
transactionReference | Type: string | No | Your internal order number associated with the transaction |
cashierId | Type: string | No | The 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.
Name | Details | Description |
---|---|---|
paymentPageId | Type: string | The unique identifier of the Text to Pay transaction, to be used in later steps of the transaction process. |
paymentPageUrl | Type: string | The 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;
}
Step 3: Text the Payment Page Link
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.
Text Payment Link Input Fields
Name | Details | Required | Description |
---|---|---|---|
to | Type: string | Yes | The 10 digit destination phone number for the sms, including area code and a "1" prefixing the number |
message | Type: string | Yes | The 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;
}
Text Payment Link Response Fields
These are the fields contained in the textMessageResponse
response object
Name | Details | Description |
---|---|---|
to | Type: string | The "to" number from the request, indicating the number to which the sms was sent |
from | Type: string | The merchant's dedicated sms sending number. This is the number from which the sms was sent |
status | Type: string | The 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
Name | Details | Required | Description |
---|---|---|---|
message | Type: string | No | A 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. |
sendText | Type: boolean | No | A 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
- Encrypt the request body using the SHA512 hash algorithm and your secret key
- Base64 encode the result
- 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"}