Repository files navigation

Transact Pro Gateway v3 PHP client library

This library provide ability to make requests to Transact Pro Gateway API v3.

Installation

Install the latest version with

$ composer require transact-pro/gw3-client

Basic usage

Inside form

Hold card input form on gateway side, client must be redirect to gateway.

<?phpuseTransactPro\Gateway\Gateway;
useTransactPro\Gateway\Responses\Constants\Status;
$gw = newGateway('<API BASE URL>/v3.0');
// Setup gateway authorization credentials$gw->auth()
->setAccountGUID("3383e58e-9cde-4ffa-85cf-81cd25b2423e")
->setSecretKey('super-secret-key');
// Create transaction object$sms = $gw->createSms();
// Set required fields$sms->money()
->setAmount(100)
->setCurrency('USD');
$sms->customer()
->setEmail("email@domain.com")
->setPhone("2445224657");
$sms->order()
->setMerchantTransactionID('A-345S')
->setDescription('Order #A-345S payment');
// Process payment via gateway inside form$sms->insideForm();
// Build transaction object to request$smsRequest = $sms->build();
// Process transaction to gateway$response = $gw->process($smsRequest);
// Parse Gateway response as a payment response$paymentResponse = $sms->parseResponse($response);
if (!empty($paymentResponse->error)) {
thrownew \RuntimeException("GW error: {$paymentResponse->error->message}");
}
// Redirect user to received URLif ($paymentResponse->gw->statusCode === Status::CARD_FORM_URL_SENT) {
header("Location: {$paymentResponse->gw->redirectUrl}");
}

Server to server

Hold card input form on merchant side and process via API.

<?phpuseTransactPro\Gateway\Gateway;
useTransactPro\Gateway\Responses\Constants\Status;
$gw = newGateway('<API BASE URL>/v3.0');
// Setup gatewayl authorization credentials$gw->auth()
->setAccountGUID("3383e58e-9cde-4ffa-85cf-81cd25b2423e")
->setSecretKey('super-secret-key');
// Create transaction object$sms = $gw->createSms();
// Set required fields$sms->paymentMethod()
->setPAN('4295550031781065')
->setExpire('06/18')
->setCVV('683')
->setCardHolderName('John Doe');
$sms->money()
->setAmount(100)
->setCurrency('USD');
// Build transaction object to request$smsRequest = $sms->build();
// Process transaction to gateway$response = $gw->process($smsRequest);
// Parse Gateway response as a payment response$paymentResponse = $sms->parseResponse($response);
echo$paymentResponse->gw->statusCode === Status::SUCCESS ? "SUCCESS" : "FAILED";

Documentation

This README provide introduction to the library usage.

Operations

Operations are available via $gw->create<operation name>() method.

Available operations:

  • Transactions
    • CANCEL
    • DMS CHARGE
    • DMS HOLD
    • MOTO DMS
    • MOTO SMS
    • INIT RECURRENT DMS
    • RECURRENT DMS
    • INIT RECURRENT SMS
    • RECURRENT SMS
    • REFUND
    • REVERSAL
    • SMS
    • Credit
    • P2P
    • B2P
  • Information
    • HISTORY
    • RECURRENTS
    • REFUNDS
    • RESULT
    • STATUS
    • LIMITS
  • Verification
    • 3-D Secure enrollment
    • Complete card verification
  • Tokenization
    • Create payment data token
  • Callback processing
    • verify callback data sign
  • Reporting
    • Get transactions report in CSV format

Pattern to work with the library can be described as follows:

<?phpuseTransactPro\Gateway\Gateway;
$gw = newGateway('<API BASE URL>/v3.0');
// first, you need to setup authorization.// you can change authorization data in runtime.// Thus, following operations will work under// new authorization.$gw->auth()
->setAccountGUID("3383e58e-9cde-4ffa-85cf-81cd25b2423e")
->setSecretKey('super-secret-key');
$operation = $gw->createOPERATION();
// here you setup your request through public methods// that expose you blocks of information, that you can fill for the// operation of your choice.// build() will prepare `Request` object that `$gw` will use// for the request.$operationRequest = $operation->build();
// process() will perform provided request to the gateway// `$response` will have response data (headers, body).$response = $gw->process($operationRequest);
// parse received raw response to an appropriate class$parsedResponse = $operation->parseResponse($response);

Card verification

<?phpuseTransactPro\Gateway\DataSets\Command;
// create a payment to init card verification process$message->command()->setCardVerificationMode(Command::CARD_VERIFICATION_MODE_INIT);
// complete card verification$operation = $gw->createCardVerification();
$operation->data()->setGatewayTransactionID($initialResponseGatewayTransactionId);
$operationRequest = $operation->build();
$response = $gw->process($request);
echo$response->getStatusCode() === 200 ? 'SUCCESS' : 'FAILURE';
// send a payment with flag to accept only verified cards$message->command()->setCardVerificationMode(Command::CARD_VERIFICATION_MODE_VERIFY);

Payment data tokenization

<?phpuseTransactPro\Gateway\DataSets\Command;
// option 1: create a payment with flag to save payment data$message->command()->setPaymentMethodDataSource(Command::DATA_SOURCE_SAVE_TO_GATEWAY);
// option 2: send "create token" request with payment data$operation = $gw->createToken();
$operation->paymentMethod()
->setPAN('<card number>')
->setExpire('<card expiry>')
->setCardHolderName('<cardholder name>');
$operation->money()
->setCurrency('<desired currency>');
$operationRequest = $operation->build();
$response = $gw->process($request);
// send a payment in "token usage" mode with flag to load payment data by token$message->useToken();
$message->command()
->setPaymentMethodDataSource(Command::DATA_SOURCE_USE_GATEWAY_SAVED_CARDHOLDER_INITIATED)
->setPaymentMethodDataToken('<initial gateway-transaction-id>');
$response = $gw->process($message);
$paymentResponse = $message->parseResponse($response);
if (
!empty($paymentResponse->error) &&
$paymentResponse->error->code === ErrorCode::EEC_ACQUIRER_SOFT_DECLINE &&
!empty($paymentResponse->gw->redirectUrl)
) {
header("Location: {$paymentResponse->gw->redirectUrl}");
}

Using alternative payment methods

To use an alternative payment method (like Google Pay), send a received token AS-IS or data from a decrypted token.

<?phpuseTransactPro\Gateway\DataSets\Command;
// set a corresponding flag that indicates a token provider$operation->command()->setPaymentMethodType(Command::PAYMENT_METHOD_TYPE_GOOGLE_PAY);
// option 1: send received token AS-IS$operation->paymentMethod()->setToken('<token>');
// option 2: send data from decrypted token$operation->paymentMethod()
->setPAN('<card number>')
->setExpire('<card expiry>')
->setCardHolderName('<cardholder name>') // if available
->setExternalTokenCryptogram('<cryptogram from token>') // if available
->setExternalTokenECI('<ECI from token>') // if available
->setExternalTokenTransStatus('<transStatus from token>') // available for Click to Pay
->setExternalTokenDsTransId('<dsTransId from token>') // available for Click to Pay
->setExternalTokenAcsTransId('<acsTransId from token>') // available for Click to Pay
->setExternalTokenCardHolderAuthenticated($decryptedToken['paymentMethodDetails']['assuranceDetails']['cardHolderAuthenticated']); // for Google Pay

Callback validation

<?phpuseTransactPro\Gateway\Responses\GatewayResponse;
useTransactPro\Gateway\Responses\CallbackResult;
useTransactPro\Gateway\Http\Crypto\ResponseDigest;
// verify data digest$responseDigest = newResponseDigest($_POST['sign'] ?? '');
$responseDigest->setOriginalUri($paymentResponse->getDigest()->getUri()); // optional, set if available$responseDigest->setOriginalCnonce($paymentResponse->getDigest()->getCnonce()); // optional, set if available$responseDigest->setBody($_POST['json'] ?? '');
$responseDigest->verify("3383e58e-9cde-4ffa-85cf-81cd25b2423e", "super-secret-key");
// parse callback data as a payment response$callbackResponse = GatewayResponse::createFromJSON($_POST['json'] ?? '', CallbackResult::class);
echo$callbackResponse->gw->statusText;

Transactions report loading

<?phpuseTransactPro\Gateway\Interfaces\ResponseInterface;
// NB. Merchant GUID/secret must be used instead of account GUID/secret!$gw->auth()
->setMerchantGUID('8D80-921D-BB99-45ED')
->setSecretKey('super-secret-key');
$message = $gw->createReport();
$message->filterData()
->setDtCreatedFrom(time() - 86400)
->setDtFinishedTo(time());
$request = $message->build();
$response = $gw->process($request);
// get raw body$reportCSV = $response->getBody();
// get parsed body as iterator where each row is an associative array// with keys from the first line and values are from all other lines$csvResponse = $message->parseResponse($response);
print_r($csvResponse->getHeaders());
foreach ($csvResponseas$key => $value) {
print_r($value);
}

Customization

If you need to access different API URL you can set through Gateway constructor as follows:

<?phpuseTransactPro\Gateway\Gateway;
$gw = newGateway('https://customurl.com');

Also, you can customize client for your needs. By default Http\Client\Client class is used. It use cURL under the hood. It implements HttpClientInterface. You can create your own (or configure default) and set it to the gateway.

<?phpuseTransactPro\Gateway\Gateway;
$httpClient = newMyClient(); // implements HttpClientInterface$gw = newGateway('<API BASE URL>/v3.0');
$gw->setHttpClient($httpClient);
// use it!// ...

If you need to load an HTML form from Gateway instead of cardholder browser redirect, a special operation type may be used:

// execute a payment$paymentResponse = $operation->parseResponse($response);
$retrieveFormOperation = $gw->createRetrieveForm($paymentResponse);
$retrieveFormRequest = $retrieveFormOperation->build();
$htmlResponse = $gw->process($retrieveFormRequest);
$rawHtml = $htmlResponse->getBody();

Exceptions

Main exception, that can be thrown by the library is the GatewayException. Following exceptions are children of GatewayException:

  • RequestException - will be thrown if request fail.
  • ValidatorException - will be thrown if some data for the request is missing.
  • ResponseException - will be thrown if response parsing/validation fail (corrupted response).
  • DigestMissingException - will be thrown if response missing Authorization header (corrupted response).
  • DigestMismatchException - will be thrown if response digest validation fail (corrupted response).

Useful constants

\TransactPro\Gateway\Responses\Constants\ErrorCode - error codes \TransactPro\Gateway\Responses\Constants\Status - transaction statuses \TransactPro\Gateway\Responses\Constants\CardFamily - card families

About

Requirements

  • This library works with PHP 7.0 or above.

Submit bugs and feature requests

Bugs and feature request are tracked on GitHub

License

This library is licensed under the MIT License - see the LICENSE file for details.

About

This library provide ability to make requests to Transact Pro Gateway API v3.

Resources

Stars

3 stars

Watchers

7 watching

Forks

Releases

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

Transact Pro Gateway v3 PHP client library

This library provide ability to make requests to Transact Pro Gateway API v3.

Installation

Install the latest version with

$ composer require transact-pro/gw3-client

Basic usage

Inside form

Hold card input form on gateway side, client must be redirect to gateway.

<?phpuseTransactPro\Gateway\Gateway;
useTransactPro\Gateway\Responses\Constants\Status;
$gw = newGateway('<API BASE URL>/v3.0');
// Setup gateway authorization credentials$gw->auth()
->setAccountGUID("3383e58e-9cde-4ffa-85cf-81cd25b2423e")
->setSecretKey('super-secret-key');
// Create transaction object$sms = $gw->createSms();
// Set required fields$sms->money()
->setAmount(100)
->setCurrency('USD');
$sms->customer()
->setEmail("email@domain.com")
->setPhone("2445224657");
$sms->order()
->setMerchantTransactionID('A-345S')
->setDescription('Order #A-345S payment');
// Process payment via gateway inside form$sms->insideForm();
// Build transaction object to request$smsRequest = $sms->build();
// Process transaction to gateway$response = $gw->process($smsRequest);
// Parse Gateway response as a payment response$paymentResponse = $sms->parseResponse($response);
if (!empty($paymentResponse->error)) {
thrownew \RuntimeException("GW error: {$paymentResponse->error->message}");
}
// Redirect user to received URLif ($paymentResponse->gw->statusCode === Status::CARD_FORM_URL_SENT) {
header("Location: {$paymentResponse->gw->redirectUrl}");
}

Server to server

Hold card input form on merchant side and process via API.

<?phpuseTransactPro\Gateway\Gateway;
useTransactPro\Gateway\Responses\Constants\Status;
$gw = newGateway('<API BASE URL>/v3.0');
// Setup gatewayl authorization credentials$gw->auth()
->setAccountGUID("3383e58e-9cde-4ffa-85cf-81cd25b2423e")
->setSecretKey('super-secret-key');
// Create transaction object$sms = $gw->createSms();
// Set required fields$sms->paymentMethod()
->setPAN('4295550031781065')
->setExpire('06/18')
->setCVV('683')
->setCardHolderName('John Doe');
$sms->money()
->setAmount(100)
->setCurrency('USD');
// Build transaction object to request$smsRequest = $sms->build();
// Process transaction to gateway$response = $gw->process($smsRequest);
// Parse Gateway response as a payment response$paymentResponse = $sms->parseResponse($response);
echo$paymentResponse->gw->statusCode === Status::SUCCESS ? "SUCCESS" : "FAILED";

Documentation

This README provide introduction to the library usage.

Operations

Operations are available via $gw->create<operation name>() method.

Available operations:

  • Transactions
    • CANCEL
    • DMS CHARGE
    • DMS HOLD
    • MOTO DMS
    • MOTO SMS
    • INIT RECURRENT DMS
    • RECURRENT DMS
    • INIT RECURRENT SMS
    • RECURRENT SMS
    • REFUND
    • REVERSAL
    • SMS
    • Credit
    • P2P
    • B2P
  • Information
    • HISTORY
    • RECURRENTS
    • REFUNDS
    • RESULT
    • STATUS
    • LIMITS
  • Verification
    • 3-D Secure enrollment
    • Complete card verification
  • Tokenization
    • Create payment data token
  • Callback processing
    • verify callback data sign
  • Reporting
    • Get transactions report in CSV format

Pattern to work with the library can be described as follows:

<?phpuseTransactPro\Gateway\Gateway;
$gw = newGateway('<API BASE URL>/v3.0');
// first, you need to setup authorization.// you can change authorization data in runtime.// Thus, following operations will work under// new authorization.$gw->auth()
->setAccountGUID("3383e58e-9cde-4ffa-85cf-81cd25b2423e")
->setSecretKey('super-secret-key');
$operation = $gw->createOPERATION();
// here you setup your request through public methods// that expose you blocks of information, that you can fill for the// operation of your choice.// build() will prepare `Request` object that `$gw` will use// for the request.$operationRequest = $operation->build();
// process() will perform provided request to the gateway// `$response` will have response data (headers, body).$response = $gw->process($operationRequest);
// parse received raw response to an appropriate class$parsedResponse = $operation->parseResponse($response);

Card verification

<?phpuseTransactPro\Gateway\DataSets\Command;
// create a payment to init card verification process$message->command()->setCardVerificationMode(Command::CARD_VERIFICATION_MODE_INIT);
// complete card verification$operation = $gw->createCardVerification();
$operation->data()->setGatewayTransactionID($initialResponseGatewayTransactionId);
$operationRequest = $operation->build();
$response = $gw->process($request);
echo$response->getStatusCode() === 200 ? 'SUCCESS' : 'FAILURE';
// send a payment with flag to accept only verified cards$message->command()->setCardVerificationMode(Command::CARD_VERIFICATION_MODE_VERIFY);

Payment data tokenization

<?phpuseTransactPro\Gateway\DataSets\Command;
// option 1: create a payment with flag to save payment data$message->command()->setPaymentMethodDataSource(Command::DATA_SOURCE_SAVE_TO_GATEWAY);
// option 2: send "create token" request with payment data$operation = $gw->createToken();
$operation->paymentMethod()
->setPAN('<card number>')
->setExpire('<card expiry>')
->setCardHolderName('<cardholder name>');
$operation->money()
->setCurrency('<desired currency>');
$operationRequest = $operation->build();
$response = $gw->process($request);
// send a payment in "token usage" mode with flag to load payment data by token$message->useToken();
$message->command()
->setPaymentMethodDataSource(Command::DATA_SOURCE_USE_GATEWAY_SAVED_CARDHOLDER_INITIATED)
->setPaymentMethodDataToken('<initial gateway-transaction-id>');
$response = $gw->process($message);
$paymentResponse = $message->parseResponse($response);
if (
!empty($paymentResponse->error) &&
$paymentResponse->error->code === ErrorCode::EEC_ACQUIRER_SOFT_DECLINE &&
!empty($paymentResponse->gw->redirectUrl)
) {
header("Location: {$paymentResponse->gw->redirectUrl}");
}

Using alternative payment methods

To use an alternative payment method (like Google Pay), send a received token AS-IS or data from a decrypted token.

<?phpuseTransactPro\Gateway\DataSets\Command;
// set a corresponding flag that indicates a token provider$operation->command()->setPaymentMethodType(Command::PAYMENT_METHOD_TYPE_GOOGLE_PAY);
// option 1: send received token AS-IS$operation->paymentMethod()->setToken('<token>');
// option 2: send data from decrypted token$operation->paymentMethod()
->setPAN('<card number>')
->setExpire('<card expiry>')
->setCardHolderName('<cardholder name>') // if available
->setExternalTokenCryptogram('<cryptogram from token>') // if available
->setExternalTokenECI('<ECI from token>') // if available
->setExternalTokenTransStatus('<transStatus from token>') // available for Click to Pay
->setExternalTokenDsTransId('<dsTransId from token>') // available for Click to Pay
->setExternalTokenAcsTransId('<acsTransId from token>') // available for Click to Pay
->setExternalTokenCardHolderAuthenticated($decryptedToken['paymentMethodDetails']['assuranceDetails']['cardHolderAuthenticated']); // for Google Pay

Callback validation

<?phpuseTransactPro\Gateway\Responses\GatewayResponse;
useTransactPro\Gateway\Responses\CallbackResult;
useTransactPro\Gateway\Http\Crypto\ResponseDigest;
// verify data digest$responseDigest = newResponseDigest($_POST['sign'] ?? '');
$responseDigest->setOriginalUri($paymentResponse->getDigest()->getUri()); // optional, set if available$responseDigest->setOriginalCnonce($paymentResponse->getDigest()->getCnonce()); // optional, set if available$responseDigest->setBody($_POST['json'] ?? '');
$responseDigest->verify("3383e58e-9cde-4ffa-85cf-81cd25b2423e", "super-secret-key");
// parse callback data as a payment response$callbackResponse = GatewayResponse::createFromJSON($_POST['json'] ?? '', CallbackResult::class);
echo$callbackResponse->gw->statusText;

Transactions report loading

<?phpuseTransactPro\Gateway\Interfaces\ResponseInterface;
// NB. Merchant GUID/secret must be used instead of account GUID/secret!$gw->auth()
->setMerchantGUID('8D80-921D-BB99-45ED')
->setSecretKey('super-secret-key');
$message = $gw->createReport();
$message->filterData()
->setDtCreatedFrom(time() - 86400)
->setDtFinishedTo(time());
$request = $message->build();
$response = $gw->process($request);
// get raw body$reportCSV = $response->getBody();
// get parsed body as iterator where each row is an associative array// with keys from the first line and values are from all other lines$csvResponse = $message->parseResponse($response);
print_r($csvResponse->getHeaders());
foreach ($csvResponseas$key => $value) {
print_r($value);
}

Customization

If you need to access different API URL you can set through Gateway constructor as follows:

<?phpuseTransactPro\Gateway\Gateway;
$gw = newGateway('https://customurl.com');

Also, you can customize client for your needs. By default Http\Client\Client class is used. It use cURL under the hood. It implements HttpClientInterface. You can create your own (or configure default) and set it to the gateway.

<?phpuseTransactPro\Gateway\Gateway;
$httpClient = newMyClient(); // implements HttpClientInterface$gw = newGateway('<API BASE URL>/v3.0');
$gw->setHttpClient($httpClient);
// use it!// ...

If you need to load an HTML form from Gateway instead of cardholder browser redirect, a special operation type may be used:

// execute a payment$paymentResponse = $operation->parseResponse($response);
$retrieveFormOperation = $gw->createRetrieveForm($paymentResponse);
$retrieveFormRequest = $retrieveFormOperation->build();
$htmlResponse = $gw->process($retrieveFormRequest);
$rawHtml = $htmlResponse->getBody();

Exceptions

Main exception, that can be thrown by the library is the GatewayException. Following exceptions are children of GatewayException:

  • RequestException - will be thrown if request fail.
  • ValidatorException - will be thrown if some data for the request is missing.
  • ResponseException - will be thrown if response parsing/validation fail (corrupted response).
  • DigestMissingException - will be thrown if response missing Authorization header (corrupted response).
  • DigestMismatchException - will be thrown if response digest validation fail (corrupted response).

Useful constants

\TransactPro\Gateway\Responses\Constants\ErrorCode - error codes \TransactPro\Gateway\Responses\Constants\Status - transaction statuses \TransactPro\Gateway\Responses\Constants\CardFamily - card families

About

Requirements

  • This library works with PHP 7.0 or above.

Submit bugs and feature requests

Bugs and feature request are tracked on GitHub

License

This library is licensed under the MIT License - see the LICENSE file for details.

About

This library provide ability to make requests to Transact Pro Gateway API v3.

Resources

Stars

3 stars

Watchers

7 watching

Forks

Releases

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Transact Pro Gateway v3 PHP client library

This library provide ability to make requests to Transact Pro Gateway API v3.

Installation

Install the latest version with

$ composer require transact-pro/gw3-client

Basic usage

Inside form

Hold card input form on gateway side, client must be redirect to gateway.

<?phpuseTransactPro\Gateway\Gateway;
useTransactPro\Gateway\Responses\Constants\Status;
$gw = newGateway('<API BASE URL>/v3.0');
// Setup gateway authorization credentials$gw->auth()
->setAccountGUID("3383e58e-9cde-4ffa-85cf-81cd25b2423e")
->setSecretKey('super-secret-key');
// Create transaction object$sms = $gw->createSms();
// Set required fields$sms->money()
->setAmount(100)
->setCurrency('USD');
$sms->customer()
->setEmail("email@domain.com")
->setPhone("2445224657");
$sms->order()
->setMerchantTransactionID('A-345S')
->setDescription('Order #A-345S payment');
// Process payment via gateway inside form$sms->insideForm();
// Build transaction object to request$smsRequest = $sms->build();
// Process transaction to gateway$response = $gw->process($smsRequest);
// Parse Gateway response as a payment response$paymentResponse = $sms->parseResponse($response);
if (!empty($paymentResponse->error)) {
thrownew \RuntimeException("GW error: {$paymentResponse->error->message}");
}
// Redirect user to received URLif ($paymentResponse->gw->statusCode === Status::CARD_FORM_URL_SENT) {
header("Location: {$paymentResponse->gw->redirectUrl}");
}

Server to server

Hold card input form on merchant side and process via API.

<?phpuseTransactPro\Gateway\Gateway;
useTransactPro\Gateway\Responses\Constants\Status;
$gw = newGateway('<API BASE URL>/v3.0');
// Setup gatewayl authorization credentials$gw->auth()
->setAccountGUID("3383e58e-9cde-4ffa-85cf-81cd25b2423e")
->setSecretKey('super-secret-key');
// Create transaction object$sms = $gw->createSms();
// Set required fields$sms->paymentMethod()
->setPAN('4295550031781065')
->setExpire('06/18')
->setCVV('683')
->setCardHolderName('John Doe');
$sms->money()
->setAmount(100)
->setCurrency('USD');
// Build transaction object to request$smsRequest = $sms->build();
// Process transaction to gateway$response = $gw->process($smsRequest);
// Parse Gateway response as a payment response$paymentResponse = $sms->parseResponse($response);
echo$paymentResponse->gw->statusCode === Status::SUCCESS ? "SUCCESS" : "FAILED";

Documentation

This README provide introduction to the library usage.

Operations

Operations are available via $gw->create<operation name>() method.

Available operations:

  • Transactions
    • CANCEL
    • DMS CHARGE
    • DMS HOLD
    • MOTO DMS
    • MOTO SMS
    • INIT RECURRENT DMS
    • RECURRENT DMS
    • INIT RECURRENT SMS
    • RECURRENT SMS
    • REFUND
    • REVERSAL
    • SMS
    • Credit
    • P2P
    • B2P
  • Information
    • HISTORY
    • RECURRENTS
    • REFUNDS
    • RESULT
    • STATUS
    • LIMITS
  • Verification
    • 3-D Secure enrollment
    • Complete card verification
  • Tokenization
    • Create payment data token
  • Callback processing
    • verify callback data sign
  • Reporting
    • Get transactions report in CSV format

Pattern to work with the library can be described as follows:

<?phpuseTransactPro\Gateway\Gateway;
$gw = newGateway('<API BASE URL>/v3.0');
// first, you need to setup authorization.// you can change authorization data in runtime.// Thus, following operations will work under// new authorization.$gw->auth()
->setAccountGUID("3383e58e-9cde-4ffa-85cf-81cd25b2423e")
->setSecretKey('super-secret-key');
$operation = $gw->createOPERATION();
// here you setup your request through public methods// that expose you blocks of information, that you can fill for the// operation of your choice.// build() will prepare `Request` object that `$gw` will use// for the request.$operationRequest = $operation->build();
// process() will perform provided request to the gateway// `$response` will have response data (headers, body).$response = $gw->process($operationRequest);
// parse received raw response to an appropriate class$parsedResponse = $operation->parseResponse($response);

Card verification

<?phpuseTransactPro\Gateway\DataSets\Command;
// create a payment to init card verification process$message->command()->setCardVerificationMode(Command::CARD_VERIFICATION_MODE_INIT);
// complete card verification$operation = $gw->createCardVerification();
$operation->data()->setGatewayTransactionID($initialResponseGatewayTransactionId);
$operationRequest = $operation->build();
$response = $gw->process($request);
echo$response->getStatusCode() === 200 ? 'SUCCESS' : 'FAILURE';
// send a payment with flag to accept only verified cards$message->command()->setCardVerificationMode(Command::CARD_VERIFICATION_MODE_VERIFY);

Payment data tokenization

<?phpuseTransactPro\Gateway\DataSets\Command;
// option 1: create a payment with flag to save payment data$message->command()->setPaymentMethodDataSource(Command::DATA_SOURCE_SAVE_TO_GATEWAY);
// option 2: send "create token" request with payment data$operation = $gw->createToken();
$operation->paymentMethod()
->setPAN('<card number>')
->setExpire('<card expiry>')
->setCardHolderName('<cardholder name>');
$operation->money()
->setCurrency('<desired currency>');
$operationRequest = $operation->build();
$response = $gw->process($request);
// send a payment in "token usage" mode with flag to load payment data by token$message->useToken();
$message->command()
->setPaymentMethodDataSource(Command::DATA_SOURCE_USE_GATEWAY_SAVED_CARDHOLDER_INITIATED)
->setPaymentMethodDataToken('<initial gateway-transaction-id>');
$response = $gw->process($message);
$paymentResponse = $message->parseResponse($response);
if (
!empty($paymentResponse->error) &&
$paymentResponse->error->code === ErrorCode::EEC_ACQUIRER_SOFT_DECLINE &&
!empty($paymentResponse->gw->redirectUrl)
) {
header("Location: {$paymentResponse->gw->redirectUrl}");
}

Using alternative payment methods

To use an alternative payment method (like Google Pay), send a received token AS-IS or data from a decrypted token.

<?phpuseTransactPro\Gateway\DataSets\Command;
// set a corresponding flag that indicates a token provider$operation->command()->setPaymentMethodType(Command::PAYMENT_METHOD_TYPE_GOOGLE_PAY);
// option 1: send received token AS-IS$operation->paymentMethod()->setToken('<token>');
// option 2: send data from decrypted token$operation->paymentMethod()
->setPAN('<card number>')
->setExpire('<card expiry>')
->setCardHolderName('<cardholder name>') // if available
->setExternalTokenCryptogram('<cryptogram from token>') // if available
->setExternalTokenECI('<ECI from token>') // if available
->setExternalTokenTransStatus('<transStatus from token>') // available for Click to Pay
->setExternalTokenDsTransId('<dsTransId from token>') // available for Click to Pay
->setExternalTokenAcsTransId('<acsTransId from token>') // available for Click to Pay
->setExternalTokenCardHolderAuthenticated($decryptedToken['paymentMethodDetails']['assuranceDetails']['cardHolderAuthenticated']); // for Google Pay

Callback validation

<?phpuseTransactPro\Gateway\Responses\GatewayResponse;
useTransactPro\Gateway\Responses\CallbackResult;
useTransactPro\Gateway\Http\Crypto\ResponseDigest;
// verify data digest$responseDigest = newResponseDigest($_POST['sign'] ?? '');
$responseDigest->setOriginalUri($paymentResponse->getDigest()->getUri()); // optional, set if available$responseDigest->setOriginalCnonce($paymentResponse->getDigest()->getCnonce()); // optional, set if available$responseDigest->setBody($_POST['json'] ?? '');
$responseDigest->verify("3383e58e-9cde-4ffa-85cf-81cd25b2423e", "super-secret-key");
// parse callback data as a payment response$callbackResponse = GatewayResponse::createFromJSON($_POST['json'] ?? '', CallbackResult::class);
echo$callbackResponse->gw->statusText;

Transactions report loading

<?phpuseTransactPro\Gateway\Interfaces\ResponseInterface;
// NB. Merchant GUID/secret must be used instead of account GUID/secret!$gw->auth()
->setMerchantGUID('8D80-921D-BB99-45ED')
->setSecretKey('super-secret-key');
$message = $gw->createReport();
$message->filterData()
->setDtCreatedFrom(time() - 86400)
->setDtFinishedTo(time());
$request = $message->build();
$response = $gw->process($request);
// get raw body$reportCSV = $response->getBody();
// get parsed body as iterator where each row is an associative array// with keys from the first line and values are from all other lines$csvResponse = $message->parseResponse($response);
print_r($csvResponse->getHeaders());
foreach ($csvResponseas$key => $value) {
print_r($value);
}

Customization

If you need to access different API URL you can set through Gateway constructor as follows:

<?phpuseTransactPro\Gateway\Gateway;
$gw = newGateway('https://customurl.com');

Also, you can customize client for your needs. By default Http\Client\Client class is used. It use cURL under the hood. It implements HttpClientInterface. You can create your own (or configure default) and set it to the gateway.

<?phpuseTransactPro\Gateway\Gateway;
$httpClient = newMyClient(); // implements HttpClientInterface$gw = newGateway('<API BASE URL>/v3.0');
$gw->setHttpClient($httpClient);
// use it!// ...

If you need to load an HTML form from Gateway instead of cardholder browser redirect, a special operation type may be used:

// execute a payment$paymentResponse = $operation->parseResponse($response);
$retrieveFormOperation = $gw->createRetrieveForm($paymentResponse);
$retrieveFormRequest = $retrieveFormOperation->build();
$htmlResponse = $gw->process($retrieveFormRequest);
$rawHtml = $htmlResponse->getBody();

Exceptions

Main exception, that can be thrown by the library is the GatewayException. Following exceptions are children of GatewayException:

  • RequestException - will be thrown if request fail.
  • ValidatorException - will be thrown if some data for the request is missing.
  • ResponseException - will be thrown if response parsing/validation fail (corrupted response).
  • DigestMissingException - will be thrown if response missing Authorization header (corrupted response).
  • DigestMismatchException - will be thrown if response digest validation fail (corrupted response).

Useful constants

\TransactPro\Gateway\Responses\Constants\ErrorCode - error codes \TransactPro\Gateway\Responses\Constants\Status - transaction statuses \TransactPro\Gateway\Responses\Constants\CardFamily - card families

About

Requirements

  • This library works with PHP 7.0 or above.

Submit bugs and feature requests

Bugs and feature request are tracked on GitHub

License

This library is licensed under the MIT License - see the LICENSE file for details.

About

This library provide ability to make requests to Transact Pro Gateway API v3.

Resources

Stars

3 stars

Watchers

7 watching

Forks

Releases

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Transact Pro Gateway v3 PHP client library

This library provide ability to make requests to Transact Pro Gateway API v3.

Installation

Install the latest version with

$ composer require transact-pro/gw3-client

Basic usage

Inside form

Hold card input form on gateway side, client must be redirect to gateway.

<?phpuseTransactPro\Gateway\Gateway;
useTransactPro\Gateway\Responses\Constants\Status;
$gw = newGateway('<API BASE URL>/v3.0');
// Setup gateway authorization credentials$gw->auth()
->setAccountGUID("3383e58e-9cde-4ffa-85cf-81cd25b2423e")
->setSecretKey('super-secret-key');
// Create transaction object$sms = $gw->createSms();
// Set required fields$sms->money()
->setAmount(100)
->setCurrency('USD');
$sms->customer()
->setEmail("email@domain.com")
->setPhone("2445224657");
$sms->order()
->setMerchantTransactionID('A-345S')
->setDescription('Order #A-345S payment');
// Process payment via gateway inside form$sms->insideForm();
// Build transaction object to request$smsRequest = $sms->build();
// Process transaction to gateway$response = $gw->process($smsRequest);
// Parse Gateway response as a payment response$paymentResponse = $sms->parseResponse($response);
if (!empty($paymentResponse->error)) {
thrownew \RuntimeException("GW error: {$paymentResponse->error->message}");
}
// Redirect user to received URLif ($paymentResponse->gw->statusCode === Status::CARD_FORM_URL_SENT) {
header("Location: {$paymentResponse->gw->redirectUrl}");
}

Server to server

Hold card input form on merchant side and process via API.

<?phpuseTransactPro\Gateway\Gateway;
useTransactPro\Gateway\Responses\Constants\Status;
$gw = newGateway('<API BASE URL>/v3.0');
// Setup gatewayl authorization credentials$gw->auth()
->setAccountGUID("3383e58e-9cde-4ffa-85cf-81cd25b2423e")
->setSecretKey('super-secret-key');
// Create transaction object$sms = $gw->createSms();
// Set required fields$sms->paymentMethod()
->setPAN('4295550031781065')
->setExpire('06/18')
->setCVV('683')
->setCardHolderName('John Doe');
$sms->money()
->setAmount(100)
->setCurrency('USD');
// Build transaction object to request$smsRequest = $sms->build();
// Process transaction to gateway$response = $gw->process($smsRequest);
// Parse Gateway response as a payment response$paymentResponse = $sms->parseResponse($response);
echo$paymentResponse->gw->statusCode === Status::SUCCESS ? "SUCCESS" : "FAILED";

Documentation

This README provide introduction to the library usage.

Operations

Operations are available via $gw->create<operation name>() method.

Available operations:

  • Transactions
    • CANCEL
    • DMS CHARGE
    • DMS HOLD
    • MOTO DMS
    • MOTO SMS
    • INIT RECURRENT DMS
    • RECURRENT DMS
    • INIT RECURRENT SMS
    • RECURRENT SMS
    • REFUND
    • REVERSAL
    • SMS
    • Credit
    • P2P
    • B2P
  • Information
    • HISTORY
    • RECURRENTS
    • REFUNDS
    • RESULT
    • STATUS
    • LIMITS
  • Verification
    • 3-D Secure enrollment
    • Complete card verification
  • Tokenization
    • Create payment data token
  • Callback processing
    • verify callback data sign
  • Reporting
    • Get transactions report in CSV format

Pattern to work with the library can be described as follows:

<?phpuseTransactPro\Gateway\Gateway;
$gw = newGateway('<API BASE URL>/v3.0');
// first, you need to setup authorization.// you can change authorization data in runtime.// Thus, following operations will work under// new authorization.$gw->auth()
->setAccountGUID("3383e58e-9cde-4ffa-85cf-81cd25b2423e")
->setSecretKey('super-secret-key');
$operation = $gw->createOPERATION();
// here you setup your request through public methods// that expose you blocks of information, that you can fill for the// operation of your choice.// build() will prepare `Request` object that `$gw` will use// for the request.$operationRequest = $operation->build();
// process() will perform provided request to the gateway// `$response` will have response data (headers, body).$response = $gw->process($operationRequest);
// parse received raw response to an appropriate class$parsedResponse = $operation->parseResponse($response);

Card verification

<?phpuseTransactPro\Gateway\DataSets\Command;
// create a payment to init card verification process$message->command()->setCardVerificationMode(Command::CARD_VERIFICATION_MODE_INIT);
// complete card verification$operation = $gw->createCardVerification();
$operation->data()->setGatewayTransactionID($initialResponseGatewayTransactionId);
$operationRequest = $operation->build();
$response = $gw->process($request);
echo$response->getStatusCode() === 200 ? 'SUCCESS' : 'FAILURE';
// send a payment with flag to accept only verified cards$message->command()->setCardVerificationMode(Command::CARD_VERIFICATION_MODE_VERIFY);

Payment data tokenization

<?phpuseTransactPro\Gateway\DataSets\Command;
// option 1: create a payment with flag to save payment data$message->command()->setPaymentMethodDataSource(Command::DATA_SOURCE_SAVE_TO_GATEWAY);
// option 2: send "create token" request with payment data$operation = $gw->createToken();
$operation->paymentMethod()
->setPAN('<card number>')
->setExpire('<card expiry>')
->setCardHolderName('<cardholder name>');
$operation->money()
->setCurrency('<desired currency>');
$operationRequest = $operation->build();
$response = $gw->process($request);
// send a payment in "token usage" mode with flag to load payment data by token$message->useToken();
$message->command()
->setPaymentMethodDataSource(Command::DATA_SOURCE_USE_GATEWAY_SAVED_CARDHOLDER_INITIATED)
->setPaymentMethodDataToken('<initial gateway-transaction-id>');
$response = $gw->process($message);
$paymentResponse = $message->parseResponse($response);
if (
!empty($paymentResponse->error) &&
$paymentResponse->error->code === ErrorCode::EEC_ACQUIRER_SOFT_DECLINE &&
!empty($paymentResponse->gw->redirectUrl)
) {
header("Location: {$paymentResponse->gw->redirectUrl}");
}

Using alternative payment methods

To use an alternative payment method (like Google Pay), send a received token AS-IS or data from a decrypted token.

<?phpuseTransactPro\Gateway\DataSets\Command;
// set a corresponding flag that indicates a token provider$operation->command()->setPaymentMethodType(Command::PAYMENT_METHOD_TYPE_GOOGLE_PAY);
// option 1: send received token AS-IS$operation->paymentMethod()->setToken('<token>');
// option 2: send data from decrypted token$operation->paymentMethod()
->setPAN('<card number>')
->setExpire('<card expiry>')
->setCardHolderName('<cardholder name>') // if available
->setExternalTokenCryptogram('<cryptogram from token>') // if available
->setExternalTokenECI('<ECI from token>') // if available
->setExternalTokenTransStatus('<transStatus from token>') // available for Click to Pay
->setExternalTokenDsTransId('<dsTransId from token>') // available for Click to Pay
->setExternalTokenAcsTransId('<acsTransId from token>') // available for Click to Pay
->setExternalTokenCardHolderAuthenticated($decryptedToken['paymentMethodDetails']['assuranceDetails']['cardHolderAuthenticated']); // for Google Pay

Callback validation

<?phpuseTransactPro\Gateway\Responses\GatewayResponse;
useTransactPro\Gateway\Responses\CallbackResult;
useTransactPro\Gateway\Http\Crypto\ResponseDigest;
// verify data digest$responseDigest = newResponseDigest($_POST['sign'] ?? '');
$responseDigest->setOriginalUri($paymentResponse->getDigest()->getUri()); // optional, set if available$responseDigest->setOriginalCnonce($paymentResponse->getDigest()->getCnonce()); // optional, set if available$responseDigest->setBody($_POST['json'] ?? '');
$responseDigest->verify("3383e58e-9cde-4ffa-85cf-81cd25b2423e", "super-secret-key");
// parse callback data as a payment response$callbackResponse = GatewayResponse::createFromJSON($_POST['json'] ?? '', CallbackResult::class);
echo$callbackResponse->gw->statusText;

Transactions report loading

<?phpuseTransactPro\Gateway\Interfaces\ResponseInterface;
// NB. Merchant GUID/secret must be used instead of account GUID/secret!$gw->auth()
->setMerchantGUID('8D80-921D-BB99-45ED')
->setSecretKey('super-secret-key');
$message = $gw->createReport();
$message->filterData()
->setDtCreatedFrom(time() - 86400)
->setDtFinishedTo(time());
$request = $message->build();
$response = $gw->process($request);
// get raw body$reportCSV = $response->getBody();
// get parsed body as iterator where each row is an associative array// with keys from the first line and values are from all other lines$csvResponse = $message->parseResponse($response);
print_r($csvResponse->getHeaders());
foreach ($csvResponseas$key => $value) {
print_r($value);
}

Customization

If you need to access different API URL you can set through Gateway constructor as follows:

<?phpuseTransactPro\Gateway\Gateway;
$gw = newGateway('https://customurl.com');

Also, you can customize client for your needs. By default Http\Client\Client class is used. It use cURL under the hood. It implements HttpClientInterface. You can create your own (or configure default) and set it to the gateway.

<?phpuseTransactPro\Gateway\Gateway;
$httpClient = newMyClient(); // implements HttpClientInterface$gw = newGateway('<API BASE URL>/v3.0');
$gw->setHttpClient($httpClient);
// use it!// ...

If you need to load an HTML form from Gateway instead of cardholder browser redirect, a special operation type may be used:

// execute a payment$paymentResponse = $operation->parseResponse($response);
$retrieveFormOperation = $gw->createRetrieveForm($paymentResponse);
$retrieveFormRequest = $retrieveFormOperation->build();
$htmlResponse = $gw->process($retrieveFormRequest);
$rawHtml = $htmlResponse->getBody();

Exceptions

Main exception, that can be thrown by the library is the GatewayException. Following exceptions are children of GatewayException:

  • RequestException - will be thrown if request fail.
  • ValidatorException - will be thrown if some data for the request is missing.
  • ResponseException - will be thrown if response parsing/validation fail (corrupted response).
  • DigestMissingException - will be thrown if response missing Authorization header (corrupted response).
  • DigestMismatchException - will be thrown if response digest validation fail (corrupted response).

Useful constants

\TransactPro\Gateway\Responses\Constants\ErrorCode - error codes \TransactPro\Gateway\Responses\Constants\Status - transaction statuses \TransactPro\Gateway\Responses\Constants\CardFamily - card families

About

Requirements

  • This library works with PHP 7.0 or above.

Submit bugs and feature requests

Bugs and feature request are tracked on GitHub

License

This library is licensed under the MIT License - see the LICENSE file for details.

About

This library provide ability to make requests to Transact Pro Gateway API v3.

Resources

Stars

3 stars

Watchers

7 watching

Forks

Releases

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

Transact Pro Gateway v3 PHP client library

This library provide ability to make requests to Transact Pro Gateway API v3.

Installation

Install the latest version with

$ composer require transact-pro/gw3-client

Basic usage

Inside form

Hold card input form on gateway side, client must be redirect to gateway.

<?phpuseTransactPro\Gateway\Gateway;
useTransactPro\Gateway\Responses\Constants\Status;
$gw = newGateway('<API BASE URL>/v3.0');
// Setup gateway authorization credentials$gw->auth()
->setAccountGUID("3383e58e-9cde-4ffa-85cf-81cd25b2423e")
->setSecretKey('super-secret-key');
// Create transaction object$sms = $gw->createSms();
// Set required fields$sms->money()
->setAmount(100)
->setCurrency('USD');
$sms->customer()
->setEmail("email@domain.com")
->setPhone("2445224657");
$sms->order()
->setMerchantTransactionID('A-345S')
->setDescription('Order #A-345S payment');
// Process payment via gateway inside form$sms->insideForm();
// Build transaction object to request$smsRequest = $sms->build();
// Process transaction to gateway$response = $gw->process($smsRequest);
// Parse Gateway response as a payment response$paymentResponse = $sms->parseResponse($response);
if (!empty($paymentResponse->error)) {
thrownew \RuntimeException("GW error: {$paymentResponse->error->message}");
}
// Redirect user to received URLif ($paymentResponse->gw->statusCode === Status::CARD_FORM_URL_SENT) {
header("Location: {$paymentResponse->gw->redirectUrl}");
}

Server to server

Hold card input form on merchant side and process via API.

<?phpuseTransactPro\Gateway\Gateway;
useTransactPro\Gateway\Responses\Constants\Status;
$gw = newGateway('<API BASE URL>/v3.0');
// Setup gatewayl authorization credentials$gw->auth()
->setAccountGUID("3383e58e-9cde-4ffa-85cf-81cd25b2423e")
->setSecretKey('super-secret-key');
// Create transaction object$sms = $gw->createSms();
// Set required fields$sms->paymentMethod()
->setPAN('4295550031781065')
->setExpire('06/18')
->setCVV('683')
->setCardHolderName('John Doe');
$sms->money()
->setAmount(100)
->setCurrency('USD');
// Build transaction object to request$smsRequest = $sms->build();
// Process transaction to gateway$response = $gw->process($smsRequest);
// Parse Gateway response as a payment response$paymentResponse = $sms->parseResponse($response);
echo$paymentResponse->gw->statusCode === Status::SUCCESS ? "SUCCESS" : "FAILED";

Documentation

This README provide introduction to the library usage.

Operations

Operations are available via $gw->create<operation name>() method.

Available operations:

  • Transactions
    • CANCEL
    • DMS CHARGE
    • DMS HOLD
    • MOTO DMS
    • MOTO SMS
    • INIT RECURRENT DMS
    • RECURRENT DMS
    • INIT RECURRENT SMS
    • RECURRENT SMS
    • REFUND
    • REVERSAL
    • SMS
    • Credit
    • P2P
    • B2P
  • Information
    • HISTORY
    • RECURRENTS
    • REFUNDS
    • RESULT
    • STATUS
    • LIMITS
  • Verification
    • 3-D Secure enrollment
    • Complete card verification
  • Tokenization
    • Create payment data token
  • Callback processing
    • verify callback data sign
  • Reporting
    • Get transactions report in CSV format

Pattern to work with the library can be described as follows:

<?phpuseTransactPro\Gateway\Gateway;
$gw = newGateway('<API BASE URL>/v3.0');
// first, you need to setup authorization.// you can change authorization data in runtime.// Thus, following operations will work under// new authorization.$gw->auth()
->setAccountGUID("3383e58e-9cde-4ffa-85cf-81cd25b2423e")
->setSecretKey('super-secret-key');
$operation = $gw->createOPERATION();
// here you setup your request through public methods// that expose you blocks of information, that you can fill for the// operation of your choice.// build() will prepare `Request` object that `$gw` will use// for the request.$operationRequest = $operation->build();
// process() will perform provided request to the gateway// `$response` will have response data (headers, body).$response = $gw->process($operationRequest);
// parse received raw response to an appropriate class$parsedResponse = $operation->parseResponse($response);

Card verification

<?phpuseTransactPro\Gateway\DataSets\Command;
// create a payment to init card verification process$message->command()->setCardVerificationMode(Command::CARD_VERIFICATION_MODE_INIT);
// complete card verification$operation = $gw->createCardVerification();
$operation->data()->setGatewayTransactionID($initialResponseGatewayTransactionId);
$operationRequest = $operation->build();
$response = $gw->process($request);
echo$response->getStatusCode() === 200 ? 'SUCCESS' : 'FAILURE';
// send a payment with flag to accept only verified cards$message->command()->setCardVerificationMode(Command::CARD_VERIFICATION_MODE_VERIFY);

Payment data tokenization

<?phpuseTransactPro\Gateway\DataSets\Command;
// option 1: create a payment with flag to save payment data$message->command()->setPaymentMethodDataSource(Command::DATA_SOURCE_SAVE_TO_GATEWAY);
// option 2: send "create token" request with payment data$operation = $gw->createToken();
$operation->paymentMethod()
->setPAN('<card number>')
->setExpire('<card expiry>')
->setCardHolderName('<cardholder name>');
$operation->money()
->setCurrency('<desired currency>');
$operationRequest = $operation->build();
$response = $gw->process($request);
// send a payment in "token usage" mode with flag to load payment data by token$message->useToken();
$message->command()
->setPaymentMethodDataSource(Command::DATA_SOURCE_USE_GATEWAY_SAVED_CARDHOLDER_INITIATED)
->setPaymentMethodDataToken('<initial gateway-transaction-id>');
$response = $gw->process($message);
$paymentResponse = $message->parseResponse($response);
if (
!empty($paymentResponse->error) &&
$paymentResponse->error->code === ErrorCode::EEC_ACQUIRER_SOFT_DECLINE &&
!empty($paymentResponse->gw->redirectUrl)
) {
header("Location: {$paymentResponse->gw->redirectUrl}");
}

Using alternative payment methods

To use an alternative payment method (like Google Pay), send a received token AS-IS or data from a decrypted token.

<?phpuseTransactPro\Gateway\DataSets\Command;
// set a corresponding flag that indicates a token provider$operation->command()->setPaymentMethodType(Command::PAYMENT_METHOD_TYPE_GOOGLE_PAY);
// option 1: send received token AS-IS$operation->paymentMethod()->setToken('<token>');
// option 2: send data from decrypted token$operation->paymentMethod()
->setPAN('<card number>')
->setExpire('<card expiry>')
->setCardHolderName('<cardholder name>') // if available
->setExternalTokenCryptogram('<cryptogram from token>') // if available
->setExternalTokenECI('<ECI from token>') // if available
->setExternalTokenTransStatus('<transStatus from token>') // available for Click to Pay
->setExternalTokenDsTransId('<dsTransId from token>') // available for Click to Pay
->setExternalTokenAcsTransId('<acsTransId from token>') // available for Click to Pay
->setExternalTokenCardHolderAuthenticated($decryptedToken['paymentMethodDetails']['assuranceDetails']['cardHolderAuthenticated']); // for Google Pay

Callback validation

<?phpuseTransactPro\Gateway\Responses\GatewayResponse;
useTransactPro\Gateway\Responses\CallbackResult;
useTransactPro\Gateway\Http\Crypto\ResponseDigest;
// verify data digest$responseDigest = newResponseDigest($_POST['sign'] ?? '');
$responseDigest->setOriginalUri($paymentResponse->getDigest()->getUri()); // optional, set if available$responseDigest->setOriginalCnonce($paymentResponse->getDigest()->getCnonce()); // optional, set if available$responseDigest->setBody($_POST['json'] ?? '');
$responseDigest->verify("3383e58e-9cde-4ffa-85cf-81cd25b2423e", "super-secret-key");
// parse callback data as a payment response$callbackResponse = GatewayResponse::createFromJSON($_POST['json'] ?? '', CallbackResult::class);
echo$callbackResponse->gw->statusText;

Transactions report loading

<?phpuseTransactPro\Gateway\Interfaces\ResponseInterface;
// NB. Merchant GUID/secret must be used instead of account GUID/secret!$gw->auth()
->setMerchantGUID('8D80-921D-BB99-45ED')
->setSecretKey('super-secret-key');
$message = $gw->createReport();
$message->filterData()
->setDtCreatedFrom(time() - 86400)
->setDtFinishedTo(time());
$request = $message->build();
$response = $gw->process($request);
// get raw body$reportCSV = $response->getBody();
// get parsed body as iterator where each row is an associative array// with keys from the first line and values are from all other lines$csvResponse = $message->parseResponse($response);
print_r($csvResponse->getHeaders());
foreach ($csvResponseas$key => $value) {
print_r($value);
}

Customization

If you need to access different API URL you can set through Gateway constructor as follows:

<?phpuseTransactPro\Gateway\Gateway;
$gw = newGateway('https://customurl.com');

Also, you can customize client for your needs. By default Http\Client\Client class is used. It use cURL under the hood. It implements HttpClientInterface. You can create your own (or configure default) and set it to the gateway.

<?phpuseTransactPro\Gateway\Gateway;
$httpClient = newMyClient(); // implements HttpClientInterface$gw = newGateway('<API BASE URL>/v3.0');
$gw->setHttpClient($httpClient);
// use it!// ...

If you need to load an HTML form from Gateway instead of cardholder browser redirect, a special operation type may be used:

// execute a payment$paymentResponse = $operation->parseResponse($response);
$retrieveFormOperation = $gw->createRetrieveForm($paymentResponse);
$retrieveFormRequest = $retrieveFormOperation->build();
$htmlResponse = $gw->process($retrieveFormRequest);
$rawHtml = $htmlResponse->getBody();

Exceptions

Main exception, that can be thrown by the library is the GatewayException. Following exceptions are children of GatewayException:

  • RequestException - will be thrown if request fail.
  • ValidatorException - will be thrown if some data for the request is missing.
  • ResponseException - will be thrown if response parsing/validation fail (corrupted response).
  • DigestMissingException - will be thrown if response missing Authorization header (corrupted response).
  • DigestMismatchException - will be thrown if response digest validation fail (corrupted response).

Useful constants

\TransactPro\Gateway\Responses\Constants\ErrorCode - error codes \TransactPro\Gateway\Responses\Constants\Status - transaction statuses \TransactPro\Gateway\Responses\Constants\CardFamily - card families

About

Requirements

  • This library works with PHP 7.0 or above.

Submit bugs and feature requests

Bugs and feature request are tracked on GitHub

License

This library is licensed under the MIT License - see the LICENSE file for details.

About

This library provide ability to make requests to Transact Pro Gateway API v3.

Resources

Stars

3 stars

Watchers

7 watching

Forks

Releases

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Transact Pro Gateway v3 PHP client library

This library provide ability to make requests to Transact Pro Gateway API v3.

Installation

Install the latest version with

$ composer require transact-pro/gw3-client

Basic usage

Inside form

Hold card input form on gateway side, client must be redirect to gateway.

<?phpuseTransactPro\Gateway\Gateway;
useTransactPro\Gateway\Responses\Constants\Status;
$gw = newGateway('<API BASE URL>/v3.0');
// Setup gateway authorization credentials$gw->auth()
->setAccountGUID("3383e58e-9cde-4ffa-85cf-81cd25b2423e")
->setSecretKey('super-secret-key');
// Create transaction object$sms = $gw->createSms();
// Set required fields$sms->money()
->setAmount(100)
->setCurrency('USD');
$sms->customer()
->setEmail("email@domain.com")
->setPhone("2445224657");
$sms->order()
->setMerchantTransactionID('A-345S')
->setDescription('Order #A-345S payment');
// Process payment via gateway inside form$sms->insideForm();
// Build transaction object to request$smsRequest = $sms->build();
// Process transaction to gateway$response = $gw->process($smsRequest);
// Parse Gateway response as a payment response$paymentResponse = $sms->parseResponse($response);
if (!empty($paymentResponse->error)) {
thrownew \RuntimeException("GW error: {$paymentResponse->error->message}");
}
// Redirect user to received URLif ($paymentResponse->gw->statusCode === Status::CARD_FORM_URL_SENT) {
header("Location: {$paymentResponse->gw->redirectUrl}");
}

Server to server

Hold card input form on merchant side and process via API.

<?phpuseTransactPro\Gateway\Gateway;
useTransactPro\Gateway\Responses\Constants\Status;
$gw = newGateway('<API BASE URL>/v3.0');
// Setup gatewayl authorization credentials$gw->auth()
->setAccountGUID("3383e58e-9cde-4ffa-85cf-81cd25b2423e")
->setSecretKey('super-secret-key');
// Create transaction object$sms = $gw->createSms();
// Set required fields$sms->paymentMethod()
->setPAN('4295550031781065')
->setExpire('06/18')
->setCVV('683')
->setCardHolderName('John Doe');
$sms->money()
->setAmount(100)
->setCurrency('USD');
// Build transaction object to request$smsRequest = $sms->build();
// Process transaction to gateway$response = $gw->process($smsRequest);
// Parse Gateway response as a payment response$paymentResponse = $sms->parseResponse($response);
echo$paymentResponse->gw->statusCode === Status::SUCCESS ? "SUCCESS" : "FAILED";

Documentation

This README provide introduction to the library usage.

Operations

Operations are available via $gw->create<operation name>() method.

Available operations:

  • Transactions
    • CANCEL
    • DMS CHARGE
    • DMS HOLD
    • MOTO DMS
    • MOTO SMS
    • INIT RECURRENT DMS
    • RECURRENT DMS
    • INIT RECURRENT SMS
    • RECURRENT SMS
    • REFUND
    • REVERSAL
    • SMS
    • Credit
    • P2P
    • B2P
  • Information
    • HISTORY
    • RECURRENTS
    • REFUNDS
    • RESULT
    • STATUS
    • LIMITS
  • Verification
    • 3-D Secure enrollment
    • Complete card verification
  • Tokenization
    • Create payment data token
  • Callback processing
    • verify callback data sign
  • Reporting
    • Get transactions report in CSV format

Pattern to work with the library can be described as follows:

<?phpuseTransactPro\Gateway\Gateway;
$gw = newGateway('<API BASE URL>/v3.0');
// first, you need to setup authorization.// you can change authorization data in runtime.// Thus, following operations will work under// new authorization.$gw->auth()
->setAccountGUID("3383e58e-9cde-4ffa-85cf-81cd25b2423e")
->setSecretKey('super-secret-key');
$operation = $gw->createOPERATION();
// here you setup your request through public methods// that expose you blocks of information, that you can fill for the// operation of your choice.// build() will prepare `Request` object that `$gw` will use// for the request.$operationRequest = $operation->build();
// process() will perform provided request to the gateway// `$response` will have response data (headers, body).$response = $gw->process($operationRequest);
// parse received raw response to an appropriate class$parsedResponse = $operation->parseResponse($response);

Card verification

<?phpuseTransactPro\Gateway\DataSets\Command;
// create a payment to init card verification process$message->command()->setCardVerificationMode(Command::CARD_VERIFICATION_MODE_INIT);
// complete card verification$operation = $gw->createCardVerification();
$operation->data()->setGatewayTransactionID($initialResponseGatewayTransactionId);
$operationRequest = $operation->build();
$response = $gw->process($request);
echo$response->getStatusCode() === 200 ? 'SUCCESS' : 'FAILURE';
// send a payment with flag to accept only verified cards$message->command()->setCardVerificationMode(Command::CARD_VERIFICATION_MODE_VERIFY);

Payment data tokenization

<?phpuseTransactPro\Gateway\DataSets\Command;
// option 1: create a payment with flag to save payment data$message->command()->setPaymentMethodDataSource(Command::DATA_SOURCE_SAVE_TO_GATEWAY);
// option 2: send "create token" request with payment data$operation = $gw->createToken();
$operation->paymentMethod()
->setPAN('<card number>')
->setExpire('<card expiry>')
->setCardHolderName('<cardholder name>');
$operation->money()
->setCurrency('<desired currency>');
$operationRequest = $operation->build();
$response = $gw->process($request);
// send a payment in "token usage" mode with flag to load payment data by token$message->useToken();
$message->command()
->setPaymentMethodDataSource(Command::DATA_SOURCE_USE_GATEWAY_SAVED_CARDHOLDER_INITIATED)
->setPaymentMethodDataToken('<initial gateway-transaction-id>');
$response = $gw->process($message);
$paymentResponse = $message->parseResponse($response);
if (
!empty($paymentResponse->error) &&
$paymentResponse->error->code === ErrorCode::EEC_ACQUIRER_SOFT_DECLINE &&
!empty($paymentResponse->gw->redirectUrl)
) {
header("Location: {$paymentResponse->gw->redirectUrl}");
}

Using alternative payment methods

To use an alternative payment method (like Google Pay), send a received token AS-IS or data from a decrypted token.

<?phpuseTransactPro\Gateway\DataSets\Command;
// set a corresponding flag that indicates a token provider$operation->command()->setPaymentMethodType(Command::PAYMENT_METHOD_TYPE_GOOGLE_PAY);
// option 1: send received token AS-IS$operation->paymentMethod()->setToken('<token>');
// option 2: send data from decrypted token$operation->paymentMethod()
->setPAN('<card number>')
->setExpire('<card expiry>')
->setCardHolderName('<cardholder name>') // if available
->setExternalTokenCryptogram('<cryptogram from token>') // if available
->setExternalTokenECI('<ECI from token>') // if available
->setExternalTokenTransStatus('<transStatus from token>') // available for Click to Pay
->setExternalTokenDsTransId('<dsTransId from token>') // available for Click to Pay
->setExternalTokenAcsTransId('<acsTransId from token>') // available for Click to Pay
->setExternalTokenCardHolderAuthenticated($decryptedToken['paymentMethodDetails']['assuranceDetails']['cardHolderAuthenticated']); // for Google Pay

Callback validation

<?phpuseTransactPro\Gateway\Responses\GatewayResponse;
useTransactPro\Gateway\Responses\CallbackResult;
useTransactPro\Gateway\Http\Crypto\ResponseDigest;
// verify data digest$responseDigest = newResponseDigest($_POST['sign'] ?? '');
$responseDigest->setOriginalUri($paymentResponse->getDigest()->getUri()); // optional, set if available$responseDigest->setOriginalCnonce($paymentResponse->getDigest()->getCnonce()); // optional, set if available$responseDigest->setBody($_POST['json'] ?? '');
$responseDigest->verify("3383e58e-9cde-4ffa-85cf-81cd25b2423e", "super-secret-key");
// parse callback data as a payment response$callbackResponse = GatewayResponse::createFromJSON($_POST['json'] ?? '', CallbackResult::class);
echo$callbackResponse->gw->statusText;

Transactions report loading

<?phpuseTransactPro\Gateway\Interfaces\ResponseInterface;
// NB. Merchant GUID/secret must be used instead of account GUID/secret!$gw->auth()
->setMerchantGUID('8D80-921D-BB99-45ED')
->setSecretKey('super-secret-key');
$message = $gw->createReport();
$message->filterData()
->setDtCreatedFrom(time() - 86400)
->setDtFinishedTo(time());
$request = $message->build();
$response = $gw->process($request);
// get raw body$reportCSV = $response->getBody();
// get parsed body as iterator where each row is an associative array// with keys from the first line and values are from all other lines$csvResponse = $message->parseResponse($response);
print_r($csvResponse->getHeaders());
foreach ($csvResponseas$key => $value) {
print_r($value);
}

Customization

If you need to access different API URL you can set through Gateway constructor as follows:

<?phpuseTransactPro\Gateway\Gateway;
$gw = newGateway('https://customurl.com');

Also, you can customize client for your needs. By default Http\Client\Client class is used. It use cURL under the hood. It implements HttpClientInterface. You can create your own (or configure default) and set it to the gateway.

<?phpuseTransactPro\Gateway\Gateway;
$httpClient = newMyClient(); // implements HttpClientInterface$gw = newGateway('<API BASE URL>/v3.0');
$gw->setHttpClient($httpClient);
// use it!// ...

If you need to load an HTML form from Gateway instead of cardholder browser redirect, a special operation type may be used:

// execute a payment$paymentResponse = $operation->parseResponse($response);
$retrieveFormOperation = $gw->createRetrieveForm($paymentResponse);
$retrieveFormRequest = $retrieveFormOperation->build();
$htmlResponse = $gw->process($retrieveFormRequest);
$rawHtml = $htmlResponse->getBody();

Exceptions

Main exception, that can be thrown by the library is the GatewayException. Following exceptions are children of GatewayException:

  • RequestException - will be thrown if request fail.
  • ValidatorException - will be thrown if some data for the request is missing.
  • ResponseException - will be thrown if response parsing/validation fail (corrupted response).
  • DigestMissingException - will be thrown if response missing Authorization header (corrupted response).
  • DigestMismatchException - will be thrown if response digest validation fail (corrupted response).

Useful constants

\TransactPro\Gateway\Responses\Constants\ErrorCode - error codes \TransactPro\Gateway\Responses\Constants\Status - transaction statuses \TransactPro\Gateway\Responses\Constants\CardFamily - card families

About

Requirements

  • This library works with PHP 7.0 or above.

Submit bugs and feature requests

Bugs and feature request are tracked on GitHub

License

This library is licensed under the MIT License - see the LICENSE file for details.

About

This library provide ability to make requests to Transact Pro Gateway API v3.

Resources

Stars

3 stars

Watchers

7 watching

Forks

Releases

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Transact Pro Gateway v3 PHP client library

This library provide ability to make requests to Transact Pro Gateway API v3.

Installation

Install the latest version with

$ composer require transact-pro/gw3-client

Basic usage

Inside form

Hold card input form on gateway side, client must be redirect to gateway.

<?phpuseTransactPro\Gateway\Gateway;
useTransactPro\Gateway\Responses\Constants\Status;
$gw = newGateway('<API BASE URL>/v3.0');
// Setup gateway authorization credentials$gw->auth()
->setAccountGUID("3383e58e-9cde-4ffa-85cf-81cd25b2423e")
->setSecretKey('super-secret-key');
// Create transaction object$sms = $gw->createSms();
// Set required fields$sms->money()
->setAmount(100)
->setCurrency('USD');
$sms->customer()
->setEmail("email@domain.com")
->setPhone("2445224657");
$sms->order()
->setMerchantTransactionID('A-345S')
->setDescription('Order #A-345S payment');
// Process payment via gateway inside form$sms->insideForm();
// Build transaction object to request$smsRequest = $sms->build();
// Process transaction to gateway$response = $gw->process($smsRequest);
// Parse Gateway response as a payment response$paymentResponse = $sms->parseResponse($response);
if (!empty($paymentResponse->error)) {
thrownew \RuntimeException("GW error: {$paymentResponse->error->message}");
}
// Redirect user to received URLif ($paymentResponse->gw->statusCode === Status::CARD_FORM_URL_SENT) {
header("Location: {$paymentResponse->gw->redirectUrl}");
}

Server to server

Hold card input form on merchant side and process via API.

<?phpuseTransactPro\Gateway\Gateway;
useTransactPro\Gateway\Responses\Constants\Status;
$gw = newGateway('<API BASE URL>/v3.0');
// Setup gatewayl authorization credentials$gw->auth()
->setAccountGUID("3383e58e-9cde-4ffa-85cf-81cd25b2423e")
->setSecretKey('super-secret-key');
// Create transaction object$sms = $gw->createSms();
// Set required fields$sms->paymentMethod()
->setPAN('4295550031781065')
->setExpire('06/18')
->setCVV('683')
->setCardHolderName('John Doe');
$sms->money()
->setAmount(100)
->setCurrency('USD');
// Build transaction object to request$smsRequest = $sms->build();
// Process transaction to gateway$response = $gw->process($smsRequest);
// Parse Gateway response as a payment response$paymentResponse = $sms->parseResponse($response);
echo$paymentResponse->gw->statusCode === Status::SUCCESS ? "SUCCESS" : "FAILED";

Documentation

This README provide introduction to the library usage.

Operations

Operations are available via $gw->create<operation name>() method.

Available operations:

  • Transactions
    • CANCEL
    • DMS CHARGE
    • DMS HOLD
    • MOTO DMS
    • MOTO SMS
    • INIT RECURRENT DMS
    • RECURRENT DMS
    • INIT RECURRENT SMS
    • RECURRENT SMS
    • REFUND
    • REVERSAL
    • SMS
    • Credit
    • P2P
    • B2P
  • Information
    • HISTORY
    • RECURRENTS
    • REFUNDS
    • RESULT
    • STATUS
    • LIMITS
  • Verification
    • 3-D Secure enrollment
    • Complete card verification
  • Tokenization
    • Create payment data token
  • Callback processing
    • verify callback data sign
  • Reporting
    • Get transactions report in CSV format

Pattern to work with the library can be described as follows:

<?phpuseTransactPro\Gateway\Gateway;
$gw = newGateway('<API BASE URL>/v3.0');
// first, you need to setup authorization.// you can change authorization data in runtime.// Thus, following operations will work under// new authorization.$gw->auth()
->setAccountGUID("3383e58e-9cde-4ffa-85cf-81cd25b2423e")
->setSecretKey('super-secret-key');
$operation = $gw->createOPERATION();
// here you setup your request through public methods// that expose you blocks of information, that you can fill for the// operation of your choice.// build() will prepare `Request` object that `$gw` will use// for the request.$operationRequest = $operation->build();
// process() will perform provided request to the gateway// `$response` will have response data (headers, body).$response = $gw->process($operationRequest);
// parse received raw response to an appropriate class$parsedResponse = $operation->parseResponse($response);

Card verification

<?phpuseTransactPro\Gateway\DataSets\Command;
// create a payment to init card verification process$message->command()->setCardVerificationMode(Command::CARD_VERIFICATION_MODE_INIT);
// complete card verification$operation = $gw->createCardVerification();
$operation->data()->setGatewayTransactionID($initialResponseGatewayTransactionId);
$operationRequest = $operation->build();
$response = $gw->process($request);
echo$response->getStatusCode() === 200 ? 'SUCCESS' : 'FAILURE';
// send a payment with flag to accept only verified cards$message->command()->setCardVerificationMode(Command::CARD_VERIFICATION_MODE_VERIFY);

Payment data tokenization

<?phpuseTransactPro\Gateway\DataSets\Command;
// option 1: create a payment with flag to save payment data$message->command()->setPaymentMethodDataSource(Command::DATA_SOURCE_SAVE_TO_GATEWAY);
// option 2: send "create token" request with payment data$operation = $gw->createToken();
$operation->paymentMethod()
->setPAN('<card number>')
->setExpire('<card expiry>')
->setCardHolderName('<cardholder name>');
$operation->money()
->setCurrency('<desired currency>');
$operationRequest = $operation->build();
$response = $gw->process($request);
// send a payment in "token usage" mode with flag to load payment data by token$message->useToken();
$message->command()
->setPaymentMethodDataSource(Command::DATA_SOURCE_USE_GATEWAY_SAVED_CARDHOLDER_INITIATED)
->setPaymentMethodDataToken('<initial gateway-transaction-id>');
$response = $gw->process($message);
$paymentResponse = $message->parseResponse($response);
if (
!empty($paymentResponse->error) &&
$paymentResponse->error->code === ErrorCode::EEC_ACQUIRER_SOFT_DECLINE &&
!empty($paymentResponse->gw->redirectUrl)
) {
header("Location: {$paymentResponse->gw->redirectUrl}");
}

Using alternative payment methods

To use an alternative payment method (like Google Pay), send a received token AS-IS or data from a decrypted token.

<?phpuseTransactPro\Gateway\DataSets\Command;
// set a corresponding flag that indicates a token provider$operation->command()->setPaymentMethodType(Command::PAYMENT_METHOD_TYPE_GOOGLE_PAY);
// option 1: send received token AS-IS$operation->paymentMethod()->setToken('<token>');
// option 2: send data from decrypted token$operation->paymentMethod()
->setPAN('<card number>')
->setExpire('<card expiry>')
->setCardHolderName('<cardholder name>') // if available
->setExternalTokenCryptogram('<cryptogram from token>') // if available
->setExternalTokenECI('<ECI from token>') // if available
->setExternalTokenTransStatus('<transStatus from token>') // available for Click to Pay
->setExternalTokenDsTransId('<dsTransId from token>') // available for Click to Pay
->setExternalTokenAcsTransId('<acsTransId from token>') // available for Click to Pay
->setExternalTokenCardHolderAuthenticated($decryptedToken['paymentMethodDetails']['assuranceDetails']['cardHolderAuthenticated']); // for Google Pay

Callback validation

<?phpuseTransactPro\Gateway\Responses\GatewayResponse;
useTransactPro\Gateway\Responses\CallbackResult;
useTransactPro\Gateway\Http\Crypto\ResponseDigest;
// verify data digest$responseDigest = newResponseDigest($_POST['sign'] ?? '');
$responseDigest->setOriginalUri($paymentResponse->getDigest()->getUri()); // optional, set if available$responseDigest->setOriginalCnonce($paymentResponse->getDigest()->getCnonce()); // optional, set if available$responseDigest->setBody($_POST['json'] ?? '');
$responseDigest->verify("3383e58e-9cde-4ffa-85cf-81cd25b2423e", "super-secret-key");
// parse callback data as a payment response$callbackResponse = GatewayResponse::createFromJSON($_POST['json'] ?? '', CallbackResult::class);
echo$callbackResponse->gw->statusText;

Transactions report loading

<?phpuseTransactPro\Gateway\Interfaces\ResponseInterface;
// NB. Merchant GUID/secret must be used instead of account GUID/secret!$gw->auth()
->setMerchantGUID('8D80-921D-BB99-45ED')
->setSecretKey('super-secret-key');
$message = $gw->createReport();
$message->filterData()
->setDtCreatedFrom(time() - 86400)
->setDtFinishedTo(time());
$request = $message->build();
$response = $gw->process($request);
// get raw body$reportCSV = $response->getBody();
// get parsed body as iterator where each row is an associative array// with keys from the first line and values are from all other lines$csvResponse = $message->parseResponse($response);
print_r($csvResponse->getHeaders());
foreach ($csvResponseas$key => $value) {
print_r($value);
}

Customization

If you need to access different API URL you can set through Gateway constructor as follows:

<?phpuseTransactPro\Gateway\Gateway;
$gw = newGateway('https://customurl.com');

Also, you can customize client for your needs. By default Http\Client\Client class is used. It use cURL under the hood. It implements HttpClientInterface. You can create your own (or configure default) and set it to the gateway.

<?phpuseTransactPro\Gateway\Gateway;
$httpClient = newMyClient(); // implements HttpClientInterface$gw = newGateway('<API BASE URL>/v3.0');
$gw->setHttpClient($httpClient);
// use it!// ...

If you need to load an HTML form from Gateway instead of cardholder browser redirect, a special operation type may be used:

// execute a payment$paymentResponse = $operation->parseResponse($response);
$retrieveFormOperation = $gw->createRetrieveForm($paymentResponse);
$retrieveFormRequest = $retrieveFormOperation->build();
$htmlResponse = $gw->process($retrieveFormRequest);
$rawHtml = $htmlResponse->getBody();

Exceptions

Main exception, that can be thrown by the library is the GatewayException. Following exceptions are children of GatewayException:

  • RequestException - will be thrown if request fail.
  • ValidatorException - will be thrown if some data for the request is missing.
  • ResponseException - will be thrown if response parsing/validation fail (corrupted response).
  • DigestMissingException - will be thrown if response missing Authorization header (corrupted response).
  • DigestMismatchException - will be thrown if response digest validation fail (corrupted response).

Useful constants

\TransactPro\Gateway\Responses\Constants\ErrorCode - error codes \TransactPro\Gateway\Responses\Constants\Status - transaction statuses \TransactPro\Gateway\Responses\Constants\CardFamily - card families

About

Requirements

  • This library works with PHP 7.0 or above.

Submit bugs and feature requests

Bugs and feature request are tracked on GitHub

License

This library is licensed under the MIT License - see the LICENSE file for details.

About

This library provide ability to make requests to Transact Pro Gateway API v3.

Resources

Stars

3 stars

Watchers

7 watching

Forks

Releases

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

Transact Pro Gateway v3 PHP client library

This library provide ability to make requests to Transact Pro Gateway API v3.

Installation

Install the latest version with

$ composer require transact-pro/gw3-client

Basic usage

Inside form

Hold card input form on gateway side, client must be redirect to gateway.

<?phpuseTransactPro\Gateway\Gateway;
useTransactPro\Gateway\Responses\Constants\Status;
$gw = newGateway('<API BASE URL>/v3.0');
// Setup gateway authorization credentials$gw->auth()
->setAccountGUID("3383e58e-9cde-4ffa-85cf-81cd25b2423e")
->setSecretKey('super-secret-key');
// Create transaction object$sms = $gw->createSms();
// Set required fields$sms->money()
->setAmount(100)
->setCurrency('USD');
$sms->customer()
->setEmail("email@domain.com")
->setPhone("2445224657");
$sms->order()
->setMerchantTransactionID('A-345S')
->setDescription('Order #A-345S payment');
// Process payment via gateway inside form$sms->insideForm();
// Build transaction object to request$smsRequest = $sms->build();
// Process transaction to gateway$response = $gw->process($smsRequest);
// Parse Gateway response as a payment response$paymentResponse = $sms->parseResponse($response);
if (!empty($paymentResponse->error)) {
thrownew \RuntimeException("GW error: {$paymentResponse->error->message}");
}
// Redirect user to received URLif ($paymentResponse->gw->statusCode === Status::CARD_FORM_URL_SENT) {
header("Location: {$paymentResponse->gw->redirectUrl}");
}

Server to server

Hold card input form on merchant side and process via API.

<?phpuseTransactPro\Gateway\Gateway;
useTransactPro\Gateway\Responses\Constants\Status;
$gw = newGateway('<API BASE URL>/v3.0');
// Setup gatewayl authorization credentials$gw->auth()
->setAccountGUID("3383e58e-9cde-4ffa-85cf-81cd25b2423e")
->setSecretKey('super-secret-key');
// Create transaction object$sms = $gw->createSms();
// Set required fields$sms->paymentMethod()
->setPAN('4295550031781065')
->setExpire('06/18')
->setCVV('683')
->setCardHolderName('John Doe');
$sms->money()
->setAmount(100)
->setCurrency('USD');
// Build transaction object to request$smsRequest = $sms->build();
// Process transaction to gateway$response = $gw->process($smsRequest);
// Parse Gateway response as a payment response$paymentResponse = $sms->parseResponse($response);
echo$paymentResponse->gw->statusCode === Status::SUCCESS ? "SUCCESS" : "FAILED";

Documentation

This README provide introduction to the library usage.

Operations

Operations are available via $gw->create<operation name>() method.

Available operations:

  • Transactions
    • CANCEL
    • DMS CHARGE
    • DMS HOLD
    • MOTO DMS
    • MOTO SMS
    • INIT RECURRENT DMS
    • RECURRENT DMS
    • INIT RECURRENT SMS
    • RECURRENT SMS
    • REFUND
    • REVERSAL
    • SMS
    • Credit
    • P2P
    • B2P
  • Information
    • HISTORY
    • RECURRENTS
    • REFUNDS
    • RESULT
    • STATUS
    • LIMITS
  • Verification
    • 3-D Secure enrollment
    • Complete card verification
  • Tokenization
    • Create payment data token
  • Callback processing
    • verify callback data sign
  • Reporting
    • Get transactions report in CSV format

Pattern to work with the library can be described as follows:

<?phpuseTransactPro\Gateway\Gateway;
$gw = newGateway('<API BASE URL>/v3.0');
// first, you need to setup authorization.// you can change authorization data in runtime.// Thus, following operations will work under// new authorization.$gw->auth()
->setAccountGUID("3383e58e-9cde-4ffa-85cf-81cd25b2423e")
->setSecretKey('super-secret-key');
$operation = $gw->createOPERATION();
// here you setup your request through public methods// that expose you blocks of information, that you can fill for the// operation of your choice.// build() will prepare `Request` object that `$gw` will use// for the request.$operationRequest = $operation->build();
// process() will perform provided request to the gateway// `$response` will have response data (headers, body).$response = $gw->process($operationRequest);
// parse received raw response to an appropriate class$parsedResponse = $operation->parseResponse($response);

Card verification

<?phpuseTransactPro\Gateway\DataSets\Command;
// create a payment to init card verification process$message->command()->setCardVerificationMode(Command::CARD_VERIFICATION_MODE_INIT);
// complete card verification$operation = $gw->createCardVerification();
$operation->data()->setGatewayTransactionID($initialResponseGatewayTransactionId);
$operationRequest = $operation->build();
$response = $gw->process($request);
echo$response->getStatusCode() === 200 ? 'SUCCESS' : 'FAILURE';
// send a payment with flag to accept only verified cards$message->command()->setCardVerificationMode(Command::CARD_VERIFICATION_MODE_VERIFY);

Payment data tokenization

<?phpuseTransactPro\Gateway\DataSets\Command;
// option 1: create a payment with flag to save payment data$message->command()->setPaymentMethodDataSource(Command::DATA_SOURCE_SAVE_TO_GATEWAY);
// option 2: send "create token" request with payment data$operation = $gw->createToken();
$operation->paymentMethod()
->setPAN('<card number>')
->setExpire('<card expiry>')
->setCardHolderName('<cardholder name>');
$operation->money()
->setCurrency('<desired currency>');
$operationRequest = $operation->build();
$response = $gw->process($request);
// send a payment in "token usage" mode with flag to load payment data by token$message->useToken();
$message->command()
->setPaymentMethodDataSource(Command::DATA_SOURCE_USE_GATEWAY_SAVED_CARDHOLDER_INITIATED)
->setPaymentMethodDataToken('<initial gateway-transaction-id>');
$response = $gw->process($message);
$paymentResponse = $message->parseResponse($response);
if (
!empty($paymentResponse->error) &&
$paymentResponse->error->code === ErrorCode::EEC_ACQUIRER_SOFT_DECLINE &&
!empty($paymentResponse->gw->redirectUrl)
) {
header("Location: {$paymentResponse->gw->redirectUrl}");
}

Using alternative payment methods

To use an alternative payment method (like Google Pay), send a received token AS-IS or data from a decrypted token.

<?phpuseTransactPro\Gateway\DataSets\Command;
// set a corresponding flag that indicates a token provider$operation->command()->setPaymentMethodType(Command::PAYMENT_METHOD_TYPE_GOOGLE_PAY);
// option 1: send received token AS-IS$operation->paymentMethod()->setToken('<token>');
// option 2: send data from decrypted token$operation->paymentMethod()
->setPAN('<card number>')
->setExpire('<card expiry>')
->setCardHolderName('<cardholder name>') // if available
->setExternalTokenCryptogram('<cryptogram from token>') // if available
->setExternalTokenECI('<ECI from token>') // if available
->setExternalTokenTransStatus('<transStatus from token>') // available for Click to Pay
->setExternalTokenDsTransId('<dsTransId from token>') // available for Click to Pay
->setExternalTokenAcsTransId('<acsTransId from token>') // available for Click to Pay
->setExternalTokenCardHolderAuthenticated($decryptedToken['paymentMethodDetails']['assuranceDetails']['cardHolderAuthenticated']); // for Google Pay

Callback validation

<?phpuseTransactPro\Gateway\Responses\GatewayResponse;
useTransactPro\Gateway\Responses\CallbackResult;
useTransactPro\Gateway\Http\Crypto\ResponseDigest;
// verify data digest$responseDigest = newResponseDigest($_POST['sign'] ?? '');
$responseDigest->setOriginalUri($paymentResponse->getDigest()->getUri()); // optional, set if available$responseDigest->setOriginalCnonce($paymentResponse->getDigest()->getCnonce()); // optional, set if available$responseDigest->setBody($_POST['json'] ?? '');
$responseDigest->verify("3383e58e-9cde-4ffa-85cf-81cd25b2423e", "super-secret-key");
// parse callback data as a payment response$callbackResponse = GatewayResponse::createFromJSON($_POST['json'] ?? '', CallbackResult::class);
echo$callbackResponse->gw->statusText;

Transactions report loading

<?phpuseTransactPro\Gateway\Interfaces\ResponseInterface;
// NB. Merchant GUID/secret must be used instead of account GUID/secret!$gw->auth()
->setMerchantGUID('8D80-921D-BB99-45ED')
->setSecretKey('super-secret-key');
$message = $gw->createReport();
$message->filterData()
->setDtCreatedFrom(time() - 86400)
->setDtFinishedTo(time());
$request = $message->build();
$response = $gw->process($request);
// get raw body$reportCSV = $response->getBody();
// get parsed body as iterator where each row is an associative array// with keys from the first line and values are from all other lines$csvResponse = $message->parseResponse($response);
print_r($csvResponse->getHeaders());
foreach ($csvResponseas$key => $value) {
print_r($value);
}

Customization

If you need to access different API URL you can set through Gateway constructor as follows:

<?phpuseTransactPro\Gateway\Gateway;
$gw = newGateway('https://customurl.com');

Also, you can customize client for your needs. By default Http\Client\Client class is used. It use cURL under the hood. It implements HttpClientInterface. You can create your own (or configure default) and set it to the gateway.

<?phpuseTransactPro\Gateway\Gateway;
$httpClient = newMyClient(); // implements HttpClientInterface$gw = newGateway('<API BASE URL>/v3.0');
$gw->setHttpClient($httpClient);
// use it!// ...

If you need to load an HTML form from Gateway instead of cardholder browser redirect, a special operation type may be used:

// execute a payment$paymentResponse = $operation->parseResponse($response);
$retrieveFormOperation = $gw->createRetrieveForm($paymentResponse);
$retrieveFormRequest = $retrieveFormOperation->build();
$htmlResponse = $gw->process($retrieveFormRequest);
$rawHtml = $htmlResponse->getBody();

Exceptions

Main exception, that can be thrown by the library is the GatewayException. Following exceptions are children of GatewayException:

  • RequestException - will be thrown if request fail.
  • ValidatorException - will be thrown if some data for the request is missing.
  • ResponseException - will be thrown if response parsing/validation fail (corrupted response).
  • DigestMissingException - will be thrown if response missing Authorization header (corrupted response).
  • DigestMismatchException - will be thrown if response digest validation fail (corrupted response).

Useful constants

\TransactPro\Gateway\Responses\Constants\ErrorCode - error codes \TransactPro\Gateway\Responses\Constants\Status - transaction statuses \TransactPro\Gateway\Responses\Constants\CardFamily - card families

About

Requirements

  • This library works with PHP 7.0 or above.

Submit bugs and feature requests

Bugs and feature request are tracked on GitHub

License

This library is licensed under the MIT License - see the LICENSE file for details.

About

This library provide ability to make requests to Transact Pro Gateway API v3.

Resources

Stars

3 stars

Watchers

7 watching

Forks

Releases

Used by

Contributors

Languages