📄 paypaldp.php
字号:
// Validate credit card data
include(DIR_WS_CLASSES . 'cc_validation.php');
$cc_validation = new cc_validation();
$response = $cc_validation->validate($_POST['wpp_cc_number'], $_POST['wpp_cc_expdate_month'], $_POST['wpp_cc_expdate_year'],
$_POST['wpp_cc_issuedate_month'], $_POST['wpp_cc_issuedate_year']);
$error = '';
switch ($response) {
case -1:
$error = sprintf(TEXT_CCVAL_ERROR_UNKNOWN_CARD, substr($cc_validation->cc_number, 0, 4));
break;
case -2:
case -3:
case -4:
$error = TEXT_CCVAL_ERROR_INVALID_DATE;
break;
case false:
$error = TEXT_CCVAL_ERROR_INVALID_NUMBER;
break;
}
if (($response === false) || ($response < 1) ) {
$this->zcLog('before_process - DP-2', 'CC validation results: ' . $error . '(' . $response . ')');
$messageStack->add_session('checkout_payment', $error . '<!-- ['.$this->code.'] -->' . '<!-- result: ' . $response . ' -->', 'error');
zen_redirect(zen_href_link(FILENAME_CHECKOUT_PAYMENT, $error, 'SSL', true, false));
$this->zcLog('before_process - DP-3', 'CC info: ' . $cc_validation->cc_type . ' ' . substr($cc_validation->cc_number, 0, 4) . str_repeat('X', (strlen($cc_validation->cc_number) - 8)) . substr($cc_validation->cc_number, -4) . ' ' . $error);
}
if (!in_array($cc_validation->cc_type, array('Visa', 'MasterCard', 'Switch', 'Solo', 'Discover', 'American Express', 'Maestro'))) {
$messageStack->add_session('checkout_payment', MODULE_PAYMENT_PAYPALDP_TEXT_BAD_CARD . '<!-- [' . $this->code . ' ' . $cc_validation->cc_type . '] -->', 'error');
zen_redirect(zen_href_link(FILENAME_CHECKOUT_PAYMENT, MODULE_PAYMENT_PAYPALDP_TEXT_BAD_CARD, 'SSL', true, false));
}
// if CC validation passed, continue using the validated data
$cc_type = $cc_validation->cc_type;
$cc_number = $cc_validation->cc_number;
$cc_first_name = $_POST['wpp_payer_firstname'];
$cc_last_name = $_POST['wpp_payer_lastname'];
$cc_checkcode = $_POST['wpp_cc_checkcode'];
$cc_expdate_month = $cc_validation->cc_expiry_month;
$cc_expdate_year = $cc_validation->cc_expiry_year;
$cc_issuedate_month = $_POST['wpp_cc_issuedate_month'];
$cc_issuedate_year = $_POST['wpp_cc_issuedate_year'];
$cc_issuenumber = $_POST['wpp_cc_issuenumber'];
$cc_owner_ip = zen_get_ip_address();
// If they're still here, set some of the order object's variables.
$order->info['cc_type'] = $cc_type;
$order->info['cc_number'] = substr($cc_number, 0, 4) . str_repeat('X', (strlen($cc_number) - 8)) . substr($cc_number, -4);
$order->info['cc_owner'] = $cc_first_name . ' ' . $cc_last_name;
$order->info['cc_expires'] = $cc_expdate_month . substr($cc_expdate_year, -2);
$order->info['ip_address'] = $cc_owner_ip;
// Set currency
$my_currency = $this->selectCurrency($order->info['currency'], 'DP');
/*
// if CC is switch or solo, must be GBP
if (in_array($cc_type, array('Switch', 'Solo', 'Maestro'))) {
$my_currency = 'GBP';
}
*/
$order_amount = $this->calc_order_amount($order->info['total'], $my_currency);
// Initialize the paypal caller object.
$doPayPal = $this->paypal_init();
$optionsAll = array_merge($options,
array('STREET' => $order->billing['street_address'],
'ZIP' => $order->billing['postcode'],
'CITY' => $order->billing['city'],
'STATE' => $order->billing['state'],
'STREET2' => $order->billing['suburb'],
'COUNTRYCODE' => $order->billing['country']['iso_code_2'],
'EXPDATE' => $cc_expdate_month . $cc_expdate_year,
'EMAIL' => $order->customer['email_address'],
'PHONENUM' => $order->customer['telephone']));
$optionsShip = array();
if (isset($order->delivery) && $order->delivery['street_address'] != '') {
$optionsShip= array('SHIPTONAME' => ($order->delivery['name'] == '' ? $order->delivery['firstname'] . ' ' . $order->delivery['lastname'] : $order->delivery['name']),
'SHIPTOSTREET' => $order->delivery['street_address'],
'SHIPTOSTREET2' => $order->delivery['suburb'],
'SHIPTOCITY' => $order->delivery['city'],
'SHIPTOZIP' => $order->delivery['postcode'],
'SHIPTOSTATE' => $order->delivery['state'],
'SHIPTOCOUNTRYCODE'=> $order->delivery['country']['iso_code_2']);
}
// if State is not supplied, repeat the city so that it's not blank, otherwise PayPal croaks
if (!isset($optionsShip['SHIPTOSTATE']) || trim($optionsShip['SHIPTOSTATE']) == '') $optionsShip['SHIPTOSTATE'] = $optionsShip['SHIPTOCITY'];
if ($optionsAll['STREET2'] == '') unset($optionsAll['STREET2']);
if ($optionsShip['SHIPTOSTREET2'] == '') unset($optionsShip['SHIPTOSTREET2']);
// Payment Transaction/Authorization Mode
$optionsNVP['PAYMENTACTION'] = (MODULE_PAYMENT_PAYPALDP_TRANSACTION_MODE == 'Auth Only') ? 'Authorization' : 'Sale';
if (MODULE_PAYMENT_PAYPALDP_TRANSACTION_MODE == 'Auth Only') $this->order_status = MODULE_PAYMENT_PAYPALDP_ORDER_PENDING_STATUS_ID;
// if (in_array($cc_type, array('Switch', 'Solo'))) {
// $optionsNVP['PAYMENTACTION'] = 'Authorization';
// }
$optionsAll['BUTTONSOURCE'] = $this->buttonSource;
$optionsAll['CURRENCY'] = $my_currency;
$optionsAll['IPADDRESS'] = $cc_owner_ip;
if ($cc_issuedate_month && $cc_issuedate_year) {
$optionsAll['CARDSTART'] = $cc_issuedate_month . substr($cc_issuedate_year, -2);
}
if (isset($_POST['wpp_cc_issuenumber'])) $optionsAll['CARDISSUE'] = $_POST['wpp_cc_issuenumber'];
// unused at present:
// $options['CUSTOM'] = '';
// $options['INVNUM'] = '';
// $options['DESC'] = '';
if (substr(MODULE_PAYMENT_PAYPALDP_MODULE_MODE,0,7) == 'Payflow') {
if (isset($optionsAll['COUNTRYCODE'])) {
$optionsAll['COUNTRY'] = $optionsAll['COUNTRYCODE'];
unset($optionsAll['COUNTRYCODE']);
}
if (isset($optionsShip['SHIPTOCOUNTRYCODE'])) {
$optionsShip['SHIPTOCOUNTRY'] = $optionsShip['SHIPTOCOUNTRYCODE'];
unset($optionsShip['SHIPTOCOUNTRYCODE']);
}
if (isset($optionsShip['SHIPTOSTREET2'])) unset($optionsShip['SHIPTOSTREET2']);
if (isset($optionsAll['STREET2'])) unset($optionsAll['STREET2']);
}
$this->zcLog('before_process - DP-4', 'optionsAll: ' . print_r($optionsAll, true) . "\n" . 'optionsNVP: ' . print_r($optionsNVP, true) . "\n" . 'optionsShip' . print_r($optionsShip, true) . "\n" . 'Rest of data: ' . "\n" . number_format($order_amount, 2) . ' ' . $cc_expdate_month . ' ' . substr($cc_expdate_year, -2) . ' ' . $cc_first_name . ' ' . $cc_last_name . ' ' . $cc_type);
$response = $doPayPal->DoDirectPayment(number_format($order_amount, 2),
$cc_number,
$cc_checkcode,
$cc_expdate_month . substr($cc_expdate_year, -2),
$cc_first_name, $cc_last_name,
$cc_type,
$optionsAll, array_merge($optionsNVP, $optionsShip));
$this->zcLog('before_process - DP-5', 'resultset:' . "\n" . urldecode(print_r($response, true)));
// CHECK RESPONSE
$error = $this->_errorHandler($response, 'DoDirectPayment');
$this->feeamt = '';
$this->taxamt = '';
$this->pendingreason = '';
$this->reasoncode = '';
$this->numitems = sizeof($order->products);
$this->responsedata = $response;
if ($response['PNREF']) {
// PNREF only comes from payflow mode
$this->payment_type = MODULE_PAYMENT_PAYPALDP_PF_TEXT_TYPE;
$this->transaction_id = $response['PNREF'];
$this->payment_status = (MODULE_PAYMENT_PAYPALDP_TRANSACTION_MODE == 'Auth Only') ? 'Authorization' : 'Completed';
$this->avs = 'AVSADDR: ' . $response['AVSADDR'] . ', AVSZIP: ' . $response['AVSZIP'] . ', IAVS: ' . $response['IAVS'];
$this->cvv2 = $response['CVV2MATCH'];
$this->amt = $order_amount . ' ' . $my_currency;
$this->payment_time = date('Y-m-d h:i:s');
$this->responsedata['CURRENCYCODE'] = $my_currency;
$this->responsedata['EXCHANGERATE'] = $order->info['currency_value'];
$this->auth_code = $this->response['AUTHCODE'];
} else {
// here we're in NVP mode
$this->transaction_id = $response['TRANSACTIONID'];
$this->payment_type = MODULE_PAYMENT_PAYPALDP_DP_TEXT_TYPE;
$this->payment_status = (MODULE_PAYMENT_PAYPALDP_TRANSACTION_MODE == 'Auth Only') ? 'Authorization' : 'Completed';
$this->pendingreason = (MODULE_PAYMENT_PAYPALDP_TRANSACTION_MODE == 'Auth Only') ? 'authorization' : '';
$this->avs = $response['AVSCODE'];
$this->cvv2 = $response['CVV2MATCH'];
$this->correlationid = $response['CORRELATIONID'];
$this->payment_time = urldecode($response['TIMESTAMP']);
$this->amt = urldecode($response['AMT'] . ' ' . $response['CURRENCYCODE']);
$this->auth_code = (isset($this->response['AUTHCODE'])) ? $this->response['AUTHCODE'] : $this->response['TOKEN'];
$this->transactiontype = 'cart';
}
}
/**
* When the order returns from the processor, this stores the results in order-status-history and logs data for subsequent use
*/
function after_process() {
global $insert_id, $db, $order;
// add a new OSH record for this order's PP details
$commentString = "Transaction ID: :transID: " .
(isset($this->responsedata['PPREF']) ? "\nPPRef: " . $this->responsedata['PPREF'] : "") .
(isset($this->responsedata['AUTHCODE'])? "\nAuthCode: " . $this->responsedata['AUTHCODE'] : "") .
"\nPayment Type: :pmtType: " .
"\nTimestamp: :pmtTime: " .
"\nPayment Status: :pmtStatus: " .
(isset($this->responsedata['auth_exp']) ? "\nAuth-Exp: " . $this->responsedata['auth_exp'] : "") .
($this->avs != 'N/A' ? "\nAVS Code: ".$this->avs."\nCVV2 Code: ".$this->cvv2 : '') .
"\nAmount: :orderAmt: ";
$commentString = $db->bindVars($commentString, ':transID:', $this->transaction_id, 'noquotestring');
$commentString = $db->bindVars($commentString, ':pmtType:', $this->payment_type, 'noquotestring');
$commentString = $db->bindVars($commentString, ':pmtTime:', $this->payment_time, 'noquotestring');
$commentString = $db->bindVars($commentString, ':pmtStatus:', $this->payment_status, 'noquotestring');
$commentString = $db->bindVars($commentString, ':orderAmt:', $this->amt, 'noquotestring');
$sql_data_array= array(array('fieldName'=>'orders_id', 'value'=>$insert_id, 'type'=>'integer'),
array('fieldName'=>'orders_status_id', 'value'=>$order->info['order_status'], 'type'=>'integer'),
array('fieldName'=>'date_added', 'value'=>'now()', 'type'=>'noquotestring'),
array('fieldName'=>'customer_notified', 'value'=>0, 'type'=>'integer'),
array('fieldName'=>'comments', 'value'=>$commentString, 'type'=>'string'));
$db->perform(TABLE_ORDERS_STATUS_HISTORY, $sql_data_array);
// store the PayPal order meta data -- used for later matching and back-end processing activities
$paypal_order = array('order_id' => $insert_id,
'txn_type' => $this->transactiontype,
'module_name' => $this->code,
'module_mode' => MODULE_PAYMENT_PAYPALDP_MODULE_MODE,
'reason_code' => $this->reasoncode,
'payment_type' => $this->payment_type,
'payment_status' => $this->payment_status,
'pending_reason' => $this->pendingreason,
'invoice' => urldecode($_SESSION['paypal_ec_token'] . $this->responsedata['PPREF']),
'first_name' => $_SESSION['paypal_ec_payer_info']['payer_firstname'],
'last_name' => $_SESSION['paypal_ec_payer_info']['payer_lastname'],
'payer_business_name' => $_SESSION['paypal_ec_payer_info']['payer_business'],
'address_name' => $_SESSION['paypal_ec_payer_info']['ship_name'],
'address_street' => $_SESSION['paypal_ec_payer_info']['ship_street_1'],
'address_city' => $_SESSION['paypal_ec_payer_info']['ship_city'],
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -