NAV
xml csharp node.js php

    Gateway Direct Api

XML Product Specification 1-1-9.1

Zappte™ XML Product Specification
Document revision 1-1-9.1 February 2024

Transaction Request Message

The following table shows the logical structure of the transaction request message. The Document Structure column lists the element name and its place in the message structure in order and indentation. The Qualifications column explains the conditions for supplying that element to a transaction.

Transaction Element Definitions

The following properties describe the request transactions.

Transaction Response Message

The following table describes the logical structure of the transaction response message, sent in response to an initiating transaction request message.

Response Transaction Element Definitions

The following properties describe the request messages:

If network error response is received on gateway, it is likely we will automatically void the transaction but best practice is to ENQ anyway.

General Examples

The following is a sample 'AUTHONLY' transaction for $87.99:

<ippay>
   <TransactionType>AUTHONLY</TransactionType>
   <TerminalID>TESTTERMINAL</TerminalID>
   <TransactionID>010327153017T10018</TransactionID>
   <CardNum>4000300020001000</CardNum>
   <CardExpMonth>12</CardExpMonth>
   <CardExpYear>14</CardExpYear>
   <TotalAmount>8799</TotalAmount>
</ippay>
var httpClient = new HttpClient();
var bodyXmlString =@"<ippay>" + "\n" +
@"   <TransactionType>AUTHONLY</TransactionType>" + "\n" +
@"   <TerminalID>TESTTERMINAL</TerminalID>" + "\n" +
@"   <TransactionID>010327153017T10018</TransactionID>" + "\n" +
@"   <CardNum>4000300020001000</CardNum>" + "\n" +
@"   <CardExpMonth>12</CardExpMonth>" + "\n" +
@"   <CardExpYear>14</CardExpYear>" + "\n" +
@"   <TotalAmount>8799</TotalAmount>" + "\n" +
@"</ippay>";

var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://testgtwy.ippay.com/ippay/", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://testgtwy.ippay.com/ippay/',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '<ippay>\n   <TransactionType>AUTHONLY</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <TransactionID>010327153017T10018</TransactionID>\n   <CardNum>4000300020001000</CardNum>\n   <CardExpMonth>12</CardExpMonth>\n   <CardExpYear>14</CardExpYear>\n   <TotalAmount>8799</TotalAmount>\n</ippay>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://testgtwy.ippay.com/ippay/');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('<ippay>\n   <TransactionType>AUTHONLY</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <TransactionID>010327153017T10018</TransactionID>\n   <CardNum>4000300020001000</CardNum>\n   <CardExpMonth>12</CardExpMonth>\n   <CardExpYear>14</CardExpYear>\n   <TotalAmount>8799</TotalAmount>\n</ippay>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

The following shows the sample response to the above 'AUTHONLY' request:

<ippayResponse>
   <TransactionID>010327153017T10018</TransactionID>
   <ActionCode>000</ActionCode>
   <Approval>502F6B</Approval>
   <ResponseText>APPROVED</ResponseText>
</ippayResponse>

The following examples illustrate the transaction messages, showing a sample request message with a corresponding sample response message.

AUTHONLY Transaction Example  

An 'AUTHONLY' transaction is the most basic type of transaction. In an 'AUTHONLY' transaction, the Gateway Provider accepts the XML transaction block containing the credit card transaction information, retrieves an authorization response from the issuer of the credit card, and responds back to the original sender with that resulting authorization information.

Required data for an 'AUTHONLY' transaction request is:

<TransactionType> = AUTHONLY
<TerminalID> = your terminal ID, assigned by the Gateway Provider
<TransactionID> = Optional: character string, exactly eighteen characters long, if used, a unique value is required
<CardNum> = valid credit card number
<CardExpMonth> = credit card expiration month (two digits)
<CardExpYear> = credit card expiration year (two digits)
<TotalAmount> = transaction amount (digits only)

Minimum data returned from a successful 'AUTHONLY' transaction response is:

<TransactionID> = matching the value in the request, above or generated by the Gateway Provider if no value is sent.
<ActionCode> = 000
<Approval> = character string exactly six characters long
<ResponseText> = the transaction’s outcome status

CAPT Transaction Example  

This first 'CAPT' transaction demonstrates the primary way to complete a sale for the 'AUTHONLY' transaction example from the previous section:

<ippay>
   <TransactionType>CAPT</TransactionType>
   <TerminalID>TESTTERMINAL</TerminalID>
   <TransactionID>010327153017T10018</TransactionID>
</ippay>
var httpClient = new HttpClient();
var bodyXmlString =@"<ippay>" + "\n" +
@"   <TransactionType>CAPT</TransactionType>" + "\n" +
@"   <TerminalID>TESTTERMINAL</TerminalID>" + "\n" +
@"   <TransactionID>010327153017T10018</TransactionID>" + "\n" +
@"</ippay>";

var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://testgtwy.ippay.com/ippay/", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://testgtwy.ippay.com/ippay/',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '<ippay>\n   <TransactionType>CAPT</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <TransactionID>010327153017T10018</TransactionID>\n</ippay>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://testgtwy.ippay.com/ippay/');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('<ippay>\n   <TransactionType>CAPT</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <TransactionID>010327153017T10018</TransactionID>\n</ippay>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

For this first 'CAPT' transaction, the following response illustrates how the returning XML would look:

<ippayResponse>
   <TransactionID>010327153017T10018</TransactionID>
   <ActionCode>000</ActionCode>
   <Approval>502F6B</Approval>
   <ResponseText>APPROVED</ResponseText>
</ippayResponse>

The second 'CAPT' transaction demonstrates the alternative way to complete a sale for the 'AUTHONLY' transaction example from the previous section:

<ippay>
   <TransactionType>CAPT</TransactionType>
   <TerminalID>TESTTERMINAL</TerminalID>
   <TransactionID>555555555555T10018</TransactionID>
   <CardNum>4000300020001000</CardNum>
   <CardExpMonth>12</CardExpMonth>
   <CardExpYear>14</CardExpYear>
   <TotalAmount>8799</TotalAmount>
   <Approval>502F6B</Approval>
</ippay>
var httpClient = new HttpClient();
var bodyXmlString = @"<ippay>" + "\n" +
@"   <TransactionType>CAPT</TransactionType>" + "\n" +
@"   <TerminalID>TESTTERMINAL</TerminalID>" + "\n" +
@"   <TransactionID>555555555555T10018</TransactionID>" + "\n" +
@"   <CardNum>4000300020001000</CardNum>" + "\n" +
@"   <CardExpMonth>12</CardExpMonth>" + "\n" +
@"   <CardExpYear>14</CardExpYear>" + "\n" +
@"   <TotalAmount>8799</TotalAmount>" + "\n" +
@"   <Approval>502F6B</Approval>" + "\n" +
@"</ippay>";

var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://testgtwy.ippay.com/ippay/", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://testgtwy.ippay.com/ippay/',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '<ippay>\n   <TransactionType>CAPT</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <TransactionID>555555555555T10018</TransactionID>\n   <CardNum>4000300020001000</CardNum>\n   <CardExpMonth>12</CardExpMonth>\n   <CardExpYear>14</CardExpYear>\n   <TotalAmount>8799</TotalAmount>\n   <Approval>502F6B</Approval>\n</ippay>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://testgtwy.ippay.com/ippay/');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('<ippay>\n   <TransactionType>CAPT</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <TransactionID>555555555555T10018</TransactionID>\n   <CardNum>4000300020001000</CardNum>\n   <CardExpMonth>12</CardExpMonth>\n   <CardExpYear>14</CardExpYear>\n   <TotalAmount>8799</TotalAmount>\n   <Approval>502F6B</Approval>\n</ippay>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

For the above 'CAPT' transaction, the following response illustrates how the returning XML would look:

<ippayResponse>
   <TransactionID>555555555555T10018</TransactionID>
   <ActionCode>000</ActionCode>
   <Approval>502F6B</Approval>
   <ResponseText>APPROVED</ResponseText>
</ippayResponse>

When the Gateway Provider declines a 'CAPT' transaction, the response would look like this:

<ippayResponse>
   <ActionCode>940</ActionCode>
   <ResponseText>RECORD NOT FOUND</ResponseText>
</ippayResponse>

A 'CAPT' (or 'capture') transaction enables a previously authorized transaction to be settled into a complete sale. In a 'CAPT' transaction, the Gateway Provider accepts the XML transaction block containing the credit card transaction information, looks up the matching authorized transaction, and responds back to the original sender with the resulting sale information.

The matching 'AUTHONLY' transaction for this capture operation must have been authorized through the Gateway Provider in order for the 'CAPT' transaction to be successful. If a transaction was not authorized through the Gateway Provider, the response to the 'CAPT' will indicate that the authorization was not found.

Submitted data for a 'CAPT' transaction request are:

<TransactionType> = CAPT (required)
<TerminalID> = your terminal ID, assigned by the Gateway Provider (required)
<TransactionID> = character string, exactly eighteen characters long, either matching the target 'AUTHONLY' transaction or otherwise containing a unique value. (required)

<CardNum> = target credit card number
<CardExpMonth> = credit card expiration month (two digits)
<CardExpYear> = credit card expiration year (two digits)
OR
<Token> - A token can also be submitted here instead of the card number and expiry.

<Approval> = six characters long, matching the code from 'AUTHONLY' transaction
<TotalAmount> = transaction amount (digits only)

Minimum data returned from a successful 'AUTHONLY' transaction response are:

<TransactionID> = matching the value in the request, above or generated by the Gateway Provider if no value is sent
<ActionCode> = 000
<Approval> = character string exactly six characters long
<ResponseText> = the transaction’s outcome status

'Capturing' an authorized transaction gets accomplished in two ways:

  1. Submitting the matching transaction ID for the authorization (primary way)
  2. Submitting the credit card information along with a matching total amount and authorization code (secondary way, if primary way gets no match).

SALE Transaction Example    

The following is a sample 'SALE' transaction for $999.99, using a Visa card:

<ippay>
   <TransactionType>SALE</TransactionType>
   <TerminalID>TESTTERMINAL</TerminalID>
   <TransactionID>010327153017T10017</TransactionID>
   <CardNum>4000300020001000</CardNum>
   <CardExpMonth>12</CardExpMonth>
   <CardExpYear>14</CardExpYear>
   <TotalAmount>99999</TotalAmount>
</ippay>
var httpClient = new HttpClient();
var bodyXmlString = @"<ippay>" + "\n" +
@"   <TransactionType>SALE</TransactionType>" + "\n" +
@"   <TerminalID>TESTTERMINAL</TerminalID>" + "\n" +
@"   <TransactionID>010327153017T10017</TransactionID>" + "\n" +
@"   <CardNum>4000300020001000</CardNum>" + "\n" +
@"   <CardExpMonth>12</CardExpMonth>" + "\n" +
@"   <CardExpYear>14</CardExpYear>" + "\n" +
@"   <TotalAmount>99999</TotalAmount>" + "\n" +
@"</ippay>";

var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://testgtwy.ippay.com/ippay/", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://testgtwy.ippay.com/ippay/',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '<ippay>\n   <TransactionType>SALE</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <TransactionID>010327153017T10017</TransactionID>\n   <CardNum>4000300020001000</CardNum>\n   <CardExpMonth>12</CardExpMonth>\n   <CardExpYear>14</CardExpYear>\n   <TotalAmount>99999</TotalAmount>\n</ippay>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://testgtwy.ippay.com/ippay/');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('<ippay>\n   <TransactionType>SALE</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <TransactionID>010327153017T10017</TransactionID>\n   <CardNum>4000300020001000</CardNum>\n   <CardExpMonth>12</CardExpMonth>\n   <CardExpYear>14</CardExpYear>\n   <TotalAmount>99999</TotalAmount>\n</ippay>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

The following shows how the successful response would look:

<ippayResponse>
   <TransactionID>010327153017T10017</TransactionID>
   <ActionCode>000</ActionCode>
   <Approval>002F6B</Approval>
   <ResponseText>APPROVED</ResponseText>
</ippayResponse>

A 'SALE' transaction is a 'two-in-one' operation, completing both an 'AUTHONLY' transaction and a 'CAPT' transaction using only a single submission.

The required data for a 'SALE' transaction request are the same as for an 'AUTHONLY' transaction request (except that the TransactionType is 'SALE' instead of 'AUTHONLY'). The minimum data returned from a successful 'SALE' transaction response are the same as for an 'AUTHONLY' transaction response.

Third party gateway – SALE Transaction Example

POS Sale transactions performed by stand alone or semi-integrated terminals such as Verifone, Magtek, Dejavoo, and Pax will have transaction data delayed in the reporting system up to 1 hour. The Gateway will have no knowledge of this transaction until pulled from the processor and populated in the DB with transaction details.

Request XML:

<ippay>
   <Origin>INTERNET</Origin>
   <TerminalID>TESTTERMINAL</TerminalID>
   <TransactionID> MND000000000139053</TransactionID>
   <UDField1>ERID0000000001</UDField1>
   <TransactionType>SALE</TransactionType>
   <TotalAmount>123</TotalAmount>
   <CardNum CardPresent='false'>4111111111111111</CardNum>
   <CardExpMonth>12</CardExpMonth>
   <CardExpYear>17</CardExpYear>
   <CVV2>123</CVV2>
</ippay>
var httpClient = new HttpClient();
var bodyXmlString = @"<ippay>" + "\n" +
@"   <Origin>INTERNET</Origin>" + "\n" +
@"   <TerminalID>TESTTERMINAL</TerminalID>" + "\n" +
@"   <TransactionID> MND000000000139053</TransactionID>" + "\n" +
@"   <UDField1>ERID0000000001</UDField1>" + "\n" +
@"   <TransactionType>SALE</TransactionType>" + "\n" +
@"   <TotalAmount>123</TotalAmount>" + "\n" +
@"   <CardNum CardPresent='false'>4111111111111111</CardNum>" + "\n" +
@"   <CardExpMonth>12</CardExpMonth>" + "\n" +
@"   <CardExpYear>17</CardExpYear>" + "\n" +
@"   <CVV2>123</CVV2>" + "\n" +
@"</ippay>";

var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://testgtwy.ippay.com/ippay/", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://testgtwy.ippay.com/ippay/',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '<ippay>\n   <Origin>INTERNET</Origin>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <TransactionID> MND000000000139053</TransactionID>\n   <UDField1>ERID0000000001</UDField1>\n   <TransactionType>SALE</TransactionType>\n   <TotalAmount>123</TotalAmount>\n   <CardNum CardPresent=\'false\'>4111111111111111</CardNum>\n   <CardExpMonth>12</CardExpMonth>\n   <CardExpYear>17</CardExpYear>\n   <CVV2>123</CVV2>\n</ippay>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://testgtwy.ippay.com/ippay/');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('<ippay>\n   <Origin>INTERNET</Origin>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <TransactionID> MND000000000139053</TransactionID>\n   <UDField1>ERID0000000001</UDField1>\n   <TransactionType>SALE</TransactionType>\n   <TotalAmount>123</TotalAmount>\n   <CardNum CardPresent=\'false\'>4111111111111111</CardNum>\n   <CardExpMonth>12</CardExpMonth>\n   <CardExpYear>17</CardExpYear>\n   <CVV2>123</CVV2>\n</ippay>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

Response XML:

<ippayResponse>
   <TransactionID> MND000000000139053</TransactionID>
   <ActionCode>000</ActionCode>
   <Approval>TEST06</Approval>
   <CVV2>P</CVV2>
   <ResponseText>APPROVED</ResponseText>
</ippayResponse>

VOID Transaction Example  

Presuming that the target sale transaction was successfully approved and has not yet settled, the following 'VOID' transaction removes that target sale:

<ippay>
   <TransactionType>VOID</TransactionType>
   <TerminalID>TESTTERMINAL</TerminalID>
   <TransactionID>010327153017T10018</TransactionID>
   <CardNum>4000300020001000</CardNum>
   <CardExpMonth>12</CardExpMonth>
   <CardExpYear>14</CardExpYear>
   <TotalAmount>8799</TotalAmount>
   <Approval>502F6B</Approval>
</ippay>
var httpClient = new HttpClient();
var bodyXmlString = @"<ippay>" + "\n" +
@"   <TransactionType>VOID</TransactionType>" + "\n" +
@"   <TerminalID>TESTTERMINAL</TerminalID>" + "\n" +
@"   <TransactionID>010327153017T10018</TransactionID>" + "\n" +
@"   <CardNum>4000300020001000</CardNum>" + "\n" +
@"   <CardExpMonth>12</CardExpMonth>" + "\n" +
@"   <CardExpYear>14</CardExpYear>" + "\n" +
@"   <TotalAmount>8799</TotalAmount>" + "\n" +
@"   <Approval>502F6B</Approval>" + "\n" +
@"</ippay>";

var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://testgtwy.ippay.com/ippay/", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://testgtwy.ippay.com/ippay/',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '<ippay>\n   <TransactionType>VOID</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <TransactionID>010327153017T10018</TransactionID>\n   <CardNum>4000300020001000</CardNum>\n   <CardExpMonth>12</CardExpMonth>\n   <CardExpYear>14</CardExpYear>\n   <TotalAmount>8799</TotalAmount>\n   <Approval>502F6B</Approval>\n</ippay>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://testgtwy.ippay.com/ippay/');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('<ippay>\n   <TransactionType>VOID</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <TransactionID>010327153017T10018</TransactionID>\n   <CardNum>4000300020001000</CardNum>\n   <CardExpMonth>12</CardExpMonth>\n   <CardExpYear>14</CardExpYear>\n   <TotalAmount>8799</TotalAmount>\n   <Approval>502F6B</Approval>\n</ippay>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

The following shows how the response to the 'VOID' transaction would look:

<ippayResponse>
   <TransactionID>010327153017T10018</TransactionID>
   <ActionCode>000</ActionCode>
   <Approval>502F6B</Approval>
   <ResponseText>VOID PROCESSED</ResponseText>
</ippayResponse>

A 'VOID' transaction removes an approved transaction before settlement.

<TransactionType> = VOID
<TerminalID> = your terminal ID, assigned by the Gateway Provider
<TransactionID> = character string, exactly eighteen characters long, matching the target 'CAPT' or 'SALE' or 'FORCE' transaction.(required)
<CardExpMonth> = credit card expiration month (two digits)
<CardNum> = valid credit card number
<CardExpYear> = credit card expiration year (two digits)
<Approval> = six characters long, matching the authorization code from the original transaction.
<TotalAmount> = transaction amount (digits only)

Minimum data returned from a successful 'VOID' transaction response is:

<TransactionID> = matching the value in the request, above or generated by the Gateway Provider if no value is sent
<ActionCode> = 000
<Approval> = character string exactly six characters long
<ResponseText> = the transaction’s outcome status

A 'VOID' transaction differs from a 'CREDIT' transaction in that the 'VOID' acts upon an existing transaction, deleting it from the settlement table before settlement occurs. After a transaction has been VOIDed, a cardholder may still see a pending authorization on their card for a few days. Once the issuer determines that the transaction will not settle, the funds will be released back to the cardholder and the pending authorization will fall away. A 'CREDIT' transaction is a full transaction in and of itself and returns money back to a cardholder after a 'SALE' or 'AUTHONLY'/'CAPT' has taken it away.

A 'VOID' transaction will remove the matching 'CAPT', 'SALE' transaction. A 'VOID' will not remove an 'AUTHONLY' unless a matching 'CAPT' transaction has been successfully performed.

If a 'VOID' transaction is attempted after the pre-arranged settlement cut-off time, the Gateway Provider responds with a 'RECORD NOT FOUND' text response. As mentioned above, a settled transaction cannot be VOIDed; a settled transaction can only be reversed using a 'CREDIT' transaction.

Card Not Present–VOID Transaction Example  

Request XML:

<ippay>
   <Origin>INTERNET</Origin>
   <TerminalID>TESTTERMINAL</TerminalID>
   <TransactionID>MND000000000139053</TransactionID>
   <UDField1>ERID0000000001</UDField1>
   <TransactionType>VOID</TransactionType>
   <TotalAmount>123</TotalAmount>
   <CardNum CardPresent='false'>4111111111111111</CardNum>
   <CardExpMonth>12</CardExpMonth>
   <CardExpYear>17</CardExpYear>
</ippay>
var httpClient = new HttpClient();
var bodyXmlString = @"<ippay>" + "\n" +
@"   <Origin>INTERNET</Origin>" + "\n" +
@"   <TerminalID>TESTTERMINAL</TerminalID>" + "\n" +
@"   <TransactionID>MND000000000139053</TransactionID>" + "\n" +
@"   <UDField1>ERID0000000001</UDField1>" + "\n" +
@"   <TransactionType>VOID</TransactionType>" + "\n" +
@"   <TotalAmount>123</TotalAmount>" + "\n" +
@"   <CardNum CardPresent='false'>4111111111111111</CardNum>" + "\n" +
@"   <CardExpMonth>12</CardExpMonth>" + "\n" +
@"   <CardExpYear>17</CardExpYear>" + "\n" +
@"</ippay>";

var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://testgtwy.ippay.com/ippay/", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://testgtwy.ippay.com/ippay/',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '<ippay>\n   <Origin>INTERNET</Origin>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <TransactionID>MND000000000139053</TransactionID>\n   <UDField1>ERID0000000001</UDField1>\n   <TransactionType>VOID</TransactionType>\n   <TotalAmount>123</TotalAmount>\n   <CardNum CardPresent=\'false\'>4111111111111111</CardNum>\n   <CardExpMonth>12</CardExpMonth>\n   <CardExpYear>17</CardExpYear>\n</ippay>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://testgtwy.ippay.com/ippay/');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('<ippay>\n   <Origin>INTERNET</Origin>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <TransactionID>MND000000000139053</TransactionID>\n   <UDField1>ERID0000000001</UDField1>\n   <TransactionType>VOID</TransactionType>\n   <TotalAmount>123</TotalAmount>\n   <CardNum CardPresent=\'false\'>4111111111111111</CardNum>\n   <CardExpMonth>12</CardExpMonth>\n   <CardExpYear>17</CardExpYear>\n</ippay>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

Response XML:

<ippayResponse>
   <TransactionID>MND000000000139053</TransactionID>
   <ActionCode>000</ActionCode>
   <Approval>132621</Approval>
   <ResponseText>APPROVED</ResponseText>
</ippayResponse>

VOIDs for card not present transactions prior to settlement will be handled using the existing standards.

CREDIT Transaction Example  

The following is a sample 'CREDIT' transaction for $999.99, using a Visa card:

<ippay>
   <TransactionType>CREDIT</TransactionType>
   <TerminalID>TESTTERMINAL</TerminalID>
   <TransactionID>010327153017T10023</TransactionID>
   <CardNum>4000300020001000</CardNum>
   <CardExpMonth>12</CardExpMonth>
   <CardExpYear>14</CardExpYear>
   <TotalAmount>99999</TotalAmount>
</ippay>
var httpClient = new HttpClient();
var bodyXmlString = @"<ippay>" + "\n" +
@"   <TransactionType>CREDIT</TransactionType>" + "\n" +
@"   <TerminalID>TESTTERMINAL</TerminalID>" + "\n" +
@"   <TransactionID>010327153017T10023</TransactionID>" + "\n" +
@"   <CardNum>4000300020001000</CardNum>" + "\n" +
@"   <CardExpMonth>12</CardExpMonth>" + "\n" +
@"   <CardExpYear>14</CardExpYear>" + "\n" +
@"   <TotalAmount>99999</TotalAmount>" + "\n" +
@"</ippay>";

var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://testgtwy.ippay.com/ippay/", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://testgtwy.ippay.com/ippay/',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '<ippay>\n   <TransactionType>CREDIT</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <TransactionID>010327153017T10023</TransactionID>\n   <CardNum>4000300020001000</CardNum>\n   <CardExpMonth>12</CardExpMonth>\n   <CardExpYear>14</CardExpYear>\n   <TotalAmount>99999</TotalAmount>\n</ippay>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://testgtwy.ippay.com/ippay/');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('<ippay>\n   <TransactionType>CREDIT</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <TransactionID>010327153017T10023</TransactionID>\n   <CardNum>4000300020001000</CardNum>\n   <CardExpMonth>12</CardExpMonth>\n   <CardExpYear>14</CardExpYear>\n   <TotalAmount>99999</TotalAmount>\n</ippay>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

The following shows how the successful response would look:

<ippayResponse>
   <TransactionID>010327153017T10017</TransactionID>
   <ActionCode>000</ActionCode>
   <Approval>002F6B</Approval>
   <ResponseText>APPROVED</ResponseText>
</ippayResponse>

The 'CREDIT' transaction complements the 'SALE' transaction. The 'CREDIT' transaction is used to reverse a 'SALE', crediting the cardholder’s account.

The required data for a 'CREDIT' transaction request is the same as for a 'SALE' transaction request (except that the TransactionType is 'CREDIT' instead of 'SALE'). The minimum data returned from a successful 'CREDIT' transaction response is almost the same as for a 'SALE' transaction response, except that AVS and CVV2 (and CVC2 and CID) are unavailable. This particular example also demonstrates submission of a 'CREDIT' transaction.

Card Not Present–CREDIT  

Request XML:

<ippay>
   <Origin>INTERNET</Origin>
   <TerminalID>TESTTERMINAL</TerminalID>
   <TransactionID>MND000000000139053</TransactionID>
   <UDField1>ERID0000000001</UDField1>
   <TransactionType>CREDIT</TransactionType>
   <TotalAmount>123</TotalAmount>
   <CardNum CardPresent='false'>4111111111111111</CardNum>
   <CardExpMonth>12</CardExpMonth>
   <CardExpYear>17</CardExpYear>
</ippay>
var httpClient = new HttpClient();
var bodyXmlString = @"<ippay>" + "\n" +
@"   <Origin>INTERNET</Origin>" + "\n" +
@"   <TerminalID>TESTTERMINAL</TerminalID>" + "\n" +
@"   <TransactionID>MND000000000139053</TransactionID>" + "\n" +
@"   <UDField1>ERID0000000001</UDField1>" + "\n" +
@"   <TransactionType>CREDIT</TransactionType>" + "\n" +
@"   <TotalAmount>123</TotalAmount>" + "\n" +
@"   <CardNum CardPresent='false'>4111111111111111</CardNum>" + "\n" +
@"   <CardExpMonth>12</CardExpMonth>" + "\n" +
@"   <CardExpYear>17</CardExpYear>" + "\n" +
@"</ippay>";

var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://testgtwy.ippay.com/ippay/", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://testgtwy.ippay.com/ippay/',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '<ippay>\n   <Origin>INTERNET</Origin>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <TransactionID>MND000000000139053</TransactionID>\n   <UDField1>ERID0000000001</UDField1>\n   <TransactionType>CREDIT</TransactionType>\n   <TotalAmount>123</TotalAmount>\n   <CardNum CardPresent=\'false\'>4111111111111111</CardNum>\n   <CardExpMonth>12</CardExpMonth>\n   <CardExpYear>17</CardExpYear>\n</ippay>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://testgtwy.ippay.com/ippay/');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('<ippay>\n   <Origin>INTERNET</Origin>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <TransactionID>MND000000000139053</TransactionID>\n   <UDField1>ERID0000000001</UDField1>\n   <TransactionType>CREDIT</TransactionType>\n   <TotalAmount>123</TotalAmount>\n   <CardNum CardPresent=\'false\'>4111111111111111</CardNum>\n   <CardExpMonth>12</CardExpMonth>\n   <CardExpYear>17</CardExpYear>\n</ippay>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

Response XML:

<ippayResponse>
   <TransactionID>MND000000000139053</TransactionID>
   <ActionCode>000</ActionCode>
   <Approval>132621</Approval>
   <ResponseText>RETURN ACCEPTED</ResponseText>
</ippayResponse>

CREDITs for card not present transactions will include the original PAN fields per existing standard.

'ENQ' Transaction Example

You may 'ENQ' (enquire) on an transaction, checking the status of that transaction:

For 'enhanced' ENQ functionality, searches for transactions will be required to provide the TerminalID (per standard), and one of the following:

Enhanced ENQ for UDField1:

<ippay>
   <TransactionType>ENQ</TransactionType>
   <TerminalID>TESTTERMINAL</TerminalID>
   <UDField1>UDTEST0203201701</UDField1>
</ippay>
var httpClient = new HttpClient();
var bodyXmlString = @"<ippay>" + "\n" +
@"   <TransactionType>ENQ</TransactionType>" + "\n" +
@"   <TerminalID>TESTTERMINAL</TerminalID>" + "\n" +
@"   <UDField1>UDTEST0203201701</UDField1>" + "\n" +
@"</ippay>";

var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://testgtwy.ippay.com/ippay/", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://testgtwy.ippay.com/ippay/',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '<ippay>\n   <TransactionType>ENQ</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <UDField1>UDTEST0203201701</UDField1>\n</ippay>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://testgtwy.ippay.com/ippay/');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('<ippay>\n   <TransactionType>ENQ</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <UDField1>UDTEST0203201701</UDField1>\n</ippay>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

Enhanced ENQ for UDField2:

<ippay>
   <TransactionType>ENQ</TransactionType>
   <TerminalID>TESTTERMINAL</TerminalID>
   <UDField2>UDTEST0203201701</UDField2>
</ippay>
var httpClient = new HttpClient();
var bodyXmlString = @"<ippay>" + "\n" +
@"   <TransactionType>ENQ</TransactionType>" + "\n" +
@"   <TerminalID>TESTTERMINAL</TerminalID>" + "\n" +
@"   <UDField2>UDTEST0203201701</UDField2>" + "\n" +
@"</ippay>";

var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://testgtwy.ippay.com/ippay/", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://testgtwy.ippay.com/ippay/',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '<ippay>\n   <TransactionType>ENQ</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <UDField2>UDTEST0203201701</UDField2>\n</ippay>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://testgtwy.ippay.com/ippay/');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('<ippay>\n   <TransactionType>ENQ</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <UDField2>UDTEST0203201701</UDField2>\n</ippay>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

Enhanced ENQ for UDField1 & UDField2:

<ippay>
   <TransactionType>ENQ</TransactionType>
   <TerminalID>TESTTERMINAL</TerminalID>
   <UDField1>UDTEST0203201701</UDField1>
   <UDField2>UDTEST0203201701</UDField2>
</ippay>
var httpClient = new HttpClient();
var bodyXmlString = @"<ippay>" + "\n" +
@"   <TransactionType>ENQ</TransactionType>" + "\n" +
@"   <TerminalID>TESTTERMINAL</TerminalID>" + "\n" +
@"   <UDField1>UDTEST0203201701</UDField1>" + "\n" +
@"   <UDField2>UDTEST0203201701</UDField2>" + "\n" +
@"</ippay>";

var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://testgtwy.ippay.com/ippay/", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://testgtwy.ippay.com/ippay/',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '<ippay>\n   <TransactionType>ENQ</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <UDField1>UDTEST0203201701</UDField1>\n   <UDField2>UDTEST0203201701</UDField2>\n</ippay>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://testgtwy.ippay.com/ippay/');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('<ippay>\n   <TransactionType>ENQ</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <UDField1>UDTEST0203201701</UDField1>\n   <UDField2>UDTEST0203201701</UDField2>\n</ippay>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

The response would look similar to the original response for the originating transaction:

<ippayResponse>
   <TransactionID>M20170203170826130</TransactionID>
   <TransactionType>AUTHONLY</TransactionType>
   <ActionCode>000</ActionCode>
   <Approval>TEST10</Approval>
   <ResponseText>APPROVED</ResponseText>
</ippayResponse>

An 'ENQ' (or “enquire”) transaction enables verification and review of a previous transaction, including a previous 'AUTHONLY', 'SALE', 'CAPT', 'ECHECK' or 'REVERSAL' transaction. In an 'ENQ' transaction, the Gateway Provider accepts the XML transaction block containing the credit card transaction information, looks up the matching authorized transaction, and responds back to the original sender with the resulting search information.

The matching transaction for the enquire operation must have been authorized or settled through the Gateway Provider for the 'ENQ' transaction to be successful. If a target transaction was not processed through the Gateway Provider, the response to the 'ENQ' will indicate that the transaction was not found.

Submitted data for a 'ENQ' transaction request is:

<TransactionType> = ENQ (required)
<TerminalID> = your terminal ID, assigned by the Gateway Provider (required)
<TransactionID> = character string, exactly eighteen characters long, matching the target transaction. (required)

Minimum data returned from a successful 'ENQ' transaction response is:

<TransactionID> = matching the value in the request, above or generated by the Gateway Provider if no value is sent
<ActionCode> = 000
<Approval> = character string exactly six characters long
<ResponseText> = the transaction’s outcome status

'Debug' Response

The following example shows how a response looks when an syntax error is detected. To generate an error response, submit a request with a misspelled element; for this example, change the <TotalAmount> tag to <Amount>. Of course, since the element is misspelled, you will get the following response:

   <ippayResponse>
      <TransactionID></TransactionID>
      <ActionCode>900</ActionCode>
      <ResponseText>INVALID MESSAGE TYPE</ResponseText>
      <ErrMsg>
         INPUT XML STREAM FAILS PARSING. Faulty message.
         Error on line 11, column 15
         Message: Unknown element ‘Amount’
      </ErrMsg>
   </ippayResponse>

During testing, errors in building a syntactically correct request message can occur. The server parses a request message and determines where the XML syntax error occurs within the message. The ErrMsg element is filled in and sent back, informing developers of problems in building a syntactically correct message.

Tokenization

Tokens are data that can be used in the place of card information when performing transactions. Because the tokens are not card holder information, merchants using them do not have to protect them in the same way they have to protect card holder information. The token takes the place of the card number & expiration date or ABA & Account number. No other card holder information is associated with the token.

Tokens take the place of the card number & expiration data, or ABA & Account number. No other card holder information is associated with the token.

Token Format

Tokens are format preserving in the following respects:

  1. Tokens are same character length as submitted data
  2. 1st digit of Credit Card number is preserved in token
  3. Last 4 digits of Credit Card number are preserved in token
  4. Last 4 digits of account number are preserved for ACH/ECheck Transactions.

Credit Card Processing Tokenization Options

  1. Create token for an unencrypted PAN
  2. Process credit card transaction with unencrypted
    PAN and return token for future use
  3. Process credit card transaction with existing token
  4. Update existing token with new expiration date

ECheck Processing Tokenization Options

  1. Create a token for a routing and account number without processing a transaction
  2. Process ECheck transaction and return token for future use
  3. Process ECheck transaction with existing token

REST Based Tokenization Requests

For simple token-only transactions and easy integration via Ajax to integrate with web based billing platforms, we have created a REST-like interface for token requests.

The following the API calls are designed for merchants and platforms looking to utilize offsite storage of sensitive cardholder data. The API calls for tokenization still utilize the same XML structure of credit card and ECHECK transaction, with small field additions to declare the use or creation of a token.

The first step to using tokenization is getting a token that maps to a card number and expiration date.

'TOKENIZE' Transaction Example for Credit Cards

A sample 'TOKEN' transaction request is illustrated below:

<ippay>
   <TransactionID>TOKENTEST000000023</TransactionID>
   <TransactionType>TOKENIZE</TransactionType>
   <TerminalID>TESTTERMINAL</TerminalID>
   <CardNum>4000300020001000</CardNum>
   <CardExpMonth>12</CardExpMonth>
   <CardExpYear>14</CardExpYear>
</ippay>
var httpClient = new HttpClient();
var bodyXmlString = @"<ippay>" + "\n" +
@"   <TransactionID>TOKENTEST000000023</TransactionID>" + "\n" +
@"   <TransactionType>TOKENIZE</TransactionType>" + "\n" +
@"   <TerminalID>TESTTERMINAL</TerminalID>" + "\n" +
@"   <CardNum>4000300020001000</CardNum>" + "\n" +
@"   <CardExpMonth>12</CardExpMonth>" + "\n" +
@"   <CardExpYear>14</CardExpYear>" + "\n" +
@"</ippay>";

var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://testgtwy.ippay.com/ippay/", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://testgtwy.ippay.com/ippay/',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '<ippay>\n   <TransactionID>TOKENTEST000000023</TransactionID>\n   <TransactionType>TOKENIZE</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <CardNum>4000300020001000</CardNum>\n   <CardExpMonth>12</CardExpMonth>\n   <CardExpYear>14</CardExpYear>\n</ippay>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://testgtwy.ippay.com/ippay/');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('<ippay>\n   <TransactionID>TOKENTEST000000023</TransactionID>\n   <TransactionType>TOKENIZE</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <CardNum>4000300020001000</CardNum>\n   <CardExpMonth>12</CardExpMonth>\n   <CardExpYear>14</CardExpYear>\n</ippay>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

The response would return a token that can be used for future transactions.

<IPPayResponse>
   <TransactionID>TOKENTEST000000023</TransactionID>
   <ActionCode>000</ActionCode>
   <Approval>TOKEN70</Approval>
   <ResponseText>TOKENIZED</ResponseText>
   <Token>4J9F3J2J2D0C3000</Token>
</IPPayResponse>

The 'TOKENIZE' transaction creates a token for an unencrypted PAN and expiration date. In a 'TOKENIZE' transaction, the Gateway Provider accepts the XML transaction block containing the credit card transaction information, creates an entry in its existing merchant record database, and responds back to the original sender with a token that can be used in lieu of the PAN & expiration date for processing future transactions.

Submitted data for a 'TOKENIZE' transaction request is:

<TransactionType> = TOKENIZE (required)
<TerminalID> = your terminal ID, assigned by the Gateway Provider (required)
<TransactionID> = character string, exactly eighteen characters long, matching the target transaction. (recommended)
<CardNum> = target credit card number
<CardExpMonth> = credit card expiration month (two digits)
<CardExpYear> = credit card expiration year (two digits)

Minimum data returned from a successful 'TOKENIZE' transaction response is:

<TransactionID> = matching the value in the request, above or
randomly generated by the Gateway Provider
<ActionCode> = 000
<Token> = Returned token. Tokens are format preserving in the
following respects:
- Tokens are same character length as submitted data
- 1st digit of Credit Card number is preserved in token
- Last 4 digits of Credit Card number are preserved in token
<Approval> = character string
<ResponseText> = the transaction’s outcome status

For Credit Card tokenization responses, tokens are format preserving in the following respects:

  1. Tokens are same character length as submitted data
  2. 1st digit of Credit Card number is preserved in token
  3. Last 4 digits of Credit Card number are preserved in token

Credit Card Transaction with New Token Request Example

Taking our previous sample 'SALE' transaction for $999.99:

<ippay>
   <TransactionType>SALE</TransactionType>
   <TerminalID>TESTTERMINAL</TerminalID>
   <TransactionID>010327153017T10017</TransactionID>
   <CardNum>4000300020001000</CardNum>
   <CardExpMonth>12</CardExpMonth>
   <CardExpYear>14</CardExpYear>
   <TotalAmount>99999</TotalAmount>
</ippay>
var httpClient = new HttpClient();
var bodyXmlString = @"<ippay>" + "\n" +
@"   <TransactionType>SALE</TransactionType>" + "\n" +
@"   <TerminalID>TESTTERMINAL</TerminalID>" + "\n" +
@"   <TransactionID>010327153017T10017</TransactionID>" + "\n" +
@"   <CardNum>4000300020001000</CardNum>" + "\n" +
@"   <CardExpMonth>12</CardExpMonth>" + "\n" +
@"   <CardExpYear>14</CardExpYear>" + "\n" +
@"   <TotalAmount>99999</TotalAmount>" + "\n" +
@"</ippay>";

var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://testgtwy.ippay.com/ippay/", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://testgtwy.ippay.com/ippay/',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '<ippay>\n   <TransactionType>SALE</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <TransactionID>010327153017T10017</TransactionID>\n   <CardNum>4000300020001000</CardNum>\n   <CardExpMonth>12</CardExpMonth>\n   <CardExpYear>14</CardExpYear>\n   <TotalAmount>99999</TotalAmount>\n</ippay>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://testgtwy.ippay.com/ippay/');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('<ippay>\n   <TransactionType>SALE</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <TransactionID>010327153017T10017</TransactionID>\n   <CardNum>4000300020001000</CardNum>\n   <CardExpMonth>12</CardExpMonth>\n   <CardExpYear>14</CardExpYear>\n   <TotalAmount>99999</TotalAmount>\n</ippay>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

We would update it in the following manner to return a token:

<ippay>
   <TransactionType>SALE</TransactionType>
   <TerminalID>TESTTERMINAL</TerminalID>
   <TransactionID>TOKENTEST000000024</TransactionID>
   <CardNum Tokenize='true'>4000300020001000</CardNum>
   <CardExpMonth>12</CardExpMonth>
   <CardExpYear>14</CardExpYear>
   <TotalAmount>99999</TotalAmount>
</ippay>
var httpClient = new HttpClient();
var bodyXmlString = @"<ippay>" + "\n" +
@"   <TransactionType>SALE</TransactionType>" + "\n" +
@"   <TerminalID>TESTTERMINAL</TerminalID>" + "\n" +
@"   <TransactionID>TOKENTEST000000024</TransactionID>" + "\n" +
@"   <CardNum Tokenize='true'>4000300020001000</CardNum>" + "\n" +
@"   <CardExpMonth>12</CardExpMonth>" + "\n" +
@"   <CardExpYear>14</CardExpYear>" + "\n" +
@"   <TotalAmount>99999</TotalAmount>" + "\n" +
@"</ippay>";

var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://testgtwy.ippay.com/ippay/", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://testgtwy.ippay.com/ippay/',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '<ippay>\n   <TransactionType>SALE</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <TransactionID>TOKENTEST000000024</TransactionID>\n   <CardNum Tokenize=\'true\'>4000300020001000</CardNum>\n   <CardExpMonth>12</CardExpMonth>\n   <CardExpYear>14</CardExpYear>\n   <TotalAmount>99999</TotalAmount>\n</ippay>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://testgtwy.ippay.com/ippay/');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('<ippay>\n   <TransactionType>SALE</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <TransactionID>TOKENTEST000000024</TransactionID>\n   <CardNum Tokenize=\'true\'>4000300020001000</CardNum>\n   <CardExpMonth>12</CardExpMonth>\n   <CardExpYear>14</CardExpYear>\n   <TotalAmount>99999</TotalAmount>\n</ippay>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

The response would change to the following. Original Response:

<ippayResponse>
   <TransactionID>010327153017T10017</TransactionID>
   <ActionCode>000</ActionCode>
   <Approval>002F6B</Approval>
   <ResponseText>APPROVED</ResponseText>
</ippayResponse>

Updated Response with token:

<ippayResponse>
   <TransactionID>TOKENTEST000000024</TransactionID>
   <ActionCode>000</ActionCode>
   <Token>4H4B4D6G4C6L1000</Token>
   <Approval>TEST88</Approval>
   <ResponseText>APPROVED</ResponseText>
</ippayResponse>

Another way of getting a token that maps to a credit card number and expiration date is to tokenize a card number as part of an existing transaction. This is accomplished by setting the tokenize attribute under the cardnum element to true in an existing credit card transaction.

Credit Card Transactions using Tokens

Once you have a token in place, it can be used for processing transactions in the following manner:

<ippay>
   <TransactionID>TOKENTEST000000026</TransactionID>
   <TransactionType>SALE</TransactionType>
   <TerminalID>TESTTERMINAL</TerminalID>
   <Token>4H4B4D6G4C6L1000</Token>
   <TotalAmount>100</TotalAmount>
</ippay>
var httpClient = new HttpClient();
var bodyXmlString = @"<ippay>" + "\n" +
@"   <TransactionID>TOKENTEST000000026</TransactionID>" + "\n" +
@"   <TransactionType>SALE</TransactionType>" + "\n" +
@"   <TerminalID>TESTTERMINAL</TerminalID>" + "\n" +
@"   <Token>4H4B4D6G4C6L1000</Token>" + "\n" +
@"   <TotalAmount>100</TotalAmount>" + "\n" +
@"</ippay>";

var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://testgtwy.ippay.com/ippay/", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://testgtwy.ippay.com/ippay/',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '<ippay>\n   <TransactionID>TOKENTEST000000026</TransactionID>\n   <TransactionType>SALE</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <Token>4H4B4D6G4C6L1000</Token>\n   <TotalAmount>100</TotalAmount>\n</ippay>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://testgtwy.ippay.com/ippay/');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('<ippay>\n   <TransactionID>TOKENTEST000000026</TransactionID>\n   <TransactionType>SALE</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <Token>4H4B4D6G4C6L1000</Token>\n   <TotalAmount>100</TotalAmount>\n</ippay>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

And the response will be as normal:

<ippayResponse>
   <TransactionID>TOKENTEST000000026</TransactionID>
   <ActionCode>000</ActionCode>
   <Approval>TEST03</Approval>
   <ResponseText>APPROVED</ResponseText>
</ippayResponse>

The expiration dates for tokens can be updated and maintained in the following manner.

<ippay>
   <TransactionID>TOKENTEST000000023</TransactionID>
   <TransactionType>TOKENIZE</TransactionType>
   <Token>4B7F2A5H0K7B1000</Token>
   <CardExpMonth>12</CardExpMonth>
   <CardExpYear>14</CardExpYear>
   <TerminalID>TESTTERMINAL</TerminalID>
</ippay>
var httpClient = new HttpClient();
var bodyXmlString = @"<ippay>" + "\n" +
@"   <TransactionID>TOKENTEST000000023</TransactionID>" + "\n" +
@"   <TransactionType>TOKENIZE</TransactionType>" + "\n" +
@"   <Token>4B7F2A5H0K7B1000</Token>" + "\n" +
@"   <CardExpMonth>12</CardExpMonth>" + "\n" +
@"   <CardExpYear>14</CardExpYear>" + "\n" +
@"   <TerminalID>TESTTERMINAL</TerminalID>" + "\n" +
@"</ippay>";

var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://testgtwy.ippay.com/ippay/", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://testgtwy.ippay.com/ippay/',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '<ippay>\n   <TransactionID>TOKENTEST000000023</TransactionID>\n   <TransactionType>TOKENIZE</TransactionType>\n   <Token>4B7F2A5H0K7B1000</Token>\n   <CardExpMonth>12</CardExpMonth>\n   <CardExpYear>14</CardExpYear>\n   <TerminalID>TESTTERMINAL</TerminalID>\n</ippay>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://testgtwy.ippay.com/ippay/');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('<ippay>\n   <TransactionID>TOKENTEST000000023</TransactionID>\n   <TransactionType>TOKENIZE</TransactionType>\n   <Token>4B7F2A5H0K7B1000</Token>\n   <CardExpMonth>12</CardExpMonth>\n   <CardExpYear>14</CardExpYear>\n   <TerminalID>TESTTERMINAL</TerminalID>\n</ippay>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

And the response will be as follows:

<IPPayResponse>
   <TransactionID>TOKENTEST000000023</TransactionID>
   <ActionCode>000</ActionCode>
   <Approval>TOKEN71</Approval>
   <ResponseText>TOKENIZED</ResponseText>
   <Token>4B7F2A5H0K7B1000</Token>
</IPPayResponse>

If the token is not present in the system, an ActionCode of 900 is returned with a Cannot locate Card information for the Token <TOKEN VALUE> error message.

Using Credit Card Tokens in REFUNDS Transaction Example Request XML

Using Credit Card Tokens in REFUNDS Transaction Example Request XML:

<ippay>
   <TerminalID>TESTTERMINAL</TerminalID>
   <TransactionType>CREDIT</TransactionType>
   <TotalAmount>123</TotalAmount>
   <Token>4D4F0H7C5K6L1000</Token>
</ippay>
var httpClient = new HttpClient();
var bodyXmlString = @"<ippay>" + "\n" +
@"   <TerminalID>TESTTERMINAL</TerminalID>" + "\n" +
@"   <TransactionType>CREDIT</TransactionType>" + "\n" +
@"   <TotalAmount>123</TotalAmount>" + "\n" +
@"   <Token>4D4F0H7C5K6L1000</Token>" + "\n" +
@"</ippay>";

var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://testgtwy.ippay.com/ippay/", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://testgtwy.ippay.com/ippay/',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '<ippay>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <TransactionType>CREDIT</TransactionType>\n   <TotalAmount>123</TotalAmount>\n   <Token>4D4F0H7C5K6L1000</Token>\n</ippay>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://testgtwy.ippay.com/ippay/');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('<ippay>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <TransactionType>CREDIT</TransactionType>\n   <TotalAmount>123</TotalAmount>\n   <Token>4D4F0H7C5K6L1000</Token>\n</ippay>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

Response XML:

<ippayResponse>
   <TransactionID>H20170120044026560</TransactionID>
   <ActionCode>000</ActionCode>
   <Approval>224026</Approval>
   <ResponseText>RETURN ACCEPTED</ResponseText>
</ippayResponse>

Echeck Tokenization Transaction

Tokens are also available for Echeck transactions. In an ECHECK transaction, they take the place of both the ABA (routing code) and DDA (account number). Tokens for ECHECK transactions are generated in a manner similar to that of credit card transactions.

'TOKENIZE' Transaction Example for ECHECK

A sample 'TOKEN' transaction request for ECHECK is illustrated below:

<ippay>
   <TransactionID>000000000000000234</TransactionID>
   <TransactionType>TOKENIZE</TransactionType>
   <TerminalID>TESTTERMINAL</TerminalID>
   <ABA>123456789</ABA>
   <AccountNumber>99944495</AccountNumber>
</ippay>
var httpClient = new HttpClient();
var bodyXmlString = @"<ippay>" + "\n" +
@"   <TransactionID>000000000000000234</TransactionID>" + "\n" +
@"   <TransactionType>TOKENIZE</TransactionType>" + "\n" +
@"   <TerminalID>TESTTERMINAL</TerminalID>" + "\n" +
@"   <ABA>123456789</ABA>" + "\n" +
@"   <AccountNumber>99944495</AccountNumber>" + "\n" +
@"</ippay>";
var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://testgtwy.ippay.com/ippay/", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://testgtwy.ippay.com/ippay/',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '<ippay>\n   <TransactionID>000000000000000234</TransactionID>\n   <TransactionType>TOKENIZE</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <ABA>123456789</ABA>\n   <AccountNumber>99944495</AccountNumber>\n</ippay>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://testgtwy.ippay.com/ippay/');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('<ippay>\n   <TransactionID>000000000000000234</TransactionID>\n   <TransactionType>TOKENIZE</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <ABA>123456789</ABA>\n   <AccountNumber>99944495</AccountNumber>\n</ippay>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

The response would return a token that can be used for future transactions:

<IPPayResponse>
   <TransactionID>000000000000000234</TransactionID>
   <ActionCode>000</ActionCode
   ><Approval>TOKEN79</Approval>
   <ResponseText>TOKENIZED</ResponseText>
   <Token>4H6A5C0K2A5F4495</Token>
</IPPayResponse>

The 'TOKENIZE' transaction creates a token for an unencrypted PAN and expiration date. In a 'TOKENIZE' transaction, the Gateway Provider accepts the XML transaction block containing the credit card transaction information, creates an entry in its existing merchant record database, and responds back to the original sender with a token that can be used in lieu of the PAN & expiration date for processing future transactions.

For ECHECK tokenization responses, tokens are format preserving in the following respects:

  1. Tokens are same character length as submitted data
  2. Last 4 digits of the account number are preserved

Echeck Transaction with New Token Request Example

Another way of getting a token that maps to an ABA and DDA is to tokenize the information as part of an existing transaction. Taking a sample 'ECHECK' transaction below:

<ippay>
   <TransactionType>CHECK</TransactionType>
   <TerminalID>TESTTERMINAL</TerminalID>
   <CardName>Mickey Mouse</CardName>
   <TotalAmount>1399</TotalAmount>
   <FeeAmount>100</FeeAmount>
   <ACH Type='SAVINGS' SEC='PPD'>
      <AccountNumber>11111999</AccountNumber>
      <ABA>071025661</ABA>
      <CheckNumber>15</CheckNumber>
   </ACH>
</ippay>
var httpClient = new HttpClient();
var bodyXmlString = @"<ippay>" + "\n" +
@"   <TransactionType>CHECK</TransactionType>" + "\n" +
@"   <TerminalID>TESTTERMINAL</TerminalID>" + "\n" +
@"   <CardName>Mickey Mouse</CardName>" + "\n" +
@"   <TotalAmount>1399</TotalAmount>" + "\n" +
@"   <FeeAmount>100</FeeAmount>" + "\n" +
@"   <ACH Type='SAVINGS' SEC='PPD'>" + "\n" +
@"      <AccountNumber>11111999</AccountNumber>" + "\n" +
@"      <ABA>071025661</ABA>" + "\n" +
@"      <CheckNumber>15</CheckNumber>" + "\n" +
@"   </ACH>" + "\n" +
@"</ippay>";

var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://testgtwy.ippay.com/ippay/", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://testgtwy.ippay.com/ippay/',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '<ippay>\n   <TransactionType>CHECK</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <CardName>Mickey Mouse</CardName>\n   <TotalAmount>1399</TotalAmount>\n   <FeeAmount>100</FeeAmount>\n   <ACH Type=\'SAVINGS\' SEC=\'PPD\'>\n      <AccountNumber>11111999</AccountNumber>\n      <ABA>071025661</ABA>\n      <CheckNumber>15</CheckNumber>\n   </ACH>\n</ippay>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://testgtwy.ippay.com/ippay/');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('<ippay>\n   <TransactionType>CHECK</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <CardName>Mickey Mouse</CardName>\n   <TotalAmount>1399</TotalAmount>\n   <FeeAmount>100</FeeAmount>\n   <ACH Type=\'SAVINGS\' SEC=\'PPD\'>\n      <AccountNumber>11111999</AccountNumber>\n      <ABA>071025661</ABA>\n      <CheckNumber>15</CheckNumber>\n   </ACH>\n</ippay>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

We would update it in the following manner to return a token:

<ippay>
   <TransactionType>CHECK</TransactionType>
   <TransactionID>SC0327153017T10018</TransactionID>
   <TerminalID>TESTTERMINAL</TerminalID>
   <CardName>Mickey Mouse</CardName>
   <TotalAmount>1399</TotalAmount>
   <FeeAmount>100</FeeAmount>
   <ACH Tokenize='true' Type='SAVINGS' SEC='PPD'>
      <AccountNumber>11111999</AccountNumber>
      <ABA>071025661</ABA>
      <CheckNumber>15</CheckNumber>
   </ACH>
</ippay>
var httpClient = new HttpClient();
var bodyXmlString = @"<ippay>" + "\n" +
@"   <TransactionType>CHECK</TransactionType>" + "\n" +
@"   <TransactionID>SC0327153017T10018</TransactionID>" + "\n" +
@"   <TerminalID>TESTTERMINAL</TerminalID>" + "\n" +
@"   <CardName>Mickey Mouse</CardName>" + "\n" +
@"   <TotalAmount>1399</TotalAmount>" + "\n" +
@"   <FeeAmount>100</FeeAmount>" + "\n" +
@"   <ACH Tokenize='true' Type='SAVINGS' SEC='PPD'>" + "\n" +
@"      <AccountNumber>11111999</AccountNumber>" + "\n" +
@"      <ABA>071025661</ABA>" + "\n" +
@"      <CheckNumber>15</CheckNumber>" + "\n" +
@"   </ACH>" + "\n" +
@"</ippay>";

var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://testgtwy.ippay.com/ippay/", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://testgtwy.ippay.com/ippay/',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '<ippay>\n   <TransactionType>CHECK</TransactionType>\n   <TransactionID>SC0327153017T10018</TransactionID>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <CardName>Mickey Mouse</CardName>\n   <TotalAmount>1399</TotalAmount>\n   <FeeAmount>100</FeeAmount>\n   <ACH Tokenize=\'true\' Type=\'SAVINGS\' SEC=\'PPD\'>\n      <AccountNumber>11111999</AccountNumber>\n      <ABA>071025661</ABA>\n      <CheckNumber>15</CheckNumber>\n   </ACH>\n</ippay>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://testgtwy.ippay.com/ippay/');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('<ippay>\n   <TransactionType>CHECK</TransactionType>\n   <TransactionID>SC0327153017T10018</TransactionID>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <CardName>Mickey Mouse</CardName>\n   <TotalAmount>1399</TotalAmount>\n   <FeeAmount>100</FeeAmount>\n   <ACH Tokenize=\'true\' Type=\'SAVINGS\' SEC=\'PPD\'>\n      <AccountNumber>11111999</AccountNumber>\n      <ABA>071025661</ABA>\n      <CheckNumber>15</CheckNumber>\n   </ACH>\n</ippay>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

The response would change to the following. Original Response:

<ippayResponse>
   <ActionCode>000</ActionCode>
   <Approval>TOKEN78</Approval>
   <ResponseText>TOKENIZED</ResponseText>
   <Token>I8H1C6F4J2I20088</Token>
</ippayResponse>

Updated Response with token:

<ippayResponse>
   <TransactionID>SC0327153017T10018</TransactionID>
   <ActionCode>000</ActionCode>
   <Token>I8H1C6F4J2I20088</</Token>
   <Approval>TEST29</Approval>
   <ResponseText>APPROVED</ResponseText>
</ippayResponse>

Echeck Transactions using Tokens

Once you have a token in place, it can be used for processing transactions in the following manner:

<ippay>
   <TransactionType>CHECK</TransactionType>
   <TerminalID>TESTTERMINAL</TerminalID>
   <TransactionID>SC0327153017T10018</TransactionID>
   <CardName>Mickey Mouse</CardName>
   <TotalAmount>1399</TotalAmount>
   <FeeAmount>100</FeeAmount>
   <ACH Type = “SAVINGS” SEC = “PPD”>
      <Token>I8H1C6F4J2I20088</Token>
      <CheckNumber>15</CheckNumber>
   </ACH>
</ippay>
var httpClient = new HttpClient();
var bodyXmlString = @"<ippay>" + "\n" +
@"   <TransactionType>CHECK</TransactionType>" + "\n" +
@"   <TerminalID>TESTTERMINAL</TerminalID>" + "\n" +
@"   <TransactionID>SC0327153017T10018</TransactionID>" + "\n" +
@"   <CardName>Mickey Mouse</CardName>" + "\n" +
@"   <TotalAmount>1399</TotalAmount>" + "\n" +
@"   <FeeAmount>100</FeeAmount>" + "\n" +
@"   <ACH Type = “SAVINGS” SEC = “PPD”>" + "\n" +
@"      <Token>I8H1C6F4J2I20088</Token>" + "\n" +
@"      <CheckNumber>15</CheckNumber>" + "\n" +
@"   </ACH>" + "\n" +
@"</ippay>";

var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://testgtwy.ippay.com/ippay/", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://testgtwy.ippay.com/ippay/',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '<ippay>\n   <TransactionType>CHECK</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <TransactionID>SC0327153017T10018</TransactionID>\n   <CardName>Mickey Mouse</CardName>\n   <TotalAmount>1399</TotalAmount>\n   <FeeAmount>100</FeeAmount>\n   <ACH Type = “SAVINGS” SEC = “PPD”>\n      <Token>I8H1C6F4J2I20088</Token>\n      <CheckNumber>15</CheckNumber>\n   </ACH>\n</ippay>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://testgtwy.ippay.com/ippay/');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('<ippay>\n   <TransactionType>CHECK</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <TransactionID>SC0327153017T10018</TransactionID>\n   <CardName>Mickey Mouse</CardName>\n   <TotalAmount>1399</TotalAmount>\n   <FeeAmount>100</FeeAmount>\n   <ACH Type = “SAVINGS” SEC = “PPD”>\n      <Token>I8H1C6F4J2I20088</Token>\n      <CheckNumber>15</CheckNumber>\n   </ACH>\n</ippay>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

And the response will be as normal:

<ippayResponse>
   <TransactionID>SC0327153017T10018</TransactionID>
   <ActionCode>000</ActionCode>
   <Approval>TEST03</Approval>
   <ResponseText>APPROVED</ResponseText>
</ippayResponse>

Industry Specific Examples

The Gateway Provider can process POS (point-of-sale) terminal transactions via the Internet from brick-and-mortar store locations. In these cases, a brick-and-mortar store is presumed to be any shop, restaurant, or hotel that consummates credit card sales for purchases made with physical credit cards. This document covers the XML features that support POS terminal transactions via the Gateway Provider. The Gateway is constructed to support the POS features described below.

For credit card sales, the credit card is physically presented to the merchant to pay for the sale. The merchant may scan data from the credit card’s magnetic stripe using a magnetic card reader in order to initiate the credit card transaction. The merchant may also key in data read from the credit card to initiate the credit card transaction.

PIN-based debit card sales are also available through the Gateway Provider.

This is targeted for developers of POS terminal software. A developer may be writing software for a POS terminal device capable of network communications. A developer may be enhancing a merchant’s custom POS server, used throughout all their retail stores. A developer may be developing a POS terminal emulation program (also known as a 'virtual terminal') destined to run as either a website-based application or perhaps as a standalone application. This document covers the XML specifications necessary for communicating a POS transaction to the Gateway Provider.

For debit card processing, the reader of this document is presumed to already understand PIN-based debit card processing using a PIN pad. The reader must already understand encryption techniques associated with PIN pads. This document explains the tools needed for setting up PIN-based debit card processing; this document does not explain how to work with a PIN pad.

The reader of this document is also presumed to be familiar with XML. XML is a markup language for building so-called 'XML documents.' Transactions are defined through XML documents. As you browse through the examples at the end of this document, please keep in mind that each transaction is an XML document, that XML is case-sensitive, and that the Gateway Provider strives to follow XML document conventions for defining its transactions. We recommend that the reader review the authoring rules for XML documents, allowing a more implicit understanding of the syntax rules behind transactions.

Recurring / Bill Payment Examples

An example of a 'RECURRING' transaction appears below:

<ippay>
   <TransactionType>SALE</TransactionType>
   <TerminalID>TESTTERMINAL</TerminalID>
   <TransactionID>475835825796NWAYeh</TransactionID>
   <CardNum CardPresent=”false”>4000300020001000</CardNum>
   <CardExpMonth>07</CardExpMonth>
   <CardExpYear>14</CardExpYear>
   <TotalAmount>12500</TotalAmount>
   <Origin>RECURRING</Origin>
   <IndustryInfo Type=”MOTO”> </IndustryInfo>
</ippay>
var httpClient = new HttpClient();
var bodyXmlString = @"<ippay>" + "\n" +
@"   <TransactionType>SALE</TransactionType>" + "\n" +
@"   <TerminalID>TESTTERMINAL</TerminalID>" + "\n" +
@"   <TransactionID>475835825796NWAYeh</TransactionID>" + "\n" +
@"   <CardNum CardPresent=”false”>4000300020001000</CardNum>" + "\n" +
@"   <CardExpMonth>07</CardExpMonth>" + "\n" +
@"   <CardExpYear>14</CardExpYear>" + "\n" +
@"   <TotalAmount>12500</TotalAmount>" + "\n" +
@"   <Origin>RECURRING</Origin>" + "\n" +
@"   <IndustryInfo Type=”MOTO”> </IndustryInfo>" + "\n" +
@"</ippay>";

var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://testgtwy.ippay.com/ippay/", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://testgtwy.ippay.com/ippay/',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '<ippay>\n   <TransactionType>SALE</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <TransactionID>475835825796NWAYeh</TransactionID>\n   <CardNum CardPresent=”false”>4000300020001000</CardNum>\n   <CardExpMonth>07</CardExpMonth>\n   <CardExpYear>14</CardExpYear>\n   <TotalAmount>12500</TotalAmount>\n   <Origin>RECURRING</Origin>\n   <IndustryInfo Type=”MOTO”> </IndustryInfo>\n</ippay>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://testgtwy.ippay.com/ippay/');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('<ippay>\n   <TransactionType>SALE</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <TransactionID>475835825796NWAYeh</TransactionID>\n   <CardNum CardPresent=”false”>4000300020001000</CardNum>\n   <CardExpMonth>07</CardExpMonth>\n   <CardExpYear>14</CardExpYear>\n   <TotalAmount>12500</TotalAmount>\n   <Origin>RECURRING</Origin>\n   <IndustryInfo Type=”MOTO”> </IndustryInfo>\n</ippay>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

The transaction response is the same as you’ve observed in the general examples:

<ippayResponse>
   <TransactionID>475835825796NWAYeh</TransactionID>
   <ActionCode>000</ActionCode>
   <Approval>099852</Approval>
   <ResponseText>APPROVED</ResponseText>
</ippayResponse>

An example of a 'BILL PAYMENT' transaction requires a different Origin:

<ippay>
   <TransactionType>SALE</TransactionType>
   <TerminalID>TESTTERMINAL</TerminalID>
   <TransactionID>475835825796NWAYeh</TransactionID>
   <CardNum CardPresent=”false”>4000300020001000</CardNum>
   <CardExpMonth>07</CardExpMonth>
   <CardExpYear>14</CardExpYear>
   <TotalAmount>12500</TotalAmount>
   <Origin>BILL PAYMENT</Origin>
   <IndustryInfo Type=”MOTO”> </IndustryInfo>
</ippay>
var httpClient = new HttpClient();
var bodyXmlString = @"<ippay>" + "\n" +
@"   <TransactionType>SALE</TransactionType>" + "\n" +
@"   <TerminalID>TESTTERMINAL</TerminalID>" + "\n" +
@"   <TransactionID>475835825796NWAYeh</TransactionID>" + "\n" +
@"   <CardNum CardPresent=”false”>4000300020001000</CardNum>" + "\n" +
@"   <CardExpMonth>07</CardExpMonth>" + "\n" +
@"   <CardExpYear>14</CardExpYear>" + "\n" +
@"   <TotalAmount>12500</TotalAmount>" + "\n" +
@"   <Origin>BILL PAYMENT</Origin>" + "\n" +
@"   <IndustryInfo Type=”MOTO”> </IndustryInfo>" + "\n" +
@"</ippay>";

var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://testgtwy.ippay.com/ippay/", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://testgtwy.ippay.com/ippay/',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '<ippay>\n   <TransactionType>SALE</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <TransactionID>475835825796NWAYeh</TransactionID>\n   <CardNum CardPresent=”false”>4000300020001000</CardNum>\n   <CardExpMonth>07</CardExpMonth>\n   <CardExpYear>14</CardExpYear>\n   <TotalAmount>12500</TotalAmount>\n   <Origin>BILL PAYMENT</Origin>\n   <IndustryInfo Type=”MOTO”> </IndustryInfo>\n</ippay>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://testgtwy.ippay.com/ippay/');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('<ippay>\n   <TransactionType>SALE</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <TransactionID>475835825796NWAYeh</TransactionID>\n   <CardNum CardPresent=”false”>4000300020001000</CardNum>\n   <CardExpMonth>07</CardExpMonth>\n   <CardExpYear>14</CardExpYear>\n   <TotalAmount>12500</TotalAmount>\n   <Origin>BILL PAYMENT</Origin>\n   <IndustryInfo Type=”MOTO”> </IndustryInfo>\n</ippay>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

Again, the transaction response appears similar to the general examples:

<ippayResponse>
   <TransactionID>475835825796NWAYeh</TransactionID>
   <ActionCode>000</ActionCode>
   <Approval>099852</Approval>
   <ResponseText>APPROVED</ResponseText>
</ippayResponse>

Recurring transactions are low-risk transactions submitted on a periodic basis. A customer authorizes periodic payments to a merchant, enabling the merchant to submit authorizations to the credit card companies with prior approval, but without the customer’s involvement in performing the subsequent periodic transactions. The merchant fulfills a periodic subscription or a standing order according to a merchant-customer agreement, and the merchant fills the customer’s order automatically without customer interaction.

An example of a merchant who would use recurring payments is an Internet Service Provider with a monthly subscription fee. Their customer subscribes to their service, agreeing to a monthly fee automatically applied to their credit card. The merchant sends monthly transactions to fulfill their customer’s subscription to their services.

Bill payment transactions are also low-risk transactions that are submitted on a periodic basis. However, for bill payment, a customer’s relationship with their merchant is usage-oriented (instead of subscription-oriented). A customer may need to approve a variable monthly bill for fees accrued during that period, and bill payment fits the description of the transactions made by that customer.

Merchants who use bill payment may include telephone companies and other companies who send periodic billing to regular customers. The merchant may maintain a website that enables bill payment by their customer.

Some merchants start out with misconceptions when considering the use of recurring transactions; the following explanations are significant for clarification of these misconceptions:

The Gateway Provider supports recurring transactions. Recurring transactions are simply transactions that are automatically authorized by an agreement between a merchant and their customer. The merchant is authorized to submit recurring transactions without the customer’s direct involvement subsequent to the initial authorization.

Recurring transactions ARE NOT AN AUTOMATED CUSTOMER BILLING SERVICE. Some merchants mistakenly think that they only must set up a repeat billing scheme with IPpay and that the Gateway Provider will take care of the rest. This is not so.

The purpose of declaring a recurring transaction is to declare a transaction’s risk. Recurring transactions are considered low-risk by the credit card industry, and fee schedules for transactions are lower for recurring transactions. The reason for submitted a recurring transaction is to be awarded lower transaction rates, not to set up automated billing.

The Gateway Provider is in the business of lowering your transaction fees. When you submit recurring transactions, you’re declaring to the credit card companies that you have a legal agreement between you and your customer for payment. Based on this declaration, credit card companies award a lower transaction fee.

Ecommerce Industry-Specific Example

Implicit defaults for an ecommerce transaction request are in bold type:

<Origin>INTERNET</Origin>
<CardNum CardPresent=”false”>
<IndustryInfo Type=”ECOMMERCE”>
var httpClient = new HttpClient();
var bodyXmlString = @"<Origin>INTERNET</Origin>" + "\n" +
@"<CardNum CardPresent=”false”>" + "\n" +
@"<IndustryInfo Type=”ECOMMERCE”>";

var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://testgtwy.ippay.com/ippay/", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://testgtwy.ippay.com/ippay/',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '<Origin>INTERNET</Origin>\n<CardNum CardPresent=”false”>\n<IndustryInfo Type=”ECOMMERCE”>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://testgtwy.ippay.com/ippay/');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('<Origin>INTERNET</Origin>\n<CardNum CardPresent=”false”>\n<IndustryInfo Type=”ECOMMERCE”>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

The following example illustrates a 'SALE' transaction while explicitly declaring all default values. The explicitly declared defaults and optional data appear in bold print in the following example:

<ippay>
   <TransactionType>SALE</TransactionType>
   <TerminalID>TESTMERCHANT</TerminalID>
   <TransactionID>010327153017T10017</TransactionID>
   <Origin>INTERNET</Origin>
   <CardNum CardPresent=”false”>4000300020001000</CardNum>
   <CVV2>1234</CVV2>
   <CardExpMonth>12</CardExpMonth>
   <CardExpYear>14</CardExpYear>
   <CardName>Bob Tucker</CardName>
   <TotalAmount>99899</TotalAmount>
   <BillingAddress>8800 Central Dr.</BillingAddress>
   <BillingCity>Dallas</BillingCity>
   <BillingStateProv>TX</BillingStateProv>
   <BillingPostalCode>75251</BillingPostalCode>
   <BillingCountry>USA</BillingCountry>
   <BillingPhone>214-890-1800></BillingPhone>
   <Email>btucker@ippay.com</Email>
   <UserIPAddress>123.456.789.000</UserIPAddress>
   <UserHost>PHX.QW.AOL.COM</UserHost>
   <ShippingInfo>
         <CustomerPO>ABC12345</CustomerPO>
         <ShippingMethod>OVERNIGHT</ShippingMethod>
         <ShippingName>John Public</ShippingName>
         <ShippingAddr>
            <Address>3150 139th Avenue SE</Address>
            <City>Bellevue</City>
            <StateProv>WA</StateProv>
            <PostalCode>98005</PostalCode>
            <Country>USA</Country>
            <Phone>123456789</Phone>
         </ShippingAddr>
   </ShippingInfo>
   <IndustryInfo Type=”ECOMMERCE”>
      <UserAgent>MOZILLA/4.0 (COMPATIBLE; MSIE 6.0; WINDOWS XP)</UserAgent>
   </IndustryInfo>
</ippay>
var httpClient = new HttpClient();
var bodyXmlString = @"<ippay>" + "\n" +
@"   <TransactionType>SALE</TransactionType>" + "\n" +
@"   <TerminalID>TESTMERCHANT</TerminalID>" + "\n" +
@"   <TransactionID>010327153017T10017</TransactionID>" + "\n" +
@"   <Origin>INTERNET</Origin>" + "\n" +
@"   <CardNum CardPresent=”false”>4000300020001000</CardNum>" + "\n" +
@"   <CVV2>1234</CVV2>" + "\n" +
@"   <CardExpMonth>12</CardExpMonth>" + "\n" +
@"   <CardExpYear>14</CardExpYear>" + "\n" +
@"   <CardName>Bob Tucker</CardName>" + "\n" +
@"   <TotalAmount>99899</TotalAmount>" + "\n" +
@"   <BillingAddress>8800 Central Dr.</BillingAddress>" + "\n" +
@"   <BillingCity>Dallas</BillingCity>" + "\n" +
@"   <BillingStateProv>TX</BillingStateProv>" + "\n" +
@"   <BillingPostalCode>75251</BillingPostalCode>" + "\n" +
@"   <BillingCountry>USA</BillingCountry>" + "\n" +
@"   <BillingPhone>214-890-1800></BillingPhone>" + "\n" +
@"   <Email>btucker@ippay.com</Email>" + "\n" +
@"   <UserIPAddress>123.456.789.000</UserIPAddress>" + "\n" +
@"   <UserHost>PHX.QW.AOL.COM</UserHost>" + "\n" +
@"   <ShippingInfo>" + "\n" +
@"         <CustomerPO>ABC12345</CustomerPO>" + "\n" +
@"         <ShippingMethod>OVERNIGHT</ShippingMethod>" + "\n" +
@"         <ShippingName>John Public</ShippingName>" + "\n" +
@"         <ShippingAddr>" + "\n" +
@"            <Address>3150 139th Avenue SE</Address>" + "\n" +
@"            <City>Bellevue</City>" + "\n" +
@"            <StateProv>WA</StateProv>" + "\n" +
@"            <PostalCode>98005</PostalCode>" + "\n" +
@"            <Country>USA</Country>" + "\n" +
@"            <Phone>123456789</Phone>" + "\n" +
@"         </ShippingAddr>" + "\n" +
@"   </ShippingInfo>" + "\n" +
@"   <IndustryInfo Type=”ECOMMERCE”>" + "\n" +
@"      <UserAgent>MOZILLA/4.0 (COMPATIBLE; MSIE 6.0; WINDOWS XP)</UserAgent>" + "\n" +
@"   </IndustryInfo>" + "\n" +
@"</ippay>";

var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://testgtwy.ippay.com/ippay/", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://testgtwy.ippay.com/ippay/',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '<ippay>\n   <TransactionType>SALE</TransactionType>\n   <TerminalID>TESTMERCHANT</TerminalID>\n   <TransactionID>010327153017T10017</TransactionID>\n   <Origin>INTERNET</Origin>\n   <CardNum CardPresent=”false”>4000300020001000</CardNum>\n   <CVV2>1234</CVV2>\n   <CardExpMonth>12</CardExpMonth>\n   <CardExpYear>14</CardExpYear>\n   <CardName>Bob Tucker</CardName>\n   <TotalAmount>99899</TotalAmount>\n   <BillingAddress>8800 Central Dr.</BillingAddress>\n   <BillingCity>Dallas</BillingCity>\n   <BillingStateProv>TX</BillingStateProv>\n   <BillingPostalCode>75251</BillingPostalCode>\n   <BillingCountry>USA</BillingCountry>\n   <BillingPhone>214-890-1800></BillingPhone>\n   <Email>btucker@ippay.com</Email>\n   <UserIPAddress>123.456.789.000</UserIPAddress>\n   <UserHost>PHX.QW.AOL.COM</UserHost>\n   <ShippingInfo>\n         <CustomerPO>ABC12345</CustomerPO>\n         <ShippingMethod>OVERNIGHT</ShippingMethod>\n         <ShippingName>John Public</ShippingName>\n         <ShippingAddr>\n            <Address>3150 139th Avenue SE</Address>\n            <City>Bellevue</City>\n            <StateProv>WA</StateProv>\n            <PostalCode>98005</PostalCode>\n            <Country>USA</Country>\n            <Phone>123456789</Phone>\n         </ShippingAddr>\n   </ShippingInfo>\n   <IndustryInfo Type=”ECOMMERCE”>\n      <UserAgent>MOZILLA/4.0 (COMPATIBLE; MSIE 6.0; WINDOWS XP)</UserAgent>\n   </IndustryInfo>\n</ippay>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://testgtwy.ippay.com/ippay/');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('<ippay>\n   <TransactionType>SALE</TransactionType>\n   <TerminalID>TESTMERCHANT</TerminalID>\n   <TransactionID>010327153017T10017</TransactionID>\n   <Origin>INTERNET</Origin>\n   <CardNum CardPresent=”false”>4000300020001000</CardNum>\n   <CVV2>1234</CVV2>\n   <CardExpMonth>12</CardExpMonth>\n   <CardExpYear>14</CardExpYear>\n   <CardName>Bob Tucker</CardName>\n   <TotalAmount>99899</TotalAmount>\n   <BillingAddress>8800 Central Dr.</BillingAddress>\n   <BillingCity>Dallas</BillingCity>\n   <BillingStateProv>TX</BillingStateProv>\n   <BillingPostalCode>75251</BillingPostalCode>\n   <BillingCountry>USA</BillingCountry>\n   <BillingPhone>214-890-1800></BillingPhone>\n   <Email>btucker@ippay.com</Email>\n   <UserIPAddress>123.456.789.000</UserIPAddress>\n   <UserHost>PHX.QW.AOL.COM</UserHost>\n   <ShippingInfo>\n         <CustomerPO>ABC12345</CustomerPO>\n         <ShippingMethod>OVERNIGHT</ShippingMethod>\n         <ShippingName>John Public</ShippingName>\n         <ShippingAddr>\n            <Address>3150 139th Avenue SE</Address>\n            <City>Bellevue</City>\n            <StateProv>WA</StateProv>\n            <PostalCode>98005</PostalCode>\n            <Country>USA</Country>\n            <Phone>123456789</Phone>\n         </ShippingAddr>\n   </ShippingInfo>\n   <IndustryInfo Type=”ECOMMERCE”>\n      <UserAgent>MOZILLA/4.0 (COMPATIBLE; MSIE 6.0; WINDOWS XP)</UserAgent>\n   </IndustryInfo>\n</ippay>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

Ecommerce merchants transact card-not-present transactions via an Internet website and the default industry type for card-not-present transactions is ecommerce. Although the Gateway Provider assumes several default values for ecommerce transactions, it’s useful for merchants to explicitly declare those defaults.

Billing and shipping information is also applicable in ecommerce transactions. Although all are optional, the Gateway Provider recommends that at least the BillingAddress and BillingPostalCode should always be submitted to enable AVS.

Optional data included in an ecommerce transaction are:

<BillingAddress> = the billing address information and billing postal code
<BillingCity> information to enable AVS processing (recommended).
<BillingStateProv>
<BillingPostalCode>
<BillingCountry>
<BillingPhone>
<Email> = the customer’s email address
<UserIPAddress> = the customer’s IP address from which the transaction originated
<UserHost> = the name of the customer’s server
<ShippingInfo> <CustomerPO> = the customer’s purchase order number
<ShippingMethod> = delivery method for the purchase.
<ShippingName> = the recipient’s name.
<ShippingAddr>
<Address> = the customer’s shipping address info.
<City>
<StateProv>
<PostalCode>
<Country>
<Phone>
<IndustryInfo Type='ECOMMERCE'>
<UserAgent> = the customer’s HTTP browser type

Above, notice that the Origin, the CardPresent attribute, and the IndustryInfo Type attribute contain explicit values. For ecommerce transactions, the Origin is always 'INTERNET', the CardPresent attribute always has a 'false' value, and the IndustryInfo Type attribute always has a value of 'ECOMMERCE'.

Please note that the above example includes AVS ('Address Verification Service') data, including the BillingAddress, BillingPostalCode, and so on. Although the submission of AVS information is always optional, the Gateway Provider recommends that ecommerce merchants submit all billing information in every ecommerce transaction. Discounted transaction fees and enhanced chargeback protection may be awarded to merchants submitted AVS data.

It is considered a good programming practice to always explicitly declare your default values and not depend on implicit defaults for any contingency.

MOTO Industry-Specific Examples

The explicit values require for declaring a MOTO transaction request appear below:

<CardNum CardPresent=”false”>
<IndustryInfo Type=”MOTO”>
var httpClient = new HttpClient();
var bodyXmlString = @"<CardNum CardPresent=”false”>" + "\n" +
@"<IndustryInfo Type=”MOTO”>";

var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://testgtwy.ippay.com/ippay/", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://testgtwy.ippay.com/ippay/',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '<CardNum CardPresent=”false”>\n<IndustryInfo Type=”MOTO”>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://testgtwy.ippay.com/ippay/');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('<CardNum CardPresent=”false”>\n<IndustryInfo Type=”MOTO”>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

The Origin values must be one of two possible values:

<Origin>MAIL ORDER</Origin>
<Origin>PHONE ORDER</Origin>
var httpClient = new HttpClient();
var bodyXmlString = @"<Origin>MAIL ORDER</Origin>" + "\n" +
@"<Origin>PHONE ORDER</Origin>";

var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://testgtwy.ippay.com/ippay/", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://testgtwy.ippay.com/ippay/',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '<Origin>MAIL ORDER</Origin>\n<Origin>PHONE ORDER</Origin>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://testgtwy.ippay.com/ippay/');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('<Origin>MAIL ORDER</Origin>\n<Origin>PHONE ORDER</Origin>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

The following example illustrates a typical phone order sale. The sale illustrated here was transacted via telephone. MOTO-specific data appears in bold print:

<ippay>
   <TransactionType>SALE</TransactionType>
   <TerminalID>TESTTERMINAL</TerminalID>
   <TransactionID>010327153017T10017</TransactionID>
   <Origin>PHONE ORDER</Origin>
   <CardNum CardPresent=”false”>4000300020001000</CardNum>
   <CVV2>1234</CVV2>
   <CardExpMonth>12</CardExpMonth>
   <CardExpYear>14</CardExpYear>
   <CardName>Bob Tucker</CardName>
   <TotalAmount>99899</TotalAmount>
   <BillingAddress>8800 Central Dr.</BillingAddress>
   <BillingCity>Dallas</BillingCity>
   <BillingStateProv>TX</BillingStateProv>
   <BillingPostalCode>75251</BillingPostalCode>
   <BillingCountry>USA</BillingCountry>
   <BillingPhone>214-890-1800></BillingPhone>
   <Email>btucker@ippay.com</Email>
   <ShippingInfo>
         <CustomerPO>ABC12345</CustomerPO>
         <ShippingMethod>OVERNIGHT</ShippingMethod>
         <ShippingName>John Public</ShippingName>
         <ShippingAddr>
            <Address>3150 139th Avenue SE</Address>
            <City>Bellevue</City>
            <StateProv>WA</StateProv>
            <PostalCode>98005</PostalCode>
            <Country>USA</Country>
            <Phone>123456789</Phone>
         </ShippingAddr>
   </ShippingInfo>
   <IndustryInfo Type=”MOTO”>
      <PhoneANI>9725038900</PhoneANI>
      <PhoneII>00</PhoneII>
   </IndustryInfo>
</ippay>
var httpClient = new HttpClient();
var bodyXmlString = @"<ippay>" + "\n" +
@"   <TransactionType>SALE</TransactionType>" + "\n" +
@"   <TerminalID>TESTTERMINAL</TerminalID>" + "\n" +
@"   <TransactionID>010327153017T10017</TransactionID>" + "\n" +
@"   <Origin>PHONE ORDER</Origin>" + "\n" +
@"   <CardNum CardPresent=”false”>4000300020001000</CardNum>" + "\n" +
@"   <CVV2>1234</CVV2>" + "\n" +
@"   <CardExpMonth>12</CardExpMonth>" + "\n" +
@"   <CardExpYear>14</CardExpYear>" + "\n" +
@"   <CardName>Bob Tucker</CardName>" + "\n" +
@"   <TotalAmount>99899</TotalAmount>" + "\n" +
@"   <BillingAddress>8800 Central Dr.</BillingAddress>" + "\n" +
@"   <BillingCity>Dallas</BillingCity>" + "\n" +
@"   <BillingStateProv>TX</BillingStateProv>" + "\n" +
@"   <BillingPostalCode>75251</BillingPostalCode>" + "\n" +
@"   <BillingCountry>USA</BillingCountry>" + "\n" +
@"   <BillingPhone>214-890-1800></BillingPhone>" + "\n" +
@"   <Email>btucker@ippay.com</Email>" + "\n" +
@"   <ShippingInfo>" + "\n" +
@"         <CustomerPO>ABC12345</CustomerPO>" + "\n" +
@"         <ShippingMethod>OVERNIGHT</ShippingMethod>" + "\n" +
@"         <ShippingName>John Public</ShippingName>" + "\n" +
@"         <ShippingAddr>" + "\n" +
@"            <Address>3150 139th Avenue SE</Address>" + "\n" +
@"            <City>Bellevue</City>" + "\n" +
@"            <StateProv>WA</StateProv>" + "\n" +
@"            <PostalCode>98005</PostalCode>" + "\n" +
@"            <Country>USA</Country>" + "\n" +
@"            <Phone>123456789</Phone>" + "\n" +
@"         </ShippingAddr>" + "\n" +
@"   </ShippingInfo>" + "\n" +
@"   <IndustryInfo Type=”MOTO”>" + "\n" +
@"      <PhoneANI>9725038900</PhoneANI>" + "\n" +
@"      <PhoneII>00</PhoneII>" + "\n" +
@"   </IndustryInfo>" + "\n" +
@"</ippay>";

var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://testgtwy.ippay.com/ippay/", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://testgtwy.ippay.com/ippay/',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '<ippay>\n   <TransactionType>SALE</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <TransactionID>010327153017T10017</TransactionID>\n   <Origin>PHONE ORDER</Origin>\n   <CardNum CardPresent=”false”>4000300020001000</CardNum>\n   <CVV2>1234</CVV2>\n   <CardExpMonth>12</CardExpMonth>\n   <CardExpYear>14</CardExpYear>\n   <CardName>Bob Tucker</CardName>\n   <TotalAmount>99899</TotalAmount>\n   <BillingAddress>8800 Central Dr.</BillingAddress>\n   <BillingCity>Dallas</BillingCity>\n   <BillingStateProv>TX</BillingStateProv>\n   <BillingPostalCode>75251</BillingPostalCode>\n   <BillingCountry>USA</BillingCountry>\n   <BillingPhone>214-890-1800></BillingPhone>\n   <Email>btucker@ippay.com</Email>\n   <ShippingInfo>\n         <CustomerPO>ABC12345</CustomerPO>\n         <ShippingMethod>OVERNIGHT</ShippingMethod>\n         <ShippingName>John Public</ShippingName>\n         <ShippingAddr>\n            <Address>3150 139th Avenue SE</Address>\n            <City>Bellevue</City>\n            <StateProv>WA</StateProv>\n            <PostalCode>98005</PostalCode>\n            <Country>USA</Country>\n            <Phone>123456789</Phone>\n         </ShippingAddr>\n   </ShippingInfo>\n   <IndustryInfo Type=”MOTO”>\n      <PhoneANI>9725038900</PhoneANI>\n      <PhoneII>00</PhoneII>\n   </IndustryInfo>\n</ippay>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://testgtwy.ippay.com/ippay/');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('<ippay>\n   <TransactionType>SALE</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <TransactionID>010327153017T10017</TransactionID>\n   <Origin>PHONE ORDER</Origin>\n   <CardNum CardPresent=”false”>4000300020001000</CardNum>\n   <CVV2>1234</CVV2>\n   <CardExpMonth>12</CardExpMonth>\n   <CardExpYear>14</CardExpYear>\n   <CardName>Bob Tucker</CardName>\n   <TotalAmount>99899</TotalAmount>\n   <BillingAddress>8800 Central Dr.</BillingAddress>\n   <BillingCity>Dallas</BillingCity>\n   <BillingStateProv>TX</BillingStateProv>\n   <BillingPostalCode>75251</BillingPostalCode>\n   <BillingCountry>USA</BillingCountry>\n   <BillingPhone>214-890-1800></BillingPhone>\n   <Email>btucker@ippay.com</Email>\n   <ShippingInfo>\n         <CustomerPO>ABC12345</CustomerPO>\n         <ShippingMethod>OVERNIGHT</ShippingMethod>\n         <ShippingName>John Public</ShippingName>\n         <ShippingAddr>\n            <Address>3150 139th Avenue SE</Address>\n            <City>Bellevue</City>\n            <StateProv>WA</StateProv>\n            <PostalCode>98005</PostalCode>\n            <Country>USA</Country>\n            <Phone>123456789</Phone>\n         </ShippingAddr>\n   </ShippingInfo>\n   <IndustryInfo Type=”MOTO”>\n      <PhoneANI>9725038900</PhoneANI>\n      <PhoneII>00</PhoneII>\n   </IndustryInfo>\n</ippay>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

Alternatively, a mail order sale looks like this:

<ippay>
   <TransactionType>SALE</TransactionType>
   <TerminalID>TESTTERMINAL</TerminalID>
   <TransactionID>010327153017T10017</TransactionID>
   <Origin>MAIL ORDER</Origin>
   <CardNum CardPresent=”false”>4000300020001000</CardNum>
   <CVV2>1234</CVV2>
   <CardExpMonth>12</CardExpMonth>
   <CardExpYear>14</CardExpYear>
   <CardName>Bob Tucker</CardName>
   <TotalAmount>99899</TotalAmount>
   <BillingAddress>8800 Central Dr.</BillingAddress>
   <BillingCity>Dallas</BillingCity>
   <BillingStateProv>TX</BillingStateProv>
   <BillingPostalCode>75251</BillingPostalCode>
   <BillingCountry>USA</BillingCountry>
   <BillingPhone>214-890-1800></BillingPhone>
   <Email>btucker@ippay.com</Email>
   <ShippingInfo>
         <CustomerPO>ABC12345</CustomerPO>
         <ShippingMethod>OVERNIGHT</ShippingMethod>
         <ShippingName>John Public</ShippingName>
         <ShippingAddr>
            <Address>3150 139th Avenue SE</Address>
            <City>Bellevue</City>
            <StateProv>WA</StateProv>
            <PostalCode>98005</PostalCode>
            <Country>USA</Country>
            <Phone>123456789</Phone>
         </ShippingAddr>
   </ShippingInfo>
   <IndustryInfo Type=”MOTO”></IndustryInfo>
</ippay>
var httpClient = new HttpClient();
var bodyXmlString = @"<ippay>" + "\n" +
@"   <TransactionType>SALE</TransactionType>" + "\n" +
@"   <TerminalID>TESTTERMINAL</TerminalID>" + "\n" +
@"   <TransactionID>010327153017T10017</TransactionID>" + "\n" +
@"   <Origin>MAIL ORDER</Origin>" + "\n" +
@"   <CardNum CardPresent=”false”>4000300020001000</CardNum>" + "\n" +
@"   <CVV2>1234</CVV2>" + "\n" +
@"   <CardExpMonth>12</CardExpMonth>" + "\n" +
@"   <CardExpYear>14</CardExpYear>" + "\n" +
@"   <CardName>Bob Tucker</CardName>" + "\n" +
@"   <TotalAmount>99899</TotalAmount>" + "\n" +
@"   <BillingAddress>8800 Central Dr.</BillingAddress>" + "\n" +
@"   <BillingCity>Dallas</BillingCity>" + "\n" +
@"   <BillingStateProv>TX</BillingStateProv>" + "\n" +
@"   <BillingPostalCode>75251</BillingPostalCode>" + "\n" +
@"   <BillingCountry>USA</BillingCountry>" + "\n" +
@"   <BillingPhone>214-890-1800></BillingPhone>" + "\n" +
@"   <Email>btucker@ippay.com</Email>" + "\n" +
@"   <ShippingInfo>" + "\n" +
@"         <CustomerPO>ABC12345</CustomerPO>" + "\n" +
@"         <ShippingMethod>OVERNIGHT</ShippingMethod>" + "\n" +
@"         <ShippingName>John Public</ShippingName>" + "\n" +
@"         <ShippingAddr>" + "\n" +
@"            <Address>3150 139th Avenue SE</Address>" + "\n" +
@"            <City>Bellevue</City>" + "\n" +
@"            <StateProv>WA</StateProv>" + "\n" +
@"            <PostalCode>98005</PostalCode>" + "\n" +
@"            <Country>USA</Country>" + "\n" +
@"            <Phone>123456789</Phone>" + "\n" +
@"         </ShippingAddr>" + "\n" +
@"   </ShippingInfo>" + "\n" +
@"   <IndustryInfo Type=”MOTO”></IndustryInfo>" + "\n" +
@"</ippay>";

var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://testgtwy.ippay.com/ippay/", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://testgtwy.ippay.com/ippay/',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '<ippay>\n   <TransactionType>SALE</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <TransactionID>010327153017T10017</TransactionID>\n   <Origin>MAIL ORDER</Origin>\n   <CardNum CardPresent=”false”>4000300020001000</CardNum>\n   <CVV2>1234</CVV2>\n   <CardExpMonth>12</CardExpMonth>\n   <CardExpYear>14</CardExpYear>\n   <CardName>Bob Tucker</CardName>\n   <TotalAmount>99899</TotalAmount>\n   <BillingAddress>8800 Central Dr.</BillingAddress>\n   <BillingCity>Dallas</BillingCity>\n   <BillingStateProv>TX</BillingStateProv>\n   <BillingPostalCode>75251</BillingPostalCode>\n   <BillingCountry>USA</BillingCountry>\n   <BillingPhone>214-890-1800></BillingPhone>\n   <Email>btucker@ippay.com</Email>\n   <ShippingInfo>\n         <CustomerPO>ABC12345</CustomerPO>\n         <ShippingMethod>OVERNIGHT</ShippingMethod>\n         <ShippingName>John Public</ShippingName>\n         <ShippingAddr>\n            <Address>3150 139th Avenue SE</Address>\n            <City>Bellevue</City>\n            <StateProv>WA</StateProv>\n            <PostalCode>98005</PostalCode>\n            <Country>USA</Country>\n            <Phone>123456789</Phone>\n         </ShippingAddr>\n   </ShippingInfo>\n   <IndustryInfo Type=”MOTO”></IndustryInfo>\n</ippay>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://testgtwy.ippay.com/ippay/');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('<ippay>\n   <TransactionType>SALE</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <TransactionID>010327153017T10017</TransactionID>\n   <Origin>MAIL ORDER</Origin>\n   <CardNum CardPresent=”false”>4000300020001000</CardNum>\n   <CVV2>1234</CVV2>\n   <CardExpMonth>12</CardExpMonth>\n   <CardExpYear>14</CardExpYear>\n   <CardName>Bob Tucker</CardName>\n   <TotalAmount>99899</TotalAmount>\n   <BillingAddress>8800 Central Dr.</BillingAddress>\n   <BillingCity>Dallas</BillingCity>\n   <BillingStateProv>TX</BillingStateProv>\n   <BillingPostalCode>75251</BillingPostalCode>\n   <BillingCountry>USA</BillingCountry>\n   <BillingPhone>214-890-1800></BillingPhone>\n   <Email>btucker@ippay.com</Email>\n   <ShippingInfo>\n         <CustomerPO>ABC12345</CustomerPO>\n         <ShippingMethod>OVERNIGHT</ShippingMethod>\n         <ShippingName>John Public</ShippingName>\n         <ShippingAddr>\n            <Address>3150 139th Avenue SE</Address>\n            <City>Bellevue</City>\n            <StateProv>WA</StateProv>\n            <PostalCode>98005</PostalCode>\n            <Country>USA</Country>\n            <Phone>123456789</Phone>\n         </ShippingAddr>\n   </ShippingInfo>\n   <IndustryInfo Type=”MOTO”></IndustryInfo>\n</ippay>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

MOTO is an industry term that stands for 'Mail Order / Telephone Order'merchant. MOTO transactions must explicitly declare certain industry-specific data within every submitted transaction. The only default that a MOTO transaction may presume is that the CardPresent attribute is always 'false.'

Billing and shipping information is also applicable in MOTO transactions. Although all are optional, the Gateway Provider recommends that at least the BillingAddress and BillingPostalCode should always be submitted to enable AVS.

Optional data included in an ecommerce transaction are:

<BillingAddress> = the billing address information and billing postal
<BillingCity> code information to enable AVS processing (recommended).
<BillingStateProv>
<BillingPostalCode>
<BillingCountry>
<BillingPhone>
<Email> = the customer’s email address
<ShippingInfo>
<CustomerPO> = the customer’s purchase order number
<ShippingMethod> = delivery method for the purchase.
<ShippingName> = the recipient’s name.
<ShippingAddr>
<Address> = the customer’s shipping address info.
<City>
<StateProv>
<PostalCode>
<Country>
<Phone>
<IndustryInfo Type='MOTO'>

Although the submission of AVS information is always optional, the Gateway Provider recommends that MOTO merchants submit all billing information in every ecommerce transaction. Discounted transaction fees and enhanced chargeback protection may be awarded to merchants submitting AVS data.

AVS and billing information is omitted in the above examples solely for the sake of brevity. Although AVS participation is optional, MOTO merchants are urged to always submit AVS data in every transaction. Refer to the prior 'SALE' examples in earlier sections for an example of an AVS submission.

Additional examples

The Gateway Provider accepts some industry-specific data to be submitted for many market verticals. By default, the Gateway Provider supports the retail and ecommerce verticals; all other verticals must explicitly declare their industry type within a transaction.

The verticals recognized and supported by the Gateway Provider include:

RETAIL - This retail industry type is presumed when magnetic track data is submitted, or when the merchant declares a 'card present' condition for a transaction.

ECOMMERCE - This ecommerce industry type becomes the default for all
'card not present' transactions.

MOTO - The mail order and telephone order industry vertical must declare this industry type in all their transactions.

HOTEL - The hotel and lodging industry submit numerous industry-specific data for this vertical, including room number, room rates, etc..

PARKINGPaid-parking companies can receive reports for their submitted
parking transaction data.

AUTORENTALThe auto rental industry submits industry-specific data
for their vertical

POS Features for the Retail Industry Type

The retail industry consists of brick-and-mortar merchants that submit card-present transactions to the Gateway Provider. Transactions are commonly submitted using a POS ('point-of-sale') terminal device having a magnetic stripe reader. Some merchants have developed and deployed POS terminal emulators to run on standard desktop computers and submit standard retail transactions. All of these POS transactions are classified as a RETAIL industry type.

Methods of Securely Posting an XML file

If you are using Java, you can download the Java Secure Socket Extension package available at http://java.sun.com.

If you are using Microsoft technologies, you can use the XMLHTTPRequest object of msxml.dll. Please note that this solution is built upon wininet.dll, which is not scalable. Another solution is to use the rope.dll that is included with the SOAP toolkit.

Gateway can no longer accept a connection utilizing the 3DES cipher. As such, you will not be able to use Windows 2000, XP or 2003. Connection via SSLv3 is also disabled.

Connecting to the Gateway Provider

For XML development or testing XML-generating software.
https://testgtwy.ippay.com/ippay/

Production gateway for live transactions or sending XML according to this specification.
https://gtwy.ippay.com/ippay/

Refer to your merchant boarding welcome kit for your production credentials.

Please refer to the Test Simulator and Test cases sections for more a detailed procedure on testing and debugging transaction code.

The production gateway should not be used for test purposes (unless a test of live transaction data is deliberately planned with intent to settle that transaction data).

Stress testing is not permitted over the Internet connections without the specific consent of the Gateway Provider. Any entity discovered to be stress testing over the Internet without consent of the Gateway Provider will be categorized as a Denial of Service operator and be prohibited from using these URLs without notice.

Address Verification (AVS) Example

The following 'SALE' example illustrates a transaction invoking AVS:

<ippay>
   <TransactionType>SALE</TransactionType>
   <TerminalID>TESTTERMINAL</TerminalID>
   <TransactionID>010327153017T10017</TransactionID>
   <CardNum>4000300020001000</CardNum>
   <CardExpMonth>12</CardExpMonth>
   <CardExpYear>14</CardExpYear>
   <TotalAmount>99999</TotalAmount>
   <CardName>Bob Tucker</CardName>
   <BillingAddress>8800 Central Dr.</BillingAddress>
   <BillingCity>Dallas</BillingCity>
   <BillingStateProv>TX</BillingStateProv>
   <BillingPostalCode>75251</BillingPostalCode>
   <BillingCountry>USA</BillingCountry>
   <BillingPhone>412-890-1800</BillingPhone>
</ippay>
var httpClient = new HttpClient();
var bodyXmlString = @"<ippay>" + "\n" +
@"   <TransactionType>SALE</TransactionType>" + "\n" +
@"   <TerminalID>TESTTERMINAL</TerminalID>" + "\n" +
@"   <TransactionID>010327153017T10017</TransactionID>" + "\n" +
@"   <CardNum>4000300020001000</CardNum>" + "\n" +
@"   <CardExpMonth>12</CardExpMonth>" + "\n" +
@"   <CardExpYear>14</CardExpYear>" + "\n" +
@"   <TotalAmount>99999</TotalAmount>" + "\n" +
@"   <CardName>Bob Tucker</CardName>" + "\n" +
@"   <BillingAddress>8800 Central Dr.</BillingAddress>" + "\n" +
@"   <BillingCity>Dallas</BillingCity>" + "\n" +
@"   <BillingStateProv>TX</BillingStateProv>" + "\n" +
@"   <BillingPostalCode>75251</BillingPostalCode>" + "\n" +
@"   <BillingCountry>USA</BillingCountry>" + "\n" +
@"   <BillingPhone>412-890-1800</BillingPhone>" + "\n" +
@"</ippay>";

var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://testgtwy.ippay.com/ippay/", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://testgtwy.ippay.com/ippay/',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '<ippay>\n   <TransactionType>SALE</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <TransactionID>010327153017T10017</TransactionID>\n   <CardNum>4000300020001000</CardNum>\n   <CardExpMonth>12</CardExpMonth>\n   <CardExpYear>14</CardExpYear>\n   <TotalAmount>99999</TotalAmount>\n   <CardName>Bob Tucker</CardName>\n   <BillingAddress>8800 Central Dr.</BillingAddress>\n   <BillingCity>Dallas</BillingCity>\n   <BillingStateProv>TX</BillingStateProv>\n   <BillingPostalCode>75251</BillingPostalCode>\n   <BillingCountry>USA</BillingCountry>\n   <BillingPhone>412-890-1800</BillingPhone>\n</ippay>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://testgtwy.ippay.com/ippay/');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('<ippay>\n   <TransactionType>SALE</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <TransactionID>010327153017T10017</TransactionID>\n   <CardNum>4000300020001000</CardNum>\n   <CardExpMonth>12</CardExpMonth>\n   <CardExpYear>14</CardExpYear>\n   <TotalAmount>99999</TotalAmount>\n   <CardName>Bob Tucker</CardName>\n   <BillingAddress>8800 Central Dr.</BillingAddress>\n   <BillingCity>Dallas</BillingCity>\n   <BillingStateProv>TX</BillingStateProv>\n   <BillingPostalCode>75251</BillingPostalCode>\n   <BillingCountry>USA</BillingCountry>\n   <BillingPhone>412-890-1800</BillingPhone>\n</ippay>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

The following shows how the successful response would look:

<ippayResponse>
   <TransactionID>010327153017T10017</TransactionID>
   <ActionCode>000</ActionCode>
   <Approval>002F6B</Approval>
   <ResponseText>APPROVED</ResponseText>
   <AddressMatch>Y</AddressMatch>
   <ZipMatch>Y</ZipMatch>
   <AVS>Y</AVS>
</ippayResponse>

By verifying billing address information, merchants ensure that their customers are representing their financial responsibilities in good faith. For example, an online dating service that advertises a trustworthy reputation may wish to verify their subscribers’ billing addresses, or a travel agency might wish to verify that they are delivering some expensive plane tickets to a proven billing address. However, regardless of whether AVS is actually necessary for a business to operate, submission of correct AVS mitigates fraud thereby reducing risk for transactions. This is reason alone for any merchant to participate in AVS.

The credit card companies all perform AVS by comparing the numeric digits in the transaction’s billing address with information on file for a cardholder. If the numeric digits in the address and postal code match are sent, the merchant receives an AVS response along with the transaction authorization. The AVS response reflects the result of the comparison of the numeric digits in the address and postal code.

American Express also performs a name-matching operation. By submitting the cardholder’s name on an Amex transaction, additional AVS responses are available.

The above example is applicable to 'AUTHONLY' transactions in addition to the 'SALE' transactions.

AVS is automatically invoked whenever an incoming transaction contains billing address data. Merchants may invoke AVS for 'AUTHONLY' and 'SALE' transactions only. AVS is not available for 'CAPT', 'FORCE', 'CREDIT', or other transactions.

AVS Result Codes

The Gateway Provider offers cardholder address verification through AVS, a system available widely throughout North America and much of Europe. With address verification, the merchant submits a customer’s address and postal code information in a transaction and the credit card issue verifies and validates the address information against their internal billing address data. The result code sent by an issuer advises the merchant of a customer’s billing integrity when completing the credit card transaction.

Visa and MasterCard both call this feature AVS, which stands for 'Address Verification Service.' American Express calls this feature AAV, which stands for 'Address Authentication and Verification.'

Almost all North American issuers support AVS using Visa and MasterCard association rules. According to these rules, an issuer compares the numeric digits within a cardholder’s address and postal information with their own stored billing information. All alphabetic information is ignored. The address and postal code match (or fail to match) and an AVS result code is generated by the issuer. This is returned to the merchant during an authorization.

American Express adds cardholder name matching to their AAV. A merchant can submit their customer’s name in addition to the billing address information and may receive a number of additional AVS result codes. Shipping address information may also be submitted in an Amex transaction, and additional result codes are anticipated from Amex in the future.

For most issuers, the AVS works independent of the action code. In other words, a transaction may be approved even though billing address information doesn’t match. Because transaction approval is independent of billing address integrity, it’s up to the merchant to decide the importance of correct billing address information when completing a sale. A merchant may simply allow a transaction to proceed, or a merchant might independently discontinue the sale in spite of an approval.

The Gateway Provider, based on the AVS result code, automatically fills the AddressMatch and ZipMatch elements. The possible AddressMatch and ZipMatch values are 'Y', 'N', or 'X', and the value is determined with the AVS result code.

The Gateway Provider offers an 'Automatic AVS Rejection' feature, where merchants may automatically decline transactions showing degraded AVS results. Automatic AVS Rejection is an optional service that requires a merchant to subscribe before the Gateway Provider will automatically reject transaction on behalf of the merchant.

AVS Result Description
A - (all) Address matches, postal code absent or does not match. - (All)
M - (all) Street address and postal code match.
CM Name, street address and postal code match.
(Visa/MC) - (Amex)
N - (all) Neither address nor postal code matches. - (All)
R - (all) Retry. - (All)
S - (all) AVS unavailable. - (All)
U - (all) AVS unavailable. - (All)
Z - (Visa) W was replaced by Z. - (Visa)
W - (MC/Amex) Postal code matches, address absent or does not match. - (MC)
CM Name, street address and postal code are all incorrect. - (Amex)
Y - (all) Street address and postal code match. - (All)
Z - (all) Postal code matches, address absent or does not match. - (All)
B - (Visa/MC) Street address match. Postal code has invalid format. - (Visa/MC)
E - (Amex) CM Name incorrect. Street address and postal code match. - (Amex)
C - (Visa/MC) Street address and postal code have invalid formats. - (Visa/MC)
K - (Amex) CM Name matches. - (Amex)
G - (Visa/MC) Non-AVS participant outside U.S. Address not verified. - (Visa/MC)
L - (Amex) CM Name and postal code match. - (Amex)
I - (Visa/MC) Street address not verified for international transaction. - (Visa/MC)
O - (Amex) CM Name and address match. - (Amex)
P - (Visa/MC) Postal code match. Street address has invalid format. - (Visa/MC)
F - (Amex) CM Name incorrect. Street address matches. - (Amex)
X - (Visa/MC) Nine-digit postal code match in U.S. Postal code and address match for outside U.S. - (Visa/MC)
F - (Visa) Street address and postal code match for U.K. only - (Visa)

Address Verification (AVS)

The following 'SALE' example illustrates a transaction invoking AVS:

<ippay>
   <TransactionType>SALE</TransactionType>
   <TerminalID>TESTTERMINAL</TerminalID>
   <TransactionID>010327153017T10017</TransactionID>
   <CardNum>4000300020001000</CardNum>
   <CardExpMonth>12</CardExpMonth>
   <CardExpYear>14</CardExpYear>
   <TotalAmount>99999</TotalAmount>
   <CardName>Bob Tucker</CardName>
   <BillingAddress>8800 Central Dr.</BillingAddress>
   <BillingCity>Dallas</BillingCity>
   <BillingStateProv>TX</BillingStateProv>
   <BillingPostalCode>75251</BillingPostalCode>
   <BillingCountry>USA</BillingCountry>
   <BillingPhone>412-890-1800</BillingPhone>
</ippay>
var httpClient = new HttpClient();
var bodyXmlString = @"<ippay>" + "\n" +
@"   <TransactionType>SALE</TransactionType>" + "\n" +
@"   <TerminalID>TESTTERMINAL</TerminalID>" + "\n" +
@"   <TransactionID>010327153017T10017</TransactionID>" + "\n" +
@"   <CardNum>4000300020001000</CardNum>" + "\n" +
@"   <CardExpMonth>12</CardExpMonth>" + "\n" +
@"   <CardExpYear>14</CardExpYear>" + "\n" +
@"   <TotalAmount>99999</TotalAmount>" + "\n" +
@"   <CardName>Bob Tucker</CardName>" + "\n" +
@"   <BillingAddress>8800 Central Dr.</BillingAddress>" + "\n" +
@"   <BillingCity>Dallas</BillingCity>" + "\n" +
@"   <BillingStateProv>TX</BillingStateProv>" + "\n" +
@"   <BillingPostalCode>75251</BillingPostalCode>" + "\n" +
@"   <BillingCountry>USA</BillingCountry>" + "\n" +
@"   <BillingPhone>412-890-1800</BillingPhone>" + "\n" +
@"</ippay>";

var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://testgtwy.ippay.com/ippay/", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://testgtwy.ippay.com/ippay/',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '<ippay>\n   <TransactionType>SALE</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <TransactionID>010327153017T10017</TransactionID>\n   <CardNum>4000300020001000</CardNum>\n   <CardExpMonth>12</CardExpMonth>\n   <CardExpYear>14</CardExpYear>\n   <TotalAmount>99999</TotalAmount>\n   <CardName>Bob Tucker</CardName>\n   <BillingAddress>8800 Central Dr.</BillingAddress>\n   <BillingCity>Dallas</BillingCity>\n   <BillingStateProv>TX</BillingStateProv>\n   <BillingPostalCode>75251</BillingPostalCode>\n   <BillingCountry>USA</BillingCountry>\n   <BillingPhone>412-890-1800</BillingPhone>\n</ippay>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://testgtwy.ippay.com/ippay/');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('<ippay>\n   <TransactionType>SALE</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <TransactionID>010327153017T10017</TransactionID>\n   <CardNum>4000300020001000</CardNum>\n   <CardExpMonth>12</CardExpMonth>\n   <CardExpYear>14</CardExpYear>\n   <TotalAmount>99999</TotalAmount>\n   <CardName>Bob Tucker</CardName>\n   <BillingAddress>8800 Central Dr.</BillingAddress>\n   <BillingCity>Dallas</BillingCity>\n   <BillingStateProv>TX</BillingStateProv>\n   <BillingPostalCode>75251</BillingPostalCode>\n   <BillingCountry>USA</BillingCountry>\n   <BillingPhone>412-890-1800</BillingPhone>\n</ippay>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

The following shows how the successful response would look:

<ippayResponse>
   <TransactionID>010327153017T10017</TransactionID>
   <ActionCode>000</ActionCode>
   <Approval>002F6B</Approval>
   <ResponseText>APPROVED</ResponseText>
   <AddressMatch>Y</AddressMatch>
   <ZipMatch>Y</ZipMatch>
   <AVS>Y</AVS>
</ippayResponse>

By verifying billing address information, merchants ensure that their customers are representing their financial responsibilities in good faith. For example, an online dating service that advertises a trustworthy reputation may wish to verify their subscribers’ billing addresses, or a travel agency might wish to verify that they are delivering some expensive plane tickets to a proven billing address. However, regardless of whether AVS is actually necessary for a business to operate, submission of correct AVS mitigates fraud thereby reducing risk for transactions. This is reason alone for any merchant to participate in AVS.

The credit card companies all perform AVS by comparing the numeric digits in the transaction’s billing address with information on file for a cardholder. If the numeric digits in the address and postal code match are sent, the merchant receives an AVS response along with the transaction authorization. The AVS response reflects the result of the comparison of the numeric digits in the address and postal code.

American Express also performs a name-matching operation. By submitting the cardholder’s name on an Amex transaction, additional AVS responses are available.

The above example is applicable to 'AUTHONLY' transactions in addition to the 'SALE' transactions.

AVS is automatically invoked whenever an incoming transaction contains billing address data. Merchants may invoke AVS for 'AUTHONLY' and 'SALE' transactions only. AVS is not available for 'CAPT', 'CREDIT', or other transactions.

CVV2 Result Codes

The Gateway Provider enables credit card validation through the CVV2 feature, a system widely supported throughout the credit card industry. With this feature, every physical credit card has a three- or four-digit value imprinted on the credit card in addition to the card number. Submitting this three- or four-digit 'security code' enhances fraud detection for a transaction, ensuring that a genuine physical credit card is present during that transaction.

Visa cards have a three-digit CVV2 value, MasterCard cards have a three-digit CVC2 value, and American Express uses a four-digit CID value to enable card validation. This three- or four- digit value is found imprinted on the back side of a credit card, usually inside the signature block (it may also be imprinted on the front side of the card).

Participation in CVV2/CVC2 is optional for issuers. The subscribing issuers submit their CVV2/CVC2 keys to Visa and MasterCard, and these keys are kept secret. The individual CVV2/CVC2 implementation policies of the tens of thousands of issuers are confidential, and issuers may change their internal CVV2/CVC2 policies without notification. Statistics are unavailable as to how many issuers subscriber (or don’t subscribe) to CVV2/CVC2.

Issuers may decide to return a '806' action code, indicating that a Visa issuer has declined a transaction due to the submission of an invalid CVV2 value. The '806' action code (a response allowed under Visa’s association rules) enables issuers to independently decide a policy of rejecting transactions having invalid CVV2 values. An '806' action code may have a 'N' or 'U' or 'P' response, but never an 'M' response.

Another factor that may affect CVV2 result codes is stand-in processing. When Visa or MasterCard performs stand-in processing for an issuer (because the issuer is otherwise unable to respond directly for a transaction), Visa/MC will perform the CVV2 calculations on behalf of any issuers who subscribe to CVV2.

Dynamic Descriptor

Updated February 2024

The Dynamic Descriptor product allows a user to submit a unique merchant descriptor or product descriptor each transaction. This Dynamic Descriptor Service can be a vital tool for reducing or eliminating customer service calls and chargebacks.

The Dynamic Descriptor will persist throughout the transaction and be posted on the cardholder's statement for clarification and resolution purposes. The Dynamic Descriptor Service allows the merchant's customer to quickly identify the product or service, avoiding formal transaction inquiries or chargebacks and the associated fees from the card issuers.

This service is a valuable upgrade to industry standard descriptors, which only supply the name of the company where the purchase was made. Often this name – associated with the merchant – is not the one attached to the web site or even the merchant location where the purchase was made. Giving consumers more information on their statements can lead to reduction of chargebacks and their associated fees and, even more importantly, to repeat business, since it reinforces where the original purchase was made.

When the account is boarded to the Gateway, the user will need to inform the Gateway Provider that they intend to use Dynamic Descriptor so that the product may be turned on. The format of the descriptor must follow a predetermined convention and will use the <OrderNumber> field to send in the dynamic descriptor value:
<OrderNumber>Static Descriptor*Dynamic Descriptor</OrderNumber> The static descriptor may be 5, 7 or 11 digits long and must be followed with an * character, to separate it from the dynamic portion of the descriptor. The static portion of the descriptor must be the same for every transaction and must reasonably match the Legal or DBA name of the underwritten merchant account. The Dynamic portion of the descriptor can change from transaction to transaction 'dynamically'. The total length of the permitted descriptor, including the on-file 10 digit phone number is 22 characters, which includes spaces and the required * character.

At this time, American Express does not support the Dynamic Descriptor product for merchants using the American Express OptBlue Program.

Test Cases

TestSim Sample Test Cases
Document revision 1.0 June 2022

SAMPLE XML TRANSACTIONS AND EXPECTED RESPONSES

PING

Verify active communication with acquirer software. ResponseText reads 'PING' to acknowledge this transaction.

PING Request:

<ippay>
   <TransactionType>PING</TransactionType>
   <TerminalID>TESTTERMINAL</TerminalID>
</ippay>
var httpClient = new HttpClient();
var bodyXmlString = @"<ippay>" + "\n" +
@"   <TransactionType>PING</TransactionType>" + "\n" +
@"   <TerminalID>TESTTERMINAL</TerminalID>" + "\n" +
@"</ippay>";

var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://testgtwy.ippay.com/ippay/", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://testgtwy.ippay.com/ippay/',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '<ippay>\n   <TransactionType>PING</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n</ippay>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://testgtwy.ippay.com/ippay/');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('<ippay>\n   <TransactionType>PING</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n</ippay>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

PING. Expected Response:

<ippayResponse>
   <TransactionID>L20120313151732863</TransactionID>
   <ActionCode>000</ActionCode>
   <ResponseText>APPROVED</ResponseText>
</ippayResponse>

AUTHONLY     

AUTHONLY Request:

<ippay>
   <TransactionType>AUTHONLY</TransactionType>
   <TerminalID>TESTTERMINAL</TerminalID>
   <CardNum>4000300020001000</CardNum>
   <CardExpMonth>12</CardExpMonth>
   <CardExpYear>14</CardExpYear>
   <TotalAmount>8700</TotalAmount>
</ippay>
var httpClient = new HttpClient();
var bodyXmlString = @"<ippay>" + "\n" +
@"   <TransactionType>AUTHONLY</TransactionType>" + "\n" +
@"   <TerminalID>TESTTERMINAL</TerminalID>" + "\n" +
@"   <CardNum>4000300020001000</CardNum>" + "\n" +
@"   <CardExpMonth>12</CardExpMonth>" + "\n" +
@"   <CardExpYear>14</CardExpYear>" + "\n" +
@"   <TotalAmount>8700</TotalAmount>" + "\n" +
@"</ippay>";

var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://testgtwy.ippay.com/ippay/", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://testgtwy.ippay.com/ippay/',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '<ippay>\n   <TransactionType>AUTHONLY</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <CardNum>4000300020001000</CardNum>\n   <CardExpMonth>12</CardExpMonth>\n   <CardExpYear>14</CardExpYear>\n   <TotalAmount>8700</TotalAmount>\n</ippay>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://testgtwy.ippay.com/ippay/');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('<ippay>\n   <TransactionType>AUTHONLY</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <CardNum>4000300020001000</CardNum>\n   <CardExpMonth>12</CardExpMonth>\n   <CardExpYear>14</CardExpYear>\n   <TotalAmount>8700</TotalAmount>\n</ippay>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

AUTHONLY. Expected Response:

<ippayResponse>
   <TransactionID>L20120313151732863</TransactionID>
   <ActionCode>000</ActionCode>
   <Approval>TEST87</Approval>
   <ResponseText>APPROVED</ResponseText>
</ippayResponse>

An “AUTHONLY” transaction is the most basic type of transaction. In an “AUTHONLY” transaction, the Gateway Provider accepts the XML transaction block containing the credit card transaction information, retrieves an authorization response from the issuer of the credit card, and responds back to the original sender with that resulting authorization information.

Required data for an “AUTHONLY” transaction request is:
<TransactionType> = AUTHONLY
<TerminalID> = your terminal ID, assigned by the Gateway Provider
<TransactionID> = Optional: character string, exactly eighteen characters long, if used, a unique value is required
<CardNum> = valid credit card number
<CardExpMonth> = credit card expiration month (two digits)
<CardExpYear> = credit card expiration year (two digits)
<TotalAmount> = transaction amount (digits only)
Minimum data returned from a successful “AUTHONLY” transaction response is:

<TransactionID> = matching the value in the request, above or generated by IPpay if no value is sent.
<ActionCode> = 000
<Approval> = character string exactly six characters long
<ResponseText> = the transaction’s outcome status

CAPT

This first “CAPT” transaction demonstrates the primary way to complete a sale for the “AUTHONLY” transaction example from the previous section:

<ippay>
<TransactionType>CAPT</TransactionType>
<TerminalID>TESTTERMINAL</TerminalID>
<TransactionID>010327153017T10018</TransactionID>
</ippay>

For this first “CAPT” transaction, the following response illustrates how the returning XML would look.

<ippayResponse>
<TransactionID>010327153017T10018</TransactionID>
<ActionCode>000</ActionCode>
<Approval>502F6B</Approval>
<ResponseText>APPROVED</ResponseText>
</ippayResponse>

The second “CAPT” transaction demonstrates the alternative way to complete a sale for the “AUTHONLY” transaction example from the previous section:

<ippay>
<TransactionType>CAPT</TransactionType>
<TerminalID>TESTTERMINAL</TerminalID>
<TransactionID>555555555555T10018</TransactionID>
<CardNum>4000300020001000</CardNum>
<CardExpMonth>12</CardExpMonth>
<CardExpYear>14</CardExpYear>
<TotalAmount>8799</TotalAmount>
<Approval>502F6B</Approval>
</ippay>

Note the “unique” transaction ID for the previous request relative to previous transactions; the server’s primary search would fail to find a matching authorization transaction. The IPpay server attempts a secondary search and may generate a successful response. For the above “CAPT” transaction, the following response illustrates how the returning XML would look.

<ippayResponse>
<TransactionID>555555555555T10018</TransactionID>
<ActionCode>000</ActionCode>
<Approval>502F6B</Approval>
<ResponseText>APPROVED</ResponseText>
</ippayResponse>

Notice that the difference between the two example responses within this section is the transaction ID. For each case, the transaction ID will match the transaction ID of the submitted “CAPT” transaction (which might not necessarily be the same as the transaction ID as the original “AUTHONLY” transaction). A “CAPT” transaction will fail whenever a matching authorization cannot be found in IPpay’s database using the primary and secondary searches; the server will decline the “CAPT” transaction. When the Gateway Provider declines a “CAPT” transaction, the response would look like this:

<ippayResponse>
  <ActionCode>025</ActionCode>
  <ResponseText>RECORD NOT FOUND</ResponseText>
</ippayResponse>

CAPT Request:

<ippay>
   <TransactionType>CAPT</TransactionType>
   <TerminalID>TESTTERMINAL</TerminalID>
   <TransactionID>L20120313151732863</TransactionID>
</ippay>
var httpClient = new HttpClient();
var bodyXmlString = @"<ippay>" + "\n" +
@"   <TransactionType>CAPT</TransactionType>" + "\n" +
@"   <TerminalID>TESTTERMINAL</TerminalID>" + "\n" +
@"   <TransactionID>L20120313151732863</TransactionID>" + "\n" +
@"</ippay>";

var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://testgtwy.ippay.com/ippay/", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://testgtwy.ippay.com/ippay/',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '<ippay>\n   <TransactionType>CAPT</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <TransactionID>L20120313151732863</TransactionID>\n</ippay>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://testgtwy.ippay.com/ippay/');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('<ippay>\n   <TransactionType>CAPT</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <TransactionID>L20120313151732863</TransactionID>\n</ippay>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

CAPT. Expected Response:

<ippayResponse>
   <TransactionID>L20120313151732863</TransactionID>
   <ActionCode>000</ActionCode>
   <Approval>TEST87</Approval>
   <ResponseText>APPROVED</ResponseText>
</ippayResponse>

A “CAPT” (or “capture”) transaction enables a previously authorized transaction to be settled into a complete sale. In a “CAPT” transaction, IPpay™ accepts the XML transaction block containing the credit card transaction information, looks up the matching authorized transaction, and responds back to the original sender with the resulting sale information. The matching “AUTHONLY” transaction for this capture operation must have been authorized through the Gateway Provider in order for the “CAPT” transaction to be successful. If a transaction was not authorized through the Gateway Provider, the response to the “CAPT” will indicate that the authorization was not found.

Submitted data for a “CAPT” transaction request are:
<TransactionType> = CAPT (required)
<TerminalID> = your terminal ID, assigned by IPpay (required)
<TransactionID> = character string, exactly eighteen characters long, either matching the target “AUTHONLY” transaction or otherwise containing a unique value. (required)
<CardNum> = target credit card number
<CardExpMonth> = credit card expiration month (two digits)
<CardExpYear> = credit card expiration year (two digits)
<Approval> = six characters long, matching the code from “AUTHONLY” transaction
<TotalAmount> = transaction amount (digits only) Minimum data returned from a successful “AUTHONLY” transaction response are:
<TransactionID> = matching the value in the request, above or generated by IPpay if no value is sent
<ActionCode> = 000
<Approval> = character string exactly six characters long
<ResponseText> = the transaction’s outcome status “Capturing” an authorized transaction gets accomplished in two ways:

  1. Submitting the matching transaction ID for the authorization (primary way)
  2. Submitting the credit card information along with a matching total amount and authorization code (secondary way, if primary way gets no match).

SALE      

Authorizes and captures a credit card charge in a single transaction.

SALE Request:

<ippay>
   <TransactionType>SALE</TransactionType>
   <TerminalID>TESTTERMINAL</TerminalID>
   <CardNum>4000300020001000</CardNum>
   <CardExpMonth>12</CardExpMonth>
   <CardExpYear>14</CardExpYear>
   <TotalAmount>99999</TotalAmount>
</ippay>
var httpClient = new HttpClient();
var bodyXmlString = @"<ippay>" + "\n" +
@"   <TransactionType>SALE</TransactionType>" + "\n" +
@"   <TerminalID>TESTTERMINAL</TerminalID>" + "\n" +
@"   <CardNum>4000300020001000</CardNum>" + "\n" +
@"   <CardExpMonth>12</CardExpMonth>" + "\n" +
@"   <CardExpYear>14</CardExpYear>" + "\n" +
@"   <TotalAmount>99999</TotalAmount>" + "\n" +
@"</ippay>";

var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://testgtwy.ippay.com/ippay/", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://testgtwy.ippay.com/ippay/',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '<ippay>\n   <TransactionType>SALE</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <CardNum>4000300020001000</CardNum>\n   <CardExpMonth>12</CardExpMonth>\n   <CardExpYear>14</CardExpYear>\n   <TotalAmount>99999</TotalAmount>\n</ippay>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://testgtwy.ippay.com/ippay/');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('<ippay>\n   <TransactionType>SALE</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <CardNum>4000300020001000</CardNum>\n   <CardExpMonth>12</CardExpMonth>\n   <CardExpYear>14</CardExpYear>\n   <TotalAmount>99999</TotalAmount>\n</ippay>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

SALE. Expected Response:

<ippayResponse>
   <TransactionID>K20120313152717220</TransactionID>
   <ActionCode>000</ActionCode>
   <Approval>TEST40</Approval>
   <ResponseText>APPROVED</ResponseText>
</ippayResponse>

A “SALE” transaction is a “two-in-one” operation, completing both an “AUTHONLY” transaction and a “CAPT” transaction using only a single submission. The required data for a “SALE” transaction request are the same as for an “AUTHONLY” transaction request (except that the TransactionType is “SALE” instead of “AUTHONLY”). The minimum data returned from a successful “SALE” transaction response are the same as for an “AUTHONLY” transaction response.

The following is a sample “SALE” transaction for $999.99, using a Visa card:

<ippay>
<TransactionType>SALE</TransactionType>
<TerminalID>TESTTERMINAL</TerminalID>
<TransactionID>010327153017T10017</TransactionID>
<CardNum>4000300020001000</CardNum>
<CardExpMonth>12</CardExpMonth>
<CardExpYear>14</CardExpYear>
<TotalAmount>99999</TotalAmount>
</ippay>

The following shows how the successful response would look:

<ippayResponse>
<TransactionID>010327153017T10017</TransactionID>
<ActionCode>000</ActionCode>
<Approval>002F6B</Approval>
<ResponseText>APPROVED</ResponseText>
</ippayResponse>

VOID

“VOID” transaction removes that target sale:

<ippay>
<TransactionType>VOID</TransactionType>
<TerminalID>TESTTERMINAL</TerminalID>
<TransactionID>010327153017T10018</TransactionID>
<CardNum>4000300020001000</CardNum>
<CardExpMonth>12</CardExpMonth>
<CardExpYear>14</CardExpYear>
<TotalAmount>8799</TotalAmount>
<Approval>502F6B</Approval>
</ippay>

The following shows how the response to the “VOID” transaction would look:

<ippayResponse>
<TransactionID>010327153017T10018</TransactionID>
<ActionCode>000</ActionCode>
<Approval>502F6B</Approval>
<ResponseText>VOID PROCESSED</ResponseText>
</ippayResponse>

VOID Request:

<ippay>
   <TransactionType>VOID</TransactionType>
   <TerminalID>TESTTERMINAL</TerminalID>
   <CardNum>4000300020001000</CardNum>
   <CardExpMonth>12</CardExpMonth>
   <CardExpYear>14</CardExpYear>
   <TotalAmount>99999</TotalAmount>
   <Approval>TEST40</Approval>
</ippay>
var httpClient = new HttpClient();
var bodyXmlString = @"<ippay>" + "\n" +
@"   <TransactionType>VOID</TransactionType>" + "\n" +
@"   <TerminalID>TESTTERMINAL</TerminalID>" + "\n" +
@"   <CardNum>4000300020001000</CardNum>" + "\n" +
@"   <CardExpMonth>12</CardExpMonth>" + "\n" +
@"   <CardExpYear>14</CardExpYear>" + "\n" +
@"   <TotalAmount>99999</TotalAmount>" + "\n" +
@"   <Approval>TEST40</Approval>" + "\n" +
@"</ippay>";

var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://testgtwy.ippay.com/ippay/", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://testgtwy.ippay.com/ippay/',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '<ippay>\n   <TransactionType>VOID</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <CardNum>4000300020001000</CardNum>\n   <CardExpMonth>12</CardExpMonth>\n   <CardExpYear>14</CardExpYear>\n   <TotalAmount>99999</TotalAmount>\n   <Approval>TEST40</Approval>\n</ippay>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://testgtwy.ippay.com/ippay/');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('<ippay>\n   <TransactionType>VOID</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <CardNum>4000300020001000</CardNum>\n   <CardExpMonth>12</CardExpMonth>\n   <CardExpYear>14</CardExpYear>\n   <TotalAmount>99999</TotalAmount>\n   <Approval>TEST40</Approval>\n</ippay>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

VOID. Expected Response:

<ippayResponse>
   <TransactionID>M20120313153622210</TransactionID>
   <ActionCode>000</ActionCode>
   <Approval>TEST40</Approval>
   <ResponseText>VOID PROCESSED</ResponseText>
</ippayResponse>

A “VOID” transaction removes an approved transaction before settlement. NOTE: The server can only remove unsettled transactions specified by the VOID transaction, so settled transactions are ineligible for VOIDing. The server responds with either VOID PROCESSED or RECORD NOT FOUND, depending on the outcome of the transaction.

<TransactionType> = VOID

<TerminalID> = your terminal ID, assigned by the Gateway Provider

<TransactionID> = character string, exactly eighteen characters long, matching the target “CAPT” or “SALE” or “FORCE” transaction. (required)

<CardNum> = valid credit card number

<CardExpMonth> = credit card expiration month (two digits)

<CardExpYear> = credit card expiration year (two digits)

<Approval> = six characters long, matching the authorization code from the original transaction.

<TotalAmount> = transaction amount (digits only) Minimum data returned from a successful “VOID” transaction response is:

<TransactionID> = matching the value in the request, above or generated by the Gateway Provider if no value is sent

<ActionCode> = 000
<Approval> = character string exactly six characters long

<ResponseText> = the transaction’s outcome status
Presuming that the target sale transaction was successfully approved and has not yet settled, the following

A “VOID” transaction differs from a “CREDIT” transaction in that the “VOID” acts upon an existing transaction, deleting it from the settlement table before settlement occurs. After a transaction has been VOIDed, a cardholder may still see a pending authorization on their card for a few days. Once the issuer determines that the transaction will not settle, the funds will be released back to the cardholder and the pending authorization will fall away. A “CREDIT” transaction is a full transaction in and of itself and returns money back to a cardholder after a SALE” or “AUTHONLY”/“CAPT” has taken it away.

A “VOID” transaction will remove the matching “CAPT”, “SALE”, or “FORCE” transaction. A “VOID” will not remove an “AUTHONLY” unless a matching “CAPT” transaction has been successfully performed. If a “VOID” transaction is attempted after the pre-arranged settlement cut-off time, the Gateway Provider responds with a “RECORD NOT FOUND” text response. As mentioned above, a settled transaction cannot be VOIDed; a settled transaction can only be reversed using a “CREDIT” transaction.

CREDIT     

CREDIT Request:

<ippay>
   <TransactionType>CREDIT</TransactionType>
   <TerminalID>TESTTERMINAL</TerminalID>
   <CardNum>4000300020001000</CardNum>
   <CardExpMonth>12</CardExpMonth>
   <CardExpYear>14</CardExpYear>
   <TotalAmount>99999</TotalAmount>
</ippay>
var httpClient = new HttpClient();
var bodyXmlString = @"<ippay>" + "\n" +
@"   <TransactionType>CREDIT</TransactionType>" + "\n" +
@"   <TerminalID>TESTTERMINAL</TerminalID>" + "\n" +
@"   <CardNum>4000300020001000</CardNum>" + "\n" +
@"   <CardExpMonth>12</CardExpMonth>" + "\n" +
@"   <CardExpYear>14</CardExpYear>" + "\n" +
@"   <TotalAmount>99999</TotalAmount>" + "\n" +
@"</ippay>";

var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://testgtwy.ippay.com/ippay/", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://testgtwy.ippay.com/ippay/',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '<ippay>\n   <TransactionType>CREDIT</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <CardNum>4000300020001000</CardNum>\n   <CardExpMonth>12</CardExpMonth>\n   <CardExpYear>14</CardExpYear>\n   <TotalAmount>99999</TotalAmount>\n</ippay>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://testgtwy.ippay.com/ippay/');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('<ippay>\n   <TransactionType>CREDIT</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <CardNum>4000300020001000</CardNum>\n   <CardExpMonth>12</CardExpMonth>\n   <CardExpYear>14</CardExpYear>\n   <TotalAmount>99999</TotalAmount>\n</ippay>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

CREDIT. Expected Response:

<ippayResponse>
   <TransactionID>M20120313153742977</TransactionID>
   <ActionCode>000</ActionCode>
   <Approval>103959</Approval>
   <ResponseText>RETURN ACCEPTED</ResponseText>
</ippayResponse>

The “CREDIT” transaction complements the “SALE” transaction. The “CREDIT” transaction is used to reverse a “SALE”, crediting the cardholder’s account.

The required data for a “CREDIT” transaction request is the same as for a “SALE” transaction request (except that the TransactionType is “CREDIT” instead of “SALE”).

The minimum data returned from a successful “CREDIT” transaction response is almost the same as for a “SALE” transaction response, except that AVS and CVV2 (and CVC2 and CID) are unavailable.

This particular example also demonstrates submission of a “CREDIT” transaction.

ENQ

ENQ Request:

<ippay>
   <TransactionType>ENQ</TransactionType>
   <TerminalID>TESTTERMINAL</TerminalID>
   <TransactionID>M20120313153742977</TransactionID>
</ippay>
var httpClient = new HttpClient();
var bodyXmlString = @"<ippay>" + "\n" +
@"   <TransactionType>ENQ</TransactionType>" + "\n" +
@"   <TerminalID>TESTTERMINAL</TerminalID>" + "\n" +
@"   <TransactionID>M20120313153742977</TransactionID>" + "\n" +
@"</ippay>";

var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://testgtwy.ippay.com/ippay/", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://testgtwy.ippay.com/ippay/',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '<ippay>\n   <TransactionType>ENQ</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <TransactionID>M20120313153742977</TransactionID>\n</ippay>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://testgtwy.ippay.com/ippay/');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('<ippay>\n   <TransactionType>ENQ</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <TransactionID>M20120313153742977</TransactionID>\n</ippay>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

ENQ. Expected Response:

<ippayResponse>
   <TransactionID>M20120313153742977</TransactionID>
   <ActionCode>000</ActionCode>
   <Approval>103959</Approval>
   <ResponseText>ACCEPTED</ResponseText>
</ippayResponse>

An “ENQ” (or “enquire”) transaction enables verification and review of a previous transaction, including a previous “AUTHONLY”, “SALE”, “CAPT”, “CHECK” or “REVERSAL” transaction. In an “ENQ” transaction, the Gateway Provider accepts the XML transaction block containing the credit card transaction information, looks up the matching authorized transaction, and responds back to the original sender with the resulting search information.
The matching transaction for the enquire operation must have been authorized or settled through the Gateway Provider for the “ENQ” transaction to be successful. If a target transaction was not processed through the Gateway Provider, the response to the “ENQ” will indicate that the transaction was not found.

Submitted data for a “ENQ” transaction request is:

<TransactionType> = ENQ (required)
<TerminalID> = your terminal ID, assigned by IPpay (required)
<TransactionID> = character string, exactly eighteen characters long, matching the target transaction. (required)
Minimum data returned from a successful “ENQ” transaction response is:
<TransactionID> = matching the value in the request, above or generated by IPpay if no value is sent

<ActionCode> = 000
<Approval> = character string exactly six characters long
<ResponseText> = the transaction’s outcome status

You may “ENQ” (enquire) on an transaction, checking the status of that transaction:

For "enhanced" ENQ functionality, searches for transactions will be required to provide the TerminalID (per standard), and one of the following:

Enhanced ENQ for UDField1

Enhanced ENQ for UDField2

Enhanced ENQ for UDField1 & UDField2

An ENQ can be run on the Transaction ID but can also be run on the UDfield1 or UDfield2 values. Feature must be turned on with us to use anything other than Trans ID, available in test and prod.

Token can be returned in ENQ if we turn feature on – please contact us, available in test and prod.

The response would look similar to the original response for the originating transaction.

Credit Card TOKENIZE

Credit Card TOKENIZE Request:

<ippay>
   <TransactionType>TOKENIZE</TransactionType>
   <TerminalID>TESTTERMINAL</TerminalID>
   <CardNum>4000300020001000</CardNum>
   <CardExpMonth>12</CardExpMonth>
   <CardExpYear>14</CardExpYear>
</ippay>
var httpClient = new HttpClient();
var bodyXmlString = @"<ippay>" + "\n" +
@"   <TransactionType>TOKENIZE</TransactionType>" + "\n" +
@"   <TerminalID>TESTTERMINAL</TerminalID>" + "\n" +
@"   <CardNum>4000300020001000</CardNum>" + "\n" +
@"   <CardExpMonth>12</CardExpMonth>" + "\n" +
@"   <CardExpYear>14</CardExpYear>" + "\n" +
@"</ippay>";
var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://testgtwy.ippay.com/ippay/", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://testgtwy.ippay.com/ippay/',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '<ippay>\n   <TransactionType>TOKENIZE</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <CardNum>4000300020001000</CardNum>\n   <CardExpMonth>12</CardExpMonth>\n   <CardExpYear>14</CardExpYear>\n</ippay>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://testgtwy.ippay.com/ippay/');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('<ippay>\n   <TransactionType>TOKENIZE</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <CardNum>4000300020001000</CardNum>\n   <CardExpMonth>12</CardExpMonth>\n   <CardExpYear>14</CardExpYear>\n</ippay>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

Credit Card TOKENIZE. Expected Response:

<IPPayResponse>
   <TransactionID>A20120313154217163</TransactionID>
   <ActionCode>000</ActionCode>
   <Approval>TOKEN16</Approval>
   <ResponseText>TOKENIZED</ResponseText>
   <Token>4E6E3A2C1A8E1000</Token>
</IPPayResponse>

The “TOKENIZE” transaction creates a token for an unencrypted PAN and expiration date. In a “TOKENIZE” transaction, the Gateway Provider accepts the XML transaction block containing the credit card transaction information, creates an entry in its existing merchant record database, and responds back to the original sender with a token that can be used in lieu of the PAN & expiration date for processing future transactions. Submitted data for a “TOKENIZE” transaction request is:

<TransactionType> = TOKENIZE (required)

<TerminalID> = your terminal ID, assigned by IPpay (required)

<TransactionID> = character string, exactly eighteen characters long, matching the target transaction. (recommended)

<CardNum> = target credit card number

<CardExpMonth> = credit card expiration month (two digits)

<CardExpYear> = credit card expiration year (two digits)

Minimum data returned from a successful “TOKENIZE” transaction response is:

<TransactionID> = matching the value in the request, above or randomly generated by IPpay

<ActionCode> = 000

<Token> = Returned token. IPpay tokens are format preserving in the following respects:

<Approval> = character string

<ResponseText> = the transaction’s outcome status.

SALE + TOKENIZE

SALE + TOKENIZE Request:

<ippay>
   <TransactionType>SALE</TransactionType>
   <TerminalID>TESTTERMINAL</TerminalID>
   <CardNum Tokenize='true'>4000300020001000</CardNum>
   <CardExpMonth>12</CardExpMonth>
   <CardExpYear>14</CardExpYear>
   <TotalAmount>99999</TotalAmount>
</ippay>
var httpClient = new HttpClient();
var bodyXmlString = @"<ippay>" + "\n" +
@"   <TransactionType>SALE</TransactionType>" + "\n" +
@"   <TerminalID>TESTTERMINAL</TerminalID>" + "\n" +
@"   <CardNum Tokenize='true'>4000300020001000</CardNum>" + "\n" +
@"   <CardExpMonth>12</CardExpMonth>" + "\n" +
@"   <CardExpYear>14</CardExpYear>" + "\n" +
@"   <TotalAmount>99999</TotalAmount>" + "\n" +
@"</ippay>";
var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://testgtwy.ippay.com/ippay/", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://testgtwy.ippay.com/ippay/',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '<ippay>\n   <TransactionType>SALE</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <CardNum Tokenize=\'true\'>4000300020001000</CardNum>\n   <CardExpMonth>12</CardExpMonth>\n   <CardExpYear>14</CardExpYear>\n   <TotalAmount>99999</TotalAmount>\n</ippay>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://testgtwy.ippay.com/ippay/');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('<ippay>\n   <TransactionType>SALE</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <CardNum Tokenize=\'true\'>4000300020001000</CardNum>\n   <CardExpMonth>12</CardExpMonth>\n   <CardExpYear>14</CardExpYear>\n   <TotalAmount>99999</TotalAmount>\n</ippay>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

SALE + TOKENIZE. Expected Response:

<ippayResponse>
   <TransactionID>K20120313160646267</TransactionID>
   <ActionCode>000</ActionCode>
   <Token>4D7D1G8E0F2E1000</Token>
   <Approval>TEST41</Approval>
   <ResponseText>APPROVED</ResponseText>
</ippayResponse>

SALE with TOKEN      

SALE Request with TOKEN:

<ippay>
   <TransactionType>SALE</TransactionType>
   <TerminalID>TESTTERMINAL</TerminalID>
   <Token>4G0F7B5K2J6M1111</Token>
   <TotalAmount>100</TotalAmount>
</ippay>
var httpClient = new HttpClient();
var bodyXmlString = @"<ippay>" + "\n" +
@"   <TransactionType>SALE</TransactionType>" + "\n" +
@"   <TerminalID>TESTTERMINAL</TerminalID>" + "\n" +
@"   <Token>4G0F7B5K2J6M1111</Token>" + "\n" +
@"   <TotalAmount>100</TotalAmount>" + "\n" +
@"</ippay>";
var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://testgtwy.ippay.com/ippay/", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://testgtwy.ippay.com/ippay/',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '<ippay>\n   <TransactionType>SALE</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <Token>4G0F7B5K2J6M1111</Token>\n   <TotalAmount>100</TotalAmount>\n</ippay>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://testgtwy.ippay.com/ippay/');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('<ippay>\n   <TransactionType>SALE</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <Token>4G0F7B5K2J6M1111</Token>\n   <TotalAmount>100</TotalAmount>\n</ippay>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

SALE Request with TOKEN. Expected Response:

<ippayResponse>
   <TransactionID>H20120313162706280</TransactionID>
   <ActionCode>000</ActionCode>
   <Approval>TEST17</Approval>
   <ResponseText>APPROVED</ResponseText>
</ippayResponse>

The token can be updated with a new expiration date without changing the token value, the change in the card number itself would then generate a brand new token. The only values that are stored with the token are the credit card number and expiration date. Note that CVV values cannot be stored on the side nor on the merchant side.

Update TOKEN Request (Card Exp Date/Year)

Update TOKEN Request (Card Exp Date/Year):

<ippay>
   <TransactionType>TOKENIZE</TransactionType>
   <Token>4E6E3A2C1A8E1000</Token>
   <CardExpMonth>12</CardExpMonth>
   <CardExpYear>20</CardExpYear>
   <TerminalID>TESTTERMINAL</TerminalID>
</ippay>
var httpClient = new HttpClient();
var bodyXmlString = @"<ippay>" + "\n" +
@"   <TransactionType>TOKENIZE</TransactionType>" + "\n" +
@"   <Token>4E6E3A2C1A8E1000</Token>" + "\n" +
@"   <CardExpMonth>12</CardExpMonth>" + "\n" +
@"   <CardExpYear>20</CardExpYear>" + "\n" +
@"   <TerminalID>TESTTERMINAL</TerminalID>" + "\n" +
@"</ippay>";
var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://testgtwy.ippay.com/ippay/", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://testgtwy.ippay.com/ippay/',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '<ippay>\n   <TransactionType>TOKENIZE</TransactionType>\n   <Token>4E6E3A2C1A8E1000</Token>\n   <CardExpMonth>12</CardExpMonth>\n   <CardExpYear>20</CardExpYear>\n   <TerminalID>TESTTERMINAL</TerminalID>\n</ippay>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://testgtwy.ippay.com/ippay/');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('<ippay>\n   <TransactionType>TOKENIZE</TransactionType>\n   <Token>4E6E3A2C1A8E1000</Token>\n   <CardExpMonth>12</CardExpMonth>\n   <CardExpYear>20</CardExpYear>\n   <TerminalID>TESTTERMINAL</TerminalID>\n</ippay>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

The token can be updated with a new expiration date without changing the token value but a change in the card number itself would then generate a brand new token. The only values that are stored with the token are the credit card number and expiration date and nothing else.

Update TOKEN Request (Card Exp Date/Year). Expected Response:

<IPPayResponse>
   <TransactionID>H20120313160009727</TransactionID>
   <ActionCode>000</ActionCode>
   <Approval>TOKEN304</Approval>
   <ResponseText>TOKENIZED</ResponseText>
   <Token>4E6E3A2C1A8E1000</Token>
</IPPayResponse>

ECHECK    

ECHECK: Refer to XML Feature Description for ECHECK Processing.

ECHECK Request:

<ippay>
<TransactionType>CHECK</TransactionType>
<TerminalID>TESTTERMINAL</TerminalID>
<CardName>Mickey Mouse</CardName>
<TotalAmount>1399</TotalAmount>
<FeeAmount>100</FeeAmount>
<ACH Type = 'SAVINGS' SEC = 'PPD'>
   <AccountNumber>071025661</AccountNumber>
   <ABA>071025661</ABA>
   <CheckNumber>135</CheckNumber>
</ACH>
</ippay>
var httpClient = new HttpClient();
var bodyXmlString = @"<ippay>" + "\n" +
@"<TransactionType>CHECK</TransactionType>" + "\n" +
@"<TerminalID>TESTTERMINAL</TerminalID>" + "\n" +
@"<CardName>Mickey Mouse</CardName>" + "\n" +
@"<TotalAmount>1399</TotalAmount>" + "\n" +
@"<FeeAmount>100</FeeAmount>" + "\n" +
@"<ACH Type = 'SAVINGS' SEC = 'PPD'>" + "\n" +
@"   <AccountNumber>071025661</AccountNumber>" + "\n" +
@"   <ABA>071025661</ABA>" + "\n" +
@"   <CheckNumber>135</CheckNumber>" + "\n" +
@"</ACH>" + "\n" +
@"</ippay>";
var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://testgtwy.ippay.com/ippay/", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://testgtwy.ippay.com/ippay/',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '<ippay>\n<TransactionType>CHECK</TransactionType>\n<TerminalID>TESTTERMINAL</TerminalID>\n<CardName>Mickey Mouse</CardName>\n<TotalAmount>1399</TotalAmount>\n<FeeAmount>100</FeeAmount>\n<ACH Type = \'SAVINGS\' SEC = \'PPD\'>\n   <AccountNumber>071025661</AccountNumber>\n   <ABA>071025661</ABA>\n   <CheckNumber>135</CheckNumber>\n</ACH>\n</ippay>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://testgtwy.ippay.com/ippay/');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('<ippay>\n<TransactionType>CHECK</TransactionType>\n<TerminalID>TESTTERMINAL</TerminalID>\n<CardName>Mickey Mouse</CardName>\n<TotalAmount>1399</TotalAmount>\n<FeeAmount>100</FeeAmount>\n<ACH Type = \'SAVINGS\' SEC = \'PPD\'>\n   <AccountNumber>071025661</AccountNumber>\n   <ABA>071025661</ABA>\n   <CheckNumber>135</CheckNumber>\n</ACH>\n</ippay>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

Update TOKEN Request (Card Exp Date/Year). Expected Response:

<ippayResponse>
   <TransactionID>E20120322032420403</TransactionID>
   <ActionCode>000</ActionCode>
   <Approval>000000</Approval>
   <ResponseText>CHECK ACCEPTED</ResponseText>
</ippayResponse>

REVERSAL    

ECHECK: Refer to XML Feature Description for ECHECK Processing.

REVERSAL Request:

<ippay>
   <TransactionType>REVERSAL</TransactionType>
   <TerminalID>TESTTERMINAL</TerminalID>
   <CardName>Donald Duck</CardName>
   <TotalAmount>1500</TotalAmount>
   <FeeAmount>100</FeeAmount>
   <ACH Type = 'CHECKING' SEC = 'CCD'>
      <AccountNumber>222222999</AccountNumber>
      <ABA>071025661</ABA>
      <CheckNumber>1005</CheckNumber>
   </ACH>
</ippay>
var httpClient = new HttpClient();
var bodyXmlString = @"<ippay>" + "\n" +
@"   <TransactionType>REVERSAL</TransactionType>" + "\n" +
@"   <TerminalID>TESTTERMINAL</TerminalID>" + "\n" +
@"   <CardName>Donald Duck</CardName>" + "\n" +
@"   <TotalAmount>1500</TotalAmount>" + "\n" +
@"   <FeeAmount>100</FeeAmount>" + "\n" +
@"   <ACH Type = 'CHECKING' SEC = 'CCD'>" + "\n" +
@"      <AccountNumber>222222999</AccountNumber>" + "\n" +
@"      <ABA>071025661</ABA>" + "\n" +
@"      <CheckNumber>1005</CheckNumber>" + "\n" +
@"   </ACH>" + "\n" +
@"</ippay>";
var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://testgtwy.ippay.com/ippay/", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://testgtwy.ippay.com/ippay/',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '<ippay>\n   <TransactionType>REVERSAL</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <CardName>Donald Duck</CardName>\n   <TotalAmount>1500</TotalAmount>\n   <FeeAmount>100</FeeAmount>\n   <ACH Type = \'CHECKING\' SEC = \'CCD\'>\n      <AccountNumber>222222999</AccountNumber>\n      <ABA>071025661</ABA>\n      <CheckNumber>1005</CheckNumber>\n   </ACH>\n</ippay>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://testgtwy.ippay.com/ippay/');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('<ippay>\n   <TransactionType>REVERSAL</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <CardName>Donald Duck</CardName>\n   <TotalAmount>1500</TotalAmount>\n   <FeeAmount>100</FeeAmount>\n   <ACH Type = \'CHECKING\' SEC = \'CCD\'>\n      <AccountNumber>222222999</AccountNumber>\n      <ABA>071025661</ABA>\n      <CheckNumber>1005</CheckNumber>\n   </ACH>\n</ippay>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

REVERSAL Expected Response:

<ippayResponse>
   <TransactionID>L20120322034146180</TransactionID>
   <ActionCode>000</ActionCode>
   <Approval>000000</Approval>
   <ResponseText>CHECK ACCEPTED</ResponseText>
</ippayResponse>

ECHECK TOKENIZE

ECHECK TOKENIZE Request:

<ippay>
   <TransactionType>TOKENIZE</TransactionType>
   <TerminalID>TESTTERMINAL</TerminalID>
   <ABA>123456789</ABA>
   <AccountNumber>071025661</AccountNumber>
</ippay>
var httpClient = new HttpClient();
var bodyXmlString = @"<ippay>" + "\n" +
@"   <TransactionType>TOKENIZE</TransactionType>" + "\n" +
@"   <TerminalID>TESTTERMINAL</TerminalID>" + "\n" +
@"   <ABA>123456789</ABA>" + "\n" +
@"   <AccountNumber>071025661</AccountNumber>" + "\n" +
@"</ippay>";
var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://testgtwy.ippay.com/ippay/", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://testgtwy.ippay.com/ippay/',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '<ippay>\n   <TransactionType>TOKENIZE</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <ABA>123456789</ABA>\n   <AccountNumber>071025661</AccountNumber>\n</ippay>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://testgtwy.ippay.com/ippay/');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('<ippay>\n   <TransactionType>TOKENIZE</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <ABA>123456789</ABA>\n   <AccountNumber>071025661</AccountNumber>\n</ippay>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

ECHECK TOKENIZE. Expected Response:

<IPPayResponse>
   <TransactionID>M20120313162903177</TransactionID>
   <ActionCode>000</ActionCode>
   <Approval>TOKEN19</Approval>
   <ResponseText>TOKENIZED</ResponseText>
   <Token>G5K7F6M3A4F7K4495</Token>
</IPPayResponse>

ECHECK + TOKENIZE

ECHECK + TOKENIZE Request:

<ippay>
   <TransactionType>CHECK</TransactionType>
   <TerminalID>TESTTERMINAL</TerminalID>
   <CardName>Mickey Mouse</CardName>
   <TotalAmount>1399</TotalAmount>
   <FeeAmount>100</FeeAmount>
   <ACH Tokenize='true' Type='CHECKING' SEC='PPD'>
      <AccountNumber>11111999</AccountNumber>
      <ABA>071025661</ABA>
      <CheckNumber>135</CheckNumber>
   </ACH>
</ippay>
var httpClient = new HttpClient();
var bodyXmlString = @"<ippay>" + "\n" +
@"   <TransactionType>CHECK</TransactionType>" + "\n" +
@"   <TerminalID>TESTTERMINAL</TerminalID>" + "\n" +
@"   <CardName>Mickey Mouse</CardName>" + "\n" +
@"   <TotalAmount>1399</TotalAmount>" + "\n" +
@"   <FeeAmount>100</FeeAmount>" + "\n" +
@"   <ACH Tokenize='true' Type='CHECKING' SEC='PPD'>" + "\n" +
@"      <AccountNumber>11111999</AccountNumber>" + "\n" +
@"      <ABA>071025661</ABA>" + "\n" +
@"      <CheckNumber>135</CheckNumber>" + "\n" +
@"   </ACH>" + "\n" +
@"</ippay>";
var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://testgtwy.ippay.com/ippay/", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://testgtwy.ippay.com/ippay/',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '<ippay>\n   <TransactionType>CHECK</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <CardName>Mickey Mouse</CardName>\n   <TotalAmount>1399</TotalAmount>\n   <FeeAmount>100</FeeAmount>\n   <ACH Tokenize=\'true\' Type=\'CHECKING\' SEC=\'PPD\'>\n      <AccountNumber>11111999</AccountNumber>\n      <ABA>071025661</ABA>\n      <CheckNumber>135</CheckNumber>\n   </ACH>\n</ippay>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://testgtwy.ippay.com/ippay/');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('<ippay>\n   <TransactionType>CHECK</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <CardName>Mickey Mouse</CardName>\n   <TotalAmount>1399</TotalAmount>\n   <FeeAmount>100</FeeAmount>\n   <ACH Tokenize=\'true\' Type=\'CHECKING\' SEC=\'PPD\'>\n      <AccountNumber>11111999</AccountNumber>\n      <ABA>071025661</ABA>\n      <CheckNumber>135</CheckNumber>\n   </ACH>\n</ippay>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

ECHECK + TOKENIZE. Expected Response:

<ippayResponse>
   <TransactionID>E20120313163949967</TransactionID>
   <ActionCode>000</ActionCode>
   <Token>J4H6F5B4F4K8M1999</Token>
   <Approval>000000</Approval>
   <ResponseText>CHECK ACCEPTED</ResponseText>
</ippayResponse>

ECHECK Transaction with Token    

ECHECK Transaction with Token Request:

<ippay>
   <TransactionType>CHECK</TransactionType>
   <TerminalID>TESTTERMINAL</TerminalID>
   <CardName>Mickey Mouse</CardName>
   <TotalAmount>1399</TotalAmount>
   <FeeAmount>100</FeeAmount>
   <ACH Type='SAVINGS' SEC='PPD'>
      <Token>J4H6F5B4F4K8M1999</Token>
      <CheckNumber>135</CheckNumber>
   </ACH>
</ippay>
var httpClient = new HttpClient();
var bodyXmlString = @"<ippay>" + "\n" +
@"   <TransactionType>CHECK</TransactionType>" + "\n" +
@"   <TerminalID>TESTTERMINAL</TerminalID>" + "\n" +
@"   <CardName>Mickey Mouse</CardName>" + "\n" +
@"   <TotalAmount>1399</TotalAmount>" + "\n" +
@"   <FeeAmount>100</FeeAmount>" + "\n" +
@"   <ACH Type='SAVINGS' SEC='PPD'>" + "\n" +
@"      <Token>J4H6F5B4F4K8M1999</Token>" + "\n" +
@"      <CheckNumber>135</CheckNumber>" + "\n" +
@"   </ACH>" + "\n" +
@"</ippay>";
var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://testgtwy.ippay.com/ippay/", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://testgtwy.ippay.com/ippay/',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '<ippay>\n   <TransactionType>CHECK</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <CardName>Mickey Mouse</CardName>\n   <TotalAmount>1399</TotalAmount>\n   <FeeAmount>100</FeeAmount>\n   <ACH Type=\'SAVINGS\' SEC=\'PPD\'>\n      <Token>J4H6F5B4F4K8M1999</Token>\n      <CheckNumber>135</CheckNumber>\n   </ACH>\n</ippay>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://testgtwy.ippay.com/ippay/');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('<ippay>\n   <TransactionType>CHECK</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <CardName>Mickey Mouse</CardName>\n   <TotalAmount>1399</TotalAmount>\n   <FeeAmount>100</FeeAmount>\n   <ACH Type=\'SAVINGS\' SEC=\'PPD\'>\n      <Token>J4H6F5B4F4K8M1999</Token>\n      <CheckNumber>135</CheckNumber>\n   </ACH>\n</ippay>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

ECHECK Transaction with Token. Expected Response:

<ippayResponse>
   <TransactionID>B20120313164702493</TransactionID>
   <ActionCode>000</ActionCode>
   <Approval>000000</Approval>
   <ResponseText>CHECK ACCEPTED</ResponseText>
</ippayResponse>

Test Simulator

Using Test System and Backend Simulators
Document revision 1-4.2 June 2022

Introduction:
The Test System allows developers to simulate the submission and subsequent approval (or denial) of financial transactions. Merchants can system-test their financial transaction programs, building and submitting their transactions in a safe environment. The Test System operates in a non-production environment; any transaction submitted to the Test System does not actually enter the world of live financial transactions. Using the Test System, merchants can debug their custom programs without worrying about bogus test transactions being processed as live transactions.


The Test System uses virtually the same software as the production environment. Use the Test System with the knowledge that it will operate in the same manner as the production system. The minor differences between the Test System and the production system are, 1) the backend simulators, 2) enhancements being introduced for test purposes prior to deployment in production, and, 3) the test database, a separate database from the production database.

The Test System is disconnected from the financial institutions. Instead of communicating with financial institutions, the Test System accesses a suite of back-end simulators that proxy bogus responses back to the Gateway Provider, thereby simulating the connections with Visa, MasterCard, American Express, and numerous other financial organizations. Few organizations provide any system for simulating real-time responses for financial transactions, but the Test System does.

Due to ongoing development, the newest features will always appear on the Test System before their deployment into production. Some merchants might require the deployment of brand new features. The Test System serves as the test bed for the newest features. By deploying new features on the Test System, this also allows the Gateway Provider to rigorously test the backward compatibility of those enhancements prior to deployment.

The Test System has features that allow merchants to test both approved transactions and declined transactions. Methods for configuring such tests are explained in this document.

This document lists the various features of the Test System. This document assumes that the reader is capable of posting an XML transaction to the Gateway Provider. For information about the overall specifications of an transaction, refer to the XML Product Specification document. This document concentrates on relating the testing methodology available to developers through the Test System.

Connecting to the Test System

For XML development, testing XML-generating software, or for testing applications linked with the DLL, the Internet connection to the Test System is at the following URL:

https://testgtwy.ippay.com/ippay/

The Test System’s URL should be used for all testing. The production gateway should never be used for test purposes, unless a test of live transaction data is deliberately planned with intent to settle that transaction data.

The 'TESTTERMINAL' Terminal ID

A user can connect to the Test System using the generic Terminal ID: TESTTERMINAL. Production Terminal IDs do not exist in the test system. Unique terminal IDs for the test system can be provided on demand.

Simulating 'APPROVED' Transactions

An example of an request that the Test System approves is this test transaction for $99.00:

<ippay>
   <TransactionType>SALE</TransactionType>
   <TerminalID>TESTTERMINAL</TerminalID>
   <TransactionID>910327153017T10017</TransactionID>
   <CardNum>4000300020001000</CardNum>
   <CardExpMonth>12</CardExpMonth>
   <CardExpYear>12</CardExpYear>
   <TotalAmount>9900</TotalAmount>
</ippay>
var httpClient = new HttpClient();
var bodyXmlString =  @"<ippay>" + "\n" +
@"   <TransactionType>SALE</TransactionType>" + "\n" +
@"   <TerminalID>TESTTERMINAL</TerminalID>" + "\n" +
@"   <TransactionID>910327153017T10017</TransactionID>" + "\n" +
@"   <CardNum>4000300020001000</CardNum>" + "\n" +
@"   <CardExpMonth>12</CardExpMonth>" + "\n" +
@"   <CardExpYear>12</CardExpYear>" + "\n" +
@"   <TotalAmount>9900</TotalAmount>" + "\n" +
@"</ippay>";
var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://testgtwy.ippay.com/ippay/", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://testgtwy.ippay.com/ippay/',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '<ippay>\n   <TransactionType>SALE</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <TransactionID>910327153017T10017</TransactionID>\n   <CardNum>4000300020001000</CardNum>\n   <CardExpMonth>12</CardExpMonth>\n   <CardExpYear>12</CardExpYear>\n   <TotalAmount>9900</TotalAmount>\n</ippay>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://testgtwy.ippay.com/ippay/');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('<ippay>\n   <TransactionType>SALE</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <TransactionID>910327153017T10017</TransactionID>\n   <CardNum>4000300020001000</CardNum>\n   <CardExpMonth>12</CardExpMonth>\n   <CardExpYear>12</CardExpYear>\n   <TotalAmount>9900</TotalAmount>\n</ippay>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

The following shows how the successful 'APPROVED' response would look.

<ippayResponse>
   <TransactionID>910327153017T10017</TransactionID>
   <ActionCode>000</ActionCode>
   <Approval>002F6B</Approval>
   <ResponseText>APPROVED</ResponseText>
</ippayResponse>

Approval and declines are predetermined on the test system based on the penny amount. A user can guarantee a particular response from test based using a prescribed penny value, so all return values can be tested. An approval can be simulated by submitting a penny amount of 00; here the dollar amount is unimportant and only the penny value will determine the approval status of the test transaction.

Simulating 'DECLINED' Transactions

Observe the following example of an transaction for $52.05 that causes the Test System to react with a 'hard decline' result:

<ippay>
   <TransactionType>SALE</TransactionType>
   <TerminalID>TESTTERMINAL</TerminalID>
   <TransactionID>910327153017T10018</TransactionID>
   <CardNum>4000300020001000</CardNum>
   <CardExpMonth>12</CardExpMonth>
   <CardExpYear>12</CardExpYear>
   <TotalAmount>5205</TotalAmount>
</ippay>
var httpClient = new HttpClient();
var bodyXmlString = @"<ippay>" + "\n" +
@"   <TransactionType>SALE</TransactionType>" + "\n" +
@"   <TerminalID>TESTTERMINAL</TerminalID>" + "\n" +
@"   <TransactionID>910327153017T10018</TransactionID>" + "\n" +
@"   <CardNum>4000300020001000</CardNum>" + "\n" +
@"   <CardExpMonth>12</CardExpMonth>" + "\n" +
@"   <CardExpYear>12</CardExpYear>" + "\n" +
@"   <TotalAmount>5205</TotalAmount>" + "\n" +
@"</ippay>";
var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://testgtwy.ippay.com/ippay/", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://testgtwy.ippay.com/ippay/',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '<ippay>\n   <TransactionType>SALE</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <TransactionID>910327153017T10018</TransactionID>\n   <CardNum>4000300020001000</CardNum>\n   <CardExpMonth>12</CardExpMonth>\n   <CardExpYear>12</CardExpYear>\n   <TotalAmount>5205</TotalAmount>\n</ippay>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://testgtwy.ippay.com/ippay/');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('<ippay>\n   <TransactionType>SALE</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <TransactionID>910327153017T10018</TransactionID>\n   <CardNum>4000300020001000</CardNum>\n   <CardExpMonth>12</CardExpMonth>\n   <CardExpYear>12</CardExpYear>\n   <TotalAmount>5205</TotalAmount>\n</ippay>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

The following shows the response to that transaction.

<ippayResponse>
   <TransactionID>910327153017T10018</TransactionID>
   <ActionCode>005</ActionCode>
   <ResponseText>DECLINED</ResponseText>
</ippayResponse>

A user can simulate a decline transaction response but submitting a non-zero penny amount with the transaction. The back-end simulators examine the penny amount in the TotalAmount field and generate a predictable decline value. For example, a TotalAmount of 1005 ($10.05) or 05 ($0.05) would both return a decline code of 05-Do Not Honor, as the penny amount value in both examples is $0.05.

A chart is provided below, outlining all possible penny amount+decline response combinations available on the Test System.

Standard Response Code Triggers

Txn Trigger Amount Response Code Response Text Notes
0 85 Card OK
1 01 Call Issuer
2 02 Call Issuer, Special Cond.
3 28 File Temp. Unavailable
4 91 Issuer Unavailable or Inoperative, No STIP
5 04 Pick Up Card
6 07 Pick Up Card, Special Cond.
7 41 Pick Up Card, Lost
8 43 Pick Up Card, Stolen
9 06 General Error
10 79 Already Reversed
11 13 Invalid amount
12 83 Can't Verify PIN
13 86 Can't Verify PIN
14 14 Invalid Account Number
15 82 Incorrect CVV CVV data is not correct Or Offline PIN authentication interrupted
16 N3 Cashback Not Available
17 06 General Error
18 EC CID Format Error
19 80 No Financial Impact
20 05 Decline
21 51 Decline
22 N4 Decline
23 61 EXC APPR AMT LIM Decline Exceeds approval amount limit
24 62 Decline
25 65 EXC W/D FREQ LIMDecline Exceeds withdrawal frequency limit
26 93 Decline
27 81 Encryption Error
28 06 General Error
29 54 Expired Card Be sure to default IIID/RIID values to "9999" to provoke Direct Check Service Error Response. A production IIID/RIID will provoke a response of Error 06 "Check Response Text".
30 92 Invalid Routing
31 12 Invalid Trans
32 78 No Account Blocked, first used-transaction from new cardholder, and card not properly unblocked
33 21 No Action Taken
34 76 Unsolic Reversal
35 77 No Action Taken
36 52 No Check Account
37 39 No Credit Acct
38 53 No Save Acct
39 15 No Such Issuer
40 75 PIN Exceeded
41 19 Re-enter
42 63 SEC Violation
43 57 Serv Not Allowed Txn not permitted
44 58 Serv Not Allowed
45 96 System Error
46 03 Term ID Error
47 55 Wrong PIN

Other Responses

The following responses can be expected from the gateway when a transaction is held in or declined by Risk:

Limit suspend:

<ippayResponse>
  <TransactionID>UHJ210621174956794</TransactionID>
  <ActionCode>600</ActionCode>
  <ResponseText>Limits exceeded, Please contact Support</ResponseText>
</ippayResponse>

AVS filter failure:

<ippayResponse>
<TransactionID>UHJ210621174956794</TransactionID>
<ActionCode>601</ActionCode>
<ResponseText>DECLINED</ResponseText>
</ippayResponse>

CVV filter Failure:

<ippayResponse>
<TransactionID>UHJ210621174956794</TransactionID>
<ActionCode>602</ActionCode>
<ResponseText>DECLINED</ResponseText>
</ippayResponse>

AVS+CVV filter failure:

<ippayResponse>
<TransactionID>UHJ210621174956794</TransactionID>
<ActionCode>603</ActionCode>
<ResponseText>DECLINED</ResponseText>
</ippayResponse>

If determining a transaction state by posting an ENQ to the gateway, the ENQ post should look as follows:

<ippay>
<TransactionID>UHJ210621174956794</TransactionID>
<TerminalID>TESTTERMINAL</TerminalID >
<TransactionType>ENQ</TransactionType>
</ippay>

If using Enhanced ENQ, the ENQ post may also follow one of the below examples:

<ippay>
<UDField1>UDTEST12</UDField1>
<TerminalID>TESTTERMINAL</TerminalID >
<TransactionType>ENQ</TransactionType>
</ippay>
<ippay>
<UDField2>UDTEST56</UDField2>
<TerminalID>TESTTERMINAL</TerminalID >
<TransactionType>ENQ</TransactionType>
</ippay>

When an ENQ is posted to the gateway for a transaction that was held in or deleted by Risk specifically for having exceeded Limits, any of the following responses might be returned, depending on the state the transaction is in at the time the ENQ is posted:

Still on hold:

<ippayResponse>
<ActionCode>600</ActionCode>
<ResponseText>Transaction held, Please contact Support</ResponseText>
<TransactionID>UHJ210621174956794</TransactionID>
</ippayResponse> 

Queued:

<ippayResponse>
<ActionCode>600</ActionCode>
<ResponseText>Transaction queued, Please contact Support</ResponseText>
<TransactionID>UHJ210621174956794</TransactionID>
</Response> 

Approved:

<ippayResponse>
<ActionCode>000</ActionCode>
<ResponseText>APPROVED</ResponseText>
<TransactionID>UHJ210621174956794</TransactionID>
<Approval>123456</Approval>
</ippayResponse>

Declined (Action Code and Response text will vary depending on issuer’s actual response – the below is only a sample and should not be expect for all declined transactions):

<ippayResponse>
<ActionCode>051</ActionCode>
<ResponseText>Insufficient Funds</ResponseText>
<TransactionID>UHJ210621174956794</TransactionID>
</ippayResponse> 

Deleted:

<ippayResponse>
<ActionCode>604</ActionCode>
<ResponseText>Transaction deleted, Will not process</ResponseText>
<TransactionID>UHJ210621174956794</TransactionID>
</ippayResponse>

Sample IPR response:

<Transaction>
<Date>2021-04-05 13:04:43.0</Date>
<vfeState>Held for Risk Review</vfeState>
<vfeQueuedOn>04/05/21 13:04:35</vfeQueuedOn>
<vfeCreatedOn>04/05/21 13:04:35</vfeCreatedOn>
<ipTransID>00000000000000000025850568</ipTransID>
<Merchant_Name>TESTMERCHANT</Merchant_Name>
<Merchant_ID>TESTMID0001</Merchant_ID>
<Terminal_ID>TESTTERMINAL</Terminal_ID>
<Transaction_ID>596371983083161987</Transaction_ID>
</Transaction>

The responses on the previous table are not the only ActionCode values you can obtain. Some responses are generated internal to the server, relying on information already configured within the Gateway Provider and not relying on external communications.

ActionCode Description
'940' is generated when a record cannot be found. For example, if a merchant sends a 'CAPT' transaction to the Gateway Provider, attempting to capture a previously authorized transaction, the Gateway Provider sends a '940' ActionCode whenever that previously authorized transaction cannot be found in the database. Because a merchant can only capture an authorized transaction that has been sent previously, it’s important to recognize that this '940' ActionCode will be sent whenever that authorization is absent.
'981' is generated by the Gateway Provider for merchant accounts that are configured to reject transactions based on AVS results. By observing the AVS results, the merchant can verify that transactions are being properly rejected by the Gateway Provider whenever the configured AVS responses appear. Unless a merchant’s account is boarded to reject certain AVS results, this '981' ActionCode will not appear.
'913' for merchants who do not accept certain credit card types, when those card types are detected. For example, a merchant who does not wish to accept any Discover cards can be boarded to automatically decline that card type; whenever a Discover transaction is sent by that merchant, a '913' ActionCode is returned. Only a merchant account that is boarded to reject certain card dtypes will receive this '913' ActionCode.
'900' is incoming XML transaction contains an XML syntax error. All XML documents that are not 'well-formed' cause the server to return a '900' ActionCode. Additionally, data values submitted in your XML might be invalid syntax, and this will also return a '900' ActionCode. Within a '900' response will be an ErrMsg tag delimiting an error message; this will explain the technical reason (and frequently the location) for a syntax error. By comparing the ErrMsg text to your submitted XML, you can figure out how to correct all '900' responses. You should correct all '900' syntax errors on the test system before sending any transactions to the production server.

The Gateway Provider has created some new risk tools that allow us to tailor transaction processing limits and apply AVS and CVV filters to keep our merchants and their cardholders safe. When a transaction does get held in or declined by risk, a specific response will be returned from the gateway, letting the merchant and the software know that a transaction has been held or declined.

In the case of transactions held in risk, they will be manually reviewed by our Risk team. Based on this new workflow, the transaction can be in any of the below states:
1. Held – the transaction triggered a Risk Limit and is currently being held for review
2. Queued – the transaction was released for processing by Risk and is queued for processing
3. Approved – the transaction was released for processing and was approved by the issuer
4. Declined – the transaction was released for processing and it was declined by the issuer
5. Deleted – the transaction was not approved by Risk and was deleted – it will not be processed

A transaction can evolve through multiple states, depending on where the transaction is in the workflow. At any time, an ENQ can be posted to the gateway to determine the current state of the transaction. This information can then be reported to the merchant, so they are aware of the status of a held transaction. Once a transaction has reached its final state – be it deleted, declined or approved, you should update the cardholders’ account within your own environment to reflect the correct and final status of the transaction. This will prevent possible duplicate processing on automated billing for transactions believed to be incomplete and will also alleviate the merchant from having to manually look-up and update each individual customer’s transaction. You may need to post an ENQ multiple times until the transaction reaches the end of its individual evolution.

In the case of a transaction that fails AVS or CVV checkpoints, the transaction will not be held nor deleted by Risk but immediately declined by automated filters. A transaction that fails an AVS or CVV checkpoint has reached the end of its evolution immediately and does not need to be queried via ENQ or IPR.

The following responses can be expected from the gateway when a transaction is held in or declined by Risk:

Limit suspend:

<ippayResponse>
  <TransactionID>UHJ210621174956794</TransactionID>
  <ActionCode>600</ActionCode>
  <ResponseText>Limits exceeded, Please contact Support</ResponseText>
</ippayResponse>

AVS filter failure:

<ippayResponse>
<TransactionID>UHJ210621174956794</TransactionID>
<ActionCode>601</ActionCode>
<ResponseText>DECLINED</ResponseText>
</ippayResponse>

CVV filter Failure:

<ippayResponse>
<TransactionID>UHJ210621174956794</TransactionID>
<ActionCode>602</ActionCode>
<ResponseText>DECLINED</ResponseText>
</ippayResponse>

AVS+CVV filter failure:

<ippayResponse>
<TransactionID>UHJ210621174956794</TransactionID>
<ActionCode>603</ActionCode>
<ResponseText>DECLINED</ResponseText>
</ippayResponse>

Simulating AVS Responses

To obtain a completely positive AVS result, the last two digits of the postal code should always be a '08'. The following XML example applies:

<ippay>
   <TransactionType>SALE</TransactionType>
   <TerminalID>TESTTERMINAL</TerminalID>
   <TransactionID>910327153017T10019</TransactionID>
   <CardNum>4000300020001000</CardNum>
   <CardExpMonth>12</CardExpMonth>
   <CardExpYear>12</CardExpYear>
   <TotalAmount>99999</TotalAmount>
   <CardName>Bob Tucker</CardName>
   <BillingAddress>8800 Central Dr.</BillingAddress>
   <BillingCity>Dallas</BillingCity>
   <BillingStateProv>TX</BillingStateProv>
   <BillingPostalCode>75008</BillingPostalCode>
   <BillingCountry>USA</BillingCountry>
   <BillingPhone>412-890-1800</BillingPhone>
</ippay>
var httpClient = new HttpClient();
var bodyXmlString = @"<ippay>" + "\n" +
@"   <TransactionType>SALE</TransactionType>" + "\n" +
@"   <TerminalID>TESTTERMINAL</TerminalID>" + "\n" +
@"   <TransactionID>910327153017T10019</TransactionID>" + "\n" +
@"   <CardNum>4000300020001000</CardNum>" + "\n" +
@"   <CardExpMonth>12</CardExpMonth>" + "\n" +
@"   <CardExpYear>12</CardExpYear>" + "\n" +
@"   <TotalAmount>99999</TotalAmount>" + "\n" +
@"   <CardName>Bob Tucker</CardName>" + "\n" +
@"   <BillingAddress>8800 Central Dr.</BillingAddress>" + "\n" +
@"   <BillingCity>Dallas</BillingCity>" + "\n" +
@"   <BillingStateProv>TX</BillingStateProv>" + "\n" +
@"   <BillingPostalCode>75008</BillingPostalCode>" + "\n" +
@"   <BillingCountry>USA</BillingCountry>" + "\n" +
@"   <BillingPhone>412-890-1800</BillingPhone>" + "\n" +
@"</ippay>";
var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://testgtwy.ippay.com/ippay/", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://testgtwy.ippay.com/ippay/',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '<ippay>\n   <TransactionType>SALE</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <TransactionID>910327153017T10019</TransactionID>\n   <CardNum>4000300020001000</CardNum>\n   <CardExpMonth>12</CardExpMonth>\n   <CardExpYear>12</CardExpYear>\n   <TotalAmount>99999</TotalAmount>\n   <CardName>Bob Tucker</CardName>\n   <BillingAddress>8800 Central Dr.</BillingAddress>\n   <BillingCity>Dallas</BillingCity>\n   <BillingStateProv>TX</BillingStateProv>\n   <BillingPostalCode>75008</BillingPostalCode>\n   <BillingCountry>USA</BillingCountry>\n   <BillingPhone>412-890-1800</BillingPhone>\n</ippay>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://testgtwy.ippay.com/ippay/');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('<ippay>\n   <TransactionType>SALE</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <TransactionID>910327153017T10019</TransactionID>\n   <CardNum>4000300020001000</CardNum>\n   <CardExpMonth>12</CardExpMonth>\n   <CardExpYear>12</CardExpYear>\n   <TotalAmount>99999</TotalAmount>\n   <CardName>Bob Tucker</CardName>\n   <BillingAddress>8800 Central Dr.</BillingAddress>\n   <BillingCity>Dallas</BillingCity>\n   <BillingStateProv>TX</BillingStateProv>\n   <BillingPostalCode>75008</BillingPostalCode>\n   <BillingCountry>USA</BillingCountry>\n   <BillingPhone>412-890-1800</BillingPhone>\n</ippay>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

The following shows how the response would look:

<ippayResponse>
   <TransactionID>910327153017T10019</TransactionID>
   <ActionCode>000</ActionCode>
   <Approval>002F6B</Approval>
   <ResponseText>APPROVED</ResponseText>
   <AddressMatch>Y</AddressMatch>
   <ZipMatch>Y</ZipMatch>
   <AVS>Y</AVS>
</ippayResponse>

AVS stands for Address Verification Service. The back-end simulators will trigger specific AVS responses that react to the incoming transaction information. Just as the penny amount determines the approval or decline status of the transaction, a prescribed AVS value can determine the AVS response for a test transaction. The last two digits of the postal code will determine the AVS results sent by the back-end simulator. For example, a postal code of 60003 and 89703 will both trigger an AVS response of 'N', as both postal codes end in value '03'.

Postal Code Values That Affect the AVS Result

By varying the last digit of the postal code, you can get multiple different AVS results. The following table lists the various AVS responses sent by the back-end simulator for specific values.

$ Amount AVS Result Description
$20.05 N - (all) Neither address nor postal code matches. - (All)
$20.06
$20.07
R - (all) Retry. - (All)
$20.08 S - (all) AVS unavailable. - (All)
$20.04 Z - (Visa)
W - (MC/Amex)
W was replaced by Z. - (Visa)
Postal code matches, address absent or does not match. - (MC)
CM Name, street address and postal code are all incorrect. - (Amex)
$20.09 Y - (all) Street address and postal code match. - (All)
$20.01 X - (Visa/MC) Nine-digit postal code match in U.S. Postal code and address match for outside U.S. - (Visa/MC)
$20.02 A - (All) Address matches, ZIP does not
$20.03 W - (MC) For U.S., 9-digit ZIP matches, address does not. For non-U.S., ZIP matches, address does not

Simulating CVV2

To obtain a completely positive CVV2 result, the third digit of the CVV2 value can be a '0'. The following XML example applies:

<ippay>
   <TransactionType>SALE</TransactionType>
   <TerminalID>TESTTERMINAL</TerminalID>
   <TransactionID>910327153017T10020</TransactionID>
   <CardNum>4000300020001000</CardNum>
   <CardExpMonth>12</CardExpMonth>
   <CardExpYear>12</CardExpYear>
   <TotalAmount>99999</TotalAmount>
   <CVV2>890</CVV2>
</ippay>
var httpClient = new HttpClient();
var bodyXmlString = @"<ippay>" + "\n" +
@"   <TransactionType>SALE</TransactionType>" + "\n" +
@"   <TerminalID>TESTTERMINAL</TerminalID>" + "\n" +
@"   <TransactionID>910327153017T10020</TransactionID>" + "\n" +
@"   <CardNum>4000300020001000</CardNum>" + "\n" +
@"   <CardExpMonth>12</CardExpMonth>" + "\n" +
@"   <CardExpYear>12</CardExpYear>" + "\n" +
@"   <TotalAmount>99999</TotalAmount>" + "\n" +
@"   <CVV2>890</CVV2>" + "\n" +
@"</ippay>";
var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://testgtwy.ippay.com/ippay/", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://testgtwy.ippay.com/ippay/',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '<ippay>\n   <TransactionType>SALE</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <TransactionID>910327153017T10020</TransactionID>\n   <CardNum>4000300020001000</CardNum>\n   <CardExpMonth>12</CardExpMonth>\n   <CardExpYear>12</CardExpYear>\n   <TotalAmount>99999</TotalAmount>\n   <CVV2>890</CVV2>\n</ippay>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://testgtwy.ippay.com/ippay/');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('<ippay>\n   <TransactionType>SALE</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <TransactionID>910327153017T10020</TransactionID>\n   <CardNum>4000300020001000</CardNum>\n   <CardExpMonth>12</CardExpMonth>\n   <CardExpYear>12</CardExpYear>\n   <TotalAmount>99999</TotalAmount>\n   <CVV2>890</CVV2>\n</ippay>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

The following shows how the response would look:

<ippayResponse>
   <TransactionID>910327153017T10020</TransactionID>
   <ActionCode>000</ActionCode>
   <Approval>002F6B</Approval>
   <ResponseText>APPROVED</ResponseText>
   <CVV2>M</CVV2>
</ippayResponse>

The term 'CVV2' defines a feature that cover’s Visa’s CVV2, MasterCard’s CVC2, and Amex’s CID. Visa defines CVV2 as 'Card Verification Value 2,' MasterCard defines CVC2 as 'Card Validation Code 2,' and Amex defines CID as 'Card Identifier.'

The back-end simulators will trigger specific CVV2/CVC2/CID responses that react to the incoming transaction information.

This section vindicates the CVV2 responses sent by the Test System.

CVV2 Values That Affect the CVV2 Result

By varying the CVV value, you can trigger a CVV result of “M. Each card type has a unique CVV value that will return an “M” response. Additionally, for Visa or Mastercard only, a TotalAmount of 3360 will procure a CVV response of M with any submitted CVV value.

CVV CVV2 Result Description
998 M - (MasterCard)
M - (all)
CVV2 matches
998/999/996 N - (all) CVV2 does not match - (all)
998/999/996 P - (all) CVV2 not processed - (all)
999/998 U - (Visa/MC)
P - (Amex)
Issuer not certified for
CVV2/CVC2 - (Visa/MC)
CID not processed - (Amex)
998/999 S - (Visa/MC)
P - (Amex)
CVV2 should be on the card, but the merchant indicates it is not - (Visa/MC)
CID not processed. - (Amex)
998 M - (MasterCard) CVV2 matches - (all)

SAMPLE XML TRANSACTIONS AND EXPECTED RESPONSES

PING   

PING Request:

<ippay>
   <TransactionType>PING</TransactionType>
   <TerminalID>TESTTERMINAL</TerminalID>
</ippay>
var httpClient = new HttpClient();
var bodyXmlString = @"<ippay>" + "\n" +
@"   <TransactionType>PING</TransactionType>" + "\n" +
@"   <TerminalID>TESTTERMINAL</TerminalID>" + "\n" +
@"</ippay>";
var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://testgtwy.ippay.com/ippay/", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://testgtwy.ippay.com/ippay/',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '<ippay>\n   <TransactionType>PING</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n</ippay>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://testgtwy.ippay.com/ippay/');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('<ippay>\n   <TransactionType>PING</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n</ippay>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

PING. Expected Response:

<ippayResponse>
   <TransactionID>L20120313151732863</TransactionID>
   <ActionCode>000</ActionCode>
   <ResponseText>APPROVED</ResponseText>
</ippayResponse>

AUTHONLY   

AUTHONLY Request:

<ippay>
   <TransactionType>AUTHONLY</TransactionType>
   <TerminalID>TESTTERMINAL</TerminalID>
   <CardNum>4000300020001000</CardNum>
   <CardExpMonth>12</CardExpMonth>
   <CardExpYear>14</CardExpYear>
   <TotalAmount>8700</TotalAmount>
</ippay>
var httpClient = new HttpClient();
var bodyXmlString = @"<ippay>" + "\n" +
@"   <TransactionType>AUTHONLY</TransactionType>" + "\n" +
@"   <TerminalID>TESTTERMINAL</TerminalID>" + "\n" +
@"   <CardNum>4000300020001000</CardNum>" + "\n" +
@"   <CardExpMonth>12</CardExpMonth>" + "\n" +
@"   <CardExpYear>14</CardExpYear>" + "\n" +
@"   <TotalAmount>8700</TotalAmount>" + "\n" +
@"</ippay>";
var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://testgtwy.ippay.com/ippay/", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://testgtwy.ippay.com/ippay/',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '<ippay>\n   <TransactionType>AUTHONLY</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <CardNum>4000300020001000</CardNum>\n   <CardExpMonth>12</CardExpMonth>\n   <CardExpYear>14</CardExpYear>\n   <TotalAmount>8700</TotalAmount>\n</ippay>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://testgtwy.ippay.com/ippay/');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('<ippay>\n   <TransactionType>AUTHONLY</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <CardNum>4000300020001000</CardNum>\n   <CardExpMonth>12</CardExpMonth>\n   <CardExpYear>14</CardExpYear>\n   <TotalAmount>8700</TotalAmount>\n</ippay>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

AUTHONLY. Expected Response:

<ippayResponse>
   <TransactionID>L20120313151732863</TransactionID>
   <ActionCode>000</ActionCode>
   <Approval>TEST87</Approval>
   <ResponseText>APPROVED</ResponseText>
</ippayResponse>

CAPT   

CAPT Request:

<ippay>
   <TransactionType>CAPT</TransactionType>
   <TerminalID>TESTTERMINAL</TerminalID>
   <TransactionID>L20120313151732863</TransactionID>
</ippay>
var httpClient = new HttpClient();
var bodyXmlString = @"<ippay>" + "\n" +
@"   <TransactionType>CAPT</TransactionType>" + "\n" +
@"   <TerminalID>TESTTERMINAL</TerminalID>" + "\n" +
@"   <TransactionID>L20120313151732863</TransactionID>" + "\n" +
@"</ippay>";

var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://testgtwy.ippay.com/ippay/", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://testgtwy.ippay.com/ippay/',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '<ippay>\n   <TransactionType>CAPT</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <TransactionID>L20120313151732863</TransactionID>\n</ippay>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://testgtwy.ippay.com/ippay/');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('<ippay>\n   <TransactionType>CAPT</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <TransactionID>L20120313151732863</TransactionID>\n</ippay>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

CAPT. Expected Response:

<ippayResponse>
   <TransactionID>L20120313151732863</TransactionID>
   <ActionCode>000</ActionCode>
   <Approval>TEST87</Approval>
   <ResponseText>APPROVED</ResponseText>
</ippayResponse>

SALE   

SALE Request:

<ippay>
   <TransactionType>SALE</TransactionType>
   <TerminalID>TESTTERMINAL</TerminalID>
   <CardNum>4000300020001000</CardNum>
   <CardExpMonth>12</CardExpMonth>
   <CardExpYear>14</CardExpYear>
   <TotalAmount>99999</TotalAmount>
</ippay>
var httpClient = new HttpClient();
var bodyXmlString = @"<ippay>" + "\n" +
@"   <TransactionType>SALE</TransactionType>" + "\n" +
@"   <TerminalID>TESTTERMINAL</TerminalID>" + "\n" +
@"   <CardNum>4000300020001000</CardNum>" + "\n" +
@"   <CardExpMonth>12</CardExpMonth>" + "\n" +
@"   <CardExpYear>14</CardExpYear>" + "\n" +
@"   <TotalAmount>99999</TotalAmount>" + "\n" +
@"</ippay>";

var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://testgtwy.ippay.com/ippay/", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://testgtwy.ippay.com/ippay/',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '<ippay>\n   <TransactionType>SALE</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <CardNum>4000300020001000</CardNum>\n   <CardExpMonth>12</CardExpMonth>\n   <CardExpYear>14</CardExpYear>\n   <TotalAmount>99999</TotalAmount>\n</ippay>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://testgtwy.ippay.com/ippay/');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('<ippay>\n   <TransactionType>SALE</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <CardNum>4000300020001000</CardNum>\n   <CardExpMonth>12</CardExpMonth>\n   <CardExpYear>14</CardExpYear>\n   <TotalAmount>99999</TotalAmount>\n</ippay>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

SALE. Expected Response:

<ippayResponse>
   <TransactionID>K20120313152717220</TransactionID>
   <ActionCode>000</ActionCode>
   <Approval>TEST40</Approval>
   <ResponseText>APPROVED</ResponseText>
</ippayResponse>

FORCE   

FORCE Request:

<ippay>
   <TransactionType>FORCE</TransactionType>
   <TerminalID>TESTTERMINAL</TerminalID>
   <CardNum>4000300020001000</CardNum>
   <CardExpMonth>12</CardExpMonth>
   <CardExpYear>14</CardExpYear>
   <TotalAmount>8799</TotalAmount>
   <Approval>502F6B</Approval>
</ippay>
var httpClient = new HttpClient();
var bodyXmlString = @"<ippay>" + "\n" +
@"   <TransactionType>FORCE</TransactionType>" + "\n" +
@"   <TerminalID>TESTTERMINAL</TerminalID>" + "\n" +
@"   <CardNum>4000300020001000</CardNum>" + "\n" +
@"   <CardExpMonth>12</CardExpMonth>" + "\n" +
@"   <CardExpYear>14</CardExpYear>" + "\n" +
@"   <TotalAmount>8799</TotalAmount>" + "\n" +
@"   <Approval>502F6B</Approval>" + "\n" +
@"</ippay>";

var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://testgtwy.ippay.com/ippay/", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://testgtwy.ippay.com/ippay/',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '<ippay>\n   <TransactionType>FORCE</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <CardNum>4000300020001000</CardNum>\n   <CardExpMonth>12</CardExpMonth>\n   <CardExpYear>14</CardExpYear>\n   <TotalAmount>8799</TotalAmount>\n   <Approval>502F6B</Approval>\n</ippay>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://testgtwy.ippay.com/ippay/');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('<ippay>\n   <TransactionType>FORCE</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <CardNum>4000300020001000</CardNum>\n   <CardExpMonth>12</CardExpMonth>\n   <CardExpYear>14</CardExpYear>\n   <TotalAmount>8799</TotalAmount>\n   <Approval>502F6B</Approval>\n</ippay>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

FORCE. Expected Response:

<ippayResponse>
   <TransactionID>K20120313153432713</TransactionID>
   <ActionCode>000</ActionCode>
   <Approval>502F6B</Approval>
   <ResponseText>ACCEPTED</ResponseText>
</ippayResponse>

VOID   

VOID Request:

<ippay>
   <TransactionType>VOID</TransactionType>
   <TerminalID>TESTTERMINAL</TerminalID>
   <CardNum>4000300020001000</CardNum>
   <CardExpMonth>12</CardExpMonth>
   <CardExpYear>14</CardExpYear>
   <TotalAmount>99999</TotalAmount>
   <Approval>TEST40</Approval>
</ippay>
var httpClient = new HttpClient();
var bodyXmlString = @"<ippay>" + "\n" +
@"   <TransactionType>VOID</TransactionType>" + "\n" +
@"   <TerminalID>TESTTERMINAL</TerminalID>" + "\n" +
@"   <CardNum>4000300020001000</CardNum>" + "\n" +
@"   <CardExpMonth>12</CardExpMonth>" + "\n" +
@"   <CardExpYear>14</CardExpYear>" + "\n" +
@"   <TotalAmount>99999</TotalAmount>" + "\n" +
@"   <Approval>TEST40</Approval>" + "\n" +
@"</ippay>";

var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://testgtwy.ippay.com/ippay/", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://testgtwy.ippay.com/ippay/',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '<ippay>\n   <TransactionType>VOID</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <CardNum>4000300020001000</CardNum>\n   <CardExpMonth>12</CardExpMonth>\n   <CardExpYear>14</CardExpYear>\n   <TotalAmount>99999</TotalAmount>\n   <Approval>TEST40</Approval>\n</ippay>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://testgtwy.ippay.com/ippay/');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('<ippay>\n   <TransactionType>VOID</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <CardNum>4000300020001000</CardNum>\n   <CardExpMonth>12</CardExpMonth>\n   <CardExpYear>14</CardExpYear>\n   <TotalAmount>99999</TotalAmount>\n   <Approval>TEST40</Approval>\n</ippay>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

VOID. Expected Response:

<ippayResponse>
   <TransactionID>M20120313153622210</TransactionID>
   <ActionCode>000</ActionCode>
   <Approval>TEST40</Approval>
   <ResponseText>VOID PROCESSED</ResponseText>
</ippayResponse>

CREDIT   

CREDIT Request:

<ippay>
   <TransactionType>CREDIT</TransactionType>
   <TerminalID>TESTTERMINAL</TerminalID>
   <CardNum>4000300020001000</CardNum>
   <CardExpMonth>12</CardExpMonth>
   <CardExpYear>14</CardExpYear>
   <TotalAmount>99999</TotalAmount>
</ippay>
var httpClient = new HttpClient();
var bodyXmlString = @"<ippay>" + "\n" +
@"   <TransactionType>CREDIT</TransactionType>" + "\n" +
@"   <TerminalID>TESTTERMINAL</TerminalID>" + "\n" +
@"   <CardNum>4000300020001000</CardNum>" + "\n" +
@"   <CardExpMonth>12</CardExpMonth>" + "\n" +
@"   <CardExpYear>14</CardExpYear>" + "\n" +
@"   <TotalAmount>99999</TotalAmount>" + "\n" +
@"</ippay>";

var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://testgtwy.ippay.com/ippay/", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://testgtwy.ippay.com/ippay/',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '<ippay>\n   <TransactionType>CREDIT</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <CardNum>4000300020001000</CardNum>\n   <CardExpMonth>12</CardExpMonth>\n   <CardExpYear>14</CardExpYear>\n   <TotalAmount>99999</TotalAmount>\n</ippay>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://testgtwy.ippay.com/ippay/');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('<ippay>\n   <TransactionType>CREDIT</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <CardNum>4000300020001000</CardNum>\n   <CardExpMonth>12</CardExpMonth>\n   <CardExpYear>14</CardExpYear>\n   <TotalAmount>99999</TotalAmount>\n</ippay>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

CREDIT. Expected Response:

<ippayResponse>
   <TransactionID>M20120313153742977</TransactionID>
   <ActionCode>000</ActionCode>
   <Approval>103959</Approval>
   <ResponseText>RETURN ACCEPTED</ResponseText>
</ippayResponse>

ENQ   

ENQ Request:

<ippay>
   <TransactionType>ENQ</TransactionType>
   <TerminalID>TESTTERMINAL</TerminalID>
   <TransactionID>M20120313153742977</TransactionID>
</ippay>
var httpClient = new HttpClient();
var bodyXmlString = @"<ippay>" + "\n" +
@"   <TransactionType>ENQ</TransactionType>" + "\n" +
@"   <TerminalID>TESTTERMINAL</TerminalID>" + "\n" +
@"   <TransactionID>M20120313153742977</TransactionID>" + "\n" +
@"</ippay>";

var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://testgtwy.ippay.com/ippay/", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://testgtwy.ippay.com/ippay/',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '<ippay>\n   <TransactionType>ENQ</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <TransactionID>M20120313153742977</TransactionID>\n</ippay>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://testgtwy.ippay.com/ippay/');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('<ippay>\n   <TransactionType>ENQ</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <TransactionID>M20120313153742977</TransactionID>\n</ippay>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

ENQ. Expected Response:

<ippayResponse>
   <TransactionID>M20120313153742977</TransactionID>
   <ActionCode>000</ActionCode>
   <Approval>103959</Approval>
   <ResponseText>ACCEPTED</ResponseText>
</ippayResponse>

Credit Card TOKENIZE   

Credit Card TOKENIZE Request:

<ippay>
   <TransactionType>TOKENIZE</TransactionType>
   <TerminalID>TESTTERMINAL</TerminalID>
   <CardNum>4000300020001000</CardNum>
   <CardExpMonth>12</CardExpMonth>
   <CardExpYear>14</CardExpYear>
</ippay>
var httpClient = new HttpClient();
var bodyXmlString = @"<ippay>" + "\n" +
@"   <TransactionType>TOKENIZE</TransactionType>" + "\n" +
@"   <TerminalID>TESTTERMINAL</TerminalID>" + "\n" +
@"   <CardNum>4000300020001000</CardNum>" + "\n" +
@"   <CardExpMonth>12</CardExpMonth>" + "\n" +
@"   <CardExpYear>14</CardExpYear>" + "\n" +
@"</ippay>";

var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://testgtwy.ippay.com/ippay/", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://testgtwy.ippay.com/ippay/',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '<ippay>\n   <TransactionType>TOKENIZE</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <CardNum>4000300020001000</CardNum>\n   <CardExpMonth>12</CardExpMonth>\n   <CardExpYear>14</CardExpYear>\n</ippay>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://testgtwy.ippay.com/ippay/');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('<ippay>\n   <TransactionType>TOKENIZE</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <CardNum>4000300020001000</CardNum>\n   <CardExpMonth>12</CardExpMonth>\n   <CardExpYear>14</CardExpYear>\n</ippay>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

Credit Card TOKENIZE. Expected Response:

<IPPayResponse>
   <TransactionID>A20120313154217163</TransactionID>
   <ActionCode>000</ActionCode>
   <Approval>TOKEN16</Approval>
   <ResponseText>TOKENIZED</ResponseText>
   <Token>4E6E3A2C1A8E1000</Token>
</IPPayResponse>

SALE + TOKENIZE   

SALE/TOKENIZE Request:

<ippay>
   <TransactionType>SALE</TransactionType>
   <TerminalID>TESTTERMINAL</TerminalID>
   <CardNum Tokenize='true'>4000300020001000</CardNum>
   <CardExpMonth>12</CardExpMonth>
   <CardExpYear>14</CardExpYear>
   <TotalAmount>99999</TotalAmount>
</ippay>
var httpClient = new HttpClient();
var bodyXmlString = @"<ippay>" + "\n" +
@"   <TransactionType>SALE</TransactionType>" + "\n" +
@"   <TerminalID>TESTTERMINAL</TerminalID>" + "\n" +
@"   <CardNum Tokenize='true'>4000300020001000</CardNum>" + "\n" +
@"   <CardExpMonth>12</CardExpMonth>" + "\n" +
@"   <CardExpYear>14</CardExpYear>" + "\n" +
@"   <TotalAmount>99999</TotalAmount>" + "\n" +
@"</ippay>";

var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://testgtwy.ippay.com/ippay/", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://testgtwy.ippay.com/ippay/',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '<ippay>\n   <TransactionType>SALE</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <CardNum Tokenize=\'true\'>4000300020001000</CardNum>\n   <CardExpMonth>12</CardExpMonth>\n   <CardExpYear>14</CardExpYear>\n   <TotalAmount>99999</TotalAmount>\n</ippay>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://testgtwy.ippay.com/ippay/');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('<ippay>\n   <TransactionType>SALE</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <CardNum Tokenize=\'true\'>4000300020001000</CardNum>\n   <CardExpMonth>12</CardExpMonth>\n   <CardExpYear>14</CardExpYear>\n   <TotalAmount>99999</TotalAmount>\n</ippay>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

SALE + TOKENIZE. Expected Response:

<ippayResponse>
   <TransactionID>K20120313160646267</TransactionID>
   <ActionCode>000</ActionCode>
   <Token>4D7D1G8E0F2E1000</Token>
   <Approval>TEST41</Approval>
   <ResponseText>APPROVED</ResponseText>
</ippayResponse>

SALE with TOKEN   

SALE Request with TOKEN:

<ippay>
   <TransactionType>SALE</TransactionType>
   <TerminalID>TESTTERMINAL</TerminalID>
   <Token>4G0F7B5K2J6M1111</Token>
   <TotalAmount>100</TotalAmount>
</ippay>
var httpClient = new HttpClient();
var bodyXmlString = @"<ippay>" + "\n" +
@"   <TransactionType>SALE</TransactionType>" + "\n" +
@"   <TerminalID>TESTTERMINAL</TerminalID>" + "\n" +
@"   <Token>4G0F7B5K2J6M1111</Token>" + "\n" +
@"   <TotalAmount>100</TotalAmount>" + "\n" +
@"</ippay>";

var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://testgtwy.ippay.com/ippay/", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://testgtwy.ippay.com/ippay/',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '<ippay>\n   <TransactionType>SALE</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <Token>4G0F7B5K2J6M1111</Token>\n   <TotalAmount>100</TotalAmount>\n</ippay>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://testgtwy.ippay.com/ippay/');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('<ippay>\n   <TransactionType>SALE</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <Token>4G0F7B5K2J6M1111</Token>\n   <TotalAmount>100</TotalAmount>\n</ippay>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

SALE Request with TOKEN. Expected Response:

<ippayResponse>
   <TransactionID>H20120313162706280</TransactionID>
   <ActionCode>000</ActionCode>
   <Approval>TEST17</Approval>
   <ResponseText>APPROVED</ResponseText>
</ippayResponse>

Update TOKEN (Card Exp Date/Year)

Update TOKEN (Card Exp Date/Year). Request:

<ippay>
   <TransactionType>TOKENIZE</TransactionType>
   <Token>4E6E3A2C1A8E1000</Token>
   <CardExpMonth>12</CardExpMonth>
   <CardExpYear>20</CardExpYear>
   <TerminalID>TESTTERMINAL</TerminalID>
</ippay>
var httpClient = new HttpClient();
var bodyXmlString = @"<ippay>" + "\n" +
@"   <TransactionType>TOKENIZE</TransactionType>" + "\n" +
@"   <Token>4E6E3A2C1A8E1000</Token>" + "\n" +
@"   <CardExpMonth>12</CardExpMonth>" + "\n" +
@"   <CardExpYear>20</CardExpYear>" + "\n" +
@"   <TerminalID>TESTTERMINAL</TerminalID>" + "\n" +
@"</ippay>";

var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://testgtwy.ippay.com/ippay/", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://testgtwy.ippay.com/ippay/',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '<ippay>\n   <TransactionType>TOKENIZE</TransactionType>\n   <Token>4E6E3A2C1A8E1000</Token>\n   <CardExpMonth>12</CardExpMonth>\n   <CardExpYear>20</CardExpYear>\n   <TerminalID>TESTTERMINAL</TerminalID>\n</ippay>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://testgtwy.ippay.com/ippay/');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('<ippay>\n   <TransactionType>TOKENIZE</TransactionType>\n   <Token>4E6E3A2C1A8E1000</Token>\n   <CardExpMonth>12</CardExpMonth>\n   <CardExpYear>20</CardExpYear>\n   <TerminalID>TESTTERMINAL</TerminalID>\n</ippay>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

Update TOKEN Request (Card Exp Date/Year). Expected Response:

<IPPayResponse>
   <TransactionID>H20120313160009727</TransactionID>
   <ActionCode>000</ActionCode>
   <Approval>TOKEN304</Approval>
   <ResponseText>TOKENIZED</ResponseText>
   <Token>4E6E3A2C1A8E1000</Token>
</IPPayResponse>

ECHECK   

ECHECK: Refer to XML Feature Description for ECHECK Processing.

ECHECK Request:

<ippay>
   <TransactionType>CHECK</TransactionType>
   <TerminalID>TESTTERMINAL</TerminalID>
   <CardName>Mickey Mouse</CardName>
   <TotalAmount>1399</TotalAmount>
   <FeeAmount>100</FeeAmount>
   <ACH Type = 'SAVINGS' SEC = 'PPD'>
      <AccountNumber>071025661</AccountNumber>
      <ABA>071025661</ABA>
      <CheckNumber>15</CheckNumber>
   </ACH>
</ippay>
var httpClient = new HttpClient();
var bodyXmlString = @"<ippay>" + "\n" +
@"   <TransactionType>CHECK</TransactionType>" + "\n" +
@"   <TerminalID>TESTTERMINAL</TerminalID>" + "\n" +
@"   <CardName>Mickey Mouse</CardName>" + "\n" +
@"   <TotalAmount>1399</TotalAmount>" + "\n" +
@"   <FeeAmount>100</FeeAmount>" + "\n" +
@"   <ACH Type = 'SAVINGS' SEC = 'PPD'>" + "\n" +
@"      <AccountNumber>071025661</AccountNumber>" + "\n" +
@"      <ABA>071025661</ABA>" + "\n" +
@"      <CheckNumber>15</CheckNumber>" + "\n" +
@"   </ACH>" + "\n" +
@"</ippay>";

var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://testgtwy.ippay.com/ippay/", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://testgtwy.ippay.com/ippay/',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '<ippay>\n   <TransactionType>CHECK</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <CardName>Mickey Mouse</CardName>\n   <TotalAmount>1399</TotalAmount>\n   <FeeAmount>100</FeeAmount>\n   <ACH Type = \'SAVINGS\' SEC = \'PPD\'>\n      <AccountNumber>071025661</AccountNumber>\n      <ABA>071025661</ABA>\n      <CheckNumber>15</CheckNumber>\n   </ACH>\n</ippay>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://testgtwy.ippay.com/ippay/');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('<ippay>\n   <TransactionType>CHECK</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <CardName>Mickey Mouse</CardName>\n   <TotalAmount>1399</TotalAmount>\n   <FeeAmount>100</FeeAmount>\n   <ACH Type = \'SAVINGS\' SEC = \'PPD\'>\n      <AccountNumber>071025661</AccountNumber>\n      <ABA>071025661</ABA>\n      <CheckNumber>15</CheckNumber>\n   </ACH>\n</ippay>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

ECHECK. Expected Response:

<ippayResponse>
   <TransactionID>E20120322032420403</TransactionID>
   <ActionCode>000</ActionCode>
   <Approval>000000</Approval>
   <ResponseText>CHECK ACCEPTED</ResponseText>
</ippayResponse>

REVERSAL   

ECHECK: Refer to XML Feature Description for ECHECK Processing.

REVERSAL Request:

<ippay>
   <TransactionType>REVERSAL</TransactionType>
   <TerminalID>TESTTERMINAL</TerminalID>
   <CardName>Donald Duck</CardName>
   <TotalAmount>1500</TotalAmount>
   <FeeAmount>100</FeeAmount>
   <ACH Type = 'CHECKING' SEC = 'CCD'>
      <AccountNumber>222222999</AccountNumber>
      <ABA>071025661</ABA>
      <CheckNumber>1005</CheckNumber>
   </ACH>
</ippay>
var httpClient = new HttpClient();
var bodyXmlString = @"<ippay>" + "\n" +
@"   <TransactionType>REVERSAL</TransactionType>" + "\n" +
@"   <TerminalID>TESTTERMINAL</TerminalID>" + "\n" +
@"   <CardName>Donald Duck</CardName>" + "\n" +
@"   <TotalAmount>1500</TotalAmount>" + "\n" +
@"   <FeeAmount>100</FeeAmount>" + "\n" +
@"   <ACH Type = 'CHECKING' SEC = 'CCD'>" + "\n" +
@"      <AccountNumber>222222999</AccountNumber>" + "\n" +
@"      <ABA>071025661</ABA>" + "\n" +
@"      <CheckNumber>1005</CheckNumber>" + "\n" +
@"   </ACH>" + "\n" +
@"</ippay>";

var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://testgtwy.ippay.com/ippay/", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://testgtwy.ippay.com/ippay/',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '<ippay>\n   <TransactionType>REVERSAL</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <CardName>Donald Duck</CardName>\n   <TotalAmount>1500</TotalAmount>\n   <FeeAmount>100</FeeAmount>\n   <ACH Type = \'CHECKING\' SEC = \'CCD\'>\n      <AccountNumber>222222999</AccountNumber>\n      <ABA>071025661</ABA>\n      <CheckNumber>1005</CheckNumber>\n   </ACH>\n</ippay>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://testgtwy.ippay.com/ippay/');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('<ippay>\n   <TransactionType>REVERSAL</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <CardName>Donald Duck</CardName>\n   <TotalAmount>1500</TotalAmount>\n   <FeeAmount>100</FeeAmount>\n   <ACH Type = \'CHECKING\' SEC = \'CCD\'>\n      <AccountNumber>222222999</AccountNumber>\n      <ABA>071025661</ABA>\n      <CheckNumber>1005</CheckNumber>\n   </ACH>\n</ippay>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

REVERSAL. Expected Response:

<ippayResponse>
   <TransactionID>L20120322034146180</TransactionID>
   <ActionCode>000</ActionCode>
   <Approval>000000</Approval>
   <ResponseText>CHECK ACCEPTED</ResponseText>
</ippayResponse>

VOIDACH   

VOIDACH Request:

<ippay>
   <TransactionType>VOIDACH</TransactionType>
   <TerminalID>TESTTERMINAL</TerminalID>
   <TransactionID>L20120322034146180</TransactionID>
   <CardName>Donald Duck</CardName>
   <TotalAmount>1500</TotalAmount>
   <FeeAmount>100</FeeAmount>
   <ACH Type = 'CHECKING' SEC = 'CCD'>
      <AccountNumber>222222999</AccountNumber>
      <ABA>071025661</ABA>
      <CheckNumber>1005</CheckNumber>
   </ACH>
</ippay>
var httpClient = new HttpClient();
var bodyXmlString = @"<ippay>" + "\n" +
@"   <TransactionType>VOIDACH</TransactionType>" + "\n" +
@"   <TerminalID>TESTTERMINAL</TerminalID>" + "\n" +
@"   <TransactionID>L20120322034146180</TransactionID>" + "\n" +
@"   <CardName>Donald Duck</CardName>" + "\n" +
@"   <TotalAmount>1500</TotalAmount>" + "\n" +
@"   <FeeAmount>100</FeeAmount>" + "\n" +
@"   <ACH Type = 'CHECKING' SEC = 'CCD'>" + "\n" +
@"      <AccountNumber>222222999</AccountNumber>" + "\n" +
@"      <ABA>071025661</ABA>" + "\n" +
@"      <CheckNumber>1005</CheckNumber>" + "\n" +
@"   </ACH>" + "\n" +
@"</ippay>";

var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://testgtwy.ippay.com/ippay/", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://testgtwy.ippay.com/ippay/',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '<ippay>\n   <TransactionType>VOIDACH</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <TransactionID>L20120322034146180</TransactionID>\n   <CardName>Donald Duck</CardName>\n   <TotalAmount>1500</TotalAmount>\n   <FeeAmount>100</FeeAmount>\n   <ACH Type = \'CHECKING\' SEC = \'CCD\'>\n      <AccountNumber>222222999</AccountNumber>\n      <ABA>071025661</ABA>\n      <CheckNumber>1005</CheckNumber>\n   </ACH>\n</ippay>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://testgtwy.ippay.com/ippay/');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('<ippay>\n   <TransactionType>VOIDACH</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <TransactionID>L20120322034146180</TransactionID>\n   <CardName>Donald Duck</CardName>\n   <TotalAmount>1500</TotalAmount>\n   <FeeAmount>100</FeeAmount>\n   <ACH Type = \'CHECKING\' SEC = \'CCD\'>\n      <AccountNumber>222222999</AccountNumber>\n      <ABA>071025661</ABA>\n      <CheckNumber>1005</CheckNumber>\n   </ACH>\n</ippay>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

VOIDACH. Expected Response:

<ippayResponse>
   <TransactionID>L20120322034146180</TransactionID>
   <ActionCode>000</ActionCode>
   <Approval>000000</Approval>
   <ResponseText>CHECK ACCEPTED</ResponseText>
</ippayResponse>

ECHECK + TOKENIZE   

ECHECK + TOKENIZE Request:

<ippay>
   <TransactionType>TOKENIZE</TransactionType>
   <TerminalID>TESTTERMINAL</TerminalID>
   <ABA>123456789</ABA>
   <AccountNumber>071025661</AccountNumber>
</ippay>
var httpClient = new HttpClient();
var bodyXmlString = @"<ippay>" + "\n" +
@"   <TransactionType>TOKENIZE</TransactionType>" + "\n" +
@"   <TerminalID>TESTTERMINAL</TerminalID>" + "\n" +
@"   <ABA>123456789</ABA>" + "\n" +
@"   <AccountNumber>071025661</AccountNumber>" + "\n" +
@"</ippay>";

var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://testgtwy.ippay.com/ippay/", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://testgtwy.ippay.com/ippay/',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '<ippay>\n   <TransactionType>TOKENIZE</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <ABA>123456789</ABA>\n   <AccountNumber>071025661</AccountNumber>\n</ippay>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://testgtwy.ippay.com/ippay/');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('<ippay>\n   <TransactionType>TOKENIZE</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <ABA>123456789</ABA>\n   <AccountNumber>071025661</AccountNumber>\n</ippay>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

ACH TOKENIZE. Expected Response:

<IPPayResponse>
   <TransactionID>M20120313162903177</TransactionID>
   <ActionCode>000</ActionCode>
   <Approval>TOKEN19</Approval>
   <ResponseText>TOKENIZED</ResponseText>
   <Token>G5K7F6M3A4F7K4495</Token>
</IPPayResponse>

ECHECK Transaction with Token  

ECHECK Transaction with Token Request:

<ippay>
   <TransactionType>CHECK</TransactionType>
   <TerminalID>TESTTERMINAL</TerminalID>
   <CardName>Mickey Mouse</CardName>
   <TotalAmount>1399</TotalAmount>
   <FeeAmount>100</FeeAmount>
   <ACH Type='SAVINGS' SEC='PPD'>
      <Token>J4H6F5B4F4K8M1999</Token>
      <CheckNumber>15</CheckNumber>
   </ACH>
</ippay>
var httpClient = new HttpClient();
var bodyXmlString = @"<ippay>" + "\n" +
@"   <TransactionType>CHECK</TransactionType>" + "\n" +
@"   <TerminalID>TESTTERMINAL</TerminalID>" + "\n" +
@"   <CardName>Mickey Mouse</CardName>" + "\n" +
@"   <TotalAmount>1399</TotalAmount>" + "\n" +
@"   <FeeAmount>100</FeeAmount>" + "\n" +
@"   <ACH Type='SAVINGS' SEC='PPD'>" + "\n" +
@"      <Token>J4H6F5B4F4K8M1999</Token>" + "\n" +
@"      <CheckNumber>15</CheckNumber>" + "\n" +
@"   </ACH>" + "\n" +
@"</ippay>";

var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://testgtwy.ippay.com/ippay/", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://testgtwy.ippay.com/ippay/',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '<ippay>\n   <TransactionType>CHECK</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <CardName>Mickey Mouse</CardName>\n   <TotalAmount>1399</TotalAmount>\n   <FeeAmount>100</FeeAmount>\n   <ACH Type=\'SAVINGS\' SEC=\'PPD\'>\n      <Token>J4H6F5B4F4K8M1999</Token>\n      <CheckNumber>15</CheckNumber>\n   </ACH>\n</ippay>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://testgtwy.ippay.com/ippay/');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('<ippay>\n   <TransactionType>CHECK</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <CardName>Mickey Mouse</CardName>\n   <TotalAmount>1399</TotalAmount>\n   <FeeAmount>100</FeeAmount>\n   <ACH Type=\'SAVINGS\' SEC=\'PPD\'>\n      <Token>J4H6F5B4F4K8M1999</Token>\n      <CheckNumber>15</CheckNumber>\n   </ACH>\n</ippay>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

ECHECK Transaction with Token. Expected Response:

<ippayResponse>
   <TransactionID>B20120313164702493</TransactionID>
   <ActionCode>000</ActionCode>
   <Approval>000000</Approval>
   <ResponseText>CHECK ACCEPTED</ResponseText>
</ippayResponse>

Sample Test Cases  

PING  

Verify active communication with acquirer software. ResponseText reads 'PING' to acknowledge this transaction.

PING Request:

<ippay>
   <TransactionType>PING</TransactionType>
   <TerminalID>TESTTERMINAL</TerminalID>
</ippay>
var httpClient = new HttpClient();
var bodyXmlString = @"<ippay>" + "\n" +
@"   <TransactionType>PING</TransactionType>" + "\n" +
@"   <TerminalID>TESTTERMINAL</TerminalID>" + "\n" +
@"</ippay>";

var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://testgtwy.ippay.com/ippay/", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://testgtwy.ippay.com/ippay/',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '<ippay>\n   <TransactionType>PING</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n</ippay>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://testgtwy.ippay.com/ippay/');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('<ippay>\n   <TransactionType>PING</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n</ippay>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

PING. Expected Response:

<ippayResponse>
   <TransactionID>L20120313151732863</TransactionID>
   <ActionCode>000</ActionCode>
   <ResponseText>APPROVED</ResponseText>
</ippayResponse>

AUTHONLY    

The credit card limit is checked to verify that a certain amount is available (and to reserve that amount), but the card is not charged. Either a FORCE or CAPT is used to complete the transaction.

AUTHONLY Request:

<ippay>
   <TransactionType>AUTHONLY</TransactionType>
   <TerminalID>TESTTERMINAL</TerminalID>
   <CardNum>4000300020001000</CardNum>
   <CardExpMonth>12</CardExpMonth>
   <CardExpYear>14</CardExpYear>
   <TotalAmount>8700</TotalAmount>
</ippay>
var httpClient = new HttpClient();
var bodyXmlString = @"<ippay>" + "\n" +
@"   <TransactionType>AUTHONLY</TransactionType>" + "\n" +
@"   <TerminalID>TESTTERMINAL</TerminalID>" + "\n" +
@"   <CardNum>4000300020001000</CardNum>" + "\n" +
@"   <CardExpMonth>12</CardExpMonth>" + "\n" +
@"   <CardExpYear>14</CardExpYear>" + "\n" +
@"   <TotalAmount>8700</TotalAmount>" + "\n" +
@"</ippay>";

var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://testgtwy.ippay.com/ippay/", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://testgtwy.ippay.com/ippay/',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '<ippay>\n   <TransactionType>AUTHONLY</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <CardNum>4000300020001000</CardNum>\n   <CardExpMonth>12</CardExpMonth>\n   <CardExpYear>14</CardExpYear>\n   <TotalAmount>8700</TotalAmount>\n</ippay>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://testgtwy.ippay.com/ippay/');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('<ippay>\n   <TransactionType>AUTHONLY</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <CardNum>4000300020001000</CardNum>\n   <CardExpMonth>12</CardExpMonth>\n   <CardExpYear>14</CardExpYear>\n   <TotalAmount>8700</TotalAmount>\n</ippay>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

AUTHONLY. Expected Response:

<ippayResponse>
   <TransactionID>L20120313151732863</TransactionID>
   <ActionCode>000</ActionCode>
   <Approval>TEST87</Approval>
   <ResponseText>APPROVED</ResponseText>
</ippayResponse>

CAPT   

A credit card charge using an amount equal to or less than the amount of a previous AUTHONLY transaction. The AUTHONLY transaction is required to be present in the database.

CAPT Request:

<ippay>
   <TransactionType>CAPT</TransactionType>
   <TerminalID>TESTTERMINAL</TerminalID>
   <TransactionID>L20120313151732863</TransactionID>
</ippay>
var httpClient = new HttpClient();
var bodyXmlString = @"<ippay>" + "\n" +
@"   <TransactionType>CAPT</TransactionType>" + "\n" +
@"   <TerminalID>TESTTERMINAL</TerminalID>" + "\n" +
@"   <TransactionID>L20120313151732863</TransactionID>" + "\n" +
@"</ippay>";

var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://testgtwy.ippay.com/ippay/", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://testgtwy.ippay.com/ippay/',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '<ippay>\n   <TransactionType>CAPT</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <TransactionID>L20120313151732863</TransactionID>\n</ippay>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://testgtwy.ippay.com/ippay/');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('<ippay>\n   <TransactionType>CAPT</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <TransactionID>L20120313151732863</TransactionID>\n</ippay>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

CAPT. Expected Response:

<ippayResponse>
   <TransactionID>L20120313151732863</TransactionID>
   <ActionCode>000</ActionCode>
   <Approval>TEST87</Approval>
   <ResponseText>APPROVED</ResponseText>
</ippayResponse>

SALE        

Authorizes and captures a credit card charge in a single transaction.

SALE Request:

<ippay>
   <TransactionType>SALE</TransactionType>
   <TerminalID>TESTTERMINAL</TerminalID>
   <CardNum>4000300020001000</CardNum>
   <CardExpMonth>12</CardExpMonth>
   <CardExpYear>14</CardExpYear>
   <TotalAmount>99999</TotalAmount>
</ippay>
var httpClient = new HttpClient();
var bodyXmlString = @"<ippay>" + "\n" +
@"   <TransactionType>SALE</TransactionType>" + "\n" +
@"   <TerminalID>TESTTERMINAL</TerminalID>" + "\n" +
@"   <CardNum>4000300020001000</CardNum>" + "\n" +
@"   <CardExpMonth>12</CardExpMonth>" + "\n" +
@"   <CardExpYear>14</CardExpYear>" + "\n" +
@"   <TotalAmount>99999</TotalAmount>" + "\n" +
@"</ippay>";

var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://testgtwy.ippay.com/ippay/", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://testgtwy.ippay.com/ippay/',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '<ippay>\n   <TransactionType>SALE</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <CardNum>4000300020001000</CardNum>\n   <CardExpMonth>12</CardExpMonth>\n   <CardExpYear>14</CardExpYear>\n   <TotalAmount>99999</TotalAmount>\n</ippay>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://testgtwy.ippay.com/ippay/');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('<ippay>\n   <TransactionType>SALE</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <CardNum>4000300020001000</CardNum>\n   <CardExpMonth>12</CardExpMonth>\n   <CardExpYear>14</CardExpYear>\n   <TotalAmount>99999</TotalAmount>\n</ippay>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

SALE. Expected Response:

<ippayResponse>
   <TransactionID>K20120313152717220</TransactionID>
   <ActionCode>000</ActionCode>
   <Approval>TEST40</Approval>
   <ResponseText>APPROVED</ResponseText>
</ippayResponse>

VOID     

The VOID transaction removes a credit card transaction from the host before the transaction settles. If a transaction has already settled, it cannot be VOIDed (when a transaction is not VOIDed before settlement, a CREDIT transaction is required to reverse the charge). See also CREDIT.

VOID Request:

<ippay>
   <TransactionType>VOID</TransactionType>
   <TerminalID>TESTTERMINAL</TerminalID>
   <CardNum>4000300020001000</CardNum>
   <CardExpMonth>12</CardExpMonth>
   <CardExpYear>14</CardExpYear>
   <TotalAmount>99999</TotalAmount>
   <Approval>TEST40</Approval>
</ippay>
var httpClient = new HttpClient();
var bodyXmlString = @"<ippay>" + "\n" +
@"   <TransactionType>VOID</TransactionType>" + "\n" +
@"   <TerminalID>TESTTERMINAL</TerminalID>" + "\n" +
@"   <CardNum>4000300020001000</CardNum>" + "\n" +
@"   <CardExpMonth>12</CardExpMonth>" + "\n" +
@"   <CardExpYear>14</CardExpYear>" + "\n" +
@"   <TotalAmount>99999</TotalAmount>" + "\n" +
@"   <Approval>TEST40</Approval>" + "\n" +
@"</ippay>";

var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://testgtwy.ippay.com/ippay/", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://testgtwy.ippay.com/ippay/',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '<ippay>\n   <TransactionType>VOID</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <CardNum>4000300020001000</CardNum>\n   <CardExpMonth>12</CardExpMonth>\n   <CardExpYear>14</CardExpYear>\n   <TotalAmount>99999</TotalAmount>\n   <Approval>TEST40</Approval>\n</ippay>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://testgtwy.ippay.com/ippay/');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('<ippay>\n   <TransactionType>VOID</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <CardNum>4000300020001000</CardNum>\n   <CardExpMonth>12</CardExpMonth>\n   <CardExpYear>14</CardExpYear>\n   <TotalAmount>99999</TotalAmount>\n   <Approval>TEST40</Approval>\n</ippay>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

VOID. Expected Response:

<ippayResponse>
   <TransactionID>M20120313153622210</TransactionID>
   <ActionCode>000</ActionCode>
   <Approval>TEST40</Approval>
   <ResponseText>VOID PROCESSED</ResponseText>
</ippayResponse>

CREDIT     

The CREDIT transaction submits a credit card transaction reversal for settlement. The CREDIT reverses a transaction regardless of the settlement status of the transaction it reverses.

CREDIT Request:

<ippay>
   <TransactionType>CREDIT</TransactionType>
   <TerminalID>TESTTERMINAL</TerminalID>
   <CardNum>4000300020001000</CardNum>
   <CardExpMonth>12</CardExpMonth>
   <CardExpYear>14</CardExpYear>
   <TotalAmount>99999</TotalAmount>
</ippay>
var httpClient = new HttpClient();
var bodyXmlString = @"<ippay>" + "\n" +
@"   <TransactionType>CREDIT</TransactionType>" + "\n" +
@"   <TerminalID>TESTTERMINAL</TerminalID>" + "\n" +
@"   <CardNum>4000300020001000</CardNum>" + "\n" +
@"   <CardExpMonth>12</CardExpMonth>" + "\n" +
@"   <CardExpYear>14</CardExpYear>" + "\n" +
@"   <TotalAmount>99999</TotalAmount>" + "\n" +
@"</ippay>";

var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://testgtwy.ippay.com/ippay/", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://testgtwy.ippay.com/ippay/',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '<ippay>\n   <TransactionType>CREDIT</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <CardNum>4000300020001000</CardNum>\n   <CardExpMonth>12</CardExpMonth>\n   <CardExpYear>14</CardExpYear>\n   <TotalAmount>99999</TotalAmount>\n</ippay>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://testgtwy.ippay.com/ippay/');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('<ippay>\n   <TransactionType>CREDIT</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <CardNum>4000300020001000</CardNum>\n   <CardExpMonth>12</CardExpMonth>\n   <CardExpYear>14</CardExpYear>\n   <TotalAmount>99999</TotalAmount>\n</ippay>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

CREDIT. Expected Response:

<ippayResponse>
   <TransactionID>M20120313153742977</TransactionID>
   <ActionCode>000</ActionCode>
   <Approval>103959</Approval>
   <ResponseText>RETURN ACCEPTED</ResponseText>
</ippayResponse>

ENQ  

ENQ Request:

<ippay>
   <TransactionType>ENQ</TransactionType>
   <TerminalID>TESTTERMINAL</TerminalID>
   <TransactionID>M20120313153742977</TransactionID>
</ippay>
var httpClient = new HttpClient();
var bodyXmlString = @"<ippay>" + "\n" +
@"   <TransactionType>ENQ</TransactionType>" + "\n" +
@"   <TerminalID>TESTTERMINAL</TerminalID>" + "\n" +
@"   <TransactionID>M20120313153742977</TransactionID>" + "\n" +
@"</ippay>";

var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://testgtwy.ippay.com/ippay/", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://testgtwy.ippay.com/ippay/',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '<ippay>\n   <TransactionType>ENQ</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <TransactionID>M20120313153742977</TransactionID>\n</ippay>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://testgtwy.ippay.com/ippay/');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('<ippay>\n   <TransactionType>ENQ</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <TransactionID>M20120313153742977</TransactionID>\n</ippay>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

ENQ. Expected Response:

<ippayResponse>
   <TransactionID>M20120313153742977</TransactionID>
   <ActionCode>000</ActionCode>
   <Approval>103959</Approval>
   <ResponseText>ACCEPTED</ResponseText>
</ippayResponse>

An ENQ can be run on the Transaction ID but can also be run on the UDfield1 or UDfield2 values. Feature must be turned on with us to use anything other than Trans ID, available in test and prod.

Token can be returned in ENQ if we turn feature on – please contact us, available in test and prod.

Credit Card TOKENIZE

Credit Card TOKENIZE Request:

<ippay>
   <TransactionType>TOKENIZE</TransactionType>
   <TerminalID>TESTTERMINAL</TerminalID>
   <CardNum>4000300020001000</CardNum>
   <CardExpMonth>12</CardExpMonth>
   <CardExpYear>14</CardExpYear>
</ippay>
var httpClient = new HttpClient();
var bodyXmlString = @"<ippay>" + "\n" +
@"   <TransactionType>TOKENIZE</TransactionType>" + "\n" +
@"   <TerminalID>TESTTERMINAL</TerminalID>" + "\n" +
@"   <CardNum>4000300020001000</CardNum>" + "\n" +
@"   <CardExpMonth>12</CardExpMonth>" + "\n" +
@"   <CardExpYear>14</CardExpYear>" + "\n" +
@"</ippay>";
var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://testgtwy.ippay.com/ippay/", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://testgtwy.ippay.com/ippay/',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '<ippay>\n   <TransactionType>TOKENIZE</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <CardNum>4000300020001000</CardNum>\n   <CardExpMonth>12</CardExpMonth>\n   <CardExpYear>14</CardExpYear>\n</ippay>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://testgtwy.ippay.com/ippay/');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('<ippay>\n   <TransactionType>TOKENIZE</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <CardNum>4000300020001000</CardNum>\n   <CardExpMonth>12</CardExpMonth>\n   <CardExpYear>14</CardExpYear>\n</ippay>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

Credit Card TOKENIZE. Expected Response:

<IPPayResponse>
   <TransactionID>A20120313154217163</TransactionID>
   <ActionCode>000</ActionCode>
   <Approval>TOKEN16</Approval>
   <ResponseText>TOKENIZED</ResponseText>
   <Token>4E6E3A2C1A8E1000</Token>
</IPPayResponse>

SALE + TOKENIZE

SALE + TOKENIZE Request:

<ippay>
   <TransactionType>SALE</TransactionType>
   <TerminalID>TESTTERMINAL</TerminalID>
   <CardNum Tokenize='true'>4000300020001000</CardNum>
   <CardExpMonth>12</CardExpMonth>
   <CardExpYear>14</CardExpYear>
   <TotalAmount>99999</TotalAmount>
</ippay>
var httpClient = new HttpClient();
var bodyXmlString = @"<ippay>" + "\n" +
@"   <TransactionType>SALE</TransactionType>" + "\n" +
@"   <TerminalID>TESTTERMINAL</TerminalID>" + "\n" +
@"   <CardNum Tokenize='true'>4000300020001000</CardNum>" + "\n" +
@"   <CardExpMonth>12</CardExpMonth>" + "\n" +
@"   <CardExpYear>14</CardExpYear>" + "\n" +
@"   <TotalAmount>99999</TotalAmount>" + "\n" +
@"</ippay>";
var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://testgtwy.ippay.com/ippay/", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://testgtwy.ippay.com/ippay/',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '<ippay>\n   <TransactionType>SALE</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <CardNum Tokenize=\'true\'>4000300020001000</CardNum>\n   <CardExpMonth>12</CardExpMonth>\n   <CardExpYear>14</CardExpYear>\n   <TotalAmount>99999</TotalAmount>\n</ippay>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://testgtwy.ippay.com/ippay/');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('<ippay>\n   <TransactionType>SALE</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <CardNum Tokenize=\'true\'>4000300020001000</CardNum>\n   <CardExpMonth>12</CardExpMonth>\n   <CardExpYear>14</CardExpYear>\n   <TotalAmount>99999</TotalAmount>\n</ippay>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

SALE + TOKENIZE. Expected Response:

<ippayResponse>
   <TransactionID>K20120313160646267</TransactionID>
   <ActionCode>000</ActionCode>
   <Token>4D7D1G8E0F2E1000</Token>
   <Approval>TEST41</Approval>
   <ResponseText>APPROVED</ResponseText>
</ippayResponse>

SALE with TOKEN  

SALE Request with TOKEN:

<ippay>
   <TransactionType>SALE</TransactionType>
   <TerminalID>TESTTERMINAL</TerminalID>
   <Token>4G0F7B5K2J6M1111</Token>
   <TotalAmount>100</TotalAmount>
</ippay>
var httpClient = new HttpClient();
var bodyXmlString = @"<ippay>" + "\n" +
@"   <TransactionType>SALE</TransactionType>" + "\n" +
@"   <TerminalID>TESTTERMINAL</TerminalID>" + "\n" +
@"   <Token>4G0F7B5K2J6M1111</Token>" + "\n" +
@"   <TotalAmount>100</TotalAmount>" + "\n" +
@"</ippay>";
var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://testgtwy.ippay.com/ippay/", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://testgtwy.ippay.com/ippay/',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '<ippay>\n   <TransactionType>SALE</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <Token>4G0F7B5K2J6M1111</Token>\n   <TotalAmount>100</TotalAmount>\n</ippay>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://testgtwy.ippay.com/ippay/');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('<ippay>\n   <TransactionType>SALE</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <Token>4G0F7B5K2J6M1111</Token>\n   <TotalAmount>100</TotalAmount>\n</ippay>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

SALE Request with TOKEN. Expected Response:

<ippayResponse>
   <TransactionID>H20120313162706280</TransactionID>
   <ActionCode>000</ActionCode>
   <Approval>TEST17</Approval>
   <ResponseText>APPROVED</ResponseText>
</ippayResponse>

Update TOKEN Request (Card Exp Date/Year)

Update TOKEN Request (Card Exp Date/Year):

<ippay>
   <TransactionType>TOKENIZE</TransactionType>
   <Token>4E6E3A2C1A8E1000</Token>
   <CardExpMonth>12</CardExpMonth>
   <CardExpYear>20</CardExpYear>
   <TerminalID>TESTTERMINAL</TerminalID>
</ippay>
var httpClient = new HttpClient();
var bodyXmlString = @"<ippay>" + "\n" +
@"   <TransactionType>TOKENIZE</TransactionType>" + "\n" +
@"   <Token>4E6E3A2C1A8E1000</Token>" + "\n" +
@"   <CardExpMonth>12</CardExpMonth>" + "\n" +
@"   <CardExpYear>20</CardExpYear>" + "\n" +
@"   <TerminalID>TESTTERMINAL</TerminalID>" + "\n" +
@"</ippay>";
var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://testgtwy.ippay.com/ippay/", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://testgtwy.ippay.com/ippay/',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '<ippay>\n   <TransactionType>TOKENIZE</TransactionType>\n   <Token>4E6E3A2C1A8E1000</Token>\n   <CardExpMonth>12</CardExpMonth>\n   <CardExpYear>20</CardExpYear>\n   <TerminalID>TESTTERMINAL</TerminalID>\n</ippay>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://testgtwy.ippay.com/ippay/');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('<ippay>\n   <TransactionType>TOKENIZE</TransactionType>\n   <Token>4E6E3A2C1A8E1000</Token>\n   <CardExpMonth>12</CardExpMonth>\n   <CardExpYear>20</CardExpYear>\n   <TerminalID>TESTTERMINAL</TerminalID>\n</ippay>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

The token can be updated with a new expiration date without changing the token value but a change in the card number itself would then generate a brand new token. The only values that are stored with the token are the credit card number and expiration date and nothing else.

Update TOKEN Request (Card Exp Date/Year). Expected Response:

<IPPayResponse>
   <TransactionID>H20120313160009727</TransactionID>
   <ActionCode>000</ActionCode>
   <Approval>TOKEN304</Approval>
   <ResponseText>TOKENIZED</ResponseText>
   <Token>4E6E3A2C1A8E1000</Token>
</IPPayResponse>

ECHECK

ECHECK: Refer to XML Feature Description for ECHECK Processing.

ECHECK Request:

<ippay>
<TransactionType>CHECK</TransactionType>
<TerminalID>TESTTERMINAL</TerminalID>
<CardName>Mickey Mouse</CardName>
<TotalAmount>1399</TotalAmount>
<FeeAmount>100</FeeAmount>
<ACH Type = 'SAVINGS' SEC = 'PPD'>
   <AccountNumber>071025661</AccountNumber>
   <ABA>071025661</ABA>
   <CheckNumber>135</CheckNumber>
</ACH>
</ippay>
var httpClient = new HttpClient();
var bodyXmlString = @"<ippay>" + "\n" +
@"<TransactionType>CHECK</TransactionType>" + "\n" +
@"<TerminalID>TESTTERMINAL</TerminalID>" + "\n" +
@"<CardName>Mickey Mouse</CardName>" + "\n" +
@"<TotalAmount>1399</TotalAmount>" + "\n" +
@"<FeeAmount>100</FeeAmount>" + "\n" +
@"<ACH Type = 'SAVINGS' SEC = 'PPD'>" + "\n" +
@"   <AccountNumber>071025661</AccountNumber>" + "\n" +
@"   <ABA>071025661</ABA>" + "\n" +
@"   <CheckNumber>135</CheckNumber>" + "\n" +
@"</ACH>" + "\n" +
@"</ippay>";
var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://testgtwy.ippay.com/ippay/", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://testgtwy.ippay.com/ippay/',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '<ippay>\n<TransactionType>CHECK</TransactionType>\n<TerminalID>TESTTERMINAL</TerminalID>\n<CardName>Mickey Mouse</CardName>\n<TotalAmount>1399</TotalAmount>\n<FeeAmount>100</FeeAmount>\n<ACH Type = \'SAVINGS\' SEC = \'PPD\'>\n   <AccountNumber>071025661</AccountNumber>\n   <ABA>071025661</ABA>\n   <CheckNumber>135</CheckNumber>\n</ACH>\n</ippay>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://testgtwy.ippay.com/ippay/');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('<ippay>\n<TransactionType>CHECK</TransactionType>\n<TerminalID>TESTTERMINAL</TerminalID>\n<CardName>Mickey Mouse</CardName>\n<TotalAmount>1399</TotalAmount>\n<FeeAmount>100</FeeAmount>\n<ACH Type = \'SAVINGS\' SEC = \'PPD\'>\n   <AccountNumber>071025661</AccountNumber>\n   <ABA>071025661</ABA>\n   <CheckNumber>135</CheckNumber>\n</ACH>\n</ippay>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

Update TOKEN Request (Card Exp Date/Year). Expected Response:

<ippayResponse>
   <TransactionID>E20120322032420403</TransactionID>
   <ActionCode>000</ActionCode>
   <Approval>000000</Approval>
   <ResponseText>CHECK ACCEPTED</ResponseText>
</ippayResponse>

REVERSAL

ECHECK: Refer to XML Feature Description for ECHECK Processing.

REVERSAL Request:

<ippay>
   <TransactionType>REVERSAL</TransactionType>
   <TerminalID>TESTTERMINAL</TerminalID>
   <CardName>Donald Duck</CardName>
   <TotalAmount>1500</TotalAmount>
   <FeeAmount>100</FeeAmount>
   <ACH Type = 'CHECKING' SEC = 'CCD'>
      <AccountNumber>222222999</AccountNumber>
      <ABA>071025661</ABA>
      <CheckNumber>1005</CheckNumber>
   </ACH>
</ippay>
var httpClient = new HttpClient();
var bodyXmlString = @"<ippay>" + "\n" +
@"   <TransactionType>REVERSAL</TransactionType>" + "\n" +
@"   <TerminalID>TESTTERMINAL</TerminalID>" + "\n" +
@"   <CardName>Donald Duck</CardName>" + "\n" +
@"   <TotalAmount>1500</TotalAmount>" + "\n" +
@"   <FeeAmount>100</FeeAmount>" + "\n" +
@"   <ACH Type = 'CHECKING' SEC = 'CCD'>" + "\n" +
@"      <AccountNumber>222222999</AccountNumber>" + "\n" +
@"      <ABA>071025661</ABA>" + "\n" +
@"      <CheckNumber>1005</CheckNumber>" + "\n" +
@"   </ACH>" + "\n" +
@"</ippay>";
var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://testgtwy.ippay.com/ippay/", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://testgtwy.ippay.com/ippay/',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '<ippay>\n   <TransactionType>REVERSAL</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <CardName>Donald Duck</CardName>\n   <TotalAmount>1500</TotalAmount>\n   <FeeAmount>100</FeeAmount>\n   <ACH Type = \'CHECKING\' SEC = \'CCD\'>\n      <AccountNumber>222222999</AccountNumber>\n      <ABA>071025661</ABA>\n      <CheckNumber>1005</CheckNumber>\n   </ACH>\n</ippay>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://testgtwy.ippay.com/ippay/');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('<ippay>\n   <TransactionType>REVERSAL</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <CardName>Donald Duck</CardName>\n   <TotalAmount>1500</TotalAmount>\n   <FeeAmount>100</FeeAmount>\n   <ACH Type = \'CHECKING\' SEC = \'CCD\'>\n      <AccountNumber>222222999</AccountNumber>\n      <ABA>071025661</ABA>\n      <CheckNumber>1005</CheckNumber>\n   </ACH>\n</ippay>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

REVERSAL Expected Response:

<ippayResponse>
   <TransactionID>L20120322034146180</TransactionID>
   <ActionCode>000</ActionCode>
   <Approval>000000</Approval>
   <ResponseText>CHECK ACCEPTED</ResponseText>
</ippayResponse>

ECHECK TOKENIZE

ECHECK TOKENIZE Request:

<ippay>
   <TransactionType>TOKENIZE</TransactionType>
   <TerminalID>TESTTERMINAL</TerminalID>
   <ABA>123456789</ABA>
   <AccountNumber>071025661</AccountNumber>
</ippay>
var httpClient = new HttpClient();
var bodyXmlString = @"<ippay>" + "\n" +
@"   <TransactionType>TOKENIZE</TransactionType>" + "\n" +
@"   <TerminalID>TESTTERMINAL</TerminalID>" + "\n" +
@"   <ABA>123456789</ABA>" + "\n" +
@"   <AccountNumber>071025661</AccountNumber>" + "\n" +
@"</ippay>";
var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://testgtwy.ippay.com/ippay/", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://testgtwy.ippay.com/ippay/',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '<ippay>\n   <TransactionType>TOKENIZE</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <ABA>123456789</ABA>\n   <AccountNumber>071025661</AccountNumber>\n</ippay>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://testgtwy.ippay.com/ippay/');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('<ippay>\n   <TransactionType>TOKENIZE</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <ABA>123456789</ABA>\n   <AccountNumber>071025661</AccountNumber>\n</ippay>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

ECHECK TOKENIZE. Expected Response:

<IPPayResponse>
   <TransactionID>M20120313162903177</TransactionID>
   <ActionCode>000</ActionCode>
   <Approval>TOKEN19</Approval>
   <ResponseText>TOKENIZED</ResponseText>
   <Token>G5K7F6M3A4F7K4495</Token>
</IPPayResponse>

ECHECK + TOKENIZE

ECHECK + TOKENIZE Request:

<ippay>
   <TransactionType>CHECK</TransactionType>
   <TerminalID>TESTTERMINAL</TerminalID>
   <CardName>Mickey Mouse</CardName>
   <TotalAmount>1399</TotalAmount>
   <FeeAmount>100</FeeAmount>
   <ACH Tokenize='true' Type='CHECKING' SEC='PPD'>
      <AccountNumber>11111999</AccountNumber>
      <ABA>071025661</ABA>
      <CheckNumber>135</CheckNumber>
   </ACH>
</ippay>
var httpClient = new HttpClient();
var bodyXmlString = @"<ippay>" + "\n" +
@"   <TransactionType>CHECK</TransactionType>" + "\n" +
@"   <TerminalID>TESTTERMINAL</TerminalID>" + "\n" +
@"   <CardName>Mickey Mouse</CardName>" + "\n" +
@"   <TotalAmount>1399</TotalAmount>" + "\n" +
@"   <FeeAmount>100</FeeAmount>" + "\n" +
@"   <ACH Tokenize='true' Type='CHECKING' SEC='PPD'>" + "\n" +
@"      <AccountNumber>11111999</AccountNumber>" + "\n" +
@"      <ABA>071025661</ABA>" + "\n" +
@"      <CheckNumber>135</CheckNumber>" + "\n" +
@"   </ACH>" + "\n" +
@"</ippay>";
var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://testgtwy.ippay.com/ippay/", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://testgtwy.ippay.com/ippay/',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '<ippay>\n   <TransactionType>CHECK</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <CardName>Mickey Mouse</CardName>\n   <TotalAmount>1399</TotalAmount>\n   <FeeAmount>100</FeeAmount>\n   <ACH Tokenize=\'true\' Type=\'CHECKING\' SEC=\'PPD\'>\n      <AccountNumber>11111999</AccountNumber>\n      <ABA>071025661</ABA>\n      <CheckNumber>135</CheckNumber>\n   </ACH>\n</ippay>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://testgtwy.ippay.com/ippay/');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('<ippay>\n   <TransactionType>CHECK</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <CardName>Mickey Mouse</CardName>\n   <TotalAmount>1399</TotalAmount>\n   <FeeAmount>100</FeeAmount>\n   <ACH Tokenize=\'true\' Type=\'CHECKING\' SEC=\'PPD\'>\n      <AccountNumber>11111999</AccountNumber>\n      <ABA>071025661</ABA>\n      <CheckNumber>135</CheckNumber>\n   </ACH>\n</ippay>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

ECHECK + TOKENIZE. Expected Response:

<ippayResponse>
   <TransactionID>E20120313163949967</TransactionID>
   <ActionCode>000</ActionCode>
   <Token>J4H6F5B4F4K8M1999</Token>
   <Approval>000000</Approval>
   <ResponseText>CHECK ACCEPTED</ResponseText>
</ippayResponse>

ECHECK Transaction with Token   

ECHECK Transaction with Token Request:

<ippay>
   <TransactionType>CHECK</TransactionType>
   <TerminalID>TESTTERMINAL</TerminalID>
   <CardName>Mickey Mouse</CardName>
   <TotalAmount>1399</TotalAmount>
   <FeeAmount>100</FeeAmount>
   <ACH Type='SAVINGS' SEC='PPD'>
      <Token>J4H6F5B4F4K8M1999</Token>
      <CheckNumber>135</CheckNumber>
   </ACH>
</ippay>
var httpClient = new HttpClient();
var bodyXmlString = @"<ippay>" + "\n" +
@"   <TransactionType>CHECK</TransactionType>" + "\n" +
@"   <TerminalID>TESTTERMINAL</TerminalID>" + "\n" +
@"   <CardName>Mickey Mouse</CardName>" + "\n" +
@"   <TotalAmount>1399</TotalAmount>" + "\n" +
@"   <FeeAmount>100</FeeAmount>" + "\n" +
@"   <ACH Type='SAVINGS' SEC='PPD'>" + "\n" +
@"      <Token>J4H6F5B4F4K8M1999</Token>" + "\n" +
@"      <CheckNumber>135</CheckNumber>" + "\n" +
@"   </ACH>" + "\n" +
@"</ippay>";
var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://testgtwy.ippay.com/ippay/", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://testgtwy.ippay.com/ippay/',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '<ippay>\n   <TransactionType>CHECK</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <CardName>Mickey Mouse</CardName>\n   <TotalAmount>1399</TotalAmount>\n   <FeeAmount>100</FeeAmount>\n   <ACH Type=\'SAVINGS\' SEC=\'PPD\'>\n      <Token>J4H6F5B4F4K8M1999</Token>\n      <CheckNumber>135</CheckNumber>\n   </ACH>\n</ippay>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://testgtwy.ippay.com/ippay/');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('<ippay>\n   <TransactionType>CHECK</TransactionType>\n   <TerminalID>TESTTERMINAL</TerminalID>\n   <CardName>Mickey Mouse</CardName>\n   <TotalAmount>1399</TotalAmount>\n   <FeeAmount>100</FeeAmount>\n   <ACH Type=\'SAVINGS\' SEC=\'PPD\'>\n      <Token>J4H6F5B4F4K8M1999</Token>\n      <CheckNumber>135</CheckNumber>\n   </ACH>\n</ippay>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

ECHECK Transaction with Token. Expected Response:

<ippayResponse>
   <TransactionID>B20120313164702493</TransactionID>
   <ActionCode>000</ActionCode>
   <Approval>000000</Approval>
   <ResponseText>CHECK ACCEPTED</ResponseText>
</ippayResponse>

Echeck Processing

ECHECK XML Product Specification
Document revision 1-4.2 June 2022

Introduction:
The Gateway Provider handles Echeck transactions. This document covers the XML processing necessary to submit Echeck transactions through the Gateway Provider.
Echeck account type needs to be a request field in both HAPI and HPP. For information about the overall specifications of an transaction, refer to the XML Specification document.

Echeck Request Message

The following table shows the logical structure of the ECHECK request messages. The Document Structure column lists the element name and its place in the message structure in order and indentation. The Qualifications column explains the conditions for supplying that element to a transaction. The condition column lists any conditions that apply to the element.

Request Transaction Element Definitions

The following properties describe the request transactions.

The following properties describe the root eCheck request transactions.

ECHECK Response Message

The following table describes the logical structure of the Echeck transaction response message, sent in response to an initiating Merchant-Initiated Batch request message.

Response Transaction Element Definitions

The following properties describe the response messages:

Examples

The following examples illustrate Echeck messages, showing sample Echeck request messages with corresponding sample response messages.

'ECHECK' Transaction Example (Echeck)

The following is a sample 'ECHECK' transaction for $12.99 along with a one-dollar service charge tacked onto it, accessing a savings account:

   <ippay>
      <TransactionType>CHECK</TransactionType>
      <TerminalID>TESTTERMINAL</TerminalID>
      <TransactionID>SC0327153017T10018</TransactionID>
      <CardName>Mickey Mouse</CardName>
      <TotalAmount>1399</TotalAmount>
      <FeeAmount>100</FeeAmount>
      <ACH Type = 'SAVINGS' SEC = 'PPD'>
         <AccountNumber>071025661</AccountNumber>
         <ABA>071025661</ABA>
         <CheckNumber>135</CheckNumber>
      </ACH>
   </ippay>

The following shows a sample 'successful response' to the above *'CHECK' request:

<ippayResponse>
   <TransactionID>SC0327153017T10018</TransactionID>
   <ActionCode>000</ActionCode>
   <Approval>000000</Approval>
   <ResponseText>CHECK ACCEPTED</Approval>
</ippayResponse>

A 'ECHECK' transaction authorized and captures an eCheck transaction for settlement. The AccountNumber and ABA values define the target account to be debited for the transaction. In a 'CHECK' transaction, the Gateway Provider initiates the transfer of monies out of the bank account defined within the transaction and into the merchant’s account.

Required data for a 'ECHECK' transaction request are:

<TransactionType> = ECHECK
<TerminalID> = your terminal ID, assigned by the Gateway Provider
<TransactionID> = OPTIONAL: character string, exactly eighteen characters long, if used, an unique value is required.
<CardName> = name of the owner of the bank account
<TotalAmount> = total amount of the transaction, including any taxes, fees and surcharges (digits only).
<ACH Type> = CHECKING, SAVINGS, or BUSINESSCK.
<ACH SEC> = eCheck payment application type. Mandatory. Contact Support to determine which SEC to use.
<AccountNumber> = the account identifier for the transaction.
<ABA> = nine-digit bank routing id for the bank
<CheckNumber> = unique numeric identifier for the transaction.

Minimum data returned from a 'ECHECK' transaction response are:

<TransactionID> = Matching the value in the request, above or generated by the Gateway Provider if no value is sent.
<ActionCode> = 000 or other three-digit value
<ResponseText> = ECHECK ACCEPTED or DECLINED

'TOKENIZE' Transaction Example

The following is a sample 'TOKENIZE' transaction for $12.99 along with a one-dollar service charge tacked onto it, accessing a savings account:

   <ippay>
      <TransactionType>TOKENIZE</TransactionType>
      <TerminalID>TESTTERMINAL</TerminalID>
      <TransactionID>SC0327153017T10018</TransactionID>
      <CardName>Mickey Mouse</CardName>
      <TotalAmount>1399</TotalAmount>
      <FeeAmount>100</FeeAmount>
      <ACH Type = 'SAVINGS' SEC = 'PPD'>
         <AccountNumber>071025661</AccountNumber>
         <ABA>071025661</ABA>
         <CheckNumber>135</CheckNumber>
      </ACH>
   </ippay>

The following shows a sample 'successful response' to the above *'TOKENIZE' request:

<ippayResponse>
   <TransactionID>SC0327153017T10018</TransactionID>
   <ActionCode>000</ActionCode>
   <Approval>000000</Approval>
   <ResponseText>TOKENIZE ACCEPTED</Approval>
</ippayResponse>

A 'TOKENIZE' transaction authorized and captures an eCheck transaction for settlement. The AccountNumber and ABA values define the target account to be debited for the transaction. In a 'TOKENIZE' transaction, the Gateway Provider initiates the transfer of monies out of the bank account defined within the transaction and into the merchant’s account.

Required data for a 'TOKENIZE' transaction request are:

<TransactionType> = TOKENIZE
<TerminalID> = your terminal ID, assigned by the Gateway Provider
<TransactionID> = OPTIONAL: character string, exactly eighteen characters long, if used, an unique value is required.
<CardName> = name of the owner of the bank account
<TotalAmount> = total amount of the transaction, including any taxes, fees and surcharges (digits only).
<ACH Type> = CHECKING, SAVINGS, or BUSINESSCK.
<ACH SEC> = eCheck payment application type. Mandatory. Contact Support to determine which SEC to use.
<AccountNumber> = the account identifier for the transaction.
<ABA> = nine-digit bank routing id for the bank
<CheckNumber> = unique numeric identifier for the transaction.

Minimum data returned from a 'TOKENIZE' transaction response are:

<TransactionID> = Matching the value in the request, above or generated by the Gateway Provider if no value is sent.
<ActionCode> = 000 or other three-digit value
<ResponseText> = TOKENIZE ACCEPTED or DECLINED

'VOIDACH' Transaction Example

'VOIDACH' Request example:

<ippay>
   <TransactionType>VOIDACH</TransactionType>
   <TerminalID>TESTTERMINAL</TerminalID>
   <TransactionID>L20120322034146180</TransactionID>
   <CardName>Donald Duck</CardName>
   <TotalAmount>1500</TotalAmount>
   <FeeAmount>100</FeeAmount>
   <ACH Type = 'CHECKING' SEC = 'CCD'>
   <AccountNumber>222222999</AccountNumber>
   <ABA>071025661</ABA>
   <CheckNumber>1005</CheckNumber>
   </ACH>
</ippay>

'VOIDACH' Expected Response:

<ippayResponse>
   <TransactionID>L20120322034146180</TransactionID>
   <ActionCode>000</ActionCode>
   <Approval>000000</Approval>
   <ResponseText>CHECK ACCEPTED</ResponseText>
</ippayResponse>

'REVERSAL' Transaction Example (eCheck)

The following is a sample 'REVERSAL' transaction for $15.00, depositing merchant monies into a target checking account:

   <ippay>
      <TransactionType>REVERSAL</TransactionType>
      <TerminalID>TESTTERMINAL</TerminalID>
      <TransactionID>SC0327153017T10019</TransactionID>
      <CardName>Donald Duck</CardName>
      <TotalAmount>1500</TotalAmount>
      <FeeAmount>100</FeeAmount>
      <ACH Type = 'CHECKING' SEC = 'CCD'>
         <AccountNumber>222222999</AccountNumber>
         <ABA>071025661</ABA>
         <CheckNumber>1005</CheckNumber>
      </ACH>
   </ippay>

The following shows a sample 'successful response' to the above 'REVERSAL' request:

   <ippayResponse>
      <TransactionID>SC0327153017T10019</TransactionID>
      <ActionCode>000</ActionCode>
      <Approval>000000</Approval>
      <ResponseText>CHECK ACCEPTED</Approval>
   </ippayResponse>

A 'REVERSAL' transaction authorizes and captures an eCheck transaction for settlement. The AccountNumber and ABA values define the target account to be credited for the transaction. In a 'REVERSAL' transaction, the Gateway Provider initiates the transfer of monies out of the merchant’s account and into the bank account defined within the transaction.

Required data for a 'REVERSAL' transaction request are:

<TransactionType> = REVERSAL
<TerminalID> = your terminal ID, assigned by the Gateway Provider
<TransactionID> = OPTIONAL: character string, exactly eighteen characters long, if used, an unique value is required.
<CardName> = name of the owner of the bank account
<TotalAmount> = total amount of the transaction, including any taxes, fees and surcharges (digits only).
<ACH Type> = CHECKING, SAVINGS, or BUSINESSCK.
<ACH SEC> = eCheck payment application type. Mandatory. Contact Support to determine which SEC to use.
<AccountNumber> = the account identifier for the transaction.
<ABA> = nine-digit bank routing id for the bank
<CheckNumber> = unique numeric identifier for the transaction.

Minimum data returned from a 'REVERSAL' transaction response are:

<TransactionID> = Matching the value in the request, above or generated by the Gateway Provider if no value is sent.
<ActionCode> = 000 or other three-digit value
<ResponseText> = CHECK ACCEPTED or DECLINED

ECHECK Tokenization

A sample 'TOKEN' transaction request for eCheck is illustrated below:

   <ippay>
      <TransactionID>000000000000000234</TransactionID>
      <TransactionType>TOKENIZE</TransactionType>
      <TerminalID>TESTTERMINAL</TerminalID>
      <ABA>123456789</ABA>
      <AccountNumber>99944495</AccountNumber>
   </ippay>

The response would return a token that can be used for future transactions:

   <IPPayResponse>
      <TransactionID>000000000000000234</TransactionID>
      <ActionCode>000</ActionCode
      ><Approval>TOKEN79</Approval>
      <ResponseText>TOKENIZED</ResponseText>
      <Token>4H6A5C0K2A5F4495</Token>
   </IPPayResponse>

Tokens are also available for Echeck transactions. In an eCheck transaction they take the place of both the ABA (routing code) and DDA (account number). Tokens for eCheck transactions are generated in a manner similar to credit card transactions.

"TOKENIZE" Transaction Example for ECHECK

The 'TOKENIZE' transaction creates a token for an unencrypted PAN and expiration date. In a 'TOKENIZE' transaction, the Gateway Provider accepts the XML transaction block containing the credit card transaction information, creates an entry in its existing merchant record database, and responds back to the original sender with a token that can be used in lieu of the PAN & expiration date for processing future transactions.

For eCheck tokenization responses, tokens are format preserving in the following respects:

  1. Tokens are same character length as submitted data
  2. Last 4 digits of the account number are preserved

Echeck Transaction with New Token Request Example

Taking a sample 'CHECK' transaction below:

   <ippay>
      <TransactionType>CHECK</TransactionType>
      <TerminalID>TESTTERMINAL</TerminalID>
      <CardName>Mickey Mouse</CardName>
      <TotalAmount>1399</TotalAmount>
      <FeeAmount>100</FeeAmount>
      <ACH Type='SAVINGS' SEC='PPD'>
         <AccountNumber>11111999</AccountNumber>
         <ABA>071025661</ABA>
         <CheckNumber>15</CheckNumber>
      </ACH>
   </ippay>

We would update it in the following manner to return a token:

   <ippay>
      <TransactionType>CHECK</TransactionType>
      <TransactionID>SC0327153017T10018</TransactionID>
      <TerminalID>TESTTERMINAL</TerminalID>
      <CardName>Mickey Mouse</CardName>
      <TotalAmount>1399</TotalAmount>
      <FeeAmount>100</FeeAmount>
      <ACH Tokenize='true' Type='SAVINGS' SEC='PPD'>
         <AccountNumber>11111999</AccountNumber>
         <ABA>071025661</ABA>
         <CheckNumber>15</CheckNumber>
      </ACH>
   </ippay>

The response would change to the following. Original Response:

   <ippayResponse>
      <ActionCode>000</ActionCode>
      <Approval>TOKEN78</Approval>
      <ResponseText>TOKENIZED</ResponseText>
      <Token>I8H1C6F4J2I20088</Token>
   </ippayResponse>

Updated Response with token:

   <ippayResponse>
      <TransactionID>SC0327153017T10018</TransactionID>
      <ActionCode>000</ActionCode>
      <Token>I8H1C6F4J2I20088</</Token>
      <Approval>TEST29</Approval>
      <ResponseText>APPROVED</ResponseText>
   </ippayResponse>

Another way of getting a token that maps to an ABA and DDA is to tokenize the information as part of an existing transaction.

Echeck Transactions using Tokens

Once you have a token in place, it can be used for processing transactions in the following manner:

   <ippay>
      <TransactionType>CHECK</TransactionType>
      <TerminalID>TESTTERMINAL</TerminalID>
      <TransactionID>SC0327153017T10018</TransactionID>
      <CardName>Mickey Mouse</CardName>
      <TotalAmount>1399</TotalAmount>
      <FeeAmount>100</FeeAmount>
      <ACH Type = ‘SAVINGS’ SEC = ‘PPD’>
         <Token>I8H1C6F4J2I20088</Token>
         <CheckNumber>135</CheckNumber>
      </ACH>
   </ippay>

And the response will be as normal:

   <ippayResponse>
      <TransactionID>SC0327153017T10018</TransactionID>
      <ActionCode>000</ActionCode>
      <Approval>TEST03</Approval>
      <ResponseText>APPROVED</ResponseText>
   </ippayResponse>

Making eCheck Validation Adjustments

To disable eCheck validation, simply adjust the Scrutiny to 'NONE', as illustrated in the example below:

   <ippay>
      <TransactionType>CHECK</TransactionType>
      <TerminalID>TESTTERMINAL</TerminalID>
      <TransactionID>SC0327153017T10019</TransactionID>
      <CardName>John Doe</CardName>
      <TotalAmount>1243</TotalAmount>
      <ACH Type = ‘CHECKING’ SEC = ‘PPD’>
         <AccountNumber>22222999</AccountNumber>
         <ABA>071025661</ABA>
         <CheckNumber>116</CheckNumber>
         <Scrutiny>NONE</Scrutiny>
      </ACH>
   </ippay>

When the Scrutiny is 'NONE', the eCheck transaction will always return an ActionCode of '000'. The following shows a sample 'successful response' to the 'CHECK' request:

   <ippayResponse>
      <TransactionID>SC0327153017T10019</TransactionID>
      <ActionCode>000</ActionCode>
      <ResponseText>CHECK ACCEPTED</Approval>
      <AdditionalInfo>Invalid ABA Number</AdditionalInfo>
   </ippayResponse>

Adjusting the Scrutiny element to 'LOW' causes to reject the eCheck transaction only when the AccountNumber is detected to be invalid. The following example illustrates just such a sample eCheck transaction:

   <ippay>
      <TransactionType>CHECK</TransactionType>
      <TerminalID>TESTMERCHANT</TerminalID>
      <TransactionID>SC0327153017T10019</TransactionID>
      <CardName>John Doe</CardName>
      <TotalAmount>1243</TotalAmount>
      <ACH Type = ‘CHECKING’ SEC = ‘PPD’>
         <AccountNumber>22222999</AccountNumber>
         <ABA>071025661</ABA>
         <CheckNumber>116</CheckNumber>
         <Scrutiny>LOW</Scrutiny>
      </ACH>
   </ippay>

The following shows a sample 'successful response' to the 'CHECK' request:

   <ippayResponse>
      <TransactionID>SC0327153017T10019</TransactionID>
      <ActionCode>000</ActionCode>
      <ResponseText>CHECK ACCEPTED</Approval>
      <AdditionalInfo>Invalid DDA Number</AdditionalInfo>
   </ippayResponse>

The following shows a sample 'unsuccessful response' to the 'CHECK' request:

   <ippayResponse>
      <TransactionID>SC0327153017T10019</TransactionID>
      <ActionCode>923</ActionCode>
      <ResponseText>INVALID ABA / PLEASE TRY AGAIN</Approval>
      <AdditionalInfo>Invalid ABA Number</AdditionalInfo>
   </ippayResponse>

The default setting for eCheck transactions enables rigorous eCheck validation checking. The server checks the eCheck transaction’s ABA number and account number against a database of such information, validating the eCheck transaction. Although no eCheck transaction can be definitively approved through this validation process, the database helps to assure a higher probability for completing the eCheck transaction.

The eCheck database operates with high accuracy, but the database sometimes evaluates good eCheck transactions as falsely invalid. The reasons for falsely invalid eCheck transactions are, unfortunately, complicated. You can, however, reduce the rigor of eCheck validation process when you feel justified in forcing the completion of eCheck transactions that you believe are good.

If a merchant has a paper check from their customer in-hand, the merchant might perceive that the risk is low for that transaction; disabling eCheck validation might be appropriate. On the other hand, if a merchant asks a customer to fill in the check information on a website, eCheck validation should be retained at a high level of integrity. Judging when to disable eCheck validation might be a subjective process, and the merchant needs to carefully examine their procedures for forcing an eCheck transaction through the Gateway Provider.

Adjusting the Scrutiny element in the XML sets the degree of eCheck validation. The default setting for Scrutiny is 'High' and the submission of this element is optional. The AdditionalInfo element within the response relates the degree of risk for an eCheck transaction. When setting the Scrutiny element to 'LOW' or 'NONE', the AdditionalInfo element documents risk associated with the forced eCheck transaction, if any.

Above, the transaction request shows an ActionCode of '000', indicating that the eCheck transaction was successfully initiated. The AdditionalInfo reveals that the Gateway Provider detected an invalid ABA routing number. Nevertheless, the transaction will proceed to completion because Scrutiny has been set to 'NONE' in the request.

In these two responses, the first scenario shows that the eCheck transaction was accepted in spite of an account number pattern that didn’t match up with anything in database. The second scenario shows that the ABA routing number wasn’t found, so the transaction was rejected. A 'LOW' setting for Scrutiny enables this level of eCheck validation.

Because the default value of Scrutiny is 'HIGH', it’s unnecessary to explicitly declare this default level of eCheck validation. However, keep in mind, whenever you explicitly declare Scrutiny, you will always receive AdditionalInfo in the response. For the sake of consistency, one might think it useful to always declare the Scrutiny value, even if it is set to 'HIGH'. Whether the default Scrutiny is explicitly stated or not, the ActionCode remains the same; AdditionalInfo will be present only when Scrutiny is explicitly invoked.

Fraud Transaction States

The following responses can be expected from the gateway when a transaction is held in or declined by Risk:

1. Limit suspend:

<ippayResponse>
   <TransactionID>UHJ210621174956794</TransactionID>
   <ActionCode>600</ActionCode>
   <ResponseText>Limits exceeded, Please contact Support</ResponseText>
</ippayResponse>

2. AVS filter failure:

<ippayResponse>
   <TransactionID>UHJ210621174956794</TransactionID>
   <ActionCode>601</ActionCode>
   <ResponseText>DECLINED</ResponseText>
</ippayResponse>

3. CVV filter Failure:

   <ippayResponse>
      <TransactionID>UHJ210621174956794</TransactionID>
      <ActionCode>602</ActionCode>
      <ResponseText>DECLINED</ResponseText>
   </ippayResponse>

4. AVS+CVV filter failure:

   <ippayResponse>
      <TransactionID>UHJ210621174956794</TransactionID>
      <ActionCode>603</ActionCode>
      <ResponseText>DECLINED</ResponseText>
   </ippayResponse>

If determining a transaction state by posting an ENQ to the gateway, the ENQ post should look as follows:

   <ippay>
      <TransactionID>UHJ210621174956794</TransactionID>
      <TerminalID>TESTTERMINAL</TerminalID >
      <TransactionType>ENQ</TransactionType>
   </ippay>
var httpClient = new HttpClient();
var bodyXmlString = @"<ippay>" + "\n" +
@"      <TransactionID>UHJ210621174956794</TransactionID>" + "\n" +
@"      <TerminalID>TESTTERMINAL</TerminalID >" + "\n" +
@"      <TransactionType>ENQ</TransactionType>" + "\n" +
@"   </ippay>";

var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://testgtwy.ippay.com/ippay/", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://testgtwy.ippay.com/ippay/',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '   <ippay>\n      <TransactionID>UHJ210621174956794</TransactionID>\n      <TerminalID>TESTTERMINAL</TerminalID >\n      <TransactionType>ENQ</TransactionType>\n   </ippay>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://testgtwy.ippay.com/ippay/');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('   <ippay>\n      <TransactionID>UHJ210621174956794</TransactionID>\n      <TerminalID>TESTTERMINAL</TerminalID >\n      <TransactionType>ENQ</TransactionType>\n   </ippay>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

If using Enhanced ENQ, the ENQ post may also follow one of the below examples:

   <ippay>
      <UDField1>UDTEST12</UDField1>
      <TerminalID>TESTTERMINAL</TerminalID >
      <TransactionType>ENQ</TransactionType>
   </ippay>
var httpClient = new HttpClient();
var bodyXmlString = @"<ippay>" + "\n" +
@"      <UDField1>UDTEST12</UDField1>" + "\n" +
@"      <TerminalID>TESTTERMINAL</TerminalID >" + "\n" +
@"      <TransactionType>ENQ</TransactionType>" + "\n" +
@"   </ippay>";

var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://testgtwy.ippay.com/ippay/", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://testgtwy.ippay.com/ippay/',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '   <ippay>\n      <UDField1>UDTEST12</UDField1>\n      <TerminalID>TESTTERMINAL</TerminalID >\n      <TransactionType>ENQ</TransactionType>\n   </ippay>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://testgtwy.ippay.com/ippay/');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('   <ippay>\n      <UDField1>UDTEST12</UDField1>\n      <TerminalID>TESTTERMINAL</TerminalID >\n      <TransactionType>ENQ</TransactionType>\n   </ippay>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}
   <ippay>
      <UDField2>UDTEST56</UDField2>
      <TerminalID>TESTTERMINAL</TerminalID >
      <TransactionType>ENQ</TransactionType>
   </ippay>
var httpClient = new HttpClient();
var bodyXmlString = @"<ippay>" + "\n" +
@"      <UDField2>UDTEST56</UDField2>" + "\n" +
@"      <TerminalID>TESTTERMINAL</TerminalID >" + "\n" +
@"      <TransactionType>ENQ</TransactionType>" + "\n" +
@"   </ippay>";

var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://testgtwy.ippay.com/ippay/", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://testgtwy.ippay.com/ippay/',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '   <ippay>\n      <UDField2>UDTEST56</UDField2>\n      <TerminalID>TESTTERMINAL</TerminalID >\n      <TransactionType>ENQ</TransactionType>\n   </ippay>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://testgtwy.ippay.com/ippay/');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('   <ippay>\n      <UDField2>UDTEST56</UDField2>\n      <TerminalID>TESTTERMINAL</TerminalID >\n      <TransactionType>ENQ</TransactionType>\n   </ippay>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

1. Still on hold:

   <ippayResponse>
      <ActionCode>600</ActionCode>
      <ResponseText>Transaction held, Please contact Support</ResponseText>
      <TransactionID>UHJ210621174956794</TransactionID>
   </ippayResponse>

2. Queued:

   <ippayResponse>
   <ActionCode>600</ActionCode>
   <ResponseText>Transaction queued, Please contact Support</ResponseText>
   <TransactionID>UHJ210621174956794</TransactionID>
    </ippayResponse>

3. Approved:

   <ippayResponse>
      <ActionCode>000</ActionCode>
      <ResponseText>APPROVED</ResponseText>
      <TransactionID>UHJ210621174956794</TransactionID>
      <Approval>123456</Approval>
   </ippayResponse>

4. Declined (Action Code and Response text will vary depending on issuer’s actual response – the below is only a sample and should not be expect for all declined transactions):

   <ippayResponse>
      <ActionCode>051</ActionCode>
      <ResponseText>Insufficient Funds</ResponseText>
      <TransactionID>UHJ210621174956794</TransactionID>
   </ippayResponse>

5. Deleted:

   <ippayResponse>
      <ActionCode>604</ActionCode>
      <ResponseText>Transaction deleted, Will not process</ResponseText>
      <TransactionID>UHJ210621174956794</TransactionID>
   </ippayResponse>

The Gateway Provider has created some new risk tools that allow us to tailor transaction processing limits and apply AVS and CVV filters to keep our merchants and their cardholders safe.

When a transaction does get held in or declined by risk, a specific response will be returned from the gateway, letting the merchant and the software know that a transaction has been held or declined.

In the case of transactions held in risk, they will be manually reviewed by our Risk team. Based on this new workflow, the transaction can be in any of the below states:

  1. Held – the transaction triggered a Risk Limit and is currently being held for review
  2. Queued – the transaction was released for processing by Risk and is queued for processing
  3. Approved – the transaction was released for processing and was approved by the issuer
  4. Declined – the transaction was released for processing and it was declined by the issuer
  5. Deleted – the transaction was not approved by Risk and was deleted – it will not be processed

A transaction can evolve through multiple states, depending on where the transaction is in the workflow. At any time, an ENQ can be posted to the gateway to determine the current state of the transaction. This information can then be reported to the merchant, so they are aware of the status of a held transaction. Once a transaction has reached its final state – be it deleted, declined or approved, you should update the cardholders’ account within your own environment to reflect the correct and final status of the transaction. This will prevent possible duplicate processing on automated billing for transactions believed to be incomplete and will also alleviate the merchant from having to manually look‐up and update each individual customer’s transaction. You may need to post an ENQ multiple times until the transaction reaches the end of its individual evolution.

In the case of a transaction that fails AVS or CVV checkpoints, the transaction will not be held nor deleted by Risk but immediately declined by automated filters. A transaction that fails an AVS or CVV checkpoint has reached the end of its evolution immediately and does not need to be queried via ENQ or IPR.

When an ENQ is posted to the gateway for a transaction that was held in or deleted by Risk specifically for having exceeded Limits, any of the following responses might be returned, depending on the state the transaction is in at the time the ENQ is posted.

In addition to ENQ, you may also use the IPR environment to determine the state of a transaction held in or deleted by Risk. If you are not already integrated to the IPR environment and are interested in being so, please contact the Gateway Provider to get started.

IPR can provide even more detail about the transaction’s state; not only can the transaction’s present state be determined, but IPR is able to show historical states with time stamps.

The following IPR fields are now available:

vfeState → 'Held for Risk Review', 'Queued', 'Success', 'Failed', 'Deleted'
vfeQueuedOn → dd/MM/yy HH:mm:ss
vfeCreatedOn → dd/MM/yy HH:mm:ss
vfeReleasedOn → dd/MM/yy HH:mm:ss
vfeDeletedOn → dd/MM/yy HH:mm:ss

Fields that do not become relevant to a transaction, depending on its individual workflow, will not be given a time stamp. Relevant time stamps will be made available as the transaction passes through that state. The state of a transaction is expected to evolve until it reaches its eventual end state of Success (Released and Approved by issuer), Failed (Released and Declined by issuer) or Deleted (Deleted by Risk, will not process). Due to this, you may need to query IPR multiple times until the transaction reaches the end of its individual evolution.

IVRM Product Specification

IVRM Product Specification
Document revision 1.0 June 2022

General Information

For compatibility reasons, all original input/output parameters have been kept in methods but the blue highlighted ones may be discarded from input and empty/dummy returned in output.

Error codes All web service methods will throw a WSClientException exception if the input is not validated. The exception has a code and a message.

Exception codes are:

Error Code Description Examples
100 Unknown error -
200 Internal error -
300 Invalid user or password error -
400 Invalid input -
500 Invalid token -

Exposed Web Methods

The PMG web service exposes following methods:

Method Name Description
addTempCreditCard Generates a GUID and save a new temporary credit card to DB with this GUID.
updateTempCreditCard The method will update the existing temporary CC associated with the specified GUID. Only attributes present in request will be updated. An attribute is considered present when it is not null and not empty.
saveTempCreditCard Saves in DB as a credit card the temporary credit card data associated with the GUID. Supports also updating exising temporary credit card data before saving it as a credit card.

Common input parameters

All web services have the following common input parameters:

Parameter name Type Default Description Mandatory
username string null User credentials used to login to PMG Y
password string null User credentials used to login to PMG Y
locale string null User locale (used for GUI localization) N
externalUser string null User loggend in the client application (used for audit) Y
application string null Client application name Y

Add Temp Credit Card

Description

Generates a GUID and save a new temporary credit card to DB with this GUID.

Request parameters

Parameter Type Default Description Mandatory
Common input parameters Y
provider string null Provider code Y
accountCode string null Account code N

Response parameters

Parameter Type Description
result string Generated GUID

Update Temp Credit Card

Description

The method will update the existing temporary CC associated with the specified GUID. Only attributes present in request will be updated. An attribute is considered present when it is not null and not empty.

Request parameters

Parameter Type Default Description Mandatory
guid string null Generated GUID Y
cardType string null Card type code, as defined in PMG GUI (Ex: VISA, AMEX, …) N
cardNumber string Null Full PAN (not masked) N
holder string Null Card holder name N
expMonth string Null Card validity expiration month N
expYear string Null Card validity expiration year N
startMonth string Null Card validity start month N
startYear string Null Card validity start year N
cvv string Null Card CVV (will be stored only in memory for short period of time) N

Response parameters
None

Save Temp Credit Card

Description

Saves in DB as a credit card the temporary credit card data associated with the GUID. Supports also updating exising temporary credit card data before saving it as a credit card.

Request parameters

Parameter Type Default Description Mandatory
Common input parameters Y
guid string null Generated GUID Y
cardType string null Card type code, as defined in PMG GUI (Ex: VISA, AMEX, …) N
cardNumber string Null Full PAN (not masked) N
holder string Null Card holder name N
expMonth string Null Card validity expiration month N
expYear string Null Card validity expiration year N
startMonth string Null Card validity start month N
startYear string Null Card validity start year N
cvv string Null Card CVV (will be stored only in memory for short period of time) N
prefixLength int 6 When the PMG will send CC details associated with this GUID, the PAN will be masked according to these attributes. Sending 0 means full prefix mask. Clients should send -1 if they don’t have a value and don’t want to know about the defaults. N
suffixLength sint s4 sWhen the PMG will send CC details associated with this GUID, the PAN will be masked according to these attributes. Sending 0 means full suffix mask. Clients should send -1 if they don’t have a value and don’t want to know about the defaults. N

Response parameters

Parameter Type Description
cardTypeCode string Card type code (Masked or not according to standards)
cardTypeDescr string Card type description (Masked or not according to standards)
maskedCardNumber string Masked card number (According to standards)
holder string Card holder name (Masked or not according to standards)
expMonth string Card validity expiration month (Masked or not according to standards)
expYear string Card validity expiration year (Masked or not according to standards)
startMonth string Card validity start month (Masked or not according to standards)
startYear string Card validity start year (Masked or not according to standards)
cardStatus CreditCardStatus One of
* ACTIVE
* CLOSED
* NONE
provider string Provider code
cardToken string Credit card token

Decline List 2022

General and CC Response Codes

Visa

Visa:
00 Successful completion
01 Refer to card issuer
02 Refer to card issuer, special condition
03 Invalid merchant or service provider
04 Pick up card
05 Do no honor
06 Error
07 Pick up card, special condition
10 Partial approval
11 VIP approval
12 Invalid transaction
13 Invalid amount
14 Invalid account number
15 No such issuer
19 Re-enter transaction
21 No action taken
25 Unable to locate record in file
28 File is temporarily unavailable
39 No credit account
41 Pick up card (lost card)
43 Pick up card (stolen card)
51 Insufficient funds
52 No checking account
53 No savings account
54 Expired card
55 Incorrect PIN
57 Transaction not permitted to cardholder
58 Transaction not allowed at terminal
59 Suspected Fraud
61 Activity amount limit exceeded
62 Restricted card
63 Security violation
65 Activity count limit exceeded
75 Allowable number of PIN-entry tries exceeded
76 Unable to locate previous message
77 Message inconsistent with original message
78 Blocked, first used
80 Invalid date
81 PIN crypto error
82 Incorrect CVV
83 Unable to verify PIN
85 No reason to decline request for account or address verification
91 Issuer or switch inoperative
92 Destination cannot be found for routing
93 Transaction cannot be completed; violation of law.
96 System malfunction
809 B1 Surcharge not premitted
805 N0 Force STP
57 N3 Cash service not available
61 N4 Cash request exceeds issuer limit
806 N7 Decline for CVV2 failure
0 P0 Approved; PVID missing, invalid or expired
83 P1 Declined; PVID missing, invalid or expired
807 P2 Invalid biller information
55 P5 PIN change/unblock request denied
55 P6 Unsafe PIN
807 Q1 Card authentication failed
808 R0 Stop Payment order
808 R1 Revocation of Auth order
808 R3 Revocation of all auth order
2 XA Forward to issuer
2 XD Forward to issuer
999 Z3 Decline; unable to go online

Mastercard

Mastercard:
00 Approved
01 Refer to issuer
03 Invalid merchant
04 Capture card
05 Do not honor
08 Honor with ID
10 Partial Approval
12 Invalid transaction
13 Invalid amount
14 Invalid card number
15 Invalid issuer
25 Unable to locate record
27 File update field edit error
30 Format error
41 Lost card
43 Stolen card
51 Insufficient funds
54 Expired card
55 Invalid PIN
57 Transaction not permitted to cardholder
58 Tranaction not permitted to terminal
61 Exceeds withdrawal limit
62 Restricted card
63 Security violation
65 Exceeds withdrawal count
68 Response late
70 Contact card Issuer
71 PIN not changed
75 PIN tries exceeded
76 Invalid "to" account
77 Invalid "from" account
78 Nonexistent account
79 Key exchange validation failed
80 Duplicate add, action not performed
84 Invalid auth life cycle
85 Not declined
87 Cash back not allowed
89 Auth system or issuer inop
91 Auth system or issuer inop
92 Unable to route transaction
94 Duplicate transmission
96 System error

Amex

Amex:
001 Approved
000 Approve with ID
002 Partial Approval
003 Approve VIP
092 Approved (Express Rewards Program)
100 Deny
101 Expired Card
103 Deny - Invalid Manual Entry
104 Deny - New card issued
105 Deny - Account Canceled
107 Please call issuer
109 Invalid Merchant
110 Invalid Amount
111 Invalid Account
115 Service not permitted
122 Invalid security code
125 Invalid effective date
181 Format error
182 Please wait
183 Invalid currency code
187 Deny – new card issued
188 Deny - Account Canceled
189 Deny – closed merchant
200 Deny - pick up card
400 Reversal Accepted

Gateway Specific

Gateway Specific:
099 Timeout
750 Velocity check fail
899 Misc. decline
900 Invalid message type
901 Invalid Merchanbt ID
903 Debit not supported
904 Private Label not supported
905 Invalid Card type
906 Unit not active
908 Manual Card Entry Invalid
909 Invalid Track Information
911 Master Merchant not found
912 Invalid Card Format
913 Invalid Transaction Type
917 Expired Card
919 Invalid Entry Type
920 Invalid amount
921 Invalid messge format
923 Invalid ABA
924 Invalid DDA
925 Invalid TID
926 Invalid Password
930 Invalid zipcode
931 Invalid Address
932 Invalid ZIP and Address
933 Invalid CVV2
940 Record Not Found
941 Merchant ID error
942 Refund Not Allowed
943 Refund denied
958 Bad Status
981 Invalid AVS
987 Issuer Unavailable
988 System error SD
989 Database Error
992 Transaction Timeout
996 Bad Terminal ID
997 Message rejected by association
999 Communication failure
934 Failed AVS HPP/HAPI
935 Failed CVV HPP/HAPI
6 Format Error
900 Network Error
600 Limits Exceeded
601 Failed AVS
602 Failed CVV
603 Failed AVS and CVV
604 Transaction Deleted

Discover

Discover:
00 Approved or completed successfully
01 Refer to Card Issuer
02 Refer to Card Issuer's special conditions
03 Invalid Merchant
04 Capture Card
05 Do not honor
07 Pick-up Card, special condition
08 Honor with ID
10 Approved for partial amount
11 Approved
12 Invalid transaction
13 Invalid amount
14 Invalid Card Number
15 Invalid Issuer
19 Re-enter transaction
30 Format error
31 Bank not supported by switch
33 Expired Card
34 Suspected fraud
35 Card Acceptor contact Acquirer
36 Restricted Card
37 Card Acceptor call Acquirer security
38 Allowable PIN tries exceeded
39 No credit Account
40 Requested function not supported
41 Lost Card
43 Stolen Card
51 Decline
53 No savings Account
54 Expired Card
55 Invalid PIN
56 No Card record
57 Transaction not permitted to Issuer/Cardholder
58 Transaction not permitted to Acquirer/terminal
59 Suspected fraud
60 Card acceptor contact Acquirer
61 Exceeds withdrawal amount limit
62 Restricted Card
63 Security violation
64 Original amount incorrect
65 Exceeds withdrawal count limit
66 Card Acceptor call Acquirer's security dept
67 Hard capture (requires ATM pick-up
68 Response received too late
75 Allowable number of PIN tries exceeded
76 Invalid/nonexistent "to" Account specified
77 Invalid/nonexistent "from" Account specified
78 Invalid/nonexistent Account specified (general
87 Network unavailable
91 Authorization system or Issuer system inoperative
92 Unable to route transaction
93 Transaction cannot be completed, violation of law
94 Duplicate transmission detected
96 System malfunction

Echeck Response Codes

Echeck:
C01 Approved
C02 Approve with ID
C03 Approve VIP
C04 Approved (Express Rewards Program)
C05 Deny
C06 Expired Card
C07 Deny - Invalid Manual Entry
C09 Deny - New card issued
C10 Deny - Account Canceled
C11 Please call issuer
C12 Invalid Merchant
C13 Invalid Amount
R01 Insufficient funds
R02 Account closed
R03 No account/unable to locate
R04 Invalid account number
R05 Reserved
R06 Returned per ODFI's Request
R07 Authorization Revoked by Customer
R08 Payment stopped
R09 Uncollected funds
R10 Customer advises not authorized
R11 Check truncation entry Return
R12 Branch sold to other DFI
R13 RDFI not qualified to participate
R14 Representative payee deceased or unable to continue in that capacity
R15 Beneficiary deceased
R16 Account frozen
R17 File/Record edit criteria
R18 Improper effective entry date
R19 Amount field error
R20 Non-transaction account
R21 Invalid company ID
R22 Invalid individual ID
R23 Credit entry Refused by Receiver
R24 Duplicate entry
R25 Addenda error
R26 Mandatory field error
R27 Trace number error
R28 Transit/Routing check digit error
R29 Coprorate customer advises not authorized
R30 RDFI not a participant in check truncation program
R31 Permissable Return entry
R32 RDFI - non-settlement
R33 Return for XCK
R34 Limited participation DFI
R50 State law affecting RCK acceptance
R51 Item is ineligible, notice not provided, signature not genuine, or item altered
R52 Stop payment on item for which an RCK item was Received
R80 Cross border coding error
Phases of echeck Transfers
ND Not Done
PH1 Phase 1 - Request for funds
PH2 Phase 2 - Funds transferred to RDFI (merchant's acct)
CMP Complete - delay times passed - transfer done

DLL Response Codes

CODE DESRIPTION CAUSES
A50 Unexpected error Virtual Terminal Application Error
A80 Invalid transaction type Transaction type code is not recognized
A81 Missing Merchant ID Merchant ID is not present
A82 Invalid price Price is negative
A83 Invalid ABA number ABA number size problem
A84 Missing checking account number Account number size is zero
A85 Missing check number Check number size is zero
A86 Invalid check surcharge Surcharge is negative
A87 Invalid credit card expiration date The size of the exipration date is different to four digits: must by MMYY
A88 Missing credit card number Credit card number size is zero
A89 Invalid credit card number The size is incorrect, or is not numeric or invalid
A90 Invalid CVV2 number CVV must be numeric
A91 Missing account holder name Account holder name size is zero
E50 Unexpected error
E51 No response received from JetPay Gateway
E52 Incomplete response received from JetPay Gateway
E53 Invalid response received from JetPay Gateway
E54 Action code not returned from JetPay Gateway
E55 Transaction identifier returned from JetPay Gateway did not match outbound transaction identifier

AVS codes

VISA

VISA:
AVS resp Addr Match Zip Match Inter. Only
A Y N N
B Y X N
C X X N
D Y Y Y
F Y Y Y
G X X Y
I X X Y
M Y Y Y
N N N N
P X Y N
R X X N
S NA NA NA
U X X N
W NA NA NA
X NA NA NA
Y Y Y N
Z N Y N

MC

MC:
AVS resp Addr Match Zip Match
A Y N
B Y X
C X X
D Y Y
F Y Y
G X X
I X X
M Y Y
N N N
P X Y
R X X
S X X
U X X
W N Y
X Y Y
Y Y Y
Z N Y

AMEX

AMEX:
AVS resp Addr Match Zip Match Name Match
A Y N X
D N Y N
E Y Y N
F Y N N
K N N Y
L N Y Y
M Y Y Y
N N N X
O Y N Y
R X X X
S X X X
U X X X
W N N N
Y Y Y X
Z N Y X

Discover

Discover:
AVS resp Addr Match Zip Match
A Y Y
S X X
T N Y
U X X
W X X
X Y Y
Y Y N
Z N Y

    Reporting API

Reporting Service (IPR)

Reporting Service (IPR)
Document Version 2.0 June 2022

Introduction:

The Gateway has an API for querying transaction data. This document describes the API to connect to retrieve transaction and tokenization data that can be used to create customized reports.

For information about the overall specifications of an transaction, refer to the XML Specification document.

IPR Connecting

For testing:

https://rpt-test.ippay.com/ippayReport/

For production:

https://rpt.ippay.com/ippayReport/

The production gateway should not be used for test purposes, unless a test of live transaction data is deliberately planned with intent to settle that transaction data.

Request/Response Example

The following IPR transaction demonstrates a credit card transaction request:

<ippayReport>
   <MerchantID>xxx</MerchantID>
   <Password>xxx</Password> 
   <TransactionRange> 
   <TransactionType>credit</TransactionType> 
   <TransactionStartTime>2022-03-07T00:00:00</TransactionStartTime> 
   <TransactionEndTime>2022-03-08T00:59:59</TransactionEndTime>
   </TransactionRange> 
   <QueryType>nongateway</QueryType> OPTIONAL. Values are nongateway, gateway or combined
</ippayReport> 
var httpClient = new HttpClient();
var bodyXmlString = @"<ippayReport>
" + "\n" +
@"    <MerchantID>TRANS0000002703SDD</MerchantID>
" + "\n" +
@"    <TerminalID />
" + "\n" +
@"    <Password>T7UE7adpx8</Password>
" + "\n" +
@"    <TransactionRange>
" + "\n" +
@"        <TransactionType>credit</TransactionType>
" + "\n" +
@"        <TransactionStartTime>2019-01-01T00:00:00</TransactionStartTime>
" + "\n" +
@"        <TransactionEndTime>2019-01-02T00:00:00</TransactionEndTime>
" + "\n" +
@"    </TransactionRange>
" + "\n" +
@"</ippayReport>";

var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://rpt-test.ippay.com/ippayReport/", stringContent);
Console.WriteLine(response.Content);
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://rpt-test.ippay.com/ippayReport/');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('<ippayReport>
\n    <MerchantID>TRANS0000002703SDD</MerchantID>
\n    <TerminalID />
\n    <Password>T7UE7adpx8</Password>
\n    <TransactionRange>
\n        <TransactionType>credit</TransactionType>
\n        <TransactionStartTime>2019-01-01T00:00:00</TransactionStartTime>
\n        <TransactionEndTime>2019-01-02T00:00:00</TransactionEndTime>
\n    </TransactionRange>
\n</ippayReport>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://rpt-test.ippay.com/ippayReport/',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '<ippayReport>\r\n    <MerchantID>TRANS0000002703SDD</MerchantID>\r\n    <TerminalID />\r\n    <Password>T7UE7adpx8</Password>\r\n    <TransactionRange>\r\n        <TransactionType>credit</TransactionType>\r\n        <TransactionStartTime>2019-01-01T00:00:00</TransactionStartTime>\r\n        <TransactionEndTime>2019-01-02T00:00:00</TransactionEndTime>\r\n    </TransactionRange>\r\n</ippayReport>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});

For this IPR transaction, if there was no transaction data to return, the response would be as follows:

   <ippayReport>
      <Transactions type="credit" run=" 2019-01-03 10:30:00"
         start="2019-01-01 00:00:00" 
         end="2019-01-01 00:00:00">
         No Results
      </Transactions>
   </ippayReport>

For this IPR transaction, the following response illustrates how the returning XML would look if there were transactions to report:

   <ippayReport>
      <Transactions type="credit" run=" 2019-01-03 10:30:00"
         start="2019-01-01 00:00:00" end="2019-01-01 00:00:00">
        <Transaction>
            <Date>2022-03-07 06:40:27.0</Date>
            <ipTransID>000000000000000000144970343</ipTransID>
            <Merchant_Name>xxx</Merchant_Name>
            <Merchant_ID>xxx</Merchant_ID>
            <Terminal_ID>xxx</Terminal_ID>
            <Transaction_ID>HPC202203071240272</Transaction_ID>
            <Request_Type>SALE</Request_Type>
            <Total_Amount>52.4500</Total_Amount>
            <Fee_Amount>0.0000</Fee_Amount>
            <Auth_Code>031937</Auth_Code>
            <ActionCode>000</ActionCode>
            <Response_Text>APPROVED</Response_Text>
            <CardNum>4M0E7A6K8G2F1048</CardNum>
            <Token>4M0E7A6K8G2F1047</Token>
            <AVS_Response>Y</AVS_Response>
            <AddressMatch>Y</AddressMatch>
            <ZipMatch>Y</ZipMatch>
            <CVV2>M</CVV2>
            <CardHolderName>Ashley G Taylor</CardHolderName>
            <Address>1236 198th street</Address>
            <City>Pacific junction</City>
            <State>IA</State>
            <Zip>51561</Zip>
            <Country></Country>
            <Phone></Phone>
            <Email></Email>
            <UserIPAddr></UserIPAddr>
            <UserHost></UserHost>
            <OrderNumber></OrderNumber>
            <UD1>ERID1288780</UD1>
            <UD2></UD2>
            <UD3></UD3>
            <CustomerPO></CustomerPO>
            <ShippingMethod></ShippingMethod>
            <ShippingName></ShippingName>
            <ShippingAddr></ShippingAddr>
            <alProcessorID>5727</alProcessorID>
            <altTerminalID></altTerminalID>
            <altMerchantID></altMerchantID>
            <FNA_AuthDate>2022-03-07</FNA_AuthDate>
            <FNA_AuthTime>06:40:28</FNA_AuthTime>
            <FNA_TransactionID>3161621504</FNA_TransactionID>
            <FNA_ResponseCode></FNA_ResponseCode>
            <FNA_RetRefNum>206612202188</FNA_RetRefNum>
            <CCProcessor>92865727</CCProcessor>
            <ACHProcessor>5727</ACHProcessor>
            <CardPresent>false</CardPresent>
            <Source>nongateway</Source>
        </Transaction>

      </Transactions>
   </ippayReport>

The following examples illustrate transaction messages, showing a sample request message with a corresponding sample response message.

Submitted data for the IPR transaction request consists of:

<MerchantID> = Reporting username (required)
<TerminalID> = your terminal ID, assigned by the Gateway Provider (optional)
<Password> = Reporting Password (required)
<TransactionType> = Specify credit, ach or token (required)
<TransactionStartTime> = Start time of transactions to be downloaded
<TransactionEndTime> = (required) End time of transactions to be downloaded (required)

Request Format

The following table shows the logical structure of the transaction request message. The Document Structure column lists the element name and its place in the message structure in order and indentation. The Qualifications column explains the conditions for supplying that element to a transaction. The condition column lists any conditions that apply to the element.

Request Element Definitions

The following properties describe the request transactions.

Response Format Overview

The following table describes the logical structure of the transaction response message, sent in response to an initiating transaction request message.

Response Element Definitions

1. ipTransID – Globally unique transaction ID that can be used in lieu of CardNum or ACH to recall the appropriate value from a prior transaction that has been run. Works with SALE, AUTHONLY, VOID, CREDIT, CHECK, REVERSAL& VOIDACH transactions.

2. Merchant_Name – Returned for all transactions.

3. Merchant_ID – Returned for all transactions. This ID is issued by the Gateway Provider Merchant Services when an account is set up with the merchant bank.

4. Terminal_ID – Returned for all transactions. This ID is issued by the Gateway Provider Merchant Services when an account is set up with the merchant bank.

5. Transaction_ID – Returned for all transactions. A unique 18-character value that identifies the transaction.

6. Request_Type – Returned for all transactions. Must be one of the following values: SALE, AUTHONLY, CAPT, VOID, FORCE, ENQ, CREDIT, CHECK, REVERSAL, VOIDACH, REVERSEAUTH, TOKENIZE, PARTIALREVERSAL, INCREMENTAL, PINGor ACK

7. Transaction_Type – The manner in which this transaction was communicated to the merchant. Possible values are 'INTERNET' (ecommerce merchants), 'POS' (retail merchants with magnetic cardreaders), 'RECURRING' (ecommerce and MOTO merchants), 'PHONEORDER' (MOTO merchants), and 'MAILORDER' (MOTO merchants). Value equals what was sent in the Origin tag.

8. Total_Amount – Purchase price to be transacted, including taxes and fees. The currency type assumed for the amount is dependent on the merchant. Value must be non-zero.

9. Fee_Amount – The surcharge applied to a transaction. The surcharge value within this element is assumed to be already included in TotalAmount.

10. Tax_Amount – Tax applied to a transaction. The tax value within this element is assumed to be already included in the total amount.

11. Auth_Code – An authorization code, six (6) alphanumeric characters long, returned by the issuing bank for credit card transactions.

12. ActionCode – The ActionCodeis three (3) characters. The ActionCode contains a '000' value to indicate that a transaction has been approved by the issuer bank. The ActionCodewill be some other value when either the issuer bank declines the transaction or if the server host detects an error. This is the same value as ActionCode returned in the IPPay XML.

13. Response_Text – Message from the server, describing to the ActionCode. Note that a '000' ActionCodemay have multiple ResponseTextvalues, including 'APPROVED', 'ACCEPTED', 'CAPTURES', and 'PING'. Other ActionCodeswill contain a ResponseTextvalue of 'DECLINED' or some similar phrase.

14. AuthDateTime – the time in which the transactions occurred. Return format is YYYY-MM-DD HH:MM:SS.

15. CardNum – Visa, Mastercard, JCB, Discover and American Express submitted for a transaction and is thirteen to nineteen digits long, depending on the type of the credit card. For PCI compliance reasons, tokens have been substituted for the actual submitted Visa, Mastercard, JCB, Discover and American Express number and expiration date. No other cardholder information is associated with the token.

Tokens are format preserving in the following respects:

16. AccountNumber – Used for ECHECK transactions. The account number of the target bank account

17. ABA – Used for ECHECK transactions. The nine-digit bank routing identifier for the target bank account.

18. CheckNumber – Used for ECHECK transactions. A numeric identifier for the banking transaction.

19. Token – See above. For credit card transactions, will be the same value as what is returned in CardNum. No other cardholder information is associated with the token. For ECHECK transactions, will return a value that can be used in place of an

ABA & Account number. Tokens are format preserving in the following respects:

20. AVS_Response – A code indicating that AVS ('Address Verification Service') results for a transaction. Refer to 'Appendix B' in this reference for an explanation of the valid result codes, 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'K', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'U', 'W', 'X', 'Y', and 'Z'.

21. AddressMatch – Code indicating the address match results for a credit card transaction. Returns 'Y', 'N', or 'X', where:

22. ZipMatch – Code indicating the postal code match results for a credit card transaction. Returns 'Y', 'N', or 'X', where:

23. CVV2 – The response code to a Visa CVV2 or a MasterCard CVC2 or an American Express CID submission. Refer to 'Appendix C' in this reference for a explanation of the valid result codes, 'M','N', 'P', 'S', and 'U'.

25. CardHolderName– The customer name, that is, the name of the cardholder.

27. City – Cardholder’s billing city

26. Address – Cardholder’s billing address

28. State – Cardholder’s billing state code abbreviation

29. Zip – Cardholder’s billing zip code

30. Country – Cardholder’s billing country, a valid ISO Country Code (consisting of either three alphabetic characters or three digits).

31. Phone – Cardholder’s billing telephone number

32. Email – Cardholder’s email address

33. UserIPAddr – Customer’s IP address

34. UserHost – Customer’s host name

35. OrderNumber – A string referencing an order. When dynamic descriptor functionality is enabled, the contents of this field shows up after the header on the cardholder statement.

36. UDField1 – User-defined field, available for reporting purposes. Utilized by the dynamic phone number feature when up to 15 digits (number, no dashes) are appended with a # sign.

37. UDField2 – User-defined field

38. UDField3 – User-defined field

39. CustomerPO – The cardholder’s purchase order number

40. ShippingMethod – The manner of delivering a purchase to the recipient. One of five shipping methods may be specified:

41. ShippingName – The name of the recipient of the order

42. ShippingAddr – The destination shipping address data

Request/Response Examples   

Credit  

Credit

Credit Request:

   <ippayReport>
      <MerchantID>MERCHANTID</MerchantID>
      <Password>PASSWORD</Password>
      <TransactionRange>
         <TransactionType>credit</TransactionType>
         <TransactionStartTime>2019-01-29T16:40:00</TransactionStartTime>
         <TransactionEndTime>2019-01-29T16:45:59</TransactionEndTime>
      </TransactionRange>
   </ippayReport>
var httpClient = new HttpClient();
var bodyXmlString = @"<ippayReport>
" + "\n" +
@"     <MerchantID>TRANS0000002703SDD</MerchantID>
" + "\n" +
@"     <Password>T7UE7adpx8</Password>
" + "\n" +
@"     <TransactionRange>
" + "\n" +
@"          <TransactionType>credit</TransactionType>
" + "\n" +
@"          <TransactionStartTime>2019-01-29T16:40:00</TransactionStartTime>
" + "\n" +
@"          <TransactionEndTime>2019-01-29T16:45:59</TransactionEndTime>
" + "\n" +
@"     </TransactionRange>
" + "\n" +
@" <ippayReport>";

var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://rpt-test.ippay.com/ippayReport/", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://rpt-test.ippay.com/ippayReport/',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '<ippayReport>\r\n     <MerchantID>TRANS0000002703SDD</MerchantID>\r\n     <Password>T7UE7adpx8</Password>\r\n     <TransactionRange>\r\n          <TransactionType>credit</TransactionType>\r\n          <TransactionStartTime>2019-01-29T16:40:00</TransactionStartTime>\r\n          <TransactionEndTime>2019-01-29T16:45:59</TransactionEndTime>\r\n     </TransactionRange>\r\n <ippayReport>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});

<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://rpt-test.ippay.com/ippayReport/');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('<ippayReport>
\n     <MerchantID>TRANS0000002703SDD</MerchantID>
\n     <Password>T7UE7adpx8</Password>
\n     <TransactionRange>
\n          <TransactionType>credit</TransactionType>
\n          <TransactionStartTime>2019-01-29T16:40:00</TransactionStartTime>
\n          <TransactionEndTime>2019-01-29T16:45:59</TransactionEndTime>
\n     </TransactionRange>
\n <ippayReport>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

Credit Response:

   <ippayResponse>
      <Transactions type="credit" run="2019-04-16 21:55:47"
         start="2019-01-29T16:40:00" end="2019-01-29T16:45:59" records="2">
         <Transaction>
            <Date>2019-01-29 16:41:35.0</Date>
            <ipTransID>00000000000000000086124999</ipTransID>
            <Merchant_Name>ABCLLC</Merchant_Name>
            <Merchant_ID>0000508999</Merchant_ID>
            <Terminal_ID>TESTTESTTEST</Terminal_ID>
            <Transaction_ID>A20195555524135440</Transaction_ID>
            <Request_Type>SALE</Request_Type>
            <Total_Amount>1.9000</Total_Amount>
            <Fee_Amount>0.0000</Fee_Amount>
            <Auth_Code>198772</Auth_Code>
            <ActionCode>000</ActionCode>
            <Response_Text>APPROVED</Response_Text>
            <CardNum>37G3555551K1006</CardNum>
            <Token>37G3555551K1006</Token>
            <AVS_Response></AVS_Response>
            <AddressMatch></AddressMatch>
            <ZipMatch></ZipMatch>
            <CVV2></CVV2>
            <CardHolderName>TEST</CardHolderName>
            <Address></Address>
            <City></City>
            <State></State>
            <Zip></Zip>
            <Country></Country>
            <Phone></Phone>
            <Email></Email>
            <UserIPAddr></UserIPAddr>
            <UserHost></UserHost>
            <OrderNumber></OrderNumber>
            <UD1></UD1>
            <UD2></UD2>
            <UD3></UD3>
            <CustomerPO></CustomerPO>
            <ShippingMethod></ShippingMethod>
            <ShippingName></ShippingName>
            <ShippingAddr></ShippingAddr>
            <alProcessorID>5727</alProcessorID>
            <altTerminalID></altTerminalID>
            <altMerchantID></altMerchantID>
            <FNA_AuthDate>2019-01-29</FNA_AuthDate>
            <FNA_AuthTime>17:41:36</FNA_AuthTime>
            <FNA_TransactionID>1549996093</FNA_TransactionID>
            <FNA_ResponseCode></FNA_ResponseCode>
            <FNA_RetRefNum>902999902572</FNA_RetRefNum>
            <CCProcessor>92999727</CCProcessor>
         </Transaction>
         <Transaction>
            <Date>2019-01-29 16:41:53.0</Date>
            <ipTransID>00000000000000000086124999</ipTransID>
            <Merchant_Name>ABCLLC</Merchant_Name>
            <Merchant_ID>0000508999</Merchant_ID>
            <Terminal_ID>TESTTESTTEST</Terminal_ID>
            <Transaction_ID>D20199999224153843</Transaction_ID>
            <Request_Type>SALE</Request_Type>
            <Total_Amount>2.5800</Total_Amount>
            <Fee_Amount>0.0000</Fee_Amount>
            <Auth_Code>128111</Auth_Code>
            <ActionCode>000</ActionCode>
            <Response_Text>APPROVED</Response_Text>
            <CardNum>37G3H555D1K1006</CardNum>
            <Token>37G3H555D1K1006</Token>
            <AVS_Response></AVS_Response>
            <AddressMatch></AddressMatch>
            <ZipMatch></ZipMatch>
            <CVV2></CVV2>
            <CardHolderName>TEST USER</CardHolderName>
            <Address></Address>
            <City></City>
            <State></State>
            <Zip></Zip>
            <Country></Country>
            <Phone></Phone>
            <Email></Email>
            <UserIPAddr></UserIPAddr>
            <UserHost></UserHost>
            <OrderNumber></OrderNumber>
            <UD1></UD1>
            <UD2></UD2>
            <UD3></UD3>
            <CustomerPO></CustomerPO>
            <ShippingMethod></ShippingMethod>
            <ShippingName></ShippingName>
            <ShippingAddr></ShippingAddr>
            <alProcessorID>5727</alProcessorID>
            <altTerminalID></altTerminalID>
            <altMerchantID></altMerchantID>
            <FNA_AuthDate>2019-01-29</FNA_AuthDate>
            <FNA_AuthTime>17:41:54</FNA_AuthTime>
            <FNA_TransactionID>1543336473</FNA_TransactionID>
            <FNA_ResponseCode></FNA_ResponseCode>
            <FNA_RetRefNum>902944403674</FNA_RetRefNum>
            <CCProcessor>92555727</CCProcessor>
         </Transaction>
      </Transactions>
   </ippayResponse>

ccsettlement

ccsettlement

ccsettlement request:

   <ippayReport>
      <MerchantID>MERCHANTID</MerchantID>
      <Password>PASSWORD</Password>
      <TransactionRange>
         <TransactionType>ccsettlement</TransactionType>
         <TransactionStartTime>2018-07-10T17:20:07</TransactionStartTime>
         <TransactionEndTime>2018-07-10T17:21:07</TransactionEndTime>
      </TransactionRange>
   </ippayReport>
var httpClient = new HttpClient();
var bodyXmlString =  @"<ippayReport>" + "\n" +
@"      <MerchantID>MERCHANTID</MerchantID>" + "\n" +
@"      <Password>PASSWORD</Password>" + "\n" +
@"      <TransactionRange>" + "\n" +
@"         <TransactionType>ccsettlement</TransactionType>" + "\n" +
@"         <TransactionStartTime>2018-07-10T17:20:07</TransactionStartTime>" + "\n" +
@"         <TransactionEndTime>2018-07-10T17:21:07</TransactionEndTime>" + "\n" +
@"      </TransactionRange>" + "\n" +
@"   </ippayReport>";

var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://rpt-test.ippay.com/ippayReport/", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://rpt-test.ippay.com/ippayReport/',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '   <ippayReport>\n      <MerchantID>MERCHANTID</MerchantID>\n      <Password>PASSWORD</Password>\n      <TransactionRange>\n         <TransactionType>ccsettlement</TransactionType>\n         <TransactionStartTime>2018-07-10T17:20:07</TransactionStartTime>\n         <TransactionEndTime>2018-07-10T17:21:07</TransactionEndTime>\n      </TransactionRange>\n   </ippayReport>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://rpt-test.ippay.com/ippayReport/');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('   <ippayReport>\n      <MerchantID>MERCHANTID</MerchantID>\n      <Password>PASSWORD</Password>\n      <TransactionRange>\n         <TransactionType>ccsettlement</TransactionType>\n         <TransactionStartTime>2018-07-10T17:20:07</TransactionStartTime>\n         <TransactionEndTime>2018-07-10T17:21:07</TransactionEndTime>\n      </TransactionRange>\n   </ippayReport>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

ccsettlement response:

   <ippayResponse>
      <Transactions type="ccsettlement" run="2019-03-26 16:04:31"
      start="2018-07-10T17:20:07" end="2018-07-10T17:21:07" records="1">
      <Transaction>
         <Date>2018-07-10 17:20:07</Date>
         <ipTransID>77033015</ipTransID>
         <Merchant_Name>ABCLLC</Merchant_Name>
         <Merchant_ID>admin</Merchant_ID>
         <Terminal_ID>ABC000000001</Terminal_ID>
         <Transaction_ID>F20180333222007707</Transaction_ID>
         <Request_Type>SALE</Request_Type>
         <Transaction_Type>I</Transaction_Type>
         <Total_Amount>695</Total_Amount>
         <Fee_Amount>0</Fee_Amount>
         <Tax_Amount>0</Tax_Amount>
         <Auth_Code>090518</Auth_Code>
         <ActionCode>000</ActionCode>
         <CardNum />
         <Token>4L1D6G44443K3672</Token>
         <AVS_Response />
         <CVV2 />
         <CardHolderName>JOHN SMITH</CardHolderName>
         <Address />
         <City />
         <State />
         <Zip />
         <Country />
         <Phone />
         <Email />
         <UD1 />
         <UD2 />
         <UD3 />
         <altTerminalID />
         <altMerchantID />
         <FNA_TransactionID />
         <ProcessorID>11</ProcessorID>
         <SettlementAmount>0</SettlementAmount>
         <SettlementID>0</SettlementID>
         <ApprovalStatus>APPROVED</ApprovalStatus>
         <CardType>V</CardType>
         <SafeCardNum />
         <BankTransID />
         <ExternalTransID />
         <RetrievalReferenceNumber>0</RetrievalReferenceNumber>
         </Transaction>
      </Transactions>
   </ippayResponse>

ccchargebacks

ccchargebacks

ccchargebacks request:

   <ippayReport>
      <MerchantID>MERCHANTID</MerchantID>
      <Password>PASSWORD</Password>
      <TransactionRange>
         <TransactionType>ccchargebacks</TransactionType>
         <TransactionStartTime>2019-04-11T12:00:07</TransactionStartTime>
         <TransactionEndTime>2019-04-11T19:21:07</TransactionEndTime>
      </TransactionRange>
   </ippayReport>
var httpClient = new HttpClient();
var bodyXmlString =  @"<ippayReport>" + "\n" +
@"      <MerchantID>MERCHANTID</MerchantID>" + "\n" +
@"      <Password>PASSWORD</Password>" + "\n" +
@"      <TransactionRange>" + "\n" +
@"         <TransactionType>ccchargebacks</TransactionType>" + "\n" +
@"         <TransactionStartTime>2019-04-11T12:00:07</TransactionStartTime>" + "\n" +
@"         <TransactionEndTime>2019-04-11T19:21:07</TransactionEndTime>" + "\n" +
@"      </TransactionRange>" + "\n" +
@"   </ippayReport>";

var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://rpt-test.ippay.com/ippayReport/", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://rpt-test.ippay.com/ippayReport/',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '   <ippayReport>\n      <MerchantID>MERCHANTID</MerchantID>\n      <Password>PASSWORD</Password>\n      <TransactionRange>\n         <TransactionType>ccchargebacks</TransactionType>\n         <TransactionStartTime>2019-04-11T12:00:07</TransactionStartTime>\n         <TransactionEndTime>2019-04-11T19:21:07</TransactionEndTime>\n      </TransactionRange>\n   </ippayReport>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://rpt-test.ippay.com/ippayReport/');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('   <ippayReport>\n      <MerchantID>MERCHANTID</MerchantID>\n      <Password>PASSWORD</Password>\n      <TransactionRange>\n         <TransactionType>ccchargebacks</TransactionType>\n         <TransactionStartTime>2019-04-11T12:00:07</TransactionStartTime>\n         <TransactionEndTime>2019-04-11T19:21:07</TransactionEndTime>\n      </TransactionRange>\n   </ippayReport>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

ccchargebacks response:

   <ippayResponse>
      <Transactions type="ccchargebacks" run="2019-04-12 20:42:22"
         start="2019-04-11T12:00:07" end="2019-04-11T19:21:07" records="7">
         <Transaction>
            <Merchant_ID>ABC0000000000001</Merchant_ID>
            <ImportDate>2019-04-11 12:01:17.184066</ImportDate>
            <CaseNumber>1234098022633.00</CaseNumber>
            <MerchantNumber>123045474001224</MerchantNumber>
            <CaseType>1</CaseType>
            <TranCode>05</TranCode>
            <ReasonDesc>Merchandise/Services Not Received</ReasonDesc>
            <CaseAmount>6.95</CaseAmount>
            <CardBrand>1</CardBrand>
            <DateTransaction>03082019</DateTransaction>
            <ImportDateTransaction>2019-03-08 00:00:00.0</ImportDateTransaction>
            <ImportDateLoaded>2019-04-06 00:00:00.0</ImportDateLoaded>
            <DateLoaded>462019 0</DateLoaded>
            <CardholderAccountNumber>
               411100XXXXXX1646
            </CardholderAccountNumber>
            <AccountNumberPrefix>411100</AccountNumberPrefix>
            <AccountNumberSuffix>1646</AccountNumberSuffix>
            <DBAName>XYZ LLC</DBAName>
            <MerchAmount>6.95</MerchAmount>
            <MatchedTransactionID>12387775</MatchedTransactionID>
            <MatchedDate>2019-04-11 12:01:44.0</MatchedDate>
            <DateUpdated>2019-04-11 12:01:44.192202</DateUpdated>
         </Transaction>
         <Transaction>
            <Merchant_ID>ABC0000000000001</Merchant_ID>
            <ImportDate>2019-04-11 12:01:17.184678</ImportDate>
            <CaseNumber>1234098025413.00</CaseNumber>
            <MerchantNumber>123045274001479</MerchantNumber>
            <CaseType>12</CaseType>
            <TranCode>06</TranCode>
            <ReasonDesc>Does Not Recognize</ReasonDesc>
            <CaseAmount>14.00</CaseAmount>
            <CardBrand>3</CardBrand>
            <DateTransaction>01072019</DateTransaction>
            <ImportDateTransaction>2019-01-07 00:00:00.0</ImportDateTransaction>
            <ImportDateLoaded>2019-04-05 00:00:00.0</ImportDateLoaded>
            <DateLoaded>452019 0</DateLoaded>
            <CardholderAccountNumber>
               411100XXXXXX5799
            </CardholderAccountNumber>
            <AccountNumberPrefix>411100</AccountNumberPrefix>
            <AccountNumberSuffix>5799</AccountNumberSuffix>
            <DBAName>ABC.COM</DBAName>
            <MerchAmount>14.00</MerchAmount>
            <MatchedTransactionID>12343863</MatchedTransactionID>
            <MatchedDate>2019-04-11 12:01:44.0</MatchedDate>
            <DateUpdated>2019-04-11 12:01:44.188308</DateUpdated>
         </Transaction>
      </Transactions>
   </ippayResponse>

ach

ach

ach request:

   <ippayReport>
      <MerchantID>MERCHANTID</MerchantID>
      <Password>PASSWORD</Password>
      <TransactionRange>
         <TransactionType>ach</TransactionType>
         <TransactionStartTime>2018-12-15T00:00:00</TransactionStartTime>
         <TransactionEndTime>2018-12-15T00:59:59</TransactionEndTime>
      </TransactionRange>
   </ippayReport>
var httpClient = new HttpClient();
var bodyXmlString = @"<ippayReport>" + "\n" +
@"      <MerchantID>MERCHANTID</MerchantID>" + "\n" +
@"      <Password>PASSWORD</Password>" + "\n" +
@"      <TransactionRange>" + "\n" +
@"         <TransactionType>ach</TransactionType>" + "\n" +
@"         <TransactionStartTime>2018-12-15T00:00:00</TransactionStartTime>" + "\n" +
@"         <TransactionEndTime>2018-12-15T00:59:59</TransactionEndTime>" + "\n" +
@"      </TransactionRange>" + "\n" +
@"   </ippayReport>";

var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://rpt-test.ippay.com/ippayReport/", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://rpt-test.ippay.com/ippayReport/',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '   <ippayReport>\n      <MerchantID>MERCHANTID</MerchantID>\n      <Password>PASSWORD</Password>\n      <TransactionRange>\n         <TransactionType>ach</TransactionType>\n         <TransactionStartTime>2018-12-15T00:00:00</TransactionStartTime>\n         <TransactionEndTime>2018-12-15T00:59:59</TransactionEndTime>\n      </TransactionRange>\n   </ippayReport>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://rpt-test.ippay.com/ippayReport/');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('   <ippayReport>\n      <MerchantID>MERCHANTID</MerchantID>\n      <Password>PASSWORD</Password>\n      <TransactionRange>\n         <TransactionType>ach</TransactionType>\n         <TransactionStartTime>2018-12-15T00:00:00</TransactionStartTime>\n         <TransactionEndTime>2018-12-15T00:59:59</TransactionEndTime>\n      </TransactionRange>\n   </ippayReport>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

ach response:

   <ippayResponse>
      <Transactions type="ach" run="2019-04-15 20:58:42" 
         start="2018-12-15T00:00:00"
         end="2018-12-15T00:59:59" records="2">
         <Transaction>
            <Date>2018-12-15 00:00:02.0</Date>
            <ipTransID>00000000000000000081238572</ipTransID>
            <Merchant_Name>ABC000000001</Merchant_Name>
            <Merchant_ID>ABC000000001</Merchant_ID>
            <Terminal_ID>ABC000000001</Terminal_ID>
            <Transaction_ID>B20185555060002940</Transaction_ID>
            <Request_Type>CHECK</Request_Type>
            <Total_Amount>20.0000</Total_Amount>
            <Fee_Amount>0.0000</Fee_Amount>
            <Auth_Code>000000</Auth_Code>
            <ActionCode>000</ActionCode>
            <Response_Text>CHECK ACCEPTED</Response_Text>
            <Token>J6M2J4B1B888J4B9B8565</Token>
            <CardHolderName>John Smith</CardHolderName>
            <Address></Address>
            <City></City>
            <State></State>
            <Zip></Zip>
            <Country></Country>
            <Phone></Phone>
            <Email></Email>
            <UserIPAddr></UserIPAddr>
            <UserHost></UserHost>
            <OrderNumber></OrderNumber>
            <UD1>Sonar</UD1>
            <UD2></UD2>
            <UD3></UD3>
            <alProcessorID>5716</alProcessorID>
            <altTerminalID></altTerminalID>
            <altMerchantID></altMerchantID>
            <FNA_AuthDate></FNA_AuthDate>
            <FNA_AuthTime></FNA_AuthTime>
            <FNA_TransactionID></FNA_TransactionID>
            <FNA_ResponseCode></FNA_ResponseCode>
            <FNA_RetRefNum></FNA_RetRefNum>
            <ACHProcessor>5716</ACHProcessor>
            <AccountNumber>454048593000632</AccountNumber>
            <ABA></ABA>
            <CheckNumber>15152</CheckNumber>
         </Transaction>
         <Transaction>
            <Date>2018-12-15 00:00:03.0</Date>
            <ipTransID>00000000000000000084112376</ipTransID>
            <Merchant_Name>ABC000000001</Merchant_Name>
            <Merchant_ID>ABC000000001</Merchant_ID>
            <Terminal_ID>ABC000000001</Terminal_ID>
            <Transaction_ID>G20181212340003957</Transaction_ID>
            <Request_Type>CHECK</Request_Type>
            <Total_Amount>40.0000</Total_Amount>
            <Fee_Amount>0.0000</Fee_Amount>
            <Auth_Code>000000</Auth_Code>
            <ActionCode>000</ActionCode>
            <Response_Text>CHECK ACCEPTED</Response_Text>
            <Token>F7F2F12346K3267</Token>
            <CardHolderName>Joe Schmoe</CardHolderName>
            <Address></Address>
            <City></City>
            <State></State>
            <Zip></Zip>
            <Country></Country>
            <Phone></Phone>
            <Email></Email>
            <UserIPAddr></UserIPAddr>
            <UserHost></UserHost>
            <OrderNumber></OrderNumber>
            <UD1>Sonar</UD1>
            <UD2></UD2>
            <UD3></UD3>
            <alProcessorID>5716</alProcessorID>
            <altTerminalID></altTerminalID>
            <altMerchantID></altMerchantID>
            <FNA_AuthDate></FNA_AuthDate>
            <FNA_AuthTime></FNA_AuthTime>
            <FNA_TransactionID></FNA_TransactionID>
            <FNA_ResponseCode></FNA_ResponseCode>
            <FNA_RetRefNum></FNA_RetRefNum>
            <ACHProcessor>5716</ACHProcessor>
            <AccountNumber>454012345000632</AccountNumber>
            <ABA></ABA>
            <CheckNumber>15053</CheckNumber>
         </Transaction>
      </Transactions>
   </ippayResponse>

achsettlement

achsettlement

achsettlement request:

   <ippayReport>
      <MerchantID>MERCHANTID</MerchantID>
      <Password>PASSWORD</Password>
      <TransactionRange>
         <TransactionType>achsettlement</TransactionType>
         <TransactionStartTime>2018-12-15T00:00:00</TransactionStartTime>
         <TransactionEndTime>2018-12-15T00:59:59</TransactionEndTime>
      </TransactionRange>
   </ippayReport>
var httpClient = new HttpClient();
var bodyXmlString = @"<ippayReport>" + "\n" +
@"      <MerchantID>MERCHANTID</MerchantID>" + "\n" +
@"      <Password>PASSWORD</Password>" + "\n" +
@"      <TransactionRange>" + "\n" +
@"         <TransactionType>achsettlement</TransactionType>" + "\n" +
@"         <TransactionStartTime>2018-12-15T00:00:00</TransactionStartTime>" + "\n" +
@"         <TransactionEndTime>2018-12-15T00:59:59</TransactionEndTime>" + "\n" +
@"      </TransactionRange>" + "\n" +
@"   </ippayReport>";

var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://rpt-test.ippay.com/ippayReport/", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://rpt-test.ippay.com/ippayReport/',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '   <ippayReport>\n      <MerchantID>MERCHANTID</MerchantID>\n      <Password>PASSWORD</Password>\n      <TransactionRange>\n         <TransactionType>achsettlement</TransactionType>\n         <TransactionStartTime>2018-12-15T00:00:00</TransactionStartTime>\n         <TransactionEndTime>2018-12-15T00:59:59</TransactionEndTime>\n      </TransactionRange>\n   </ippayReport>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://rpt-test.ippay.com/ippayReport/');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('   <ippayReport>\n      <MerchantID>MERCHANTID</MerchantID>\n      <Password>PASSWORD</Password>\n      <TransactionRange>\n         <TransactionType>achsettlement</TransactionType>\n         <TransactionStartTime>2018-12-15T00:00:00</TransactionStartTime>\n         <TransactionEndTime>2018-12-15T00:59:59</TransactionEndTime>\n      </TransactionRange>\n   </ippayReport>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

achsettlement response:

   <ippayResponse>
      <Transactions type="achsettlement" run="2019-04-15 21:04:15"
         start="2018-12-15T00:00:00" 
         end="2018-12-15T00:59:59" records="382">
         <Transaction>
            <Date>2018-12-15 00:00:02</Date>
            <ipTransID>84123572</ipTransID>
            <Merchant_Name>ABC000000001</Merchant_Name>
            <Merchant_ID>admin</Merchant_ID>
            <Terminal_ID>ABC000000001</Terminal_ID>
            <Transaction_ID>B20181234060002940</Transaction_ID>
            <Request_Type>CHECK</Request_Type>
            <Total_Amount>20</Total_Amount>
            <Fee_Amount>0</Fee_Amount>
            <ActionCode>000</ActionCode>
            <Response_Text>CHECK ACCEPTED</Response_Text>
            <Token>J6M2J4B1B12344B9B8565</Token>
            <CardHolderName>Joe Schmoe</CardHolderName>
            <Address></Address>
            <City></City>
            <State></State>
            <Zip></Zip>
            <Country></Country>
            <Phone></Phone>
            <Email></Email>
            <OrderNumber></OrderNumber>
            <UD1>Sonar</UD1>
            <UD2></UD2>
            <UD3></UD3>
            <ACHProcessor>5716</ACHProcessor>
            <ABA></ABA>
            <CheckNumber>25052</CheckNumber>
            <ProcessorID>0</ProcessorID>
            <SettlementDate>2018-12-17 06:00:00</SettlementDate>
            <CompletionAmount>0</CompletionAmount>
            <Invoice>4045212340632</Invoice>
         </Transaction>
         <Transaction>
            <Date>2018-12-15 00:00:03</Date>
            <ipTransID>84148576</ipTransID>
            <Merchant_Name>ABC000000001</Merchant_Name>
            <Merchant_ID>admin</Merchant_ID>
            <Terminal_ID>ABC000000001</Terminal_ID>
            <Transaction_ID>G20181123460003957</Transaction_ID>
            <Request_Type>CHECK</Request_Type>
            <Total_Amount>40</Total_Amount>
            <Fee_Amount>0</Fee_Amount>
            <ActionCode>000</ActionCode>
            <Response_Text>CHECK ACCEPTED</Response_Text>
            <Token>F7F21234E6K3267</Token>
            <CardHolderName>John Deer</CardHolderName>
            <Address></Address>
            <City></City>
            <State></State>
            <Zip></Zip>
            <Country></Country>
            <Phone></Phone>
            <Email></Email>
            <OrderNumber></OrderNumber>
            <UD1>Sonar</UD1>
            <UD2></UD2>
            <UD3></UD3>
            <ACHProcessor>5716</ACHProcessor>
            <ABA></ABA>
            <CheckNumber>15453</CheckNumber>
            <ProcessorID>0</ProcessorID>
            <SettlementDate>2018-12-17 06:00:00</SettlementDate>
            <CompletionAmount>0</CompletionAmount>
            <Invoice>4045212340632</Invoice>
         </Transaction>
      </Transactions>
   </ippayResponse>

achrejects

achrejects

achrejects request:

   <ippayReport>
      <MerchantID>MERCHANTID</MerchantID>
      <Password>PASSWORD</Password>
      <TransactionRange>
         <TransactionType>achrejects</TransactionType>
         <TransactionStartTime>2019-04-11T12:00:07</TransactionStartTime>
         <TransactionEndTime>2019-04-11T19:21:07</TransactionEndTime>
      </TransactionRange>
   </ippayReport>
var httpClient = new HttpClient();
var bodyXmlString = @"<ippayReport>" + "\n" +
@"      <MerchantID>MERCHANTID</MerchantID>" + "\n" +
@"      <Password>PASSWORD</Password>" + "\n" +
@"      <TransactionRange>" + "\n" +
@"         <TransactionType>achrejects</TransactionType>" + "\n" +
@"         <TransactionStartTime>2019-04-11T12:00:07</TransactionStartTime>" + "\n" +
@"         <TransactionEndTime>2019-04-11T19:21:07</TransactionEndTime>" + "\n" +
@"      </TransactionRange>" + "\n" +
@"   </ippayReport>";

var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://rpt-test.ippay.com/ippayReport/", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://rpt-test.ippay.com/ippayReport/',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '   <ippayReport>\n      <MerchantID>MERCHANTID</MerchantID>\n      <Password>PASSWORD</Password>\n      <TransactionRange>\n         <TransactionType>achrejects</TransactionType>\n         <TransactionStartTime>2019-04-11T12:00:07</TransactionStartTime>\n         <TransactionEndTime>2019-04-11T19:21:07</TransactionEndTime>\n      </TransactionRange>\n   </ippayReport>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://rpt-test.ippay.com/ippayReport/');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('   <ippayReport>\n      <MerchantID>MERCHANTID</MerchantID>\n      <Password>PASSWORD</Password>\n      <TransactionRange>\n         <TransactionType>achrejects</TransactionType>\n         <TransactionStartTime>2019-04-11T12:00:07</TransactionStartTime>\n         <TransactionEndTime>2019-04-11T19:21:07</TransactionEndTime>\n      </TransactionRange>\n   </ippayReport>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

achrejects response:

   <ippayResponse>
      <Transactions type="achrejects" run="2019-04-12 20:40:42"
         start="2019-04-11T12:00:07" 
         end="2019-04-11T19:21:07" records="21">
         <Transaction>
            <Date>2019-04-06 04:51:59</Date>
            <Status>R01</Status>
            <ipTransID>89446873</ipTransID>
            <Merchant_Name>ABC00000000000001</Merchant_Name>
            <Merchant_ID>ABC0000000000001</Merchant_ID>
            <Terminal_ID>ABC000000001</Terminal_ID>
            <Transaction_ID>060781234543600086</Transaction_ID>
            <Request_Type>CHECK</Request_Type>
            <Total_Amount>173</Total_Amount>
            <Fee_Amount>0</Fee_Amount>
            <ActionCode>000</ActionCode>
            <Response_Text>CHECK ACCEPTED</Response_Text>
            <Token>F1F6M0C123J64322</Token>
            <CardHolderName>John Deer</CardHolderName>
            <Address>123 Deer St.</Address>
            <City>Homeland</City>
            <State>TX</State>
            <Zip>76325</Zip>
            <Country />
            <Phone>555-555-7916</Phone>
            <Email>john@deer.com</Email>
            <OrderNumber>4712349</OrderNumber>
            <UD1 />
            <UD2>125345838</UD2>
            <UD3 />
            <ACHProcessor>12</ACHProcessor>
            <ABA />
            <CheckNumber>105</CheckNumber>
            <ProcessorID>0</ProcessorID>
            <CompletionDate>2019-04-11 19:30:01</CompletionDate>
            <CompletionAmount>173</CompletionAmount>
            </Transaction>
            <Transaction>
            <Date>2019-04-06 04:52:00</Date>
            <Status>R04</Status>
            <ipTransID>89446875</ipTransID>
            <Merchant_Name>ABC00000000000001</Merchant_Name>
            <Merchant_ID>ABC0000000000001</Merchant_ID>
            <Terminal_ID>ABC000000001</Terminal_ID>
            <Transaction_ID>060783123443600088</Transaction_ID>
            <Request_Type>CHECK</Request_Type>
            <Total_Amount>70</Total_Amount>
            <Fee_Amount>0</Fee_Amount>
            <ActionCode>000</ActionCode>
            <Response_Text>CHECK ACCEPTED</Response_Text>
            <Token>J9M51234F3M6698</Token>
            <CardHolderName>John Smith</CardHolderName>
            <Address>123 Smith Rd</Address>
            <City>Smithville</City>
            <State>TX</State>
            <Zip>33466</Zip>
            <Country />
            <Phone>5555556537</Phone>
            <Email>johnsmith@smith.com</Email>
            <OrderNumber>4435271</OrderNumber>
            <UD1 />
            <UD2>129032100</UD2>
            <UD3 />
            <ACHProcessor>12</ACHProcessor>
            <ABA />
            <CheckNumber>101</CheckNumber>
            <ProcessorID>0</ProcessorID>
            <CompletionDate>2019-04-11 19:30:01</CompletionDate>
            <CompletionAmount>70</CompletionAmount>
         </Transaction>
      </Transactions>
   </ippayResponse>

token

token

token request:

   <ippayReport>
      <MerchantID>MERCHANTID</MerchantID>
      <Password>PASSWORD</Password>
      <TransactionRange>
         <TransactionType>token</TransactionType>
         <TransactionStartTime>2018-12-15T00:00:00</TransactionStartTime>
         <TransactionEndTime>2018-12-15T23:59:59</TransactionEndTime>
      </TransactionRange>
   </ippayReport>
var httpClient = new HttpClient();
var bodyXmlString =  @"<ippayReport>" + "\n" +
@"      <MerchantID>MERCHANTID</MerchantID>" + "\n" +
@"      <Password>PASSWORD</Password>" + "\n" +
@"      <TransactionRange>" + "\n" +
@"         <TransactionType>token</TransactionType>" + "\n" +
@"         <TransactionStartTime>2018-12-15T00:00:00</TransactionStartTime>" + "\n" +
@"         <TransactionEndTime>2018-12-15T23:59:59</TransactionEndTime>" + "\n" +
@"      </TransactionRange>" + "\n" +
@"   </ippayReport>";

var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://rpt-test.ippay.com/ippayReport/", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://rpt-test.ippay.com/ippayReport/',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '   <ippayReport>\n      <MerchantID>MERCHANTID</MerchantID>\n      <Password>PASSWORD</Password>\n      <TransactionRange>\n         <TransactionType>token</TransactionType>\n         <TransactionStartTime>2018-12-15T00:00:00</TransactionStartTime>\n         <TransactionEndTime>2018-12-15T23:59:59</TransactionEndTime>\n      </TransactionRange>\n   </ippayReport>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://rpt-test.ippay.com/ippayReport/');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('   <ippayReport>\n      <MerchantID>MERCHANTID</MerchantID>\n      <Password>PASSWORD</Password>\n      <TransactionRange>\n         <TransactionType>token</TransactionType>\n         <TransactionStartTime>2018-12-15T00:00:00</TransactionStartTime>\n         <TransactionEndTime>2018-12-15T23:59:59</TransactionEndTime>\n      </TransactionRange>\n   </ippayReport>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

token response:

   <ippayResponse>
      <Transactions type="token" run="2019-04-15 20:45:43"
         start="2018-12-15T00:00:00" end="2018-12-15T23:59:59" records="2">
         <Transaction>
            <Date>2018-12-15 00:00:06.0</Date>
            <ipTransID>00000000000000000084123581</ipTransID>
            <Merchant_Name>ABC000000001</Merchant_Name>
            <Merchant_ID>ABC0000000000001</Merchant_ID>
            <Transaction_ID></Transaction_ID>
            <Request_Type>CREATE</Request_Type>
            <Token>52G5C14950L43543</Token>
            </Transaction>
            <Transaction>
            <Date>2018-12-15 00:00:13.0</Date>
            <ipTransID>00000000000000000084123617</ipTransID>
            <Merchant_Name>ABC000000001</Merchant_Name>
            <Merchant_ID>ABC0000000000001</Merchant_ID>
            <Transaction_ID></Transaction_ID>
            <Request_Type>CREATE</Request_Type>
            <Token>4A7B7E12353D7696</Token>
         </Transaction>
      </Transactions>
   </ippayResponse>

getAccountUpdaterActivity

getAccountUpdaterActivity

getAccountUpdaterActivity request:

   <ippayReport>
      <MerchantID>MERCHANTID</MerchantID>
      <Password>PASSWORD</Password>
      <TransactionRange>
         <TransactionType>getAccountUpdaterActivity</TransactionType>
         <TransactionStartTime>2019-04-11T12:00:07</TransactionStartTime>
         <TransactionEndTime>2019-04-11T19:21:07</TransactionEndTime>
      </TransactionRange>
   </ippayReport>
var httpClient = new HttpClient();
var bodyXmlString = @"<ippayReport>" + "\n" +
@"      <MerchantID>MERCHANTID</MerchantID>" + "\n" +
@"      <Password>PASSWORD</Password>" + "\n" +
@"      <TransactionRange>" + "\n" +
@"         <TransactionType>getAccountUpdaterActivity</TransactionType>" + "\n" +
@"         <TransactionStartTime>2019-04-11T12:00:07</TransactionStartTime>" + "\n" +
@"         <TransactionEndTime>2019-04-11T19:21:07</TransactionEndTime>" + "\n" +
@"      </TransactionRange>" + "\n" +
@"   </ippayReport>";

var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://rpt-test.ippay.com/ippayReport/", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://rpt-test.ippay.com/ippayReport/',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '   <ippayReport>\n      <MerchantID>MERCHANTID</MerchantID>\n      <Password>PASSWORD</Password>\n      <TransactionRange>\n         <TransactionType>getAccountUpdaterActivity</TransactionType>\n         <TransactionStartTime>2019-04-11T12:00:07</TransactionStartTime>\n         <TransactionEndTime>2019-04-11T19:21:07</TransactionEndTime>\n      </TransactionRange>\n   </ippayReport>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://rpt-test.ippay.com/ippayReport/');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('   <ippayReport>\n      <MerchantID>MERCHANTID</MerchantID>\n      <Password>PASSWORD</Password>\n      <TransactionRange>\n         <TransactionType>getAccountUpdaterActivity</TransactionType>\n         <TransactionStartTime>2019-04-11T12:00:07</TransactionStartTime>\n         <TransactionEndTime>2019-04-11T19:21:07</TransactionEndTime>\n      </TransactionRange>\n   </ippayReport>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

getAccountUpdaterActivity response:

   <ippayResponse>
      <Transactions type="getAccountUpdaterActivity" run="2019-04-12 20:46:56"
         start="2019-04-11T19:20:13" end="2019-04-11T19:21:07" records="3">
         <Transaction>
            <Date>2019-04-11 19:20:13.314</Date>
            <OldCCNum>427088******8511</OldCCNum>
            <OldToken>4J3G1C8M1E8L8511</OldToken>
            <OldExpMonth>4</OldExpMonth>
            <OldExpYear>21</OldExpYear>
            <Status>0</Status>
            <Merchant_ID>0020092263</Merchant_ID>
            <ResponseCode>V</ResponseCode>
            <Customers>
            <Customer CustomerID="1200664" CustomerKey="895994098721342015"
            PaymentKey="690950150024975394" />
            <Customer CustomerID="1200665" CustomerKey="917845864110736611"
            PaymentKey="467723723878148538" />
            </Customers>
            </Transaction>
            <Transaction>
            <Date>2019-04-11 19:20:13.492</Date>
            <OldCCNum>400344******7422</OldCCNum>
            <NewCCNum>400344******8180</NewCCNum>
            <OldToken>4H3K4J8M1E7G7422</OldToken>
            <NewToken>4J3M1C7J1A6F8180</NewToken>
            <OldExpMonth>7</OldExpMonth>
            <OldExpYear>20</OldExpYear>
            <NewExpMonth>7</NewExpMonth>
            <NewExpYear>20</NewExpYear>
            <Status>2</Status>
            <Merchant_ID>0020092263</Merchant_ID>
            <ResponseCode>A</ResponseCode>
            <Customers>
            <Customer CustomerID="993500" CustomerKey="5323457"
            PaymentKey="267584893" />
            </Customers>
         </Transaction>
         <Transaction>
            <Date>2019-04-11 19:20:13.273</Date>
            <OldCCNum>425808******7749</OldCCNum>
            <OldToken>4M4L6M3J8A6D7749</OldToken>
            <OldExpMonth>3</OldExpMonth>
            <OldExpYear>23</OldExpYear>
            <Status>0</Status>
            <Merchant_ID>0020092263</Merchant_ID>
            <ResponseCode>V</ResponseCode>
            <Customers>
            <Customer CustomerID="1075459" CustomerKey="5820497"
            PaymentKey="309393562" />
            </Customers>
         </Transaction>
      </Transactions>
   </ippayResponse>

getAccountUpdaterPendingActivity

getAccountUpdaterPendingActivity

getAccountUpdaterPendingActivity request:

   <ippayReport>
      <MerchantID>MERCHANTID</MerchantID>
      <Password>PASSWORD</Password>
      <TransactionRange>
         <TransactionType>getAccountUpdaterPendingActivity</TransactionType>
         <TransactionStartTime>2019-04-18T00:00:00</TransactionStartTime>
         <TransactionEndTime>2019-04-18T23:59:59</TransactionEndTime>
      </TransactionRange>
   </ippayReport>
var httpClient = new HttpClient();
var bodyXmlString = @"<ippayReport>" + "\n" +
@"      <MerchantID>MERCHANTID</MerchantID>" + "\n" +
@"      <Password>PASSWORD</Password>" + "\n" +
@"      <TransactionRange>" + "\n" +
@"         <TransactionType>getAccountUpdaterPendingActivity</TransactionType>" + "\n" +
@"         <TransactionStartTime>2019-04-18T00:00:00</TransactionStartTime>" + "\n" +
@"         <TransactionEndTime>2019-04-18T23:59:59</TransactionEndTime>" + "\n" +
@"      </TransactionRange>" + "\n" +
@"   </ippayReport>";

var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://rpt-test.ippay.com/ippayReport/", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://rpt-test.ippay.com/ippayReport/',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '   <ippayReport>\n      <MerchantID>MERCHANTID</MerchantID>\n      <Password>PASSWORD</Password>\n      <TransactionRange>\n         <TransactionType>getAccountUpdaterPendingActivity</TransactionType>\n         <TransactionStartTime>2019-04-18T00:00:00</TransactionStartTime>\n         <TransactionEndTime>2019-04-18T23:59:59</TransactionEndTime>\n      </TransactionRange>\n   </ippayReport>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://rpt-test.ippay.com/ippayReport/');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('   <ippayReport>\n      <MerchantID>MERCHANTID</MerchantID>\n      <Password>PASSWORD</Password>\n      <TransactionRange>\n         <TransactionType>getAccountUpdaterPendingActivity</TransactionType>\n         <TransactionStartTime>2019-04-18T00:00:00</TransactionStartTime>\n         <TransactionEndTime>2019-04-18T23:59:59</TransactionEndTime>\n      </TransactionRange>\n   </ippayReport>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

getAccountUpdaterPendingActivity response:

   <ippayResponse>
      <PendingTransactions type="getAccountUpdaterPendingActivity"
         run="2019-04-18 16:00:30" start="2019-04-18T00:00:00" 
         end="2019-04-18T23:59:59"
         records="2">
         <PendingTransaction>
            <RequestDate>2019-04-18 10:58:45.911</RequestDate>
            <ScheduledDate>2019-04-18 12:29:05.0</ScheduledDate>
            <OldCCNum>402400******0364</OldCCNum>
            <OldToken>4J2D2E2H5J1G0364</OldToken>
            <OldExpMonth>4</OldExpMonth>
            <OldExpYear>19</OldExpYear>
         </PendingTransaction>
         <PendingTransaction>
            <RequestDate>2019-04-18 10:58:45.911</RequestDate>
            <ScheduledDate>2019-04-18 12:29:05.0</ScheduledDate>
            <OldCCNum>492981******5742</OldCCNum>
            <OldToken>4E4E6E3L8J4F5742</OldToken>
            <OldExpMonth>4</OldExpMonth>
            <OldExpYear>19</OldExpYear>
         </PendingTransaction>
      </PendingTransactions>
   </ippayResponse>

Credit Card Transaction Field Mappings

The following tree provides a data mapping guide of the transaction response message fields against their appropriate Credit Card XML Request and Response fields.

ECHECK Transaction Field Mappings

The following table provides a data mapping guide of the transaction response message fields against their appropriate Credit Card XML Request and Response fields.

AVS Result Codes

The Gateway Provider offers cardholder address verification through AVS, a system available widely throughout North America and much of Europe. With address verification, the merchant submits a customer’s address and postal code information in a transaction and the credit card issue verifies and validates the address information against their internal billing address data. The result code sent by an issuer advises the merchant of a customer’s billing integrity when completing the credit card transaction.

Visa and MasterCard both call this feature AVS, which stands for 'Address Verification Service.' American Express calls this feature AAV, which stands for 'Address Authentication and Verification.'

Almost all North American issuers support AVS using Visa and MasterCard association rules. According to these rules, an issuer compares the numeric digits within a cardholder’s address and postal information with their own stored billing information. All alphabetic information is ignored. The address and postal code match (or fail to match) and an AVS result code is generated by the issuer. This is returned to the merchant during an authorization.

American Express adds cardholder name matching to their AAV. A merchant can submit their customer’s name in addition to the billing address information and may receive a number of additional AVS result codes. Shipping address information may also be submitted in an Amex transaction, and additional result codes are anticipated from Amex in the future.

For most issuers, the AVS works independent of the action code. In other words, a transaction may be approved even though billing address information doesn’t match. Because transaction approval is independent of billing address integrity, it’s up to the merchant to decide the importance of correct billing address information when completing a sale. A merchant may simply allow a transaction to proceed, or a merchant might independently discontinue the sale in spite of an approval.

The Gateway Provider, based on the AVS result code, automatically fills the AddressMatchand ZipMatchelements. The possible AddressMatch and ZipMatch values are 'Y', 'N', or 'X', and the value is determined with the AVS result code.

The Gateway Provider offers an 'Automatic AVS Rejection' feature, where merchants may automatically decline transactions showing degraded AVS results. Automatic AVS Rejection is an optional service that requires a merchant to subscribe before the Gateway Provider will automatically reject transaction on behalf of the merchant.

AVS Result Description
A (all) Address matches, postal code absent or does not match. (All)
D (all) Street address and postal code match. CM Name incorrect, postal code matches. (Visa/MC) (Amex)
M (all) Street address and postal code match. CM Name, street address and postal code match. (Visa/MC) (Amex)
N (all) Neither address nor postal code matches. (All)
R (all) Retry (All)
S (all) AVS unavailable.
U (all) AVS unavailable. (All)
Z (Visa) W (MC/Amex) W was replaced by Z. Postal code matches, address absent or does not match. CM Name, street address and postal code are all incorrect. (Visa) (MC) (Amex)
Y (all) Street address and postal code match. (All)
Z (all) Postal code matches, address absent or does not match. (All)
B (Visa/MC) E
(Amex)
Street address match. Postal code has invalid format.
CM Name incorrect. Street address and postal code match.
(Visa/MC)
(Amex)
(Visa/MC)
K (Amex)
Street address and postal code have invalid formats. CM Name matches. (Visa/MC)
(Amex
G (Visa/MC)
L (Amex)
Non-AVS participant outside U.S. Address not verified.
CM Name and postal code match.
(Visa/MC)
(Amex)
I (Visa/MC) O (Amex) Street address not verified for international transaction. CM Name and address match. (Visa/MC)
(Amex)
P (Visa/MC)

F (Amex)
Postal code match. Street address has invalid format.
CM Name incorrect. Street address matches.
(Visa/MC)

(Amex)
X (Visa/MC) Nine-digit postal code match in U.S. Postal code and address match for outside U.S. (Visa/MC)
F (Visa) Street address and postal code match for U.K. only (Visa)

CVV2 Result Codes

The Gateway Provider enables credit card validation through the CVV2 feature, a system widely supported throughout the credit card industry. With this feature, every physical credit card has a three- or four-digit value imprinted on the credit card in addition to the card number. Submitting this three- or four-digit “security code” enhances fraud detection for a transaction, ensuring that a genuine physical credit card is present during that transaction.

Visa cards have a three-digit CVV2 value, MasterCard cards have a three-digit CVC2 value, and American Express uses a four-digit CID value to enable card validation. This three- or four- digit value is found imprinted on the back side of a credit card, usually inside the signature block (it may also be imprinted on the front side of the card).

Participation in CVV2/CVC2 is optional for issuers. The subscribing issuers submit their CVV2/CVC2 keys to Visa and MasterCard, and these keys are kept secret. The individual CVV2/CVC2 implementation policies of the tens of thousands of issuers are confidential, and issuers may changes their internal CVV2/CVC2 policies without notification. Statistics are unavailable as to how many issuers subscriber (or don’t subscribe) to CVV2/CVC2.

Issuers may decide to return a '806' action code, indicating that a Visa issuer has declined a transaction due to the submission of an invalid CVV2 value. The '806' action code (a response allowed under Visa’s association rules) enables issuers to independently decide a policy of rejecting transactions having invalid CVV2 values. An '806' action code may have a 'N' or 'U' or 'P' response, but never an 'M' response.

Another factor that may affect CVV2 result codes is stand-in processing. When Visa or MasterCard performs stand-in processing for an issuer (because the issuer is otherwise unable to respond directly for a transaction), Visa/MC will perform the CVV2 calculations on behalf of any issuers who subscribe to CVV2.

Reporting Service Fraud Transaction States

Sample IPR response:

   <Transaction>
      <Date>2021-04-05 13:04:43.0</Date>
      <vfeState>Held for Risk Review</vfeState>
      <vfeQueuedOn>04/05/21 13:04:35</vfeQueuedOn>
      <vfeCreatedOn>04/05/21 13:04:35</vfeCreatedOn>
      <ipTransID>00000000000000000025850568</ipTransID>
      <Merchant_Name>TESTMERCHANT</Merchant_Name>
      <Merchant_ID>TESTMID0001</Merchant_ID>
      <Terminal_ID>TESTTERMINAL</Terminal_ID>
      <Transaction_ID>596371983083161987</Transaction_ID>
   </Transaction>

In addition to ENQ, you may also use the IPR environment to determine the state of a transaction held in or deleted by Risk. If you are not already integrated to the IPR environment and are interested in being so, please contact the Gateway Provider to get started.

IPR can provide even more detail about the transaction’s state; not only can the transaction’s present state be determined, but IPR is able to show historical states with time stamps.

The following IPR fields are now available:

vfeState → 'Held for Risk Review', 'Queued', 'Success', 'Failed', 'Deleted'
vfeQueuedOn → dd/MM/yy HH:mm:ss
vfeCreatedOn → dd/MM/yy HH:mm:ss
vfeReleasedOn → dd/MM/yy HH:mm:ss
vfeDeletedOn → dd/MM/yy HH:mm:ss

Fields that do not become relevant to a transaction, depending on its individual workflow, will not be given a time stamp. Relevant time stamps will be made available as the transaction passes through that state. The state of a transaction is expected to evolve until it reaches its eventual end state of Success (Released and Approved by issuer), Failed (Released and Declined by issuer) or Deleted (Deleted by Risk, will not process). Due to this, you may need to query IPR multiple times until the transaction reaches the end of its individual evolution.

    ACCOUNT UPDATER

Account Updater

This service let's the merchant request IPPay to get updated Card Numbers when a stored card is out of date. There are many reasons a consumer's credit card can become out of date from Issuers switching between Visa and Mastercard to fraud from some past transactions to the card expiring. Now with Account Updater from IPPay many of these cards can be updated automatically so you do not have to go back to the card holder for an update and your continuity billing or saved card can still drive revenue.

Obtaining updates request:

<ippayReport>
   <MerchantID>AUTEST00000001</MerchantID>
   <Password>!@#AUTEST00000001$%^</Password>
   <TransactionRange>
      <TransactionType>getAccountUpdaterActivity</TransactionType>
      <TransactionStartTime>2019-01-01T00:00:00</TransactionStartTime>
      <TransactionEndTime>2025-01-01T00:00:00</TransactionEndTime>
   </TransactionRange>
</ippayReport>
var httpClient = new HttpClient();
var bodyXmlString = @"<ippayReport>" + "\n" +
@"   <MerchantID>AUTEST00000001</MerchantID>" + "\n" +
@"   <Password>!@#AUTEST00000001$%^</Password>" + "\n" +
@"   <TransactionRange>" + "\n" +
@"      <TransactionType>getAccountUpdaterActivity</TransactionType>" + "\n" +
@"      <TransactionStartTime>2019-01-01T00:00:00</TransactionStartTime>" + "\n" +
@"      <TransactionEndTime>2025-01-01T00:00:00</TransactionEndTime>" + "\n" +
@"   </TransactionRange>" + "\n" +
@"</ippayReport>";

var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://rpt-test.ippay.com/ippayReport/", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://rpt-test.ippay.com/ippayReport',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '<ippayReport>\n   <MerchantID>AUTEST00000001</MerchantID>\n   <Password>!@#AUTEST00000001$%^</Password>\n   <TransactionRange>\n      <TransactionType>getAccountUpdaterActivity</TransactionType>\n      <TransactionStartTime>2019-01-01T00:00:00</TransactionStartTime>\n      <TransactionEndTime>2025-01-01T00:00:00</TransactionEndTime>\n   </TransactionRange>\n</ippayReport>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://rpt-test.ippay.com/ippayReport');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('<ippayReport>\n   <MerchantID>AUTEST00000001</MerchantID>\n   <Password>!@#AUTEST00000001$%^</Password>\n   <TransactionRange>\n      <TransactionType>getAccountUpdaterActivity</TransactionType>\n      <TransactionStartTime>2019-01-01T00:00:00</TransactionStartTime>\n      <TransactionEndTime>2025-01-01T00:00:00</TransactionEndTime>\n   </TransactionRange>\n</ippayReport>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

Obtaining updates response:

<ippayResponse>
   <Transactions type="getAccountUpdaterActivity" run="2019-04-17 14:25:23" start="2019-
   01-01T00:00:00" end="2025-01-01T00:00:00" records="7">
      <Transaction>
         <Date>2019-04-17 08:05:13.352</Date>
         <OldCCNum>402400******0364</OldCCNum>
         <OldToken>4J2D2E2H5J1G0364</OldToken>
         <OldExpMonth>4</OldExpMonth>
         <OldExpYear>19</OldExpYear>
         <Status>0</Status>
         <ResponseCode>Q</ResponseCode>
      </Transaction>
      <Transaction>
         <Date>2019-04-17 00:34:31.235</Date>
         <OldCCNum>402400******6549</OldCCNum>
         <OldToken>4L2D2K4H2J4A6549</OldToken>
         <OldExpMonth>4</OldExpMonth>
         <OldExpYear>19</OldExpYear>
         <Status>0</Status>
         <ResponseCode>N</ResponseCode>
      </Transaction>
      <Transaction>
         <Date>2019-04-17 00:34:30.683</Date>
         <OldCCNum>438965******5942</OldCCNum>
         <NewCCNum>481566******9407</NewCCNum>
         <OldToken>4B1G0K3G7M7L5942</OldToken>
         <NewToken>4F7D4L4G1E2H9407</NewToken>
         <OldExpMonth>4</OldExpMonth>
         <OldExpYear>19</OldExpYear>
         <NewExpMonth>4</NewExpMonth>
         <NewExpYear>22</NewExpYear>
         <Status>2</Status>
         <ResponseCode>A</ResponseCode>
      </Transaction>
      <Transaction>
         <Date>2019-04-17 00:34:30.995</Date>
         <OldCCNum>471661******7820</OldCCNum>
         <OldToken>4E4F6D1D6K3H7820</OldToken>
         <OldExpMonth>4</OldExpMonth>
         <OldExpYear>19</OldExpYear>
         <Status>0</Status>
         <ResponseCode>P</ResponseCode>
      </Transaction>
      <Transaction>
         <Date>2019-04-17 00:34:30.431</Date>
         <OldCCNum>491630******5725</OldCCNum>
         <OldToken>4H1C8A1H2D5M5725</OldToken>
         <OldExpMonth>4</OldExpMonth>
         <OldExpYear>19</OldExpYear>
         <NewExpMonth>4</NewExpMonth>
         <NewExpYear>22</NewExpYear>
         <Status>1</Status>
         <ResponseCode>E</ResponseCode>
      </Transaction>
      <Transaction>
         <Date>2019-04-17 00:34:30.83</Date>
         <OldCCNum>491652******5531</OldCCNum>
         <OldToken>4C8B4G7B4K6G5531</OldToken>
         <OldExpMonth>4</OldExpMonth>
         <OldExpYear>19</OldExpYear>
         <Status>0</Status>
         <ResponseCode>C</ResponseCode>
      </Transaction>
      <Transaction>
         <Date>2019-04-17 08:05:13.433</Date>
         <OldCCNum>492981******5742</OldCCNum>
         <OldToken>4E4E6E3L8J4F5742</OldToken>
         <OldExpMonth>4</OldExpMonth>
         <OldExpYear>19</OldExpYear>
         <Status>0</Status>
         <ResponseCode>V</ResponseCode>
      </Transaction>
   </Transactions>
</ippayResponse>

Obtaining queued request:

<ippayReport>
   <MerchantID>AUTEST00000001</MerchantID>
   <Password>!@#AUTEST00000001$%^</Password>
   <TransactionRange>
      <TransactionType>getAccountUpdaterPendingActivity</TransactionType>
      <TransactionStartTime>2019-01-01T00:00:00</TransactionStartTime>
      <TransactionEndTime>2025-01-01T00:00:00</TransactionEndTime>
   </TransactionRange>
</ippayReport>
var httpClient = new HttpClient();
var bodyXmlString = @"<ippayReport>" + "\n" +
@"   <MerchantID>AUTEST00000001</MerchantID>" + "\n" +
@"   <Password>!@#AUTEST00000001$%^</Password>" + "\n" +
@"   <TransactionRange>" + "\n" +
@"      <TransactionType>getAccountUpdaterPendingActivity</TransactionType>" + "\n" +
@"      <TransactionStartTime>2019-01-01T00:00:00</TransactionStartTime>" + "\n" +
@"      <TransactionEndTime>2025-01-01T00:00:00</TransactionEndTime>" + "\n" +
@"   </TransactionRange>" + "\n" +
@"</ippayReport>";

var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://rpt-test.ippay.com/ippayReport/", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://rpt-test.ippay.com/ippayReport',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '<ippayReport>\n   <MerchantID>AUTEST00000001</MerchantID>\n   <Password>!@#AUTEST00000001$%^</Password>\n   <TransactionRange>\n      <TransactionType>getAccountUpdaterPendingActivity</TransactionType>\n      <TransactionStartTime>2019-01-01T00:00:00</TransactionStartTime>\n      <TransactionEndTime>2025-01-01T00:00:00</TransactionEndTime>\n   </TransactionRange>\n</ippayReport>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://rpt-test.ippay.com/ippayReport');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('<ippayReport>\n   <MerchantID>AUTEST00000001</MerchantID>\n   <Password>!@#AUTEST00000001$%^</Password>\n   <TransactionRange>\n      <TransactionType>getAccountUpdaterPendingActivity</TransactionType>\n      <TransactionStartTime>2019-01-01T00:00:00</TransactionStartTime>\n      <TransactionEndTime>2025-01-01T00:00:00</TransactionEndTime>\n   </TransactionRange>\n</ippayReport>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

Obtaining queued response:

<ippayResponse>
   <PendingTransactions type="getAccountUpdaterPendingActivity" run="2018-12-17 23:45:10"
   start="2018-12-15T00:00:00" end="2018-12-15T23:59:59" records="7">
      <PendingTransaction>
         <RequestDate>2018-12-16 16:53:22.367</RequestDate>
         <ScheduledDate>2018-07-02 23:02:02.22</ScheduledDate>
         <OldCCNum>483482******9740</OldCCNum>
         <OldToken>4H6G3B7B6M3K9740</OldToken>
         <OldExpMonth>4</OldExpMonth>
         <OldExpYear>20</OldExpYear>
         <Customer>
            <CustomerID>991586</CustomerID>
            <CustomerKey>5309839</CustomerKey>
            <PaymentKey>266368517</PaymentKey>
         </Customer>
      </PendingTransaction>
      <PendingTransaction>
         <RequestDate>2018-12-16 16:53:16.438</RequestDate>
         <ScheduledDate>2018-07-02 23:02:02.22</ScheduledDate>
         <OldCCNum>472520******9477</OldCCNum>
         <OldToken>4C5D7F8F8L6G9477</OldToken>
         <OldExpMonth>9</OldExpMonth>
         <OldExpYear>18</OldExpYear>
         <Customer>
            <CustomerID>1090980</CustomerID>
            <CustomerKey>5888208</CustomerKey>
            <PaymentKey>314271184</PaymentKey>
         </Customer>
      </PendingTransaction>
      <PendingTransaction>
         <RequestDate>2018-12-16 16:53:18.229</RequestDate>
         <ScheduledDate>2018-07-02 23:02:02.22</ScheduledDate>
         <OldCCNum>481582******3106</OldCCNum>
         <OldToken>4J5A9K8B7E8C3106</OldToken>
         <OldExpMonth>10</OldExpMonth>
         <OldExpYear>21</OldExpYear>
         <Customer>
            <CustomerID>1112607</CustomerID>
            <CustomerKey>5944187</CustomerKey>
            <PaymentKey>318397085</PaymentKey>
         </Customer>
      </PendingTransaction>
   </PendingTransactions>
</ippayResponse>

The goal of the account updated emulator is to provide merchants the ability to test the various use cases that the account updater process produces. The account updater process in production runs daily by submitting a set of card numbers to a backend process under two circumstances: (a) if the card in question experienced a decline in the past 24 hours that indicate and issue that could be resolved by an update and (b) if the card is expiring in the near future (typically a month).

The account updated emulator is pre-populated with (fake) generated card numbers that are tied to specific updater return codes. These card numbers are tied to MerchantIDs. This data is provided in a separate document.

For testing purposes, the 24 hour window for submissions is set to 1 hour. Every hour on the hour, the emulator will 'submit' data to an emulated backend process that will respond based on the pre-populated data. The test data includes card numbers that cover every return code that the updater process can return; this includes card number updates.

For the emulator, a nightly job runs that resets all the account updater activity by deleting all the activity data so that the card data provided for testing purposes can continue to be reused. This means that you cannot expect to see results beyond a 24 hour period.

The reporting API will provide the results of the account updater process, the results of which fall into two categories: (a) updates and (b) queued requests. Updater requests that fail will be retried. In the emulator, retires will occur four (4) times, once an hour as the failures are resubmitted to the emulated backend process.

Reporting API

The reporting API URL that should be used for testing the account updater emulator is:
https://rpt-test.ippay.com/ippayReport

    FRAUD DEFLECT

This service allows provided enhanced access to Fraud Deflect, IPPays anti-fraud and chargeback prevention partner. With FraudDeflect you can not only intercept chargebacks before they happen and issue a refund, you can even collaborate with the card issuers while they are talking to the consumer in the call center. By providing transaction details such as shopping card, IP Address, Device Fingerprint, customer account, email address and many more fields you can help the issuer save your sale and even have an ability, for 10.4/Fraud disputes, block them with Visa Compelling Evidence 3.0. This API gives you extended abilities to stop chargebacks and save sales! Instantly lower your chargeback rate and increase your average lifetime value all by just passing more details about each transaction.

CE3.0

These are the fields we highly recommend be sent for each transaction:

    Palm Beach Platform

HL Method Types

Securexchange server base url: https://transactions.test.secureexchange.net/

Web Service Web Method Usage Detail Input/Output Descriptions Reference
admin/ws/recurring.asmx ManageCustomer To add update customer and associated details in HL. Used in admin portal, client portal and various jobs. 11.6 Process Recurrin ManageCustomer Overview
admin/ws/recurring.asmx ManageCreditCardInfo To add update credit card details. Used in admin portal and client portal. 11.4 Process Recurring ManageCreditCardInfo Overview
admin/ws/recurring.asmx InfoContract To retrive contract and associated credit card details from HL. Used in admin portal, client portal and batch jobs. 9.3 Process InfoContract Overview
admin/ws/recurring.asmx ProcessCreditCard To perform a charge using already exsiting credit card in HL. Application will be passing HL credit card key to identify the card to be charged. Used in admin portal and batch jobs. 10.5 ProcessCreditCard Recurring Billing Overview
SmartPayments/transact.asmx ProcessCreditCard To perform sale and return transactions. During intial sale transactions card information is included and for returns HL transaction key is included to identify the exact trasnaction that needs to be refunded. 3.4 ProcessCreditCard Introduction.
admin/ws/recurring.asmx AddRecurringCreditCard To add customer, contract and credit card information during first sale. Method is used n admin portal and allows application perform multiple tasks of adding customer, contract and credit card information in a single method call. 10.3 Process AddRecurringCreditCard Overview
admin/ws/trxdetail.asmx GetCardTrx To retrive transaction data for a given period. Used in various jobs to retrieve HL transactions. 2.3. GetCardTrx Overview
SmartPayments/validate.asmx ValidCard To validate credit card. Used in admin portal and client portal. 8.3 Process ValidCard Overview
SmartPayments/validate.asmx ValidExpDate To validate credit card expiery date. Used in admin portal and client portal. 8.5 Process ValidExpDate Overview

HL Method Calls

Required? (YES/NO) HL Method Type HL Method Type URL HL Method Call Name HL Method Call URL
No Recurring https://transactions.test.secureexchange.net/admin/ws/recurring.asmx AddRecurringCheck https://transactions.test.secureexchange.net/admin/ws/recurring.asmx?op=AddRecurringCheck
Yes Recurring https://transactions.test.secureexchange.net/admin/ws/recurring.asmx AddRecurringCreditCard https://transactions.test.secureexchange.net/admin/ws/recurring.asmx?op=AddRecurringCreditCard
Yes Recurring https://transactions.test.secureexchange.net/admin/ws/recurring.asmx InfoContract https://transactions.test.secureexchange.net/admin/ws/recurring.asmx?op=InfoContract
No Recurring https://transactions.test.secureexchange.net/admin/ws/recurring.asmx ManageCheckInfo https://transactions.test.secureexchange.net/admin/ws/recurring.asmx?op=ManageCheckInfo
Yes Recurring https://transactions.test.secureexchange.net/admin/ws/recurring.asmx ManageContract https://transactions.test.secureexchange.net/admin/ws/recurring.asmx?op=ManageContract
No Recurring https://transactions.test.secureexchange.net/admin/ws/recurring.asmx ManageContractAddDaysToNextBillDt https://transactions.test.secureexchange.net/admin/ws/recurring.asmx?op=ManageContractAddDaysToNextBillDt
Yes Recurring https://transactions.test.secureexchange.net/admin/ws/recurring.asmx ManageCreditCardInfo https://transactions.test.secureexchange.net/admin/ws/recurring.asmx?op=ManageCreditCardInfo
Yes Recurring https://transactions.test.secureexchange.net/admin/ws/recurring.asmx ManageCustomer https://transactions.test.secureexchange.net/admin/ws/recurring.asmx?op=ManageCustomer
No Recurring https://transactions.test.secureexchange.net/admin/ws/recurring.asmx ProcessCheck https://transactions.test.secureexchange.net/admin/ws/recurring.asmx?op=ProcessCheck
Yes Recurring https://transactions.test.secureexchange.net/admin/ws/recurring.asmx ProcessCreditCard https://transactions.test.secureexchange.net/admin/ws/recurring.asmx?op=ProcessCreditCard
No Transact https://transactions.test.secureexchange.net/SmartPayments/transact.asmx GetInfo https://transactions.test.secureexchange.net/SmartPayments/transact.asmx?op=GetInfo
No Transact https://transactions.test.secureexchange.net/SmartPayments/transact.asmx ProcessCheck https://transactions.test.secureexchange.net/SmartPayments/transact.asmx?op=ProcessCheck
Yes Transact https://transactions.test.secureexchange.net/SmartPayments/transact.asmx ProcessCreditCard https://transactions.test.secureexchange.net/SmartPayments/transact.asmx?op=ProcessCreditCard
No Transact https://transactions.test.secureexchange.net/SmartPayments/transact.asmx ProcessDebitCard https://transactions.test.secureexchange.net/SmartPayments/transact.asmx?op=ProcessDebitCard
No Transact https://transactions.test.secureexchange.net/SmartPayments/transact.asmx ProcessEBTCard https://transactions.test.secureexchange.net/SmartPayments/transact.asmx?op=ProcessEBTCard
No Transact https://transactions.test.secureexchange.net/SmartPayments/transact.asmx ProcessGiftCard https://transactions.test.secureexchange.net/SmartPayments/transact.asmx?op=ProcessGiftCard
No Transact https://transactions.test.secureexchange.net/SmartPayments/transact.asmx ProcessLoyaltyCard https://transactions.test.secureexchange.net/SmartPayments/transact.asmx?op=ProcessLoyaltyCard
No Transact https://transactions.test.secureexchange.net/SmartPayments/transact.asmx ProcessSignature https://transactions.test.secureexchange.net/SmartPayments/transact.asmx?op=ProcessSignature
Yes Trxdetail https://transactions.test.secureexchange.net/admin/ws/trxdetail.asmx GetCardTrx https://transactions.test.secureexchange.net/admin/ws/trxdetail.asmx?op=GetCardTrx
No Trxdetail https://transactions.test.secureexchange.net/admin/ws/trxdetail.asmx GetCardTrxSummary https://transactions.test.secureexchange.net/admin/ws/trxdetail.asmx?op=GetCardTrxSummary
No Trxdetail https://transactions.test.secureexchange.net/admin/ws/trxdetail.asmx GetCheckTrx https://transactions.test.secureexchange.net/admin/ws/trxdetail.asmx?op=GetCheckTrx
No Trxdetail https://transactions.test.secureexchange.net/admin/ws/trxdetail.asmx GetOpenBatchSummary https://transactions.test.secureexchange.net/admin/ws/trxdetail.asmx?op=GetOpenBatchSummary
No Validate https://transactions.test.secureexchange.net/SmartPayments/validate.asmx GetCardType https://transactions.test.secureexchange.net/SmartPayments/validate.asmx?op=GetCardType
No Validate https://transactions.test.secureexchange.net/SmartPayments/validate.asmx GetNetworkID https://transactions.test.secureexchange.net/SmartPayments/validate.asmx?op=GetNetworkID
No Validate https://transactions.test.secureexchange.net/SmartPayments/validate.asmx IsCommercialCard https://transactions.test.secureexchange.net/SmartPayments/validate.asmx?op=IsCommercialCard
Yes Validate https://transactions.test.secureexchange.net/SmartPayments/validate.asmx ValidCard https://transactions.test.secureexchange.net/SmartPayments/validate.asmx?op=ValidCard
No Validate https://transactions.test.secureexchange.net/SmartPayments/validate.asmx ValidCardLength https://transactions.test.secureexchange.net/SmartPayments/validate.asmx?op=ValidCardLength
Yes Validate https://transactions.test.secureexchange.net/SmartPayments/validate.asmx ValidExpDate https://transactions.test.secureexchange.net/SmartPayments/validate.asmx?op=ValidExpDate
No Validate https://transactions.test.secureexchange.net/SmartPayments/validate.asmx ValidMod10 https://transactions.test.secureexchange.net/SmartPayments/validate.asmx?op=ValidMod10

ManageCustomer

ManageCustomer request example:

var dict = new Dictionary<string, string>();
dict.Add("UserName", "GoWirelessMoTo");
dict.Add("Password", "Test1234");
dict.Add("Vendor", "333");
dict.Add("TransType", "ADD");
dict.Add("CustomerKey", "10050");
dict.Add("CustomerID", "222500");
dict.Add("CustomerName", "John Smith");
dict.Add("FirstName", "John");
dict.Add("LastName", "Smith");
dict.Add("Title", "Customer");
dict.Add("Street1", "485 Main Street");
dict.Add("Street2", "No 123");
dict.Add("City", "Atlanta");
dict.Add("StateID", "GA");
dict.Add("Zip", "40586");
dict.Add("CountryID", "USA");
dict.Add("DayPhone", "9998889999");
dict.Add("NightPhone", "9998889999");
dict.Add("Fax", "9998889123");
dict.Add("Email", "john.smith@gmail.com");
dict.Add("Mobile", "8885756987");

var httpClient = new HttpClient();

var req = new HttpRequestMessage(HttpMethod.Get, "https://transactions.test.secureexchange.net/admin/ws/recurring.asmx") { Content = new FormUrlEncodedContent(dict) };
var respone = await httpClient.SendAsync(req);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'GET',
  'url': 'https://transactions.test.secureexchange.net/admin/ws/recurring.asmx/ManageCustomer?Username=GoWirelessMoTo&Password=Test1234&TransType=333&CustomerKey=ADD&CustomerID=222500&CustomerName=John Smith&FirstName=Smith&LastName=John &Title=Customer&Street1=485 Main Street&City=Atlanta&StateID=GA&Zip=40586&CountryID=USA&DayPhone=9998889999&NightPhone=9998889999&Fax=9998889123&Email=john.smith@gmail.com&Mobile=8885756987',
  'headers': {
  }
};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});

<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://transactions.test.secureexchange.net/admin/ws/recurring.asmx/ManageCustomer?Username=GoWirelessMoTo&Password=Test1234&TransType=333&CustomerKey=ADD&CustomerID=222500&CustomerName=John Smith&FirstName=Smith&LastName=John &Title=Customer&Street1=485 Main Street&City=Atlanta&StateID=GA&Zip=40586&CountryID=USA&DayPhone=9998889999&NightPhone=9998889999&Fax=9998889123&Email=john.smith@gmail.com&Mobile=8885756987');
$request->setMethod(HTTP_Request2::METHOD_GET);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

HL Service:
https://transactions.test.secureexchange.net/admin/ws/recurring.asmx

HL Method Name:
ManageCustomer

Description:
Add /Update customer

Areas Used In GRIP:
Create B2B policy,Transfer policy,Update customer

HL Inputs Used In GRIP Type Description Sample Value
Username Yes String The username of the admin user GoWirelessMoTo
Password Yes String The password of the admin user Test1234
Vendor Yes String The numerical vendor\merchant key 333
TransType Yes String Transaction type ADD
CustomerKey Yes String The numerical customer key. 10050
CustomerID Yes String A merchant supplied unique identifier for customer.Policy ID used in GRIP 222500
CustomerName Yes String The Customer's name John Smith
FirstName Yes String The Customer's first name John
LastName Yes String The Customer's last name Smith
Title Yes String The Customer's Title Customer
Department No String
Street1 Yes String The Customer's street 1 485 Main Street
Street2 Yes String The Customer's street 2 No 123
Street3 No String The Customer's street 3
City Yes String The customer's city Atlanta
StateID Yes String The customer's 2 characters State Code GA
Province No String
Zip Yes String The customer's zip code if in USA, postal code if outside of USA 40586
CountryID Yes String The customer's 3 characters country code USA
DayPhone Yes String The customer's day phone 9998889999
NightPhone Yes String The customer's evening phone 9998889999
Fax Yes String The customer's fax 9998889123
Email Yes String The customer's email address john.smith@gmail.com
Mobile Yes String The customer's mobile phone 8885756987
Status No String Status of contract
ExtData No String Extended Data
HL Outputs Used In GRIP Type Description Sample Values
Code Yes string Result code Ok
Error Yes string Description of the error Ok,avnomatch
CustomerKey Yes string The numerical Unique key to identify customer 10050
ContractKey No string The unique key for a contract.
CcinfoKey No string A unique key to identify a credit card
CheckInfoKey No String Check Payment Info Key
Partner No string The reseller of the merchant
Vendor No string The merchant key
Username No string The admin user
Result No string Payment transaction result
AuthCode No string Authorization code for payment transaction
PnRef No string Unique reference number for the payment transaction
Message No string Description of the payment transaction

MenageContract

MenageContract request example:

var dict = new Dictionary<string, string>();
dict.Add("UserName", "GoWirelessMoTo");
dict.Add("Password", "Test1234");
dict.Add("TransType", "ADD");
dict.Add("Vendor", "333");
dict.Add("CustomerKey", "124634");
dict.Add("ContractKey", "13136");
dict.Add("PaymentInfoKey", "12213");
dict.Add("PaymentType", "45646");
dict.Add("CustomerId", "13212");
dict.Add("CustomerName", "John Smith");
dict.Add("FirstName", "John");
dict.Add("LastName", "Smith");
dict.Add("Title", "Customer");
dict.Add("Street1", "485 Main Street");
dict.Add("Street2", "No 123");
dict.Add("City", "Atlanta");
dict.Add("StateId (StateAbbr)", "GA");
dict.Add("ZipCode", "40586");
dict.Add("CountryId(USA)", "USA");
dict.Add("DayPhone", "9998889999");
dict.Add("NightPhone", "9998889999");
dict.Add("Fax", "9998882239");
dict.Add("Email", "abs@gmail.com");
dict.Add("Mobile", "8885756923");
dict.Add("ContractId", "13212");
dict.Add("ContractName", "John Smith");
dict.Add("BillAmt", "8,99");
dict.Add("TaxAmt", "0,55");
dict.Add("TotalAmt", "9,54");
dict.Add("StartDate", "1/2/2015");
dict.Add("EndDate", "1/2/2016");
dict.Add("NextBillDt", "7/2/2015");
dict.Add("BillingPeriod", "Month");
dict.Add("BillingInterval", "1");
dict.Add("MaxFailures", "2");
dict.Add("FailureInterval", "1");
dict.Add("Status", "ACTIVE");
dict.Add("ExtData", "<PONum>456985</PONum>");

var httpClient = new HttpClient();

var req = new HttpRequestMessage(HttpMethod.Get, "https://transactions.test.secureexchange.net/admin/ws/recurring.asmx") { Content = new FormUrlEncodedContent(dict) };
var respone = await httpClient.SendAsync(req);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'GET',
  'url': 'https://transactions.test.secureexchange.net/admin/ws/recurring.asmx/ManageContract?Username=GoWirelessMoTo&Password=Test1234&TransType=333&CustomerKey=ADD&CustomerID=222500&CustomerName=John Smith&FirstName=Smith&LastName=John &Title=Customer&Street1=485 Main Street&City=Atlanta&StateID=GA&Zip=40586&CountryID=USA&DayPhone=9998889999&NightPhone=9998889999&Fax=9998889123&Email=john.smith@gmail.com&Mobile=8885756987&BillAmt=8.99&TaxAmt=0.55&TotalAmt=9.54&StartDate=01/02/2015&EndDate=01/02/2016&NextBillDt=07/02/2015&BillingPeriod=Month&BillingInterval=1&MaxFailures=2&FailureInterval=1&Status=ACTIVE&ExtData=\'<PONum>456985</PONum>\'&BillingInterval=1&MaxFailures=2&FailureInterval=1',
  'headers': {
  }
};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});

<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://transactions.test.secureexchange.net/admin/ws/recurring.asmx/ManageContract?Username=GoWirelessMoTo&Password=Test1234&TransType=333&CustomerKey=ADD&CustomerID=222500&CustomerName=John Smith&FirstName=Smith&LastName=John &Title=Customer&Street1=485 Main Street&City=Atlanta&StateID=GA&Zip=40586&CountryID=USA&DayPhone=9998889999&NightPhone=9998889999&Fax=9998889123&Email=john.smith@gmail.com&Mobile=8885756987&BillAmt=8.99&TaxAmt=0.55&TotalAmt=9.54&StartDate=01/02/2015&EndDate=01/02/2016&NextBillDt=07/02/2015&BillingPeriod=Month&BillingInterval=1&MaxFailures=2&FailureInterval=1&Status=ACTIVE&ExtData=\'<PONum>456985</PONum>\'&BillingInterval=1&MaxFailures=2&FailureInterval=1');
$request->setMethod(HTTP_Request2::METHOD_GET);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

HL Service:
https://transactions.test.secureexchange.net/admin/ws/recurring.asmx

HL Method Name:
ManageContract

Description:
Add /Update contract

Areas Used In GRIP:
Two claim limit auto policy cancellation,Edit Model,ESN Change form,Policy charge now,Create B2B policy,Next Billing Date change,Phone upgrade,Cancel policy,Update annual policy autorenewal,Reactivate policy,Create policy

HL Inputs Used In GRIP Type Description Sample Value
Username Yes String The username of the admin user GoWirelessMoTo
Password Yes String The password of the admin user Test1234
Vendor Yes String The numerical vendor\merchant key 333
TransactionType Yes string Transaction type ADD
CustomerKey Yes string The numerical customer key. 124634
ContractKey Yes string The unique key for a contract. 13136
PaymentInfoKey Yes string The unique key for a credit card 12213
PaymentType Yes string The nuemrical ccinfokey 45646
CustomerId Yes string A merchant supplied unique identifier for customer 13212
CustomerName Yes string The Customer's name John Smith
FirstName Yes string The Customer's first name John
LastName Yes string The Customer's last name Smith
Title Yes string The Customer's Title Customer
Department No string
Street1 Yes string The Customer's street 1 485 Main Street
Street2 Yes string The Customer's street 2 No 123
Street3 No string The Customer's street 3
City Yes string The customer's city Atlanta
StateId (StateAbbr) Yes string The customer's 2 characters State Code GA
Province(Empty) No string
ZipCode Yes string The customer's zip code if in USA, postal code if outside of USA 40586
CountryId(USA) Yes string The customer's 3 characters country code USA
Email Yes string The customer's email address abs@gmail.com
DayPhone Yes string The customer's day phone 9998889999
NightPhone Yes string The customer's evening phone 9998889999
Fax Yes string The customer's fax 9998882239
Mobile Yes string The customer's mobile phone 8885756923
ContractId Yes string A merchant supplied unique identifier for the contract.Policy ID used in GRIP 13212
ContractName Yes string Customer name John Smith
BillAmt Yes string Amount to be billed 8.99
TaxAmt Yes string Tax amount 0.55
TotalAmt Yes string Total of bill amount and tac amount 9.54
StartDate Yes string The start date of the contract 1/2/2015
EndDate Yes string The end date of the contract 1/2/2016
NextBillDt Yes string The next billing date 7/2/2015
BillingPeriod Yes string The billing period type. Month
BillingInterval Yes string Number of times charge within the billing period. 1
MaxFailures Yes string Numebr of times sytem wait after each retry 2
FailureInterval Yes string Number of days the system will wait after each retry when the payment fails 1
EmailCustomer No string TRUE/FALSE - Whether to email the customer
regarding the status of the recurring payment.
EmailMerchant No string TRUE/FALSE - Whether to email the merchant regarding the status of the recurring payment.
EmailCustomerFailure No string TRUE/FALSE - Whether to email the customer when the recurring payment fails
EmailMerchantFailure No string TRUE/FALSE - Whether to email the merchant when the recurring payment fails
Status Yes string Status of the contract ACTIVE
ExtData Yes string Extended data <PONum>456985</PONum>
HL Outputs Used In GRIP Type Description Values
Code Yes string Result code Ok
Error Yes string Description of the error Ok,avnomatch
CustomerKey No string A unique key to identify a customer
ContractKey Yes string The unique key for a contract. 13136
CcinfoKey No string A unique key to identify a credit card
Partner No string The reseller of the merchant
Vendor No string The merchant key
Username No string The admin user
Result No string Payment transaction result
AuthCode No string Authorization code for payment transaction
PnRef No string Unique reference number for the payment transaction
Message No string Description of the payment transaction

MenageCreditCardInfo

MenageCreditCardInfo request example:

var dict = new Dictionary<string, string>();
dict.Add("UserName", "GoWirelessMoTo");
dict.Add("Password", "Test1234");
dict.Add("TransType", "ADD");
dict.Add("Vendor", "333");
dict.Add("CustomerKey", "10050");
dict.Add("CardInfoKey", "99999");
dict.Add("CcAccountNum", "4012002000060010");
dict.Add("CcExpDate", "1209");
dict.Add("CcNameonCard", "John Smith");
dict.Add("CcStreet", "123 Main");
dict.Add("CcZip", "4490");

var httpClient = new HttpClient();

var req = new HttpRequestMessage(HttpMethod.Get, "https://transactions.test.secureexchange.net/admin/ws/recurring.asmx") { Content = new FormUrlEncodedContent(dict) };
var respone = await httpClient.SendAsync(req);
Console.WriteLine(response.Content);

var request = require('request');
var options = {
  'method': 'GET',
  'url': 'https://transactions.test.secureexchange.net/admin/ws/recurring.asmx/ManageCreditCardInfo?Username=GoWirelessMoTo&Password=Test1234&TransType=333&CustomerKey=ADD&CardInfoKey=99999&CcAccountNum=4012002000060010&CcExpDate=1209&CcNameonCard=John Smith&CcStreet=123 Main&CcZip=4490',
  'headers': {
  }
};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});

<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://transactions.test.secureexchange.net/admin/ws/recurring.asmx/ManageCreditCardInfo?Username=GoWirelessMoTo&Password=Test1234&TransType=333&CustomerKey=ADD&CardInfoKey=99999&CcAccountNum=4012002000060010&CcExpDate=1209&CcNameonCard=John Smith&CcStreet=123 Main&CcZip=4490');
$request->setMethod(HTTP_Request2::METHOD_GET);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

HL Service:
https://transactions.test.secureexchange.net/admin/ws/recurring.asmx

HL Method Name:
ManageCreditCardInfo

Description:
Add/Update Credit Card details

Areas Used In GRIP:
Update Credit Card Details, File a claim

HL Inputs Used In GRIP Type Description Sample Value
Username Yes String The username of the admin user GoWirelessMoTo
Password Yes String The password of the admin user Test1234
TransType Yes String Transaction type ADD
Vendor Yes String The numerical vendor\merchant key 333
CustomerKey Yes String The numerical customer key. 10050
CardInfoKey Yes String The numerical CardInfoKey. 99999
CcAccountNum Yes String The credit card account number. 4012002000060010
CcExpDate Yes String The credit card expiration date. 1209
CcNameonCard Yes String The name of the card holder. John Smith
CcStreet Yes String The card holder's billing address. 123 Main
CcZip Yes String The card holder's billing zip code. 4490
ExtData No String Extended Data.
HL Outputs Used In GRIP Type Description Values
Username No String The admin user
Partner No String The reseller of the merchant
Vendor No String The merchant key
CustomerKey No String Unique key to identify customer
CcInfoKey Yes String Credit Card Payment Info Key 123133
CheckInfoKey No String Check Payment Info Key
ContractKey No String Contract Key
code Yes String result code: 0 - success, error otherwise Ok
error Yes String description of the erorr Ok
Result No string Payment transaction result
AuthCode No string Authorization code for payment transaction
PnRef No string Unique reference number for the payment transaction
Message No string Description of the payment transaction

AddRecurringCreditCard

AddRecurringCreditCard request example:

var dict = new Dictionary<string, string>();
dict.Add("UserName", "GoWirelessMoTo");
dict.Add("Password", "Test1234");
dict.Add("Vendor", "333");
dict.Add("CustomerId", "12542");
dict.Add("CustomerName", "John Smith");
dict.Add("FirstName", "John");
dict.Add("LastName", "Smith");
dict.Add("Title", "Customer");
dict.Add("Street1", "485 Main Street");
dict.Add("Street2", "No 123");
dict.Add("City", "Atlanta");
dict.Add("StateId", "GA");
dict.Add("Zip ", "40586");
dict.Add("CountryId", "USA");
dict.Add("Email", "abs@gmail.com");
dict.Add("DayPhone", "9998889999");
dict.Add("Fax", "9998889977");
dict.Add("Mobile", "9998889996");
dict.Add("ContractId", "13212");
dict.Add("ContractName", "John Smith");
dict.Add("BillAmt", "8,99");
dict.Add("TaxAmt", "0,55");
dict.Add("TotalAmt", "9,54");
dict.Add("StartDate", "1/2/2015");
dict.Add("EndDate", "1/2/2016");
dict.Add("NextBillDt", "7/2/2015");
dict.Add("BillingPeriod", "Month");
dict.Add("BillingInterval", "1");
dict.Add("MaxFailures", "2");
dict.Add("FailureInterval", "1");
dict.Add("CcAccountNum", "4012002000060010");
dict.Add("CcExpDate", "1209");
dict.Add("CcNameOnCard ", "John Smith");
dict.Add("CcStreet", "No 123");
dict.Add("CcZip ", "4490");
dict.Add("ExtData ", "<PONum>785496</PONum>");

var httpClient = new HttpClient();

var req = new HttpRequestMessage(HttpMethod.Get, "https://transactions.test.secureexchange.net/admin/ws/recurring.asmx") { Content = new FormUrlEncodedContent(dict) };
var respone = await httpClient.SendAsync(req);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'GET',
  'url': 'https://transactions.test.secureexchange.net/admin/ws/recurring.asmx/AddRecurringCreditCard?Username=GoWirelessMoTo&Password=Test1234&TransType=333&CustomerKey=ADD&CustomerID=222500&CustomerName=John Smith&BillAmt=8.99&TaxAmt=0.55&TotalAmt=9.54&StartDate=1/2/2015&EndDate=1/2/2016&BillingPeriod=Month&BillingInterval=1 &MaxFailures=2&FailureInterval=1&CcAccountNum=4012002000060010&CcExpDate=1209&CcNameOnCard= John Smith&CcStreet=123 Main&CcZip=4490&ExtData=\'<PONum>785496</PONum>\'&FirstName=Smith&LastName=John &Title=Customer&Street1=485 Main Street&City=Atlanta&StateID=GA&Zip=40586&CountryID=USA&DayPhone=9998889999&NightPhone=9998889999&Fax=9998889123&Email=john.smith@gmail.com&Mobile=8885756987',
  'headers': {
  }
};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});

<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://transactions.test.secureexchange.net/admin/ws/recurring.asmx/AddRecurringCreditCard?Username=GoWirelessMoTo&Password=Test1234&TransType=333&CustomerKey=ADD&CustomerID=222500&CustomerName=John Smith&BillAmt=8.99&TaxAmt=0.55&TotalAmt=9.54&StartDate=1/2/2015&EndDate=1/2/2016&BillingPeriod=Month&BillingInterval=1 &MaxFailures=2&FailureInterval=1&CcAccountNum=4012002000060010&CcExpDate=1209&CcNameOnCard= John Smith&CcStreet=123 Main&CcZip=4490&ExtData=\'<PONum>785496</PONum>\'&FirstName=Smith&LastName=John &Title=Customer&Street1=485 Main Street&City=Atlanta&StateID=GA&Zip=40586&CountryID=USA&DayPhone=9998889999&NightPhone=9998889999&Fax=9998889123&Email=john.smith@gmail.com&Mobile=8885756987');
$request->setMethod(HTTP_Request2::METHOD_GET);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

HL Service:
https://transactions.test.secureexchange.net/admin/ws/recurring.asmx

HL Method Name:
AddRecurringCreditCard

Description:
Add customer, contract and credit card details

Areas Used In GRIP:
Phone upgrade,Create policy

HL Inputs Used In GRIP Type Description Sample Value
Username Yes String The username of the admin user GoWirelessMoTo
Password Yes String The password of the admin user Test1234
Vendor Yes String The numerical vendor\merchant key 333
CustomerID Yes String A merchant supplied unique identifier for the customer.Policy Id used in GRIP 12542
CustomerName Yes String The customer's name John Smith
FirstName Yes String The customer's first name John
LastName Yes String The customer's last name Smith
Title Yes String The customer's title Customer
Department No String The customer's department
Street1 Yes String The customer's street address 1 485 Main Street
Street2 Yes String The customer's street address 2 No 123
Street3 No String The customer's street address 3
City Yes String The customer's city Atlanta
StateID Yes String The customer's 2 characters State Code GA
Province No String The customer's province if it is outside of the USA
Zip Yes String The customer's zip code if in USA, postal code if outside of USA 40586
CountryID Yes String The customer's 3 characters country code USA
Email Yes String The customer's email address abs@gmail.com
DayPhone Yes String The customer's day phone 9998889999
Fax Yes String The customer's fax 9998889977
Mobile Yes String The customer's mobile phone 9998889996
ContractID Yes String The merchant supplied unique identifier for the contract 13212
ContractName Yes String The contract's name John Smith
BillAmt Yes String Bill amount 8.99
TaxAmt Yes String Tax amount 0.55
TotalAmt Yes String Total amount to be charged including tax 9.54
StartDate Yes String The start date of the contract 1/2/2015
EndDate Yes String The end date of the contract 1/2/2016
BillingPeriod Yes String The billing period type. Month
BillingInterval Yes String Number of times charge within the billing period. 1
MaxFailures Yes String numebr of times sytem wait after each each retry 2
FailureInterval Yes String Number of days the system will wait after each retry when the payment fails 1
EmailCustomer No String TRUE/FALSE - Whether to email the customer regarding the status of the recurring payment.
EmailMerchant No String TRUE/FALSE - Whether to email the merchant regarding the status of the recurring payment.
EmailCustomerFailure No String TRUE/FALSE - Whether to email the customer when the recurring payment fails
EmailMerchantFailure No String TRUE/FALSE - Whether to email the merchant when the recurring payment fails
CcAccountNum Yes String Credit Card Account Number 4012002000060010
CcExpDate Yes String Credit Card Expiration Date 1209
CcNameOnCard Yes String The Card Holder's name as it is on the card John Smith
CcStreet Yes String The Card Holder's billing address 123 Main
CcZip Yes String The Card Holder's billing zip code 4490
ExtData Yes String Extended Data <PONum>785496</PONum>
HL Outputs Used In GRIP Type Description Values
Username No String The admin user
Partner No String The reseller of the merchant
Vendor No String The merchant key
CustomerKey Yes String Customer Key
CcInfoKey Yes String Credit Card Payment Info Key 123133
CheckInfoKey No String Check Payment Info Key
ContractKey Yes String Contract Key
code Yes String result code: 0 - success, error otherwise Ok
error Yes String description of the erorr Ok
Result No string Payment transaction result
AuthCode No string Authorization code for payment transaction
PnRef No string Unique reference number for the payment transaction
Message No string Description of the payment transaction

ProcessCreditCard

ProcessCreditCard request example:

var dict = new Dictionary<string, string>();
dict.Add("UserName", "GoWirelessMoTo");
dict.Add("Password", "Test1234");
dict.Add("Vendor", "333");
dict.Add("CcInfoKey", "34543");
dict.Add("Amount", "8,99");
dict.Add("InvNum", "GW002563");
dict.Add("ExtData", "<CustomerID>456869</CustomerID>");

var httpClient = new HttpClient();

var req = new HttpRequestMessage(HttpMethod.Get, "https://transactions.test.secureexchange.net/admin/ws/recurring.asmx") { Content = new FormUrlEncodedContent(dict) };
var respone = await httpClient.SendAsync(req);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'GET',
  'url': 'https://transactions.test.secureexchange.net/admin/ws/recurring.asmx/ProcessCreditCard?Username=GoWirelessMoTo&Password=Test1234&Vendor=333&CcInfoKey=34543&Amount=8.99&InvNum=GW002563&ExtData=<CustomerID>456869</CustomerID>',
  'headers': {
  }
};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});

<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://transactions.test.secureexchange.net/admin/ws/recurring.asmx/ProcessCreditCard?Username=GoWirelessMoTo&Password=Test1234&Vendor=333&CcInfoKey=34543&Amount=8.99&InvNum=GW002563&ExtData=<CustomerID>456869</CustomerID>');
$request->setMethod(HTTP_Request2::METHOD_GET);
$request->setConfig(array(
  'follow_redirects' => TRUE
));

try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

HL Service:
https://transactions.test.secureexchange.net/admin/ws/recurring.asmx

HL Method Name:
ProcessCreditCard

Description: Do a charge using ccinfo key

Areas Used In GRIP:
Claim processing,Quick claim filling,Reactivate policy,Policy Charge now, Claim charge now,NBD Change,Edit Model,ESN Change form

HL Inputs Used In GRIP Type Description Sample Values
Username Yes String The username of the admin user GoWirelessMoTo
Password Yes String The password of the admin user Test1234
Vendor Yes String The numerical vendor\merchant key 333
CcInfoKey Yes String The unique key for a credit card 34543
Amount Yes String Amount to be charged 8.99
InvNum Yes String Associated in voice number. Policy or claim number used in GRIP GW002563
ExtData Yes String Extended data <CustomerID>456869</CustomerID>
HL Outputs Used In GRIP Type Description Values
Code No String Result code OK
Error Yes String Description of the error Approved
Result Yes String Payment result code Table1
Message Yes String Error message CONFLICTS WITH MAGDATA
AuthCode Yes String Auth Code Table2
PNRef Yes String Unique reference number for the payment transaction
Username No String The admin user
Partner No String The reseller of the merchant
Vendor No String The merchant key
CustomerKey No String Customer Key
CcInfoKey No String Credit Card Payment Info Key 123133
CheckInfoKey No String Check Payment Info Key
ContractKey No String Contract Key

Table 1

Result Description
1 User Authentication Failed
2 Invalid Transaction
3 Invalid Transaction Type
4 Invalid Amount
5 Invalid Merchant Information
7 IF Message contains "CONFLICTS WITH MAGDATA" The Magnetic Strip on the back of the credit card appears to be damaged or unreadable. Please attempt to swipe the card again or to use a different credit card. ELSE Field Format Error has been occurred.
8 Not a Transaction Server
9 Invalid Parameter Stream
10 Too many line items
11 This transaction could not be processed by Heartland. Please retry your transaction without changing any of the information.
12 This transaction has been declined. Please try a different credit card
13 A system error has been generated and the administrator has been notified. Please contact the helpdesk at 866-487-1222 x 4002 for more information
14 This transaction has been declined. Please try a different credit card.
19 The transaction ID for the refund could not be found. Please contact the helpdesk at 866-487-1222 x 4002 for more information.
20 The customer reference number in Heartland could not be found. Please contact the helpdesk at 866-487-1222 x 4002 for more information.
22,23 The credit card account information provided is not a valid credit card number. Please use a different credit card 24
25 The bank that has issued this credit card does not accept monthly recurring transactions. Please use a different credit card.
26,27,40,99 A system error has been generated and the administrator has been notified. Please contact the helpdesk at 866-487-1222 x 4002 for more information.
28 The name on the check is invalid. Please use a different account.
29 The check number on the check is invalid. Please use a different account.
30 The Driver's License provided for the check is invalid. Please use a different account.
50 This card has been declined due to insufficient funds. Please use a different credit card and retry this transaction 100,101,111
102, 103, 104, 105, 106, 109 The bank for this credit card could not be contacted. Please retry your transaction without changing any of the information.
107,110 This transaction has already been accepted by Heartland. The administrator has been notified that a possible exception has occured.
108 This transaction has been voided. Please retry your transaction without changing any of the information.
112 Address Validation Service has detected an error.
113 Heartland has rejected this transaction because we have exceeded our monthly volume with them. Please contact the helpdesk at 866-487-1222 x 4002 for more information.
1000, 1001, 1002,1003,1004, 1007, 1008,1011,1012 A system error has been occurred and the administrator has been notified. Please contact the helpdesk at 866-487-1222 x 4002 for more information.
1005, 1010 The bank that has issued this credit card does not accept monthly recurring transactions. Please use a different credit card.
1,006 The bank for this credit card could not be contacted. Please retry your transaction without changing any of the information.
1,013 A duplicate transaction has been detected.
Please contact the helpdesk at 866-487-1222 x 4002 for more information.
-100 This transaction could not be processed by Heartland. Please retry your transaction without changing any of the information.

Table2

AuthCode Description
5 Please process this card manually by typing the credit card number, expiration date and security code and retry this transaction. If this doesn't work, please try another credit card.
51 This card has been declined due to insufficient funds. Please use a different credit card and retry this transaction. 57
14 This transaction has been declined. Please try a different credit card.
N7 The credit card security code value provided is incorrect. Please check the security code and try again.

ProcessCreditCard-transact serv

HL Service:
https://transactions.test.secureexchange.net/SmartPayments/transact.asmx

HL Method Name:
ProcessCreditCard

Description:
Do a refund or sale

Areas Used In GRIP:
ChargeNow, Updating policy information, Policy refund

HL Inputs Used In GRIP Type Description Sample Value
UserName Yes String Rquired. UserName assigned in the payment server TestUserName
Password Yes String Required. Password assigned for the user name Test1234
TransType Yes String Rquired. Type of credit card transaction. Valid values are, Sale, Adjusment, Auth, Return, Void, Force, Capture, CaptureAll, RepeatSale, Reversal SALE
CardNum Yes String Optional except for these TransType's: Sale, Auth, Return, Force(ForceAuth).Credit card number to process the transaction. For all other transaction types the parameter needs to be included. 123456789
ExpDate Yes String Optional except for these TransType's: Sale, Auth, Return, Force(ForceAuth).Credit card's expiration date in MMYY format. For all the other transaction types the parameter needs to be included. 0615
MagData No String
NameOnCard Yes String Optional, depending on different merchant processor setups. The cardholder's name as it appears on the card. This parameter will remove invalid characters. Nick Knight
Amount Yes String Optional except for these TransType's: Sale, Auth, Return, Force(both PostAuth and ForceAuth). The total transaction amount in DDDD.CC format. 1000.00
InvNum Yes String Optional, Invoice tracking number. This parameter will remove invalid characters. 6533
PNRef Yes String Optional except for these TransType's: Void, Force(PostAuth), Capture. Reference number assigned by the payment server. 1111
Zip Yes String Optional, depending on different merchant processor setups. Cardhodler's billing zip code used in address verification. This parameter will remove invalid characters. 111
Street Yes String Optional, depending on different merchant processor setups. Cardhodler's billing street address used in address verification. This parameter will remove invalid characters. Park Place Lansdale
CVNum Yes String Optional. Card verification number 111
ExtData Yes String Extended Data in XML <CustomerID>2586</CustomerID><F
orce>T</Force><Presentation><Card
Present>False</CardPresent></Pres
entation>
HL Outputs Used In GRIP Type Description Values
RespMsg Yes String Approved
Result Yes int Table 1
AuthCode Yes String Table 2
PNRef Yes String 1111
GetAVSResult Yes String Table 3
GetCVResult Yes String Table 4
Message Yes String
Message1 No String
Message2 No String
HostCode No String
HostURL No String
GetAVSResulttXT No String
GetCVResultTXT No String
GetStreetMatchTXT No String
GetZipMatchTXT No String
GetGetOrigResult No String
GetCommercialCard No String
WorkingKey No String
KeyPointer No String
ExtData No String
TotalAuthorizedAmt No String
AvailableBalanceAmt No String
AuthSaleAmt No String
AuthTaxAmt No String
AuthTipAmt No String
AuthCashbackAmt No String

Table 1

Result Description
1 User Authentication Failed
2 Invalid Transaction
3 Invalid Transaction Type
4 Invalid Amount
5 Invalid Merchant Information
7 IF Message contains "CONFLICTS WITH MAGDATA" The Magnetic Strip on the back of the credit card appears to be damaged or unreadable. Please attempt to swipe the card again or to use a different credit card. ELSE Field Format Error has been occurred.
8 Not a Transaction Server
9 Invalid Parameter Stream
10 Too many line items
11 This transaction could not be processed by Heartland. Please retry your transaction without changing any of the information.
12 This transaction has been declined. Please try a different credit card
13 A system error has been generated and the administrator has been notified. Please contact the helpdesk at 866-487-1222 x 4002 for more information
14 This transaction has been declined. Please try a different credit card.
19 The transaction ID for the refund could not be found. Please contact the helpdesk at 866-487-1222 x 4002 for more information.
20 The customer reference number in Heartland could not be found. Please contact the helpdesk at 866-487-1222 x 4002 for more information.
22,23 The credit card account information provided is not a valid credit card number. Please use a different credit card.
24 The expiration date provided is invalid, please provide a credit card that has an expiration date that is at least one month later than today.
25 The bank that has issued this credit card does not accept monthly recurring transactions. Please use a different credit card.
26,27,40,99 A system error has been generated and the administrator has been notified. Please contact the helpdesk at 866-487-1222 x 4002 for more information.
28 The name on the check is invalid. Please use a different account.
29 The check number on the check is invalid. Please use a different account.
30 The Driver's License provided for the check is invalid. Please use a different account.
50 This card has been declined due to insufficient funds. Please use a different credit card and retry this transaction
100,101,111 This transaction could not be processed by Heartland. Please retry your transaction without changing any of the information.
102, 103, 104, 105, 106, 109 The bank for this credit card could not be contacted. Please retry your transaction without changing any of the information.
107,110 This transaction has already been accepted by Heartland. The administrator has been notified that a possible exception has occured.
108 This transaction has been voided. Please retry your transaction without changing any of the information.
112 Address Validation Service has detected an error.
113 Heartland has rejected this transaction because we have exceeded our monthly volume with them. Please contact the helpdesk at 866-487-1222 x 4002 for more information.
1000, 1001, 1002,1003,1004, 1007, 1008,1011,1012 A system error has been occurred and the administrator has been notified. Please contact the helpdesk at 866-487-1222 x 4002 for more information.
1005, 1010 The bank that has issued this credit card does not accept monthly recurring transactions. Please use a different credit card.
1,006 The bank for this credit card could not be contacted. Please retry your transaction without changing any of the information.
1,013 A duplicate transaction has been detected. Please contact the helpdesk at 866-487-1222 x 4002 for more information.
-100 This transaction could not be processed by Heartland. Please retry your transaction without changing any of the information.

Table 2

Result Description
5 Please process this card manually by typing the credit card number, expiration date and security code and retry this transaction. If this doesn't work, please try another credit card.
51 This card has been declined due to insufficient funds. Please use a different credit card and retry this transaction.
57 Please try this transaction again as a Manual Transaction by keying in the credit card number, expiration date and security code.
14 This transaction has been declined. Please try a different credit card.
N7 The credit card security code value provided is incorrect. Please check the security code and try again.

Table 3

Result Description
N The address does not match at all. Please re-enter the address information.
U Addrees inforamtion not available. Please re-enter the address information.
G Address information not available for international transaction. Please re-enter the address information.
S The credit card used does not support address verification. Please try a different credit card.
I The international credit card used does not support address verification. Please try a different credit card.
R The card has been declined, please ask the customer for another card and re-try.
E The card has been declined, please ask the customer for another card and re-try.
5 The card has been declined, please ask the customer for another card and re-try.
0 The card has been declined, please ask the customer for another card and re-try.

Table 4

Result Description
N This transaction has been denied because the three or four digit code on the back of the card is incorrect. Please check the number and try again.
P This transaction is not processed by the system.
S A system error has occured and the administrator has been notified. Please contact the helpdesk at 866-487-1222 x 4002 for more information.
U A system error has occured and the administrator has been notified. Please contact the helpdesk at 866-487-1222 x 4002 for more information.
X A system error has occured and the administrator has been notified. Please contact the helpdesk at 866-487-1222 x 4002 for more information.

ValidExpDate

ValidExpDate method request example:

var dict = new Dictionary<string, string>();
dict.Add("ExpDate", "0509");

var httpClient = new HttpClient();

var req = new HttpRequestMessage(HttpMethod.Get, "https://transactions.test.secureexchange.net/SmartPayments/validate.asmx") { Content = new FormUrlEncodedConten(dict) };
var respone = await httpClient.SendAsync(req);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'GET',
  'url': 'https://transactions.test.secureexchange.net/SmartPayments/validate.asmx/ValidExpDate?ExpDate=0509',
  'headers': {
  }
};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});

<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://transactions.test.secureexchange.net/SmartPayments/validate.asmx/ValidExpDate?ExpDate=0509');
$request->setMethod(HTTP_Request2::METHOD_GET);
$request->setConfig(array(
  'follow_redirects' => TRUE
));

try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

HL Service:
https://transactions.test.secureexchange.net/SmartPayments/validate.asmx

HL Method Name:
ValidExpDate

Description:
Validates the expiration date of a credit card

Areas Used In GRIP:
Validates claim credit card details

HL Inputs Used In GRIP Type Description Sample Value
ExpDate Yes String The expiration date of the credit card 0509
HL Outputs Used In GRIP Type Description Sample Value
ValidExpDateResult Yes Boolean TRUE

ValidCard

ValidCard method request example:

var dict = new Dictionary<string, string>();
dict.Add("ExpDate", "0509");
dict.Add("CardNumber", "4012002000060010");

var httpClient = new HttpClient();

var req = new HttpRequestMessage(HttpMethod.Get, "https://transactions.test.secureexchange.net/SmartPayments/validate.asmx") { Content = new FormUrlEncodedContent(dict) };
var respone = await httpClient.SendAsync(req);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'GET',
  'url': 'https://transactions.test.secureexchange.net/SmartPayments/validate.asmx/ValidCard?ExpDate=0509&CardNumber=4012002000060010',
  'headers': {
  }
};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});

<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://transactions.test.secureexchange.net/SmartPayments/validate.asmx/ValidCard?ExpDate=0509&CardNumber=4012002000060010');
$request->setMethod(HTTP_Request2::METHOD_GET);
$request->setConfig(array(
  'follow_redirects' => TRUE
));

try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

HL Service:
https://transactions.test.secureexchange.net/SmartPayments/validate.asmx

HL Method Name:
ValidCard

Description:
Validates the credit card

Areas Used In GRIP:
File a claim

HL Inputs Used In GRIP Type Description Sample Value
ExpDate Yes String The expiration date of the credit card 0509
CardNumber Yes String The number of the credit card 4012002000060010
HL Outputs Used In GRIP Type Description Values
ValidCardResponse Yes int Response code Table 1

Table 1

Code Description
0 Valid Card
1001 Invalid card number
1002 No Expiration date
1003 Invalid card type
1004 Invalid length
1005 Invalid card mod
1006 Invalid expiration date

InfoContract

InfoContract method request example:

var dict = new Dictionary<string, string>();
dict.Add("Username", "GoWirelessMoTo");
dict.Add("Password", "Test1234");
dict.Add("Vendor", "333");
dict.Add("CustomerKey", "10050");
dict.Add("ExtData", "<PONum>785496</PONum>");

var httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.Add("SOAPAction", "\"http://www.tpisoft.com/Admin/ws/AddRecurringCheck\"");
var req = new HttpRequestMessage(HttpMethod.Get, "https://transactions.test.secureexchange.net/admin/ws/recurring.asmx") { Content = new FormUrlEncodedContent(dict) };
var respone = await httpClient.SendAsync(req);
Console.WriteLine(response.Content);

var request = require('request');
var options = {
  'method': 'GET',
  'url': 'https://transactions.test.secureexchange.net/admin/ws/recurring.asmx/InfoContract?Username=GoWirelessMoTo&Password=Test1234&Vendor=333&CustomerKey=10050&ExtData=<PONum>785496</PONum>',
  'headers': {
    'Content-Type': 'text/xml; charset=utf-8',
    'SOAPAction': '"http://www.tpisoft.com/Admin/ws/AddRecurringCheck"'
  }
};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});

<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://transactions.test.secureexchange.net/admin/ws/recurring.asmx/InfoContract?Username=GoWirelessMoTo&Password=Test1234&Vendor=333&CustomerKey=10050&ExtData=<PONum>785496</PONum>');
$request->setMethod(HTTP_Request2::METHOD_GET);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'text/xml; charset=utf-8',
  'SOAPAction' => '"http://www.tpisoft.com/Admin/ws/AddRecurringCheck"'
));
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

HL Service:
https://transactions.test.secureexchange.net/admin/ws/recurring.asmx

HL Method Name:
InfoContract

Description:
Get contract and credit card details

Areas Used In GRIP:
AutoRenewAnualPolicies, CreateContractForIndividualPolicy, CancelPolicyForPhoneUpgrade, AddChildToExistingMaster, GetNextBillDate, ChangeNBD, ManageContractForAnnualPolicyRenewal, CreateNewPolicy, ManageContractForRefund, UpdatePolicyInformation, GetNonePaidCount, PriceIncreaseJob

HL Inputs Used In GRIP Type Description Sample Value
Username Yes String User name assigned in the payment server. GoWirelessMoTo
Password Yes String The password of the user. Test1234
Vendor Yes String The numerical Vendor/Merchant Key. 333
CustomerKey Yes String The numerical customer key. 10050
ExtData No String Extended Data.
HL Outputs Used In GRIP Type Description Values
code Yes String OK
City No String New York
Country No String USA
DayPhone No String
Department No String
Email No String SomeEmail@email.com
Fax No String
FirstName No String John
LastName No String Smith
Mobile No String 555-867-5309
NightPhone No String
Province No String
State No String NY
Street1 No String 111 Some st
Street2 No String
Street3 No String
Title No String
Zip No String 76001
AmountToDate No String 0.00
BillAmt Yes String 155.00
BillingInterval Yes String 1
BillingPeriod Yes String DAY
BillsToDate No String 0
ContractID Yes String Test1
ContractName Yes String Test1
CreatedDT Yes String 8/19/2011
DayOfWeek No String
EmailCustOnFailure No String F
EmailCustOnSuccess No String F
EmailMerchantOnFailure No String T
EmailMerchantOnSuccess No String T
EndDT Yes String 8/19/2012
FailurePeriod No String
FailureInterval Yes String 0
Failures No String 1
MaxAmt No String 0.00
MaxFailures Yes String 0
NextBillDT Yes String 40774
NumPayments No String 0
PaymentPref No String CC
StartDT Yes String 8/19/2011
Status Yes String 0
TaxAmt Yes String 0.00
TotalAmt Yes String 155
ContractKey Yes String 1756
CcType Yes String VISA
CcZip Yes String 75023
CcStreet Yes String 11 Some St
CcNameonCard Yes String John Smith
CcExpDate Yes String 1213
CcAccountNum Yes String ***********0016
CardInfoKey Yes String 132830

HL Settle File

HL Field Name Field Name Used In GRIP Description/Remarks Sample Value
TRX_HD_Key TRX_HD_Key Yes 1368089
Invoice_ID Invoice_ID Yes Should include 'RECUR' word to identify recurring transactions RECUR
Date_DT Date_DT Yes 42163.83852
Merchant_Key Merchant_Key Yes 333
Reseller_Key Reseller_Key Yes 100
Payment_Type_ID Payment_Type_ID Yes VISA
Trans_Type_ID Trans_Type_ID Yes Value should be 'Repeatsale' for recurring transactions Credit
Processor_ID Processor_ID Yes Heartland
TRX_Settle_Key TRX_Settle_Key Yes 1325384
Void_Flag_CH No Returns transaction is voided or not
Last_Update_DT Last_Update_DT Yes 42165.00295
TRX_Card_Key TRX_Card_Key Yes 1325384
Card_Info_Key Card_Info_Key Yes 762842
Auth_Amt_MN Auth_Amt_MN Yes 8.99
Tip_Amt_MN Tip_Amt_MN Yes 0
Total_Amt_MN Total_Amt_MN Yes 8.99
Cash_Back_Amt_MN Cash_Back_Amt_MN Yes 0
SureCharge_Amt_MN SureCharge_Amt_MN Yes 0
Account_Type_CH Account_Type_CH Yes VISA
Result_CH Result_CH Yes 0
Result_Txt_VC Result_Txt_VC Yes Value should be 'approval' for settle and unsettle transactions(not for declined transactions) APPROVAL
Approval_Code_CH Approval_Code_CH Yes 06857A
Host_Ref_Num_CH Host_Ref_Num_CH Yes 515911767003
AVS_Resp_CH AVS_Resp_CH Yes 0
AVS_Resp_Txt_VC No Returns the formatted message when Address verification is performed
CV_Resp_CH No Returnc card verification result code
CV_Resp_Txt_VC No Returns the formatted message when card verification is performed
Host_Date_CH Host_Date_CH Yes 60815
Host_Time_CH Host_Time_CH Yes 200728
Type_CH Type_CH Yes RepeatSale
Name_on_Card_VC Name_on_Card_VC Yes J. Smith
Street_CH Street_CH Yes Main Street
Manual Manual Yes TRUE
TRX_Receipt_Cnt TRX_Receipt_Cnt Yes 1
IP_VC No
CustomerID CustomerID Yes 905322
Orig_TRX_HD_Key No Returns the TRX_HD_Key on which the current transaction is based
Auth_Date_DT Auth_Date_DT Yes 42057.83882
Reversal_Flag_CH No
Contract_ID No
Contract_Key No
Next_Bill_DT No
Settle_Date_DT Settle_Date_DT Yes 42163.83852
TRX_Settle_Msg_VC TRX_Settle_Msg_VC Yes Should include 'ACCEPTED' word to identify settled transactions GB00763_ACCEPTED
Settle_Flag_CH Settle_Flag_CH Yes 1
Exp_CH Exp_CH Yes 1016

GetCardTrx

GetCardTrx. Retrieve transaction details:

var dict = new Dictionary<string, string>();
dict.Add("Username", "TestUserName");
dict.Add("Password", "Test1234");
dict.Add("RPNum", "111");
dict.Add("BeginDt", "6/5/2015");
dict.Add("EndDt", "6/20/2015");
dict.Add("TransType", "Sale");
dict.Add("Result", "0");
dict.Add("ExcludeVoid", "FALSE");
dict.Add("TransformType", "XML");
dict.Add("ExtData", "<CustomerID>12536</CustomerID>");

var httpClient = new HttpClient();

var req = new HttpRequestMessage(HttpMethod.Get, "https://transactions.test.secureexchange.net/admin/ws/trxdetail.asmx") { Content = new FormUrlEncodedContent(dict) };
var respone = await httpClient.SendAsync(req);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'GET',
  'url': 'https://transactions.test.secureexchange.net/admin/ws/trxdetail.asmx?UserName=TestUserName&Password=Test1234&RPNum=111&BeginDt=6/5/2015&EndDt=6/20/2015&TransType=Sale&Result=0&ExcludeVoid=0&TransformType=XML&ExtData=<CustomerID>12536</CustomerID>',
  'headers': {
  }
};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});

<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://transactions.test.secureexchange.net/admin/ws/trxdetail.asmx?UserName=TestUserName&Password=Test1234&RPNum=111&BeginDt=6/5/2015&EndDt=6/20/2015&TransType=Sale&Result=0&ExcludeVoid=0&TransformType=XML&ExtData=<CustomerID>12536</CustomerID>');
$request->setMethod(HTTP_Request2::METHOD_GET);
$request->setConfig(array(
  'follow_redirects' => TRUE
));

try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

HL Service:
https://transactions.test.secureexchange.net/admin/ws/trxdetail.asmx

HL Method Name:
GetCardTrx

Description:
Retrieves card transaction details for a merchant. Required parameters are in bold.

Areas Used In GRIP:
Credit Job,Get Successfully charged claim job,Get unsettle transactions job

HL Inputs Used In GRIP Type Description Sample Value
UserName Yes String User name assigned in the payment server TestUserName
Password Yes String Password Test1234
RPNum Yes String The merchant's RP Number, the query will be run against this merchant's account. 111
PNRef No String
BeginDt Yes String Optional query field: The begin date of the date range in MM/DD/YYYY format. This date will be converted to MM/DD/YYYYT00:00:00:0000AM 6/5/2015
EndDt Yes String Optional query field: The end date of the date range in MM/DD/YYYY format. This date will be converted to MM/DD/YYYYT12:59:59:9999PM 6/20/2015
PaymentType No String
ExcludePaymentType No String
TransType Yes String Optional query field: If provided, only those transactions matching the TransType will be included.Valid values are 'Authorization','Capture', 'Credit', 'PostAuth', 'ForceCapture' ,'GetStatus ', 'Purged', 'Receipt', 'RepeatSale', 'Sale', 'Void'or any permutation of the above values. Sale
ExcludeTransType No String
ApprovalCode No String
Result Yes String Optional query field: If provided, only those transactions matching the Result will be included. Valid values are: 0-Approved. Anything else is declined, if you want all the declined transactions, you should leave this field empty and use the ExcludeResult=0 instead. 0
ExcludeResult No String
NameOnCard No String
CardNum No String
CardType No String
ExcludeCardType No String
ExcludeVoid Yes String Optional query field: Whether to exclude voided transaction, must either be TRUE or FALSE. Default is TRUE FALSE
User No String
InvoiceId No String
SettleFlag No String
SettleMsg No String
SettleDt No String
TransformType Yes String Optional: Default is XML.
XML - output the plain XML string
XSL - use XSL to transform the XML output
DELIM - use ColDelim and RowDelim to format the output
XML
Xsl No String
ColDelim No String
RowDelim No String
IncludeHeader No String
ExtData Yes String Optional: Extended Data in XML, Valid Values are: IMAGE_TYPE - can be NO_IMAGE, ONLY_IMAGE, ONLY_IMAGE_INCLUDE_DATA, ALL or ALL_INCLUDE_DATA. CustomerID, Amount, RegisterNum <CustomerID>12536</CustomerID>
HL Outputs Used In GRIP Type Description Values
Result_Txt_VC Yes String Value should be 'approval' for settle and unsettle transactions(not for declined transactions) APPROVAL
Settle_Date_DT Yes String <value not empty>
Invoice_ID Yes String Value should include 'RECUR' word to identify recurring transactions
Value should be claim number for claim charges and refunds
Value should be policy Id for policy refunds and first sale records
GW0014217
TRX_HD_Key Yes String
Date_DT Yes String
Merchant_Key Yes String
User_Name_VC Yes String
Reseller_Key Yes String
Payment_Type_ID Yes String
Trans_Type_ID Yes String For recurring transactions value should be 'Repeatsale'
For 1st sale transactions value should be 'Sale'
For refund transactions value sould be 'Credit'
RepeatSale
Processor_ID Yes String
TRX_Settle_Key Yes String
TRX_Settle_Msg_VC Yes String Should include 'ACCEPTED' word to identify settled transactions GB00763_ACCEPTED
Settle_Flag_CH Yes String
Settle_Date_DT Yes String
Last_Update_DT Yes String
TRX_Card_Key Yes String
Card_Info_Key Yes String
Auth_Amt_MN Yes String
Tip_Amt_MN Yes String
Total_Amt_MN Yes String
Cash_Back_Amt_MN Yes String
SureCharge_Amt_MN Yes String
Account_Type_CH Yes String
Result_CH Yes String
Result_Txt_VC Yes String
Approval_Code_CH Yes String
Host_Ref_Num_CH Yes String
AVS_Resp_CH Yes String
Host_Date_CH Yes String
Host_Time_CH Yes String
Acct_Num_CH Yes String
Exp_CH Yes String
Type_CH Yes String
Name_on_Card_VC Yes String
Street_CH Yes String
Zip_CH Yes String
Manual Yes String
TRX_Receipt_key Yes String
CustomerID Yes String
Batch_Number Yes String
TRX_Receipt_Cnt Yes String
Auth_Date_DT Yes String
BatchID_VC Yes String

    Hosted Pages (HPP and HAPI)

Hosted Pay Page 2.0 API Reference
Document revision 1.3 June 2022

Overview Hosted Pay Page 2.0 API Reference

This is a technical reference document for the Hosted page (hereafter referred to as 'HPP') API. HPP helps merchants and payment integrators to accept credit cards and process other payments without having to worry about PCI DSS requirements. It eliminates the scope of PCI for these users by avoiding sensitive card information from being passed through their server. The HPP solution has two key elements to accept payments:

The pay page (HPP) is what is used for all visual browser-based payment interactions and takes URL encoded HTTPS POST payloads using standard HTML forms as depicted in this document. Your webpage will POST URL encoded form data (example forms provided herein) to the HPP system, execute the transaction in question do a HTTP redirect when completed to the CallbackURL value you supplied in the POST. Testing of HPP should be done with a browser that can display the payment form and handle the HTTP redirects correctly.

The stand-alone HAPI API is an API which supports all transaction types outlined in this document. Note that the HAPI API is implemented using JSON formatted requests and responses and there is no associated HTML FORM POST nor a UI (e.g. web browser) involved and is intended for server->server transactions (e.g. no user/web browser). Testing of HAPI can be done with a tool such as Postman and has no UI, so a browser is not required.

The HAPI API is fully documented online using Postman, at the following URL:

https://documenter.getpostman.com/view/10227060/SWTBfxz1

A typical use case for the HAPI API is to use the ENQ method to query a transaction that was previously sent, to REFUND a previous transaction or for recurring billing where the original card number was tokenized using HPP. Depending on your use case, use of the HAPI API is entirely optional.

If Network Error response is received on gateway or HPP/HAPI, true transaction disposition is unknown and an ENQ should be run against the transaction to find out true end state.

For SALEs performed directly against the Gateway (e.g. from the hosted pages), the UDField1 will be populated with the External Reference ID. The TransactionID field will be populated with an externally generated value per agreed to format (see Assumptions mentioned below).

Environments

There are two environments available, Test and Production. The purpose of the Test environment is to allow merchants and payment integrators to integrate with the HPP solution in a non-production environment and certify that their integration works as expected for the use cases relevant to their needs. Note that in order to access either environment, credentials will need to be issued and your Merchant ID set up in the relevant environment. Refer to Section 3 for details.

Test:

Paypage URL (HPP):

https://hpp-test.ippay.com

Paypage API (HAPI):

https://hapi-test.ippay.com/api/process

Production:

Paypage URL (HPP):

https://hpp.ippay.com

Paypage API (HAPI):

https://hapi.ippay.com/api/process

HPP Payment Types:

Templates

The UUID value references a previously set up payment template should there be a need to support most than one payment flow, look or layout. For instance, if you needed to display a payment form in Spanish and another in English, this could be accomplished using a TemplateID.

The TemplateID field is optional and if omitted, will be defaulted.

Screenshot examples of a credit card template and echeck template is provided below. Note that most merchants will usually want to use a custom logo, title, and potentially color scheme to match their website, particularly if used within an HTML IFRAME.

The Gateway Provider will provide the template, if needed, or simply customize to suit the needs of the merchant. Since this includes HTML, CSS and JavaScript, any significant template changes will need to be coordinated with the Gateway Provider and vetted for security.

table_1 table_2

ReferenceID and Token generation

This request can be used for post-capture AUTH ONLY transactions using a card token:

<ippay>
  <TransactionType>authonly</TransactionType>
  <TerminalID>TESTTERMINAL</TerminalID>
  <CardNum>4000300020001000</CardNum>
  <CardExpMonth>10</CardExpMonth>
  <CardExpYear>24</CardExpYear>
  <TotalAmount>00</TotalAmount>
</ippay>
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://testgtwy.ippay.com/ippay',
  'headers': {
    'Accept': '*/*',
    'Content-Type': 'test/xml'
  },
  body: '<ippay>\r\n  <TransactionType>authonly</TransactionType>\r\n  <TerminalID>TESTTERMINAL</TerminalID>\r\n  <CardNum>4000300020001000</CardNum>\r\n  <CardExpMonth>10</CardExpMonth>\r\n  <CardExpYear>24</CardExpYear>\r\n  <TotalAmount>00</TotalAmount>\r\n</ippay>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
var httpClient = new HttpClient();
var bodyXmlString =@"<ippay>
" + "\n" +
@"  <TransactionType>authonly</TransactionType>
" + "\n" +
@"  <TerminalID>TESTTERMINAL</TerminalID>
" + "\n" +
@"  <CardNum>4000300020001000</CardNum>
" + "\n" +
@"  <CardExpMonth>10</CardExpMonth>
" + "\n" +
@"  <CardExpYear>24</CardExpYear>
" + "\n" +
@"  <TotalAmount>00</TotalAmount>
" + "\n" +
@"</ippay>";

var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://testgtwy.ippay.com/ippay", stringContent);
Console.WriteLine(response.Content);
<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => 'https://testgtwy.ippay.com/ippay',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => '',
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 0,
  CURLOPT_FOLLOWLOCATION => true,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => 'POST',
  CURLOPT_POSTFIELDS =>'<ippay>
  <TransactionType>authonly</TransactionType>
  <TerminalID>TESTTERMINAL</TerminalID>
  <CardNum>4000300020001000</CardNum>
  <CardExpMonth>10</CardExpMonth>
  <CardExpYear>24</CardExpYear>
  <TotalAmount>00</TotalAmount>
</ippay>',
  CURLOPT_HTTPHEADER => array(
    'Accept: */*',
    'Content-Type: test/xml'
  ),
));

$response = curl_exec($curl);

curl_close($curl);
echo $response;

ReferenceID: The client can choose any number as a reference ID, which will be returned in the call back parameters by the hosted page. This can be used as a checksum to verify that the same reference ID is returned.

Token generation: The client will be assigned a unique MID and a security key by the Gateway Provider. The client can access the hosted page using these credentials by generating a token with a SHA1 hashing algorithm on the Reference ID and security key.

For instance, if the client is provided with security key of Welcome@123!
and uses a reference ID of 128438265846826 then the SHA1 of these two:

128438265846826Welcome@123!

Is the following:

7c67e64d019a8354b7550ebae100e7db7bf72a08

You can use the following online SHA1 generator for verification:

http://www.sha1-online.com/

Making a one-time payment

When a payment is to be processed, an HTTPS POST request must be sent with the mandatory parameters outlined in this document. Once the transaction has been attempted, HPP will send the transaction result back to the merchant system in the CallbackURL defined in the request POST on an HTTP redirect after the transaction completes.

One-time card payment: request parameters

One-time card payment sample request form. This request can be used for SALE transaction using a card token:

<form action="URL" method="POST">
   <input type="hidden" name="CallbackURL" value="http://abc.com/callback">
   <input type="hidden" name="MID" value="203457">
   <input type="hidden" name="CustomerEmail" value="test@ippay.com">
   <input type="hidden" name="CustomerId" value="203450">
   <input type="hidden" name="SaveForFuture" value="true">
   <input type="hidden" name="ReferenceId" value="128438265846826">
   <input type="hidden" name="Amount" value="10.00">
   <input type="hidden" name="PaymentType" value="CC">
   <input type="hidden" name="Token" value="7c67e64d019a8354b7550ebae100e7db7bf72a08">
   <input type="hidden" name="TransactionType" value="SALE">
   <input type="submit" value="Pay Now"/>
</form>
var httpClient = new HttpClient();
var bodyXmlString = @"{
    " + "\n" +
                @"  ""CustomerId"": ""1"",
    " + "\n" +
                @"  ""MID"": ""84870020092593"",
    " + "\n" +
                @"  ""ReferenceId"": ""2o17kl1417k044044144"",
    " + "\n" +
                @"  ""Amount"": ""201.00"",
    " + "\n" +
                @"  ""Token"": ""32ae76f9fc20c0af646f237987b1c08bc0a03a44"",
    " + "\n" +
                @"  ""IsRecurring"": ""true"",
    " + "\n" +
                @"  ""CardToken"": ""4H4D4L5H4F4A1111"",
    " + "\n" +
                @"  ""CustomerEmail"": ""test@ippay.com"",
    " + "\n" +
                @"  ""SaveForFuture"": ""false"",
    " + "\n" +
                @"  ""CallbackURL"": ""https://merchant.com/callback"",
    " + "\n" +
                @"  ""CustomField1"": """",
    " + "\n" +
                @"  ""CustomField2"": """",
    " + "\n" +
                @"  ""CustomField3"": """",
    " + "\n" +
                @"  ""PaymentType"": ""CC"",
    " + "\n" +
                @"  ""TransactionType"": ""SALE"",
    " + "\n" +
                @"  ""ENQReferenceId"": """",
    " + "\n" +
                @"  ""TransactionId"": """"
    " + "\n" +
                @"}";
var stringContent = new StringContent(bodyXmlString.ToString(), Encoding.UTF8, "application/json");
var respone = await httpClient.PostAsync("https://hpp-test.ippay.com/api/process", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://hpp-test.ippay.com/api/process',
  'headers': {
    'Accept-Language': 'application/json',
    'Accept': 'application/json',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    "CustomerId": "1",
    "MID": "84870020092593",
    "ReferenceId": "2o17kl1417k044044144",
    "Amount": "201.00",
    "Token": "32ae76f9fc20c0af646f237987b1c08bc0a03a44",
    "IsRecurring": "true",
    "CardToken": "4H4D4L5H4F4A1111",
    "CustomerEmail": "test@ippay.com",
    "SaveForFuture": "false",
    "CallbackURL": "https://merchant.com/callback",
    "CustomField1": "",
    "CustomField2": "",
    "CustomField3": "",
    "PaymentType": "CC",
    "TransactionType": "SALE",
    "ENQReferenceId": "",
    "TransactionId": ""
  })

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://hpp-test.ippay.com/api/process');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Accept-Language' => 'application/json',
  'Accept' => 'application/json',
  'Content-Type' => 'application/json'
));
$request->setBody('{
\n  "CustomerId": "1",
\n  "MID": "84870020092593",
\n  "ReferenceId": "2o17kl1417k044044144",
\n  "Amount": "201.00",
\n  "Token": "32ae76f9fc20c0af646f237987b1c08bc0a03a44",
\n  "IsRecurring": "true",
\n  "CardToken": "4H4D4L5H4F4A1111",
\n  "CustomerEmail": "test@ippay.com",
\n  "SaveForFuture": "false",
\n  "CallbackURL": "https://merchant.com/callback",
\n  "CustomField1": "",
\n  "CustomField2": "",
\n  "CustomField3": "",
\n  "PaymentType": "CC",
\n  "TransactionType": "SALE",
\n  "ENQReferenceId": "",
\n  "TransactionId": ""
\n}');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

The following parameters can be passed to HPP for making a one-time payment:

SR No Parameter Name Required Description
1 CustomerID Yes • Unique ID assigned to you by IPpay
2 MID Yes • Unique Merchant ID assigned by IPpay
3 CustomerEmail No • Email ID of the logged-in user
• Not required, but if entered, would not be editable in the payment page
4 SaveForFuture Yes • Indicates whether the card data needs to be Tokenized (a card token is generated) Valid values are:
o true (or 1) – when token needs to be generated
o false (or 0)
5 ReferenceID Yes • A unique reference ID created by client. This same reference ID will be returned
in the callback parameters of the response.
6 Amount Yes • Transaction amount with no currency symbol or formatting (No comma)
• Must contain one decimal and two digits to the right of the decimal (.00)
• Will be zero (0.00) when Transaction Type is either Tokenize or ENQ
7 CallbackURL Yes • URL of Merchant server where HPP will deliver transaction results
8 Token Yes • Used to authenticate the request came from client web application
• Authentication Token generated by applying Secure hash Algorithm (SHA1) combination of ReferenceID and SecurityKey – Password assigned by IPpay
9 PaymentType No • The Payment type of the transaction – Credit Card, Pre-paid and eCheck.
Must be one of the following values:
• CC
• Echeck
• PREPAID
10 TransactionType No • Must be one of the following values:
• SALE
• CHECK
11 TerminalId No • Not required but if entered, the same value will be used, else a value will be
picked from the Merchant-Terminal mapping created during merchant onboarding to HPP
12 CustomField1 No • Any unique value entered by client for reference. This same value will be
returned in the Callback response for field CustomField1.
13 CustomField2 No • Any unique value entered by client for reference. This same value will be
returned in the Callback response for field CustomField2.
14 CustomField3 No • Any unique value entered by client for reference. This same value will be
returned in the Callback response for field CustomField3.
15 UDField1 No • Any user defined value entered by client for reference. If no value is entered, the ReferenceID will be sent in the UDField1 field. Field value can have forced unique
attribute activated, whereby subsequent transactions using the same UDField1 value within 32 days will be automatically declined.
To have this feature enabled, please contact IPpay.
16 UDField2 No • Any user defined value entered by client for reference
17 UDField3 No • Any user defined value entered by client for reference
18 OrderNumber No • Optional(this field drives dynamic descriptor when product is turned on, else is only informational). Dynamic Descriptor allows merchants to pass through an alternative “doing business as” (DBA) name in the Charge Description field so that it appears on the customer's bank statement. This additional information can help avoid unnecessary disputes. For example, if your legal merchant name is different from the DBA name you’re using for your ecommerce website, the descriptor can be the website name. That way, it will appear on the customer’s bank statement to help them recognize the charge. At this time, American Express does not support the Dynamic Descriptor product for merchants using the American Express OptBlue Program.

One-time payment: response parameters

One-time payment: sample callback form

<form action="URL" method="POST">
   <input type="hidden" name="ReturnToken" value="7c67e64d019a8354b7550ebae100e7db7bf72a08">
   <input type="hidden" name="TransactionID" value="128438265846826">
   <input type="hidden" name="AuthCode" value="568374">
   <input type="hidden" name="Valid" value="TRUE">
   <input type="hidden" name="ResponseText" value="Transaction is Successful">
   <input type="hidden" name="CardToken" value="4E4GT3QP4ACD1111">
   <input type="hidden" name="Address" value="Street1">
   <input type="hidden" name="City" value="Atlanta">
   <input type="hidden" name="State" value="Georgia">
   <input type="hidden" name="Zip" value="30031">
   <input type="hidden" name="Country" value="US">
   <input type="hidden" name="ResponseCode" value="AFS-103">
   <input type="hidden" name="PaymentType" value="CC">
   <input type="hidden" name="CardNumber" value="12XXXXXXXXXX3456">
   <input type="hidden" name="CardExpiryMonth" value="01">
   <input type="hidden" name="CardExpiryYear" value="16">
   <input type="hidden" name="CardHolderName" value="John Doe">
   <input type="hidden" name="TokenizeCardSelected" value="No">
   <input type="submit" value="Pay Now"/>
</form>

When the transaction attempt has been completed, HPP will return the status of the transaction back to the CallbackURL defined in the request POST on an HTTP redirect after the transaction completes.

The following are parameters returned to the CallbackURL:

SR No Parameter Name Required Description
1 ReferenceID Yes • The request ReferenceID sent back in response
2 AuthCode Yes • Authorization code obtained by IPpay from Issuer for this transaction
• Only returned when Valid=True.
3 Valid Yes • 'True' or 'False' and indicates the acceptance of transaction
4 ResponseText Yes • Returned to user with message concerning transaction status
• Ex: Your transaction was successful, Transaction cannot be accepted, Invalid Transaction, etc.
5 TransactionID Yes
6 ReturnToken Yes • Response Token generated to validate the transaction
• SHA1 hash of the following:
SecurityKey + TransactionId + AuthCode
7 CardToken No • Token returned to the user ONLY IF SaveForFuture is sent in request parameters
• Return Value will be empty if SaveForFuture = false
8 Address
City
State
Zip
Country
Yes • If response parameter 'Valid' = true, then address will be returned, else not (no AVS related errors)
9 ResponseCode Yes • Response code from the Gateway will be returned
• Response codes:
USER_CANCELLED = 'AFS-103'
MAXIMUM_RETRIES_REACHED = 'AFS-102'
TIMEOUT_EXPIRED = 'AFS-101'
10 PaymentType Yes • Values can be CC, ECHECK or PREPAID
11 CardNumber Yes • Masked Card Number of the Card used for payment
• All digits except the first two and last four will be replaced with 'X'
12 CardExpiryMonth Yes • Two-digit card expiration month
13 CardExpiryYear Yes • Two-digit card expiration year
14 CardHolderName Yes • Name of cardholder
15 TokenizeCardSelected Yes • If 'Tokenize' checkbox on the Payment page is checked by the user, value will be 'Yes'
in the response parameters.
• Else, value is 'No'
16 TerminalId No • Not required but if entered, the same value will be used, else a value will be selected from the Merchant-Terminal mapping
17 CustomField1 No • Any unique value entered by client for reference. This same value will be returned in Callback parameters response for CustomField1
18 CustomField2 No • Any unique value entered by client for reference. This same value will be returned in Callback parameters in response for CustomField2
19 CustomField3 No • Any unique value entered by client for reference. This same value will be returned in Callback parameters in response for CustomField3
20 ProcessedAmount Yes • Amount processed in cents where 100 is $1.00. Will be '0' (zero) for a failed transaction and '' (null) for unknown errors.

Field limits

The xsd file request overview:

<xs:schema>
<!-- ***** IPPAY TRANSACTION REQUEST ***** -->
<xs:element name="ippay" type="RequestType"/>
<xs:complexType name="RequestType">
<xs:all>
<xs:element ref="TransactionType" minOccurs="1" maxOccurs="1"/>
<xs:element ref="TransactionID" minOccurs="0" maxOccurs="1"/>
<xs:element ref="TerminalID" minOccurs="1" maxOccurs="1"/>
<xs:element ref="BatchID" minOccurs="0" maxOccurs="1"/>
<xs:element ref="Password" minOccurs="0" maxOccurs="1"/>
<xs:element ref="PinBlock" minOccurs="0" maxOccurs="1"/>
<xs:element ref="Ksn" minOccurs="0" maxOccurs="1"/>
<xs:element ref="Approval" minOccurs="0" maxOccurs="1"/>
<xs:element ref="RoutingCode" minOccurs="0" maxOccurs="1"/>
<xs:element ref="OrderNumber" minOccurs="0" maxOccurs="1"/>
<xs:element ref="ACH" minOccurs="0" maxOccurs="1"/>
<xs:element ref="AccountNumber" minOccurs="0" maxOccurs="1"/>
<xs:element ref="ABA" minOccurs="0" maxOccurs="1"/>
<xs:element ref="ELV" minOccurs="0" maxOccurs="1"/>
<xs:element ref="Verification" minOccurs="0" maxOccurs="1"/>
<xs:element ref="CardNum" minOccurs="0" maxOccurs="1"/>
<xs:element ref="CVV2" minOccurs="0" maxOccurs="1"/>
<xs:element ref="CardExpMonth" minOccurs="0" maxOccurs="1"/>
<xs:element ref="CardExpYear" minOccurs="0" maxOccurs="1"/>
<xs:element ref="CardStartMonth" minOccurs="0" maxOccurs="1"/>
<xs:element ref="ipTransID" minOccurs="0" maxOccurs="1"/>
<!-- EUROPEAN CARDS -->
<xs:element ref="CardStartYear" minOccurs="0" maxOccurs="1"/>
<!-- EUROPEAN CARDS -->
<xs:element ref="Issue" minOccurs="0" maxOccurs="1"/>
<!-- EUROPEAN CARDS -->
<xs:element ref="Track1" minOccurs="0" maxOccurs="1"/>
<xs:element ref="Track2" minOccurs="0" maxOccurs="1"/>
<xs:element ref="Token" minOccurs="0" maxOccurs="1"/>
<xs:element ref="CardName" minOccurs="0" maxOccurs="1"/>
<xs:element ref="DispositionType" minOccurs="0" maxOccurs="1"/>
<xs:element ref="TotalAmount" minOccurs="0" maxOccurs="1"/>
<xs:element ref="TenderedAmount" minOccurs="0" maxOccurs="1"/>
<xs:element ref="FeeAmount" minOccurs="0" maxOccurs="1"/>
<xs:element ref="TaxAmount" minOccurs="0" maxOccurs="1"/>
<xs:element ref="TaxPercentRate" minOccurs="0" maxOccurs="1"/>
<xs:element ref="CashbackAmount" minOccurs="0" maxOccurs="1"/>
<xs:element ref="BillingAddress" minOccurs="0" maxOccurs="1"/>
<xs:element ref="BillingCity" minOccurs="0" maxOccurs="1"/>
<xs:element ref="BillingStateProv" minOccurs="0" maxOccurs="1"/>
<xs:element ref="BillingPostalCode" minOccurs="0" maxOccurs="1"/>
<xs:element ref="BillingCountry" minOccurs="0" maxOccurs="1"/>
<xs:element ref="BillingPhone" minOccurs="0" maxOccurs="1"/>
<xs:element ref="Email" minOccurs="0" maxOccurs="1"/>
<xs:element ref="UserIPAddress" minOccurs="0" maxOccurs="1"/>
<xs:element ref="UserHost" minOccurs="0" maxOccurs="1"/>
<xs:element ref="UDField1" minOccurs="0" maxOccurs="1"/>
<xs:element ref="UDField2" minOccurs="0" maxOccurs="1"/>
<xs:element ref="UDField3" minOccurs="0" maxOccurs="1"/>
<xs:element ref="ShippingInfo" minOccurs="0" maxOccurs="1"/>
<xs:element ref="Origin" minOccurs="0" maxOccurs="1"/>
<xs:element ref="ReaderUsed" minOccurs="0" maxOccurs="1"/>
<xs:element ref="IndustryInfo" minOccurs="0" maxOccurs="1"/>
<xs:element ref="Test" minOccurs="0" maxOccurs="1"/>
<xs:element ref="Retry" minOccurs="0" maxOccurs="1"/>
<xs:element ref="Version" minOccurs="0" maxOccurs="1"/>
<xs:element ref="ActionCode" minOccurs="0" maxOccurs="1"/>
<xs:element ref="SVPTransactionID" minOccurs="0" maxOccurs="1"/>
<xs:element ref="Reference" minOccurs="0" maxOccurs="1"/>
<xs:element ref="FICode" minOccurs="0" maxOccurs="1"/>
<xs:element ref="ReturnURL" minOccurs="0" maxOccurs="1"/>
<xs:element ref="CancelURL" minOccurs="0" maxOccurs="1"/>
<xs:element ref="DeliveryCode" minOccurs="0" maxOccurs="1"/>
<!-- ipMerchantID - use in detokanize post -->
<xs:element ref="MID" minOccurs="0" maxOccurs="1"/>
<!-- CC Settlement data -->
<xs:element ref="CcSettlementInfo" minOccurs="0" maxOccurs="1"/>
<!-- ACH Settlement data -->
<xs:element ref="AchSettlementInfo" minOccurs="0" maxOccurs="1"/>
<!-- Verifone Transaction data -->
<xs:element ref="VerifoneTransactionInfo" minOccurs="0" maxOccurs="1"/>
<!-- CC Card Present -->
<xs:element ref="CcCardPresentInfo" minOccurs="0" maxOccurs="1"/>
<!-- CC Card Tokenize Info -->
<xs:element ref="TokenizeInfo" minOccurs="0" maxOccurs="1"/>
<!-- Verifone Transaction matching -->
<xs:element name="CardPresent" minOccurs="0" nillable="true" maxOccurs="1" type="YesNoType"/>
<xs:element name="StartDate" minOccurs="0" nillable="true" maxOccurs="1" type="DateTimeDMYHMSType"/>
<xs:element name="EndDate" minOccurs="0" nillable="true" maxOccurs="1" type="DateTimeDMYHMSType"/>
</xs:all>
</xs:complexType>
<!-- ***** JETPAY TRANSACTION REQUEST ***** -->
<xs:element name="JetPay" type="RequestType"/>
<!-- ***** JETPAY TRANSACTION RESPONSE ***** -->
<xs:element name="JetPayResponse" type="ResponseType"/>
<xs:element name="ippayResponse" type="ResponseType"/>
<xs:complexType name="ResponseType">
<xs:all>
<xs:element ref="TransactionID" minOccurs="1" maxOccurs="1"/>
<xs:element ref="ActionCode" minOccurs="1" maxOccurs="1"/>
<xs:element ref="Approval" minOccurs="0" maxOccurs="1"/>
<xs:element ref="BalanceAmount" minOccurs="0" maxOccurs="1"/>
<xs:element ref="ResponseText" minOccurs="0" maxOccurs="1"/>
<xs:element ref="AdditionalInfo" minOccurs="0" maxOccurs="1"/>
<xs:element ref="AddressMatch" minOccurs="0" maxOccurs="1"/>
<xs:element ref="ZipMatch" minOccurs="0" maxOccurs="1"/>
<xs:element ref="AVS" minOccurs="0" maxOccurs="1"/>
<xs:element ref="CVV2" minOccurs="0" maxOccurs="1"/>
<xs:element ref="VerificationResult" minOccurs="0" maxOccurs="1"/>
<xs:element ref="IndustryInfo" minOccurs="0" maxOccurs="1"/>
<xs:element ref="ErrMsg" minOccurs="0" maxOccurs="1"/>
<xs:element ref="InstitutionURL" minOccurs="0" maxOccurs="1"/>
<xs:element ref="SVPTransactionID" minOccurs="0" maxOccurs="1"/>
<xs:element ref="BankName" minOccurs="0" maxOccurs="1"/>
<xs:element ref="FICode" minOccurs="0" maxOccurs="1"/>
<xs:element ref="PayDateTime" minOccurs="0" maxOccurs="1"/>
<xs:element ref="Reference" minOccurs="0" maxOccurs="1"/>
<xs:element ref="TranState" minOccurs="0" maxOccurs="1"/>
<xs:element ref="TranStateCode" minOccurs="0" maxOccurs="1"/>
<xs:element ref="Token" minOccurs="0" maxOccurs="1"/>
<xs:element ref="TotalCount" minOccurs="0" maxOccurs="1"/>
<xs:element ref="SuccessCount" minOccurs="0" maxOccurs="1"/>
<xs:element ref="UpdatedCount" minOccurs="0" maxOccurs="1"/>
<xs:element ref="FailedCount" minOccurs="0" maxOccurs="1"/>
<xs:element ref="MatchedCount" minOccurs="0" maxOccurs="1"/>
<xs:element ref="UnmatchCount" minOccurs="0" maxOccurs="1"/>
</xs:all>
</xs:complexType>
<!-- ***** REQUEST ELEMENTS ***** -->
<xs:element name="ipTransID" type="StringType"/>
<xs:element name="BatchID" type="StringType"/>
<xs:element name="AccountNumber" type="AcctNumType"/>
<xs:element name="ABA" type="AbaType"/>
<xs:element name="TransactionType" type="TransType"/>
<!-- Required - Type of transaction to post. -->
<xs:element name="TerminalID" type="StringType"/>
<!-- Required - Alphanumeric terminal identifier. -->
<xs:element name="TransactionID" type="TransIdType"/>
<!-- Required - Alphanumeric, 18 characters. -->
<xs:element name="ACH" type="AchType"/>
<!--
 Banking only, separate from credit card transactions 
-->
<xs:element name="ELV" type="ElvType"/>
<!--
 Banking only, separate from credit card transactions 
-->
<xs:element name="Verification" type="VerifyType"/>
<!-- Verified by Visa, CAVV, etc. -->
<xs:element name="Approval" type="AuthCodeType"/>
<!-- Approval Code, required for Force. -->
<xs:element name="RoutingCode" type="StringType"/>
<xs:element name="CardNum" type="CardNumType"/>
<!-- Credit card number for the transaction. -->
<xs:element name="CardExpMonth" type="MonthType"/>
<!-- Two-digit card expiration month. -->
<xs:element name="CardExpYear" type="YearType"/>
<!-- Two-digit card expiration year. -->
<xs:element name="CardStartMonth" type="MonthType"/>
<!-- Two-digit card start month. -->
<xs:element name="CardStartYear" type="YearType"/>
<!-- Two-digit card start year. -->
<xs:element name="Issue" type="YearType"/>
<!-- Two-digit card issue number. -->
<xs:element name="CVV2" type="Cvv2Type"/>
<!--
 Reference only - CVV2 digits from the credit card. 
-->
<xs:element name="Track1" type="TrackType"/>
<!-- Magnetic track information, track 1 data -->
<xs:element name="Track2" type="TrackType"/>
<!-- Magnetic track information, track 2 data -->
<xs:element name="TotalAmount" type="Amount12Type"/>
<!--
 Total amount transacted, integer, no dollar sign, greater than zero. 
-->
<xs:element name="TenderedAmount" type="Amount12Type"/>
<!--
 Actual amount received, integer, no dollar sign, greater than zero. 
-->
<xs:element name="FeeAmount" type="Amount12Type"/>
<!--
 Surcharge for transaction, integer, no dollar sign, non-zero. 
-->
<xs:element name="TaxAmount" type="Amount12Type"/>
<!--
 Tax for transaction, integer, no dollar sign, non-zero. 
-->
<xs:element name="TaxPercentRate" type="Amount12Type"/>
<!--
 Tax percent rate for transaction, integer, no dollar sign, non-zero. 
-->
<xs:element name="CashbackAmount" type="Amount12Type"/>
<!--
 Cash for transaction, integer, no dollar sign, non-zero. 
-->
<xs:element name="Password" type="StringType"/>
<!--
 Alphanumeric password corresponding with supplied merchant id. 
-->
<xs:element name="PinBlock" type="PinBlockType"/>
<xs:element name="Ksn" type="KsnType"/>
<xs:element name="InstitutionURL" type="String1204Type"/>
<xs:element name="SVPTransactionID" type="Number12Type"/>
<xs:element name="BankName" type="String50Type"/>
<xs:element name="PayDateTime" type="DateType"/>
<xs:element name="Reference" type="String22Type"/>
<xs:element name="TranState" type="Number1Type"/>
<xs:element name="TranStateCode" type="Number2Type"/>
<xs:element name="FICode" type="Number9Type"/>
<xs:element name="ReturnURL" type="String180Type"/>
<xs:element name="CancelURL" type="String180Type"/>
<xs:element name="DeliveryCode" type="DeliveryType"/>
<xs:element name="OrderNumber" type="StringType"/>
<!--
 Order number (or any alphanumeric reference string) 
-->
<xs:element name="CardName" type="StringType"/>
<!--
 Cardholder name for credit card, bank account name for ACH. 
-->
<xs:element name="DispositionType" type="StringType" default="JETPAYXX"/>
<xs:element name="BillingAddress" type="StringType"/>
<xs:element name="BillingCity" type="StringType"/>
<xs:element name="BillingStateProv" type="StringType"/>
<xs:element name="BillingCountry" type="CountryType"/>
<xs:element name="BillingPostalCode" type="String10Type"/>
<xs:element name="BillingPhone" type="StringType"/>
<!-- Cardholder telephone -->
<xs:element name="Email" type="StringType"/>
<!-- Cardholder email address. -->
<xs:element name="UserIPAddress" type="StringType"/>
<!-- Cardholder IP address. -->
<xs:element name="UserHost" type="StringType"/>
<!-- Cardholder host name. -->
<xs:element name="UDField1" type="StringType"/>
<!-- Data echoed on transaction reports. -->
<xs:element name="UDField2" type="StringType"/>
<!-- Data echoed on transaction reports. -->
<xs:element name="UDField3" type="StringType"/>
<!-- Data echoed on transaction reports. -->
<xs:element name="ShippingInfo" type="ShippingInfoType"/>
<xs:element name="Origin" type="OriginType"/>
<xs:element name="ReaderUsed" type="ReaderType"/>
<xs:element name="IndustryInfo" type="IndustryInfoType"/>
<xs:element name="Test" type="StringType"/>
<xs:element name="Retry" type="StringType"/>
<xs:element name="Version" type="VersionType"/>
<xs:element name="ActionCode" type="ActionCodeType"/>
<!-- ***** RESPONSE ELEMENTS ***** -->
<xs:element name="ResponseText" type="StringType"/>
<xs:element name="AdditionalInfo" type="StringType"/>
<xs:element name="AddressMatch" type="String1Type"/>
<xs:element name="ZipMatch" type="String1Type"/>
<xs:element name="BalanceAmount" type="Amount12Type"/>
<xs:element name="TotalCount" type="Number8Type"/>
<xs:element name="SuccessCount" type="Number8Type"/>
<xs:element name="UpdatedCount" type="Number8Type"/>
<xs:element name="FailedCount" type="Number8Type"/>
<xs:element name="MatchedCount" type="Number8Type"/>
<xs:element name="UnmatchCount" type="Number8Type"/>
<!-- Account balance, for ATM only -->
<xs:element name="AVS" type="String1Type"/>
<xs:element name="VerificationResult" type="CavvResultType"/>
<xs:element name="ErrMsg" type="StringType"/>
<xs:element name="Token" type="StringType"/>
<xs:element name="MID" type="String25Type"/>
<!-- CC Settlement Data Post. -->
<xs:element name="CcSettlementInfo" type="CcSettlementDetailType"/>
<xs:complexType name="CcSettlementDetailType">
<xs:sequence>
<xs:element name="CcSettlement" type="CcSettlementType" maxOccurs="unbounded" minOccurs="1"/>
</xs:sequence>
</xs:complexType>
<!-- ACH Settlement Data Post. -->
<xs:element name="AchSettlementInfo" type="AchSettlementDetailType"/>
<xs:complexType name="AchSettlementDetailType">
<xs:sequence>
<xs:element name="AchSettlement" type="AchSettlementType" maxOccurs="unbounded" minOccurs="1"/>
</xs:sequence>
</xs:complexType>
<!-- Verifone Transaction Data Post. -->
<xs:element name="VerifoneTransactionInfo" type="VerifoneTransactionDetailType"/>
<xs:complexType name="VerifoneTransactionDetailType">
<xs:sequence>
<xs:element name="VerifoneTransaction" type="VerifoneTransactionType" maxOccurs="unbounded" minOccurs="1"/>
</xs:sequence>
</xs:complexType>
<!-- CC Card Present Data Post. -->
<xs:element name="CcCardPresentInfo" type="CcCardPresentDetailType"/>
<xs:complexType name="CcCardPresentDetailType">
<xs:sequence>
<xs:element name="CcCardPresent" type="CcCardPresentType" maxOccurs="unbounded" minOccurs="1"/>
</xs:sequence>
</xs:complexType>
<!-- Tokenize Info Data Post. -->
<xs:element name="TokenizeInfo" type="TokenizeDetailType"/>
<xs:complexType name="TokenizeDetailType">
<xs:sequence>
<xs:element name="Tokenize" type="TokenizeType" maxOccurs="unbounded" minOccurs="1"/>
</xs:sequence>
</xs:complexType>
<!-- ***** SIMPLE TYPES (without attributes) ***** -->
<xs:simpleType name="StringType">
<xs:restriction base="xs:string">
<xs:whiteSpace value="collapse"/>
<xs:maxLength value="1204"/>
</xs:restriction>
</xs:simpleType>
<xs:complexType name="TrackType">
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="Encrypted" type="BooleanType" default="false"/>
<xs:attribute name="Encoding" type="EncodeType" default="BASE64"/>
<xs:attribute name="KeyName" type="StringType" default="none"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:simpleType name="BooleanType">
<xs:restriction base="xs:boolean">
<xs:whiteSpace value="collapse"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="SimpleDateTimeType">
<xs:restriction base="xs:string">
<xs:pattern value="(-?[0-9]{4}-[0-9]{2}-[0-9]{2}T\d{2}:\d{2}:\d{2}(\.\d+)?)?"/>
<xs:whiteSpace value="collapse"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="DateTimeDMYHMSType">
<xs:restriction base="xs:string">
<xs:pattern value="(-?[0-9]{2}\/[0-9]{2}\/[0-9]{4} \d{2}:\d{2}:\d{2}(\.\d+)?)?"/>
<xs:whiteSpace value="collapse"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="DateTimeDMYType">
<xs:restriction base="xs:string">
<xs:pattern value="(-?[0-9]{2}\/[0-9]{2}\/[0-9]{4})?"/>
<xs:whiteSpace value="collapse"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="DateType">
<xs:restriction base="xs:date">
<xs:whiteSpace value="collapse"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="String350Type">
<xs:restriction base="StringType">
<xs:maxLength value="350"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="String20Type">
<xs:restriction base="StringType">
<xs:maxLength value="20"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="String22Type">
<xs:restriction base="StringType">
<xs:maxLength value="22"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="String25Type">
<xs:restriction base="StringType">
<xs:maxLength value="25"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="String30Type">
<xs:restriction base="StringType">
<xs:maxLength value="30"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="String50Type">
<xs:restriction base="StringType">
<xs:maxLength value="50"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="String15Type">
<xs:restriction base="StringType">
<xs:maxLength value="15"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="String180Type">
<xs:restriction base="StringType">
<xs:maxLength value="180"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="String150Type">
<xs:restriction base="StringType">
<xs:maxLength value="150"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="String1204Type">
<xs:restriction base="StringType">
<xs:maxLength value="1204"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="String1000Type">
<xs:restriction base="StringType">
<xs:maxLength value="1000"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="String100Type">
<xs:restriction base="StringType">
<xs:maxLength value="100"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="String12Type">
<xs:restriction base="StringType">
<xs:maxLength value="12"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="String11Type">
<xs:restriction base="StringType">
<xs:maxLength value="11"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="String10Type">
<xs:restriction base="StringType">
<xs:maxLength value="10"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="String9Type">
<xs:restriction base="StringType">
<xs:maxLength value="9"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="String8Type">
<xs:restriction base="StringType">
<xs:maxLength value="8"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="String6Type">
<xs:restriction base="StringType">
<xs:maxLength value="6"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="String5Type">
<xs:restriction base="StringType">
<xs:maxLength value="5"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="String4Type">
<xs:restriction base="StringType">
<xs:maxLength value="4"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="String3Type">
<xs:restriction base="StringType">
<xs:maxLength value="3"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="String2Type">
<xs:restriction base="StringType">
<xs:maxLength value="2"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="String1Type">
<xs:restriction base="StringType">
<xs:maxLength value="1"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="Number3Type">
<xs:restriction base="xs:unsignedShort">
<xs:maxInclusive value="999"/>
<xs:whiteSpace value="collapse"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="Number5Type">
<xs:restriction base="xs:unsignedLong">
<xs:maxInclusive value="99999"/>
<xs:whiteSpace value="collapse"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="Number12Type">
<xs:restriction base="xs:unsignedLong">
<xs:maxInclusive value="999999999999"/>
<xs:whiteSpace value="collapse"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="Number1Type">
<xs:restriction base="xs:unsignedShort">
<xs:maxInclusive value="9"/>
<xs:whiteSpace value="collapse"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="Number8Type">
<xs:restriction base="xs:unsignedLong">
<xs:maxInclusive value="99999999"/>
<xs:whiteSpace value="collapse"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="Number9Type">
<xs:restriction base="xs:unsignedLong">
<xs:maxInclusive value="999999999"/>
<xs:whiteSpace value="collapse"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="Number2Type">
<xs:restriction base="xs:unsignedShort">
<xs:maxInclusive value="99"/>
<xs:whiteSpace value="collapse"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="Number4Type">
<xs:restriction base="xs:unsignedShort">
<xs:maxInclusive value="9999"/>
<xs:whiteSpace value="collapse"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="TransIdType">
<xs:restriction base="xs:string">
<xs:pattern value="[-A-Za-z0-9]{18}"/>
<xs:length value="18"/>
<xs:whiteSpace value="collapse"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="Digit2Type">
<xs:restriction base="xs:integer">
<xs:pattern value="\d{2}"/>
<xs:whiteSpace value="collapse"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="MonthType">
<xs:restriction base="xs:integer">
<xs:minInclusive value="1"/>
<xs:maxInclusive value="12"/>
<xs:pattern value="\d{2}|\d{0}"/>
<xs:whiteSpace value="collapse"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="YearType">
<xs:restriction base="xs:integer">
<xs:minInclusive value="0"/>
<xs:maxInclusive value="99"/>
<xs:pattern value="\d{2}|\d{0}"/>
<xs:whiteSpace value="collapse"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="CountryType">
<xs:restriction base="StringType">
<xs:pattern value="\d{3}|[A-Z]{3}"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="Amount12Type">
<xs:restriction base="xs:unsignedLong">
<xs:maxInclusive value="999999999999"/>
<xs:whiteSpace value="collapse"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="Amount6Type">
<xs:restriction base="Amount12Type">
<xs:maxInclusive value="999999"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="Amount5Type">
<xs:restriction base="Amount12Type">
<xs:maxInclusive value="99999"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="Decimal182Type">
<xs:restriction base="xs:decimal">
<xs:maxInclusive value="999999999999999999"/>
<xs:fractionDigits value="2"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="UniqueIDType">
<xs:restriction base="StringType">
<xs:maxLength value="25"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="AuthCodeType">
<xs:restriction base="StringType">
<xs:maxLength value="6"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="ActionCodeType">
<xs:restriction base="StringType">
<xs:maxLength value="3"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="AcctNumType">
<xs:restriction base="xs:string">
<xs:pattern value="(^|[- 0-9])*"/>
<xs:maxLength value="17"/>
<xs:whiteSpace value="collapse"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="YesNoType">
<xs:restriction base="xs:string">
<xs:pattern value="yes|no"/>
<xs:maxLength value="3"/>
<xs:whiteSpace value="collapse"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="AbaType">
<xs:restriction base="StringType">
<xs:maxLength value="9"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="BankBranchType">
<xs:restriction base="xs:unsignedInt">
<xs:pattern value="\d{8}"/>
<xs:whiteSpace value="collapse"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="Ordinal3Type">
<xs:restriction base="xs:positiveInteger">
<xs:maxInclusive value="999"/>
<xs:whiteSpace value="collapse"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="Int5Type">
<xs:restriction base="Amount5Type"/>
</xs:simpleType>
<xs:simpleType name="Int6Type">
<xs:restriction base="Amount6Type"/>
</xs:simpleType>
<!-- ***** SIMPLE TYPES (with attributes) ***** -->
<xs:complexType name="TransType">
<xs:simpleContent>
<xs:extension base="TransEnumType">
<xs:attribute name="Qualification" type="TransQualifEnumType" default="NONE"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:complexType name="CardNumType">
<xs:simpleContent>
<xs:extension base="String350Type">
<xs:attribute name="CardPresent" type="BooleanType" default="false"/>
<xs:attribute name="Tokenize" type="BooleanType" default="false"/>
<xs:attribute name="Encrypted" type="BooleanType" default="false"/>
<xs:attribute name="Encoding" type="EncodeType" default="BASE64"/>
<xs:attribute name="KeyName" type="StringType" default="none"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:complexType name="Cvv2Type">
<xs:simpleContent>
<xs:extension base="String350Type">
<xs:attribute name="Encrypted" type="BooleanType" default="false"/>
<xs:attribute name="Encoding" type="EncodeType" default="BASE64"/>
<xs:attribute name="KeyName" type="StringType" default="none"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:complexType name="EncodingType">
<xs:simpleContent>
<xs:extension base="StringType">
<xs:attribute name="Encoding" type="EncodeType" default="BASE64"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:complexType name="WorkingKeyType">
<xs:simpleContent>
<xs:extension base="StringType">
<xs:attribute name="Encoding" type="EncodeType" default="HEX"/>
<xs:attribute name="Management" type="ManagementType" default="DUKPT"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:complexType name="PinBlockType">
<xs:simpleContent>
<xs:extension base="WorkingKeyType">
<xs:attribute name="Format" type="PinBlockFormatType"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:simpleType name="KsnType">
<xs:restriction base="StringType">
<xs:pattern value="[0-9A-Fa-f]{10,20}"/>
</xs:restriction>
</xs:simpleType>
<xs:complexType name="CavvType">
<xs:simpleContent>
<xs:extension base="EncodingType">
<xs:attribute name="Usage" type="String1Type" default="2"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:complexType name="CavvResultType">
<xs:simpleContent>
<xs:extension base="StringType">
<xs:attribute name="Type" type="VerifyEnum"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:complexType name="CheckNumType">
<xs:simpleContent>
<xs:extension base="Int6Type">
<xs:attribute name="CheckPresent" type="BooleanType" default="false"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:complexType name="DateTimeType">
<xs:simpleContent>
<xs:extension base="SimpleDateTimeType">
<xs:attribute name="Min" type="SimpleDateTimeType"/>
<xs:attribute name="Max" type="SimpleDateTimeType"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!--
 ***** COMPOUND TYPES (containing simple types) ***** 
-->
<xs:complexType name="AddressType">
<xs:all>
<xs:element name="Address" minOccurs="0" maxOccurs="1" type="StringType"/>
<xs:element name="City" minOccurs="0" maxOccurs="1" type="StringType"/>
<xs:element name="StateProv" minOccurs="0" maxOccurs="1" type="StringType"/>
<xs:element name="PostalCode" minOccurs="0" maxOccurs="1" type="String10Type"/>
<xs:element name="Country" minOccurs="0" maxOccurs="1" type="StringType"/>
<xs:element name="Phone" minOccurs="0" maxOccurs="1" type="StringType"/>
</xs:all>
</xs:complexType>
<xs:complexType name="ShippingInfoType">
<xs:all>
<xs:element name="CustomerPO" minOccurs="0" maxOccurs="1" type="StringType"/>
<xs:element name="CustomerTaxID" minOccurs="0" maxOccurs="1" type="StringType"/>
<xs:element name="ShippingMethod" minOccurs="0" maxOccurs="1" type="ShippingMethodType"/>
<xs:element name="ShippingName" minOccurs="0" maxOccurs="1" type="StringType"/>
<xs:element name="ShippingAddr" minOccurs="0" maxOccurs="1" type="AddressType"/>
<xs:element name="InvoiceInfo" minOccurs="0" maxOccurs="1" type="StringType"/>
<xs:element name="FreightAmount" minOccurs="0" maxOccurs="1" type="Amount12Type"/>
<xs:element name="DutyAmount" minOccurs="0" maxOccurs="1" type="Amount12Type"/>
<xs:element name="DiscountAmount" minOccurs="0" maxOccurs="1" type="Amount12Type"/>
<xs:element name="AlternateTaxAmount" minOccurs="0" maxOccurs="1" type="Amount12Type"/>
<xs:element name="AlternateTaxId" minOccurs="0" maxOccurs="1" type="StringType"/>
</xs:all>
</xs:complexType>
<xs:complexType name="IndustryInfoType">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="UserAgent" minOccurs="0" maxOccurs="1" type="StringType"/>
<!--ECOMMERCE-->
<xs:element name="PhoneANI" minOccurs="0" maxOccurs="1" type="StringType"/>
<!--MOTO, Telephone only-->
<xs:element name="PhoneII" minOccurs="0" maxOccurs="1" type="StringType"/>
<!--MOTO, Telephone only-->
<xs:element name="TicketNumber" minOccurs="0" maxOccurs="1" type="String10Type"/>
<!--RESTAURANT, PARKING-->
<xs:element name="BaseAmount" minOccurs="0" maxOccurs="1" type="Amount12Type"/>
<!--RESTAURANT-->
<xs:element name="TipAmount" minOccurs="0" maxOccurs="1" type="Amount5Type"/>
<!--RESTAURANT-->
<xs:element name="ServerID" minOccurs="0" maxOccurs="1" type="String10Type"/>
<!--RESTAURANT-->
<xs:element name="TableNumber" minOccurs="0" maxOccurs="1" type="Number4Type"/>
<!--RESTAURANT-->
<xs:element name="FolioNumber" minOccurs="0" maxOccurs="1" type="String10Type"/>
<!--HOTEL-->
<xs:element name="CheckInDate" minOccurs="0" maxOccurs="1" type="DateType"/>
<!--HOTEL-->
<xs:element name="CheckOutDate" minOccurs="0" maxOccurs="1" type="DateType"/>
<!--HOTEL-->
<xs:element name="RoomRate" minOccurs="0" maxOccurs="1" type="Amount12Type"/>
<!--HOTEL-->
<xs:element name="RoomNumber" minOccurs="0" maxOccurs="1" type="String8Type"/>
<!--HOTEL-->
<xs:element name="ExtraCharges" minOccurs="0" maxOccurs="6" type="StringType"/>
<!--HOTEL-->
<xs:element name="CpsTranId" minOccurs="0" maxOccurs="1" type="String20Type"/>
<!--HOTEL-->
<xs:element name="AgreementNumber" minOccurs="0" maxOccurs="1" type="String10Type"/>
<!--AUTORENTAL-->
<xs:element name="PickupDate" minOccurs="0" maxOccurs="1" type="DateType"/>
<!--AUTORENTAL-->
<xs:element name="ReturnDate" minOccurs="0" maxOccurs="1" type="DateType"/>
<!--AUTORENTAL-->
<xs:element name="RenterName" minOccurs="0" maxOccurs="1" type="StringType"/>
<!--AUTORENTAL-->
<xs:element name="AdjustAmount" minOccurs="0" maxOccurs="1" type="Amount12Type"/>
<!--AUTORENTAL-->
<xs:element name="AdjustIndicator" minOccurs="0" maxOccurs="1" type="StringType"/>
<!--AUTORENTAL-->
<xs:element name="PickupCity" minOccurs="0" maxOccurs="1" type="StringType"/>
<!--AUTORENTAL-->
<xs:element name="PickupState" minOccurs="0" maxOccurs="1" type="StringType"/>
<!--AUTORENTAL-->
<xs:element name="ReturnCity" minOccurs="0" maxOccurs="1" type="StringType"/>
<!--AUTORENTAL-->
<xs:element name="ReturnState" minOccurs="0" maxOccurs="1" type="StringType"/>
<!--AUTORENTAL-->
<xs:element name="NoShow" minOccurs="0" maxOccurs="1" type="BooleanType"/>
<!--AUTORENTAL, HOTEL-->
<xs:element name="ExtraAmount" minOccurs="0" maxOccurs="1" type="Amount6Type"/>
<!--AUTORENTAL-->
<xs:element name="PlazaID" minOccurs="0" maxOccurs="1" type="String3Type"/>
<!--PARKING-->
<xs:element name="BoothID" minOccurs="0" maxOccurs="1" type="String3Type"/>
<!--PARKING-->
<xs:element name="ShiftID" minOccurs="0" maxOccurs="1" type="String2Type"/>
<!--PARKING-->
<xs:element name="ClerkID" minOccurs="0" maxOccurs="1" type="String6Type"/>
<!--PARKING-->
<xs:element name="DocumentNumber" minOccurs="0" maxOccurs="1" type="String10Type"/>
<!--QUASICASH-->
<xs:element name="LanID" minOccurs="0" maxOccurs="1" type="StringType"/>
<!--QUASICASH-->
</xs:choice>
<xs:attribute name="Type" type="IndustryType" use="required"/>
</xs:complexType>
<xs:complexType name="AchType">
<xs:all>
<xs:element name="AccountNumber" minOccurs="0" maxOccurs="1" type="AcctNumType"/>
<xs:element name="ABA" minOccurs="0" maxOccurs="1" type="AbaType"/>
<xs:element name="CheckNumber" minOccurs="0" maxOccurs="1" type="CheckNumType"/>
<xs:element name="Scrutiny" minOccurs="0" maxOccurs="1" type="HighLowType" default="HIGH"/>
<xs:element name="Token" minOccurs="0" maxOccurs="1" type="String50Type" default=""/>
</xs:all>
<xs:attribute name="Tokenize" type="BooleanType" default="false"/>
<xs:attribute name="Type" type="AchAccountType" default="CHECKING"/>
<xs:attribute name="SEC" type="SecType" default="PPD"/>
</xs:complexType>
<xs:complexType name="ElvType">
<xs:all>
<xs:element name="AccountNumber" minOccurs="1" maxOccurs="1" type="AcctNumType"/>
<xs:element name="BankBranchCode" minOccurs="1" maxOccurs="1" type="BankBranchType"/>
</xs:all>
</xs:complexType>
<xs:complexType name="VerifyType">
<xs:all>
<xs:element name="Cavv" minOccurs="0" maxOccurs="1" type="CavvType"/>
<xs:element name="Xid" minOccurs="0" maxOccurs="1" type="EncodingType"/>
<xs:element name="Eci" minOccurs="0" maxOccurs="1" type="Digit2Type"/>
</xs:all>
<xs:attribute name="Type" type="VerifyEnum"/>
</xs:complexType>
<xs:complexType name="VersionType">
<xs:all>
<xs:element name="Subscriber" minOccurs="0" maxOccurs="1" type="StringType"/>
<xs:element name="DLL" minOccurs="0" maxOccurs="1" type="StringType"/>
<xs:element name="JetPay_fe" minOccurs="0" maxOccurs="1" type="StringType"/>
<xs:element name="Host" minOccurs="0" maxOccurs="1" type="StringType"/>
<xs:element name="Auth_be" minOccurs="0" maxOccurs="1" type="StringType"/>
</xs:all>
</xs:complexType>
<!-- CC Settlement Elements -->
<xs:complexType name="CcSettlementType">
<xs:all>
<xs:element name="SettlementId" minOccurs="1" maxOccurs="1" type="Number12Type"/>
<xs:element name="MerchantHeaderRecordId" minOccurs="1" maxOccurs="1" type="Number12Type"/>
<xs:element name="FileImportLogId" minOccurs="1" maxOccurs="1" type="Number12Type"/>
<xs:element name="ClientId" minOccurs="1" maxOccurs="1" type="Number12Type"/>
<xs:element name="CycleId" minOccurs="0" nillable="true" maxOccurs="1" type="Number12Type"/>
<xs:element name="SequenceNumber" minOccurs="0" nillable="true" maxOccurs="1" type="Number12Type"/>
<xs:element name="TransactionCode" minOccurs="0" nillable="true" maxOccurs="1" type="Number12Type"/>
<xs:element name="TransactionDate" minOccurs="1" maxOccurs="1" type="DateTimeDMYHMSType"/>
<xs:element name="MSADI" minOccurs="0" nillable="true" maxOccurs="1" type="String1Type"/>
<xs:element name="CardType" minOccurs="0" nillable="true" maxOccurs="1" type="Number2Type"/>
<xs:element name="PrepaidCardIndicator" minOccurs="0" nillable="true" maxOccurs="1" type="String1Type"/>
<xs:element name="TransactionAmount" minOccurs="1" maxOccurs="1" type="Decimal182Type"/>
<xs:element name="MerchantDBAName" minOccurs="0" nillable="true" maxOccurs="1" type="String100Type"/>
<xs:element name="AbbreviatedAirlineName" minOccurs="0" nillable="true" maxOccurs="1" type="String12Type"/>
<xs:element name="TicketNumber" minOccurs="0" nillable="true" maxOccurs="1" type="String100Type"/>
<xs:element name="MerchantDBACity" minOccurs="0" nillable="true" maxOccurs="1" type="String100Type"/>
<xs:element name="MerchantDBAStateorProvinceCode" minOccurs="0" nillable="true" maxOccurs="1" type="String100Type"/>
<xs:element name="ExtendedFreeTextFlag" minOccurs="0" nillable="true" maxOccurs="1" type="String1Type"/>
<xs:element name="MerchantDBACountryCode" minOccurs="0" nillable="true" maxOccurs="1" type="String100Type"/>
<xs:element name="MerchantCategoryCode" minOccurs="0" nillable="true" maxOccurs="1" type="String4Type"/>
<xs:element name="MerchantDBAZipOrPostalCode" minOccurs="0" nillable="true" maxOccurs="1" type="String30Type"/>
<xs:element name="AuthorizationCode" minOccurs="0" nillable="true" maxOccurs="1" type="String6Type"/>
<xs:element name="InternalTransactionReferenceNumber" minOccurs="0" nillable="true" maxOccurs="1" type="String11Type"/>
<xs:element name="AuthorizationSourceCode" minOccurs="0" nillable="true" maxOccurs="1" type="String1Type"/>
<xs:element name="CardholderIdentificationMethod" minOccurs="0" nillable="true" maxOccurs="1" type="String1Type"/>
<xs:element name="CardholderActivatedTerminalCATIndicator" minOccurs="0" nillable="true" maxOccurs="1" type="String1Type"/>
<xs:element name="ReimbursementAttributeCode" minOccurs="0" nillable="true" maxOccurs="1" type="String1Type"/>
<xs:element name="ChipConditionCode" minOccurs="0" nillable="true" maxOccurs="1" type="String1Type"/>
<xs:element name="MailTelephoneorElectronicCommerceIndicator" minOccurs="0" nillable="true" maxOccurs="1" type="String1Type"/>
<xs:element name="POSEntryMode" minOccurs="0" nillable="true" maxOccurs="1" type="String2Type"/>
<xs:element name="VisaAuthorizationCharacteristicsIndicatorACIMasterCardACITSYSUseOnly" minOccurs="0" nillable="true" maxOccurs="1" type="String1Type"/>
<xs:element name="Ps2000TransactionIdentifier" minOccurs="0" nillable="true" maxOccurs="1" type="String100Type"/>
<xs:element name="BankNetAuthorizationReferenceNumber" minOccurs="0" nillable="true" maxOccurs="1" type="String9Type"/>
<xs:element name="AuthorizationCurrencyCode" minOccurs="0" nillable="true" maxOccurs="1" type="String3Type"/>
<xs:element name="AuthorizationAmount" minOccurs="0" nillable="true" maxOccurs="1" type="Decimal182Type"/>
<xs:element name="ValidationCode" minOccurs="0" nillable="true" maxOccurs="1" type="String4Type"/>
<xs:element name="VisaAuthorizationResponseCode" minOccurs="0" nillable="true" maxOccurs="1" type="String2Type"/>
<xs:element name="MasterCardBankNetAuthorizationDate" minOccurs="0" nillable="true" maxOccurs="1" type="String4Type"/>
<xs:element name="ForeignExchangeFlag" minOccurs="0" nillable="true" maxOccurs="1" type="String1Type"/>
<xs:element name="TransactionTender" minOccurs="0" nillable="true" maxOccurs="1" type="String1Type"/>
<xs:element name="DebitNetworkIdentifier" minOccurs="0" nillable="true" maxOccurs="1" type="String3Type"/>
<xs:element name="SwitchSettledIndicator" minOccurs="0" nillable="true" maxOccurs="1" type="String1Type"/>
<xs:element name="ExtensionRecordIndicator" minOccurs="0" nillable="true" maxOccurs="1" type="String5Type"/>
<xs:element name="RequestedPaymentServiceIndicator" minOccurs="0" nillable="true" maxOccurs="1" type="String1Type"/>
<xs:element name="MasterCardPromotionCode" minOccurs="0" nillable="true" maxOccurs="1" type="String6Type"/>
<xs:element name="AmericanExpressTaxAmount" minOccurs="0" nillable="true" maxOccurs="1" type="String6Type"/>
<xs:element name="ElectronicCommerceGoodsIndicator" minOccurs="0" nillable="true" maxOccurs="1" type="String2Type"/>
<xs:element name="TransactionCodeQualifier" minOccurs="0" nillable="true" maxOccurs="1" type="String1Type"/>
<xs:element name="RiskIdentificationIdentifier" minOccurs="0" nillable="true" maxOccurs="1" type="String1Type"/>
<xs:element name="MerchantTransactionIdentifier" minOccurs="0" nillable="true" maxOccurs="1" type="String1Type"/>
<xs:element name="TransactionCategory" minOccurs="0" nillable="true" maxOccurs="1" type="String2Type"/>
<xs:element name="CardAcceptorIdentifier" minOccurs="0" nillable="true" maxOccurs="1" type="String15Type"/>
<xs:element name="POSInteractionTerminalIdentifier" minOccurs="0" nillable="true" maxOccurs="1" type="String100Type"/>
<xs:element name="InsuranceCoverageType" minOccurs="0" nillable="true" maxOccurs="1" type="String1Type"/>
<xs:element name="ElectronicCommerceTransactionIndicator" minOccurs="0" nillable="true" maxOccurs="1" type="String1Type"/>
<xs:element name="CashbackAmount" minOccurs="0" nillable="true" maxOccurs="1" type="String9Type"/>
<xs:element name="StoreType" minOccurs="0" nillable="true" maxOccurs="1" type="String1Type"/>
<xs:element name="InvoiceNumber" minOccurs="0" nillable="true" maxOccurs="1" type="String8Type"/>
<xs:element name="PolicyNumber" minOccurs="0" nillable="true" maxOccurs="1" type="String9Type"/>
<xs:element name="TASRejectIndicator" minOccurs="0" nillable="true" maxOccurs="1" type="String1Type"/>
<xs:element name="InsuranceCode" minOccurs="0" nillable="true" maxOccurs="1" type="String3Type"/>
<xs:element name="MSRFlag" minOccurs="0" nillable="true" maxOccurs="1" type="String1Type"/>
<xs:element name="VisaServiceDevelopmentIndicator" minOccurs="0" nillable="true" maxOccurs="1" type="String1Type"/>
<xs:element name="RegisterNumber" minOccurs="0" nillable="true" maxOccurs="1" type="String5Type"/>
<xs:element name="CardPlanIdentifier" minOccurs="0" nillable="true" maxOccurs="1" type="String4Type"/>
<xs:element name="AuthorizationMatch" minOccurs="0" nillable="true" maxOccurs="1" type="String1Type"/>
<xs:element name="OriginalESIDCode" minOccurs="0" nillable="true" maxOccurs="1" type="String1Type"/>
<xs:element name="BillingCycle" minOccurs="0" nillable="true" maxOccurs="1" type="String1Type"/>
<xs:element name="MasterCardRecurringPaymentIndicator" minOccurs="0" nillable="true" maxOccurs="1" type="String1Type"/>
<xs:element name="BankNumber" minOccurs="0" nillable="true" maxOccurs="1" type="String4Type"/>
<xs:element name="AssociationNumber" minOccurs="0" nillable="true" maxOccurs="1" type="String6Type"/>
<xs:element name="GroupNumber" minOccurs="0" nillable="true" maxOccurs="1" type="String6Type"/>
<xs:element name="CreationDate" minOccurs="1" maxOccurs="1" type="DateTimeDMYHMSType"/>
<xs:element name="BatchId" minOccurs="0" nillable="true" maxOccurs="1" type="Number12Type"/>
<xs:element name="HashcardNumber" minOccurs="0" nillable="true" maxOccurs="1" type="String50Type"/>
<xs:element name="PartialCardNumber" minOccurs="0" nillable="true" maxOccurs="1" type="String10Type"/>
<xs:element name="EncryptedCardNumber" minOccurs="0" nillable="true" maxOccurs="1" type="String50Type"/>
<xs:element name="EncryptionIniVector" minOccurs="0" nillable="true" maxOccurs="1" type="String50Type"/>
<xs:element name="CardNum" minOccurs="1" maxOccurs="1" type="CardNumType"/>
<xs:element name="CardExpMonth" minOccurs="0" nillable="true" maxOccurs="1" type="MonthType"/>
<xs:element name="CardExpYear" minOccurs="0" nillable="true" maxOccurs="1" type="YearType"/>
<xs:element name="TsysAuthId" minOccurs="0" nillable="true" maxOccurs="1" type="Number12Type"/>
<xs:element name="BatchDate" minOccurs="0" nillable="true" maxOccurs="1" type="DateTimeDMYType"/>
<xs:element name="ProcessorId" minOccurs="0" nillable="true" maxOccurs="1" type="Number12Type"/>
<xs:element name="APPROVAL_STATUS" minOccurs="0" nillable="true" maxOccurs="1" type="String20Type"/>
<xs:element name="REQUEST_TYPE" minOccurs="0" nillable="true" maxOccurs="1" type="String20Type"/>
<xs:element name="AVS_RESPONSE" minOccurs="0" nillable="true" maxOccurs="1" type="String100Type"/>
<xs:element name="SHIPDATETIME" minOccurs="0" nillable="true" maxOccurs="1" type="DateTimeDMYHMSType"/>
<xs:element name="CARDHOLDERNAME" minOccurs="0" nillable="true" maxOccurs="1" type="String100Type"/>
<xs:element name="ADDRESS" minOccurs="0" nillable="true" maxOccurs="1" type="String1000Type"/>
<xs:element name="PHONE" minOccurs="0" nillable="true" maxOccurs="1" type="String100Type"/>
<xs:element name="EMAIL" minOccurs="0" nillable="true" maxOccurs="1" type="String100Type"/>
<xs:element name="USERIPADDRESS" minOccurs="0" nillable="true" maxOccurs="1" type="String100Type"/>
<xs:element name="ORDERNUMBER" minOccurs="0" nillable="true" maxOccurs="1" type="String100Type"/>
<xs:element name="UD1" minOccurs="0" nillable="true" maxOccurs="1" type="String100Type"/>
<xs:element name="UD2" minOccurs="0" nillable="true" maxOccurs="1" type="String100Type"/>
<xs:element name="UD3" minOccurs="0" nillable="true" maxOccurs="1" type="String100Type"/>
<xs:element name="TransactionTime" minOccurs="0" nillable="true" maxOccurs="1" type="String10Type"/>
<xs:element name="BatchTime" minOccurs="0" nillable="true" maxOccurs="1" type="String10Type"/>
<xs:element name="BatchNumber" minOccurs="0" nillable="true" maxOccurs="1" type="String50Type"/>
<xs:element name="MID" minOccurs="0" nillable="true" maxOccurs="1" type="String50Type"/>
<xs:element name="CardPlan" minOccurs="0" nillable="true" maxOccurs="1" type="String150Type"/>
<xs:element name="TransactionID" minOccurs="0" nillable="true" maxOccurs="1" type="TransIdType"/>
<xs:element name="CardPresent" minOccurs="1" maxOccurs="1" type="YesNoType"/>
</xs:all>
</xs:complexType>
<!-- ACH Settlement Elements -->
<xs:complexType name="AchSettlementType">
<xs:all>
<xs:element name="SettlementId" minOccurs="1" maxOccurs="1" type="Number12Type"/>
<xs:element name="MerchantHeaderRecordId" minOccurs="1" maxOccurs="1" type="Number12Type"/>
<xs:element name="FileImportLogId" minOccurs="1" maxOccurs="1" type="Number12Type"/>
<xs:element name="ClientId" minOccurs="1" maxOccurs="1" type="Number12Type"/>
<xs:element name="CardType" minOccurs="0" nillable="true" maxOccurs="1" type="Number2Type"/>
<xs:element name="TransactionAmount" minOccurs="1" maxOccurs="1" type="Decimal182Type"/>
<xs:element name="TicketNumber" minOccurs="0" nillable="true" maxOccurs="1" type="String100Type"/>
<xs:element name="MerchantDBACity" minOccurs="0" nillable="true" maxOccurs="1" type="String100Type"/>
<xs:element name="MerchantDBAStateorProvinceCode" minOccurs="0" nillable="true" maxOccurs="1" type="String100Type"/>
<xs:element name="MerchantDBACountryCode" minOccurs="0" nillable="true" maxOccurs="1" type="String100Type"/>
<xs:element name="MerchantDBAZipOrPostalCode" minOccurs="0" nillable="true" maxOccurs="1" type="String30Type"/>
<xs:element name="ReimbursementAttributeCode" minOccurs="0" nillable="true" maxOccurs="1" type="String1Type"/>
<xs:element name="Ps2000TransactionIdentifier" minOccurs="0" nillable="true" maxOccurs="1" type="String100Type"/>
<xs:element name="AuthorizationDate" minOccurs="0" nillable="true" maxOccurs="1" type="String100Type"/>
<xs:element name="POSInteractionTerminalIdentifier" minOccurs="0" nillable="true" maxOccurs="1" type="String100Type"/>
<xs:element name="CreationDate" minOccurs="1" maxOccurs="1" type="DateTimeDMYHMSType"/>
<xs:element name="HashcardNumber" minOccurs="0" nillable="true" maxOccurs="1" type="String50Type"/>
<xs:element name="EncryptedCardNumber" minOccurs="0" nillable="true" maxOccurs="1" type="String50Type"/>
<xs:element name="EncryptionIniVector" minOccurs="0" nillable="true" maxOccurs="1" type="String50Type"/>
<xs:element name="BatchDate" minOccurs="0" nillable="true" maxOccurs="1" type="DateTimeDMYType"/>
<xs:element name="ProcessorId" minOccurs="0" nillable="true" maxOccurs="1" type="Number12Type"/>
<xs:element name="APPROVAL_STATUS" minOccurs="0" nillable="true" maxOccurs="1" type="String20Type"/>
<xs:element name="REQUEST_TYPE" minOccurs="0" nillable="true" maxOccurs="1" type="String20Type"/>
<xs:element name="CARDHOLDERNAME" minOccurs="0" nillable="true" maxOccurs="1" type="String100Type"/>
<xs:element name="ADDRESS" minOccurs="0" nillable="true" maxOccurs="1" type="String1000Type"/>
<xs:element name="PHONE" minOccurs="0" nillable="true" maxOccurs="1" type="String100Type"/>
<xs:element name="EMAIL" minOccurs="0" nillable="true" maxOccurs="1" type="String100Type"/>
<xs:element name="ORDERNUMBER" minOccurs="0" nillable="true" maxOccurs="1" type="String100Type"/>
<xs:element name="UD1" minOccurs="0" nillable="true" maxOccurs="1" type="String100Type"/>
<xs:element name="UD2" minOccurs="0" nillable="true" maxOccurs="1" type="String100Type"/>
<xs:element name="UD3" minOccurs="0" nillable="true" maxOccurs="1" type="String100Type"/>
<xs:element name="MID" minOccurs="0" nillable="true" maxOccurs="1" type="String50Type"/>
<xs:element name="ACCOUNT_NUM" minOccurs="0" nillable="true" maxOccurs="1" type="String100Type"/>
<xs:element name="CHECK_NUMBER" minOccurs="0" nillable="true" maxOccurs="1" type="String100Type"/>
<xs:element name="ABA_NUMBER" minOccurs="0" nillable="true" maxOccurs="1" type="String100Type"/>
<xs:element name="ACCOUNT_TYPE" minOccurs="0" nillable="true" maxOccurs="1" type="String100Type"/>
<xs:element name="PHASE_1_DATE" minOccurs="0" nillable="true" maxOccurs="1" type="String100Type"/>
<xs:element name="PHASE_2_DATE" minOccurs="0" nillable="true" maxOccurs="1" type="String100Type"/>
<xs:element name="TransactionID" minOccurs="0" nillable="true" maxOccurs="1" type="TransIdType"/>
</xs:all>
</xs:complexType>
<!-- Verifone Transaction Elements -->
<xs:complexType name="VerifoneTransactionType">
<xs:all>
<xs:element name="INTRN_SEQ_NUM" minOccurs="1" maxOccurs="1" type="Number12Type"/>
<xs:element name="PROCESSOR_ID" minOccurs="1" maxOccurs="1" type="String10Type"/>
<xs:element name="BATCH_SEQ_NUM" minOccurs="1" maxOccurs="1" type="Number12Type"/>
<xs:element name="TRANS_SEQ_NUM" minOccurs="1" maxOccurs="1" type="Number12Type"/>
<xs:element name="INVOICE" minOccurs="0" nillable="true" maxOccurs="1" type="String20Type"/>
<xs:element name="COMMAND" minOccurs="0" nillable="true" maxOccurs="1" type="String15Type"/>
<xs:element name="ACCT_NUM" minOccurs="0" nillable="true" maxOccurs="1" type="String20Type"/>
<xs:element name="EXP_MONTH" minOccurs="0" nillable="true" maxOccurs="1" type="String2Type"/>
<xs:element name="EXP_YEAR" minOccurs="0" nillable="true" maxOccurs="1" type="String4Type"/>
<xs:element name="CARDHOLDER" minOccurs="0" nillable="true" maxOccurs="1" type="String50Type"/>
<xs:element name="TRANS_AMOUNT" minOccurs="1" maxOccurs="1" type="Decimal182Type"/>
<xs:element name="REFERENCE" minOccurs="0" nillable="true" maxOccurs="1" type="String20Type"/>
<xs:element name="TRANS_DATE" minOccurs="1" maxOccurs="1" type="String10Type"/>
<xs:element name="TRANS_TIME" minOccurs="1" maxOccurs="1" type="String10Type"/>
<xs:element name="ORIG_SEQ_NUM" minOccurs="0" nillable="true" maxOccurs="1" type="Number12Type"/>
<xs:element name="STATUS_CODE" minOccurs="0" nillable="true" maxOccurs="1" type="Number12Type"/>
<xs:element name="TROUTD" minOccurs="0" nillable="true" maxOccurs="1" type="Number12Type"/>
<xs:element name="CTROUTD" minOccurs="1" maxOccurs="1" type="Number12Type"/>
<xs:element name="PAYMENT_TYPE" minOccurs="0" nillable="true" maxOccurs="1" type="String15Type"/>
<xs:element name="PAYMENT_MEDIA" minOccurs="0" nillable="true" maxOccurs="1" type="String10Type"/>
<xs:element name="RESULT_CODE" minOccurs="0" nillable="true" maxOccurs="1" type="Number12Type"/>
<xs:element name="AUTH_CODE" minOccurs="0" nillable="true" maxOccurs="1" type="String15Type"/>
<xs:element name="AVS_CODE" minOccurs="0" nillable="true" maxOccurs="1" type="String5Type"/>
<xs:element name="CVV2_CODE" minOccurs="0" nillable="true" maxOccurs="1" type="String5Type"/>
<xs:element name="TRACE_CODE" minOccurs="0" nillable="true" maxOccurs="1" type="String15Type"/>
<xs:element name="CASHBACK_AMNT" minOccurs="1" maxOccurs="1" type="Decimal182Type"/>
<xs:element name="TIP_AMOUNT" minOccurs="1" maxOccurs="1" type="Decimal182Type"/>
<xs:element name="RESPONSE_REFERENCE" minOccurs="0" nillable="true" maxOccurs="1" type="String50Type"/>
<xs:element name="R_AUTH_CODE" minOccurs="1" maxOccurs="1" type="String10Type"/>
</xs:all>
</xs:complexType>
<!-- CC Card Present Elements -->
<xs:complexType name="CcCardPresentType">
<xs:all>
<xs:element name="RefID" minOccurs="1" maxOccurs="1" type="String20Type"/>
<xs:element name="MID" minOccurs="1" maxOccurs="1" type="String50Type"/>
<xs:element name="TransactionType" minOccurs="1" maxOccurs="1" type="TransType"/>
<xs:element name="Amount" minOccurs="1" maxOccurs="1" type="Decimal182Type"/>
<xs:element name="CardNum" minOccurs="1" maxOccurs="1" type="CardNumType"/>
<xs:element name="ExpDate" minOccurs="1" maxOccurs="1" type="Number4Type"/>
<xs:element name="Date" minOccurs="1" maxOccurs="1" type="SimpleDateTimeType"/>
<xs:element name="AVS" minOccurs="0" nillable="true" maxOccurs="1" type="String1Type"/>
<xs:element name="ZipMatch" minOccurs="0" nillable="true" maxOccurs="1" type="String1Type"/>
<xs:element name="AddressMatch" minOccurs="0" nillable="true" maxOccurs="1" type="String1Type"/>
<xs:element name="CVV2" minOccurs="0" nillable="true" maxOccurs="1" type="String1Type"/>
<xs:element name="ActionCode" minOccurs="0" nillable="true" maxOccurs="1" type="ActionCodeType"/>
<xs:element name="Approval" minOccurs="0" nillable="true" maxOccurs="1" type="String20Type"/>
<xs:element name="ResponseText" minOccurs="0" nillable="true" maxOccurs="1" type="String100Type"/>
<xs:element name="FileName" minOccurs="1" maxOccurs="1" type="String100Type"/>
</xs:all>
</xs:complexType>
<!-- Tokenize Elements -->
<xs:complexType name="TokenizeType">
<xs:all>
<xs:element name="Id" minOccurs="1" maxOccurs="1" type="String20Type"/>
<xs:element name="MID" minOccurs="1" maxOccurs="1" type="String50Type"/>
<xs:element name="CardNum" minOccurs="1" maxOccurs="1" type="CardNumType"/>
<xs:element name="ExpDate" minOccurs="1" maxOccurs="1" type="Number4Type"/>
</xs:all>
</xs:complexType>
<!-- ***** ENUMERATED TYPES ***** -->
<xs:simpleType name="IndustryType">
<xs:restriction base="StringType">
<xs:enumeration value="ECOMMERCE"/>
<xs:enumeration value="RETAIL"/>
<xs:enumeration value="MOTO"/>
<xs:enumeration value="HOTEL"/>
<xs:enumeration value="RESTAURANT"/>
<xs:enumeration value="AUTORENTAL"/>
<xs:enumeration value="AIRLINE"/>
<xs:enumeration value="PARKING"/>
<xs:enumeration value="QUASICASH"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="TransQualifEnumType">
<xs:restriction base="StringType">
<xs:enumeration value="NONE"/>
<xs:enumeration value="STIP"/>
<xs:enumeration value="TRANSACTION VOIDED"/>
<xs:enumeration value="SCRIP DISTRIBUTED"/>
<xs:enumeration value="STIP TIMEOUT"/>
<xs:enumeration value="RESUBMISSION TIMEOUT"/>
<xs:enumeration value="ONLINE RESUBMISSION"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="OriginType">
<xs:restriction base="StringType">
<xs:enumeration value="INTERNET"/>
<!-- default, if absent -->
<xs:enumeration value="POS"/>
<!-- default when track data is present -->
<xs:enumeration value="POS STIP"/>
<xs:enumeration value="RECURRING"/>
<xs:enumeration value="RESUBMISSION"/>
<xs:enumeration value="MAIL ORDER"/>
<xs:enumeration value="PHONE ORDER"/>
<xs:enumeration value="BILL PAYMENT"/>
<xs:enumeration value="PREPAID"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="ShippingMethodType">
<xs:restriction base="StringType">
<xs:enumeration value="SAME DAY"/>
<!-- no default value -->
<xs:enumeration value="OVERNIGHT"/>
<xs:enumeration value="PRIORITY"/>
<xs:enumeration value="GROUND"/>
<xs:enumeration value="ELECTRONIC"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="ReaderType">
<xs:restriction base="StringType">
<xs:enumeration value="KEYPAD"/>
<!-- no default value -->
<xs:enumeration value="MAGNETIC STRIPE"/>
<xs:enumeration value="CHIP"/>
<xs:enumeration value="CONTACTLESS MS"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="VerifyEnum">
<xs:restriction base="StringType">
<xs:enumeration value="VbV"/>
<xs:enumeration value="SC"/>
<xs:enumeration value="MCSC"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="DebitCreditType">
<xs:restriction base="StringType">
<xs:enumeration value="DEBIT"/>
<xs:enumeration value="CREDIT"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="DeliveryType">
<xs:restriction base="StringType">
<xs:enumeration value="SHIPPED"/>
<xs:enumeration value="PICKUP"/>
<xs:enumeration value="DOWNLOAD"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="TranStateType">
<xs:restriction base="StringType">
<xs:enumeration value="NOT PAID"/>
<xs:enumeration value="PAID"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="TranStateCodeType">
<xs:restriction base="StringType">
<xs:enumeration value="TRANSACTION ESTABLISHED"/>
<xs:enumeration value="FINANCIAL INSTITUTION REQUESTED VALIDATION OF SESSION TOKEN"/>
<xs:enumeration value="FINANCIAL INSTITUTION INQUIRE"/>
<xs:enumeration value="FINANCIAL INSTITUTION CANCELLED TRANSACTION"/>
<xs:enumeration value="AUTHORIZATION RECEIVED AND UPDATED WITHIN THE EWISE NETWORK"/>
<xs:enumeration value="AUTHORIZATION DENIED AND RECEIVED AND UPDATED WITHIN THE EWISE NETWORK"/>
<xs:enumeration value="AUTHORIZED WITH UNKNOWN DETAILS"/>
<xs:enumeration value="AUTHORIZATION TOKEN DOES NOT MATCH"/>
<xs:enumeration value="TRANSACTION QUERIED BY THE MERCHANT"/>
<xs:enumeration value="TRANSACTION QUERIED BY THE MERCHANT USING AUTH TOKEN"/>
<xs:enumeration value="TRANSACTION TIMED OUT"/>
<xs:enumeration value="MERCHANT ERROR"/>
<xs:enumeration value="FINANCIAL INSTITUTION ERROR"/>
<xs:enumeration value="INTERNAL EWISE NETWORK ERROR"/>
<xs:enumeration value="UNKNOWN STATUS"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="HighLowType">
<xs:restriction base="StringType">
<xs:enumeration value="HIGH"/>
<xs:enumeration value="LOW"/>
<xs:enumeration value="NONE"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="TransEnumType">
<xs:restriction base="StringType">
<xs:enumeration value="authonly"/>
<xs:enumeration value="capt"/>
<xs:enumeration value="credit"/>
<xs:enumeration value="enq"/>
<xs:enumeration value="force"/>
<xs:enumeration value="ping"/>
<xs:enumeration value="sale"/>
<xs:enumeration value="void"/>
<xs:enumeration value="AUTHONLY"/>
<xs:enumeration value="SVPAUTH"/>
<xs:enumeration value="SVPCAPTURE"/>
<xs:enumeration value="SVPREFUND"/>
<xs:enumeration value="BALANCE"/>
<xs:enumeration value="CAPT"/>
<xs:enumeration value="CHECK"/>
<xs:enumeration value="CREDIT"/>
<xs:enumeration value="ENQ"/>
<xs:enumeration value="FORCE"/>
<xs:enumeration value="INCREMENTAL"/>
<xs:enumeration value="IOU"/>
<xs:enumeration value="PARTIALREVERSAL"/>
<xs:enumeration value="PING"/>
<xs:enumeration value="REVERSAL"/>
<xs:enumeration value="REVERSEAUTH"/>
<xs:enumeration value="SALE"/>
<xs:enumeration value="VOID"/>
<xs:enumeration value="VOIDACH"/>
<xs:enumeration value="TOKENIZE"/>
<xs:enumeration value="DETOKENIZE"/>
<xs:enumeration value="CCSETTLEMENT"/>
<xs:enumeration value="ACHSETTLEMENT"/>
<xs:enumeration value="VERIFONE"/>
<xs:enumeration value="VERIFONEMATCH"/>
<xs:enumeration value="CCCARDPRESENT"/>
<xs:enumeration value="BULKTOKENIZE"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="AchAccountType">
<xs:restriction base="StringType">
<xs:enumeration value="CHECKING"/>
<xs:enumeration value="SAVINGS"/>
<xs:enumeration value="BUSINESSCK"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="SecType">
<xs:restriction base="StringType">
<xs:enumeration value="PPD"/>
<!--
 "Prearranged Payment and Deposit Entry", default, if absent 
-->
<xs:enumeration value="ARC"/>
<!-- "Accounts Receivable Entry" -->
<xs:enumeration value="BOC"/>
<!-- "Back Office Conversion" -->
<xs:enumeration value="CCD"/>
<!-- "Cash Concentration or Disbursement" -->
<xs:enumeration value="POP"/>
<!-- "Point-of-Purchase Entry" -->
<!-- 5/19/2014 - Jeff Maier.  Added per Charles Wu -->
<xs:enumeration value="TEL"/>
<!-- "Telephone Initiated Entry" -->
<xs:enumeration value="WEB"/>
<!-- "Internet Initiated Entry" -->
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="EncodeType">
<xs:restriction base="StringType">
<xs:enumeration value="BINARY"/>
<xs:enumeration value="HEX"/>
<xs:enumeration value="BASE64"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="PinBlockFormatType">
<xs:restriction base="StringType">
<xs:enumeration value="ANSI"/>
<xs:enumeration value="IBM3624"/>
<xs:enumeration value="PINPAD"/>
<xs:enumeration value="IBMPINPAD"/>
<xs:enumeration value="BURROUGHS"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="ManagementType">
<xs:restriction base="StringType">
<xs:enumeration value="DUKPT"/>
<!-- Derived Unique Key Per Transaction -->
</xs:restriction>
</xs:simpleType>
<!-- ***** ABBREVIATIONS, DEPRECATED ALIASES ***** -->
<xs:element name="MerchantID" substitutionGroup="TerminalID" type="String12Type"/>
</xs:schema>

HAPI API

Required fields Type Regex Pattern
CustomerId Long NotNull
MID String NotNull, [a-zA-Z0-9]{3,80}
ReferenceId String [a-zA-Z0-9_:-]{3,80}
Token String [a-zA-Z0-9]{3,80}
String String .{0,80}

Optional fields Type Regex Pattern
TerminalId String [a-zA-Z0-9]{0,40}
Amount String [0-9.]{1,13}
IsRecurring String (true)
CardToken String [a-zA-Z0-9]{0,40}
CustomerEmail String .{0,80}
SaveForFuture String (true)
CallbackURL String .{0,2048}
Oauth String
CustomField1 String .{0,255}
CustomField2 String .{0,255}
CustomField3 String .{0,255}
UDField1 String .{0,80}
UDField2 String .{0,80}
UDField3 String .{0,80}
PaymentType String (CC)
TransactionType String -
ENQReferenceId String [a-zA-Z0-9_:-]{0,80}
TransactionID String [a-zA-Z0-9]{0,60}
ReturnToken String [a-zA-Z0-9]{0,60}
AuthCode String [a-zA-Z0-9]{0,10}
Valid String -
ResponseText String .{0,50}
Address String .{0,50}
City String .{0,50}
State String .{0,50}
Zip String .{0,50}
Country String .{0,50}
BillingAddress String .{0,50}
BillingCity String .{0,50}
BillingStateProv String .{0,50}
BillingPostalCode String .{0,50}
BillingCountry String .{0,50}
"ResponseCode" String .{0,10}
AccountNumber String [0-9 \-]{0,17}
RoutingNumber String ([0-9 \-]{9})?
AccountType String (CHECKING)
CardNumber String [0-9 ]{0,40}
CardExpiryMonth String [0-9]{0,2}
CardExpiryYear String ([0-9]{2})?
Cw2 String [0-9]{0,5}
CardHolderName String .{0,50}
CardName String .{0,50}
TokenizeCardSelected String -
Order number String [a-zA-Z0-9]{0,30}

HPP API

Required fields Type Regex Pattern
MID String [a-zA-Z0-9]{3,80}
ReferenceId String [a-zA-Z0-9_:-]{3,80}
Token String [a-zA-Z0-9]{3,80}
CustomerId String
Amount String [0-9.]{1,13}
TemplateID String ([a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}){1}

Optional fields Type Regex Pattern
CallbackURL String .{0,2048}
TerminalId String [a-zA-Z0-9]{0,40}
SaveForFuture String (true)
IsRecurring String (on)
CardToken String [a-zA-Z0-9]{0,40}
CustomerEmail String .{0,80}
CustomField2 String .{0,255}
CustomField3 String .{0,255}
UDField1 String .{0,80}
UDField2 String .{0,80}
UDField3 String .{0,80}
PaymentType String (CC)
TransactionType - (SALE)
ENQReferenceId String [a-zA-Z0-9]{0,60}
TransactionID String [a-zA-Z0-9]{0,60}
Address String .{0,50}
City String .{0,50}
State String .{0,50}
Zip String .{0,10}
Country String .{0,50}
BillingAddress String .{0,50}
BillingCity String .{0,50}
BillingState String .{0,50}
BillingZip String .{0,50}
BillingStateProv String .{0,50}
BillingPostalCode String .{0,10}
BillingCountry String
RoutingNumber String .{0,50}
AccountNumber String [0-9 \-]{0,17}
AccountType String (CHECKING)
CardNumber String [0-9 ]{0,40}
CardExpiryMonth String [0-9]{0,2}
CardExpiryYear String [0-9]{0,2}
CardHolderName String .{0,50}
CardName String .{0,50}
CardNameFirst String .{0,50}
CardNameLast String .{0,50}
TokenizeCardSelected String .{0,80}
HideCancelButton String (on)
PayButtonText String .{0,80}

Making a tokenized payment

For processing repeated payments, the API provides a Tokenization option which eliminates the need to enter the card number. When a payment is to be processed, an HTTPS POST request must be sent with the mandatory parameters outlined in this document. Once the transaction has been attempted, HPP will send the transaction result back to the merchant system in the CallbackURL defined in the request POST on an HTTP redirect after the transaction completes.

Recurring payments

Tokenized card payment: sample form

<form action="URL" method="POST">
   <input type="hidden" name="Token" value="7c67e64d019a8354b7550ebae100e7db7bf72a08">
   <input type="hidden" name="CallbackURL" value="http://abc.com/callback">
   <input type="hidden" name="MID" value="203457">
   <input type="hidden" name="CustomerEmail" value="test@ippay.com">
   <input type="hidden" name="CustomerId" value="203450">
   <input type="hidden" name="IsRecurring" value="false">
   <input type="hidden" name="CardToken" value="0K4K2B1F1HRM1234">
   <input type="hidden" name="SaveForFuture" value="true">
   <input type="hidden" name="ReferenceId" value="128438265846826">
   <input type="hidden" name="Amount" value="10.00">
   <input type="hidden" name="PaymentType" value="CC">
   <input type="hidden" name="TransactionType" value="SALE">
   <input type="submit" value="Pay Now"/>
</form>
var httpClient = new HttpClient();
var bodyXmlString =@"<form action=""URL"" method=""POST"">" + "\n" +
@"   <input type=""hidden"" name=""Token"" value=""7c67e64d019a8354b7550ebae100e7db7bf72a08"">" + "\n" +
@"   <input type=""hidden"" name=""CallbackURL"" value=""http://abc.com/callback"">" + "\n" +
@"   <input type=""hidden"" name=""MID"" value=""203457"">" + "\n" +
@"   <input type=""hidden"" name=""CustomerEmail"" value=""test@ippay.com"">" + "\n" +
@"   <input type=""hidden"" name=""CustomerId"" value=""203450"">" + "\n" +
@"   <input type=""hidden"" name=""IsRecurring"" value=""false"">" + "\n" +
@"   <input type=""hidden"" name=""CardToken"" value=""0K4K2B1F1HRM1234"">" + "\n" +
@"   <input type=""hidden"" name=""SaveForFuture"" value=""true"">" + "\n" +
@"   <input type=""hidden"" name=""ReferenceId"" value=""128438265846826"">" + "\n" +
@"   <input type=""hidden"" name=""Amount"" value=""10.00"">" + "\n" +
@"   <input type=""hidden"" name=""PaymentType"" value=""CC"">" + "\n" +
@"   <input type=""hidden"" name=""TransactionType"" value=""SALE"">" + "\n" +
@"   <input type=""submit"" value=""Pay Now""/>" + "\n" +
@"</form>";

var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://testgtwy.ippay.com/ippay/", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://testgtwy.ippay.com/ippay',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '<form action="URL" method="POST">\n   <input type="hidden" name="Token" value="7c67e64d019a8354b7550ebae100e7db7bf72a08">\n   <input type="hidden" name="CallbackURL" value="http://abc.com/callback">\n   <input type="hidden" name="MID" value="203457">\n   <input type="hidden" name="CustomerEmail" value="test@ippay.com">\n   <input type="hidden" name="CustomerId" value="203450">\n   <input type="hidden" name="IsRecurring" value="false">\n   <input type="hidden" name="CardToken" value="0K4K2B1F1HRM1234">\n   <input type="hidden" name="SaveForFuture" value="true">\n   <input type="hidden" name="ReferenceId" value="128438265846826">\n   <input type="hidden" name="Amount" value="10.00">\n   <input type="hidden" name="PaymentType" value="CC">\n   <input type="hidden" name="TransactionType" value="SALE">\n   <input type="submit" value="Pay Now"/>\n</form>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://testgtwy.ippay.com/ippay');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('<form action="URL" method="POST">\n   <input type="hidden" name="Token" value="7c67e64d019a8354b7550ebae100e7db7bf72a08">\n   <input type="hidden" name="CallbackURL" value="http://abc.com/callback">\n   <input type="hidden" name="MID" value="203457">\n   <input type="hidden" name="CustomerEmail" value="test@ippay.com">\n   <input type="hidden" name="CustomerId" value="203450">\n   <input type="hidden" name="IsRecurring" value="false">\n   <input type="hidden" name="CardToken" value="0K4K2B1F1HRM1234">\n   <input type="hidden" name="SaveForFuture" value="true">\n   <input type="hidden" name="ReferenceId" value="128438265846826">\n   <input type="hidden" name="Amount" value="10.00">\n   <input type="hidden" name="PaymentType" value="CC">\n   <input type="hidden" name="TransactionType" value="SALE">\n   <input type="submit" value="Pay Now"/>\n</form>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

IsRecurring: For recurring transactions, the 'IsRecurring' parameter should be set to true (or 1). The Card Token must be passed in the CardToken parameter for Recurring payments.

Request Parameters: making a tokenized card payment

The following parameters can be passed to HPP for tokenized payments:

SR No Parameter Name Required Description
1 CustomerID Yes • Unique Id assigned to you by IPpay
2 MID Yes • Unique Merchant ID assigned by IPpay
3 CustomerEmail No • Email ID of the logged-in user
• Not required, but if entered,
would not be editable in the payment page
4 SaveForFuture Yes • Indicates whether the card data needs to be Tokenized (a card token is generated). Valid values are:
o true (or 1) – when token needs to be generated
o false (or 0)
5 ReferenceID Yes • A unique reference ID created by client. This same reference ID will be returned
in the callback parameters of the response.
6 Amount Yes • For all tokenize request, Amount field must be 0.00
7 CallbackURL Yes • URL of Merchant server where HPP will deliver transaction results
8 Token Yes • Used to authenticate that the request came from client web application
• Authentication Token generated by applying Secure hash Algorithm (SHA1) combination of ReferenceID and SecurityKey – Password assigned by IPpay
9 IsRecurring Yes • Default Value = true (or 1)
10 CardToken Yes • Will contain the Card token. If IsRecurring is set to true (or 1), then this will be required
11 PaymentType No • ThePayment type of the transaction – Credit Card, Prepaid and eCheck. Must be one of the
following values:
• CC
• ECHECK
• PREPAID
12 TransactionType No • Must be one of the following values:
• SALE
• CHECK
13 TerminalId No • Not required but if entered, the same value will be used, else a value will
be picked from the Merchant-Terminal mapping created during merchant onboarding to HPP
14 CustomField1 No Any unique value entered by client for reference.
This same value will be returned in the Callback parameters response for CustomField1.
15 CustomField2 No • Any unique value entered by client for reference. This same value will be returned in the Callback parameters response for CustomField2.
16 CustomField3 No • Any unique value entered by client for reference. This same value will
be returned in the Callback parameters response for CustomField3.
17 UDField1 No • Any user defined value entered by client for reference. If no value is entered, the ReferenceID will be sent in the UDField1 field. Field value can have forced unique attribute activated, whereby subsequent transactions using the same UDField1 value within 32 days will be automatically declined. To have this feature enabled, please contact IPpay.
18 UDField2 No Any user defined value entered by client for reference
19 OrderNumber No • Optional(this field drives dynamic descriptor when product is turned on, else is only informational). Dynamic Descriptor allows merchants to pass through an alternative “doing business as” (DBA) name in the Charge Description field so that it appears on the customer's bank statement. This additional information can help avoid unnecessary disputes. For example, if your legal merchant name is different from the DBA name you’re using for your ecommerce website, the descriptor can be the website name. That way, it will appear on the customer’s bank statement to help them recognize the charge. At this time, American Express does not support the Dynamic Descriptor product for merchants using the American Express OptBlue Program.

Tokenized card payment: response parameters

Tokenized card payment: sample callback form:

<form action="URL" method="POST">
   <input type="hidden" name="ReturnToken" value="7c67e64d019a8354b7550ebae100e7db7bf72a08">
   <input type="hidden" name="TransactionID" value="375837556843432">
   <input type="hidden" name="AuthCode" value="568374">
   <input type="hidden" name="Valid" value="TRUE">
   <input type="hidden" name="ResponseText" value="Transaction is Successful">
   <input type="hidden" name="CardToken" value="4E4GT3QP4ACD1111">
   <input type="hidden" name="Address" value="Street1">
   <input type="hidden" name="City" value="Atlanta">
   <input type="hidden" name="State" value="Georgia">
   <input type="hidden" name="Zip" value="30031">
   <input type="hidden" name="Country" value="US">
   <input type="hidden" name="ResponseCode" value="AFS-103">
   <input type="hidden" name="PaymentType" value="CC">
   <input type="hidden" name="CardNumber" value="12XXXXXXXXXX3456">
   <input type="hidden" name="CardExpiryMonth" value="01">
   <input type="hidden" name="CardExpiryYear" value="16">
   <input type="hidden" name="CardHolderName" value="John Doe">
   <input type="hidden" name="TokenizeCardSelected" value="Yes">
   <input type="submit" value="Pay Now"/>
</form>

When the transaction attempt has been completed, HPP will return the status of the transaction back to the CallbackURL defined in the request POST on an HTTP redirect after the transaction completes.

The following are parameters returned to the Callback URL:

SR No Parameter Name Required Description
1 ReferenceID Yes • The Request ReferenceID sent back in response
2 AuthCode Yes • Authorization code obtained by IPpay from Issuer for this transaction
• Only returned when Valid=True.
3 Valid Yes • 'True' or 'False' and indicates the acceptance of transaction
4 ResponseText Yes • Returned to user with message concerning transaction status
• Ex: Your transaction was successful, Transaction cannot be accepted, Invalid
• Transaction, etc.
5 TransactionID Yes
6 ReturnToken Yes • Response Token generated to validate the transaction.
• SHA1 hash of the following:
SecurityKey + TransactionId + AuthCode
7 CardToken Yes • Token returned to the user
8 Address
City
State
Zip
Country
Yes • If response parameter 'Valid' = True, then address will be returned, else not (no AVS related errors)
9 ResponseCode Yes • Response code from the Gateway will be returned
• Response codes:
USER_CANCELLED = 'AFS-103'
MAXIMUM_RETRIES_REACHED = 'AFS-102'
TIMEOUT_EXPIRED = 'AFS-101'
10 PaymentType Yes • Values can be CC, ECHECK or PREPAID
11 CardNumber Yes • Masked Card Number of the Card used for payment
• All digits except the first two and last four will be replaced with 'X'
12 CardExpiryMonth Yes • Two-digit card expiration month
13 CardExpiryYear Yes • Two-digit card expiration year
14 CardHolderName Yes • Name of cardholder
15 TokenizeCardSelected Yes • Value will be 'Yes'
16 TerminalId No • Not required but if entered, the same
• value will be used, else a value will be selected from the Merchant-Terminal mapping
17 CustomField1 No • Any unique value entered by client for reference. This same value will be returned in Callback parameters response for CustomField1.
18 CustomField2 No • Any unique value entered by client for reference. This same value will be returned in Callback parameters in response for CustomField2.
19 CustomField3 No • Any unique value entered by client for reference. This same value will be returned in Callback parameters in response for CustomField3.
20 ProcessedAmount Yes • Amount processed in cents where 100 is $1.00. Will be '0' (zero) for a failed transaction and '' (null) for unknown errors.

Generating a Token

Credit card data can be tokenized to allow a token to be used in lieu of the card number for payment processing. The Transaction Type in this case is 'TOKENIZE'. When a payment is to be processed, an HTTPS POST request must be sent with the mandatory parameters outlined in this document.

Generating a token: request parameters

The following parameters can be passed to HPP for requesting a Token:

SR No Parameter Name Required Description
1 CustomerID Yes • Unique Id assigned to you by IPpay
2 MID Yes • Unique Merchant ID assigned by IPpay
3 CustomerEmail No • The Email ID of the logged-in user
• Not required but if entered, would not be editable in the payment page
4 SaveForFuture No • Indicates whether the card data needs to be Tokenized (a card token is generated). Valid values are:
o true (or 1) – when token needs to be generated
o false (or 0)
5 ReferenceID Yes • A unique reference ID created by client. This same reference ID will be returned
in the callback parameters of the response.
6 Amount No • Transaction amount with no currency symbol or formatting (No comma)
• Must contain one decimal and two digits to the right of the decimal (.00)
7 CallbackURL Yes • URL of Merchant server where HPP will deliver transaction results
8 Token Yes • Used to authenticate that the request came from client web application
• Authentication Token generated by applying Secure hash Algorithm (SHA1) combination of ReferenceID and SecurityKey – Password assigned by IPpay
9 IsRecurring Yes • Default Value = true (or 1)
• Required field - transaction will be processed without displaying the hosted page to the user
10 CardToken No • Will contain the Card token. If IsRecurring is set to true (or 1), then this will be required
11 PaymentType No • The Payment type of the transaction – Credit Card, Pre-paid and eCheck. Must be one of the following values:
• CC
• Echeck
• PREPAID
12 TransactionType Yes • TOKENIZE
13 TerminalId No • Not required but if entered, the same value will be used, else a value will be picked from the
• Merchant-Terminal mapping created during merchant onboarding to HPP
14 CustomField1 No • Any unique value entered by client for reference. This same value will be returned in Callback parameters response for CustomField1.
15 CustomField2 No Any unique value entered by client for reference. This same value will be returned in Callback parameters response for CustomField2.
16 CustomField3 No • Any unique value entered by client for reference. This same value will be returned in Callback parameters response for CustomField3.
17 UDField1 No • Any user defined value entered by client for reference. If no value is
entered,ReferenceID will be sent in UDField1. Field value can have forced unique attribute activated, whereby subsequent transactions using the
same UDField1 value within 32 days will be automatically declined. To have this feature enabled, please contact IPpay.
18 UDField2 No • User defined value entered by client for reference
19 UDField3 No • User defined value entered by client for reference

Generating a token: sample form

Generating a token: sample form:

<form action="URL" method="POST">
   <input type="hidden" name="Token" value="7c67e64d019a8354b7550ebae100e7db7bf72a08">
   <input type="hidden" name="CallbackURL" value="http://abc.com/callback">
   <input type="hidden" name="MID" value="203457">
   <input type="hidden" name="CustomerEmail" value="test@ippay.com">
   <input type="hidden" name="CustomerId" value="203450">
   <input type="hidden" name="ReferenceId" value="128438265846826">
   <input type="hidden" name="Amount" value="0.00">
   <input type="hidden" name="TransactionType" value="TOKENIZE">
   <input type="submit" value="Pay Now"/>
</form>
var httpClient = new HttpClient();
var bodyXmlString = @"<form action=""URL"" method=""POST"">" + "\n" +
@"   <input type=""hidden"" name=""Token"" value=""7c67e64d019a8354b7550ebae100e7db7bf72a08"">" + "\n" +
@"   <input type=""hidden"" name=""CallbackURL"" value=""http://abc.com/callback"">" + "\n" +
@"   <input type=""hidden"" name=""MID"" value=""203457"">" + "\n" +
@"   <input type=""hidden"" name=""CustomerEmail"" value=""test@ippay.com"">" + "\n" +
@"   <input type=""hidden"" name=""CustomerId"" value=""203450"">" + "\n" +
@"   <input type=""hidden"" name=""ReferenceId"" value=""128438265846826"">" + "\n" +
@"   <input type=""hidden"" name=""Amount"" value=""0.00"">" + "\n" +
@"   <input type=""hidden"" name=""TransactionType"" value=""TOKENIZE"">" + "\n" +
@"   <input type=""submit"" value=""Pay Now""/>" + "\n" +
@"</form>";

var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://testgtwy.ippay.com/ippay/", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://testgtwy.ippay.com/ippay',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '<form action="URL" method="POST">\n   <input type="hidden" name="Token" value="7c67e64d019a8354b7550ebae100e7db7bf72a08">\n   <input type="hidden" name="CallbackURL" value="http://abc.com/callback">\n   <input type="hidden" name="MID" value="203457">\n   <input type="hidden" name="CustomerEmail" value="test@ippay.com">\n   <input type="hidden" name="CustomerId" value="203450">\n   <input type="hidden" name="ReferenceId" value="128438265846826">\n   <input type="hidden" name="Amount" value="0.00">\n   <input type="hidden" name="TransactionType" value="TOKENIZE">\n   <input type="submit" value="Pay Now"/>\n</form>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://testgtwy.ippay.com/ippay');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('<form action="URL" method="POST">\n   <input type="hidden" name="Token" value="7c67e64d019a8354b7550ebae100e7db7bf72a08">\n   <input type="hidden" name="CallbackURL" value="http://abc.com/callback">\n   <input type="hidden" name="MID" value="203457">\n   <input type="hidden" name="CustomerEmail" value="test@ippay.com">\n   <input type="hidden" name="CustomerId" value="203450">\n   <input type="hidden" name="ReferenceId" value="128438265846826">\n   <input type="hidden" name="Amount" value="0.00">\n   <input type="hidden" name="TransactionType" value="TOKENIZE">\n   <input type="submit" value="Pay Now"/>\n</form>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

Generating a token: response parameters

Generating a token sample callback form

<form action="URL" method="POST">
   <input type="hidden" name="ReturnToken" value="7c67e64d019a8354b7550ebae100e7db7bf72a08">
   <input type="hidden" name="TransactionID" value="375837556843432">
   <input type="hidden" name="AuthCode" value="568374">
   <input type="hidden" name="Valid" value="TRUE">
   <input type="hidden" name="ResponseText" value="Transaction is Successful">
   <input type="hidden" name="CardToken" value="4E4GT3QP4ACD1111">
   <input type="hidden" name="ResponseCode" value="AFS-103">
   <input type="hidden" name="CardNumber" value="12XXXXXXXXXX3456">
   <input type="hidden" name="CardExpiryMonth" value="01">
   <input type="hidden" name="CardExpiryYear" value="16">
   <input type="hidden" name="CardHolderName" value="John Doe">
   <input type="hidden" name="TokenizeCardSelected" value="Yes">
   <input type="submit" value="Pay Now"/>
</form>

When the transaction attempt has been completed, HPP will return the status of the transaction back to the CallbackURL defined in the request POST on an HTTP redirect after the transaction completes.

The following are parameters returned to the CallbackURL:

SR No Parameter Name Required Description
1 ReferenceID Yes • The Request ReferenceID sent back in response
2 AuthCode Yes • Authorization code obtained by IPpay from Issuer for this transaction
• Only returned when Valid=True.
3 Valid Yes • 'True' or 'False' and indicates the acceptance of transaction
4 ResponseText Yes • Returned to user with message concerning transaction status
• Ex: Your transaction was successful, Transaction cannot be accepted, Invalid
• Transaction, etc.
5 TransactionID Yes
6 ReturnToken Yes • Response Token generated to validate the transaction.
• SHA1 applied using the combination of: SecurityKey + TransactionId + AuthCode
7 CardToken Yes • Token that will be returned to the user
8 Address
City
State
Zip
Country
Yes • If Valid is true, then address will be returned, else not (no AVS related errors)
• A response code from the Gateway will be also be returned
9 ResponseCode Yes • Response codes:
USER_CANCELLED = 'AFS-103'
MAXIMUM_RETRIES_REACHED = 'AFS-102'
TIMEOUT_EXPIRED = 'AFS-101'
10 PaymentType Yes • Values can be CC, ECHECK or PREPAID
11 CardNumber Yes • Masked Card Number of the Card used for payment
• All the digits except the first two and last four will be replaced with 'X'
12 CardExpiryMonth Yes • Two-digit card expiration month
13 CardExpiryYear Yes • Two-digit card expiration year
14 CardHolderName Yes • Name of cardholder
15 TokenizeCardSelected Yes • Value will be 'Yes'
16 TerminalId No • Not required but if entered, the same
• value will be used, else a value will be selected from the Merchant-Terminal mapping
17 CustomField1 No • Any unique value entered by client for reference. This same value will be returned in Callback parameters response for CustomField1.
18 CustomField2 No • Any unique value entered by client for reference. This same value will be returned in Callback parameters in response for CustomField2.
19 CustomField3 No • Any unique value entered by client for reference. This same value will be returned in Callback parameters in response for CustomField3.

Making an enquiry

HPP can be queried for status and details on a transaction that was previously attempted. The Transaction Type for such enquiries is 'ENQ'.

Making an enquiry: request parameters

Making an enquiry sample form:

<form action="URL" method="POST">
   <input type="hidden" name="Token" value="7c67e64d019a8354b7550ebae100e7db7bf72a08">
   <input type="hidden" name="CallbackURL" value="http://abc.com/callback">
   <input type="hidden" name="MID" value="203457">
   <input type="hidden" name="CustomerId" value="203450">
   <input type="hidden" name="ReferenceId" value="128438265846826">
   <input type="hidden" name="ENQReferenceId" value="456271127632">
   <input type="submit" value="Enquire"/>
</form>
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://hpp-test.ippay.com/api/process');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Accept-Language' => 'application/json',
  'Accept' => 'application/json',
  'Content-Type' => 'application/json'
));
$request->setBody('{
\n  "CustomerId": "1",
\n  "MID": "84870016470857",
\n  "ReferenceId": "20170j8k4p30967m99b1mkp",
\n  "Amount": "0.00",
\n  "Token": "a984d060facee2031018ef0285d77dd0b36d5ef0",
\n  "IsRecurring": "",
\n  "CardToken": "",
\n  "CustomerEmail": "test@ippay.com",
\n  "SaveForFuture": "false",
\n  "CallbackURL": "https://company.com/callback",
\n  "CustomField1": "",
\n  "CustomField2": "",
\n  "CustomField3": "",
\n  "PaymentType": "CC",
\n  "TransactionType": "ENQ",
\n  "ENQReferenceId": "",
\n  "TransactionId": "A20181220161345520"
\n}');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}
var httpClient = new HttpClient();
var bodyXmlString = @"{
    " + "\n" +
                @"  ""CustomerId"": ""1"",
    " + "\n" +
                @"  ""MID"": ""84870020092593"",
    " + "\n" +
                @"  ""ReferenceId"": ""2o17kl1417k044044144"",
    " + "\n" +
                @"  ""Amount"": ""201.00"",
    " + "\n" +
                @"  ""Token"": ""32ae76f9fc20c0af646f237987b1c08bc0a03a44"",
    " + "\n" +
                @"  ""IsRecurring"": ""true"",
    " + "\n" +
                @"  ""CardToken"": ""4H4D4L5H4F4A1111"",
    " + "\n" +
                @"  ""CustomerEmail"": ""test@ippay.com"",
    " + "\n" +
                @"  ""SaveForFuture"": ""false"",
    " + "\n" +
                @"  ""CallbackURL"": ""https://merchant.com/callback"",
    " + "\n" +
                @"  ""CustomField1"": """",
    " + "\n" +
                @"  ""CustomField2"": """",
    " + "\n" +
                @"  ""CustomField3"": """",
    " + "\n" +
                @"  ""PaymentType"": ""CC"",
    " + "\n" +
                @"  ""TransactionType"": ""SALE"",
    " + "\n" +
                @"  ""ENQReferenceId"": """",
    " + "\n" +
                @"  ""TransactionId"": """"
    " + "\n" +
                @"}";

var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/json");
var respone = await httpClient.PostAsync("https://hpp-test.ippay.com/api/process", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://hpp-test.ippay.com/api/process',
  'headers': {
    'Accept-Language': 'application/json',
    'Accept': 'application/json',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    "CustomerId": "1",
    "MID": "84870020092593",
    "ReferenceId": "2o17kl1417k044044144",
    "Amount": "201.00",
    "Token": "32ae76f9fc20c0af646f237987b1c08bc0a03a44",
    "IsRecurring": "true",
    "CardToken": "4H4D4L5H4F4A1111",
    "CustomerEmail": "test@ippay.com",
    "SaveForFuture": "false",
    "CallbackURL": "https://merchant.com/callback",
    "CustomField1": "",
    "CustomField2": "",
    "CustomField3": "",
    "PaymentType": "CC",
    "TransactionType": "SALE",
    "ENQReferenceId": "",
    "TransactionId": ""
  })

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});

The following parameters can be passed to HPP for making an ENQ:

SR No Parameter Name Required Description
1 CustomerID Yes • Unique ID assigned to you by IPpay
2 MID Yes • Unique Merchant ID assigned by IPpay
3 ReferenceID Yes • A unique reference ID created by client. This same reference ID will be
returned in the callback parameters of the response.
4 TransactionID Yes Transaction ID of the transaction whose details are being enquired
5 Token Yes • Used to authenticate the request came from client web application
• Authentication Token generated by applying Secure hash Algorithm (SHA1) combination of ReferenceID and SecurityKey – Password assigned by IPpay
6 ENQReferenceId Yes • ReferenceID of the transaction whose details are being enquired
7 CallbackURL Yes • URL of Merchant server where HPP will deliver transaction results
8 TerminalId No • Not required but if entered, the same value will be used, else a value
will be picked from the Merchant-Terminal mapping created during merchant onboarding to HPP. Must match the TerminalID used to process the transaction originally.
9 CustomField1 No Any unique value entered by client for reference. This same value will be returned in the Callback parameters response for CustomField1.
10 CustomField2 No • Any unique value entered by client for reference.
This same value will be returned in the Callback parameters response for CustomField2.
11 CustomField3 No • Any unique value entered by client for reference. This same value will be returned in the Callback parameters response for CustomField3.
12 UDField1 No • Any user defined value entered by client for reference. If no value is entered, the ReferenceID will be sent in the UDField1 field. Field value can have forced unique attribute activated, whereby subsequent transactions using the same UDField1 value within 32 days will be automatically declined. To have this feature enabled, please contact IPpay.
13 UDField2 No Any user defined value entered by client for reference
14 UDField3 No Any user defined value entered by client for reference

Making an enquiry: response parameters

Making an enquiry sample callback form:

<form action="URL" method="POST">
   <input type="hidden" name="ReferenceId" value="128438265846826">
   <input type="hidden" name="AuthCode" value="568374">
   <input type="hidden" name="Valid" value="TRUE">
   <input type="hidden" name="ReturnToken" value="7c67e64d019a8354b7550ebae100e7db7bf72a08">
   <input type="hidden" name="TransactionID" value="375837556843432">
   <input type="hidden" name="SaveForFuture" value="false">
   <input type="hidden" name="Amount" value="1000">
   <input type="hidden" name="IsRecurring" value="false">
   <input type="hidden" name="CardToken" value="4E4GT3QP4ACD1111">
   <input type="hidden" name=" PaymentType" value="CC">
   <input type="hidden" name="TransactionType" value="SALE">
   <input type="submit" value="Return"/>
</form>

When the transaction attempt has been completed, HPP will return the status of the transaction back to the CallbackURL defined in the request POST on an HTTP redirect after the transaction completes.

The following are parameters returned to the CallbackURL:

SR No Parameter Name Required Description
1 ReferenceID Yes • Request ReferenceID sent back in response
2 AuthCode Yes • Authorization code obtained by IPpay from Issuer for this transaction
• Only returned when Valid=True.
3 Valid Yes • 'True' or 'False' and indicates the acceptance of transaction
4 TransactionID Yes • Transaction ID of the transaction whose details are being enquired
5 ReturnToken Yes • Response Token generated to validatethe transaction
• SHA1 hash of the following:
SecurityKey + TransactionId + AuthCode
6 SaveForFuture No • Indicates whether the card data needs to be Tokenized
7 Amount Yes • Transaction amount
8 IsRecurring No • Indicates whether Card Token was used for the transaction
9 CardToken No • Token (in place of Card Number) used for processing the transaction
10 PaymentType No • Payment Type of the Transaction
11 TransactionType No • Transaction Type
12 TerminalId No • Not required but if entered, the same value will be used, else a value will be
selected from the Merchant-Terminal mapping created during merchant onboarding to HPP. Must match the TerminalID used to process the transaction originally
13 CustomField1 No • Any unique value entered by client for reference. This same value will be returned in Callback parameters response for CustomField1.
14 CustomField2 No • Any unique value entered by client for reference. This same value will be returned in Callback parameters in response for CustomField2.
15 CustomField3 No • Any unique value entered by client for reference. This same value will be returned
in Callback parameters in response for CustomField3.

Voiding a transaction

A credit card transaction can be VOIDed before the transaction settles. Once the transaction has been attempted, HPP will send the transaction result back to the merchant system in the CallbackURL defined in the request POST on an HTTP redirect after the transaction completes.

Request parameters

This request can be used to VOID a previous AUTH or SALE transaction that has not yet settled. Voiding a transaction sample form:

<form action="URL" method="POST">
   <input type="hidden" name="Token" value="7c67e64d019a8354b7550ebae100e7db7bf72a08">
   <input type="hidden" name="CallbackURL" value="http://abc.com/callback">
   <input type="hidden" name="MID" value="203457">
   <input type="hidden" name="CustomerEmail" value="test@ippay.com">
   <input type="hidden" name="CustomerId" value="203450">
   <input type="hidden" name="ReferenceId" value="128438265846826">
   <input type="hidden" name="Amount" value="10.00">
   <input type="hidden" name="PaymentType" value="CC">
   <input type="hidden" name="TransactionType" value="VOID">
   <input type="submit" value="Pay Now"/>
</form>
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://hpp-test.ippay.com/api/process',
  'headers': {
    'Accept-Language': 'application/json',
    'Accept': 'application/json',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    "CustomerId": "1",
    "MID": "84870016470857",
    "ReferenceId": "99vb0evb990890890890",
    "Amount": "201.00",
    "Token": "2b81d731c3426714f7e21c0c96d522245ecf5e1e",
    "IsRecurring": "true",
    "CardToken": "4H4D4L5H4F4A1111",
    "CustomerEmail": "test@ippay.com",
    "SaveForFuture": "false",
    "CustomField1": "",
    "CustomField2": "",
    "CustomField3": "",
    "PaymentType": "",
    "TransactionType": "VOID",
    "ENQReferenceId": "",
    "TransactionId": "L20181220093153760"
  })

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
var httpClient = new HttpClient();
var bodyXmlString =  @"{
" + "\n" +
@"  ""CustomerId"": ""1"",
" + "\n" +
@"  ""MID"": ""84870016470857"",
" + "\n" +
@"  ""ReferenceId"": ""99vb0evb990890890890"",
" + "\n" +
@"  ""Amount"": ""201.00"",
" + "\n" +
@"  ""Token"": ""2b81d731c3426714f7e21c0c96d522245ecf5e1e"",
" + "\n" +
@"  ""IsRecurring"": ""true"",
" + "\n" +
@"  ""CardToken"": ""4H4D4L5H4F4A1111"",
" + "\n" +
@"  ""CustomerEmail"": ""test@ippay.com"",
" + "\n" +
@"  ""SaveForFuture"": ""false"",
" + "\n" +
@"  ""CustomField1"": """",
" + "\n" +
@"  ""CustomField2"": """",
" + "\n" +
@"  ""CustomField3"": """",
" + "\n" +
@"  ""PaymentType"": """",
" + "\n" +
@"  ""TransactionType"": ""VOID"",
" + "\n" +
@"  ""ENQReferenceId"": """",
" + "\n" +
@"  ""TransactionId"": ""L20181220093153760""
" + "\n" +
@"}
" + "\n" +
@"
" + "\n" +
@"";

var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/json");
var respone = await httpClient.PostAsync("https://hpp-test.ippay.com/api/process", stringContent);
Console.WriteLine(response.Content);
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://hpp-test.ippay.com/api/process');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Accept-Language' => 'application/json',
  'Accept' => 'application/json',
  'Content-Type' => 'application/json'
));
$request->setBody('{
\n  "CustomerId": "1",
\n  "MID": "84870016470857",
\n  "ReferenceId": "99vb0evb990890890890",
\n  "Amount": "201.00",
\n  "Token": "2b81d731c3426714f7e21c0c96d522245ecf5e1e",
\n  "IsRecurring": "true",
\n  "CardToken": "4H4D4L5H4F4A1111",
\n  "CustomerEmail": "test@ippay.com",
\n  "SaveForFuture": "false",
\n  "CustomField1": "",
\n  "CustomField2": "",
\n  "CustomField3": "",
\n  "PaymentType": "",
\n  "TransactionType": "VOID",
\n  "ENQReferenceId": "",
\n  "TransactionId": "L20181220093153760"
\n}
\n
\n');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

The following parameters can be passed to HPP for VOIDing a transaction:

SR No Parameter Name Required Description
1 CustomerID Yes • Unique Id assigned to you by IPpay
2 MID Yes • Unique Merchant ID assigned by IPpay
3 CustomerEmail No • Email ID of the logged-in user
• Not required but if entered, would not be editable in the payment page
4 ReferenceID Yes • A unique reference ID created by client. This same reference ID will be returned in the callback parameters of the response.
5 Amount Yes • Transaction amount with no currency symbol or formatting (No comma)
• May contain decimals
• Will be zero when Transaction Type is either Tokenize or ENQ.
6 CallbackURL Yes • URL of Merchant server where HPP will deliver transaction results
7 Token Yes • Used to authenticate whether the request indeed came from the client web application
• Authentication Token generated by applying Secure hash Algorithm (SHA1) combination of ReferenceID and SecurityKey – Password assigned by IPpay
8 PaymentType Yes • The Payment type of the transaction – Credit Card, Pre-paid and eCheck. Must be one of the following values:
• CC
• ACH
• PREPAID
9 TransactionType Yes • VOID
10 TransactionID Yes
11 TerminalId No • Not required but if entered, the same value will be used, else a value will be selected from the Merchant-Terminal mapping created during merchant onboarding to HPP
12 CustomField1 No • Any unique value entered by client for reference. This same value will be returned in the Callback parameters response for CustomField1.
13 CustomField2 No • Any unique value entered by client for reference. This same value will be returned in the Callback parameters response for CustomField2.
14 CustomField3 No • Any unique value entered by client for reference.
This same value will be returned in the Callback parameters response for CustomField3.
15 CustomField4 No • Any unique value entered by client for reference.
This same value will be returned in Callback parameters response for CustomField4.
16 UDField1 No • Any user defined value entered by client for reference. If no value is entered,
the ReferenceID will be sent in the UDField1 field. Field value can have forced unique attribute activated, whereby subsequent transactions using the same UDField1 value within 32 days will be automatically declined. To have this feature enabled, please contact IPpay.
17 UDField2 No • Any user defined value entered by client for reference
18 UDField3 No • Any user defined value entered by client for reference

Response parameters

Voiding a transaction: sample callback form:

<form action="URL" method="POST">
   <input type="hidden" name="ReturnToken" value="7c67e64d019a8354b7550ebae100e7db7bf72a08">
   <input type="hidden" name="TransactionID" value="375837556843432">
   <input type="hidden" name="AuthCode" value="568374"> 
   <input type="hidden" name="Valid" value="TRUE">
   <input type="hidden" name="ResponseText" value="Transaction is Successful">
   <input type="hidden" name="Address" value="Street1">
   <input type="hidden" name="City" value="Atlanta">
   <input type="hidden" name="State" value="Georgia">
   <input type="hidden" name="Zip" value="30031">
   <input type="hidden" name="Country" value="US">
   <input type="hidden" name="ResponseCode" value="AFS-103">
   <input type="hidden" name="PaymentType" value="CC">
   <input type="hidden" name="CardNumber" value="12XXXXXXXXXX3456">
   <input type="hidden" name="CardExpiryMonth" value="01">
   <input type="hidden" name="CardExpiryYear" value="16">
   <input type="hidden" name="CardHolderName" value="John Doe">
   <input type="submit" value="Pay Now"/>
</form>

When the transaction attempt has been completed, HPP will return the status of the transaction back to the CallbackURL defined in the request POST on an HTTP redirect after the transaction completes.

The following are parameters returned to the CallbackURL:

SR No Parameter Name Required Description
1 ReferenceID Yes • The request ReferenceID sent back in response
2 AuthCode Yes • Authorization code obtained by IPpay from Issuer for this transaction
• Only returned when Valid=True.
3 Valid Yes • 'True' or 'False' and indicates the acceptance of transaction
4 ResponseText Yes • Returned to user with message concerning transaction status
• Ex: Your transaction was successful, Transaction cannot be accepted, Invalid Transaction, etc.
5 TransactionID Yes • Transaction ID of the transaction being VOIDed
6 ReturnToken Yes • Response Token generated to validatethe transaction.
• SHA1 hash of the following:
SecurityKey + TransactionId + AuthCode
7 Address
City
State
Zip
Country
Yes • If response parameter 'Valid' = true, then address will be returned, else not (no AVS related errors)
8 ResponseCode Yes • Response code from the Gateway will be also be returned
• Response codes:
USER_CANCELLED = 'AFS-103'
MAXIMUM_RETRIES_REACHED = 'AFS-102'
• TIMEOUT_EXPIRED = 'AFS-101'
9 PaymentType Yes Values can be CC, ECHECK or PREPAID
10 CardNumber Yes • Masked Card Number of the Card used for payment
• All the digits except the first two and last four will be replaced with 'X'
11 CardExpiryMonth Yes • Two-digit card expiration month
12 CardExpiryYear Yes • Two-digit card expiration year
13 CardHolderName Yes • Name of cardholder
14 TerminalId No • Not required but if entered, the same value will be used, else a value will be selected from the Merchant-Terminal mapping
15 CustomField1 No • Any unique value entered by client for reference. This same value will be
returned in Callback parameters response for CustomField1.
16 CustomField2 No • Any unique value entered by client for reference. This same value will be
returned in Callback parameters in response for CustomField2.
17 CustomField3 No • Any unique value entered by client for reference. This same value will be
returned in Callback parameters in response for CustomField3.
18 CustomField4 No • Any unique value entered by client for reference. This same value will be
returned in Callback parameters response for CustomField4.

Making a refund

The Hosted page can be used to process refund transactions. Once the transaction has been attempted, HPP will send the transaction result back to the merchant system in the CallbackURL defined in the request POST on an HTTP redirect after the transaction completes.

Making a refund: request parameters

This request can be used to REFUND a transaction using the Transaction ID from the previous SALE. Making a refund sample form:

<form action="URL" method="POST">
   <input type="hidden" name="Token" value="7c67e64d019a8354b7550ebae100e7db7bf72a08">
   <input type="hidden" name="CallbackURL" value="http://abc.com/callback">
   <input type="hidden" name="MID" value="203457">
   <input type="hidden" name="CustomerEmail" value="test@ippay.com">
   <input type="hidden" name="CustomerId" value="203450">
   <input type="hidden" name="ReferenceId" value="128438265846826">
   <input type="hidden" name="Amount" value="10.00">
   <input type="hidden" name="PaymentType" value="CC">
   <input type="hidden" name="TransactionType" value="REFUND">
   <input type="submit" value="Pay Now"/>
</form>
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://hpp-test.ippay.com/api/process');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Accept-Language' => 'application/json',
  'Accept' => 'application/json',
  'Content-Type' => 'application/json'
));
$request->setBody('{
\n  "CustomerId": "1",
\n  "MID": "84870020092593",
\n  "ReferenceId": "2o17o80418h392g089909",
\n  "Amount": "200.00",
\n  "Token": "3ed9f4b42dadf002d00e53cee3bd5a355195611f",
\n  "IsRecurring": "true",
\n  "CardToken": "4H4D4L5H4F4A1111",
\n  "CustomerEmail": "test@ippay.com",
\n  "SaveForFuture": "false",
\n  "CallbackURL": "https://company.com/callback",
\n  "CustomField1": "",
\n  "CustomField2": "",
\n  "CustomField3": "",
\n  "PaymentType": "CC",
\n  "TransactionType": "REFUND",
\n  "ENQReferenceId": "",
\n  "TransactionId": "F20181220091942020"
\n}');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}
var httpClient = new HttpClient();
var bodyXmlString =   @"{
" + "\n" +
@"  ""CustomerId"": ""1"",
" + "\n" +
@"  ""MID"": ""84870020092593"",
" + "\n" +
@"  ""ReferenceId"": ""2o17o80418h392g089909"",
" + "\n" +
@"  ""Amount"": ""200.00"",
" + "\n" +
@"  ""Token"": ""3ed9f4b42dadf002d00e53cee3bd5a355195611f"",
" + "\n" +
@"  ""IsRecurring"": ""true"",
" + "\n" +
@"  ""CardToken"": ""4H4D4L5H4F4A1111"",
" + "\n" +
@"  ""CustomerEmail"": ""test@ippay.com"",
" + "\n" +
@"  ""SaveForFuture"": ""false"",
" + "\n" +
@"  ""CallbackURL"": ""https://company.com/callback"",
" + "\n" +
@"  ""CustomField1"": """",
" + "\n" +
@"  ""CustomField2"": """",
" + "\n" +
@"  ""CustomField3"": """",
" + "\n" +
@"  ""PaymentType"": ""CC"",
" + "\n" +
@"  ""TransactionType"": ""REFUND"",
" + "\n" +
@"  ""ENQReferenceId"": """",
" + "\n" +
@"  ""TransactionId"": ""F20181220091942020""
" + "\n" +
@"}";

var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/json");
var respone = await httpClient.PostAsync("https://hpp-test.ippay.com/api/process", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://hpp-test.ippay.com/api/process',
  'headers': {
    'Accept-Language': 'application/json',
    'Accept': 'application/json',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    "CustomerId": "1",
    "MID": "84870020092593",
    "ReferenceId": "2o17o80418h392g089909",
    "Amount": "200.00",
    "Token": "3ed9f4b42dadf002d00e53cee3bd5a355195611f",
    "IsRecurring": "true",
    "CardToken": "4H4D4L5H4F4A1111",
    "CustomerEmail": "test@ippay.com",
    "SaveForFuture": "false",
    "CallbackURL": "https://company.com/callback",
    "CustomField1": "",
    "CustomField2": "",
    "CustomField3": "",
    "PaymentType": "CC",
    "TransactionType": "REFUND",
    "ENQReferenceId": "",
    "TransactionId": "F20181220091942020"
  })

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});

The following parameters can be passed to HPP for making a REFUND:

SR No Parameter Name Required Description
1 CustomerID Yes • Unique ID assigned to you by IPpay.
2 MID Yes • Unique Merchant ID assigned by IPpay
3 CustomerEmail No • Email ID of the logged-in user
• Not required, but if entered, would not be editable in the payment page
4 TransactionID Yes
5 ReferenceID Yes • A unique reference ID created by client. This same reference ID will be returned in the callback parameters of the response.
• Transaction amount with no currency symbol or formatting (No comma)
6 Amount Yes • Must contain one decimal
• Must contain two digits to the right of the decimal point (.00)
7 CallbackURL Yes • URL of Merchant server where HPP will deliver transaction results
8 Token Yes • Used to authenticate the request came from client web application
• Authentication Token generated by applying Secure hash Algorithm (SHA1) combination of ReferenceID and SecurityKey – Password assigned by IPpay
9 PaymentType Yes • The Payment type of the transaction – Credit Card, Pre-paid and eCheck. Must be one of the
following values:
• CC
• Echeck
• PREPAID
10 TransactionType Yes • REFUND
11 TerminalId No • Not required but if entered, the same value will be used, else a value will be selected from the Merchant-Terminal mapping created during merchant onboarding to HPP
12 CustomField1 No • Any unique value entered by client for reference. This same value will be returned in the Callback parameters response for CustomField1.
13 CustomField2 No • Any unique value entered by client for reference. This same value will be returned in the Callback parameters response for CustomField2.
14 CustomField3 No • Any unique value entered by client for reference. This same value will be returned in the
Callback parameters response for CustomField3.
15 UDField1 No • Any user defined value entered by client for reference. If no value is entered, the ReferenceId
will be sent to gateway in the UDField1 field. Field value can have forced unique attribute activated, whereby subsequent transactions using the same UDField1 value within 32 days will be automatically declined. To have this feature enabled, please contact IPpay
16 UDField2 No • Any user defined value entered by client for reference
17 UDField3 No • Any user defined value entered by client for reference

Making a refund: response parameters

Making a refund sample callback form:

<form action="URL" method="POST">
   <input type="hidden" name="ReturnToken" value="7c67e64d019a8354b7550ebae100e7db7bf72a08">
   <input type="hidden" name="TransactionID" value="375837556843432">
   <input type="hidden" name="AuthCode" value="568374">
   <input type="hidden" name="Valid" value="TRUE">
   <input type="hidden" name="ResponseText" value="Transaction is Successful">
   <input type="hidden" name="Address" value="Street1">
   <input type="hidden" name="City" value="Atlanta">
   <input type="hidden" name="State" value="Georgia">
   <input type="hidden" name="Zip" value="30031">
   <input type="hidden" name="Country" value="US">
   <input type="hidden" name="ResponseCode" value="AFS-103">
   <input type="hidden" name="PaymentType" value="CC">
   <input type="hidden" name="CardNumber" value="12XXXXXXXXXX3456">
   <input type="hidden" name="CardExpiryMonth" value="01">
   <input type="hidden" name="CardExpiryYear" value="16">
   <input type="hidden" name="CardHolderName" value="John Doe">
   <input type="submit" value="Pay Now"/>
</form>

When the transaction attempt has been completed, HPP will return the status of the transaction back to the CallbackURL defined in the request POST on an HTTP redirect after the transaction completes.

The following are parameters returned to the CallbackURL:

SR No Parameter Name Required Description
1 ReferenceID Yes • The request ReferenceID sent back in response
2 AuthCode Yes • Authorization code obtained by IPpay from Issuer for this transaction
• Only returned when Valid=True.
3 Valid Yes • 'True' or 'False' and indicates the acceptance of transaction
4 ResponseText Yes • Returned to user with message concerning transaction status
• Ex: Your transaction was successful, Transaction cannot be accepted, Invalid
• Transaction, etc.
5 TransactionID Yes
6 ReturnToken Yes • Response Token generated to validatethe transaction.
• SHA1 hash of the following:
SecurityKey + TransactionId + AuthCode
7 Address
City
State
Zip
Country
Yes • If response parameter 'Valid' = true, then address will be returned, else not (no AVS related errors)
8 ResponseCode Yes • Response code from the Gateway will be returned
• Response codes:
USER_CANCELLED = 'AFS-103'
MAXIMUM_RETRIES_REACHED = 'AFS-102'
• TIMEOUT_EXPIRED = 'AFS-101'
9 PaymentType Yes Values can be CC, ECHECK or PREPAID
10 CardNumber Yes • Masked Card Number of the Card used for payment
• All the digits except the first two and last four will be replaced with 'X'
11 CardExpiryMonth Yes • Two-digit card expiration month
12 CardExpiryYear Yes • Two-digit card expiration year
13 CardHolderName Yes • Name of cardholder
14 TerminalId No • Not required but if entered, the same
• value will be used, else a value will be selected from the Merchant-Terminal mapping
15 CustomField1 No • Any unique value entered by client for reference. This same value will be returned in Callback parameters response for CustomField1.
16 CustomField2 No • Any unique value entered by client for reference. This same value will be returned in Callback parameters in response for CustomField2.
17 CustomField3 No • Any unique value entered by client for reference. The same value will be returned in Callback parameters in response for CustomField3.

Authorizing the card

HPP can be used to authorize a customer’s credit card. Once the transaction has been attempted, HPP will send the transaction result back to the merchant system in the CallbackURL defined in the request POST on an HTTP redirect after the transaction completes.

AUTHONLY payment: request parameters

Authorizing the card sample form:

<form action="URL" method="POST">
   <input type="hidden" name="Token" value="7c67e64d019a8354b7550ebae100e7db7bf72a08">
   <input type="hidden" name="CallbackURL" value="http://abc.com/callback">
   <input type="hidden" name="MID" value="203457">
   <input type="hidden" name="CustomerEmail" value="test@ippay.com">
   <input type="hidden" name="CustomerId" value="203450">
   <input type="hidden" name="ReferenceId" value="128438265846826">
   <input type="hidden" name="TransactionType" value="AUTHONLY">
   <input type="submit" value="Pay Now"/>
</form>
var httpClient = new HttpClient();
var bodyXmlString = @"<form action=""URL"" method=""POST"">" + "\n" +
@"   <input type=""hidden"" name=""Token"" value=""7c67e64d019a8354b7550ebae100e7db7bf72a08"">" + "\n" +
@"   <input type=""hidden"" name=""CallbackURL"" value=""http://abc.com/callback"">" + "\n" +
@"   <input type=""hidden"" name=""MID"" value=""203457"">" + "\n" +
@"   <input type=""hidden"" name=""CustomerEmail"" value=""test@ippay.com"">" + "\n" +
@"   <input type=""hidden"" name=""CustomerId"" value=""203450"">" + "\n" +
@"   <input type=""hidden"" name=""ReferenceId"" value=""128438265846826"">" + "\n" +
@"   <input type=""hidden"" name=""TransactionType"" value=""AUTHONLY"">" + "\n" +
@"   <input type=""submit"" value=""Pay Now""/>" + "\n" +
@"</form>";

var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://testgtwy.ippay.com/ippay/", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://testgtwy.ippay.com/ippay',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '<form action="URL" method="POST">\n   <input type="hidden" name="Token" value="7c67e64d019a8354b7550ebae100e7db7bf72a08">\n   <input type="hidden" name="CallbackURL" value="http://abc.com/callback">\n   <input type="hidden" name="MID" value="203457">\n   <input type="hidden" name="CustomerEmail" value="test@ippay.com">\n   <input type="hidden" name="CustomerId" value="203450">\n   <input type="hidden" name="ReferenceId" value="128438265846826">\n   <input type="hidden" name="TransactionType" value="AUTHONLY">\n   <input type="submit" value="Pay Now"/>\n</form>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://testgtwy.ippay.com/ippay');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('<form action="URL" method="POST">\n   <input type="hidden" name="Token" value="7c67e64d019a8354b7550ebae100e7db7bf72a08">\n   <input type="hidden" name="CallbackURL" value="http://abc.com/callback">\n   <input type="hidden" name="MID" value="203457">\n   <input type="hidden" name="CustomerEmail" value="test@ippay.com">\n   <input type="hidden" name="CustomerId" value="203450">\n   <input type="hidden" name="ReferenceId" value="128438265846826">\n   <input type="hidden" name="TransactionType" value="AUTHONLY">\n   <input type="submit" value="Pay Now"/>\n</form>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

The following parameters can be passed to HPP for making an AUTHONLY:

SR No Parameter Name Required Description
1 CustomerID Yes • Unique Id assigned to you by IPpay
2 MID Yes • Unique Merchant ID assigned by IPpay
• Email ID of the logged-in user
3 CustomerEmail No • Not required, but if entered, would not be editable in the payment page
4 TransactionID Yes
5 ReferenceID Yes • A unique reference ID created by client. This same reference ID will be returned in the callback parameters of the response.
6 Amount Yes • Transaction amount with no currency symbol or formatting (No comma)
7 CallbackURL Yes • URL of Merchant server where HPP will deliver transaction results
8 Token Yes • Used to authenticate the request came from client web application
• Authentication Token generated by applying Secure hash Algorithm (SHA1) combination of ReferenceID and SecurityKey – Password assigned by IPpay
9 TransactionType Yes • AUTHONLY
10 TerminalId No • Not required but if entered, the same value will be used, else a value will be selected from the Merchant-Terminal mapping created during merchant onboarding to HPP
11 CustomField1 No • Any unique value entered by client for reference. This same value will be returned in the Callback parameters response for CustomField1.
12 CustomField2 No • Any unique value entered by client for reference. This same value will be returned in the Callback parameters response for CustomField2.
13 CustomField3 No • Any unique value entered by client for reference. This same value will be returned in the Callback parameters response for CustomField3.
14 UDField1 No • Any user defined value entered by client for reference. If no value is entered,
the ReferenceID will be sent in the UDField1 field. Field value can have forced unique attribute activated, whereby subsequent transactions using the same UDField1 value within 32 days will be automatically declined. To have this feature enabled, please contact IPpay
15 UDField2 No • Any user defined value entered by client for reference
16 UDField3 No • Any user defined value entered by client for reference
17 SaveForFuture No • Save this credit card for future use and return a token.
18 OrderNumber No • Optional(this field drives dynamic descriptor when product is turned on, else is only informational). Dynamic Descriptor allows merchants to pass through an alternative “doing business as” (DBA) name in the Charge Description field so that it appears on the customer's bank statement. This additional information can help avoid unnecessary disputes. For example, if your legal merchant name is different from the DBA name you’re using for your ecommerce website, the descriptor can be the website name. That way, it will appear on the customer’s bank statement to help them recognize the charge. At this time, American Express does not support the Dynamic Descriptor product for merchants using the American Express OptBlue Program.

Authorizing the card: response parameters

Authorizing the card sample callback form:

<form action="URL" method="POST">
   <input type="hidden" name="ReturnToken" value="7c67e64d019a8354b7550ebae100e7db7bf72a08">
   <input type="hidden" name="TransactionID" value="375837556843432">
   <input type="hidden" name="AuthCode" value="568374">
   <input type="hidden" name="Valid" value="TRUE">
   <input type="hidden" name="ResponseText" value="Transaction is Successful">
   <input type="hidden" name="ResponseCode" value="AFS-103">
   <input type="hidden" name="CardNumber" value="12XXXXXXXXXX3456">
   <input type="hidden" name="CardExpiryMonth" value="01">
   <input type="hidden" name="CardExpiryYear" value="16">
   <input type="hidden" name="CardHolderName" value="John Doe">
   <input type="submit" value="Pay Now"/>
</form>

When the transaction attempt has been completed, HPP will return the status of the transaction back to the CallbackURL defined in the request POST on an HTTP redirect after the transaction completes.

The following are parameters returned to the CallbackURL:

SR No Parameter Name Required Description
1 ReferenceID Yes • The request ReferenceID sent back in response
2 AuthCode Yes • Authorization code obtained by IPpay from Issuer for this transaction. Only returned when Valid=True.
3 Valid Yes • 'True' or 'False' and indicates the acceptance of transaction
4 ResponseText Yes • Returned to user with message concerning transaction status
• Ex: Your transaction was successful, Transaction cannot be accepted, Invalid
• Transaction, etc.
5 TransactionID Yes
6 ReturnToken Yes • Response Token generated to validate the transaction.
• SHA1 hash of the following:
SecurityKey + TransactionId + AuthCode
7 ResponseCode Yes • Response code from the Gateway will be returned
• Response codes:
USER_CANCELLED = 'AFS-103'
MAXIMUM_RETRIES_REACHED = 'AFS-102' TIMEOUT_EXPIRED = 'AFS-101'
8 CardNumber Yes • Masked Card Number of the Card used for payment
• All the digits except the first two and last four will be replaced with 'X'
9 CardExpiryMonth Yes • Two-digit card expiration month
10 CardExpiryYear Yes • Two-digit card expiration year
11 CardHolderName Yes • Name of cardholder
12 TerminalId No • Not required but if entered, the same value will be used, else a value will be selected from the Merchant-Terminal mapping
13 CustomField1 No • Any unique value entered by client for reference. This same value will be returned in Callback parameters response for CustomField1.
14 CustomField2 No • Any unique value entered by client for reference. This same value will be returned in Callback parameters in response for CustomField2.
15 CustomField3 No • Any unique value entered by client for reference. This same value will be returned in Callback parameters in response for CustomField3.
16 ProcessedAmount Yes • Amount processed in cents where 100 is $1.00. Will be '0' (zero) for a failed transaction and '' (null) for unknown errors.

Capturing an authorized transaction

Unlike a SALE, an AUTHONLY only verifies the card and holds the amount of the transaction - the money will never leave the cardholder account and be transferred to the merchant unless a CAPTURE transaction is completed for the AUTHONLY. Once the transaction has been attempted, HPP will send the transaction result back to the merchant system in the CallbackURL defined in the request POST on an HTTP redirect after the transaction completes.

CAPT card payment: request parameter

This request can be used to capture a previous AUTH transaction. Capture sample form:

<form action="URL" method="POST">
   <input type="hidden" name="Token" value="7c67e64d019a8354b7550ebae100e7db7bf72a08">
   <input type="hidden" name="CallbackURL" value="http://abc.com/callback">
   <input type="hidden" name="MID" value="203457">
   <input type="hidden" name="CustomerEmail" value="test@ippay.com">
   <input type="hidden" name="CustomerId" value="203450">
   <input type="hidden" name="ReferenceId" value="128438265846826">
   <input type="hidden" name="TransactionType" value="CAPT">
   <input type="hidden" name="TransactionID" value="375837556843432">
   <input type="submit" value="Pay Now"/>
</form>
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://hpp-test.ippay.com/api/process',
  'headers': {
    'Accept-Language': 'application/json',
    'Accept': 'application/json',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    "CustomerId": "1",
    "MID": "84870016470857",
    "ReferenceId": "21k1001gj2zi89999999",
    "Amount": "200.00",
    "Token": "fa353daaf4e94cffd5c91a5cf0c0954d94331ab6",
    "IsRecurring": "true",
    "CardToken": "4H4D4L5H4F4A1111",
    "CustomerEmail": "test@ippay.com",
    "SaveForFuture": "false",
    "CustomField1": "",
    "CustomField2": "",
    "CustomField3": "",
    "PaymentType": "",
    "TransactionType": "CAPT",
    "ENQReferenceId": "",
    "TransactionId": "B20181220091617530"
  })

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
var httpClient = new HttpClient();
var bodyXmlString = @"{
" + "\n" +
@"  ""CustomerId"": ""1"",
" + "\n" +
@"  ""MID"": ""84870016470857"",
" + "\n" +
@"  ""ReferenceId"": ""21k1001gj2zi89999999"",
" + "\n" +
@"  ""Amount"": ""200.00"",
" + "\n" +
@"  ""Token"": ""fa353daaf4e94cffd5c91a5cf0c0954d94331ab6"",
" + "\n" +
@"  ""IsRecurring"": ""true"",
" + "\n" +
@"  ""CardToken"": ""4H4D4L5H4F4A1111"",
" + "\n" +
@"  ""CustomerEmail"": ""test@ippay.com"",
" + "\n" +
@"  ""SaveForFuture"": ""false"",
" + "\n" +
@"  ""CustomField1"": """",
" + "\n" +
@"  ""CustomField2"": """",
" + "\n" +
@"  ""CustomField3"": """",
" + "\n" +
@"  ""PaymentType"": """",
" + "\n" +
@"  ""TransactionType"": ""CAPT"",
" + "\n" +
@"  ""ENQReferenceId"": """",
" + "\n" +
@"  ""TransactionId"": ""B20181220091617530""
" + "\n" +
@"}
" + "\n" +
@"
" + "\n" +
@"";
var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://hpp-test.ippay.com/api/process", stringContent);
Console.WriteLine(response.Content);
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://hpp-test.ippay.com/api/process');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Accept-Language' => 'application/json',
  'Accept' => 'application/json',
  'Content-Type' => 'application/json'
));
$request->setBody('{
\n  "CustomerId": "1",
\n  "MID": "84870016470857",
\n  "ReferenceId": "21k1001gj2zi89999999",
\n  "Amount": "200.00",
\n  "Token": "fa353daaf4e94cffd5c91a5cf0c0954d94331ab6",
\n  "IsRecurring": "true",
\n  "CardToken": "4H4D4L5H4F4A1111",
\n  "CustomerEmail": "test@ippay.com",
\n  "SaveForFuture": "false",
\n  "CustomField1": "",
\n  "CustomField2": "",
\n  "CustomField3": "",
\n  "PaymentType": "",
\n  "TransactionType": "CAPT",
\n  "ENQReferenceId": "",
\n  "TransactionId": "B20181220091617530"
\n}
\n
\n');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

The following parameters can be passed to HPP for making a Capture:

SR No Parameter Name Required Description
1 CustomerID Yes • Unique ID assigned to you by IPpay
2 MID Yes • Unique Merchant ID assigned by IPpay
3 CustomerEmail No • Email ID of the logged-in user
• Not required, but if entered, would not be editable in the payment page
4 ReferenceID Yes • A unique reference ID created by client. This same reference ID will be returned in the callback parameters of the response.
5 CallbackURL Yes • URL of Merchant server where HPP will deliver transaction results
6 Token Yes • Used to authenticate the request came from client web application
• Authentication Token generated by applying Secure hash Algorithm (SHA1) combination of ReferenceID and SecurityKey – Password assigned by IPpay
7 TransactionType Yes • CAPT
8 TransactionID Yes
9 TerminalId No • Not required but if entered, the same value will be used, else a value will be selected from the Merchant-Terminal mapping created during merchant onboarding to HPP
10 CustomField1 No • Any unique value entered by client for reference. This same value will be returned in the Callback parameters response for CustomField1.
11 CustomField2 No • Any unique value entered by client for reference. This same value will be returned in the Callback parameters response for CustomField2.
12 CustomField3 No • Any unique value entered by client for reference. This same value will be returned in the Callback parameters response for CustomField3.
13 UDField1 No • Any user defined value entered by client for reference. If no value is entered, the ReferenceID will be sent in the UDField1 field. Field value can have forced unique attribute activated, whereby subsequent transactions using the same UDField1 value within 32 days will be automatically declined. To have this feature enabled, please contact IPpay.
14 UDField2 No • Any user defined value entered by client for reference
15 UDField3 No • Any user defined value entered by client for reference
16 OrderNumber No • Optional(this field drives dynamic descriptor when product is turned on, else is only informational). Dynamic Descriptor allows merchants to pass through an alternative “doing business as” (DBA) name in the Charge Description field so that it appears on the customer's bank statement. This additional information can help avoid unnecessary disputes. For example, if your legal merchant name is different from the DBA name you’re using for your ecommerce website, the descriptor can be the website name. That way, it will appear on the customer’s bank statement to help them recognize the charge. At this time, American Express does not support the Dynamic Descriptor product for merchants using the American Express OptBlue Program.

Capture: response parameters

Capture sample callback form:

<form action="URL" method="POST">
   <input type="hidden" name="ReturnToken" value="7c67e64d019a8354b7550ebae100e7db7bf72a08">
   <input type="hidden" name="TransactionID" value="375837556843432">
   <input type="hidden" name="AuthCode" value="568374">
   <input type="hidden" name="Valid" value="TRUE">
   <input type="hidden" name="ResponseText" value="Transaction is Successful">
   <input type="hidden" name="ResponseCode" value="AFS-103">
   <input type="submit" value="Pay Now"/>
</form>
SR No Parameter Name Required Description
1 ReferenceID Yes • The request ReferenceID sent back in response
2 AuthCode Yes • Authorization code obtained by IPpay from Issuer for this transaction
• Only returned when Valid=True.
3 Valid Yes • 'True' or 'False' and indicates the acceptance of transaction
4 ResponseText Yes • Returned to user with message concerning transaction status
• Ex: Your transaction was successful, Transaction cannot be accepted, Invalid
• Transaction, etc.
5 TransactionID Yes
6 ReturnToken Yes • Response Token generated to validate the transaction
• SHA1 hash of the following:
SecurityKey + TransactionId + AuthCode
7 ResponseCode Yes • Response code from the Gateway will be returned
• Response codes:
USER_CANCELLED = 'AFS-103'
MAXIMUM_RETRIES_REACHED = 'AFS-102'
TIMEOUT_EXPIRED = 'AFS-101'
8 TerminalId No • Not required but if entered, the same value will be used, else a value will be selected from the merchant-Terminal mapping
9 CustomField1 No • Any unique value entered by client for reference. This same value will be returned in Callback parameters response for CustomField1.
10 CustomField2 No • Any unique value entered by client for reference. This same value will be returned in Callback parameters response for CustomField2.
11 CustomField3 No • Any unique value entered by client for reference. This same value will be returned in Callback parameters response for CustomField3.

AVS and CVV filtering

The Hosted Page allows merchants to automatically Void transactions having received an unfavorable AVS and/or CC Response. We can turn these on in risk to decline transactions based on the AVS and/or CVV values. We can accept or decline a transaction with any response merchant prefers.

For more details on this, please contact the Gateway Provider.

Echo test

Test transaction type ECHO has been added to check if the hosted page service is running. This request needs only four parameters to be sent in the request and will return Echo test successful or Failed as applicable.

Echo test: request parameters

Echo test sample form:

<form action="URL" method="POST">
   <input type="hidden" name="CallbackURL" value="http://abc.com/callback">
   <input type="hidden" name="CustomerId" value="203450">
   <input type="hidden" name="ReferenceId" value="128438265846826">
   <input type="hidden" name="TransactionType" value="ECHO">
   <input type="submit" value="Pay Now"/>
</form>
var httpClient = new HttpClient();
var bodyXmlString = @"<form action=""URL"" method=""POST"">" + "\n" +
@"   <input type=""hidden"" name=""CallbackURL"" value=""http://abc.com/callback"">" + "\n" +
@"   <input type=""hidden"" name=""CustomerId"" value=""203450"">" + "\n" +
@"   <input type=""hidden"" name=""ReferenceId"" value=""128438265846826"">" + "\n" +
@"   <input type=""hidden"" name=""TransactionType"" value=""ECHO"">" + "\n" +
@"   <input type=""submit"" value=""Pay Now""/>" + "\n" +
@"</form>";

var stringContent = new StringContent(bodyXmlString, Encoding.UTF8, "application/xml");
var respone = await httpClient.PostAsync("https://testgtwy.ippay.com/ippay/", stringContent);
Console.WriteLine(response.Content);
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://testgtwy.ippay.com/ippay',
  'headers': {
    'Content-Type': 'application/xml'
  },
  body: '<form action="URL" method="POST">\n   <input type="hidden" name="CallbackURL" value="http://abc.com/callback">\n   <input type="hidden" name="CustomerId" value="203450">\n   <input type="hidden" name="ReferenceId" value="128438265846826">\n   <input type="hidden" name="TransactionType" value="ECHO">\n   <input type="submit" value="Pay Now"/>\n</form>'

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://testgtwy.ippay.com/ippay');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/xml'
));
$request->setBody('<form action="URL" method="POST">\n   <input type="hidden" name="CallbackURL" value="http://abc.com/callback">\n   <input type="hidden" name="CustomerId" value="203450">\n   <input type="hidden" name="ReferenceId" value="128438265846826">\n   <input type="hidden" name="TransactionType" value="ECHO">\n   <input type="submit" value="Pay Now"/>\n</form>');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

The following parameters can be passed to HPP for echo testing:

SR No Parameter Name Required Description
1 CustomerID Yes • Unique ID assigned to you by IPpay.
2 ReferenceID Yes • A unique reference ID created by client. This same reference ID will be returned in the callback parameters of the response.
3 CallbackURL Yes • URL of Merchant server where HPP will deliver transaction results
4 TransactionType Yes • ECHO

Echo test: response parameters

Echo test sample callback form:

<form action="URL" method="POST">
   <input type="hidden" name="IsValid" value="true">
   <input type="submit" value="Pay Now"/>
</form>

When the transaction attempt has been completed, HPP will return the status of the transaction back to the CallbackURL defined in the request POST on an HTTP redirect after the transaction completes.

The following are parameters returned to the CallbackURL:

Following are parameters returned to the calling page.

SR No Parameter Name Required Description
1 ReferenceID Yes • The request ReferenceID sent back in response
2 Valid Yes • 'True' or 'False' and indicates the acceptance of transaction
3 ResponseText Yes • This parameter is returned to user with message. Ex: Echo test successful or Echo test Failed