591 lines
20 KiB
PHP
591 lines
20 KiB
PHP
|
<?php
|
|||
|
/* vim: set expandtab tabstop=4 shiftwidth=4: */
|
|||
|
// +----------------------------------------------------------------------+
|
|||
|
// | PHP version 4 |
|
|||
|
// +----------------------------------------------------------------------+
|
|||
|
// | Copyright (c) 1997-2003 The PHP Group |
|
|||
|
// +----------------------------------------------------------------------+
|
|||
|
// | This source file is subject to version 3.0 of the PHP license, |
|
|||
|
// | that is bundled with this package in the file LICENSE, and is |
|
|||
|
// | available through the world-wide-web at |
|
|||
|
// | http://www.php.net/license/3_0.txt. |
|
|||
|
// | If you did not receive a copy of the PHP license and are unable to |
|
|||
|
// | obtain it through the world-wide-web, please send a note to |
|
|||
|
// | license@php.net so we can mail you a copy immediately. |
|
|||
|
// +----------------------------------------------------------------------+
|
|||
|
// | Authors: Ian Eure <ieure@php.net> |
|
|||
|
// +----------------------------------------------------------------------+
|
|||
|
//
|
|||
|
// $Id: Transfirst.php,v 1.3 2005/07/14 20:54:00 ieure Exp $
|
|||
|
|
|||
|
require_once('Payment/Process/Common.php');
|
|||
|
require_once('Net/Curl.php');
|
|||
|
|
|||
|
// Transfirst transaction types
|
|||
|
// Request authorization only - no funds are transferred.
|
|||
|
define('PAYMENT_PROCESS_ACTION_TRANSFIRST_AUTH', 30);
|
|||
|
// Transfer funds from a previous authorization.
|
|||
|
define('PAYMENT_PROCESS_ACTION_TRANSFIRST_SETTLE', 40);
|
|||
|
// Authorize & transfer funds
|
|||
|
define('PAYMENT_PROCESS_ACTION_TRANSFIRST_AUTHSETTLE', 32);
|
|||
|
// Debit the indicated amount to a previously-charged card.
|
|||
|
define('PAYMENT_PROCESS_ACTION_TRANSFIRST_CREDIT', 20);
|
|||
|
// Cancel authorization
|
|||
|
define('PAYMENT_PROCESS_ACTION_TRANSFIRST_VOID', 61);
|
|||
|
|
|||
|
define('PAYMENT_PROCESS_RESULT_TRANSFIRST_APPROVAL', 00);
|
|||
|
define('PAYMENT_PROCESS_RESULT_TRANSFIRST_DECLINE', 05);
|
|||
|
define('PAYMENT_PROCESS_RESULT_TRANSFIRST_INVALIDAMOUNT', 13);
|
|||
|
define('PAYMENT_PROCESS_RESULT_TRANSFIRST_INVALIDCARDNO', 14);
|
|||
|
define('PAYMENT_PROCESS_RESULT_TRANSFIRST_REENTER', 19);
|
|||
|
|
|||
|
// Map actions
|
|||
|
$GLOBALS['_Payment_Process_Transfirst'] = array(
|
|||
|
PAYMENT_PROCESS_ACTION_NORMAL => PAYMENT_PROCESS_ACTION_TRANSFIRST_AUTHSETTLE,
|
|||
|
PAYMENT_PROCESS_ACTION_AUTHONLY => PAYMENT_PROCESS_ACTION_TRANSFIRST_AUTH,
|
|||
|
PAYMENT_PROCESS_ACTION_POSTAUTH => PAYMENT_PROCESS_ACTION_TRANSFIRST_SETTLE
|
|||
|
);
|
|||
|
|
|||
|
/**
|
|||
|
* Payment_Process_Transfirst
|
|||
|
*
|
|||
|
* This is a processor for TransFirst's merchant payment gateway, formerly known
|
|||
|
* as DPILink. (http://www.transfirst.com/)
|
|||
|
*
|
|||
|
* *** WARNING ***
|
|||
|
* This is BETA code. While I have tested it and it appears to work for me, I
|
|||
|
* strongly recommend that you do additional testing before using it in
|
|||
|
* production systems.
|
|||
|
*
|
|||
|
* @package Payment_Process
|
|||
|
* @author Ian Eure <ieure@php.net>
|
|||
|
* @version @version@
|
|||
|
*/
|
|||
|
class Payment_Process_Transfirst extends Payment_Process_Common {
|
|||
|
/**
|
|||
|
* Front-end -> back-end field map.
|
|||
|
*
|
|||
|
* This array contains the mapping from front-end fields (defined in
|
|||
|
* the Payment_Process class) to the field names Transfirst requires.
|
|||
|
*
|
|||
|
* @see _prepare()
|
|||
|
* @access private
|
|||
|
*/
|
|||
|
var $_fieldMap = array(
|
|||
|
// Required
|
|||
|
'login' => "DPIAccountNum",
|
|||
|
'password' => "password",
|
|||
|
'action' => "transactionCode",
|
|||
|
'invoiceNumber' => "orderNum",
|
|||
|
'customerId' => "customerNum",
|
|||
|
'amount' => "transactionAmount",
|
|||
|
'transactionSource' => "ECommerce",
|
|||
|
// Credit Card Type
|
|||
|
'cardNumber' => "cardAccountNum",
|
|||
|
'expDate' => "expirationDate",
|
|||
|
'zip' => "cardHolderZip",
|
|||
|
// Common Type
|
|||
|
// 'name' => "cardHolderName",
|
|||
|
'address' => "cardHolderAddress",
|
|||
|
'city' => "cardHolderCity",
|
|||
|
'state' => "cardHolderState",
|
|||
|
'phone' => "cardHolderPhone",
|
|||
|
'email' => "cardHolderEmail"
|
|||
|
);
|
|||
|
|
|||
|
/**
|
|||
|
* Default options for this processor.
|
|||
|
*
|
|||
|
* @see Payment_Process::setOptions()
|
|||
|
* @access private
|
|||
|
*/
|
|||
|
var $_defaultOptions = array(
|
|||
|
'authorizeUri' => "https://epaysecure.transfirst.com/eLink/authpd.asp"
|
|||
|
);
|
|||
|
|
|||
|
/**
|
|||
|
* Has the transaction been processed?
|
|||
|
*
|
|||
|
* @type boolean
|
|||
|
* @access private
|
|||
|
*/
|
|||
|
var $_processed = false;
|
|||
|
|
|||
|
/**
|
|||
|
* The response body sent back from the gateway.
|
|||
|
*
|
|||
|
* @access private
|
|||
|
*/
|
|||
|
var $_responseBody = '';
|
|||
|
|
|||
|
/**
|
|||
|
* Constructor.
|
|||
|
*
|
|||
|
* @param array $options Class options to set.
|
|||
|
* @see Payment_Process::setOptions()
|
|||
|
* @return void
|
|||
|
*/
|
|||
|
function __construct($options = false)
|
|||
|
{
|
|||
|
parent::__construct($options);
|
|||
|
$this->_driver = 'Transfirst';
|
|||
|
$this->_makeRequired('login', 'password', 'action', 'invoiceNumber', 'customerId', 'amount', 'cardNumber', 'expDate');
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Prepare the data.
|
|||
|
*
|
|||
|
* This function handles the 'testTransaction' option, which is specific to
|
|||
|
* this processor.
|
|||
|
*/
|
|||
|
function _prepare()
|
|||
|
{
|
|||
|
if ($this->_options['testTransaction']) {
|
|||
|
$this->_data['testTransaction'] = $this->_options['testTransaction'];
|
|||
|
}
|
|||
|
$this->_handleCardHolderName();
|
|||
|
return parent::_prepare();
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Process the transaction.
|
|||
|
*
|
|||
|
* @return mixed Payment_Process_Result on success, PEAR_Error on failure
|
|||
|
*/
|
|||
|
function &process()
|
|||
|
{
|
|||
|
// Sanity check
|
|||
|
if(PEAR::isError($res = $this->validate())) {
|
|||
|
return($res);
|
|||
|
}
|
|||
|
|
|||
|
// Prepare the data
|
|||
|
$this->_prepare();
|
|||
|
|
|||
|
// Don't die partway through
|
|||
|
PEAR::pushErrorHandling(PEAR_ERROR_RETURN);
|
|||
|
|
|||
|
$req = new Net_Curl($this->_options['authorizeUri']);
|
|||
|
if (PEAR::isError($req)) {
|
|||
|
PEAR::popErrorHandling();
|
|||
|
return $req;
|
|||
|
}
|
|||
|
$req->type = 'POST';
|
|||
|
$req->fields = $this->_prepareQueryString();
|
|||
|
$req->userAgent = 'PEAR Payment_Process_Transfirst 0.1';
|
|||
|
$res = &$req->execute();
|
|||
|
$req->close();
|
|||
|
if (PEAR::isError($res)) {
|
|||
|
PEAR::popErrorHandling();
|
|||
|
return $res;
|
|||
|
}
|
|||
|
|
|||
|
$this->_processed = true;
|
|||
|
|
|||
|
// Restore error handling
|
|||
|
PEAR::popErrorHandling();
|
|||
|
|
|||
|
$response = trim($res);
|
|||
|
print "Response: {$response}\n";
|
|||
|
$result = &Payment_Process_Result::factory('Transfirst', $response);
|
|||
|
$result->_request = &$this;
|
|||
|
$this->_result = &$result;
|
|||
|
|
|||
|
return $result;
|
|||
|
|
|||
|
/*
|
|||
|
* HTTP_Request doesn't do SSL until PHP 4.3.0, but it
|
|||
|
* might be useful later...
|
|||
|
$req = new HTTP_Request($this->_authUri);
|
|||
|
$this->_setPostData();
|
|||
|
$req->sendRequest();
|
|||
|
*/
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Get (completed) transaction status.
|
|||
|
*
|
|||
|
* @return string Two-digit status returned from gateway.
|
|||
|
*/
|
|||
|
function getStatus()
|
|||
|
{
|
|||
|
if (!$this->_processed) {
|
|||
|
return PEAR::raiseError('The transaction has not been processed yet.', PAYMENT_PROCESS_ERROR_INCOMPLETE);
|
|||
|
}
|
|||
|
return $this->_result->code;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Get transaction sequence.
|
|||
|
*
|
|||
|
* 'Sequence' is what Transfirst calls their transaction ID/approval code. This
|
|||
|
* function returns that code from a processed transaction.
|
|||
|
*
|
|||
|
* @return mixed Sequence ID, or PEAR_Error if the transaction hasn't been
|
|||
|
* processed.
|
|||
|
*/
|
|||
|
function getSequence()
|
|||
|
{
|
|||
|
if (!$this->_processed) {
|
|||
|
return PEAR::raiseError('The transaction has not been processed yet.', PAYMENT_PROCESS_ERROR_INCOMPLETE);
|
|||
|
}
|
|||
|
return $this->_result->_sequenceNumber;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Prepare the POST query string.
|
|||
|
*
|
|||
|
* @access private
|
|||
|
* @return string The query string
|
|||
|
*/
|
|||
|
function _prepareQueryString()
|
|||
|
{
|
|||
|
foreach($this->_data as $var => $value) {
|
|||
|
if (strlen($value))
|
|||
|
$tmp[] = urlencode($var).'='.urlencode($value);
|
|||
|
}
|
|||
|
return @implode('&', $tmp);
|
|||
|
}
|
|||
|
|
|||
|
/*
|
|||
|
function _setPostData(&$req)
|
|||
|
{
|
|||
|
foreach($this->_data as $var => $value) {
|
|||
|
$req->addPostData($var, $value);
|
|||
|
}
|
|||
|
}
|
|||
|
*/
|
|||
|
|
|||
|
/**
|
|||
|
* Handle transaction source.
|
|||
|
*
|
|||
|
* @access private
|
|||
|
*/
|
|||
|
function _handleTransactionSource()
|
|||
|
{
|
|||
|
$specific = $this->_fieldMap['transactionSource'];
|
|||
|
if ($this->transactionSource == PAYMENT_PROCESS_SOURCE_ONLINE) {
|
|||
|
$this->_data[$specific] = 'Y';
|
|||
|
} else {
|
|||
|
$this->_data[$specific] = 'N';
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Handle card expiration date.
|
|||
|
*
|
|||
|
* The gateway wants the date in the format MMYY, with no other chars.
|
|||
|
*
|
|||
|
* @access private
|
|||
|
*/
|
|||
|
function _handleExpDate()
|
|||
|
{
|
|||
|
$specific = $this->_fieldMap['expDate'];
|
|||
|
if (isset($this->_data[$specific])) {
|
|||
|
$this->_data[$specific] = str_replace('/', '', $this->_data[$specific]);
|
|||
|
} else {
|
|||
|
$this->_data[$specific] = str_replace('/', '', $this->expDate);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Map firstName & lastName
|
|||
|
*
|
|||
|
* P_P now has split firstName/lastName fields, instead of 'name.' This
|
|||
|
* handles concatenating them into the Transfirst cardHolderName field.
|
|||
|
*
|
|||
|
* @return void
|
|||
|
*/
|
|||
|
function _handleCardHolderName()
|
|||
|
{
|
|||
|
$this->_data['cardHolderName'] = $this->firstName . ' ' . $this->lastName;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Validate the merchant account login.
|
|||
|
*
|
|||
|
* The Transfirst docs specify that the login is exactly eight digits.
|
|||
|
*
|
|||
|
* @access private
|
|||
|
* @return boolean true if valid, false otherwise
|
|||
|
*/
|
|||
|
function _validateLogin()
|
|||
|
{
|
|||
|
return Validate::string($this->login, array(
|
|||
|
'format' => VALIDATE_NUM,
|
|||
|
'max_length' => 8,
|
|||
|
'min_length' => 8
|
|||
|
));
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Validate the merchant account password.
|
|||
|
*
|
|||
|
* The Transfirst docs specify that the password is a string between 6 and 10
|
|||
|
* characters in length.
|
|||
|
*
|
|||
|
* @access private
|
|||
|
* @return boolean true if valid, false otherwise
|
|||
|
*/
|
|||
|
function _validatePassword()
|
|||
|
{
|
|||
|
return Validate::string($this->password, array(
|
|||
|
'format' => VALIDATE_ALPHA . VALIDATE_NUM,
|
|||
|
'min_length' => 6,
|
|||
|
'max_length' => 10
|
|||
|
));
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Validate the invoice number.
|
|||
|
*
|
|||
|
* Invoice number must be a 5-character long alphanumeric string.
|
|||
|
*
|
|||
|
* @return boolean true on success, false otherwise
|
|||
|
*/
|
|||
|
function _validateInvoiceNumber()
|
|||
|
{
|
|||
|
return Validate::string($this->invoiceNumber, array(
|
|||
|
'format' => VALIDATE_NUM . VALIDATE_ALPHA,
|
|||
|
'min_length' => 5,
|
|||
|
'max_length' => 5
|
|||
|
));
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Validate the invoice number.
|
|||
|
*
|
|||
|
* Invoice no. must be a 15-character long alphanumeric string.
|
|||
|
*
|
|||
|
* @return boolean true on success, false otherwise
|
|||
|
*/
|
|||
|
function _validateCustomerId()
|
|||
|
{
|
|||
|
return Validate::string($this->customerId, array(
|
|||
|
'format' => VALIDATE_NUM . VALIDATE_ALPHA,
|
|||
|
'min_length' => 15,
|
|||
|
'max_length' => 15
|
|||
|
));
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Validate the zip code.
|
|||
|
*
|
|||
|
* Zip is only required if AVS is enabled.
|
|||
|
*
|
|||
|
* @return boolean true on success, false otherwise.
|
|||
|
*/
|
|||
|
function _validateZip()
|
|||
|
{
|
|||
|
if(strlen($this->zip) || $this->performAvs) {
|
|||
|
return parent::_validateZip();
|
|||
|
}
|
|||
|
return true;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
class Payment_Process_Result_Transfirst extends Payment_Process_Result {
|
|||
|
|
|||
|
/**
|
|||
|
* Transfirst status codes.
|
|||
|
*
|
|||
|
* This array holds every possible status returned by the Transfirst gateway.
|
|||
|
*
|
|||
|
* See the Transfirst documentation for more details on each response.
|
|||
|
*
|
|||
|
* @see getStatusText()
|
|||
|
* @access private
|
|||
|
*/
|
|||
|
var $_statusCodeMessages = array(
|
|||
|
'00' => "Approved",
|
|||
|
'01' => "Refer to issuer",
|
|||
|
'02' => "Refer to issuer - Special condition",
|
|||
|
'03' => "Invalid merchant ID",
|
|||
|
'04' => "Pick up card",
|
|||
|
'05' => "Declined",
|
|||
|
'06' => "General error",
|
|||
|
'07' => "Pick up card - Special condition",
|
|||
|
'13' => "Invalid amount",
|
|||
|
'14' => "Invalid card number",
|
|||
|
'15' => "No such issuer",
|
|||
|
'19' => "Re-enter transaction",
|
|||
|
'21' => "Unable to back out transaction",
|
|||
|
'28' => "File is temporarily unavailable",
|
|||
|
'39' => "No credit account",
|
|||
|
'41' => "Pick up card - Lost",
|
|||
|
'43' => "Pick up card - Stolen",
|
|||
|
'51' => "Insufficient funds",
|
|||
|
'54' => "Expired card",
|
|||
|
'57' => "Transaction not permitted - Card",
|
|||
|
'61' => "Amount exceeds withdrawal limit",
|
|||
|
'62' => "Invalid service code, restricted",
|
|||
|
'65' => "Activity limit exceeded",
|
|||
|
'76' => "Unable to locate, no match",
|
|||
|
'77' => "Inconsistent data, rev. or repeat",
|
|||
|
'78' => "No account",
|
|||
|
'80' => "Invalid date",
|
|||
|
'85' => "Card OK",
|
|||
|
'91' => "Issuer or switch is unavailable",
|
|||
|
'93' => "Violation, cannot complete",
|
|||
|
'96' => "System malfunction",
|
|||
|
'98' => "No matching transaction to void",
|
|||
|
'99' => "System timeout",
|
|||
|
'L0' => "General System Error - Contact Transfirst Account Exec.",
|
|||
|
'L1' => "Invalid or missing account number",
|
|||
|
'L2' => "Invalid or missing password",
|
|||
|
'L3' => "Expiration Date is not formatted correctly",
|
|||
|
'L4' => "Reference number not found",
|
|||
|
'L6' => "Order number is required but missing",
|
|||
|
'L7' => "Wrong transaction code",
|
|||
|
'L8' => "Network timeout",
|
|||
|
'L14' => "Invalid card number",
|
|||
|
'S5' => "Already settled",
|
|||
|
'S6' => "Not authorized",
|
|||
|
'S7' => "Declined",
|
|||
|
'V6' => "Invalid transaction type",
|
|||
|
'V7' => "Declined",
|
|||
|
'V8' => "Already voided",
|
|||
|
'V9' => "Already posted"
|
|||
|
);
|
|||
|
|
|||
|
var $_avsCodeMap = array(
|
|||
|
'A' => "Address match",
|
|||
|
'E' => "Ineligible",
|
|||
|
'N' => "No match",
|
|||
|
'R' => "Retry",
|
|||
|
'S' => "Service unavailable",
|
|||
|
'U' => "Address information unavailable",
|
|||
|
'W' => "9-digit zip match",
|
|||
|
'X' => "Address and 9-digit zip match",
|
|||
|
'Y' => "Address and 5-digit zip match",
|
|||
|
'Z' => "5-digit zip match"
|
|||
|
);
|
|||
|
|
|||
|
/**
|
|||
|
* Status code map
|
|||
|
*
|
|||
|
* This contains a map from the Processor-specific result codes to the generic
|
|||
|
* P_P codes. Anything not defined here is treated as a DECLINED result by
|
|||
|
* validate()
|
|||
|
*
|
|||
|
* @type array
|
|||
|
* @access private
|
|||
|
*/
|
|||
|
var $_statusCodeMap = array(
|
|||
|
'00' => PAYMENT_PROCESS_RESULT_APPROVED,
|
|||
|
'05' => PAYMENT_PROCESS_RESULT_DECLINED,
|
|||
|
'V7' => PAYMENT_PROCESS_RESULT_DECLINED
|
|||
|
);
|
|||
|
|
|||
|
var $_aciCodes = array(
|
|||
|
'A' => "CPS Qualified",
|
|||
|
'E' => "CPS Qualified - Card Acceptor Data was submitted in the authorization request.",
|
|||
|
'M' => "Reserved - The card was not present and no AVS request for International transactions",
|
|||
|
'N' => "Not CPS Qualified",
|
|||
|
'V' => "CPS Qualified ? Included an address verification request in the authorization request."
|
|||
|
);
|
|||
|
|
|||
|
var $_authSourceCodes = array(
|
|||
|
' ' => "Terminal doesn't support",
|
|||
|
'0' => "Exception File",
|
|||
|
'1' => "Stand in Processing, time-out response",
|
|||
|
'2' => "Loss Control System (LCS) response provided",
|
|||
|
'3' => "STIP, response provided, issuer suppress inquiry mode",
|
|||
|
'4' => "STIP, response provided, issuer is down",
|
|||
|
'5' => "Response provided by issuer",
|
|||
|
'9' => "Automated referral service (ARS) stand-in"
|
|||
|
);
|
|||
|
|
|||
|
var $_fieldMap = array(
|
|||
|
0 => '_null', // TF Internal Message Format
|
|||
|
1 => '_acctNo', // TF Account number
|
|||
|
2 => '_transactionCode', // The transaction code from the request message passed by the original request.
|
|||
|
3 => 'transactionId', // Assigned by TF used to uniquely identify transaction.
|
|||
|
4 => '_mailOrder', // Mail Order Identifier
|
|||
|
5 => '_ccAcctNo', // The credit card account number passed by the original request.
|
|||
|
6 => '_ccExpDate', // The Expiration Date passed by the original request. The field is formatted YYMM (Year, Month)
|
|||
|
7 => '_authAmount', // An eight-digit value, which denotes the dollar amount passed to TF, without a decimal. ( DDDDDDCC )
|
|||
|
8 => '_authDate', // A six-digit value, which denotes the date the authorization, was attempted. The field is formatted YYMMDD. (Year, Month, Date)
|
|||
|
9 => '_authTime', // A six-digit value, which denotes the time the authorization, was attempted. The field is formatted HHMMSS. (Hour, Minute, Second)
|
|||
|
10 => 'messageCode', // A two-digit value, which indicates the result of the authorization request. Used to determine if the card was authorized, declined or timed out.
|
|||
|
11 => 'customerId', // The Customer Number passed by the original request
|
|||
|
12 => 'invoiceNumber', // The Order Number passed by the original request.
|
|||
|
13 => '_urn', // A number that uniquely identifies an individual transaction. Assigned by TF and can be used when referencing a specific transaction.
|
|||
|
14 => '_authResponse', // A number provided by the issuing bank indicating the authorization is valid and funds have been reserved for transfer to the merchants account at a later time.
|
|||
|
15 => '_authSource', // A code that defines the source where an authorization was captured.
|
|||
|
16 => '_authCharacteristic', // A code that defines the qualification level for the authorized transaction.
|
|||
|
17 => 'approvalCode', // Assigned by Visa or MasterCard, used to uniquely identify and link together all related information and used to authorize and clear a transaction.
|
|||
|
18 => '_validationCode', // Assigned by V.I.P. System that is used to determine the accuracy of the authorization data.
|
|||
|
19 => '_sicCatCode', // A merchants industry classification. Example - Mail Order/Phone Order Merchants (Direct Market) = 5969.
|
|||
|
20 => '_currencyCode', // 840 indicate US Currency to date this is the only valid value.
|
|||
|
21 => 'avsCode', // A value that indicates the level of Address Verification that was validated.
|
|||
|
22 => '_merchantStoreNo', // Identifies the specific terminal used at a location 1-4 Merchant store #, 5-8 specific terminal at store.
|
|||
|
23 => 'cvvCode' // A two-digit value, indicating the result of the card verification based on the CVV2 code provided by the cardholder.
|
|||
|
);
|
|||
|
|
|||
|
/**
|
|||
|
* Constructor.
|
|||
|
*
|
|||
|
* @param string $rawResponse The raw response from the gateway
|
|||
|
* @return mixed boolean true on success, PEAR_Error on failure
|
|||
|
*/
|
|||
|
function __construct($rawResponse)
|
|||
|
{
|
|||
|
$res = $this->_validateResponse($rawResponse);
|
|||
|
if (!$res || PEAR::isError($res)) {
|
|||
|
if (!$res) {
|
|||
|
$res = PEAR::raiseError("Unable to validate response body");
|
|||
|
}
|
|||
|
return $res;
|
|||
|
}
|
|||
|
|
|||
|
$this->_rawResponse = $rawResponse;
|
|||
|
$res = $this->_parseResponse();
|
|||
|
}
|
|||
|
|
|||
|
function getAuthSource()
|
|||
|
{
|
|||
|
return @$this->_authSourceCodes[$this->_authSource];
|
|||
|
}
|
|||
|
|
|||
|
function getAuthCharacteristic()
|
|||
|
{
|
|||
|
return @$this->_aciCodes[$this->_authChar];
|
|||
|
}
|
|||
|
|
|||
|
function getCode()
|
|||
|
{
|
|||
|
return $this->_statusCodeMap[$this->messageCode];
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Parse Transfirst (DPILink) R1 response string.
|
|||
|
*
|
|||
|
* This function parses the response the gateway sends back, which is in
|
|||
|
* pipe-delimited format.
|
|||
|
*
|
|||
|
* @return void
|
|||
|
*/
|
|||
|
function _parseResponse()
|
|||
|
{
|
|||
|
$this->_mapFields(explode('|', $this->_rawResponse));
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Validate a R1 response.
|
|||
|
*
|
|||
|
* @return boolean
|
|||
|
*/
|
|||
|
function _validateResponse($resp)
|
|||
|
{
|
|||
|
if (strlen($resp) > 160)
|
|||
|
return false;
|
|||
|
|
|||
|
// FIXME - add more tests
|
|||
|
|
|||
|
return true;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
?>
|