NAV
php c# java



Welcome to Beyond Pay: an omnichannel payment suite that enables a secure and embedded purchasing experience within your solution.

Get Sandbox API Keys and get coding now!

Integration Options

Contact us if you have questions or need help: BeyondPayIntegrations@getbeyond.com

Whether you have an existing shopping cart or are building a custom integration, we've got you covered!

Payment Plugins

Why reinvent the wheel? We've done the heavy lifting to build robust integrations to these popular solutions for you: sit back, relax, and plug in!

WooCommerce

https://wordpress.org/plugins/beyond-pay-for-woocommerce

https://github.com/getbeyond/beyondpay_woocommerce

Get Beyond Pay for WooCommerce

=== Beyond Pay for WooCommerce ===
Contributors: beyondpay
Tags: credit card, payment, woocommerce, payment gateway, subscriptions, subscription payments, recurring billing
Requires at least: 4.7
Tested up to: 6.0
Stable tag: trunk
Requires PHP: 7.0
License: MIT
License URI: https://opensource.org/licenses/MIT

Beyond Pay for WooCommerce enables secure payment card acceptance right from within your WooCommerce store.

Gravity Forms

https://wordpress.org/plugins/beyond-pay-for-gravity-forms

https://github.com/getbeyond/beyondpay_gravityforms

Get Beyond Pay for Gravity Forms

=== Beyond Pay for Gravity Forms ===
Contributors: beyondpay
Tags: credit card, payment, gravity forms, payment gateway, donation
Requires at least: 4.7
Tested up to: 6.0
Stable tag: 1.1.2
Requires PHP: 7.0
License: MIT
License URI: https://opensource.org/licenses/MIT

Beyond Pay for Gravity Forms allows you to create customized payment workflows for order checkout, donations, event registrations, and more!

Payment SDKs

We offer several client libraries (or software development kits) which consume the Beyond Pay APIs, making it even easier for you to integrate with your project.

Click the respective language tab to see SDK usage examples.

Beyond Pay SDKs are coming soon to Github; contact BeyondPayIntegrations@getbeyond.com to request access until then.

Payment APIs

The primary APIs for integrating to the Beyond Pay platform are:

Online Payments

Getting Started

To get started, include this script on your checkout page:

TokenPay maximizes the user experience by allowing for the capture of sensitive card data within the payment form of the merchant’s website or mobile application. The consumer remains on the merchant’s payment page at all times during the checkout process.

<script
  src="https://api-test.getbeyondpay.com/WebSecurity/TokenPay/plain-js/tokenPay.js">
</script>

TokenPay is an integration interface for Beyond Pay Gateway which facilitates online card payments in a manner that ensures that no sensitive card data ever touches your servers so your integration can operate with minimized scope of PCI.

Next, create an instance of TokenPay:

To ensure that merchants are eligible for the simplest PCI validation method, Self-Assessment Questionnaire A (SAQ-A), TokenPay utilizes

var tokenpay = TokenPay('your-public-key');

Replace your-public-key with your publishable public key.

TokenPay.js

TokenPay.js is the hosted JavaScript library for building online or mobile checkout flows with Beyond Pay Gateway. With it, you can collect sensitive data from the cardholder and create tokens for securely sending the data to your server.

TokenPay.js provides a ready-made UI component for collecting the sensitive card data from the user. TokenPay.js then tokenizes the information without it ever having to touch your server.

The TokenPay.js UI component includes:

HTTPS Requirements

All submission of payment information using TokenPay.js is made via a secure HTTPS connection. However, to protect yourself from man-in-the-middle attacks and to prevent your users from experiencing mixed content warnings in their browser, you MUST serve the page with your payment form over HTTPS.

Environments

Only test cards should be used in sandbox environments.

TokenPay.js Hosted Scripts

The hosted TokenPay script has different versions for test and production.

Sandbox:

https://api-test.getbeyondpay.com/WebSecurity/TokenPay/js/tokenPay.js

Production:

https://api.getbeyondpay.com/WebSecurity/TokenPay/js/tokenPay.js

Beyond Pay SOAP API Endpoints

Sandbox:

https://api-test.getbeyondpay.com/PaymentService/RequestHandler.svc

Production:

https://api.getbeyondpay.com/PaymentService/RequestHandler.svc

A WSDL is available for Beyond Pay SOAP API by appending "?wsdl" to these endpoints.

Create a Payment Form

To determine where to insert the UI components, create empty DOM elements with unique IDs within your payment form.

To securely collect sensitive card details from your users, TokenPay.js creates UI components for you that are hosted by Beyond Pay Gateway. These are then inserted into your payment form.

<form id="paymentForm" action="/charge" method="post"> 
  <select class="form-control" name="amount" id="amount">
    <option value="25">$25</option>
    <option value="50">$50</option> 
  </select>
  <div id="card"></div>
  <div id="errorMessage"></div>
  <button type="submit">Submit</button>
</form>

The TokenPay element simplifies the form and minimizes the fields required by inserting a single input field that securely collects all needed card data.

If you want to customize the style of the card entry area, create a hidden <div> element to contain your styling. The id of this element MUST be customStyles.

<div style="display: none" id="customStyles"> 
  body {
    margin: 8px 0;
    }
 #payment-form {
  border: 2px solid #003b5c; 
  padding: 5px 10px; 
  border-radius: 5px; 
  background: white;
  color: #333;
}
</div>

When the form is loaded, initialize the Pay element:

tokenpay.initialize({
  dataElement: '#card', 
  errorElement: '#errorMessage', 
  useStyles: false,
  disableZip: false
});

If you have created the customStyles element to style the card entry area, change the value of useStyles to true.

To disable the ZIP code field from appearing in the iframe so that it can be captured elsewhere in your form, set disableZip to true.

Obtain a Token

var form = document.getElementById('paymentForm'); 
$('#paymentForm').on('submit', function (event) {
  event.preventDefault(); 
  tokenpay.createToken(function (result) {
    var hiddenInput = document.createElement('input'); 
    hiddenInput.setAttribute('type', 'hidden'); 
    hiddenInput.setAttribute('name', 'token'); 
    hiddenInput.setAttribute('value', result.token); 
    form.appendChild(hiddenInput);
    form.submit();
  }, function (result) {
    console.log("error: " + result);
  });
});

The card data collected by the TokenPay element is posted from the client browser to Beyond Pay Gateway where it is converted into a token. If there are any errors in the collection of the card data or creation of the token, information is automatically displayed in the errorElement of your payment form.

The token is stored as a hidden input value and passed to your server on form submission.

Token Sale

With the token and other form fields obtained by your server, now construct the payload:

Once you have securely collected and tokenized your user’s card data using TokenPay.js you can now use the single-use token to submit a transaction. Authorization or sale requests using single-use tokens must ONLY made from your server and not from the client.

$bpRequest = new BeyondPayRequest();
$bpRequest->$requestMessage = new RequestMessage();

$bpRequest->RequestDateTime = DateTime.Now.ToString("yyyyMMddHHmmss");
$bpRequest->RequestType = "004";
$bpRequest->PrivateKey = "YourPrivateKey";
$bpRequest->AuthenticationTokenId = "00000000-0000-0000-0000-000000000000";
$bpRequest->TransactionID = "00000000-0000-0000-0000-000000000000";

$bpRequest->$requestMessage->MerchantCode = "123456";
$bpRequest->$requestMessage->MerchantAccountCode = "789123";
$bpRequest->$requestMessage->Amount = "1200";
$bpRequest->$requestMessage->TransIndustryType = "EC";
$bpRequest->$requestMessage->TransactionType = "SALE";
$bpRequest->$requestMessage->ExpirationDate = "1224";
$bpRequest->$requestMessage->AcctType = "R";
$bpRequest->$requestMessage->HolderType = "O";
$bpRequest->$requestMessage->IsoCurrencyCode = "USD";
$bpRequest->$requestMessage->SoftwareVendor = "YourSoftwareName 1.0";
BridgeCommRequest bcRequest = new BridgeCommRequest();

bcRequest.RequestType = "004";
bcRequest.TransactionID = "00000000-0000-0000-0000-000000000000";
bcRequest.PrivateKey = "YourPrivateKey";
bcRequest.AuthenticationTokenId = "00000000-0000-0000-0000-000000000000";
bcRequest.RequestDateTime = DateTime.Now.ToString("yyyyMMddHHmmss");

RequestMessage rqMessage = new RequestMessage();

rqMessage.MerchantCode = "123456";
rqMessage.MerchantAccountCode = "789123";
rqMessage.TransactionType = "SALE";
rqMessage.TransIndustryType = "EC";
rqMessage.Amount = "1200";
rqMessage.HolderType = "O";
rqMessage.AcctType = "R";
rqMessage.IsoCurrencyCode = "USD";
rqMessage.SoftwareVendor = "YourSoftwareName 1.0";

bcRequest.requestMessage = rqMessage ();

BridgeCommConnection BCConnect = new BridgeCommConnection();
BridgeCommResponse response = await BCConnect.processRequestAsync(bridgeCommURL: URL, bcRequest);

string string_response = BridgeCommConnection.Serialize<BridgeCommResponse>(response);
BridgeCommRequest bcRequest = new BridgeCommRequest();
RequestMessage rqMessage = new RequestMessage();

bcRequest.setRequestType("004");
bcRequest.setAuthenticationTokenId("00000000-0000-0000-0000-000000000000");
bcRequest.setTransactionID(DateTime.Now.ToString("yyyyMMddHHmmss"));
bcRequest.setRequestMessage(new rqMessage);

rqMessage.setMerchantCode("123456");
rqMessage.setMerchantAccountCode("789123");
rqMessage.setAmount("1200");
rqMessage.setTransIndustryType("EC");
rqMessage.setTransactionType("SALE");
rqMessage.setHolderType("O");
rqMessage.setExpirationDate("1234");
rqMessage.setIsoCurrencyCode("USD");
rqMessage.setAcctType("R");
rqMessage.setSoftwareVendor("Your Software Name 1.0");

Beyond Pay SDKs wrap the core XML API message

You can construct the SOAP/XML message to Beyond Pay gateway or let our SDKs do it for you. Instructions are provided for those who want to send the raw SOAP message.

<requestHeader>
    <ClientIdentifier>SOAP</ClientIdentifier>
    <TransactionID>00000000-0000-0000-0000-000000000000</TransactionID>
    <RequestType>004</RequestType>
    <RequestDateTime>yyyyMMddHHmmss</RequestDateTime>
    <PrivateKey>YourPrivateKey</PrivateKey>
    <AuthenticationTokenId>00000000-0000-0000-0000-000000000000</AuthenticationTokenId>
    <requestMessage>                                        
        <SoftwareVendor>YourSoftwareName 1.0</SoftwareVendor>
        <TransIndustryType>EC</TransIndustryType>
        <TransactionType>sale</TransactionType>
        <AcctType>R</AcctType>
        <HolderType>O</HolderType>
        <Amount>1200</Amount>
        <CurrencyCode>USD</CurrencyCode>
    </requestMessage>
</requestHeader>

You will have a 15 minute window in which to complete the transaction request once you have obtained the client-side token. The token expires after the window or once used.

The XML payload is then Base64-encoded and packaged within a SOAP envelope

On your server, collect the token information and the form POST parameters submitted by your form.

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:req="http://bridgepaynetsecuretx.com/requesthandler">
                    <soapenv:Header/>
                        <soapenv:Body>
                            <req:ProcessRequest>
                                <req:requestMsg>{Base-64 encoded XML payload}</req:requestMsg>
                            </req:ProcessRequest>
                        </soapenv:Body>
                    </soapenv:Envelope>

Now submit the token and parameters according to the example XML request, with the following substitutions:

Beyond Pay Sample Approved Sale Response

$bcResponse->TransactionID = "635693706433821501<";
$bcResponse->RequestType = "004";
$bcResponse->ResponseCode = "00000";
$bcResponse->ResponseDescription = "Successful Request";
$rsMessage = $bcResponse->responseMessage;
$rsMessage->AuthenticationTokenId = "735333";
$rsMessage->Token = "100000007470001";
$rsMessage->PublicKey = "";
$rsMessage->ExpirationDate = "1022";
$rsMessage->AuthorizationCode = "735333";
BridgeCommConnection connection = new BridgeCommConnection();
BridgeCommResponse bcResponse = connection.processRequest(URL, bcRequest);
ResponseMessage rsMessage = bcResponse.responseMessage;

bcResponse.BridgeCommResponseType = "Auth";
bcResponse.RequestType = "004";
bcResponse.ResponseCode = "00000";
bcResponse.ResponseDescription = "Successful Request";
bcResponse.TransactionID = "20190709092529";

rsMessage.GatewayMessage = "A01 - Approved";
rsMessage.GatewayResult = "00000";
rsMessage.GatewayTransID = "3710636504";
rsMessage.TransactionCode = "20190709092529";
rsMessage.TransactionDate = "20190709";
rsMessage.AuthorizationCode = "537977";
rsMessage.AuthorizedAmount = "1200";
rsMessage.InternalMessage = "Approved: 537977 (approval code)";
rsMessage.isCommercialCard = "False";
rsMessage.IsoCountryCode = "840";
rsMessage.IsoCurrencyCode = "USD";
rsMessage.IsoRequestDate = "2019-07-09 09:25:30.663";
rsMessage.IsoTransactionDate = "2019-07-09 09:25:30.663";
rsMessage.MaskedPan = "1***********1234";
rsMessage.ExpirationDate = "1234";
rsMessage.CardClass = "Credit";
rsMessage.CardType = "Visa";
rsMessage.OriginalAmount = "1200";
rsMessage.ProviderResponseMessage = "Approved";
rsMessage.Token = "11110000000375160150";
BridgeCommResponse bcResponse = connection.processRequest(URL, bcRequest);
bcResponse.RequestType = "004";
bcResponse.ResponseCode = "00000";
bcResponse.ResponseDescription = "Successful Request";
bcResponse.TransactionID = "635693706433821501";

ResponseMessage rsMessage = bcResponse.responseMessage;
rsMessage.Token = "1000000074700016";
rsMessage.ExpirationDate = "1022";
rsMessage.AuthrorizationCode = "735333";

Raw XML response

<?xml version="1.0" encoding="utf-16"?>
<Auth>
  <TransactionID>123456789</TransactionID>
  <RequestType>004</RequestType>
  <ResponseCode>00000</ResponseCode>
  <ResponseDescription>Successful Request</ResponseDescription>
  <responseMessage>
    <Token>1000000010261111</Token>
    <AuthorizationCode>642973</AuthorizationCode>
    <ReferenceNumber></ReferenceNumber>
    <GatwayResult>00000</GatewayResult>
    <AuthorizedAmount>700</AuthorizedAmount>
    <OriginalAmount>700</OriginalAmount>
    <ExpirationDate>1224</ExpirationDate>
    <AVSMessage>Street address and ZIP match</AVSMessage>
    <AVSResult>4F</AVSResult>
    <StreetMatchMessage></StreetMatchMessage>
    <ZipMatchMessage></ZipMatchMessage>
    <CVMessage>Matches</CVMessage>
    <CVResult>M</CVResult>
    <IsCommercialCard>False</IsCommercialCard>
    <GatewayTransID>1235539604</GatewayTransID>
    <GatewayMessage>A01 - Approved</GatewayMessage>
    <InternalMessage>Approved: 642973 (approval Code)</InternalMessage>
    <Balance></Balance>
    <CashBackAmount></CashBackAmount>
    <TransactionCode>123456789</TransactionCode>
    <TransactionDate>20200528</TransactionDate>
    <RemainingAmount>0</RemainingAmount>
    <IsoCountryCode>840</IsoCountryCode>
    <IsoCurrencyCode>USD</IsoCurrencyCode>
    <IsoTransactionDate>2020-05-28 12:41:33.587</IsoTransactionDate>
    <IsoRequestDate>2020-05-28 12:41:33.587</IsoRequestDate>
    <NetworkReferenceNumber></NetworkReferenceNumber>
    <NetworkMerchantId></NetworkMerchantId>
    <NetworkTerminalId></NetworkTerminalId>
    <CardClass>Credit</CardClass>
    <CardType>Visa</CardType>
    <CardHolderName>Test card</CardHolderName>
    <CardModifier>None</CardModifier>
    <ProviderResponseCode></ProviderResponseCode>
    <ProviderResponseMessage>Approved</ProviderResponseMessage>
    <MaskedPan></MaskedPan>
    <WalletID></WalletID>
    <WalletPaymentMethodID></WalletPaymentID>
    <WalletResponseMessage></WalletResponseMessage>
    <WalletResponseCode></WalletResponseCode>
    <MerchantCategoryCode></MerchantCategoryCode>
    <ResponseTypeDescription>sale</ResponseTypeDescription>
    <ReceiptTagData></ReceiptTagData>
    <IssuerTagData></IssuerTagData>
  </responseMessage>
</Auth>

After your transaction has been successfully submitted to the gateway, make sure you inspect the response message. Specifically, look at:

Declined Sale Response Sample

$bcResponse->TransactionID = "635693706433821501<";
$bcResponse->RequestType = "004";
$bcResponse->ResponseCode = "30032";
$bcResponse->ResponseDescription = "Denied by customer's bank";
BridgeCommConnection connection = new BridgeCommConnection();
BridgeCommResponse bcResponse = connection.processRequest(URL, bcRequest);
ResponseMessage rsMessage = bcResponse.responseMessage;

bcResponse.BridgeCommResponseType = "Auth";
bcResponse.RequestType = "004";
bcResponse.ResponseCode = "30032";
bcResponse.ResponseDescription = "Denied by customer's bank";
bcResponse.TransactionID = "20190709092529";

rsMessage.GatewayMessage = "D01 - Denied by customer's bank (Issuer Unavailable)";
rsMessage.GatewayResult = "30032";
rsMessage.GatewayTransID = "3710636804";
rsMessage.TransactionCode = "20190709094426";
rsMessage.TransactionDate = "20190709";
rsMessage.AuthorizationCode = "537977";
rsMessage.AuthorizedAmount = "1200";
rsMessage.InternalMessage = "Denied by customer's bank";
rsMessage.ResponseTypeDescription = "denied";
rsMessage.isCommercialCard = "False";
rsMessage.IsoCountryCode = "840";
rsMessage.IsoCurrencyCode = "USD";
rsMessage.IsoRequestDate = "2019-07-09 09:25:30.663";
rsMessage.IsoTransactionDate = "2019-07-09 09:25:30.663";
rsMessage.MaskedPan = "1***********1234";
rsMessage.ExpirationDate = "1234";
rsMessage.CardClass = "Credit";
rsMessage.CardType = "Visa";
rsMessage.OriginalAmount = "1200";
rsMessage.ProviderResponseMessage = "Declined";
BridgeCommResponse bcResponse = connection.processRequest(URL, bcRequest);
bcResponse.RequestType = "004";
bcResponse.ResponseCode = "30032";
bcResponse.ResponseDescription = "Denied by customer's bank";
bcResponse.TransactionID = "635693706433821501";

ResponseMessage rsMessage = bcResponse.responseMessage;
rsMessage.CardType = "Visa";
rsMessage.CardClass = "Credit";
rsMessage.ProviderResponseMessage = "735333";

Raw XML response

<Auth>
    <TransactionID>123</TransactionID>
    <RequestType>004</RequestType>
    <ResponseCode>30032</ResponseCode>
    <ResponseDescription>Denied by customer's bank</ResponseDescription>
    <responseMessage>
        <Token>1000000010532376</Token>
        <ExpirationDate>1224</ExpirationDate>
        <OrganizationId>1706</OrganizationId>
        <AuthorizationCode />
        <ReferenceNumber>960406639</ReferenceNumber>
        <AuthorizedAmount>0</AuthorizedAmount>
        <OriginalAmount>20</OriginalAmount>
        <GatewayTransID>4011311504</GatewayTransID>
        <GatewayMessage>D01 - Denied by customer's bank (Issuer Unavailable)</GatewayMessage>
        <InternalMessage>Denied by customer's bank</InternalMessage>
        <GatewayResult>30032</GatewayResult>
        <AVSMessage />
        <AVSResult />
        <CVMessage />
        <CVResult />
        <TransactionCode>123</TransactionCode>
        <TransactionDate>20210831</TransactionDate>
        <RemainingAmount>0</RemainingAmount>
        <IsoCountryCode>840</IsoCountryCode>
        <IsoCurrencyCode>USD</IsoCurrencyCode>
        <IsoTransactionDate>2021-08-31 21:33:09.537</IsoTransactionDate>
        <IsoRequestDate>2021-08-31 21:33:09.537</IsoRequestDate>
        <NetworkReferenceNumber />
        <MerchantCategoryCode />
        <NetworkMerchantId />
        <NetworkTerminalId />
        <CardClass>Credit</CardClass>
        <CardType>Amex</CardType>
        <CardHolderName />
        <CardModifier>None</CardModifier>
        <ProviderResponseCode />
        <ProviderResponseMessage>Denied by customer's bank (Issuer Unavailable)</ProviderResponseMessage>
        <MaskedPan>3**********2376</MaskedPan>
        <ResponseTypeDescription>decline</ResponseTypeDescription>
        <IsCommercialCard>False</IsCommercialCard>
        <StreetMatchMessage />
        <WalletID />
        <WalletPaymentMethodID />
        <WalletResponseCode />
        <WalletResponseMessage />
    </responseMessage>
</Auth>

Token Authorize

To change from a "sale" transaction to an "authorize" transaction, simply set TransactionType to sale-auth in the Beyond Pay SDK:

Sometimes you may not want to accept payment right away for a transaction, such as when shipping physical goods. The normal practice in this scenario is to first authorize a card which will place a hold on the funds, and then to later "capture" that authorization when the order is fulfilled.

$bpRequest = new BeyondPayRequest();
$bpRequest->$requestMessage = new RequestMessage();

$bpRequest->RequestDateTime = DateTime.Now.ToString("yyyyMMddHHmmss");
$bpRequest->RequestType = "004";
$bpRequest->PrivateKey = "YourPrivateKey";
$bpRequest->AuthenticationTokenId = "00000000-0000-0000-0000-000000000000";
$bpRequest->TransactionID = "00000000-0000-0000-0000-000000000000";
$bpRequest->$requestMessage->MerchantCode = "123456";
$bpRequest->$requestMessage->MerchantAccountCode = "789123";
$bpRequest->$requestMessage->Amount = "1200";
$bpRequest->$requestMessage->TransIndustryType = "EC";
$bpRequest->$requestMessage->TransactionType = "SALE-AUTH";
$bpRequest->$requestMessage->ExpirationDate = "1224";
$bpRequest->$requestMessage->AcctType = "R";
$bpRequest->$requestMessage->HolderType = "O";
$bpRequest->$requestMessage->IsoCurrencyCode = "USD";
$bpRequest->$requestMessage->SettlementDelay = "30";
$bpRequest->$requestMessage->SoftwareVendor = "YourSoftwareName 1.0";
BridgeCommRequest bcRequest = new BridgeCommRequest();
RequestMessage rqMessage = new RequestMessage();

bcRequest.RequestType = "004";
bcRequest.TransactionID = "00000000-0000-0000-0000-000000000000";
bcRequest.PrivateKey = "YourPrivateKey";
bcRequest.AuthenticationTokenId = "00000000-0000-0000-0000-000000000000";
bcRequest.RequestDateTime = DateTime.Now.ToString("yyyyMMddHHmmss");

rqMessage.MerchantCode = "123456";
rqMessage.MerchantAccountCode = "789123";
rqMessage.TransactionType = "SALE-AUTH";
rqMessage.TransIndustryType = "EC";
rqMessage.Amount = "1200";
rqMessage.HolderType = "O";
rqMessage.AcctType = "R";
rqMessage.IsoCurrencyCode = "USD";
rqMessage.SettlementDelay = "30";
rqMessage.SoftwareVendor = "YourSoftwareName 1.0";
BridgeCommRequest bcRequest = new BridgeCommRequest();
RequestMessage rqMessage = new RequestMessage();

bcRequest.setRequestType("004");
bcRequest.setAuthenticationTokenId("00000000-0000-0000-0000-000000000000");
bcRequest.setTransactionID(DateTime.Now.ToString("yyyyMMddHHmmss"));
bcRequest.setRequestMessage(new rqMessage);

rqMessage.setMerchantCode("123456");
rqMessage.setMerchantAccountCode("789123");
rqMessage.setAmount("1200");
rqMessage.setTransIndustryType("EC");
rqMessage.setTransactionType("SALE-AUTH");
rqMessage.setHolderType("O");
rqMessage.setExpirationDate("1234");
rqMessage.setAcctType("R");
rqMessage.setSettlementDelay("30");
rqMessage.setSoftwareVendor("YourSoftwareName 1.0");

Or, in the raw XML:

<requestHeader>
    <ClientIdentifier>SOAP</ClientIdentifier>
    <TransactionID>00000000-0000-0000-0000-000000000000</TransactionID>
    <RequestType>004</RequestType>
    <RequestDateTime>yyyyMMddHHmmss</RequestDateTime>
    <PrivateKey>YourPrivateKey</PrivateKey>
    <AuthenticationTokenId>00000000-0000-0000-0000-000000000000</AuthenticationTokenId>
    <requestMessage>                    
        <SoftwareVendor>YourSoftwareName 1.0</SoftwareVendor>
        <TransIndustryType>EC</TransIndustryType>
        <TransactionType>sale-auth</TransactionType>
        <AcctType>R</AcctType>
        <HolderType>O</HolderType>
        <Amount>1200</Amount>
        <CurrencyCode>USD</CurrencyCode>
        <SettlementDelay>30</SettlementDelay>
    </requestMessage>
</requestHeader>

Beyond Pay Sample Authorization Response

$bcResponse->TransactionID = "635693706433821501";
$bcResponse->RequestType = "004";
$bcResponse->ResponseCode = "00000";
$bcResponse->ResponseDescription = "Successful Request";
$rsMessage = $bcResponse->responseMessage;
$rsMessage->AuthenticationTokenId = "735333";
$rsMessage->Token = "100000007470001";
$rsMessage->PublicKey = "";
$rsMessage->ExpirationDate = "1022";
$rsMessage->AuthorizationCode = "735333";
BridgeCommConnection connection = new BridgeCommConnection();
BridgeCommResponse bcResponse = connection.processRequest(URL, bcRequest);
ResponseMessage rsMessage = bcResponse.responseMessage;

bcResponse.BridgeCommResponseType = "Auth";
bcResponse.RequestType = "004";
bcResponse.ResponseCode = "00000";
bcResponse.ResponseDescription = "Successful Request";
bcResponse.TransactionID = "20190709092529";

rsMessage.GatewayMessage = "A01 - Approved";
rsMessage.GatewayResult = "00000";
rsMessage.GatewayTransID = "3710636504";
rsMessage.TransactionCode = "20190709092529";
rsMessage.TransactionDate = "20190709";
rsMessage.AuthorizationCode = "537977";
rsMessage.AuthorizedAmount = "1200";
rsMessage.InternalMessage = "Approved: 537977 (approval code)";
rsMessage.isCommercialCard = "False";
rsMessage.IsoCountryCode = "840";
rsMessage.IsoCurrencyCode = "USD";
rsMessage.IsoRequestDate = "2019-07-09 09:25:30.663";
rsMessage.IsoTransactionDate = "2019-07-09 09:25:30.663";
rsMessage.MaskedPan = "1***********1234";
rsMessage.ExpirationDate = "1234";
rsMessage.CardClass = "Credit";
rsMessage.CardType = "Visa";
rsMessage.OriginalAmount = "1200";
rsMessage.ProviderResponseMessage = "Approved";
rsMessage.Token = "11110000000375160150";
BridgeCommResponse bcResponse = connection.processRequest(URL, bcRequest);
bcResponse.RequestType = "004";
bcResponse.ResponseCode = "00000";
bcResponse.ResponseDescription = "Successful Request";
bcResponse.TransactionID = "635693706433821501";

ResponseMessage rsMessage = bcResponse.responseMessage;
rsMessage.Token = "1000000074700016";
rsMessage.ExpirationDate = "1022";
rsMessage.AuthrorizationCode = "735333";

Raw XML response

<Auth>
 <TransactionID>635693706433821501</TransactionID>
    <RequestType>004</RequestType>
    <ResponseCode>00000</ResponseCode>
    <ResponseDescription>Successful Request</ResponseDescription>
        <responseMessage>
            <Token>1000000074700016</Token>
            <ExpirationDate>1022</ExpirationDate>
            <OrganizationId>3538</OrganizationId>
            <AuthorizationCode>735333</AuthorizationCode>
        </responseMessage>
</Auth>

The SettlementDelay tag can be added for sale-auth transactions, and designates the number of batch cycles that the authorization remains "open" (or uncaptured). If the sale-auth transaction is not captured before completion of the designated number of batches, then the original authorization will be automatically voided and not captured. This value cannot exceed "30" (batch cycles).

In order to capture that authorization and charge the card, you must submit 019 capture RequestType, passing the original sale-auth ReferenceNumber, and using the User and Password credentials instead of AuthenticationTokenId and PrivateKey to authenticate:

To capture an authorization, simply submit a RequestType of 019 for capture, along with passing the reference number of the original authorization as shown here.

$bpRequest = new BeyondPayRequest();
$bpRequest->$requestMessage = new RequestMessage();

$bpRequest->RequestDateTime = DateTime.Now.ToString("yyyyMMddHHmmss");
$bpRequest->User = "xxxxxx";
$bpRequest->Password = "xxxxxx";
$bpRequest->RequestType = "019";
$bpRequest->TransactionID = "00000000-0000-0000-0000-000000000000";
$bpRequest->$requestMessage->MerchantCode = "123456";
$bpRequest->$requestMessage->MerchantAccountCode = "789123";
$bpRequest->$requestMessage->Amount = "1200";
$bpRequest->$requestMessage->TransIndustryType = "EC";
$bpRequest->$requestMessage->TransactionType = "CAPTURE";
$bpRequest->$requestMessage->AcctType = "R";
$bpRequest->$requestMessage->HolderType = "O";
$bpRequest->$requestMessage->ReferenceNumber = "12345678";
$bpRequest->$requestMessage->SoftwareVendor = "YourSoftwareName 1.0";
BridgeCommRequest bcRequest = new BridgeCommRequest();
RequestMessage rqMessage = new RequestMessage();

bcRequest.User = "xxxxxx";
bcRequest.Password = "xxxxxx";
bcRequest.RequestType = "019";
bcRequest.TransactionID = "00000000-0000-0000-0000-000000000000";
bcRequest.RequestDateTime = DateTime.Now.ToString("yyyyMMddHHmmss");

rqMessage.MerchantCode = "123456";
rqMessage.MerchantAccountCode = "789123";
rqMessage.TransactionType = "CAPTURE";
rqMessage.TransIndustryType = "EC";
rqMessage.Amount = "1200";
rqMessage.HolderType = "O";
rqMessage.AcctType = "R";
rqMessage.ReferenceNumber = "12345678";
rqMessage.SoftwareVendor = "YourSoftwareName 1.0";
BridgeCommRequest bcRequest = new BridgeCommRequest();
RequestMessage rqMessage = new RequestMessage();

bcRequest.setUser("xxxxxx");
bcRequest.setPassword("xxxxxx");
bcRequest.setRequestType("019");
bcRequest.setTransactionID("00000000-0000-0000-0000-000000000000");
bcRequest.setRequestDateTime(DateTime.Now.ToString("yyyyMMddHHmmss"));
bcRequest.setRequestMessage(new rqMessage);

rqMessage.setMerchantCode("123456");
rqMessage.setMerchantAccountCode("789123");
rqMessage.setTransIndustryType("EC");
rqMessage.setTransactionType("CAPTURE");
rqMessage.setReferenceNumber("12345678");
rqMessage.setSoftwareVendor("YourSoftwareName 1.0");

Or, in the raw XML:

<requestHeader>
    <ClientIdentifier>SOAP</ClientIdentifier>
    <TransactionID>00000000-0000-0000-0000-000000000000</TransactionID>
    <RequestType>019</RequestType>
    <RequestDateTime>yyyyMMddHHmmss</RequestDateTime>
    <User>xxxxxx</User>
    <Password>xxxxxx</Password>
    <requestMessage>                    
        <SoftwareVendor>YourSoftwareNam 1.0</SoftwareVendor>
        <TransactionType>capture</TransactionType>
        <ReferenceNumber>12345678</ReferenceNumber>
        <Amount>1200</Amount>
    </requestMessage>
</requestHeader>

Beyond Pay Sample Capture Response

$bcResponse->TransactionID = "635693706433821501";
$bcResponse->RequestType = "019";
$bcResponse->ResponseCode = "00000";
$bcResponse->ResponseDescription = "Successful Request";
$rsMessage = $bcResponse->responseMessage;
$rsMessage->ReferenceNumber = "735333";
$rsMessage->GatewayResult = "00000";
$rsMessage->GatewayTransID = "3710636504";
$rsMessage->GatewayMessage = "A01 - Approved";
$rsMessage->TransactionCode = "";
BridgeCommConnection connection = new BridgeCommConnection();
BridgeCommResponse bcResponse = connection.processRequest(URL, bcRequest);
ResponseMessage rsMessage = bcResponse.responseMessage;

bcResponse.BridgeCommResponseType = "Auth";
bcResponse.RequestType = "019";
bcResponse.ResponseCode = "00000";
bcResponse.ResponseDescription = "Successful Request";
bcResponse.TransactionID = "20190709092529";

rsMessage.GatewayMessage = "A01 - Approved";
rsMessage.GatewayResult = "00000";
rsMessage.GatewayTransID = "3710636504";
rsMessage.TransactionCode = "20190709092529";
BridgeCommConnection connection = new BridgeCommConnection();
BridgeCommResponse bcResponse = connection.processRequest(URL, bcRequest);
ResponseMessage rsMessage = bcResponse.responseMessage;

bcResponse.BridgeCommResponseType = "Auth";
bcResponse.RequestType = "019";
bcResponse.ResponseCode = "00000";
bcResponse.ResponseDescription = "Successful Request";
bcResponse.TransactionID = "20190709092529";

rsMessage.GatewayMessage = "A01 - Approved";
rsMessage.GatewayResult = "00000";
rsMessage.GatewayTransID = "3710636504";
rsMessage.TransactionCode = "20190709092529";

Raw XML response

<?xml version="1.0" encoding="utf-16"?>
<Capture>
  <TransactionID>20190709092529</TransactionID>
  <RequestType>019</RequestType>
  <ResponseCode>00000</ResponseCode>
  <responseMessage>
    <ReferenceNumber></ReferenceNumber>
    <GatewayResult>00000</GatewayResult>
    <GatewayTransID>3710636504</GatewayTransID>
    <GatewayMessage>A01 - Approved</GatewayMessage>
    <TransactionCode></TransactionCode>
  </responseMessage>
</Capture>

Repeat Sales and Cards-on-File

Every sale or authorization response from Beyond Pay contains a Token element. This Token represents the card number used in the original transaction, but is not considered a sensitive data element per the PCI DSS. To ease in identifying the original card, however, the last four digits of the Token are the same as the last four digits of the card number.

$bpRequest = new BeyondPayRequest();
$bpRequest->$requestMessage = new RequestMessage();

$bpRequest->RequestDateTime = DateTime.Now.ToString("yyyyMMddHHmmss");
$bpRequest->User = "xxxxxx";
$bpRequest->Password = "xxxxxx";
$bpRequest->RequestType = "004";
$bpRequest->TransactionID = "00000000-0000-0000-0000-000000000000";
$bpRequest->$requestMessage->MerchantCode = "123456";
$bpRequest->$requestMessage->MerchantAccountCode = "789123";
$bpRequest->$requestMessage->Amount = "1200";
$bpRequest->$requestMessage->TransIndustryType = "EC";
$bpRequest->$requestMessage->TransactionType = "SALE";
$bpRequest->$requestMessage->AcctType = "R";
$bpRequest->$requestMessage->HolderType = "O";
$bpRequest->$requestMessage->SoftwareVendor = "YourSoftwareName 1.0";
$bpRequest->$requestMessage->Token = "1000000010532376";
$bpRequest->$requestMessage->ExpirationDate = "12/23";
$bpRequest->requestMessage->StoredCredential = "recurring";
BridgeCommRequest bcRequest = new BridgeCommRequest();
RequestMessage rqMessage = new RequestMessage();

bcRequest.User = "xxxxxx";
bcRequest.Password = "xxxxxx";
bcRequest.RequestType = "004";
bcRequest.TransactionID = "00000000-0000-0000-0000-000000000000";
bcRequest.RequestDateTime = DateTime.Now.ToString("yyyyMMddHHmmss");

rqMessage.MerchantCode = "123456";
rqMessage.MerchantAccountCode = "789123";
rqMessage.TransactionType = "SALE";
rqMessage.TransIndustryType = "EC";
rqMessage.Amount = "1200";
rqMessage.HolderType = "O";
rqMessage.AcctType = "R";
rqMessage.SoftwareVendor = "YourSoftwareName 1.0";
rqMessage.Token = "1000000010532376";
rqMessage.ExpirationDate = "12/23";
rqMessage.StoredCredential = "recurring";
BridgeCommRequest bcRequest = new BridgeCommRequest();
RequestMessage rqMessage = new RequestMessage();

bcRequest.setUser("xxxxxx");
bcRequest.setPassword("xxxxxx");
bcRequest.setRequestType("004");
bcRequest.setTransactionID("00000000-0000-0000-0000-000000000000");
bcRequest.setRequestDateTime(DateTime.Now.ToString("yyyyMMddHHmmss"));
bcRequest.setRequestMessage(new rqMessage);

rqMessage.setMerchantCode("123456");
rqMessage.setMerchantAccountCode("789123");
rqMessage.setTransIndustryType("EC");
rqMessage.setTransactionType("SALE");
rqMessage.setReferenceNumber("12345678");
rqMessage.setSoftwareVendor("YourSoftwareName 1.0");
rqMessage.setToken("1000000010532376");
rqMessage.setExpirationDate("12/23");
rqMessage.StoredCredential("recurring");

Or, in the raw XML:

<requestHeader>
    <ClientIdentifier>SOAP</ClientIdentifier>
    <TransactionID>00000000-0000-0000-0000-000000000000</TransactionID>
    <RequestType>004</RequestType>
    <RequestDateTime>yyyyMMddHHmmss</RequestDateTime>
    <User>xxxxxx</User>
    <Password>xxxxxx</Password>
    <requestMessage>
        <SoftwareVendor>YourSoftwareName 1.0</SoftwareVendor>                    
        <Token>1000000010532376</Token>
        <ExpirationDate>1223</ExpirationDate>
        <TransactionType>sale</TransactionType>
        <TransIndustryType>EC</TransIndustryType>
        <AcctType>R</AcctType>
        <HolderType>O</HolderType>
        <Amount>1200</Amount>
        <CurrencyCode>USD</CurrencyCode>
        <StoredCredential>recurring</StoredCredential>
    </requestMessage>
</requestHeader>

The Token element represents a card number, can be used multiple times, and does not expire. It may be used as input in a transaction in lieu of the PaymentAccountNumber or the AuthenticationTokenId, and also requires the ExpirationDate field to be submitted with it.

This Token value may be persisted and, with the cardholder's permission, associated with their user account in your application in order to make future purchases with the same card ("card-on-file").

Submitting a sale or sale-auth transaction with the Token as input requires use of the User and Password credentials in the request message, and also requires that the card ExpirationDate value be persisted and stored with the Token (the ExpirationDate value is returned in the original response message along with the Token).

Refunds & Voids

In order to refund or void a previous sale or sale-auth transaction, simply construct an XML message with RequestType of 012 and TransactionType of refund. Note that if the original transaction is still in an unsettled batch, the gateway will perform a void/reversal transaction. If the original transaction has already settled, then the gateway will perform a refund to the original card.

The GatewayTransId is returned in the response to a previous sale or sale-auth request and may be used as input to refund or void that original transaction.

$bpRequest = new BeyondPayRequest();
$bpRequest->$requestMessage = new RequestMessage();

$bpRequest->RequestDateTime = DateTime.Now.ToString("yyyyMMddHHmmss");
$bpRequest->User = "xxxxxx";
$bpRequest->Password = "xxxxxx";
$bpRequest->RequestType = "012";
$bpRequest->TransactionID = "00000000-0000-0000-0000-000000000000";
$bpRequest->$requestMessage->MerchantCode = "123456";
$bpRequest->$requestMessage->MerchantAccountCode = "789123";
$bpRequest->$requestMessage->Amount = "1200";
$bpRequest->$requestMessage->TransactionType = "REFUND";
$bpRequest->$requestMessage->AcctType = "R";
$bpRequest->$requestMessage->HolderType = "O";
$bpRequest->$requestMessage->SoftwareVendor = "YourSoftwareName 1.0";
$bpRequest->$requestMessage->ReferenceNumber = "12345678";
BridgeCommRequest bcRequest = new BridgeCommRequest();
RequestMessage rqMessage = new RequestMessage();

bcRequest.User = "xxxxxx";
bcRequest.Password = "xxxxxx";
bcRequest.RequestType = "012";
bcRequest.TransactionID = "00000000-0000-0000-0000-000000000000";
bcRequest.RequestDateTime = DateTime.Now.ToString("yyyyMMddHHmmss");

rqMessage.MerchantCode = "123456";
rqMessage.MerchantAccountCode = "789123";
rqMessage.TransactionType = "REFUND";
rqMessage.Amount = "1200";
rqMessage.HolderType = "O";
rqMessage.AcctType = "R";
rqMessage.SoftwareVendor = "YourSoftwareName 1.0";
rqMessage.ReferenceNumber = "12345678";
BridgeCommRequest bcRequest = new BridgeCommRequest();
RequestMessage rqMessage = new RequestMessage();

bcRequest.setUser("xxxxxx");
bcRequest.setPassword("xxxxxx");
bcRequest.setRequestType("012");
bcRequest.setTransactionID("00000000-0000-0000-0000-000000000000");
bcRequest.setRequestDateTime(DateTime.Now.ToString("yyyyMMddHHmmss"));
bcRequest.setRequestMessage(new rqMessage);

rqMessage.setMerchantCode("123456");
rqMessage.setMerchantAccountCode("789123");
rqMessage.setTransactionType("REFUND");
rqMessage.setReferenceNumber("12345678");
rqMessage.setSoftwareVendor("YourSoftwareName 1.0");
rqMessage.setReferenceNumber("12345678");

Or, in the raw XML:

<requestHeader>
    <ClientIdentifier>SOAP</ClientIdentifier>
    <TransactionID>{transactionId}</TransactionID>
    <RequestType>012</RequestType>
    <RequestDateTime>{requestDateTime}</RequestDateTime>
    <User>{Beyond-assigned username}</User>
    <Password>{Beyond-assigned password}</Password>
    <requestMessage>                    
        <SoftwareVendor>{yourSoftwareName}</SoftwareVendor>
        <TransactionType>refund</TransactionType>
        <ReferenceNumber>{original sale or sale-auth GatewayTransId}</ReferenceNumber>
        <Amount>{amountInCents}</Amount>
    </requestMessage>
</requestHeader>

Raw XML response

<?xml version="1.0" encoding="utf-16"?>
<VoidRefund>
  <TransactionID>12345</TransactionID>
  <RequestType>012</RequestType>
  <ResponseCode>00000</ResponseCode>
  <ResponseDescription>Successful Request</ResponseDescription>
  <responseMessage>
    <ReferenceNumber />
    <GatewayTransID>3807822104</GatewayTransID>
    <GatewayMessage>A08 - Partial Refund Posted</GatewayMessage>
    <InternalMessage>Approved: 945466 (approval code)</InternalMessage>
    <GatewayResult>00000</GatewayResult>
    <TransactionCode>12345</TransactionCode>
    <RemainingAmount>3000</RemainingAmount>
    <OrganizationId>2380</OrganizationId>
    <MerchantAccountCode />
    <ResponseType>refund</ResponseType>
    <ResponseTypeDescription>refund</ResponseTypeDescription>
    <CardClass />
    <CardType />
    <CardHolderName />
    <ProviderResponseCode />
    <ProviderResponseMessage />
  </responseMessage>
</VoidRefund>

Level II & Level III Data

Some business cards may be eligible for lower interchange rates if you send additional data with the transaction. Beyond Pay supports these additional data fields and can help you or your clients secure these significantly reduced rates and other B2B benefits.

Level II Data

Sample transaction with Level II data:

$bpRequest = new BeyondPayRequest();
$bpRequest->$requestMessage = new RequestMessage();

$bpRequest->RequestDateTime = DateTime.Now.ToString("yyyyMMddHHmmss");
$bpRequest->RequestType = "004";
$bpRequest->PrivateKey = "YourPrivateKey";
$bpRequest->AuthenticationTokenId = "00000000-0000-0000-0000-000000000000";
$bpRequest->TransactionID = "00000000-0000-0000-0000-000000000000";
$bpRequest->$requestMessage->MerchantCode = "123456";
$bpRequest->$requestMessage->MerchantAccountCode = "789123";
$bpRequest->$requestMessage->Amount = "1200";
$bpRequest->$requestMessage->TransIndustryType = "EC";
$bpRequest->$requestMessage->TransactionType = "SALE";
$bpRequest->$requestMessage->ExpirationDate = "1224";
$bpRequest->$requestMessage->AcctType = "R";
$bpRequest->$requestMessage->HolderType = "O";
$bpRequest->$requestMessage->IsoCurrencyCode = "USD";
$bpRequest->$requestMessage->SoftwareVendor = "YourSoftwareName 1.0";
$bpRequest->$requestMessage->PONum = "PO-4321";
$bpRequest->$requestMessage->TaxAmount = "110";
$bpRequest->$requestMessage->TaxIndicator = "P";
BridgeCommRequest bcRequest = new BridgeCommRequest();
RequestMessage rqMessage = new RequestMessage();

bcRequest.RequestType = "004";
bcRequest.TransactionID = "00000000-0000-0000-0000-000000000000";
bcRequest.PrivateKey = "YourPrivateKey";
bcRequest.AuthenticationTokenId = "00000000-0000-0000-0000-000000000000";
bcRequest.RequestDateTime = DateTime.Now.ToString("yyyyMMddHHmmss");

rqMessage.MerchantCode = "123456";
rqMessage.MerchantAccountCode = "789123";
rqMessage.TransactionType = "SALE";
rqMessage.TransIndustryType = "EC";
rqMessage.Amount = "1200";
rqMessage.HolderType = "O";
rqMessage.AcctType = "R";
rqMessage.IsoCurrencyCode = "USD";
rqMessage.SoftwareVendor = "YourSoftwareName 1.0";
rqMessage.PONum = "PO-4321";
rqMessage.TaxAmount = "110";
rqMessage.TaxIndicator = "P";
BridgeCommRequest bcRequest = new BridgeCommRequest();
RequestMessage rqMessage = new RequestMessage();

bcRequest.setRequestType("004");
bcRequest.setAuthenticationTokenId("00000000-0000-0000-0000-000000000000");
bcRequest.setTransactionID(DateTime.Now.ToString("yyyyMMddHHmmss"));
bcRequest.setRequestMessage(new rqMessage);

rqMessage.setMerchantCode("123456");
rqMessage.setMerchantAccountCode("789123");
rqMessage.setAmount("1200");
rqMessage.setTransIndustryType("EC");
rqMessage.setTransactionType("SALE");
rqMessage.setHolderType("O");
rqMessage.setExpirationDate("1234");
rqMessage.setIsoCurrencyCode("USD");
rqMessage.setAcctType("R");
rqMessage.setSoftwareVendor("Your Software Name 1.0");
rqMessage.setPONum("PO-4321");
rqMessage.setTaxAmount("110");
rqMessage.setTaxIndicator("P");

Or, in the raw XML:

<requestHeader>
    <ClientIdentifier>SOAP</ClientIdentifier>
    <TransactionID>00000000-0000-0000-0000-000000000000</TransactionID>
    <RequestType>004</RequestType>
    <RequestDateTime>yyyyMMddHHmmss</RequestDateTime>
    <PrivateKey>YourPrivateKey</PrivateKey>
    <AuthenticationTokenId>00000000-0000-0000-0000-000000000000</AuthenticationTokenId>
    <requestMessage>                    
        <SoftwareVendor>YourSoftwareName 1.0</SoftwareVendor>
        <TransIndustryType>EC</TransIndustryType>
        <TransactionType>sale</TransactionType>
        <AcctType>R</AcctType>
        <HolderType>O</HolderType>
        <Amount>1200</Amount>
        <CurrencyCode>USD</CurrencyCode>
        <PONum>PO-4321</PONum>
        <TaxAmount>110</TaxAmount>
        <TaxIndicator>P</TaxIndicator>
    </requestMessage>
</requestHeader>

In order for a transaction to qualify at reduced "Level II" interchange rates, assuming the card is eligible for such, the following fields should be provided in the XML message to the gateway in addition to the basic required fields given in the instructions for processing a basic sale transaction:

Level III Data

Sample sale transaction via TokenPay.js with Level III line-item details:

$bpRequest = new BeyondPayRequest();
$bpRequest->$requestMessage = new RequestMessage();

$bpRequest->RequestDateTime = DateTime.Now.ToString("yyyyMMddHHmmss");
$bpRequest->RequestType = "004";
$bpRequest->PrivateKey = "YourPrivateKey";
$bpRequest->AuthenticationTokenId = "00000000-0000-0000-0000-000000000000";
$bpRequest->TransactionID = "00000000-0000-0000-0000-000000000000";
$bpRequest->$requestMessage->MerchantCode = "123456";
$bpRequest->$requestMessage->MerchantAccountCode = "789123";
$bpRequest->$requestMessage->Amount = "1200";
$bpRequest->$requestMessage->TransIndustryType = "EC";
$bpRequest->$requestMessage->TransactionType = "SALE";
$bpRequest->$requestMessage->ExpirationDate = "1224";
$bpRequest->$requestMessage->AcctType = "R";
$bpRequest->$requestMessage->HolderType = "O";
$bpRequest->$requestMessage->IsoCurrencyCode = "USD";
$bpRequest->$requestMessage->SoftwareVendor = "YourSoftwareName 1.0";
$bpRequest->$requestMessage->InvoiceNum = "INV-1234";
$bpRequest->$requestMessage->PONum = "PO-4321";
$bpRequest->$requestMessage->CustomerAccountCode = "CID-9876";
$bpRequest->$requestMessage->TaxAmount = "110";
$bpRequest->$requestMessage->TaxIndicator = "P";
$bpRequest->$requestMessage->LocalTaxAmount = "110";
$bpRequest->$requestMessage->LocalTaxIndicator = "P";
$bpRequest->$requestMessage->NationalTaxAmount = "110";
$bpRequest->$requestMessage->NationalTaxIndicator = "P";
$bpRequest->$requestMessage->CommodityCode = "5999";
$bpRequest->$requestMessage->ItemCount = "1";

$requestMessage->$rqItem = new Item();
$requestMessage->$rqItem->ItemCode = "123456";
$requestMessage->$rqItem->ItemCommodityCode = "5999";
$requestMessage->$rqItem->ItemDescription = "Widget";
$requestMessage->$rqItem->ItemQuantity = "1";
$requestMessage->$rqItem->ItemUnitCostAmt = "1000";
$requestMessage->$rqItem->ItemUnitMeasure = "EA";
$requestMessage->$rqItem->ItemTaxAmount = "10";
$requestMessage->$rqItem->ItemTotalAmount = "1110";
BridgeCommRequest bcRequest = new BridgeCommRequest();
RequestMessage rqMessage = new RequestMessage();

bcRequest.RequestType = "004";
bcRequest.TransactionID = "00000000-0000-0000-0000-000000000000";
bcRequest.PrivateKey = "YourPrivateKey";
bcRequest.AuthenticationTokenId = "00000000-0000-0000-0000-000000000000";
bcRequest.RequestDateTime = DateTime.Now.ToString("yyyyMMddHHmmss");

rqMessage.MerchantCode = "123456";
rqMessage.MerchantAccountCode = "789123";
rqMessage.TransactionType = "SALE";
rqMessage.TransIndustryType = "EC";
rqMessage.Amount = "1200";
rqMessage.HolderType = "O";
rqMessage.AcctType = "R";
rqMessage.IsoCurrencyCode = "USD";
rqMessage.SoftwareVendor = "YourSoftwareName 1.0";
rqMessage.PONum = "PO-4321";
rqMessage.InvoiceNum = "INV-1234";
rqMessage.CustomerAccountCode = "CID-9876";
rqMessage.TaxAmount = "110";
rqMessage.TaxIndicator = "P";
rqMessage.LocalTaxAmount = "110";
rqMessage.LocalTaxIndicator = "P";
rqMessage.NationalTaxAmount = "110";
rqMessage.NationalTaxIndicator = "P";
rqMessage.CommodityCode = "5999";
rqMessage.ItemCount = "1";

Item rqItem = new Item();
rqItem.ItemCode = "123456";
rqItem.ItemCommodityCode = "5999";
rqItem.ItemDescription = "Widget";
rqItem.ItemQuantity = "1";
rqItem.ItemUnitCostAmt = "1000";
rqItem.ItemUnitMeasure ="EA";
rqItem.ItemTaxAmount = "10";
rqItem.ItemTotalAmount = "1110";
BridgeCommRequest bcRequest = new BridgeCommRequest();
RequestMessage rqMessage = new RequestMessage();

bcRequest.setRequestType("004");
bcRequest.setAuthenticationTokenId("00000000-0000-0000-0000-000000000000");
bcRequest.setTransactionID(DateTime.Now.ToString("yyyyMMddHHmmss"));
bcRequest.setRequestMessage(new rqMessage);

rqMessage.setMerchantCode("123456");
rqMessage.setMerchantAccountCode("789123");
rqMessage.setAmount("1200");
rqMessage.setTransIndustryType("EC");
rqMessage.setTransactionType("SALE");
rqMessage.setHolderType("O");
rqMessage.setExpirationDate("1234");
rqMessage.setIsoCurrencyCode("USD");
rqMessage.setAcctType("R");
rqMessage.setSoftwareVendor("Your Software Name 1.0");
rqMessage.setInvoiceNum("INV-1234");
rqMessage.setPONum("PO-4321");
rqMessage.setCustomerAccountCode("CID-9876");
rqMessage.setTaxAmount("110");
rqMessage.setTaxIndicator("P");
rqMessage.setLocalTaxAmount("110");
rqMessage.setLocalTaxIndicator("P");
rqMessage.setNationalTaxAmount("110");
rqMessage.setNationalTaxIndicator("P");
rqMessage.setCommodityCode("5999");
rqMessage.setItemCount("1");

rqMessage.setItem(new rqItem);
rqItem.setItemCode("123456");
rqItem.setItemCommodityCode("5999");
rqItem.setItemDescription("Widget");
rqItem.setItemQuantity("1");
rqItem.setItemUnitCostAmt("1000");
rqItem.setItemUnitMeasure("EA");
rqItem.setItemTaxAmount("10");
rqItem.setItemTotalAmount("1110");

Or, in the raw XML:

<requestHeader>
    <ClientIdentifier>SOAP</ClientIdentifier>
    <TransactionID>00000000-0000-0000-0000-000000000000</TransactionID>
    <RequestType>004</RequestType>
    <RequestDateTime>yyyyMMddHHmmss</RequestDateTime>
    <PrivateKey>YourPrivateKey</PrivateKey>
    <AuthenticationTokenId>00000000-0000-0000-0000-000000000000</AuthenticationTokenId>
    <requestMessage>                    
        <SoftwareVendor>YourSoftwareName 1.0</SoftwareVendor>
        <TransIndustryType>EC</TransIndustryType>
        <TransactionType>sale</TransactionType>
        <AcctType>R</AcctType>
        <HolderType>O</HolderType>
        <Amount>1110</Amount>
        <CurrencyCode>USD</CurrencyCode>
        <InvoiceNum>INV-1234</InvoiceNum>
        <PONum>PO-4321</PONum>
        <CustomerAccountCode>CID-9876</CustomerAccountCode>
        <TaxAmount>110</TaxAmount>
        <TaxIndicator>P</TaxIndicator>
        <LocalTaxAmount>110</LocalTaxAmount>
        <LocalTaxIndicator>P</LocalTaxIndicator>
        <NationalTaxAmount>110</NationalTaxAmount>
        <NationalTaxIndicator>P</NationalTaxIndicator>
        <CommodityCode>5999</CommodityCode>
        <ItemCount>1</ItemCount>
        <Item>
          <ItemCode>123456</ItemCode>
          <ItemCommodityCode>5999</ItemCommodityCode>
          <ItemDescription>Widget</ItemDescription>
          <ItemQuantity>1</ItemQuantity>
          <ItemUnitCostAmt>1000</ItemUnitCostAmt>
          <ItemUnitMeasure>EA</ItemUnitMeasure>
          <ItemTaxAmount>10</ItemTaxAmount>
          <ItemTotalAmount>1110</ItemTotalAmount>
        </Item>
    </requestMessage>
</requestHeader>

Cards that are eligible for Level III interchange rates are typically corporate purchasing or some travel cards. If a card is eligible for such, you can achieve a reduced interchange rate by providing the following fields in your gateway request message (in addition to those required for Level II and basic sale or "Level I" transactions).

Note that Level III transactions require line-item details from the purchase. You should send one Item array for each line item on a given invoice; many integrators will dynamically map these required fields into their existing inventory, order management, or ERP systems. Alternatively, if you only sell one type of item, you may consider creating a static mapping of these fields, or "hard-coding" the values specific to your business.

ACH & eChecks

$bpRequest = new BeyondPayRequest();
$bpRequest->$requestMessage = new RequestMessage();

$bpRequest->RequestDateTime = DateTime.Now.ToString("yyyyMMddHHmmss");
$bpRequest->User = "xxxxxx";
$bpRequest->Password = "xxxxxx";
$bpRequest->RequestType = "004";
$bpRequest->TransactionID = "00000000-0000-0000-0000-000000000000";
$bpRequest->$requestMessage->MerchantCode = "123456";
$bpRequest->$requestMessage->MerchantAccountCode = "789123";
$bpRequest->$requestMessage->Amount = "1200";
$bpRequest->$requestMessage->TransactionType = "SALE";
$bpRequest->$requestMessage->TransIndustryType = "WEB";
$bpRequest->$requestMessage->AcctType = "C";
$bpRequest->$requestMessage->SoftwareVendor = "YourSoftwareName 1.0";
$bpRequest->$requestMessage->RoutingNum = "021000021";
$bpRequest->$requestMessage->BankAccountNum = "4099999992";

Processing an eCheck/ACH transaction is very similar to processing a credit card transaction. Instead of passing a token to the webservice, you can directly pass the bank's routing/transit number and the bank account number. These data elements are not considered sensitive to the same degree as card data, and are not covered by the scope of PCI DSS. You should still encrypt said data elements whether at rest or in motion, but they will not impact your scope of PCI compliance.

In addition to passing the routing and account number, you also need to specify whether the bank account is a checking or savings account, as well as the "Standard Entry Class" code as defined by NACHA.


WEB - Internet-Initiated Entry (for consumer entry via a web form)
PPD - Prearranged Payment and Deposit - for consumer checks (requires written authorization from customer)
CCD - Corporate Credit or Debit - for business checks (requires written authorization from customer)
TEL - Telephone-Initiated Entry (for merchant entry with customer voice authorization or IVR systems)

BridgeCommRequest bcRequest = new BridgeCommRequest();
RequestMessage rqMessage = new RequestMessage();

bcRequest.User = "xxxxxx";
bcRequest.Password = "xxxxxx";
bcRequest.RequestType = "004";
bcRequest.TransactionID = "00000000-0000-0000-0000-000000000000";
bcRequest.RequestDateTime = DateTime.Now.ToString("yyyyMMddHHmmss");

rqMessage.MerchantCode = "123456";
rqMessage.MerchantAccountCode = "789123";
rqMessage.TransactionType = "SALE";
rqMessage.Amount = "1200";
rqMessage.TransIndustryType = "WEB";
rqMessage.AcctType = "C";
rqMessage.SoftwareVendor = "YourSoftwareName 1.0";
rqMessage.RoutingNum = "021000021";
rqMessage.BankAccountNum = "4099999992";
BridgeCommRequest bcRequest = new BridgeCommRequest();
RequestMessage rqMessage = new RequestMessage();

bcRequest.setUser("xxxxxx");
bcRequest.setPassword("xxxxxx");
bcRequest.setRequestType("012");
bcRequest.setTransactionID("00000000-0000-0000-0000-000000000000");
bcRequest.setRequestDateTime(DateTime.Now.ToString("yyyyMMddHHmmss"));
bcRequest.setRequestMessage(new rqMessage);

rqMessage.setMerchantCode("123456");
rqMessage.setMerchantAccountCode("789123");
rqMessage.setTransactionType("SALE");
rqMessage.setAcctType("C");
rqMessage.setTransIndustryType("WEB");
rqMessage.setSoftwareVendor("YourSoftwareName 1.0");
rqMessage.setRoutingNumber("021000021");
rqMessage.setBankAccountNumber("4099999992");

Or, in the raw XML:

<requestHeader>
    <ClientIdentifier>SOAP</ClientIdentifier>
    <TransactionID>00000000-0000-0000-0000-000000000000</TransactionID>
    <RequestType>004</RequestType>
    <RequestDateTime>yyyyMMddHHmmss</RequestDateTime>
    <User>xxxxxx</User>
    <Password>xxxxxx</Password>
    <requestMessage>
        <SoftwareVendor>YourSoftwareName 1.0</SoftwareVendor>
        <TransactionType>sale</TransactionType>
        <TransIndustryType>WEB</TransIndustryType>
        <RoutingNum>021000021</RoutingNum>
        <BankAccountNum>4099999992</BankAccountNum>
        <AcctType>C</AcctType>
        <Amount>1200</Amount>
    </requestMessage>
</requestHeader>

In-Person Payments

Overview

If you are developing a payment application or point of sale (POS) system for use by only your business, then that application falls in your scope of PCI DSS compliance as a merchant.

If you are developing a POS to sell or license to other businesses, that application is in scope for PCI Payment Application Data Security Standard (PA-DSS) if it interacts with card data.

If that application is hosted/SaaS-based then you may also be in-scope PCI Service Provider (similar to a gateway provider).

The costs involved in validating PCI compliance for such software can be prohibitive for Indepdendent Software Vendors (ISVs). Increasingly, ISVs are also expected to offer support for EMV or chip cards: direct integration of which can also be very costly and time-consuming.

The solution to both of these challenges is a semi-integrated or "out-of-scope" architectural model, whereby a POS or application can integrate (or "semi-integrate") to a pre-certified payment application and device. This removes the burden of complicated EMV/chip card certification and insulates the application from interacting with sensitive data.

Beyond PayGuardian is a cloud-based semi-integrated solution that makes it possible to easily support in-person card payments from any platform or environment.

Supported Devices

Beyond's preferred card present devices are the Android-based "A-series" from PAX Technology:

Development devices are available to purchase by request. Please contact BeyondPayIntegrations@getbeyond.com.

Beyond will provide development and production devices pre-configured with the necessary account information and settings. The only credential you will need to communicate with the device is its UUID or "locationID", which will be provided by Beyond and can also be confirmed in the PayGuardian Cloud app on the the terminal device.

Getting Started

Endpoint (Test and Production):

https://pgc.bridgepaynetsecuretx.com/req/payment

Initiating a card present transaction is as simple as POSTing just a few lines of JSON to the web service, passing the following arguments:

Credit Sale Request

POST

{
"locationID": "91552FCB-01A7-4BA2-B00A-EA33FC660307",
"mode": "UAT",
"amount": "17.00",
"softwareVendor": "My POS 1.0",
"tenderType": "CREDIT",
"transType": "SALE"
}

If the card is an EMV/chip card, then the user will be presented with an option to select whichever Applications reside on the chip (that is, they can select an Application ID associated with either Credit or Debit, depending on their card) regardless of what tender type is sent in the request. If the UNKNOWN tender type is used, the cardholder will similarly be prompted to select either the credit or debit application on the chip.

If the card is magnetic stripe only and capable of being processed as either a debit or a credit transaction, then it will be processed as whatever tender type is sent in the request. If UNKNOWN is selected, the cardholder will likewise be prompted to make the selection.

Credit Sale Response

{
"requestID": "2aaf2fe8663c561fe7edf5c663b4e7262dd47274bdba13f3daafb207",
"locationID": "91552FCB-01A7-4BA2-B00A-EA33FC660307",
"terminalID": "3EADDF76-27E6-4883-A49C-0AA876E64734",
"approvedAmount": "17.00",
"authCode": "830705",
"avsMessage": "",
"avsResponse": "",
"cardType": "Visa",
"cashBackAmt": "",
"cvMessage": "",
"cvResponse": "",
"expirationDate": "0323",
"extData": {
    "lodgingItem": [],
    "receiptTagData": {
        "maskedCard": "4***********2645",
        "chipCardAID": "A0000000031010",
        "invoice": "12345678",
        "seq": "23dbde68c492a6c2c6b5cbe726d40741",
        "authCode": "830705",
        "entryMethod": "Chip_Read",
        "totalAmount": "17.00",
        "pinVerified": "NO"
    },
    "signatureEncoded": "iVBORw0KGgoAAAANSUhEUgAAAe8AAACWCAIAAAB4sZcnAAADOklEQVR42u..."
},
"gatewayMessage": "A01 - Approved",
"gatewayResult": "0",
"internalMessage": "Approved: 830705 (approval code)",
"isCommercialCard": "False",
"isoCountryCode": "840",
"isoCurrencyCode": "USD",
"isoRequestDate": "2018-06-28 14:25:04.963",
"isoTransactionDate": "2018-06-28 14:25:04.963",
"maskedAccountNumber": "4***********2645",
"merchantCategoryCode": "",
"networkMerchantId": "",
"networkReferenceNumber": "",
"networkTerminalId": "",
"pnRefNum": "253271004",
"remainingAmount": "0.00",
"requestedAmount": "",
"responseTypeDescription": "sale",
"resultCode": "0",
"resultTxt": "Successful Request",
"streetMatchMessage": "",
"submittedAmount": "17.00",
"timestamp": "20180628",
"tipAmount": "",
"token": "11110000000400142645",
"transactionCode": "23dbde68c492a6c2c6b5cbe726d40741"
}

Transaction types are defined as follows:

Basic Sale

{
"locationID": "91552FCB-01A7-4BA2-B00A-EA33FC660307",
"mode": "UAT",
"amount": "#####.##",
"softwareVendor": "My POS 1.0",
"tenderType": "CREDIT",
"transType": "SALE",
"invNum": "Invoice number",
"poNum": "Purchase order number",
"taxAmt": "#####.##",
"allowPartialApproval": "true|false",
"clerkID": "Employee/Clerk ID",
}

You may also want to send these additional fields on some transactions:

Refunds & Voids

{
"locationID": "91552FCB-01A7-4BA2-B00A-EA33FC660307",
"mode": "UAT",
"amount": "#####.##",
"softwareVendor": "My POS 1.0",
"tenderType": "CREDIT",
"transType": "REFUND",
"pnRefNum": "Reference number from the transaction to be returned",
}

In order to refund or void a previous SALE or SALE_AUTH transaction, simply construct an JSON message with tenderType of CREDIT and transType of REFUND.

The pnRefNum is returned in the response to a sale or sale-auth request and may be used as input to refund or void that original transaction.

Note that if the original transaction is still in an unsettled batch, the gateway will perform a void/reversal transaction. If the original transaction has already settled, then the gateway will perform a refund to the original card.

Tips & Gratuities

CREDIT + ADJUSTMENT request:

{
"locationID": "C832D913-982C-4256-9895-2DD13BDA5947",
"pnRefNum": "Reference number from a previous transaction",
"mode":"UAT",
"tipAmt": "5.00",
"tenderType": "CREDIT",
"transType": "ADJUSTMENT"
}

Submitting tenderType=CREDIT and transType=ADJUSTMENT will adjust a previous SALE or SALE_AUTH adding a tip amount based on a pnRefNum (previous transaction reference number). This action can only be performed on unsettled transactions in an open batch.

CREDIT + ADJUSTMENT response:

{
"requestID": "388c37acbd88d7f00fce90ffee8b83c156efedb57828c1e8439e6284",
"locationID": "C832D913-982C-4256-9895-2DD13BDA5947",
"terminalID": "9102C064-F990-41AB-BAD4-C98F33E4C684",
"approvedAmount": "20.00",
"authCode": "802431",
"avsMessage": "",
"avsResponse": "",
"cardType": "",
"cashBackAmt": "",
"cvMessage": "",
"cvResponse": "",
"expirationDate": "",
"extData": {
    "lodgingItem": [],
    "receiptTagData": {}
            }   , "gatewayMessage": "A12 - Tip Adjustment Posted",
"gatewayResult": "0",
"internalMessage": "Tip Adjustment Posted",
"isCommercialCard": "False",
"isoCountryCode": "0",
"isoCurrencyCode": "",
"isoRequestDate": "",
"isoTransactionDate": "",
"maskedAccountNumber": "",
"merchantCategoryCode": "",
"networkMerchantId": "",
"networkReferenceNumber": "",
"networkTerminalId": "",
"pnRefNum": "253276004",
"remainingAmount": "0.00",
"requestedAmount": "",
"resultCode": "0",
"resultTxt": "Successful Request",
"streetMatchMessage": "",
"submittedAmount": "15.00",
"timestamp": "",
"tipAmount": "",
"token": "",
"transactionCode": ""
}

If successful, the response will contain the new total approved amount: (initial amount) + (tip amount).

Lodging & Hotels

{
"locationID": "C832D913-982C-4256-9895-2DD13BDA5947",
"mode": "UAT",
"amount": "10.00",
"softwareVendor": "your_POS_name",
"tenderType": "CREDIT",
"transType": "SALE",
"extData": {
"checkInDate": "Actual or anticipated check in date.",
"checkOutDate": "Actual or anticipated check out date.",
"departureAdjAmount": "Additional amount charged after cardholder left the hotel.",
"folioNumber": "Hotel folio number",
"lodgingChargeType": "H (Hotel)|R (Restaurant)|G (Gift Shop)|S (Health Spa)|B (Beauty Shop)|F (Convention Fee)|T (Tennis)|O (Golf)",
"lodgingItem": [{
"lodgingItemAmount": "Amount (in cents) for lodging extra charge item. Implied (no) decimal.",
"lodgingItemCode": "",
"lodgingItemType": "G (Gift Shop)|L (Laundry)|B (Mini Bar)|R (Restaurant)|T (Telephone)"
}],
"lodgingItemCount": "Indicates number of lodging industry items purchased as part of this transaction.",
"roomNumber": "Hotel room number",
"roomRateAmt": "Amount (in cents) of the daily room rate.",
"roomTaxAmt": "Amount (in cents) of the tax applied to daily room rate.",
"specialProgramType": "AD (Advance deposit)|AR (Assured reservation)|DC (Delayed charge)|ES (Express service)|NC (Normal charge)|NS (No show charge)",
"stayDuration": "Anticipated, actual or incremental stay in days."
}

The extended data fields required for lodging transactions can easily be passed through the semi-integrated device to Beyond Pay Gateway.

Pharmacy & Healthcare

{
"locationID": "C832D913-982C-4256-9895-2DD13BDA5947",
"mode": "UAT",
"amount": "10.00",
"softwareVendor": "your_POS_name",
"tenderType": "CREDIT",
"transType": "SALE",
"isQualifiedIIAS": "Indicates whether purchase items are verified against IIAS. Can be t|f",
"healthCareAmt": "Amount (in cents) of the total Healthcare Amount.",
"clinicAmt": "Amount (in cents) of the portion of the Healthcare Amount spent on hospitalization.",
"dentalAmt": "Amount (in cents) of the portion of the Healthcare Amount spent on dental related medical services.",
"prescriptionAmt": "Amount (in cents) of the portion of the Healthcare Amount spent on prescription drugs or products.",
"transitAmt": "Amount (in cents) of the portion of the Healthcare Amount spent on transportaion.",
"visionAmt": "Amount (in cents) of the portion of the Healthcare Amount spent on vision related medical services."
}

Payment systems and Points of Sale for pharmacy merchants are required to pass some of these additional data fields in conjunction with their implementation of "auto-substantiation" using an "inventory information approval system" (IIAS).

See sig-is.org for more information.

Transaction Reporting

Sandbox:

https://api-test.getbeyondpay.com/Bridgepay.Reporting.API/ReportingAPI.svc

Production:

https://api.getbeyondpay.com/Reporting.API/ReportingAPI.svc

Endpoint Name & Version:

reportingapi_v2
class Program
{
  static void Main(string[] args)
  {
    ReportingAPI.Credentials credentials = new ReportingAPI.Credentials();

    credentials.UserName = "username";
    credentials.Password = "password";

    ReportingAPI.ReportingAPIV1Client client = new ReportingAPI.ReportingAPIV1Client();
    ReportingAPI.TransactionRowFilter filter = new ReportingAPI.TransactionRowFilter();

    filter.MerchantID = 2000;
    filter.MerchantAccountID = 2001;

    filter.DateRangeFrom = DateTime.Now.AddMonths(-2);
    filter.DateRangeTo = DateTime.Now;

    filter.Skip = 0;
    filter.Take = 20;

    ReportingAPI.TransactionSet ts = new ReportingAPI.TransactionSet();

    Ts = client.PublicGetTransactionsByFilter(credentials, filter);

    foreach (ReportingAPI.TransactionRow tr in ts.TransactionList)
    {
      Console.WriteLine("Transaction ID: " + tr.TransactionId); 
      Console.WriteLine("Sale Date / Time: " + tr.SaleDateTime); 
      Console.WriteLine("Merchant Name: " + tr.MerchantName); 
      Console.WriteLine("Card Holder Name: " + tr.FirstName + " " + tr.LastName); 
      Console.WriteLine("Invoice Number: " + tr.InvoiceNumber); 
      Console.WriteLine("Auth Code: " + tr.AuthCode); 
      Console.WriteLine("Requested Amount: " + tr.RequestedAmount); 
      Console.WriteLine("Authorized Amount: " + tr.AuthorizedAmount); 
      Console.WriteLine("Remaining Amount: " + tr.RemainingAmount); 
      Console.WriteLine("Settle Anmount: " + tr.SettleAmnount); 
      Console.WriteLine("--------------------------------------------");
    }
  }
}

The Beyond Pay Reporting API provides integrators with the ability to request transaction data via a SOAP request made to the service. The user must provide data they wish to use as a filter in the parameter to the SOAP method and will receive a response containing the data they requested.

The Reporting API provides three data contracts: one for the incoming request and two for the response to the request.

When making a PublicGetBatchListByFilter request, the consumer must provide an OrgBatchListFilter object. When receiving the response, the consumer will get an OrgBatchListSet object which will contain a collection of OrgBatchListDetail objects.

When making a PublicGetTransactionsByFilterV2 request, the consumer must provide a TransctionRowFilterV2 object. When receiving the response, the consumer will get a TransactionSet object which will contain a collection of TransactionRow objects.

The differences between V1 and V2 of PublicGetTransactionsByFilter are that a deprecated field (SortBy) has been removed and ContractID has been added.

The data contracts are described in more detail below.

Service definitions are available by appending "?wsdl" to the service URLs.

Reporting API User Authorization Scopes

Required Pagination Fields

Skip and Take fields are required when calling the Reporting API in order to manage the size of the result set.

Transaction Rows and Batch Details will be limited to 1000 results at a time. By using Take and Skip you can obtain larger data sets over the course of multiple API requests.

For example, if 1500 records are available based on the filter information sent in, the first 1000 records would be obtained by sending in 1000 for Take and 0 for Skip. The next 500 records would be obtained by sending in Take for 500 and Skip for 1000.

Transaction Reporting

TransactionRowFilter

Parameter Name Data Type Validations Description Comparison Type
AccountHolderName String Optional, Exact Match Limit results to transactions that have a cardholder name matching exactly EQUIV
AccountTypeIndicator String Optional, Exact Match where A = Amex, B = Bank card,C= CUP, D= Discover, E=EBT, G= Gift, M=Mastercard, N=Diners, V=Visa Limit results to those transactions using the matching payment account type EQUIV
AccountTypeTransform String Optional, Exact Match. Valid values: AMEX, FSA VISA, FSA MASTERCARD, VISA, MASTER CARD, DINERS CLUB, BANK CARD DEBIT , PAPER CHECK, CHECKING, SAVINGS, DISCOVER, CASH BENEFIT, FOOD STAMPS, GIFT CARD, CASH, CHINA UNIONPAY Limit results to matching transformed values EQUIV
AmountRangeFrom Integer (implied decimal) Optional Lower amount bounds GTE
AmountRangeTo Integer (implied decimal) Optional Upper amount bounds LTE
AuthorizationCode String Optional, Exact Match Limit to authorizations with the exact matching code EQUIV
BatchID Integer Optional Limit results to transactions within a specific batch EQUIV
CardBrand String Optional. Valid Values: AMEX, DISCOVER, MASTERCARD, DINERS, VISA Limit results to only a specific brand EQUIV
CardholderFirstName String Optional, Exact Match EQUIV
CardholderLastName String Optional, Partial Match CONTAINS
ClerkId String Optional, Exact Match EQUIV
ContractID Integer Optional, Exact Match Limits the results to those transactions where the ContractID used in recurring billing matches EQUIV
CustomFields List <KeyValueOfstringstring> Optional, Exact Match on Key and Value When provided limits the results to those transactions where the Key Value pair match exactly the data provided. Attempting to filter by custom fields is only applicable if custom fields were previously defined with Beyond. EQUIV
CustomerNumber String Optional, Exact Match EQUIV
DateRangeFrom DateTime Optional GTE
DateRangeTo DateTime Optional LTE
EndPartialAccountNumber String Optional EQUIV
EntryModeTransform String Optional. Valid values: SWIPE, CHIP, READ, KEYED Limits results to specific entry mode EQUIV
ExcludePaymentMethod String Optional EQUIV
ExcludeResponseCode String Optional Excludes transactions with provided Gateway Message Codes
ExcludeTransResults* Boolean Optional (1 or 0). Must be used with TransResults N/A
ExcludeVoid Boolean Optional (1 or 0) N/A
ID Integer Optional, Exact Match EQUIV
InvoiceNumber String Optional, Exact Match EQUIV
MerchantAccountId Integer Optional EQUIV
MerchantId Integer Optional EQUIV
OrderByList List <KeyValueOfstringstring> Optional, given a Transaction Property as the key, and Ascending or Descending as the value. Ex: Key: AuthorizedAmount Value: Descending When provided, the results will be sorted by the value in either ‘Ascending’ or ‘Descending’ order. Note: This property replaces SortBy. N/A
OrganizationId Integer Optional, Exact Match When provided, limits the results to those transactions whose Organization ID matches the data provided. OrganizationId is returned in the Beyond Pay transaction API response EQUIV
PaymentMethodID String Optional, Exact Match. Valid values: AC (Amex), BC (Bank Checking), BD (Bank Card Debit), BS (Bank Savings), DC (Discover Credit), DD (Discover Debit), EC (EBT Cash Benefit), EF (Food Stamps), FL (Fleet One), GF (Fuelman Fleet Wide), GG (General Gift), MC (Master Card Credit), MD (Master Card Debit), MF (Master Card Fleet), MP (Master Card Prepaid), NC (Diner’s Club), VC (Visa Credit), VD (Visa Debit), VF ( Voyager), VP (Visa Prepaid), VS (Visa Fleet), WX (Wright Express) When provided, limits the results to those transactions whose Payment Method ID matches the data provided. Two letter code that identifies the payment method transaction type EQUIV
PaymentMethodIndicator String Optional, Exact Match. Second character of PaymentMethodID above. Limit results to those transactions whose indicator matches EQUIV
PaymentMethodTransform String Optional, Exact Match. Valid Values: ACH, CASH, CHECK, CREDIT, DEBIT, EBT, GIFT Limit results to these methods EQUIV
PurchaseOrderNumber String Optional, Exact Match EQUIV
ResponseCode String Optional, Partial Match CONTAINS
SettlementStatus String Optional, Exact Match EQUIV
Skip Integer Required N/A
Take Integer Required N/A
TransactionSourceIP String Optional, Exact Match EQUIV
TransactionStatus String Optional, Exact Match EQUIV
TransResults* String Optional, Multi-Match (comma separated list) INLIST

The TransResults field works by mapping the BridgeComm 5-digit response code back to the gateway response code (the ResponseCode field in this contract). In some cases, more than one mapping may exist for a given code. It is recommended that you use the ResponseCode field for more granular filtering. The ExcludeTransResults field can modify the behavior of the TransResults field by establishing a “not in” condition.

TransactionSet

A set of transaction rows returned by the provided filter data.

Parameter Name Data Type Description
RecordAuthSum Integer The total sum of authorized amount of records that match the filter, excluding the Take & Skip fields.
RecordCount Integer The total number of records that match the filter, excluding the Take & Skip fields.
RecordSum Integer The total sum of settlement amount of records that match the filter, excluding the Take & Skip fields.
TransactionList List A collection of TransactionRow objects.

TransactionRow

A transaction returned within a set; can be one or many.

Parameter Name Data Type Description
AVSMessage String AVS response message
AVSResultCode String AVS Response Code
AccountHolderName String Cardholder name
Account Type String 1 character identifier that determines the type of account. Valid values are R (Branded Credit Card), E (Branded debit checking card), V (Branded debit savings card), D (Unbranded debit checking card), I (Unbranded debit savings card), S (Bank savings account), C (Bank checking account), F (EBT food stamp), H (EBT cash benefit), G (Gift card), L (Fleet), A (Cash), K (Check)
AccountTypeIndicator String A = Amex, B = Bank card,C= CUP, D= Discover, E=EBT, G= Gift, M=Mastercard, N=Diners, V=Visa
AccountTypeTransform String Valid values: AMEX, FSA VISA, FSA MASTERCARD, VISA, MASTER CARD, DINERS CLUB, BANK CARD DEBIT , PAPER CHECK, CHECKING, SAVINGS, DISCOVER, CASH BENEFIT, FOOD STAMPS, GIFT CARD, CASH, CHINA UNIONPAY
AuthCode String The Authorization Code provided by the card issuer
AuthorizedAmount Implied Integer The amount that was actually authorized. This may be different from the requested amount (e.g., partial approvals)
BatchDateTime DateTime The close date of the batch that contains the transaction
BatchId Integer The gateway Batch ID that contains this transaction
CVVMessage String CVV Response Message
CVVResponseCode String CVV Response Code
CardBrand String Description of the card brand used. Valid values: AMEX, DISCOVER, MASTERCARD, DINERS, and VISA
CardClass String Displays the tender type used to process a transaction. Valid values: Credit, Debit, Gift, Prepaid, EBT, Fleet, None
ClerkId String The client-supplied Clerk ID (or the Username used to process the transaction if no Clerk ID was provided)
ClerkName String The client-supplied name of the Clerk who processed the transaction
CustomerAddress String The client-provided Street Address for the transaction
CustomerEmail String The client-provided Email Address for the transaction
CustomerNumber String The client-provided Customer ID
CustomerZip String The client-provided Zip Code
EntryModeId String Identifies how the transaction was processed. Valid valus are T1 (Track 1 Data), T2 (Track 2 Data), T3 (Track 1 and 2 Data), KD (Keyed), CD (Chip)
EntryModeTransform String Human readable explanation of EntryModeId such as SWIPE, KEYED, CHIP READ
ExpirationDate String Month and Year of the card expiry date in MMYY format
FirstName String First name of the account holder
HolderType String A one-character code identifying if the payment method was a personal account (P) or a business/corporate account (O)
InvoiceNumber String The client-provided Invoice Number
LastFour String The last four digits of the Primary Account Number (card number)
LastName String The last name of the account holder
MaskedAccount String A masked version of the account number used to process the transaction
Memo String The client-provided "PaymentType" value
MerchantAccountId Integer The "MerchantAccountCode" for the transaction
MerchantAddress String
MerchantAddress2 String
MerchantAddress3 String
MerchantCategoryCode Integer
MerchantCity String
MerchantEmail String
MerchantId String The Beyond Pay MerchantAccountCode
MerchantName String
MerchantPhone String
MerchantState String
MerchantZip String
NetAmount Integer NetAmount is the Total Amount – (Tip Amount + Duty Amount + Tax Amount) or if Tax Amount is not present: Total Amount – (Tip Amount + Duty Amount + Local Tax Amount + National Tax Amount) when present for Level III transactions
NetworkMID String The Beyond Merchant ID (not the Merchant Account Code)
NetworkReferenceNumber String The host processor reference number
NetworkTerminalId String The host processor TID
ParentId Integer The OrganizationId of the entity above the OrganizationId that the result is from
PaymentMethodId String Two letter code that identifies the payment method transaction type. Valid values: AC (Amex), bp (Bank Checking), BD (Bank Card Debit), BS (Bank Savings), DC (Discover Credit), DD (Discover Debit), EC (EBT Cash Benefit), EF (Food Stamps), FL (Fleet One), GF (Fuelman Fleet Wide), GG (General Gift), MC (Master Card Credit), MD (Master Card Debit), MF (Master Card Fleet), MP (Master Card Prepaid), NC (Diner’s Club), VC (Visa Credit), VD (Visa Debit), VF (Voyager), VP (Visa Prepaid), VS (Visa Fleet), WX (Wright Express)
PaymentMethodIndicator String The second position of PaymentMethodId
PaymentMethodTransform String Valid Values: ACH, CASH, CHECK, CREDIT, DEBIT, EBT, GIFT
ProcessorResponse String Description of the response provided by the account issuer
ProcessorResponseCode String The response code from the host processor
PurchaseOrderNumber String The client-provided Purchase Order Number
ReceiptTagData String This is the receipt tag data as provided by the original Beyond Pay API response. Example: 4F:A000000025010403;95:0000008000;9F10:06020103A0B000;9B:E800;91:;8A:
RemainingAmount Implied Integer The amount of the authorization that is remaining after partial refunds or voids have been applied
RequestedAmount Implied Integer The amount that was requested to be authorized when the transaction was processed
ResponseCode String The 3-character Gateway Message code
SaleDateTime DateTime The date and time the transaction was processed
SettleAmount Implied Integer The amount of the transaction that was actually settled. This may be different than the requested or authorized amounts.
SettlementStatus String Identifies whether the transaction has been settled yet or not. Valid valuies: Settled, Unsettled
TipAmount Integer The portion of the total transaction amount that represents the tip
Token String The tokenized account number
TransactionAux Object Object containing information on recurring billing ContractId, Id, OriginatingTechnologySource, and SoftwareVendor
TransactionCustomFields List <CustomFields> A collection of provided Custom Fields for the transaction
TransactionId Long Integer The unique gateway ID for the transaction
TransactionIndustryType String A 2-3 character string that identifies what industry or SEC code the transaction was processed under. Valid values: RE (Retail), DM (Direct Marketing), EC (eCommerce), RS (Restaurant), LD (Lodging), PT (Petroleum), POP (Point Of Purchase), PPD (Prearranged Payment and Deposit), CCD (Corporate Credit or Debit), TEL (Telephone Initiated Entry), WEB (Internet Initiated Entry), C21 (Check 21)
TransactionSourceIP String The IP Address and Port where the transaction request originated
TransactionStatus String Identifies what state the transaction is in. Valid values: Open, Confirmed, or Voided.
TransactionType String Identifies the type of transaction that was requested. Valid values: Sale, Sale-Auth (authorization only), Credit, Void, Refund, Increment (incremental authorization).
TransactionTypeTransform String Valid Values: Auth Only, Sale, Refund, Activate, Deactivate, Reactivate, Inquiry, Unknown, Error, Decline, Void, Verification
VoidIndicator Boolean Indicates whether or not the transaction was voided before the batch was settled

Batch Reporting

OrgBatchListFilter

Parameter Name Data Type Validations Description Comparison Type
BatchId String Optional, Exact Match Limit results to Batch ID provided EQUIV
DateRangeFrom DateTime Optional, YYYY-MM-DDTHH:MM:SS GTE
DateRangeTo DateTime Optional, YYYY-MM-DDTHH:MM:SS LTE
IsProcessed Boolean true or fales Limits results to batches that have been settled if true EQUIV
OrderByList List <KeyValueOfstringOrderByEnum> Optional, given a Proprty as the Key and Ascending or Descending as the value When provided, results will be sorted by the value in either ascending or descending order N/A
OrganizationId Integer Optional, Exact Match Limit results to the provided org ID EQUIV

OrgBatchListSet

Parameter Name Data Type Description
BatchList List <OrgBatchListDetail> A collection of OrgBatchListDetail objects. See below.
RecordCount Integer The total number of records that match the filter

OrgBatchListDetail

Parameter Name Data Type Description
BatchCount Integer (Nullable) Number of transactions in Detail record\
BatchDateTime DateTime DateTime stamp of the Batch Record
BatchId Long Batch ID
BatchTotal Long (Nullable) Dollar Amount Total in Batch Record
GatewayObjectId Integer (Nullable) Merchant Account Code
IsProcessed Boolean True if the batch has been settled
OrganizationId Integer The organization that owns the batch record
OrganizationName String The organization name for the batch record owner
ParentId Integer (Nullable) Organization ID for the parent of the batch record owner

Operation Contracts

PublicGetBatchListByFilter(Credentials credentials, BatchListFilter filterObject)
PublicGetTransactionsByFilterV2(Credentials credentials, TransactionRowFilterV2 filterObject)

At this time, the Reporting API provides two operation contracts for retrieving transactional and batch details. These methods return BatchSet and TransactionSet objects as described above.

Reporting Tips & Examples

<!-- Returns all transactions of $1.00 or more: -->
<AmountRangeFrom>100</AmountRangeFrom>

<!-- Returns all transactions of $2.00 or less: -->
<AmountRangeTo>100</AmountRangeTo>

<!-- Returns all transactions with Invoice Number 2001: -->
<InoviceNumber>2001</InvoiceNumber>

<!-- Returns all declined transactions: -->
<ResponseCode>D</ResponseCode>

<!-- Returns all declined transactions with Gateway Message codes D01-D09: -->
<ResponseCode>D0</ResponseCode>

<!-- Returns only those transactions that were declined with Gateway Message code D01: -->
<ResponseCode>D01</ResponseCode>

<!-- Provides those transactions where the Gateway Result code is equal to 00000, 00001, or 10012 only: -->
<TransResults>00000,00001,10012</TransResults>

<!-- Return all transactions where Gateway Result code is NOT equal to 00000, 00001, or 10012: -->
<TransResults>00000,00001,10012</TransResults>
<ExcludeTransResults>1</ExcludeTransResults>

There are two types of parameters in the TransactionRowFilter object: DBQuery Filters and Post-Query Filters.

Most of the parameters in the filter are DBQuery filters that are used directly against the persisted data store that contains the transactional data. However, some of the filters are Post-Query filters, meaning the filters are not applied until after the persisted data is retrieved. Post-Query filters have transformational logic that is better suited after the bulk of the query has been processed by the data store.

Filters that are processed directly against the data store also have specific comparison modes that can be utilized for easier queries. Review the comparison modes listed in the TransactionRowFilter table for a full list.

NOTE: ExcludeTransResults must be used with TransResults. It modifies the behavior of the TransResults field.

Comparison Types

Post-Query Filters

The following fields are Post-Query filters. They will not process until after the initial data store query has completed.

The data used to query on these parameters must be transformed before the filter can be applied. The data store resources are too time-consuming for these filters and they are therefore added after the data store query is completed. You should never use a Post-Query Filter without first limiting the data store query with some DBQuery filters such as a date range and/or the merchant account information.

Response Codes

AVS Response Codes

Response Code Description
00 AVS Error - Retry, System unavailable or Timed out
40 Address not available (Address not verified)
43 Street address not available (not verified), ZIP matches
44 Address failed
45 Street address and ZIP don't match
46 Street address doesn't match, 5-digit ZIP matches
47 Street address doesn't match, 9-digit ZIP matches
4A Street address or ZIP doesn't match
4D Street address matches, ZIP does not
4E Street address and 5-digit ZIP match
4F Street address and ZIP match
53 Account holder name incorrect, billing postal code matches
55 Unrecognized response
5C Account holder name incorrect, billing address matches
5F Account holder name incorrect, billing address and postal code match
70 Account holder name matches
73 Account holder name and billing postal code match
7C Account holder name and billing address match
7F Account holder name, billing address and postal code match
80 AVS service not supported by issuer - Issuer doesn't participate in AVS

CVV Response Codes

Response Code Description
M Matches
N No match
P Not processed
S Should be present
U Issuer is not certified
X Unrecognized reason

Gateway Result Codes

Response Code Description
00000 Successful request
00001 Partial Authorization
10001 Missing Reference Number
10002 Invalid Card Number - Blank/Null
10003 Invalid Card Type - Doesn't match accepted card types
10004 Invalid Expiration Date - Blank/Null
10005 Invalid Security Code - Blank/Null
10007 Invalid Card Number - Not Numeric
10008 Invalid Length for card type
10009 Invalid Expiration Date - Card Expired
10010 Invalid Security Code - Not Numeric
10011 Invalid Transaction ID
10012 Invalid Card Number - Failed Mod10
10013 Invalid Expiration Date Value
10014 Invalid Security Code Length
10017 Invalid Expiration Date - Invalid Month
10018 Invalid Expiration Date - Invalid Year
10019 Invalid Expiration Date
10020 Invalid Client Identifier
10021 Invalid Request Element – Missing Element
10022 Invalid Request Type
10023 Password Expired
10024 Invalid Credentials
10025 Invalid Zip – Not Numeric
10026 Invalid Zip – Wrong Length
10027 Invalid Amount – Blank/Null
10028 Invalid Amount – Not Numeric
10029 Invalid Request Date/Time
10030 Invalid Token
10031 Invalid Track
10032 Invalid Track Identifier
10033 Invalid Void Request
10034 Invalid Encryption ID
10035 Invalid Account Number – Blank/Null
10036 Invalid Account Number – Not Numeric
10037 Invalid Payment Type – Blank/Null
10038 Invalid Payment Type – Unrecognized Payment Type
10039 Invalid Account Number – Account Number Does Not Exist
10040 Missing Required Pass-Thru Data Element
10041 Missing / Invalid BIN
10042 Already Voided
10050 Incorrect Trace Number
10051 Incorrect Merchant Setup
10052 Processing Network Error
10053 Credit Card Entry Refused by Receiver
10054 Mandatory Field Error
20001 Tokenization Service Connection Error
20002 Beyond Pay Internal Server Error
20003 Client Service Unavailable
20004 Payment Service Sensitive Data Timeout
30004 Invalid Request Message
30005 Invalid Response Message
30006 New Password Doesn't Match Confirmation Password
30007 New Password Too Weak
30008 Missing Payment Card Data
30009 Internal Payment Card Data Error
30010 Invalid Record Format
30011 Invalid Merchant Number (from Gateway)
30012 Bad Card Number (from Gateway)
30013 Invalid Store Number
30020 Invalid Transaction Industry Type
30021 Missing Transaction Industry Type
30022 Processing Network Unavailable
30023 Invalid Account Number
30024 No Account
30025 Invalid Security Code
30026 Invalid Amount
30027 Refund limit is reached for the day (occurs when merchant has reached the refund limit allowed per day on the account)
30028 Settlement Failed
30029 Transaction Error
30030 Transaction data integrity validation error
30032 Denied by customer’s bank
30033 Insufficient funds
30034 Hold - Pick up card
30035 Incorrect PIN
30036 Duplicate Transaction
30037 Card reported lost
30038 Card reported stolen
30039 Service not allowed
30040 Stop Recurring
30041 Unattempted Batch Decline
30042 Maximum transaction limit is exceeded at the moment. Try processing your transaction tomorrow.
30043 Re-enter Transaction
30044 Unmapped decline
30045 Billing profile configuration error
30046 Pin Try Exceeded
30047 Refund was not processed/received
30048 Chargeback received
30049 Processing Canceled by User
30050 Invalid Transaction Category
30051 Invalid Verification Status
30052 Invalid Terminal Type
30053 Invalid Petroleum Product Type
30060 Invalid IApp User Id
30061 Account insert failed
30062 Merchant insert failed
30070 New Password Previously Used
30071 Missing Clerk Id
30072 Call for Authorization
30073 Card is Restricted
30074 Declined due to fraud rules
30075 Bank Account Blacklisted
30076 Declined due to insufficient information
30077 Rejected by the processor
30078 Account Closed
30079 Invalid Account
30080 Account can not process ACH
30082 Invalid MICR
30083 Customer opt out check Conversion
30100 Invalid Account Data – Blank/Null
30101 Invalid EMV Tag Data – Blank/Null
40001 Lodging Reauth Failed
40002 Missing Lodging Folio Number
80000 Gateway Services Available
80001 Gateway Services Unavailable
80002 Invalid Purchase Token
80003 More than one result found for search criteria
80004 More than one service fee block received in request message
80005 Cascade Void. Indicates that the transaction was successfully authorized (fully or partially) and then voided due to an auto-void policy setting. Only occurs on principal transactions and only when the accompanying service fee was either declined or voided due to an auto-void policy setting.
80006 Partial Auto Void. Indicates that the transaction was partially authorized and then voided due to an auto-void policy setting. Can occur on a service fee or principal transaction.
80007 Database query processing error. Can occur on a Find Transaction request if the data requested is unavailable.
80008 Invalid GatewayTransID
80009 Invalid MerchantCode
800010 Invalid MerchantAccountCode
800011 Transaction not found
800012 Invalid Length for PersistData
90000 Token Store failed to encrypt a token
90001 Token Store failed to decrypt a token
99999 Unknown Error

Gateway Message Codes

Gateway Message Code Message
A01 Approved: XXXXXX (approval code)
A02 Credit Posted
A03 Void Posted (Auth Reversed)
A04 No Update
A05 Partially Approved
A06 Void Posted (Auth Not Reversed)
A07 Partial Void Posted
A08 Partial Refund Posted
A09 Incremental Auth Posted
A10 Request Accepted
A11 Approval (Reversal failed)
A60 Terminal Offline Approval - EMV/Chip
A61 Terminal Offline Approval - Swipe
A62 Terminal Offline Approval - Credit
D01 Denied by customer's bank
D02 Invalid Expiration Date
D03 Insufficient funds
D04 Hold - Pick up card
D05 Invalid card number
D06 No account
D07 Incorrect PIN
D08 CSC is invalid
D09 Duplicate Transaction
D10 Card reported lost/stolen
D11 Card reported stolen
D12 Service not allowed
D13 Stop Recurring
D15 Maximum transaction limit is exceeded
D16 Card is expired
D17 Re-enter Transaction
D18 Bad Amount
D19 Unmapped decline
D20 Billing profile configuration error
D21 PIN try excdeed
D22 Refund was not processed/received
D24 Chargeback received
D25 Refund limit is reached for the day
D26 Settlement Failed
D27 Transaction Error
D28 Cashback limit exceeded/Cashback unavailable
D29 Card is restricted
D30 Call for Authorization
D31 Declined due to fraud rules
D32 Declined due to fraud engine decision
D33 Incorrect merchant setup
D34 Merchant profile configuration issue
D35 Card chip decline
E02 Processing Network Unavailable
E03 Transaction data integrity validation error
E04 Refund limit is reached for the day
E06 Card is blacklisted
E07 Tokenization is not supported
E08 Refunds are not allowed
E09 Processing Network Error
E10 3D Secure Verification Failed
E31 Declined due to pre-processing rules
X01 Processing Cancelled by User
X02 Pending processing
X03 3D Secure Verification Required
X04 Processing cancelled: the request has expired

Test Cards and Triggers

Cards and Checks

You can use the following card numbers for testing. CVV numbers are 1234 or 1111 for Amex; all others are 111 or 999.

Card Type Card Brand Card Number Expiration Date
Credit Visa 4111111111111111 10/25
Credit MasterCard 5499740000000057 10/25
Credit Discover 6011000991001201 10/25
Credit Amex 371449635392376 10/25
Debit Visa 4217651111111119 10/25
Debit MasterCard 5149612222222229 10/25

The following information may be used for ACH / eCheck testing:

Bank Account Number Routing Number Account Type
4099999992 021000021 Checking

Trigger Amounts

As part of your development and testing efforts, the amount ranges specified below can be used to trigger specific response codes from the server. These test ranges may be used with any valid card number.

Card Response Triggers

Amount Response Code Response Message
0.01 - 0.99 D01 Denied by customer's bank (Do Not Honor)
1.00 A01 Approved
1.01 - 4.98 D01 Denied by customer's bank (Do Not Honor)
4.99 20002 Internal ServerError
5.00 - 69.99 A01 Approved
70.00 - 79.99 D05 Invalid card number
80.00 - 89.99 D10 Card reported lost/stolen
90.00 - 99.99 D30 Call for authorization
100.00 - 109.99 D04 Pick up card
110.00 - 119.99 D08 Invalid security code
120.00 - 129.99 D03 Insufficient funds
130.00 - 139.99 E02 Processing network unavailable
140.00 - 149.99 E09 Internal ServerError
150.00 - 159.99 A05 Partially approved [approved amount will be $10 less than the requested amount]
170.00 - 181.99 A01 Approved
182.00 - 1999.99 D01 Denied by customer's bank (Do Not Honor)

AVS Response Triggers

ZIP Code AVS Response Code AVS Response Message
11111 00 AVS Error - Retry, System unavailable, or Timed out
22222 46 Street address doesn't match, 5-digit ZIP matches
33333 43 Street address not available (not verified), ZIP matches
44444 40 Address failed
55555 4F Street address and ZIP match

Refund ("Blind Credit") Response Triggers

Amount Response Code Response Message
0.01 - 4.99 D01 Denied by customer's bank (Do Not Honor)
5.00 - 69.99 A02 Credit Posted
70.00+ D01 Denied by customer's bank (Do Not Honor)