📄 paypal_curl.php
字号:
<?php
/**
* paypal_curl.php communications class for Paypal Express Checkout / Website Payments Pro / Payflow Pro payment methods
*
* @package paymentMethod
* @copyright Copyright 2003-2007 Zen Cart Development Team
* @license http://www.zen-cart.com/license/2_0.txt GNU Public License V2.0
* @version $Id: paypal_curl.php 7558 2007-11-30 17:54:43Z drbyte $
*/
/**
* PayPal NVP (v3.2) and Payflow Pro (v4 HTTP API) implementation via cURL.
*/
class paypal_curl extends base {
/**
* What level should we log at? Valid levels are:
* PEAR_LOG_ERR - Log only severe errors.
* PEAR_LOG_INFO - Date/time of operation, operation name, elapsed time, success or failure indication.
* PEAR_LOG_DEBUG - Full text of requests and responses and other debugging messages.
*
* @access protected
*
* @var integer $_logLevel
*/
var $_logLevel = PEAR_LOG_DEBUG;
/**
* If we're logging, what directory should we create log files in?
* Note that a log name coincides with a symlink, logging will
* *not* be done to avoid security problems. File names are
* <DateStamp>.PayflowPro.log.
*
* @access protected
*
* @var string $_logFile
*/
var $_logDir = 'logs';
/**
* Debug or production?
*/
var $_server = 'sandbox';
/**
* URL endpoints -- defaults here are for three-token NVP implementation
*/
var $_endpoints = array('live' => 'https://api-3t.paypal.com/nvp',
'sandbox' => 'https://api.sandbox.paypal.com/nvp');
/**
* Options for cURL. Defaults to preferred (constant) options.
*/
var $_curlOptions = array(CURLOPT_HEADER => 0,
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_TIMEOUT => 60,
CURLOPT_FOLLOWLOCATION => 0,
CURLOPT_SSL_VERIFYPEER => 0,
CURLOPT_SSL_VERIFYHOST => 2,
CURLOPT_FORBID_REUSE => true,
CURLOPT_POST => 1,
);
/**
* Parameters that are always required and that don't change
* request to request.
*/
var $_partner;
var $_vendor;
var $_user;
var $_pwd;
var $_version;
var $_signature;
/**
* nvp or payflow?
*/
var $_mode = 'nvp';
/**
* Sales or authorizations? For the U.K. this will always be 'S'
* (Sale) because of Switch and Solo cards which don't support
* authorizations. The other option is 'A' for Authorization.
*/
var $_trxtype = 'S';
/**
* Store the last-generated name/value list for debugging.
*/
var $lastParamList = null;
/**
* Store the last-generated headers for debugging.
*/
var $lastHeaders = null;
/**
* Constructor. Sets up communication infrastructure.
*/
function paypal_curl($params = array()) {
foreach ($params as $name => $value) {
$this->setParam($name, $value);
}
}
/**
* SetExpressCheckout
*
* Prepares to send customer to PayPal site so they can
* log in and choose their funding source and shipping address.
*
* The token returned to this function is passed to PayPal in
* order to link their PayPal selections to their cart actions.
*/
function SetExpressCheckout($amount, $returnUrl, $cancelUrl, $optional = array()) {
$values = array_merge($optional, array('AMT' => $amount,
'RETURNURL' => urlencode($returnUrl),
'CANCELURL' => urlencode($cancelUrl)));
if ($this->_mode == 'payflow') {
$values = array_merge($values, array('ACTION' => 'S', /* ACTION=S denotes SetExpressCheckout */
'TENDER' => 'P',
'TRXTYPE' => $this->_trxtype,
'RETURNURL' => $returnUrl,
'CANCELURL' => $cancelUrl));
} elseif ($this->_mode == 'nvp') {
if (!isset($values['PAYMENTACTION'])) $values['PAYMENTACTION'] = ($this->_trxtype == 'S' ? 'Sale' : 'Authorization');
}
// allow page-styling support -- see language file for definitions
if (defined('MODULE_PAYMENT_PAYPALWPP_PAGE_STYLE')) $values['PAGESTYLE'] = MODULE_PAYMENT_PAYPALWPP_PAGE_STYLE;
if (defined('MODULE_PAYMENT_PAYPALWPP_HEADER_IMAGE')) $values['HDRIMG'] = urlencode(MODULE_PAYMENT_PAYPALWPP_HEADER_IMAGE);
if (defined('MODULE_PAYMENT_PAYPALWPP_PAGECOLOR')) $values['PAYFLOWCOLOR'] = MODULE_PAYMENT_PAYPALWPP_PAGECOLOR;
if (defined('MODULE_PAYMENT_PAYPALWPP_HEADER_BORDER_COLOR')) $values['HDRBORDERCOLOR'] = MODULE_PAYMENT_PAYPALWPP_HEADER_BORDER_COLOR;
if (defined('MODULE_PAYMENT_PAYPALWPP_HEADER_BACK_COLOR')) $values['HDRBACKCOLOR'] = MODULE_PAYMENT_PAYPALWPP_HEADER_BACK_COLOR;
return $this->_request($values, 'SetExpressCheckout');
}
/**
* GetExpressCheckoutDetails
*
* When customer returns from PayPal site, this retrieves their payment/shipping data for use in Zen Cart
*/
function GetExpressCheckoutDetails($token, $optional = array()) {
$values = array_merge($optional, array('TOKEN' => $token));
if ($this->_mode == 'payflow') {
$values = array_merge($values, array('ACTION' => 'G', /* ACTION=G denotes GetExpressCheckoutDetails */
'TENDER' => 'P',
'TRXTYPE' => $this->_trxtype));
} elseif ($this->_mode == 'nvp') {
$values = array_merge($values, array('REQBILLINGADDRESS' => '1'));
}
return $this->_request($values, 'GetExpressCheckoutDetails');
}
/**
* DoExpressCheckoutPayment
*
* Completes the sale using PayPal as payment choice
*/
function DoExpressCheckoutPayment($token, $payerId, $amount, $optional = array()) {
$values = array_merge($optional, array('TOKEN' => $token,
'PAYERID' => $payerId,
'AMT' => $amount));
if (PAYPAL_DEV_MODE == 'true') $this->log('DoExpressCheckout - breakpoint 1 - ['.$token . ' ' . $payerId . ' ' . $amount . "]\n\n[" . print_r($values, true) .']', $token);
if ($this->_mode == 'payflow') {
$values = array_merge($values, array('ACTION' => 'D', /* ACTION=D denotes DoExpressCheckoutPayment */
'TENDER' => 'P',
'TRXTYPE' => $this->_trxtype));
} elseif ($this->_mode == 'nvp') {
if (!isset($values['PAYMENTACTION'])) $values['PAYMENTACTION'] = ($this->_trxtype == 'S' ? 'Sale' : 'Authorization');
$values['NOTIFYURL'] = urlencode(zen_href_link('ipn_main_handler.php', '', 'SSL',false,false,true));
}
if (PAYPAL_DEV_MODE == 'true') $this->log('DoExpressCheckout - breakpoint 2 '.print_r($values, true), $token);
return $this->_request($values, 'DoExpressCheckoutPayment');
}
/**
* DoDirectPayment
* Sends CC information to gateway for processing.
*
* Requires Website Payments Pro or Payflow Pro as merchant gateway.
*
* PAYMENTACTION = Authorization (auth/capt) or Sale (final)
*/
function DoDirectPayment($amount, $cc, $cvv2 = '', $exp, $fname = null, $lname = null, $cc_type, $options = array(), $nvp = array() ) {
$values = $options;
$values['AMT'] = $amount;
$values['ACCT'] = $cc;
if ($cvv2 != '') $values['CVV2'] = $cvv2;
if ($this->_mode == 'payflow') {
$values['EXPDATE'] = $exp;
$values['TENDER'] = 'C';
$values['TRXTYPE'] = $this->_trxtype;
$values['VERBOSITY'] = 'MEDIUM';
if (($fname . $lname) !== null && !isset($values['NAME'])) {
$values['NAME'] = $fname . ' ' . $lname;
}
} elseif ($this->_mode == 'nvp') {
$values = array_merge($values, $nvp);
$values['CREDITCARDTYPE'] = ($cc_type == 'American Express') ? 'Amex' : $cc_type;
$values['FIRSTNAME'] = $fname;
$values['LASTNAME'] = $lname;
$values['NOTIFYURL'] = urlencode(zen_href_link('ipn_main_handler.php', '', 'SSL',false,false,true));
if (!isset($values['PAYMENTACTION'])) $values['PAYMENTACTION'] = ($this->_trxtype == 'S' ? 'Sale' : 'Authorization');
if (isset($values['COUNTRY'])) unset ($values['COUNTRY']);
if (isset($values['NAME'])) unset ($values['NAME']);
if (isset($values['COMMENT1'])) unset ($values['COMMENT1']);
if (isset($values['COMMENT2'])) unset ($values['COMMENT2']);
if (isset($values['CUSTREF'])) unset ($values['CUSTREF']);
}
ksort($values);
return $this->_request($values, 'DoDirectPayment');
}
/**
* RefundTransaction
*
* Used to refund all or part of a given transaction
*/
function RefundTransaction($oID, $txnID, $amount = 'Full', $note = '') {
if ($this->_mode == 'payflow') {
$values['ORIGID'] = $txnID;
$values['TENDER'] = 'C';
$values['TRXTYPE'] = 'C';
$values['AMT'] = number_format((float)$amount, 2);
if ($note != '') $values['COMMENT2'] = $note;
} elseif ($this->_mode == 'nvp') {
$values['TRANSACTIONID'] = $txnID;
if ($amount != 'Full' && (float)$amount > 0) {
$values['REFUNDTYPE'] = 'Partial';
$values['AMT'] = number_format((float)$amount, 2);
} else {
$values['REFUNDTYPE'] = 'Full';
}
if ($note != '') $values['NOTE'] = $note;
}
return $this->_request($values, 'RefundTransaction');
}
/**
* DoVoid
*
* Used to void a previously authorized transaction
*/
function DoVoid($txnID, $note = '') {
if ($this->_mode == 'payflow') {
$values['ORIGID'] = $txnID;
$values['TENDER'] = 'C';
$values['TRXTYPE'] = 'V';
if ($note != '') $values['COMMENT2'] = $note;
} elseif ($this->_mode == 'nvp') {
$values['AUTHORIZATIONID'] = $txnID;
if ($note != '') $values['NOTE'] = $note;
}
return $this->_request($values, 'DoVoid');
}
/**
* DoAuthorization
*
* Used to authorize part of a previously placed order which was initiated as authType of Order
*/
function DoAuthorization($txnID, $amount = 0, $currency = 'USD', $entity = 'Order') {
$values['TRANSACTIONID'] = $txnID;
$values['AMT'] = number_format($amount, 2, '.', ',');
$values['TRANSACTIONENTITY'] = $entity;
$values['CURRENCYCODE'] = $currency;
return $this->_request($values, 'DoAuthorization');
}
/**
* DoReauthorization
*
* Used to reauthorize a previously-authorized order which has expired
*/
function DoReauthorization($txnID, $amount = 0, $currency = 'USD') {
$values['AUTHORIZATIONID'] = $txnID;
$values['AMT'] = number_format($amount, 2, '.', ',');
$values['CURRENCYCODE'] = $currency;
return $this->_request($values, 'DoReauthorization');
}
/**
* DoCapture
*
* Used to capture part or all of a previously placed order which was only authorized
*/
function DoCapture($txnID, $amount = 0, $currency = 'USD', $captureType = 'Complete', $invNum = '', $note = '') {
if ($this->_mode == 'payflow') {
$values['ORIGID'] = $txnID;
$values['TENDER'] = 'C';
$values['TRXTYPE'] = 'D';
$values['VERBOSITY'] = 'MEDIUM';
if ($invNum != '') $values['INVNUM'] = $invNum;
if ($note != '') $values['COMMENT2'] = $note;
} elseif ($this->_mode == 'nvp') {
$values['AUTHORIZATIONID'] = $txnID;
$values['COMPLETETYPE'] = $captureType;
$values['AMT'] = number_format((float)$amount, 2);
$values['CURRENCYCODE'] = $currency;
if ($invNum != '') $values['INVNUM'] = $invNum;
if ($note != '') $values['NOTE'] = $note;
}
return $this->_request($values, 'DoCapture');
}
/**
* GetTransactionDetails
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -