Tuesday, January 27, 2015

Paypal Error (35) error 14094410: SSLV3 zencart

If you are using zencart 1.5.1 and payment getway as paypal then you might get a error message Paypal Error (35) error 14094410: SSLV3. This is acctually because of update from paypal you can see the SSLV3 paypal update here. To overcome this problem i just have edited a file of Zencart. The file location is

includes->modules->payment->paypal->paypal_curl.php

The whole modefied code is here you simpally need to copy and pest it into paypal_curl.php and update it on to your web server.


 <?php  
 /**  
  * paypal_curl.php communications class for PayPal Express Checkout / Website Payments Pro / Payflow Pro payment methods  
  *  
  * @package paymentMethod  
  * @copyright Copyright 2003-2012 Zen Cart Development Team  
  * @license http://www.zen-cart.com/license/2_0.txt GNU Public License V2.0  
  * @version GIT: $Id: Author: DrByte Tue Aug 28 14:21:34 2012 -0400 Modified in v1.5.1 $  
  */  
 /**  
  * PayPal NVP (v61) and Payflow Pro (v4 HTTP API) implementation via cURL.  
  */  
 class paypal_curl extends base {  
  /**  
   * What level should we log at? Valid levels are:  
   *  1 - Log only severe errors.  
   *  2 - Date/time of operation, operation name, elapsed time, success or failure indication.  
   *  3 - Full text of requests and responses and other debugging messages.  
   *  
   * @access protected  
   *  
   * @var integer $_logLevel  
   */  
  var $_logLevel = 3;  
  /**  
   * 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-3t.sandbox.paypal.com/nvp');  
  /**  
   * Options for cURL. Defaults to preferred (constant) options.  
   */  
  var $_curlOptions = array(CURLOPT_HEADER => 0,  
               CURLOPT_RETURNTRANSFER => TRUE,  
               CURLOPT_TIMEOUT => 60,  
               CURLOPT_FOLLOWLOCATION => FALSE,  
               CURLOPT_SSL_VERIFYPEER => FALSE,  
               CURLOPT_SSL_VERIFYHOST => 2,  
               //CURLOPT_SSLVERSION => 3,  
               CURLOPT_FORBID_REUSE => TRUE,  
               CURLOPT_FRESH_CONNECT => TRUE,  
               CURLOPT_POST => TRUE,  
               );  
  /**  
   * 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.  
   * NOTE: 'A' is not supported for pre-signup-EC-boarding.  
   */  
  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;  
  /**  
   * submission values  
   */  
  var $values = array();  
  /**  
   * 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($returnUrl, $cancelUrl, $options = array()) {  
   $values = $options;  
   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']) || ($this->checkHasApiCredentials() === FALSE)) $values['PAYMENTACTION'] = ($this->_trxtype == 'S' || ($this->checkHasApiCredentials() === FALSE) ? 'Sale' : 'Authorization');  
    $values['RETURNURL'] = urlencode($returnUrl);  
    $values['CANCELURL'] = urlencode($cancelUrl);  
   }  
   // convert country code key to proper key name for paypal 2.0 (needed when sending express checkout via payflow gateway, due to PayPal field naming inconsistency)  
   if ($this->_mode == 'payflow') {  
    if (!isset($values['SHIPTOCOUNTRY']) && isset($values['SHIPTOCOUNTRYCODE'])) {  
     $values['SHIPTOCOUNTRY'] = $values['SHIPTOCOUNTRYCODE'];  
     unset($values['SHIPTOCOUNTRYCODE']);  
    }  
    //if (isset($values['AMT'])) unset($values['AMT']);  
   }  
   // 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_PAYPAL_LOGO_IMAGE')) $values['LOGOIMG'] = urlencode(MODULE_PAYMENT_LOGO_IMAGE);  
   if (defined('MODULE_PAYMENT_PAYPAL_CART_BORDER_COLOR')) $values['CARTBORDERCOLOR'] = MODULE_PAYMENT_PAYPAL_CART_BORDER_COLOR;  
   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;  
   if (PAYPAL_DEV_MODE == 'true') $this->log('SetExpressCheckout - breakpoint 1 - [' . print_r($values, true) .']');  
   $this->values = $values;  
   $this->notify('NOTIFY_PAYPAL_SETEXPRESSCHECKOUT');  
   return $this->_request($this->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));  
   }  
   return $this->_request($values, 'GetExpressCheckoutDetails');  
  }  
  /**  
   * DoExpressCheckoutPayment  
   *  
   * Completes the sale using PayPal as payment choice  
   */  
  function DoExpressCheckoutPayment($token, $payerId, $options = array()) {  
   $values = array_merge($options, array('TOKEN'  => $token,  
                      'PAYERID' => $payerId));  
   if (PAYPAL_DEV_MODE == 'true') $this->log('DoExpressCheckout - breakpoint 1 - ['.$token . ' ' . $payerId . ' ' . "]\n\n[" . print_r($values, true) .']', $token);  
   if ($this->_mode == 'payflow') {  
    $values['ACTION'] = 'D'; /* ACTION=D denotes DoExpressCheckoutPayment via Payflow */  
    $values['TENDER'] = 'P';  
    $values['TRXTYPE'] = $this->_trxtype;  
    $values['NOTIFYURL'] = zen_href_link('ipn_main_handler.php', '', 'SSL',false,false,true);  
   } elseif ($this->_mode == 'nvp') {  
    if (!isset($values['PAYMENTACTION']) || $this->checkHasApiCredentials() === FALSE) $values['PAYMENTACTION'] = ($this->_trxtype == 'S' || ($this->checkHasApiCredentials() === FALSE) ? 'Sale' : 'Authorization');  
    $values['NOTIFYURL'] = urlencode(zen_href_link('ipn_main_handler.php', '', 'SSL',false,false,true));  
   }  
   $this->values = $values;  
   $this->notify('NOTIFY_PAYPAL_DOEXPRESSCHECKOUTPAYMENT');  
   if (PAYPAL_DEV_MODE == 'true') $this->log('DoExpressCheckout - breakpoint 2 '.print_r($this->values, true), $token);  
   return $this->_request($this->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($cc, $cvv2 = '', $exp, $fname = null, $lname = null, $cc_type, $options = array(), $nvp = array() ) {  
   $values = $options;  
   $values['ACCT'] = $cc;  
   if ($cvv2 != '') $values['CVV2'] = $cvv2;  
   $values['FIRSTNAME'] = $fname;  
   $values['LASTNAME'] = $lname;  
   if (isset($values['NAME'])) unset ($values['NAME']);  
   if ($this->_mode == 'payflow') {  
    $values['EXPDATE'] = $exp;  
    $values['TENDER'] = 'C';  
    $values['TRXTYPE'] = $this->_trxtype;  
    $values['VERBOSITY'] = 'MEDIUM';  
    $values['NOTIFYURL'] = zen_href_link('ipn_main_handler.php', '', 'SSL',false,false,true);  
   } elseif ($this->_mode == 'nvp') {  
    $values = array_merge($values, $nvp);  
    if (isset($values['ECI'])) {  
     $values['ECI3DS'] = $values['ECI'];  
     unset($values['ECI']);  
    }  
    $values['CREDITCARDTYPE'] = ($cc_type == 'American Express') ? 'Amex' : $cc_type;  
    $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['COMMENT1'])) unset ($values['COMMENT1']);  
    if (isset($values['COMMENT2'])) unset ($values['COMMENT2']);  
    if (isset($values['CUSTREF'])) unset ($values['CUSTREF']);  
   }  
   $this->values = $values;  
   $this->notify('NOTIFY_PAYPAL_DODIRECTPAYMENT');  
   ksort($this->values);  
   return $this->_request($this->values, 'DoDirectPayment');  
  }  
  /**  
   * RefundTransaction  
   *  
   * Used to refund all or part of a given transaction  
   */  
  function RefundTransaction($oID, $txnID, $amount = 'Full', $note = '', $curCode = 'USD') {  
   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['CURRENCYCODE'] = $curCode;  
     $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');  
  }  
  /**  
   * ManagePendingTransactionStatus  
   *  
   * Accept/Deny pending FMF transactions  
   */  
  function ManagePendingTransactionStatus($txnID, $action) {  
   if (!in_array($action, array('Accept', 'Deny'))) return FALSE;  
   $values['TRANSACTIONID'] = $txnID;  
   $values['ACTION'] = $action;  
   return $this->_request($values, 'ManagePendingTransactionStatus');  
  }  
  /**  
   * GetTransactionDetails  
   *  
   * Used to read data from PayPal for a given transaction  
   */  
  function GetTransactionDetails($txnID) {  
   if ($this->_mode == 'payflow') {  
    $values['ORIGID'] = $txnID;  
    $values['TENDER'] = 'C';  
    $values['TRXTYPE'] = 'I';  
    $values['VERBOSITY'] = 'MEDIUM';  
   } elseif ($this->_mode == 'nvp') {  
    $values['TRANSACTIONID'] = $txnID;  
   }  
   return $this->_request($values, 'GetTransactionDetails');  
  }  
  /**  
   * TransactionSearch  
   *  
   * Used to read data from PayPal for specified transaction criteria  
   */  
  function TransactionSearch($startdate, $txnID = '', $email = '', $options) {  
   if ($this->_mode == 'payflow') {  
    $values['CUSTREF'] = $txnID;  
    $values['TENDER'] = 'C';  
    $values['TRXTYPE'] = 'I';  
    $values['VERBOSITY'] = 'MEDIUM';  
   } elseif ($this->_mode == 'nvp') {  
    $values['STARTDATE'] = $startdate;  
    $values['TRANSACTIONID'] = $txnID;  
    $values['EMAIL'] = $email;  
    if (is_array($options)) $values = array_merge($values, $options);  
   }  
   return $this->_request($values, 'TransactionSearch');  
  }  
  /**  
   * Set a parameter as passed.  
   */  
  function setParam($name, $value) {  
   $name = '_' . $name;  
   $this->$name = $value;  
  }  
  /**  
   * Set CURL options.  
   */  
  function setCurlOption($name, $value) {  
   $this->_curlOptions[$name] = $value;  
  }  
  /**  
   * Send a request to endpoint.  
   */  
  function _request($values, $operation, $requestId = null) {  
   if ($this->_mode == 'NOTCONFIGURED') {  
    return array('RESULT' => 'PayPal credentials not set. Cannot proceed.');  
    die('NOTCONFIGURED');  
   }  
   if ($this->checkHasApiCredentials() === FALSE && (!in_array($operation, array('SetExpressCheckout','GetExpressCheckoutDetails', 'DoExpressCheckoutPayment')))) {  
    return array('RESULT' => 'Unauthorized: Unilateral');  
   }  
   if (PAYPAL_DEV_MODE == 'true') $this->log('_request - breakpoint 1 - ' . $operation . "\n" . print_r($values, true));  
   $start = $this->_getMicroseconds();  
   if ($this->_mode == 'nvp') {  
    $values['METHOD'] = $operation;  
   }  
   if ($this->_mode == 'payflow') {  
    $values['REQUEST_ID'] = time();  
   }  
   // convert currency code to proper key name for nvp  
   if ($this->_mode == 'nvp') {  
    if (!isset($values['CURRENCYCODE']) && isset($values['CURRENCY'])) {  
     $values['CURRENCYCODE'] = $values['CURRENCY'];  
     unset($values['CURRENCY']);  
    }  
   }  
   // request-id must be unique within 30 days  
   if ($requestId === null) {  
    $requestId = md5(uniqid(mt_rand()));  
   }  
   $headers[] = 'Content-Type: text/namevalue';  
   $headers[] = 'X-VPS-Timeout: 90';  
   $headers[] = "X-VPS-VIT-Client-Type: PHP/cURL";  
   if ($this->_mode == 'payflow') {  
    $headers[] = 'X-VPS-VIT-Integration-Product: PHP::Zen Cart(R) - PayPal/Payflow Pro';  
   } elseif ($this->_mode == 'nvp') {  
    $headers[] = 'X-VPS-VIT-Integration-Product: PHP::Zen Cart(R) - PayPal/NVP';  
   }  
   $headers[] = 'X-VPS-VIT-Integration-Version: 1.5.1';  
   $this->lastHeaders = $headers;  
   $ch = curl_init();  
   curl_setopt($ch, CURLOPT_URL, $this->_endpoints[$this->_server]);  
   curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);  
   curl_setopt($ch, CURLOPT_POSTFIELDS, $this->_buildNameValueList($values));  
   foreach ($this->_curlOptions as $name => $value) {  
    curl_setopt($ch, $name, $value);  
   }  
   $response = curl_exec($ch);  
   $commError = curl_error($ch);  
   $commErrNo = curl_errno($ch);  
   $commInfo = @curl_getinfo($ch);  
   curl_close($ch);  
   $rawdata = "CURL raw data:\n" . $response . "CURL RESULTS: (" . $commErrNo . ') ' . $commError . "\n" . print_r($commInfo, true) . "\nEOF";  
   $errors = ($commErrNo != 0 ? "\n(" . $commErrNo . ') ' . $commError : '');  
   $response .= '&CURL_ERRORS=' . ($commErrNo != 0 ? urlencode('(' . $commErrNo . ') ' . $commError) : '') ;  
   // do debug/logging  
   if ((!in_array($operation, array('GetTransactionDetails','TransactionSearch'))) || (in_array($operation, array('GetTransactionDetails','TransactionSearch')) && !strstr($response, '&ACK=Success')) ) $this->_logTransaction($operation, $this->_getElapsed($start), $response, $errors . ($commErrNo != 0 ? "\n" . print_r($commInfo, true) : ''));  
   if ($response) {  
    return $this->_parseNameValueList($response);  
   } else {  
    return false;  
   }  
  }  
  /**  
   * Take an array of name-value pairs and return a properly  
   * formatted list. Enforces the following rules:  
   *  
   *  - Names must be uppercase, all characters must match [A-Z].  
   *  - Values cannot contain quotes.  
   *  - If values contain & or =, the name has the length appended to  
   *   it in brackets (NAME[4] for a 4-character value.  
   *  
   * If any of the "cannot" conditions are violated the function  
   * returns false, and the caller must abort and not proceed with  
   * the transaction.  
   */  
  function _buildNameValueList($pairs) {  
   // Add the parameters that are always sent.  
   $commpairs = array();  
   // generic:  
   if ($this->_user != '')   $commpairs['USER'] = str_replace('+', '%2B', trim($this->_user));  
   if ($this->_pwd != '')    $commpairs['PWD'] = trim($this->_pwd);  
   // PRO2.0 options:  
   if ($this->_partner != '')  $commpairs['PARTNER'] = trim($this->_partner);  
   if ($this->_vendor != '')  $commpairs['VENDOR'] = trim($this->_vendor);  
   // NVP-specific options:  
   if ($this->_version != '')  $commpairs['VERSION'] = trim($this->_version);  
   if ($this->_signature != '') $commpairs['SIGNATURE'] = trim($this->_signature);  
   // Use sandbox credentials if defined and sandbox selected  
   if ($this->_server == 'sandbox'  
     && defined('MODULE_PAYMENT_PAYPALWPP_SANDBOX_APIUSERNAME') && MODULE_PAYMENT_PAYPALWPP_SANDBOX_APIUSERNAME != ''  
     && defined('MODULE_PAYMENT_PAYPALWPP_SANDBOX_APIPASSWORD') && MODULE_PAYMENT_PAYPALWPP_SANDBOX_APIPASSWORD != ''  
     && defined('MODULE_PAYMENT_PAYPALWPP_SANDBOX_APISIGNATURE') && MODULE_PAYMENT_PAYPALWPP_SANDBOX_APISIGNATURE != '') {  
    $commpairs['USER'] = str_replace('+', '%2B', trim(MODULE_PAYMENT_PAYPALWPP_SANDBOX_APIPASSWORD));  
    $commpairs['PWD'] = trim(MODULE_PAYMENT_PAYPALWPP_SANDBOX_APIPASSWORD);  
    $commpairs['SIGNATURE'] = trim(MODULE_PAYMENT_PAYPALWPP_SANDBOX_APISIGNATURE);  
   }  
   // Adjustments if Micropayments account profile details have been set  
   if (defined('MODULE_PAYMENT_PAYPALWPP_MICROPAY_THRESHOLD') && MODULE_PAYMENT_PAYPALWPP_MICROPAY_THRESHOLD != ''  
     && $pairs['AMT'] < strval(MODULE_PAYMENT_PAYPALWPP_MICROPAY_THRESHOLD)  
     && defined('MODULE_PAYMENT_PAYPALWPP_MICROPAY_APIUSERNAME') && MODULE_PAYMENT_PAYPALWPP_MICROPAY_APIUSERNAME != ''  
     && defined('MODULE_PAYMENT_PAYPALWPP_MICROPAY_APIPASSWORD') && MODULE_PAYMENT_PAYPALWPP_MICROPAY_APIPASSWORD != ''  
     && defined('MODULE_PAYMENT_PAYPALWPP_MICROPAY_APISIGNATURE') && MODULE_PAYMENT_PAYPALWPP_MICROPAY_APISIGNATURE != '') {  
    $commpairs['USER'] = str_replace('+', '%2B', trim(MODULE_PAYMENT_PAYPALWPP_MICROPAY_APIUSERNAME));  
    $commpairs['PWD'] = trim(MODULE_PAYMENT_PAYPALWPP_MICROPAY_APIPASSWORD);  
    $commpairs['SIGNATURE'] = trim(MODULE_PAYMENT_PAYPALWPP_MICROPAY_APISIGNATURE);  
   }  
   // Accelerated/Unilateral Boarding support:  
   if ($this->checkHasApiCredentials() == FALSE) {  
    $commpairs['SUBJECT'] = STORE_OWNER_EMAIL_ADDRESS;  
    $commpairs['USER'] = '';  
    $commpairs['PWD'] = '';  
    $commpairs['SIGNATURE'] = '';  
   }  
   $pairs = array_merge($pairs, $commpairs);  
   $string = array();  
   foreach ($pairs as $name => $value) {  
    if (preg_match('/[^A-Z_0-9]/', $name)) {  
     if (PAYPAL_DEV_MODE == 'true') $this->log('_buildNameValueList - datacheck - ABORTING - preg_match found invalid submission key: ' . $name . ' (' . $value . ')');  
     return false;  
    }  
    // remove quotation marks  
    $value = str_replace('"', '', $value);  
    // if the value contains a & or = symbol, handle it differently  
    if (($this->_mode == 'payflow') && (strpos($value, '&') !== false || strpos($value, '=') !== false)) {  
     $string[] = $name . '[' . strlen($value) . ']=' . $value;  
     if (PAYPAL_DEV_MODE == 'true') $this->log('_buildNameValueList - datacheck - adding braces and string count to: ' . $value . ' (' . $name . ')');  
    } else {  
     if ($this->_mode == 'nvp' && ((strstr($name, 'SHIPTO') || strstr($name, 'L_NAME')) && (strpos($value, '&') !== false || strpos($value, '=') !== false))) $value = urlencode($value);  
     $string[] = $name . '=' . $value;  
    }  
   }  
   $this->lastParamList = implode('&', $string);  
   return $this->lastParamList;  
  }  
  /**  
   * Take a name/value response string and parse it into an  
   * associative array. Doesn't handle length tags in the response  
   * as they should not be present.  
   */  
  function _parseNameValueList($string) {  
   $string = str_replace('&amp;', '|', $string);  
   $pairs = explode('&', str_replace(array("\r\n","\n"), '', $string));  
   //$this->log('['.$string . "]\n\n[" . print_r($pairs, true) .']');  
   $values = array();  
   foreach ($pairs as $pair) {  
    list($name, $value) = explode('=', $pair, 2);  
    $values[$name] = str_replace('|', '&amp;', $value);  
   }  
   return $values;  
  }  
  /**  
   * Log the current transaction depending on the current log level.  
   *  
   * @access protected  
   *  
   * @param string $operation The operation called.  
   * @param integer $elapsed  Microseconds taken.  
   * @param object $response  The response.  
   */  
  function _logTransaction($operation, $elapsed, $response, $errors) {  
   $values = $this->_parseNameValueList($response);  
   $token = isset($values['TOKEN']) ? $values['TOKEN'] : '';  
   $token = preg_replace('/[^0-9.A-Z\-]/', '', urldecode($token));  
   $success = false;  
   if ($response) {  
    if ((isset($values['RESULT']) && $values['RESULT'] == 0) || (isset($values['ACK']) && (strstr($values['ACK'],'Success') || strstr($values['ACK'],'SuccessWithWarning')) && !strstr($values['ACK'],'Failure'))) {  
     $success = true;  
    }  
   }  
   $message =  date('Y-m-d h:i:s') . "\n-------------------\n";  
   $message .= '(' . $this->_server . ' transaction) --> ' . $this->_endpoints[$this->_server] . "\n";  
   $message .= 'Request Headers: ' . "\n" . $this->_sanitizeLog($this->lastHeaders) . "\n\n";  
   $message .= 'Request Parameters: {' . $operation . '} ' . "\n" . urldecode($this->_sanitizeLog($this->_parseNameValueList($this->lastParamList))) . "\n\n";  
   $message .= 'Response: ' . "\n" . urldecode($this->_sanitizeLog($values)) . $errors;  
   if ($this->_logLevel > 0 || $success == FALSE) {  
    $this->log($message, $token);  
    // extra debug email: //  
    if (MODULE_PAYMENT_PAYPALWPP_DEBUGGING == 'Log and Email') {  
     zen_mail(STORE_NAME, STORE_OWNER_EMAIL_ADDRESS, 'PayPal Debug log - ' . $operation, $message, STORE_OWNER, STORE_OWNER_EMAIL_ADDRESS, array('EMAIL_MESSAGE_HTML'=>nl2br($message)), 'debug');  
    }  
    $this->log($operation . ', Elapsed: ' . $elapsed . 'ms -- ' . (isset($values['ACK']) ? $values['ACK'] : ($success ? 'Succeeded' : 'Failed')) . $errors, $token);  
    if (!$response) {  
     $this->log('No response from server' . $errors, $token);  
    } else {  
     if ((isset($values['RESULT']) && $values['RESULT'] != 0) || strstr($values['ACK'],'Failure')) {  
      $this->log($response . $errors, $token);  
     }  
    }  
   }  
  }  
  /**  
   * Strip sensitive information (passwords, credit card numbers, cvv2 codes) from requests/responses.  
   *  
   * @access protected  
   *  
   * @param mixed $log The log to sanitize.  
   * @return string The sanitized (and string-ified, if necessary) log.  
   */  
  function _sanitizeLog($log, $allsensitive = false) {  
   if (is_array($log)) {  
    foreach (array_keys($log) as $key) {  
     switch (strtolower($key)) {  
      case 'pwd':  
      case 'cvv2':  
       $log[$key] = str_repeat('*', strlen($log[$key]));  
       break;  
      case 'signature':  
      case 'acct':  
       $log[$key] = str_repeat('*', strlen(substr($log[$key], 0, -4))) . substr($log[$key], -4);  
       break;  
      case 'solutiontype':  
       unset($log[$key]);  
       break;  
     }  
     if ($allsensitive && in_array($key, array('BUTTONSOURCE', 'VERSION', 'SIGNATURE', 'USER', 'VENDOR', 'PARTNER', 'PWD', 'VERBOSITY'))) unset($log[$key]);  
    }  
    return print_r($log, true);  
   } else {  
    return $log;  
   }  
  }  
  function log($message, $token = '') {  
   static $tokenHash;  
   if ($tokenHash == '') $tokenHash = '_' . zen_create_random_value(4);  
   if ($token == '') $token = $_SESSION['paypal_ec_token'];  
   if ($token == '') $token = time();  
   $token .= $tokenHash;  
   $file = $this->_logDir . '/' . 'Paypal_CURL_' . $token . '.log';  
   if ($fp = @fopen($file, 'a')) {  
    fwrite($fp, $message . "\n\n");  
    fclose($fp);  
   }  
  }  
  /**  
   * Check whether API credentials are supplied, or if is blank  
   *  
   * @return boolean  
   */  
  function checkHasApiCredentials()  
  {  
   return ($this->_mode == 'nvp' && ($this->_user == '' || $this->_pwd == '')) ? FALSE : TRUE;  
  }  
  /**  
   * Return the current time including microseconds.  
   *  
   * @access protected  
   *  
   * @return integer Current time with microseconds.  
   */  
  function _getMicroseconds() {  
   list($ms, $s) = explode(' ', microtime());  
   return floor($ms * 1000) + 1000 * $s;  
  }  
  /**  
   * Return the difference between now and $start in microseconds.  
   *  
   * @access protected  
   *  
   * @param integer $start Start time including microseconds.  
   *  
   * @return integer Number of microseconds elapsed since $start  
   */  
  function _getElapsed($start) {  
   return $this->_getMicroseconds() - $start;  
  }  
 }  
 /**  
  * Convert HTML comments to readable text  
  * @param string $string  
  * @return string  
  */  
 function zen_uncomment($string) {  
  return str_replace(array('<!-- ', ' -->'), array('[', ']'), $string);  
 }  

Related Posts:

  • Color Scheme for website If you are looking to create a website. You must go form scratch. Scratch help you to design a good layout. For designing a website the first thing you need to think about colors. what should be the color of your website. Le… Read More
  • Magento dimensional magento free download If you want to to set you custom dimensional shipping in magento according to height, width, length and weight you can use this extension. To use this extension you should have little bit knowledge about php. You need t… Read More
  • How to make a website responsive without boostrap Hi every one, This post will let you know you can make a website responsive without using boostrap. There are some simple css techniques which you have to use like meadia screen, maxwidth, minwith e.t.c..... what you choul… Read More
  • html formatted contact form with attachment link If you are looking for a contact form which can send html formatted email to the recipient and if you have little bit knowledge about php you can try this html contact form with attachment link. it will send a html formatted… Read More
  • How to test mobile web page and application When you are building a webpage or an application for mobile. It is required to test before you go live or send it to store repository. Testing gives you a good idea to find out errors in application. Once the errors are in… Read More

0 comments:

Post a Comment