I had somebody implement a script for me, so I'm a little lost on how/where to set the code to give me back a transaction id for tracking or for the customer's to print for their records.
I have a payment processing page that includes the below code. I seeat the top,var $trans_key = ''; and down lower, several options under "// response information". But I'm just not sure how to set these to give me that information to echo/use on the confirmation page.
<?php
/**
* CLASS AIM
*
*/
class AIM {
// login credentials that Authorize.net uses for verification
var $login_id = '';
var $trans_key = '';
// server
var $server = '';
// testing name stuff
// credit card information
var $cc_name = '';
var $cc_number = '';
var $cc_month = '';
var $cc_year = '';
var $cc_code = '';
var $cc_type = '';
// error stack array
var $errorStack = array();
// modes
var $testMode = false;
var $debugMode = false;
var $errorRetries = 2;
// buyer information
var $buyer = array();
// response information
var $status = '';
var $subcode = '';
var $response_code = '';
var $response_text = '';
var $approval_code = '';
var $md5hash = '';
var $code = '';
var $remaining = array();
// constructor
function AIM($login_id, $trans_key) {
$this->login_id = $login_id;
$this->trans_key = $trans_key;
$this->setTesting(0);
}
/** loads option array
* @param fName string containing the first name
* @param lName string containing the last name
* @param address string containing the address
* @param city string containing the city
* @param state string containing the state
* @param zip string containing the zipcode
* @param phone string containing the phone number
* @return true
*/
function setBuyer ($fname, $lname, $address, $city, $state, $zip, $phone = "(000)000-0000") {
$this->buyer = array
(
"FirstName" => $fname,
"LastName" => $lname,
"Address" => $address,
"City" => $city,
"State" => $state,
"Zip" => $zip,
"Phone" => $phone
);
return true;
}
/** sets the card information variables
* @param cc_name string containing the name on the credit card
* @param cc_number string containing the credit card number
* @param cc_month string containing the expiration month
* @param cc_year string containing the expiration year
* @param cc_code string containing the security code
* @return boolean
*/
function setCard ($cc_name, $cc_number, $cc_month, $cc_year, $cc_code) {
$this->cc_name = $cc_name;
$this->cc_number = ereg_replace("[^0-9]", "", $cc_number);
$this->cc_month = ereg_replace("[^0-9]", "", $cc_month);
$this->cc_year = ereg_replace("[^0-9]", "", $cc_year);
$this->cc_code = ereg_replace("[^0-9]", "", $cc_code);
return $this->verifyCard();
}
/** verifies correct format of card
* @return boolean
*/
function verifyCard () {
// these can be combined. however, if card type is needed, split up works better
if (ereg('^4[0-9]{12}([0-9]{3})?$', $this->cc_number))
$this->cc_type = 'Visa';
elseif (ereg('^5[1-5][0-9]{14}$', $this->cc_number))
$this->cc_type = 'Master Card';
elseif (ereg('^3[47][0-9]{13}$', $this->cc_number))
$this->cc_type = 'American Express';
elseif (ereg('^3(0[0-5]|[68][0-9])[0-9]{11}$', $this->cc_number))
$this->cc_type = 'Diners Club';
elseif (ereg('^6011[0-9]{12}$', $this->cc_number))
$this->cc_type = 'Discover';
elseif (ereg('^(3[0-9]{4}|2131|1800)[0-9]{11}$', $this->cc_number))
$this->cc_type = 'JCB';
else{
$this->errorStack[] = "Invalid card number.";
return false;
}
// if the year is before the current
if ($this->cc_year < date ("Y")) {
$this->errorStack[] = "Invalid card expiration date (card has expired).";
return false;
}
// if the year is the current, and the month is less than the current
if ($this->cc_year == date ("Y") && $this->cc_month < date ("m")) {
$this->errorStack[] = "Invalid card expiration date (card has expired).";
return false;
}
// who has a name less than 5 characters?
if (strlen($this->cc_name) < 5) {
$this->errorStack[] = "The name on the credit card appears invalid.";
return false;
}
// make sure the security is atleast 3 characters long and larger than 000
if (strlen($this->cc_code) < 3 || $this->cc_code < 1) {
$this->errorStack[] = "Invalid security code.";
return false;
}
return true;
}
/** set testing mode
* @param test int/boolean containing testing setting
* @return true
*/
function setTesting ($test) {
if ($test == 1 || $test == true) {
$this->testMode = true;
$this->server = "https://certification.authorize.net/gateway/transact.dll";
}else{
$this->testMode = false;
$this->server = "https://secure.authorize.net/gateway/transact.dll";
}
return true;
}
/** process the card
* @param item string containing a description of the item being sold
* @param amount float containing the amount to be charge
* @return boolean
*/
function processCard ($item, $amount) {
// run the regular expression to verify card format
if (!$this->verifyCard()) {
$this->errorStack[] = "Invalid card.";
return false;
}
// populate the array of items to send to authorize.net
$values = array
(
"x_login" => $this->login_id,
"x_tran_key" => $this->trans_key,
"x_version" => "3.1",
"x_delim_char" => "|",
"x_delim_data" => "TRUE",
"x_url" => "FALSE",
"x_type" => "AUTH_CAPTURE",
"x_method" => "CC",
"x_relay_response" => "TRUE",
"x_card_num" => $this->cc_number,
"x_exp_date" => $this->cc_month . $this->cc_year,
"x_card_code" => $this->cc_code,
"x_description" => $item,
"x_amount" => $amount,
"x_first_name" => htmlspecialchars($this->buyer["FirstName"]),
"x_last_name" => htmlspecialchars($this->buyer["LastName"]),
"x_address" => htmlspecialchars($this->buyer["Address"]),
"x_city" => htmlspecialchars($this->buyer["City"]),
"x_state" => htmlspecialchars($this->buyer["State"]),
"x_zip" => htmlspecialchars($this->buyer["Zip"]),
"x_country" => 'US',
"x_phone" => htmlspecialchars($this->buyer["Phone"])
);
// makes for a safe transfer
$fields = "";
foreach( $values as $key => $value ) $fields .= "$key=" . urlencode($value) . "&";
// begin setting up cURL
$ch = curl_init($this->server);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, rtrim($fields, "& "));
// lets talk
$resp = curl_exec($ch);
curl_close ($ch);
// parse the response
$this->parseReturn ($resp);
// if we had any errors parsing, return right now
if (sizeof ($this->errorStack) > 0)
return false;
return $this->approval_code;
}
/** parse the returned delimited string
* @param response string containing the authorize.net response
* @return boolean
*/
function parseReturn ($response) {
// figure out how many responses we got back
$text = $response;
$h = substr_count($text, "|");
$h++;
// loop through the result string, one delimited (|) chunk at time
for($j=1; $j <= $h; $j++) {
// get the location of the end of the item to process
$p = strpos($text, "|");
if ((!$p === false)) {
$p++;
$pstr = substr($text, 0, $p);
$pstr_trimmed = substr($pstr, 0, -1); // removes "|" at the end
// nothing found?
if ($pstr_trimmed == "") {
$this->errorStack[] = "Error communicating with payment processing server.";
return false;
}
// what did we just get?
switch($j) {
// case 1 is the general approved/declined/error result
case 1:
if ($pstr_trimmed=="1")
$this->status = "Approved";
elseif ($pstr_trimmed=="2") {
$this->status = "Declined";
//$this->errorStack[] = "The card was declined.";
}elseif ($pstr_trimmed=="3") {
$this->status = "Error";
//$this->errorStack[] = "An error occurred.";
}
break;
// case 2 is the sub code
case 2:
$this->subcode = $pstr_trimmed;
break;
// case 3 is the response code
case 3:
$this->response_code = $pstr_trimmed;
break;
// case 4 is the detailed response text (readable)
case 4:
$this->response_text = $pstr_trimmed;
if ($this->status == "Declined" || $this->status == "Error")
$this->errorStack[] = $this->response_text;
break;
// case 5 is the authorize.net approval code
case 5:
$this->approval_code = $pstr_trimmed;
break;
// case 38 is the MD5 to prove it came from authorize.net
case 38:
$this->md5hash = $pstr_trimmed;
break;
// case 39 is the code result
case 39:
if ($pstr_trimmed == "M")
$this->code = "M = Match";
elseif ($pstr_trimmed == "N") {
$this->code = "N = No Match";
$this->errorStack[] = "The security code supplied did not match.";
}elseif ($pstr_trimmed == "P") {
$this->code = "P = Not Processed";
$this->errorStack[] = "We were unable to process your card's security code. Please contact Reliance.";
}elseif ($pstr_trimmed == "S")
$this->code = "S = Should have been present";
elseif ($pstr_trimmed == "U")
$this->code = "U = Issuer unable to process request";
else
$this->code = "NO VALUE RETURNED";
break;
// the rest of the messages are just stored for debugging purposes (or random use)
default:
$this->remaining[$j] = $pstr_trimmed;
break;
}
// drop the processed item
$text = substr($text, $p);
}
}
return true;
}
}
?>