Spade

Mini Shell

Directory:~$ /home/lmsyaran/public_html/joomla4/
Upload File

[Home] [System Details] [Kill Me]
Current File:~$ /home/lmsyaran/public_html/joomla4/paypaladaptive.zip

PK\^�[�#o,,
index.htmlnu�[���<html><body
bgcolor="#FFFFFF"></body></html>PK\^�[W��}����paypaladaptive.phpnu�[���<?php
/**
 * @package    HikaMarket for Joomla!
 * @version    3.1.1
 * @author     Obsidev S.A.R.L.
 * @copyright  (C) 2011-2020 OBSIDEV. All rights reserved.
 * @license    GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */
defined('_JEXEC') or die('Restricted access');
?><?php
class plgHikashoppaymentPaypalAdaptive extends hikashopPaymentPlugin
{
	public $accepted_currencies = array(
		'AUD','BRL','CAD','CHF','CZK','DKK','EUR','GBP','HKD','HUF','ILS','JPY',
		'MYR','MXN','NOK','NZD','PHP','PLN','SGD','SEK','TWD','THB','TRY','USD'
	);

	public $multiple = true;
	public $name = 'paypaladaptive';
	public $doc_form = 'paypaladaptive';

	public $market_support = true;

	private $payment_urls = array(
		'production' =>
'https://svcs.paypal.com/AdaptivePayments/Pay',
		'sandbox' =>
'https://svcs.sandbox.paypal.com/AdaptivePayments/Pay'
	);
	private $return_urls = array(
		'redirect' => array(
			'production' =>
'https://www.paypal.com/webscr?cmd=_ap-payment',
			'sandbox' =>
'https://www.sandbox.paypal.com/webscr?cmd=_ap-payment',
		),
		'popup' => array(
			'production' =>
'https://www.paypal.com/webapps/adaptivepayment/flow/pay',
			'sandbox' =>
'https://www.sandbox.paypal.com/webapps/adaptivepayment/flow/pay'
		)
	);
	private $communication_formats = array(
		'nv' => 'NV',
		'xml' => 'XML',
		'json' => 'JSON'
	);
	private $fees_formats = array(
		'each' => 'EACHRECEIVER', // default
		'sender' => 'SENDER',
		'primary' => 'PRIMARYRECEIVER', // chained payment
only
		'secondary' => 'SECONDARYONLY' // chained payment
only
	);
	private $display_modes = array(
		'redirect',
		'popup'
	);

	private function initMarket() {
		static $init = null;
		if($init !== null)
			return $init;

		$init = defined('HIKAMARKET_COMPONENT');
		if(!$init) {
			$filename =
rtrim(JPATH_ADMINISTRATOR,DS).DS.'components'.DS.'com_hikamarket'.DS.'helpers'.DS.'helper.php';
			if(file_exists($filename)) {
				include_once($filename);
				$init = defined('HIKAMARKET_COMPONENT');
			}
		}
		return $init;
	}

	public function checkPaymentDisplay(&$method, &$order) {
		if(!function_exists('curl_init')) {
			$app = JFactory::getApplication();
			$app->enqueueMessage(JText::_('CURL_NOT_FOUND'),
'error');
			return false;
		}
		return true;
	}

	public function onAfterOrderConfirm(&$order, &$methods,
$method_id) {
		parent::onAfterOrderConfirm($order, $methods, $method_id);

		if(!empty($this->payment_params->classical)) {
			return $this->afterOrderConfirm_Classical($order, $methods,
$method_id);
		}
		return $this->afterOrderConfirm_Adaptive($order, $methods,
$method_id);
	}

	private function afterOrderConfirm_Adaptive(&$order, &$methods,
$method_id) {
		if(empty($this->payment_params->username) ||
empty($this->payment_params->password) ||
empty($this->payment_params->signature) ||
empty($this->payment_params->email)) {
			$this->app->enqueueMessage('Please check your
&quot;paypal adaptive&quot; plugin configuration');
			return false;
		}

		if($this->currency->currency_locale['int_frac_digits']
> 2)
			$this->currency->currency_locale['int_frac_digits'] =
2;

		if(!isset($this->payment_params->sandbox) &&
isset($this->payment_params->debug))
			$this->payment_params->sandbox =
$this->payment_params->debug;

		$ip = hikashop_getIp();
		if(empty($ip)) $ip = '127.0.0.1';
		if(strpos($ip, ':') !== false)
			$ip = '';

		$url = $this->payment_urls[ $this->payment_params->sandbox ?
'sandbox' : 'production' ];
			$format = 'nv';
		if(empty($this->payment_params->fee_mode))
			$this->payment_params->fee_mode = 'each';
		if(empty($this->payment_params->payment_mode))
			$this->payment_params->payment_mode = 'chained';
		if(empty($this->payment_params->store_secondary))
			$this->payment_params->store_secondary = false;

		$display_mode = @$this->payment_params->display_mode;
		if(!in_array($display_mode, $this->display_modes))
			$display_mode = reset($this->display_modes);

		$notify_url =
HIKASHOP_LIVE.'index.php?option=com_hikashop&ctrl=checkout&task=notify&notif_payment='.$this->name.'&order_id='.$order->order_id.'&tmpl=component&lang='.$this->locale
. $this->url_itemid;
		if($display_mode == 'redirect') {
			$return_url =
HIKASHOP_LIVE.'index.php?option=com_hikashop&ctrl=checkout&task=after_end&order_id='.$order->order_id
. $this->url_itemid;
			$cancel_url =
HIKASHOP_LIVE.'index.php?option=com_hikashop&ctrl=order&task=cancel_order&order_id='.$order->order_id
. $this->url_itemid;
		} else {
			$return_url =
HIKASHOP_LIVE.'index.php?option=com_hikashop&ctrl=checkout&task=notify&notif_payment='.$this->name.'&mode=popup&subtask=after_end&order_id='.$order->order_id.'&tmpl=component&lang='.$this->locale
. $this->url_itemid;
			$cancel_url =
HIKASHOP_LIVE.'index.php?option=com_hikashop&ctrl=checkout&task=notify&notif_payment='.$this->name.'&mode=popup&subtask=cancel_order&order_id='.$order->order_id.'&tmpl=component&lang='.$this->locale
. $this->url_itemid;
		}

		if($this->payment_params->sandbox)
			$this->payment_params->applicationid =
'APP-80W284485P519543T';

		if(!isset($this->fees_formats[ $this->payment_params->fee_mode
]) || ($this->payment_params->payment_mode != 'chained'
&& in_array($this->payment_params->payment_mode,
array('primary','secondary'))))
			$this->payment_params->fee_mode = 'each';
		$fee = $this->fees_formats[ $this->payment_params->fee_mode ];

		$headers = array(
			'X-PAYPAL-SECURITY-USERID: ' .
$this->payment_params->username, //
'tok261_biz_api.abc.com'
			'X-PAYPAL-SECURITY-PASSWORD: ' .
$this->payment_params->password, // '1244612379'
			'X-PAYPAL-SECURITY-SIGNATURE: ' .
$this->payment_params->signature, // 'lkfg9groingghb4uw5'
			'X-PAYPAL-DEVICE-IPADDRESS: ' . $ip,
			'X-PAYPAL-REQUEST-DATA-FORMAT: ' .
$this->communication_formats[$format],
			'X-PAYPAL-RESPONSE-DATA-FORMAT: ' .
$this->communication_formats[$format],
			'X-PAYPAL-APPLICATION-ID: ' .
$this->payment_params->applicationid, //
'APP-80W284485P519543T'
		);
		if(empty($ip))
			unset($headers[3]);

		$struct = array(
			'requestEnvelope' => array(
				'errorLanguage' => 'en_US'
			),
			'actionType' => 'PAY',
			'currencyCode' => $this->currency->currency_code,
			'receiverList' => array(),
			'feesPayer' => $fee,
			'trackingId' =>
$order->order_id.'#'.uniqid(),
			'cancelUrl' => $cancel_url,
			'returnUrl' => $return_url,
			'ipnNotificationUrl' => $notify_url,
			'reverseAllParallelPaymentsOnError' =>
(@$this->payment_params->reverse_all_on_error ? 'true' :
'false'),
			'clientDetails' => array(
				'applicationId' =>
$this->payment_params->applicationid,
				'ipAddress' => $ip,
				'customerId' => $this->user->user_id
			)
		);
		if(empty($ip))
			unset($struct['clientDetails']['ipAddress']);

		$db = JFactory::getDBO();
		$suborders = array();
		$vendors = array();
		$order_id = $order->order_id;
		if($order_id > 0 && $this->initMarket()) {
			$query = 'SELECT b.*, a.* FROM ' .
hikamarket::table('shop.order') . ' AS a LEFT JOIN ' .
hikamarket::table('vendor') . ' AS b ON a.order_vendor_id =
b.vendor_id WHERE a.order_parent_id = ' . $order_id;
			$db->setQuery($query);
			$suborders = $db->loadObjectList();
		}

		if(!empty($suborders)) {
			$full_amount =
round($order->cart->full_total->prices[0]->price_value_with_tax,
(int)$this->currency->currency_locale['int_frac_digits']);
			$store_amount = $full_amount;

			if($this->payment_params->payment_mode != 'chained' ||
!empty($this->payment_params->store_secondary)) {
				foreach($suborders as $k => $suborder) {
					if((int)$suborder->order_vendor_id <= 1)
						continue;

					$paypal_email = $suborder->vendor_email;
					if(!empty($suborder->vendor_params))
						$suborder->vendor_params =
unserialize($suborder->vendor_params);
					if(!empty($suborder->vendor_params->paypal_email))
						$paypal_email = $suborder->vendor_params->paypal_email;

					$paypal_email = trim($paypal_email);
					if(strpos($paypal_email, '@') === false)
						continue;

					$p = round(hikashop_toFloat($suborder->order_vendor_price),
(int)$this->currency->currency_locale['int_frac_digits']);
					if($p >= 0) {
						$store_amount -= $p;
					} else {
						$store_amount -=
round(hikashop_toFloat($suborder->order_vendor_price) +
$order->cart->full_total->prices[0]->price_value_with_tax,
(int)$this->currency->currency_locale['int_frac_digits']);
					}
				}
			}

			$e = array(
				'email' => $this->payment_params->email,
				'amount' => $store_amount
			);
			if($this->payment_params->payment_mode == 'chained')
				$e['primary'] =
empty($this->payment_params->store_secondary) ? 'true' :
'false';
			if($store_amount > 0)
				$struct['receiverList'][] = $e;

			$vendor_primary = empty($this->payment_params->store_secondary) ?
'false' : 'true';

			foreach($suborders as $k => $suborder) {
				$price = round(hikashop_toFloat($suborder->order_vendor_price),
(int)$this->currency->currency_locale['int_frac_digits']);
				if($price < 0) {
					$price = round(hikashop_toFloat($suborder->order_vendor_price) +
$order->cart->full_total->prices[0]->price_value_with_tax,
(int)$this->currency->currency_locale['int_frac_digits']);
				}

				if($suborder->order_vendor_price == 0.0 ||
(int)$suborder->order_vendor_id <= 1)
					continue;

				$paypal_email = $suborder->vendor_email;
				if(!empty($suborder->vendor_params) &&
is_string($suborder->vendor_params))
					$suborder->vendor_params =
unserialize($suborder->vendor_params);
				if(!empty($suborder->vendor_params->paypal_email))
					$paypal_email = $suborder->vendor_params->paypal_email;

				$paypal_email = trim($paypal_email);
				if(strpos($paypal_email, '@') === false)
					continue;

				$vendors[$suborder->order_vendor_id] = array(
					'email' => $paypal_email,
					'name' => $suborder->vendor_name,
					'params' => $suborder->vendor_params
				);

				$e = array(
					'email' => $paypal_email,
					'amount' => $price
				);
				if($this->payment_params->payment_mode == 'chained') {
					$e['primary'] = $vendor_primary;
					if($vendor_primary == 'true')
						$e['amount'] = $full_amount;
				}
				$vendor_primary = 'false';
				$struct['receiverList'][] = $e;
			}

			if($vendor_primary == 'true' ||
count($struct['receiverList']) == 1) {
				foreach($struct['receiverList'] as $k => $receiver) {
					unset($struct['receiverList'][$k]['primary']);
				}
			}

		} else {
			$struct['receiverList'][] = array(
				'email' => $this->payment_params->email,
				'amount' =>
round($order->cart->full_total->prices[0]->price_value_with_tax,
(int)$this->currency->currency_locale['int_frac_digits'])
			);
		}

		if(!empty($this->payment_params->debug)) {
			echo '<pre>';
			print_r($struct);
			echo '</pre>';
		}

		$res = $this->submitPaypalData($url, $headers, $struct, $format);

		if(isset($res['responseEnvelope.ack']) &&
strtolower($res['responseEnvelope.ack']) == 'failure')
{
			$removed_vendors = array();

			do {
				$something_removed = false;
				$failure = false;
				$e = 0;
				$errCode = $res['error('.$e.').errorId'];
				if($errCode == '520009') {
					$errParameter =
trim(urldecode($res['error('.$e.').parameter(0)']));
					if($errParameter == $this->payment_params->email)
						return false;

					foreach($struct['receiverList'] as $k => $receiver) {
						if($receiver['email'] == $errParameter) {
							if($struct['receiverList'][$k]['primary'] !=
'true') {
								$something_removed = true;
								unset($struct['receiverList'][$k]);
							}
						}
					}

					if(!empty($vendors) && $something_removed) {
						foreach($vendors as $id => $vendor) {
							if($vendor['email'] == $errParameter) {
								if(empty($vendor['params']))
									$vendor['params'] = new stdClass();
								$vendor['params']->paypal_email = 'no paypal
account';
								$params = serialize($vendor['params']);
								$db->setQuery('UPDATE
'.hikamarket::table('vendor').' SET vendor_params =
' . $db->Quote($params) . ' WHERE vendor_id = ' . $id);
								$db->execute();
								unset($params);

								if(!empty($this->payment_params->notify_wrong_emails))
									$removed_vendors[$id] = $vendor;
							}
						}
					}

					$res = $this->submitPaypalData($url, $headers, $struct, $format);
					$failure = (isset($res['responseEnvelope.ack']) &&
strtolower($res['responseEnvelope.ack']) ==
'failure');
				}
			} while($failure && $something_removed);

			if(!empty($removed_vendors)) {
				$email = new stdClass();
				$email->subject =
JText::_('INCORRECT_VENDOR_PAYPAL_EMAILS');
				$email->body = str_replace('<br/>',
"\r\n",
JText::_('SOME_VENDORS_HAD_INCORRECT_PAYPAL_EMAILS')) .
"\r\n";
				foreach($removed_vendors as $id => $removed_vendor) {
					$email->body .= $removed_vendor['name'] . ' ('
. $id . ') : ' . $removed_vendor['email'] .
"\r\n";
				}
				$o = false;
				$this->modifyOrder($o, null, null, $email);
			}
		}

		if(!empty($this->payment_params->debug)) {
			echo '<pre>';
			print_r($res);
			echo '</pre>';
		}

		$this->target = '';

		if(isset($res['payKey'])) {
			$this->paykey = $res['payKey'];
			$this->display_mode = $display_mode;
			if($display_mode == 'popup')
				$this->target = 'PPDGFrame';
			$this->return_url = $this->return_urls[ $this->display_mode ][
$this->payment_params->sandbox ? 'sandbox' :
'production' ];
		} else {

			if(isset($res['error(0).message'])) {
				$this->app->enqueueMessage(
urldecode($res['error(0).message']) );
			}

			return false;
		}

		return $this->showPage('end');
	}

	private function afterOrderConfirm_Classical(&$order, &$methods,
$method_id) {
		if($this->currency->currency_locale['int_frac_digits']
> 2)
			$this->currency->currency_locale['int_frac_digits'] =
2;

		$notify_url =
HIKASHOP_LIVE.'index.php?option=com_hikashop&ctrl=checkout&task=notify&notif_payment='.$this->name.'&order_id='.$order->order_id.'&tmpl=component&lang='.$this->locale
. $this->url_itemid;
		$return_url =
HIKASHOP_LIVE.'index.php?option=com_hikashop&ctrl=checkout&task=after_end&order_id='.$order->order_id
. $this->url_itemid;
		$cancel_url =
HIKASHOP_LIVE.'index.php?option=com_hikashop&ctrl=order&task=cancel_order&order_id='.$order->order_id
. $this->url_itemid;

		if(!isset($this->payment_params->sandbox) &&
isset($this->payment_params->debug))
			$this->payment_params->sandbox =
$this->payment_params->debug;

		$tax_total = '';
		$discount_total = '';
		$debug = @$this->payment_params->debug;
		$sandbox = @$this->payment_params->sandbox;
		if(!isset($this->payment_params->no_shipping))
			$this->payment_params->no_shipping = 1;
		if(!empty($this->payment_params->rm))
			$this->payment_params->rm = 2;

		$vars = array(
			'cmd' => '_ext-enter',
			'redirect_cmd' => '_cart',
			'upload' => '1',
			'business' => $this->payment_params->email,
			'receiver_email' => $this->payment_params->email,
			'invoice' => $order->order_id,
			'currency_code' => $this->currency->currency_code,
			'return' => $return_url,
			'notify_url' => $notify_url,
			'cancel_return' => $cancel_url,
			'undefined_quantity' => '0',
			'test_ipn' => $sandbox,
			'no_shipping' => $this->payment_params->no_shipping,
			'no_note' => !@$this->payment_params->notes,
			'charset' => 'utf-8',
			'rm' => (int)@$this->payment_params->rm,
			'bn' => 'ObsidevHikaMarket_Cart_WPS'
		);

		$db = JFactory::getDBO();
		$suborders = array();
		$order_id = $order->order_id;
		if($order_id > 0 && $this->initMarket()) {
			$query = 'SELECT b.*, a.* FROM ' .
hikamarket::table('shop.order') . ' AS a LEFT JOIN ' .
hikamarket::table('vendor') . ' AS b ON a.order_vendor_id =
b.vendor_id ' .
					' WHERE a.order_type = ' .
$db->quote('subsale') . ' AND a.order_parent_id = '
. $order_id;
			$db->setQuery($query);
			$suborders = $db->loadObjectList();
		}
		if(!empty($suborders)) {
			$cpt = 0;
			$suborder_id = -1;
			foreach($suborders as $k => $suborder) {
				if($suborder->order_vendor_price == 0.0 ||
(int)$suborder->order_vendor_id <= 1)
					continue;
				$suborder_id = $k;
				$cpt++;
			}
			if($cpt == 1) {
				$suborder = $suborders[$suborder_id];
				$suborder_id = (int)$suborder->order_id;
				if(is_string($suborder->vendor_params) &&
!empty($suborder->vendor_params))
					$suborder->vendor_params =
unserialize($suborder->vendor_params);
				$paypal_email = @$suborder->vendor_params->paypal_email;

				if(!empty($paypal_email)) {
					$vars['business'] = $paypal_email;
					$vars['receiver_email'] = $paypal_email;

					$order_vendor_price =
(float)hikamarket::toFloat($suborder->order_vendor_price);

					if($order_vendor_price > 0) {
						$order_vendor_price = $order_vendor_price -
$order->order_full_price;

						$order_payment_params = $suborder->order_payment_params;
						if(!empty($order_payment_params) &&
is_string($order_payment_params))
							$order_payment_params = unserialize($order_payment_params);
						else
							$order_payment_params = new stdClass();
						$order_payment_params->market_mode = 'commission';
						$order_payment_params = serialize($order_payment_params);

						$query = 'UPDATE ' .
hikamarket::table('shop.order') . ' SET order_vendor_price =
'.$db->Quote($order_vendor_price) . ', order_payment_params =
' . $db->Quote($order_payment_params).' WHERE order_id =
'.(int)$suborder_id;
						$db->setQuery($query);
						$db->execute();
					}
				}
			}
		}

		if(!empty($this->payment_params->address_type)) {
			$address_type = $this->payment_params->address_type .
'_address';
			$address = $this->app->getUserState(HIKASHOP_COMPONENT .
'.' . $address_type);
			if(!empty($address)) {
				if(!isset($this->payment_params->address_override)) {
					$this->payment_params->address_override = '1';
				}

				$vars['address_override'] =
$this->payment_params->address_override;
				$vars['first_name'] =
@$order->cart->$address_type->address_firstname;
				$vars['last_name'] =
@$order->cart->$address_type->address_lastname;
				$address1 = '';
				$address2 = '';

				if(!empty($order->cart->$address_type->address_street2))
					$address2 =
substr($order->cart->$address_type->address_street2, 0, 99);

				if(!empty($order->cart->$address_type->address_street)) {
					if(strlen($order->cart->$address_type->address_street) >
100) {
						$address1 =
substr($order->cart->$address_type->address_street, 0, 99);
						if(empty($address2))
							$address2 =
substr($order->cart->$address_type->address_street, 99, 199);
					} else {
						$address1 = $order->cart->$address_type->address_street;
					}
				}

				$vars['address1'] = $address1;
				$vars['address2'] = $address2;
				$vars['zip'] =
@$order->cart->$address_type->address_post_code;
				$vars['city'] =
@$order->cart->$address_type->address_city;
				if((!isset($order->cart->$address_type->address_state->zone_code_3)
||
is_numeric($order->cart->$address_type->address_state->zone_code_3))
&&
!empty($order->cart->$address_type->address_country->zone_name)){
					$vars['state'] =
@$order->cart->$address_type->address_state->zone_name;
				}else{
					$vars['state'] =
@$order->cart->$address_type->address_state->zone_code_3;
				}
				$vars['country'] =
@$order->cart->$address_type->address_country->zone_code_2;
				$vars['email'] = $this->user->user_email;
				$vars['night_phone_b'] =
@$order->cart->$address_type->address_telephone;

			}
elseif(!empty($order->cart->billing_address->address_country->zone_code_2))
{
				$vars['lc'] =
$order->cart->billing_address->address_country->zone_code_2;
			}
		}
elseif(!empty($order->cart->billing_address->address_country->zone_code_2))
{
			$vars['lc'] =
$order->cart->billing_address->address_country->zone_code_2;
		}

		if(!empty($this->payment_params->cpp_header_image)) {
			$vars['cpp_header_image'] =
$this->payment_params->cpp_header_image;
		}

		if(empty($this->payment_params->details)) {
			$vars['amount_1'] =
round($order->cart->full_total->prices[0]->price_value_with_tax,
(int)$this->currency->currency_locale['int_frac_digits']);
			$vars['item_name_1'] =
JText::_('CART_PRODUCT_TOTAL_PRICE');
		} else {
			$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;
				$vars['item_name_' . $i] =
substr(strip_tags($product->order_product_name), 0, 127);
				$vars['item_number_' . $i] =
$product->order_product_code;
				$vars['amount_'.$i] = round($product->order_product_price,
(int)$this->currency->currency_locale['int_frac_digits']);
				$vars['quantity_' . $i] =
$product->order_product_quantity;
				$tax += round($product->order_product_tax,
(int)$this->currency->currency_locale['int_frac_digits']) *
$product->order_product_quantity;
				$i++;
			}

			if(!empty($order->order_shipping_price) &&
bccomp($order->order_shipping_price, 0, 5)) {
				$vars['item_name_' . $i] =
JText::_('HIKASHOP_SHIPPING');
				$vars['amount_' . $i] = round($order->order_shipping_price
- @$order->order_shipping_tax,
(int)$this->currency->currency_locale['int_frac_digits']);
				$tax += round($order->order_shipping_tax,
(int)$this->currency->currency_locale['int_frac_digits']);
				$vars['quantity_' . $i] = 1;
				$i++;
			}

			if(!empty($order->order_payment_price) &&
bccomp($order->order_payment_price, 0, 5)) {
				$vars['item_name_' . $i] =
JText::_('HIKASHOP_PAYMENT');
				$vars['amount_' . $i] = round($order->order_payment_price
- @$order->order_payment_tax,
(int)$this->currency->currency_locale['int_frac_digits']);
				$tax += round($order->order_payment_tax,
(int)$this->currency->currency_locale['int_frac_digits']);
				$vars['quantity_' . $i] = 1;
				$i++;
			}

			if(bccomp($tax, 0, 5))
				$vars['tax_cart'] = $tax;
			if(!empty($order->cart->coupon))
				$vars['discount_amount_cart'] =
round($order->order_discount_price,
(int)$this->currency->currency_locale['int_frac_digits']);
		}

		if((isset($this->payment_params->validation) &&
$this->payment_params->validation) ||
(isset($this->payment_params->enable_validation) &&
!$this->payment_params->enable_validation)) {
			$vars['paymentaction'] = 'authorization';
		}

		if($sandbox)
			$this->return_url =
'https://www.sandbox.paypal.com/cgi-bin/websc';
		else
			$this->return_url =
'https://www.paypal.com/cgi-bin/webscr';

		$this->vars = $vars;
		return $this->showPage('end');
	}

	public function onPaymentNotification(&$statuses) {
		$order_id = 0;
		$order_text = '';

		if(!isset($this->payment_params->sandbox) &&
isset($this->payment_params->debug))
			$this->payment_params->sandbox =
$this->payment_params->debug;

		if(hikaInput::get()->getCmd('mode', '') ==
'popup' &&
hikaInput::get()->getCmd('subtask', '') !=
'') {
			$order_id = (int)@$_GET['order_id'];
			$task = hikaInput::get()->getCmd('subtask', '');
			$doc = JFactory::getDocument();

			$itemId = hikaInput::get()->getInt('Itemid', 0);
			if($itemId > 0)
				$itemId = '&Itemid'.$itemid;
			else
				$itemId = '';

			if($task == 'after_end') {
				$url =
hikashop_completeLink('checkout&task=after_end&order_id='
. $order_id . $itemId);
			} else {
				$url =
hikashop_completeLink('order&task=cancel_order&order_id='
. $order_id . $itemId);
			}

			$doc->addScriptDeclaration('
window.hikashop.ready(function() {
	var fct = top.validatePaypalBox || top.opener.top.validatePaypalBox;
	var dgFlow = top.dgFlow || top.opener.top.dgFlow;
	fct("'.$url.'");
	dgFlow.closeFlow();
	top.close();
});');
			return true;
		}

		$raw_data = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA :
file_get_contents('php://input');
		$ipndata = $this->processIPNdata($raw_data);

		$order_id = (int)@$_GET['order_id'];
		if(isset($ipndata['tracking_id']))
			$order_id = (int)substr($ipndata['tracking_id'], 0,
strpos($ipndata['tracking_id'], '#'));

		$dbOrder = $this->getOrder((int)$order_id);
		$this->loadPaymentParams($dbOrder);
		if(empty($this->payment_params))
			return false;
		$this->loadOrderData($dbOrder);

		if(!isset($ipndata['status']) &&
empty($this->payment_params->classical)) {
			echo 'Paypal classic IPN, not adaptive one';
			return false;
		}

		if($this->payment_params->debug)
			echo print_r($ipndata, true) . "\r\n\r\n";

		if(empty($dbOrder)) {
			echo 'Could not load any order for your notification ' .
$order_id;
			return false;
		}

		$order_text = "\r\n\r\n" . 'Order Id: ' . $order_id;

		if(!empty($this->payment_params->ips)) {
			$ip = hikashop_getIP();
			$ips = str_replace(array('.', '*', ','),
array('\.', '[0-9]+', '|'),
$this->payment_params->ips);
			if(!preg_match('#('.implode('|',$ips).')#',
$ip)) {
				$email = new stdClass();
				$email->subject =
JText::sprintf('NOTIFICATION_REFUSED_FOR_THE_ORDER',
'Paypal') . ' ' .
JText::sprintf('IP_NOT_VALID', $dbOrder->order_number);
				$email->body = str_replace('<br/>',
"\r\n", JText::sprintf('NOTIFICATION_REFUSED_FROM_IP',
'Paypal', $ip, implode("\r\n",
$this->payment_params->ips))) .
					"\r\n\r\n" . JText::sprintf('CHECK_DOCUMENTATION',
HIKASHOP_HELPURL . 'payment-paypal-error#ip') . $order_text;
				$o = false;
				$this->modifyOrder($o, null, null, $email);

				if(HIKASHOP_J30) {
					throw new JAccessExceptionNotallowed(JText::_('Access
Forbidden'), 403);
				} else {
					JError::raiseError(403, JText::_('Access Forbidden'));
				}
				return false;
			}
			$order_text .= "\r\n" . 'IP Address: ' . $ip;
		}

		if($this->payment_params->debug)
			echo print_r($dbOrder, true) . "\r\n\r\n";

		$ipnConfirm = $this->verifyIPN();

		if(empty($response) || !preg_match('#VERIFIED#i', $response))
{
			$notif_urls = array(
				'production' =>
'https://www.paypal.com/webscr',
				'sandbox' =>
'https://www.sandbox.paypal.com/webscr',
			);
			$notif_url = $notif_urls[ $this->payment_params->sandbox ?
'sandbox' : 'production' ];
			$ipnConfirm = $this->sendIPNconfirm($notif_url, $raw_data .
'&cmd=_notify-validate');
		}

		if($this->payment_params->debug)
			echo $ipnConfirm;

		$db = JFactory::getDBO();
		$suborders = array();
		if($order_id > 0 && $this->initMarket()) {
			$query = 'SELECT b.*, a.* FROM ' .
hikamarket::table('shop.order') . ' AS a LEFT JOIN ' .
hikamarket::table('vendor') . ' AS b ON a.order_vendor_id =
b.vendor_id WHERE a.order_parent_id = ' . $order_id;
			$db->setQuery($query);
			$suborders = $db->loadObjectList();
		}

		$verified = preg_match('#VERIFIED#i', $ipnConfirm);
		if(!$verified) {
			if(empty($raw_data))
				$order_text .= "\r\n" . 'Warning: Empty data
received.';

			$email = new stdClass();
			if(preg_match('#INVALID#i', $ipnConfirm)) {
				$email->subject =
JText::sprintf('NOTIFICATION_REFUSED_FOR_THE_ORDER',
'Paypal') . ' invalid transaction';
				$email->body = JText::sprintf("Hello,\r\n A paypal notification
was refused because it could not be verified by the paypal server").
					"\r\n\r\n".JText::sprintf('CHECK_DOCUMENTATION',
HIKASHOP_HELPURL . 'payment-paypal-error#invalidtnx') .
$order_text;
				if($this->payment_params->debug)
					echo 'invalid transaction'."\n\n\n";
			} else {
				$email->subject =
JText::sprintf('NOTIFICATION_REFUSED_FOR_THE_ORDER',
'Paypal') . ' invalid response';
				$email->body = JText::sprintf("Hello,\r\n A paypal notification
was refused because the response from the paypal server was
invalid").
					"\r\n\r\n".JText::sprintf('CHECK_DOCUMENTATION',
HIKASHOP_HELPURL . 'payment-paypal-error#invalidresponse') .
$order_text;

				if($this->payment_params->debug)
					echo 'invalid response'."\n\n\n";
			}
			$o = false;
			$this->modifyOrder($o, null, null, $email);
			return false;
		}

		if(!empty($this->payment_params->classical)) {
			$ipndata['status'] = $ipndata['payment_status'];
		}

		$completed = preg_match('#Completed#i',
$ipndata['status']);
		$pending = preg_match('#Pending#i',
$ipndata['status']);
		if(!$completed && !$pending) {
			$email = new stdClass();
			$email->subject =
JText::sprintf('PAYMENT_NOTIFICATION_FOR_ORDER',
'Paypal', $ipndata['status'],
$dbOrder->order_number);
			$email->body =
str_replace('<br/>',"\r\n",JText::sprintf('PAYMENT_NOTIFICATION_STATUS',
'Paypal', $ipndata['status'])) .
				' ' . JText::_('STATUS_NOT_CHANGED') .
"\r\n\r\n" .
				JText::sprintf('CHECK_DOCUMENTATION',HIKASHOP_HELPURL.'payment-paypal-error#status')
. $order_text;
			$o = false;
			$this->modifyOrder($o, null, null, $email);

			if($this->payment_params->debug)
				echo 'payment ' . $ipndata['status'] .
"\r\n\r\n";
			return false;
		}

		$paypal_ids = array();
		$amount = 0;
		if(empty($this->payment_params->classical)) {
			$receiver_emails = array();
			foreach($ipndata['transaction'] as $transaction) {
				$paypal_ids[] = $transaction['id'];
				$receiver_emails[] = $transaction['receiver'];
			}
			$amount = $ipndata['transaction'][0]['amount'];
		} else {
			$paypal_ids[] = $ipndata['txn_id'];
			$amount = @$ipndata['mc_gross'] .
@$ipndata['mc_currency'];
		}
		echo 'PayPal transaction id: '.implode(', ',
$paypal_ids) . "\r\n\r\n";

		$history = new stdClass();
		$history->notified = 0;
		$history->amount = $amount;
		$history->data = ob_get_clean();

		if($this->currency->currency_locale['int_frac_digits']
> 2)
			$this->currency->currency_locale['int_frac_digits'] =
2;
		$price_check = round($dbOrder->order_full_price,
(int)$this->currency->currency_locale['int_frac_digits']);
		if(!empty($this->payment_params->classical) &&
($price_check != @$ipndata['mc_gross'] ||
$this->currency->currency_code !=
@$ipndata['mc_currency'])) {
			$email = new stdClass();
			$email->subject =
JText::sprintf('NOTIFICATION_REFUSED_FOR_THE_ORDER','Paypal').JText::_('INVALID_AMOUNT');
			$email->body = str_replace('<br/>', "\r\n",
JText::sprintf('AMOUNT_RECEIVED_DIFFERENT_FROM_ORDER',
'Paypal', $history->amount, $price_check .
$this->currency->currency_code)) . "\r\n\r\n" .
JText::sprintf('CHECK_DOCUMENTATION', HIKASHOP_HELPURL .
'payment-paypal-error#amount') . $order_text;

			$this->modifyOrder($order_id,
$this->payment_params->invalid_status, $history, $email);
			return false;
		}

	 	if($completed) {
	 		$order_status = $this->payment_params->verified_status;
	 	} else {
	 		$order_status = $this->payment_params->pending_status;
	 		$order_text = JText::sprintf('CHECK_DOCUMENTATION',
HIKASHOP_HELPURL . 'payment-paypal-error#pending') .
"\r\n\r\n" . $order_text;
	 	}

	 	if($dbOrder->order_status == $order_status)
	 		return true;

		$config = hikashop_config();
		if($config->get('order_confirmed_status',
'confirmed') == $order_status)
			$history->notified = 1;

		$email = new stdClass();
		$email->subject =
JText::sprintf('PAYMENT_NOTIFICATION_FOR_ORDER',
'Paypal', $ipndata['status'],
$dbOrder->order_number);
		$email->body =
str_replace('<br/>',"\r\n",JText::sprintf('PAYMENT_NOTIFICATION_STATUS',
'Paypal', $ipndata['status'])).'
'.JText::sprintf('ORDER_STATUS_CHANGED',$order->mail_status)."\r\n\r\n".$order_text;

	 	$this->modifyOrder($order_id, $order_status, $history, $email);

		if(!empty($suborders) &&
empty($this->payment_params->classical)) {
			$suborders_id = array();
			$vendor_ids = array();
			foreach($suborders as $suborder) {
				$paypal_email = $suborder->vendor_email;
				if(!empty($suborder->vendor_params) &&
is_string($suborder->vendor_params))
					$suborder->vendor_params =
unserialize($suborder->vendor_params);
				if(!empty($suborder->vendor_params->paypal_email))
					$paypal_email = $suborder->vendor_params->paypal_email;

				if(in_array($paypal_email, $receiver_emails)) {
					$suborders_id[] = $suborder->order_id;
					$vendor_ids[] = $suborder->order_vendor_id;
				}
			}

			if(!empty($vendor_ids)) {
				$query = 'UPDATE ' .
hikamarket::table('order_transaction') . ' SET
order_transaction_paid = order_id WHERE order_id =
'.(int)$order_id.' AND vendor_id IN (' .
implode(',', $vendor_ids) . ')';
				$db->setQuery($query);
				$db->execute();
			}
		}

		return true;
	}

	public function onPaymentConfiguration(&$element) {
		$subtask = hikaInput::get()->getCmd('subtask',
'');
		if($subtask == 'ips') {
			$ips = null;
			echo implode(',', $this->getIPList($ips));
			exit;
		}

		parent::onPaymentConfiguration($element);
		$this->address = hikashop_get('type.address');

		if(empty($element->payment_params->username)) {
			$app = JFactory::getApplication();
			$lang = JFactory::getLanguage();
			$locale = strtolower(substr($lang->get('tag'), 0, 2));
			$app->enqueueMessage(JText::sprintf('ENTER_INFO_REGISTER_IF_NEEDED',
'PayPal', JText::_('HIKA_EMAIL'), 'PayPal',
'https://www.paypal.com/' . $locale .
'/mrb/pal=SXL9FKNKGAEM8'));
		}

		if(!function_exists('curl_init')) {
			$app = JFactory::getApplication();
			$app->enqueueMessage(JText::_('CURL_NOT_FOUND'),
'error');
		}
	}

	public function onPaymentConfigurationSave(&$element) {
		$ret = parent::onPaymentConfigurationSave($element);
		if($ret) {
			$element->payment_params->market_support = true;
			if(!empty($element->payment_params->ips))
				$element->payment_params->ips = explode(',',
$element->payment_params->ips);
		}
		return $ret;
	}

	private function convertStruct($struct, $format = 'nv') {
		if($format != 'nv')
			return '';

		$output = array();
		foreach($struct as $k => $v) {
			if(is_array($v)) {
				foreach($v as $l => $w) {
					if(is_numeric($l)) {
						foreach($w as $n => $x) {
							$output[] = $k . '.' . str_replace('List',
'', $k) . '(' . $l . ').' . $n .
'=' . urlencode($x);
						}
					} else {
						$output[] = $k . '.' . $l . '=' . urlencode($w);
					}
				}
			} else {
				$output[] = $k . '=' . urlencode($v);
			}
		}
		return implode('&', $output);
	}

	private function parseResponse($data, $format = 'nv') {
		if($format != 'nv')
			return $data;
		$res = array();
		$tmp = explode('&', $data);
		foreach($tmp as $t) {
			if(strpos($t, '=') === false)
				continue;
			list($k,$v) = explode('=', $t, 2);
			$res[$k] = $v;
		}
		unset($tmp);
		return $res;
	}

	private function submitPaypalData($url, $headers, $struct, $format =
'nv') {
		$data = $this->convertStruct($struct, $format);

		if(!empty($this->payment_params->use_fsock))
			return $this->submitPaypalData_socket($url, $headers, $data,
$format);

		$session = curl_init();
		curl_setopt($session, CURLOPT_FRESH_CONNECT,  true);
		curl_setopt($session, CURLOPT_FOLLOWLOCATION, false);
		curl_setopt($session, CURLOPT_FAILONERROR,    true);
		curl_setopt($session, CURLOPT_RETURNTRANSFER, true);
		curl_setopt($session, CURLOPT_USERAGENT,     
'HikaMarket-Paypal-Adaptive');
		curl_setopt($session, CURLOPT_TIMEOUT,        60);
		curl_setopt($session, CURLOPT_CONNECTTIMEOUT, 10);
		curl_setopt($session, CURLOPT_COOKIEFILE,     '');
		curl_setopt($session, CURLOPT_SSL_VERIFYPEER, false);
		curl_setopt($session, CURLOPT_SSL_VERIFYHOST, false);
		curl_setopt($session, CURLOPT_SSLVERSION,     6);
		curl_setopt($session, CURLOPT_ENCODING,       'UTF-8');
		curl_setopt($session, CURLOPT_HEADER,         false);
		curl_setopt($session, CURLOPT_HTTPHEADER,     $headers);
		curl_setopt($session, CURLOPT_URL,            $url);
		curl_setopt($session, CURLOPT_POST,           true);
		curl_setopt($session, CURLOPT_POSTFIELDS,     $data);

		$curl_version = curl_version();
		$sslVersion = isset($curl_version['ssl_version']) ?
$curl_version['ssl_version'] : '';
		if(substr($sslVersion, 0, 4) != 'NSS/') {
			curl_setopt($session, CURLOPT_SSL_CIPHER_LIST, 'TLSv1');
		}

		$result = trim(curl_exec($session));
		$error = curl_error($session);
		curl_close($session);

		$ret = $this->parseResponse($result, $format);

		if(empty($ret) && !empty($error) &&
!empty($this->payment_params->debug)) {
			$app = JFactory::getApplication();
			$app->enqueueMessage($error, 'error');
		}

		return $ret;
	}

	private function submitPaypalData_socket($dest_url, $headers, $data,
$format) {
		$url = parse_url($dest_url);
		if(!isset($url['query']))
			$url['query'] = '';

		if(!isset($url['port'])) {
			if(!empty($url['scheme']) &&
in_array($url['scheme'], array('https',
'ssl'))) {
				$url['port'] = 443;
			} else {
				$url['port'] = 80;
			}
		}

		if(!empty($url['scheme']) &&
in_array($url['scheme'], array('https',
'ssl'))) {
			$url['host_socket'] = 'ssl://' .
$url['host'];
		} else {
			$url['host_socket'] = $url['host'];
		}

		$fp = fsockopen($url['host_socket'], $url['port'],
$errno, $errstr, 30);
		if(!$fp)
			return false;

		if(empty($headers)) {
			$headers = '';
		} else {
			$headers = implode("\r\n", $headers) . "\r\n";
		}

		$uri = $url['path'] . ($url['query'] != ''
? '?' . $url['query'] : '');
		$header = 'POST '.$uri.' HTTP/1.1'."\r\n".
			'User-Agent: PHP/'.phpversion()."\r\n".
			'Server:
'.$_SERVER['SERVER_SOFTWARE']."\r\n".
			'Host: '.$url['host']."\r\n".
			'Content-Type:
application/x-www-form-urlencoded'."\r\n".
			'Content-Length: '.strlen($data)."\r\n".
			'Accept: */'.'*'."\r\n".$headers.
			'Connection: close'."\r\n\r\n";

		fwrite($fp, $header . $data);
		$response = '';
		while(!feof($fp)) {
			$response .= @fgets($fp, 4096);
		}
		fclose ($fp);

		$result = substr($response, strpos($response, "\r\n\r\n") +
strlen("\r\n\r\n"));
		$lines = explode("\n", $result);
		if(strpos($lines[0], '&') === false)
			array_shift($lines);
		$result = reset($lines);

		return $this->parseResponse($result, $format);
	}

	private function processIPNdata($data = '') {
		if(empty($data))
			return array();
		$ret = array();
		$elements = explode('&', $data);
		foreach($elements as $element) {
			if(strpos($element, '=') === false)
				continue;

			list($k, $v) = explode('=', $element, 2);
			$k = urldecode($k);
			$v = urldecode($v);

			preg_match('/(\w+)(?:\[(\d+)\])?(?:\.(\w+))?/', $k, $parts);
			switch(count($parts)) {
				case 4:
					if(!isset($ret[ $parts[1] ]))
						$ret[ $parts[1] ] = array();
					if(!isset($ret[ $parts[1] ][ $parts[2] ]))
						$ret[ $parts[1] ][ $parts[2] ] = array();
					$ret[ $parts[1] ][ $parts[2] ][ $parts[3] ] = $v;
					break;

				case 3:
					if(!isset($ret[$parts[1]]))
						$ret[ $parts[1] ] = array();
					$ret[ $parts[1] ][ $parts[2] ] = $v;
					break;

				default:
					$ret[$k] = $v;
					break;
			}
		}

		return $ret;
	}

	private function sendIPNconfirm($notif_url, $data = '') {
		$url = parse_url($notif_url);
		if(!isset($url['query']))
			$url['query'] = '';

		if(!isset($url['port'])) {
			if(!empty($url['scheme']) &&
in_array($url['scheme'], array('https',
'ssl'))) {
				$url['port'] = 443;
			} else {
				$url['port'] = 80;
			}
		}

		if(!empty($url['scheme']) &&
in_array($url['scheme'], array('https',
'ssl'))) {
			$url['host_socket'] = 'ssl://' .
$url['host'];
		} else {
			$url['host_socket'] = $url['host'];
		}

		if(!empty($this->payment_params->use_fsock))
			return $this->sendIPNconfirm_socket($url, $data);

		return $this->sendIPNconfirm_socket($url, $data);
	}

	private function sendIPNconfirm_socket($url, $data = '') {
		$fp = fsockopen($url['host_socket'], $url['port'],
$errno, $errstr, 30);
		if(!$fp)
			return false;

		$uri = $url['path'] . ($url['query'] != ''
? '?' . $url['query'] : '');
		$header = 'POST '.$uri.' HTTP/1.1'."\r\n".
			'User-Agent: PHP/'.phpversion()."\r\n".
			'Referer: '.hikashop_currentURL()."\r\n".
			'Server:
'.$_SERVER['SERVER_SOFTWARE']."\r\n".
			'Host: '.$url['host']."\r\n".
			'Content-Type:
application/x-www-form-urlencoded'."\r\n".
			'Content-Length: '.strlen($data)."\r\n".
			'Accept: */'.'*'."\r\n".
			'Connection: close'."\r\n\r\n";

		fwrite($fp, $header . $data);
		$response = '';
		while(!feof($fp)) {
			$response .= fgets($fp, 1024);
		}
		fclose ($fp);

		$response = substr($response, strpos($response, "\r\n\r\n") +
strlen("\r\n\r\n"));

		return $response;
	}

	private function sendIPNconfirm_CURL($url, $data = '') {
		if(!function_exists('curl_version')) {
			if($this->payment_params->debug)
				echo 'CURL is not available'. "\r\n\r\n";
			return false;
		}

		$uri = $url['scheme'] . '://' .
$url['host'] . $url['path'] . ($url['query']
!= '' ? '?' . $url['query'] : '');
		$ch = curl_init($uri);

		if(!$ch){
			if($this->payment_params->debug)
				echo 'CURL could not be initialized'. "\r\n\r\n";
			return false;
		}

		curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
		curl_setopt($ch, CURLOPT_POST, 1);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
		curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1);
		curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
		curl_setopt($ch, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1);
		curl_setopt($ch, CURLOPT_FORBID_REUSE, 1);
		curl_setopt($ch, CURLOPT_HTTPHEADER, array('Connection:
Close'));
		curl_setopt($ch, CURLOPT_FAILONERROR,true);

		if($this->payment_params->debug) {
			echo print_r($data, true) . "\r\n\r\n";
		}

		$response = curl_exec($ch);

		$errno = curl_errno($ch);
		$error = curl_error($ch);

		curl_close($ch);

		if (!$response) {
			if($this->payment_params->debug)
				echo 'CURL request didn\t return any data'.
"\r\n\r\n";
			return false;
		}

		if($errno){
			if($this->payment_params->debug) {
				echo 'CURL error number: '.$errno. "\r\n\r\n";
				echo 'CURL error message: '.$error. "\r\n\r\n";
			}
		}

		if($this->payment_params->debug) {
			echo print_r($response, true) . "\r\n\r\n";
		}

		return $response;
	}

	protected function verifyIPN() {
		if(!function_exists('curl_version'))
			return false;

		$raw_post_data = file_get_contents('php://input');
		$raw_post_array = explode('&', $raw_post_data);
		$myPost = array();
		foreach ($raw_post_array as $keyval) {
			$keyval = explode('=', $keyval);
			if (count($keyval) == 2) {
				if ($keyval[0] === 'payment_date') {
					if (substr_count($keyval[1], '+') === 1) {
						$keyval[1] = str_replace('+', '%2B',
$keyval[1]);
					}
				}
				$myPost[$keyval[0]] = urldecode($keyval[1]);
			}
		}
		$req = 'cmd=_notify-validate';
		$get_magic_quotes_exists = false;
		if (function_exists('get_magic_quotes_gpc')) {
			$get_magic_quotes_exists = true;
		}
		foreach ($myPost as $key => $value) {
			if ($get_magic_quotes_exists == true && get_magic_quotes_gpc()
== 1) {
				$value = urlencode(stripslashes($value));
			} else {
				$value = urlencode($value);
			}
			$req .= "&$key=$value";
		}

		if(empty($this->payment_params->url))
			$this->payment_params->url =
'https://www.paypal.com/cgi-bin/webscr';
		if(strpos($this->payment_params->url, 'sandbox') ===
false) {
			$url = 'https://ipnpb.paypal.com/cgi-bin/webscr';
		} else {
			$url = 'https://ipnpb.sandbox.paypal.com/cgi-bin/webscr';
		}

		$ch = curl_init($url);
		curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
		curl_setopt($ch, CURLOPT_POST, 1);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
		curl_setopt($ch, CURLOPT_POSTFIELDS, $req);
		curl_setopt($ch, CURLOPT_SSLVERSION, 6);
		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1);
		curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
		curl_setopt($ch, CURLOPT_FORBID_REUSE, 1);
		curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
		curl_setopt($ch, CURLOPT_HTTPHEADER, array('Connection:
Close'));
		$res = curl_exec($ch);

		if ( ! ($res)) {
			$errno = curl_errno($ch);
			$errstr = curl_error($ch);
			curl_close($ch);
			$this->writeToLog("cURL error: [$errno] $errstr");
			return false;
		}

		$info = curl_getinfo($ch);
		$http_code = $info['http_code'];
		if ($http_code != 200) {
			$this->writeToLog("PayPal responded with http code
$http_code");
			return false;
		}
		curl_close($ch);

		return $res;
	}

	public function getPaymentDefaultValues(&$element) {
		$element->payment_name = 'PayPal';
		$element->payment_description = 'You can pay by credit card or
paypal using this payment method';
		$element->payment_images =
'MasterCard,VISA,Credit_card,PayPal';

		$element->payment_params->username = '';
		$element->payment_params->password = '';
		$element->payment_params->signature = '';
		$element->payment_params->ips = '';
		$element->payment_params->invalid_status = 'cancelled';
		$element->payment_params->pending_status = 'created';
		$element->payment_params->verified_status = 'confirmed';
	}

	private function getIPList(&$ipList) {
		$hosts = array(
			'www.paypal.com',
			'notify.paypal.com',
			'ipn.sandbox.paypal.com'
		);

		$ipList = array();
		foreach($hosts as $host) {
			$ips = gethostbynamel($host);
			if(empty($ips))
				continue;
			if(empty($ipList))
				$ipList = $ips;
			else
				$ipList = array_merge($ipList, $ips);
		}

		if(empty($ipList))
			return $ipList;

		$newList = array();
		foreach($ipList as $k => $ip) {
			$ipParts = explode('.', $ip);
			if(count($ipParts) == 4) {
				array_pop($ipParts);
				$ip = implode('.', $ipParts) . '.*';
			}
			if(!in_array($ip, $newList))
				$newList[] = $ip;
		}
		return $newList;
	}
}
PK\^�['O~�SSpaypaladaptive.xmlnu�[���<?xml
version="1.0" encoding="utf-8"?>
<extension type="plugin" version="2.5"
method="upgrade" group="hikashoppayment">
	<name>Hikashop (market) Paypal Adaptive Payment Plugin</name>
	<hikainstall ordering="0" enable="1"
report="0" />
	<creationDate>20 juillet 2020</creationDate>
	<version>3.1.1</version>
	<author>Obsidev</author>
	<authorEmail>dev@obsidev.com</authorEmail>
	<authorUrl>http://www.obsidev.com</authorUrl>
	<copyright>Copyright (C) 2012-2020 OBSIDEV SARL - All rights
reserved.</copyright>
	<license>http://www.gnu.org/licenses/gpl-2.0.html
GNU/GPL</license>
	<description>This plugin enables you to setup your paypal adaptive
payment system</description>
	<files>
		<filename
plugin="paypaladaptive">paypaladaptive.php</filename>
		<filename>paypaladaptive_configuration.php</filename>
		<filename>paypaladaptive_end.php</filename>
	</files>
	<params addpath="/components/com_hikashop/params">
		<param name="pluginoptions" type="pluginoptions"
default="plugin" label="hikashop"
description="HikaShop options" />
	</params>
	<config>
		<fields name="params"
addfieldpath="/components/com_hikashop/fields">
			<fieldset name="basic">
				<field id="pluginoptions" name="pluginoptions"
type="pluginoptions" label="hikashop"
description="HikaShop options" />
            </fieldset>
		</fields>
	</config>
</extension>
PK\^�[�@�H�%�%
paypaladaptive_configuration.phpnu�[���<?php
/**
 * @package    HikaMarket for Joomla!
 * @version    3.1.1
 * @author     Obsidev S.A.R.L.
 * @copyright  (C) 2011-2020 OBSIDEV. All rights reserved.
 * @license    GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */
defined('_JEXEC') or die('Restricted access');
?><tr>
	<td class="key">
		<label
for="data[payment][payment_params][email]"><?php
			echo JText::_('HIKA_EMAIL');
		?></label>
	</td>
	<td>
		<input type="text"
name="data[payment][payment_params][email]" value="<?php
echo $this->escape(@$this->element->payment_params->email);
?>" />
	</td>
</tr>
<tr>
	<td class="key">
		<label
for="data[payment][payment_params][classical]"><?php
			echo JText::_('PAYPAL_CLASSICAL');
		?></label>
	</td>
	<td><?php
		if(!isset($this->element->payment_params->classical))
			$this->element->payment_params->classical = false;
		echo JHTML::_('hikaselect.booleanlist',
"data[payment][payment_params][classical]" , '
onchange="pp_adative_classical(this);"',
$this->element->payment_params->classical);
	?>
<script type="text/javascript">
function pp_adative_classical(el) {
	var value = (el.value == "1"), elements =
document.getElementsByTagName('tr');
	for (var i = 0; i < elements.length; i++) {
		if(elements[i].className == "pp_adative_opt")
			elements[i].style.display = (value ? 'none' : '');
	}
}
window.hikashop.ready(function(){
	var el = {value:<?php echo
(int)$this->element->payment_params->classical; ?>};
	pp_adative_classical(el);
});
</script>
	</td>
</tr>
<tr class="pp_adative_opt">
	<td class="key">
		<label
for="data[payment][payment_params][username]"><?php
			echo JText::_('HIKA_USERNAME');
		?></label>
	</td>
	<td>
		<input type="text"
name="data[payment][payment_params][username]"
value="<?php echo
$this->escape(@$this->element->payment_params->username);
?>" />
	</td>
</tr>
<tr class="pp_adative_opt">
	<td class="key">
		<label
for="data[payment][payment_params][password]"><?php
			echo JText::_('HIKA_PASSWORD');
		?></label>
	</td>
	<td>
		<input type="text"
name="data[payment][payment_params][password]"
value="<?php echo
$this->escape(@$this->element->payment_params->password);
?>" />
	</td>
</tr>
<tr class="pp_adative_opt">
	<td class="key">
		<label
for="data[payment][payment_params][signature]"><?php
			echo JText::_('SIGNATURE');
		?></label>
	</td>
	<td>
		<input type="text"
name="data[payment][payment_params][signature]"
value="<?php echo
$this->escape(@$this->element->payment_params->signature);
?>" />
	</td>
</tr>
<tr class="pp_adative_opt">
	<td class="key">
		<label
for="data[payment][payment_params][applicationid]"><?php
			echo 'Application Id';
		?></label>
	</td>
	<td>
		<input type="text"
name="data[payment][payment_params][applicationid]"
value="<?php echo
$this->escape(@$this->element->payment_params->applicationid);
?>" />
	</td>
</tr>
<tr class="pp_adative_opt">
	<td class="key">
		<label
for="data[payment][payment_params][reverse_all_on_error]"><?php
			echo 'Reverse all on error';
		?></label>
	</td>
	<td><?php
		echo JHTML::_('hikaselect.booleanlist',
"data[payment][payment_params][reverse_all_on_error]" ,
'',
@$this->element->payment_params->reverse_all_on_error);
	?></td>
</tr>
<tr class="pp_adative_opt">
	<td class="key">
		<label
for="data[payment][payment_params][payment_mode]"><?php
			echo 'Payment mode';
		?></label>
	</td>
	<td><?php
		$arr = array(
			JHTML::_('select.option', 'chained',
'Chained'),
			JHTML::_('select.option', 'parallel',
'Parallel'),
		);
		echo JHTML::_('hikaselect.genericlist',  $arr,
"data[payment][payment_params][payment_mode]", '',
'value', 'text',
@$this->element->payment_params->payment_mode);
	?></td>
</tr>
<tr class="pp_adative_opt">
	<td class="key">
		<label
for="data[payment][payment_params][display_mode]"><?php
			echo 'Display mode';
		?></label>
	</td>
	<td><?php
		$arr = array(
			JHTML::_('select.option', 'redirect',
'Redirect'),
			JHTML::_('select.option', 'popup',
'Popup'),
		);
		echo JHTML::_('hikaselect.genericlist',  $arr,
"data[payment][payment_params][display_mode]", '',
'value', 'text',
@$this->element->payment_params->display_mode);
	?></td>
</tr>
<tr class="pp_adative_opt">
	<td class="key">
		<label
for="data[payment][payment_params][fee_mode]"><?php
			echo 'Fee mode';
		?></label>
	</td>
	<td><?php
		$arr = array(
			JHTML::_('select.option', 'each', 'Each
Receiver'),
			JHTML::_('select.option', 'sender',
'Sender'),
			JHTML::_('select.option', 'primary', 'Primary
Receiver'),
			JHTML::_('select.option', 'secondary',
'Secondary Receiver(s)'),
		);
		echo JHTML::_('hikaselect.genericlist',  $arr,
"data[payment][payment_params][fee_mode]", '',
'value', 'text',
@$this->element->payment_params->fee_mode);
	?></td>
</tr>
<tr class="pp_adative_opt">
	<td class="key">
		<label
for="data[payment][payment_params][store_secondary]"><?php
			echo 'Put store as a secondary receiver';
		?></label>
	</td>
	<td>
		<?php echo JHTML::_('hikaselect.booleanlist',
"data[payment][payment_params][store_secondary]" , '',
@$this->element->payment_params->store_secondary); ?>
		<p>
			<em><strong>Important</strong>: This option is not
recommended.<br/>
			It won't work correctly if you have several vendors in a single
order.</em>
		</p>
	</td>
</tr>
<tr>
	<td class="key">
		<label
for="data[payment][payment_params][debug]"><?php
			echo JText::_('DEBUG');
		?></label>
	</td>
	<td><?php
		echo JHTML::_('hikaselect.booleanlist',
"data[payment][payment_params][debug]" , '',
@$this->element->payment_params->debug);
	?></td>
</tr>
<tr>
	<td class="key">
		<label
for="data[payment][payment_params][sandbox]"><?php
			echo JText::_('SANDBOX');
		?></label>
	</td>
	<td><?php
		if(!isset($this->element->payment_params->sandbox) &&
isset($this->element->payment_params->debug))
			$this->element->payment_params->sandbox =
$this->element->payment_params->debug;
		echo JHTML::_('hikaselect.booleanlist',
"data[payment][payment_params][sandbox]" , '',
@$this->element->payment_params->sandbox);
	?></td>
</tr>
<tr class="pp_adative_opt">
	<td class="key">
		<label
for="data[payment][payment_params][notify_wrong_emails]"><?php
			echo 'Notify for wrong emails';
		?></label>
	</td>
	<td><?php
		echo JHTML::_('hikaselect.booleanlist',
"data[payment][payment_params][notify_wrong_emails]" ,
'',
@$this->element->payment_params->notify_wrong_emails);
	?></td>
</tr>
<tr class="pp_adative_opt">
	<td class="key">
		<label
for="data[payment][payment_params][use_fsock]"><?php
			echo 'Use Raw sockets instead of cURL';
		?></label>
	</td>
	<td><?php
		echo JHTML::_('hikaselect.booleanlist',
"data[payment][payment_params][use_fsock]" , '',
@$this->element->payment_params->use_fsock);
	?></td>
</tr>
<tr>
	<td class="key">
		<label
for="data[payment][payment_params][validation]"><?php
			echo JText::_('ENABLE_VALIDATION').' (Classical
only)'
		?></label>
	</td>
	<td><?php
		echo JHTML::_('hikaselect.booleanlist',
'data[payment][payment_params][validation]', '',
@$this->element->payment_params->validation);
	?></td>
</tr>
<tr>
	<td class="key">
		<label
for="data[payment][payment_params][cancel_url]"><?php
			echo JText::_('CANCEL_URL');
		?></label>
	</td>
	<td>
		<input type="text"
name="data[payment][payment_params][cancel_url]"
value="<?php echo
$this->escape(@$this->element->payment_params->cancel_url);
?>" />
	</td>
</tr>
<tr>
	<td class="key">
		<label
for="data[payment][payment_params][return_url]"><?php
			echo JText::_('RETURN_URL');
		?></label>
	</td>
	<td>
		<input type="text"
name="data[payment][payment_params][return_url]"
value="<?php echo
$this->escape(@$this->element->payment_params->return_url);
?>" />
	</td>
</tr>
<tr>
	<td class="key">
		<label for="data[payment][payment_params][ips]"><?php
			echo JText::_('IPS');
		?></label>
	</td>
	<td>
		<textarea id="paypal_ips"
name="data[payment][payment_params][ips]" ><?php echo
(!empty($this->element->payment_params->ips) &&
is_array($this->element->payment_params->ips)?trim(implode(',',$this->element->payment_params->ips)):'');
?></textarea>
		<br/>
		<a href="#" onclick="return
paypal_refreshIps();"><?php echo
JText::_('REFRESH_IPS');?></a>
<script type="text/javascript">
function paypal_refreshIps() {
	var w = window, d = document, o = w.Oby;
	o.xRequest('<?php echo
hikashop_completeLink('plugins&plugin_type=payment&task=edit&name='.$this->data['name'].'&subtask=ips',true,true);?>',
null, function(xhr) {
		d.getElementById('paypal_ips').value = xhr.responseText;
	});
	return false;
}
</script>
	</td>
</tr>
<tr>
	<td class="key">
		<label
for="data[payment][payment_params][invalid_status]"><?php
			echo JText::_('INVALID_STATUS');
		?></label>
	</td>
	<td><?php
		echo
$this->data['order_statuses']->display("data[payment][payment_params][invalid_status]",
@$this->element->payment_params->invalid_status);
	?></td>
</tr>
<tr>
	<td class="key">
		<label
for="data[payment][payment_params][pending_status]"><?php
			echo JText::_('PENDING_STATUS');
		?></label>
	</td>
	<td><?php
		echo
$this->data['order_statuses']->display("data[payment][payment_params][pending_status]",
@$this->element->payment_params->pending_status);
	?></td>
</tr>
<tr>
	<td class="key">
		<label
for="data[payment][payment_params][verified_status]"><?php
			echo JText::_('VERIFIED_STATUS');
		?></label>
	</td>
	<td><?php
		echo
$this->data['order_statuses']->display("data[payment][payment_params][verified_status]",
@$this->element->payment_params->verified_status);
	?></td>
</tr>
PK\^�[��H,=
=
paypaladaptive_end.phpnu�[���<?php
/**
 * @package    HikaMarket for Joomla!
 * @version    3.1.1
 * @author     Obsidev S.A.R.L.
 * @copyright  (C) 2011-2020 OBSIDEV. All rights reserved.
 * @license    GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */
defined('_JEXEC') or die('Restricted access');
?><div class="hikashop_paypal_end"
id="hikashop_paypal_end">
	<span id="hikashop_paypal_end_message"
class="hikashop_paypal_end_message">
<?php
	if(!empty($this->display_mode) && $this->display_mode ==
'popup') {
		echo JText::sprintf('PLEASE_WAIT_BEFORE_SUBMISSION_TO_X',
$this->payment_name).'<br/>'.
JText::_('CLICK_ON_BUTTON_IF_NOTHING');
	} else {
		echo JText::sprintf('PLEASE_WAIT_BEFORE_REDIRECTION_TO_X',
$this->payment_name).'<br/>'.
JText::_('CLICK_ON_BUTTON_IF_NOT_REDIRECTED');
	}
?>
	</span>
	<span id="hikashop_paypal_end_spinner"
class="hikashop_paypal_end_spinner
hikashop_checkout_end_spinner"></span>
	<br/>
	<form id="hikashop_paypal_form"
name="hikashop_paypal_form" action="<?php echo
$this->return_url;?>" target="<?php echo
@$this->target; ?>" method="<?php
if(!empty($this->display_mode) && $this->display_mode ==
'popup') { echo 'GET'; } else { echo 'POST';
} ?>">
<?php
	if(empty($this->payment_params->classical)) {
?>
		<input id="paykey" type="hidden"
name="paykey" value="<?php echo $this->paykey;
?>">
<?php if(!empty($this->display_mode) &&
$this->display_mode == 'popup') { ?>
		<input id="type" type="hidden"
name="expType" value="light"> <!-- or
"mini" -->
<?php }
	} else {
 		foreach($this->vars as $name => $value ) {
			echo '<input type="hidden"
name="'.$name.'"
value="'.htmlspecialchars((string)$value).'"
/>';
		}
	}
?>
		<div id="hikashop_paypal_end_image"
class="hikashop_paypal_end_image">
			<input id="hikashop_paypal_button" type="submit"
class="hikabtn hikabtn-primary" value="<?php echo
JText::_('PAY_NOW');?>" name=""
alt="<?php echo JText::_('PAY_NOW');?>" />
		</div>
<?php
	hikaInput::get()->set('noform', 1);
?>
	</form>
<?php if(!empty($this->display_mode) &&
$this->display_mode == 'popup') { ?>
	<script
src="https://www.paypalobjects.com/js/external/dg.js"></script>
	<script>
		<!--
		var dgFlow = new PAYPAL.apps.DGFlow({ trigger:
"hikashop_paypal_button" });
		function validatePaypalBox(url) {
			window.location = url;
		}
		//-->
	</script>
<?php
}
if(!$this->payment_params->debug) {
?>
	<script type="text/javascript">
		<!--
		document.getElementById('hikashop_paypal_form').submit();
		//-->
	</script>
<?php
} else {
	echo '<p><strong>[Debug mode] Please do a manual
validation</strong></p>';
}
?>
</div>
PK\^�[�#o,,
index.htmlnu�[���PK\^�[W��}����fpaypaladaptive.phpnu�[���PK\^�['O~�SS8�paypaladaptive.xmlnu�[���PK\^�[�@�H�%�%
͸paypaladaptive_configuration.phpnu�[���PK\^�[��H,=
=
�paypaladaptive_end.phpnu�[���PK���