Spade
Mini Shell
| Directory:~$ /proc/self/root/home/lmsyaran/public_html/plugins/hikashoppayment/paypalpro/ |
| [Home] [System Details] [Kill Me] |
<?php
/**
* @package HikaShop for Joomla!
* @version 4.4.1
* @author hikashop.com
* @copyright (C) 2010-2021 HIKARI SOFTWARE. All rights reserved.
* @license GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
*/
defined('_JEXEC') or die('Restricted access');
?><?php
class plgHikashoppaymentPaypalpro extends hikashopPaymentPlugin
{
var $accepted_currencies = array( 'USD', 'GBP',
'EUR', 'JPY', 'CAD', 'AUD' );
var $multiple = true;
var $name = 'paypalpro';
var $pluginConfig = array(
'login' => array('HIKA_USERNAME',
'input'),
'password' => array('HIKA_PASSWORD',
'input'),
'signature' => array('SIGNATURE',
'input'),
'environnement' => array('ENVIRONNEMENT',
'list',array(
'production' => 'HIKA_PRODUCTION',
'sandbox' => 'HIKA_SANDBOX',
'beta-sandbox' => 'Beta-Sandbox'
)),
'instant_capture' => array('Instant Capture',
'boolean','0'),
'ask_ccv' => array('Ask CCV',
'boolean','1'),
'details' => array('SEND_DETAILS_OF_ORDER',
'boolean','1'),
'send_order_id' => array('Send order id',
'boolean','0'),
'send_notification' => array('ORDER_NOTIFICATION',
'boolean','0'),
'debug' => array('DEBUG',
'boolean','0'),
'cancel_url' => array('CANCEL_URL',
'input'),
'return_url' => array('RETURN_URL',
'input'),
'verified_status' => array('VERIFIED_STATUS',
'orderstatus')
);
function needCC(&$method) {
$method->ask_cc = true;
if( $method->payment_params->ask_ccv ) {
$method->ask_ccv = true;
}
return true;
}
function onBeforeOrderCreate(&$order, &$do) {
if(parent::onBeforeOrderCreate($order, $do) === true)
return true;
$this->ccLoad();
$amount =
round($order->cart->full_total->prices[0]->price_value_with_tax,(int)$this->currency->currency_locale['int_frac_digits']);
$vars = array(
'USER' => $this->payment_params->login,
'PWD' => $this->payment_params->password,
'SIGNATURE' => $this->payment_params->signature,
'VERSION' => '51.0',
'METHOD' => 'DoDirectPayment',
'PAYMENTACTION' =>
$this->payment_params->instant_capture?'Sale':'Authorization',
'AMT' => $amount,
'ACCT' => $this->cc_number,
'EXPDATE' =>
$this->cc_month.'20'.$this->cc_year,
'FIRSTNAME' =>
$order->cart->billing_address->address_firstname,
'LASTNAME' =>
$order->cart->billing_address->address_lastname,
'CURRENCYCODE' => $this->currency->currency_code,
'EMAIL' => $this->user->user_email,
'STREET' =>
@$order->cart->billing_address->address_street,
'STREET2' =>
@$order->cart->billing_address->address_street2,
'CITY' =>
@$order->cart->billing_address->address_city,
'STATE' =>
@$order->cart->billing_address->address_state->zone_name,
'COUNTRYCODE' =>
@$order->cart->billing_address->address_country->zone_code_2,
'ZIP' =>
@$order->cart->billing_address->address_post_code,
'BUTTONSOURCE' => 'HikariSoftware_Cart_DP'
);
if(@$this->payment_params->send_order_id){
$database = JFactory::getDBO();
$database->setQuery('SELECT MAX(order_id) FROM
#__hikashop_order;');
$max = (int)$database->loadResult();
$vars['INVNUM'] = $max+1;
}
if(!empty($order->cart->billing_address->address_street2)){
$vars['STREET2'] =
substr($order->cart->billing_address->address_street2,0,99);
}
if(!empty($order->cart->shipping_address)){
$vars['SHIPTONAME'] =
@$order->cart->shipping_address->address_firstname.'
'.@$order->cart->shipping_address->address_lastname;
$vars['SHIPTOSTREET'] =
@$order->cart->shipping_address->address_street;
$vars['SHIPTOSTREET2'] =
@$order->cart->shipping_address->address_street2;
$vars['SHIPTOCITY'] =
@$order->cart->shipping_address->address_city;
if(in_array(@$order->cart->shipping_address->address_country->zone_code_2,
array('US'))){
$vars['SHIPTOSTATE'] =
@$order->cart->shipping_address->address_state->zone_code_3;
}else{
$vars['SHIPTOSTATE'] =
@$order->cart->shipping_address->address_state->zone_name;
}
$vars['SHIPTOCOUNTRY'] =
@$order->cart->shipping_address->address_country->zone_code_2;
$vars['SHIPTOZIP'] =
@$order->cart->shipping_address->address_post_code;
$vars['SHIPTOPHONENUM'] =
@$order->cart->shipping_address->address_phone;
}
if(!isset($this->payment_params->details))
$this->payment_params->details = 1;
if(!empty($this->payment_params->details)){
$vars_without_details = $vars;
$i = 1;
$tax = 0;
$config =& hikashop_config();
$group = $config->get('group_options',0);
foreach($order->cart->products as $product){
if($group && $product->order_product_option_parent_id)
continue;
if($product->order_product_quantity<1) continue;
$vars["L_NAME".$i] =
substr(strip_tags($product->order_product_name),0,127);
$vars["L_NUMBER".$i] = $product->order_product_code;
$vars["L_AMT".$i] =
round($product->order_product_price,(int)$this->currency->currency_locale['int_frac_digits']);
$vars["L_QTY".$i] = $product->order_product_quantity;
$vars["L_TAXAMT".$i] =
round($product->order_product_tax,(int)$this->currency->currency_locale['int_frac_digits']);
$tax +=
round($product->order_product_tax,(int)$this->currency->currency_locale['int_frac_digits'])*$product->order_product_quantity;
$i++;
}
if(bccomp($tax,0,5)){
$vars['TAXAMT'] = round($tax + @$order->order_shipping_tax
+ @$order->order_payment_tax - $order->order_discount_tax,
(int)$this->currency->currency_locale['int_frac_digits']);
}
if(!empty($order->cart->coupon)){
$discount = -
round($order->order_discount_price,(int)$this->currency->currency_locale['int_frac_digits']);
$vars["L_NAME".$i] = JText::_('HIKASHOP_COUPON');
$vars["L_NUMBER".$i] = 'coupon';
$vars["L_AMT".$i] = $discount;
$vars["L_QTY".$i] = 1;
$vars["L_TAXAMT".$i] = 0;
$i++;
}
if(!empty($order->order_payment_price) &&
bccomp($order->order_payment_price, 0, 5)) {
$vars["L_NAME".$i] = JText::_('HIKASHOP_PAYMENT');
$vars["L_NUMBER".$i] = 'payment';
$vars["L_AMT".$i] = round($order->order_payment_price -
@$order->order_payment_tax,
(int)$this->currency->currency_locale['int_frac_digits']);
$vars["L_QTY".$i] = 1;
$vars["L_TAXAMT".$i] = round(@$order->order_payment_tax,
(int)$this->currency->currency_locale['int_frac_digits']);
$i++;
}
if(!empty($order->order_shipping_price) &&
bccomp($order->order_shipping_price,0,5)){
$vars['SHIPPINGAMT'] = round($order->order_shipping_price,
(int)$this->currency->currency_locale['int_frac_digits']);
}
$vars['ITEMAMT']=$vars['AMT']-(@$vars['TAXAMT']+@$vars['SHIPPINGAMT']);
if($vars['ITEMAMT']==0){
$vars = $vars_without_details;
}
}
if( $this->payment_params->ask_ccv ) {
$vars['CVV2'] = $this->cc_CCV;
}
if( $this->payment_params->debug ) {
echo print_r($vars, true) . "\n\n\n";
}
$session = curl_init();
curl_setopt($session, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($session, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($session, CURLOPT_POST, 1);
curl_setopt($session, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($session, CURLOPT_VERBOSE, 1);
curl_setopt($session, CURLOPT_FOLLOWLOCATION, 0);
curl_setopt($session, CURLOPT_SSLVERSION, 6);
curl_setopt($session, CURLOPT_FAILONERROR, true);
$httpsHikashop = str_replace('http://','https://',
HIKASHOP_LIVE);
$url = 'api-3t.paypal.com/nvp';
if( $this->payment_params->environnement != 'production'
) {
$url =
'api-3t.'.$this->payment_params->environnement.'.paypal.com/nvp';
}
if( $this->payment_params->debug ) {
echo print_r($url, true) . "\n\n\n";
}
$tmp = array();
foreach($vars as $k => $v) {
$tmp[] = $k . '=' . urlencode(trim($v));
}
$tmp = implode('&', $tmp);
curl_setopt($session, CURLOPT_URL, 'https://' . $url);
curl_setopt($session, CURLOPT_REFERER, $httpsHikashop);
curl_setopt($session, CURLOPT_POSTFIELDS, $tmp);
$ret = curl_exec($session);
$error = curl_errno($session);
if( !$error ) {
$params = explode('&', $ret);
$ret = array();
foreach($params as $p) {
$t = explode('=', $p);
$ret[strtoupper($t[0])] = $t[1];
}
if( $this->payment_params->debug ) {
echo print_r($ret, true) . "\n\n\n";
}
$responseCode = null;
if( isset($ret['ACK']) ) {
$responseCode = strtoupper($ret['ACK']);
}
if( isset($responseCode) ) {
if( $responseCode == 'SUCCESS' || $responseCode ==
'SUCCESSWITHWARNING' ) {
$history = array(
'notified' =>
(int)@$this->payment_params->send_notification,
'data' => 'PayPal transaction id: '
.$ret['TRANSACTIONID'],
);
$this->modifyOrder($order,
$this->payment_params->verified_status, $history, false);
$this->transaction_id = $ret['TRANSACTIONID'];
} else {
$message = 'Error';
if(!empty($ret['ERRORCODE'])){
$message.=' '.$ret['ERRORCODE'];
}elseif(!empty($ret['L_ERRORCODE0'])){
$message.=' '.$ret['L_ERRORCODE0'];
}
if(!empty($ret['LONGMESSAGE'])){
$message.=': '.urldecode($ret['LONGMESSAGE']);
}elseif(!empty($ret['L_LONGMESSAGE0'])){
$message.=':
'.urldecode($ret['L_LONGMESSAGE0']);
}
$this->app->enqueueMessage($message);
$do = false;
}
} else {
$this->app->enqueueMessage('An error occurred. No response
code in PayPal Pro server\'s response');
$do = false;
}
} else {
$this->app->enqueueMessage('An error occurred. The connection
to the PayPal Pro server could not be established:
'.curl_error($session));
$do = false;
}
curl_close($session);
$this->ccClear();
return true;
}
function onAfterOrderCreate(&$order, &$do) {
$this->loadOrderData($order);
$this->loadPaymentParams($order);
if(hikashop_isClient('administrator'))
return true;
if(empty($order->order_payment_method) ||
$order->order_payment_method != $this->name)
return true;
if(empty($this->payment_params))
return false;
if(!empty($this->transaction_id)){
$email = new stdClass();
$email->subject =
JText::sprintf('PAYMENT_NOTIFICATION_FOR_ORDER','PayPal
Pro','SUCCESS',$order->order_number);
$url =
HIKASHOP_LIVE.'administrator/index.php?option=com_hikashop&ctrl=order&task=listing';
$order_text =
"\r\n".JText::sprintf('NOTIFICATION_OF_ORDER_ON_WEBSITE',$order->order_number,HIKASHOP_LIVE);
$order_text .=
"\r\n".str_replace('<br/>',"\r\n",JText::sprintf('ACCESS_ORDER_WITH_LINK',$url));
$body =
str_replace('<br/>',"\r\n",JText::sprintf('PAYMENT_NOTIFICATION_STATUS','PayPal
Pro','SUCCESS')).'
'.JText::sprintf('ORDER_STATUS_CHANGED',$order->order_status)."\r\n\r\n".$order_text;
$email->body = $body;
$this->modifyOrder($order,$order->order_status,false,$email);
$cartClass = hikashop_get('class.cart');
$cartClass->cleanCartFromSession(false);
}
}
function onAfterOrderConfirm(&$order, &$methods,$method_id) {
parent::onAfterOrderConfirm($order, $methods,$method_id);
return $this->showPage('thanks');
}
function onPaymentConfiguration(&$element){
parent::onPaymentConfiguration($element);
$obj = $element;
$field = '';
if(empty($obj->payment_params->login)) {
$field = JText::_('USERNAME');
} elseif(empty($obj->payment_params->password)) {
$field = JText::_('PASSWORD');
} elseif(empty($obj->payment_params->signature)) {
$field = JText::_('SIGNATURE');
}
if(!empty($field)) {
$app = JFactory::getApplication();
$lang = JFactory::getLanguage();
$locale=strtolower(substr($lang->get('tag'), 0, 2));
$app->enqueueMessage(JText::sprintf('ENTER_INFO_REGISTER_IF_NEEDED','PayPal
Pro',$field,'PayPal
Pro','https://www.paypal.com/'.$locale.'/mrb/pal=SXL9FKNKGAEM8'));
}
if(!empty($element->payment_params->details)){
$config = hikashop_config();
$round_calculations = $config->get('round_calculations');
if(empty($round_calculations)){
$app = JFactory::getApplication();
$app->enqueueMessage('When you activate the "Send details
of the order" setting, PayPal calculate itself the total amount and
round prices during calculations. So you need to have option "Round
prices during calculations" turned on in the HikaShop configuration in
order for HikaShop to calculate the total in the same way. Otherwise, you
might get payments with an amount different than the total amount of the
orders and it will create an error.');
}
}
}
function getPaymentDefaultValues(&$element) {
$element->payment_name='PayPal Pro';
$element->payment_description='You can pay by credit card using
this payment method';
$element->payment_images='MasterCard,VISA,Credit_card,Discover';
$element->payment_params->login='';
$element->payment_params->password='';
$element->payment_params->ask_ccv = true;
$element->payment_params->pending_status='created';
$element->payment_params->verified_status='confirmed';
}
}