📄 linkpoint_api.php
字号:
$chargetotal = $myorder["chargetotal"];
// prepare transaction info
$cust_info = '';
$cc_number = substr($myorder["cardnumber"], 0, 4) . str_repeat('X', abs(strlen($myorder["cardnumber"]) - 8)) . substr($myorder["cardnumber"], -4);
foreach($myorder as $key=>$value) {
if ($key != 'cardnumber') {
if ($key == 'cardexpmonth') {
$cc_month = $value;
}
if ($key == 'cardexpyear') {
$cc_year = $value;
}
if (is_array($value)) $value = print_r($value, true);
if (!in_array($key, array('keyfile', 'configfile', 'transactionorigin', 'terminaltype', 'host', 'port'))) $cust_info .= ' ' .$key . '=' . $value . ';';
} else {
$cust_info .= ' ' .$key . '=' . $cc_number . ';';
}
}
// store last 4 digits of CC number
//$order->info['cc_number'] = str_repeat('X', (strlen($myorder["cardnumber"]) - 4)) . substr($myorder["cardnumber"], -4);
// store first and last 4 digits of CC number ... which is the Visa-standards-compliant approach, same as observed by Linkpoint's services
$order->info['cc_number'] = $cc_number;
$order->info['cc_expires'] = $_POST['cc_expires'];
$order->info['cc_type'] = $_POST['cc_type'];
$order->info['cc_owner'] = $_POST['cc_owner'];
$order->info['cc_cvv'] = '***'; // $_POST['cc_cvv'];
$lp_trans_num = $result['r_ordernum'];
$transaction_tax = $result['r_tax']; // The calculated tax for the order, when the ordertype is calctax.
$transaction_shipping = $result['r_shipping']; // The calculated shipping charges for the order, when the ordertype is calcshipping.
$this->response_codes = $result['r_avs']; // AVS Response for transaction
// these are used to update the order-status-history upon order completion
$this->transaction_id = $result['r_tdate'] . ' Order Number/Code: ' . $result['r_ordernum'];
$this->auth_code = $result['r_code']; // The approval code for this transaction.
// Store Transaction history in Database
$sql_data_array= array(array('fieldName'=>'lp_trans_num', 'value' => $result['r_ordernum'], 'type'=>'string'), // The order number associated with this transaction.
array('fieldName'=>'order_id', 'value' => $result['r_ordernum'], 'type'=>'integer'),
array('fieldName'=>'approval_code', 'value' => $result['r_code'], 'type'=>'string'), // The approval code for this transaction.
array('fieldName'=>'transaction_response_time', 'value' => $result['r_time'], 'type'=>'string'), // The time+date of the transaction server response.
array('fieldName'=>'r_error', 'value' => $result['r_error'], 'type'=>'string'),
array('fieldName'=>'customer_id', 'value' => $_SESSION['customer_id'] , 'type'=>'integer'),
array('fieldName'=>'avs_response', 'value' => $result['r_avs'], 'type'=>'string'), // AVS Response for transaction
array('fieldName'=>'transaction_result', 'value' => $result['r_approved'], 'type'=>'string'), // Transaction result: APPROVED, DECLINED, or FRAUD.
array('fieldName'=>'message', 'value' => $result['r_message'] . "\n" . $all_response_info, 'type'=>'string'), // Any message returned by the processor; e.g., CALL VOICE CENTER.
array('fieldName'=>'transaction_time', 'value' => $result['r_tdate'], 'type'=>'string'), // A server time-date stamp for this transaction.
array('fieldName'=>'transaction_reference_number', 'value' => $result['r_ref'], 'type'=>'string'), // Reference number returned by the CC processor.
array('fieldName'=>'fraud_score', 'value' => $result['r_score'], 'type'=>'integer'), // LinkShield fraud risk score.
array('fieldName'=>'cc_number', 'value' => $cc_number, 'type'=>'string'),
array('fieldName'=>'cust_info', 'value' => $cust_info, 'type'=>'string'),
array('fieldName'=>'chargetotal', 'value' => $chargetotal, 'type'=>'string'),
array('fieldName'=>'cc_expire', 'value' => $cc_month . '/' . $cc_year, 'type'=>'string'),
array('fieldName'=>'ordertype', 'value' => $myorder['ordertype'], 'type'=>'string'), // transaction type: PREAUTH or SALE
array('fieldName'=>'date_added', 'value' => 'now()', 'type'=>'noquotestring'));
if (MODULE_PAYMENT_LINKPOINT_API_STORE_DATA == 'True') {
$db->perform(TABLE_LINKPOINT_API, $sql_data_array);
}
// Begin check of specific error conditions
if ($result["r_approved"] != "APPROVED") {
if (substr($result['r_error'],0,10) == 'SGS-020005') $messageStack->add_session('checkout_payment', $result['r_error'], 'error'); // Error (Merchant config file is missing, empty or cannot be read)
if (substr($result['r_error'],0,10) == 'SGS-005000') $messageStack->add_session('checkout_payment', MODULE_PAYMENT_LINKPOINT_API_TEXT_GENERAL_ERROR . '<br />' . $result['r_error'], 'error'); // The server encountered a database error
if (substr($result['r_error'],0,10) == 'SGS-000001' || strstr($result['r_error'], 'D:Declined') || strstr($result['r_error'], 'R:Referral')) $messageStack->add_session('checkout_payment', MODULE_PAYMENT_LINKPOINT_API_TEXT_DECLINED_MESSAGE . '<br />' . $result['r_error'], 'error');
if (substr($result['r_error'],0,10) == 'SGS-005005' || strstr($result['r_error'], 'Duplicate transaction')) $messageStack->add_session('checkout_payment', MODULE_PAYMENT_LINKPOINT_API_TEXT_DUPLICATE_MESSAGE . '<br />' . $result['r_error'], 'error');
}
// End specific error conditions
// Begin Transaction Status does not equal APPROVED
if ($result["r_approved"] != "APPROVED") {
// alert to customer:
$messageStack->add_session('checkout_payment', MODULE_PAYMENT_LINKPOINT_API_TEXT_DECLINED_MESSAGE, 'caution');
zen_redirect(zen_href_link(FILENAME_CHECKOUT_PAYMENT, '', 'SSL', true, false));
}
// End Transaction Status does not equal APPROVED
$avs_meanings = array();
$avs_meanings['YY'] = ' - Street Address and Zip Code match.';
$avs_meanings['YN'] = ' - Street Address matches but Zip Code does NOT match.';
$avs_meanings['YX'] = ' - Street Address matches, but Zip Code comparison unavailable.';
$avs_meanings['NY'] = ' - Street Address DOES NOT match, but Zip Code matches.';
$avs_meanings['XY'] = ' - Street Address check not available, but Zip Code matches.';
$avs_meanings['NN'] = ' - Street Address DOES NOT MATCH and Zip Code DOES NOT MATCH.';
$avs_meanings['NX'] = ' - Street Address DOES NOT MATCH and Zip Code comparison unavailable.';
$avs_meanings['XN'] = ' - Street Address check not available. Zip Code DOES NOT MATCH.';
$avs_meanings['XX'] = ' - No validation for address or zip code could be performed (not available from issuing bank).';
// Possible Fraud order. Allow transaction to process, but notify shop for owner to take appropriate action on order
if (($result["r_approved"] == "APPROVED") && (substr($result['r_code'], 17, 2) != "YY") && MODULE_PAYMENT_LINKPOINT_API_FRAUD_ALERT == 'Yes') {
//DEBUG: $messageStack->add_session('header', 'possible fraud situation--> ' . $result['r_code'], 'caution');
$message = 'Potential Fraudulent Order - Bad Address - Action Required' . "\n" .
'This alert occurs because the "Approval Code" below does not contain the expected YY response.' . "\n" .
'Thus, you might want to verify the address with the customer prior to shipping, or be sure to use Registered Mail with Signature Required in case they file a chargeback.' . "\n\n" .
'Customer Name: ' . $order->customer['firstname'] . ' ' . $order->customer['lastname'] . "\n\n" .
'AVS Result: ' . $result['r_avs'] . $avs_meanings[substr($result['r_avs'],0,2)] . "\n\n" .
'Order Number: ' . $lp_trans_num . "\n" .
'Transaction Date and Time: ' . $result['r_time'] . "\n" .
'Approval Code: ' . $result['r_code'] . "\n" .
'Reference Number: ' . $result['r_ref'] . "\n\n" .
'Error Message: ' . $result['r_error'] . "\n\n" .
'Transaction Result: ' . $result['r_approved'] . "\n\n" .
'Message: ' . $result['r_message'] . "\n\n" .
'Fraud Score: ' . ($result['r_score'] == '' ? 'Not Enabled' : $result['r_score']) . "\n\n" .
'AVS CODE MEANINGS: ' . "\n" .
'YY** = Street Address and Zip Code match.' . "\n" .
'YN** = Street Address matches but Zip Code does NOT match.' . "\n" .
'YX** = Street Address matches, but Zip Code comparison unavailable.' . "\n" .
'NY** = Street Address DOES NOT match, but Zip Code matches.' . "\n" .
'XY** = Street Address check not available, but Zip Code matches.' . "\n" .
'NN** = Street Address DOES NOT MATCH and Zip Code DOES NOT MATCH.' . "\n" .
'NX** = Street Address DOES NOT MATCH and Zip Code comparison unavailable.' . "\n" .
'XN** = Street Address check not available. Zip Code DOES NOT MATCH.' . "\n" .
'XX** = Neither validation is available.' . "\n";
$html_msg['EMAIL_MESSAGE_HTML'] = nl2br($result['r_message']);
zen_mail(STORE_NAME, STORE_OWNER_EMAIL_ADDRESS, 'Potential Fraudulent Order - Bad Address - Action Required - ' . $lp_trans_num, $message, STORE_NAME, EMAIL_FROM, $html_msg, 'fraudalert');
}
// end fraud alert
}
function after_process() {
global $insert_id, $db;
$comments = (MODULE_PAYMENT_LINKPOINT_API_AUTHORIZATION_MODE == 'Authorize Only' ? ALERT_LINKPOINT_API_PREAUTH_TRANS : '');
switch (MODULE_PAYMENT_LINKPOINT_API_TRANSACTION_MODE_RESPONSE) {
case "LIVE: Production": $comments .= ''; break;
case "TESTING: Successful": $comments .= ' ' . ALERT_LINKPOINT_API_TEST_FORCED_SUCCESSFUL; break;
case "TESTING: Decline": $comments .= ' ' . ALERT_LINKPOINT_API_TEST_FORCED_DECLINED; break;
}
$db->Execute("insert into " . TABLE_ORDERS_STATUS_HISTORY . " (comments, orders_id, orders_status_id, date_added) values ('Credit Card payment. " . $comments . " " . $this->cc_card_type . " AUTH: " . $this->auth_code . ". TransID: " . $this->transaction_id . "' , '". (int)$insert_id . "','" . $this->order_status . "', now() )");
return false;
}
function after_order_create($zf_order_id) {
global $db, $lp_avs, $lp_trans_num;
$db->execute("update " . TABLE_ORDERS . " set lp_avs ='" . $lp_avs . "' where orders_id = '" . $zf_order_id ."'");
$db->execute("update " . TABLE_ORDERS . " set lp_trans_num ='" . $lp_trans_num . "' where orders_id = '" . $zf_order_id ."'");
$db->execute("update " . TABLE_LINKPOINT_API . " set order_id ='" . $zf_order_id . "' where lp_trans_num = '" . $lp_trans_num ."'");
}
function admin_notification($zf_order_id) {
global $db;
if (MODULE_PAYMENT_LINKPOINT_API_STORE_DATA=='False') return '';
$output = '';
$sql = "select * from " . TABLE_LINKPOINT_API . " where order_id = '" . $zf_order_id . "' and transaction_result = 'APPROVED' order by date_added";
$lp_api = $db->Execute($sql);
if ($lp_api->RecordCount() > 0) require(DIR_FS_CATALOG. DIR_WS_MODULES . 'payment/linkpoint_api/linkpoint_api_admin_notification.php');
return $output;
}
function get_error() {
$error = array('title' => MODULE_PAYMENT_LINKPOINT_API_TEXT_ERROR,
'error' => stripslashes(urldecode($_GET['error'])));
return $error;
}
function check() {
global $db;
if (IS_ADMIN_FLAG === true) {
global $sniffer;
if ($sniffer->table_exists(TABLE_LINKPOINT_API)) {
if ($sniffer->field_exists(TABLE_LINKPOINT_API, 'zen_order_id')) $db->Execute("ALTER TABLE " . TABLE_LINKPOINT_API . " CHANGE COLUMN zen_order_id order_id int(11) NOT NULL default '0'");
if (!$sniffer->field_exists(TABLE_LINKPOINT_API, 'ordertype')) $db->Execute("ALTER TABLE " . TABLE_LINKPOINT_API . " ADD ordertype varchar(8) NOT NULL default '' after cc_expire");
}
}
if (!isset($this->_check)) {
$check_query = $db->Execute("select configuration_value from " . TABLE_CONFIGURATION . " where configuration_key = 'MODULE_PAYMENT_LINKPOINT_API_STATUS'");
$this->_check = $check_query->RecordCount();
}
return $this->_check;
}
function install() {
global $db;
$db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('鍚
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -