shop.balmet.com

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README

pp_pro_iframe.php (13774B)


      1 <?php
      2 class ControllerExtensionPaymentPPProIframe extends Controller {
      3 	public function index() {
      4 		$this->load->model('checkout/order');
      5 		$this->load->model('extension/payment/pp_pro_iframe');
      6 
      7 		$this->load->language('extension/payment/pp_pro_iframe');
      8 
      9 		if ($this->config->get('payment_pp_pro_iframe_checkout_method') == 'redirect') {
     10 			$order_info = $this->model_checkout_order->getOrder($this->session->data['order_id']);
     11 
     12 			$hosted_button_id = $this->constructButtonData($order_info);
     13 
     14 			if ($this->config->get('payment_pp_pro_iframe_test')) {
     15 				$data['url'] = 'https://securepayments.sandbox.paypal.com/webapps/HostedSoleSolutionApp/webflow/sparta/hostedSoleSolutionProcess';
     16 			} else {
     17 				$data['url'] = 'https://securepayments.paypal.com/webapps/HostedSoleSolutionApp/webflow/sparta/hostedSoleSolutionProcess';
     18 			}
     19 
     20 			if ($hosted_button_id) {
     21 				$data['code'] = $hosted_button_id;
     22 				$data['error_connection'] = '';
     23 			} else {
     24 				$data['error_connection'] = $this->language->get('error_connection');
     25 			}
     26 		}
     27 
     28 		$data['create'] = HTTPS_SERVER.'index.php?route=extension/payment/pp_pro_iframe/create';
     29 
     30 		$data['checkout_method'] = $this->config->get('payment_pp_pro_iframe_checkout_method');
     31 
     32 		return $this->load->view('extension/payment/pp_pro_iframe', $data);
     33 	}
     34 
     35 	public function create() {
     36 		$this->load->language('extension/payment/pp_pro_iframe');
     37 		$this->load->model('checkout/order');
     38 		$this->load->model('extension/payment/pp_pro_iframe');
     39 
     40 		$data['text_secure_connection'] = $this->language->get('text_secure_connection');
     41 
     42 		$order_info = $this->model_checkout_order->getOrder($this->session->data['order_id']);
     43 
     44 		$hosted_button_id = $this->constructButtonData($order_info);
     45 
     46 		if ($hosted_button_id) {
     47 			$data['code'] = $hosted_button_id;
     48 
     49 			if ($this->config->get('payment_pp_pro_iframe_test')) {
     50 				$data['url'] = 'https://securepayments.sandbox.paypal.com/webapps/HostedSoleSolutionApp/webflow/sparta/hostedSoleSolutionProcess';
     51 			} else {
     52 				$data['url'] = 'https://securepayments.paypal.com/webapps/HostedSoleSolutionApp/webflow/sparta/hostedSoleSolutionProcess';
     53 			}
     54 
     55 			$data['error_connection'] = '';
     56 		} else {
     57 			$data['error_connection'] = $this->language->get('error_connection');
     58 		}
     59 
     60 		if (file_exists(DIR_APPLICATION . 'view/theme/' . $this->config->get('config_template') . '/stylesheet/stylesheet.css')) {
     61 			$data['stylesheet'] = '/catalog/view/theme/' . $this->config->get('config_template') . '/stylesheet/stylesheet.css';
     62 		} else {
     63 			$data['stylesheet'] = '/catalog/view/theme/default/stylesheet/stylesheet.css';
     64 		}
     65 
     66 		$this->response->setOutput($this->load->view('extension/payment/pp_pro_iframe_body', $data));
     67 	}
     68 
     69 	public function notify() {
     70 		$this->load->model('extension/payment/pp_pro_iframe');
     71 
     72 		if (isset($this->request->post['custom'])) {
     73 			$order_id = $this->encryption->decrypt($this->config->get('config_encryption'), $this->request->post['custom']);
     74 		} else {
     75 			$order_id = 0;
     76 		}
     77 
     78 		$this->load->model('checkout/order');
     79 
     80 		$order_info = $this->model_checkout_order->getOrder($order_id);
     81 
     82 		if ($order_info) {
     83 			$request = 'cmd=_notify-validate';
     84 
     85 			foreach ($this->request->post as $key => $value) {
     86 				$request .= '&' . $key . '=' . urlencode(html_entity_decode($value, ENT_QUOTES, 'UTF-8'));
     87 			}
     88 
     89 			if (!$this->config->get('pp_pro_iframe')) {
     90 				$curl = curl_init('https://www.paypal.com/cgi-bin/webscr');
     91 			} else {
     92 				$curl = curl_init('https://www.sandbox.paypal.com/cgi-bin/webscr');
     93 			}
     94 
     95 			curl_setopt($curl, CURLOPT_POST, true);
     96 			curl_setopt($curl, CURLOPT_POSTFIELDS, $request);
     97 			curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
     98 			curl_setopt($curl, CURLOPT_HEADER, false);
     99 			curl_setopt($curl, CURLOPT_TIMEOUT, 30);
    100 			curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
    101 
    102 			$response = curl_exec($curl);
    103 
    104 			if (curl_errno($curl)) {
    105 				if ($this->config->get('payment_pp_pro_iframe_debug')) {
    106 					$log = new Log('pp_pro_iframe.log');
    107 					$log->write('pp_pro_iframe :: CURL failed ' . curl_error($curl) . '(' . curl_errno($curl) . ')');
    108 				}				
    109 			} else {
    110 				if ($this->config->get('payment_pp_pro_iframe_debug')) {
    111 					$log = new Log('pp_pro_iframe.log');
    112 					$log->write('pp_pro_iframe :: IPN REQUEST: ' . $request);
    113 					$log->write('pp_pro_iframe :: IPN RESPONSE: ' . $response);
    114 				}				
    115 
    116 				if ((strcmp($response, 'VERIFIED') == 0 || strcmp($response, 'UNVERIFIED') == 0) && isset($this->request->post['payment_status'])) {
    117 					$order_status_id = $this->config->get('payment_pp_pro_iframe_canceled_reversal_status_id');
    118 
    119 					switch ($this->request->post['payment_status']) {
    120 						case 'Canceled_Reversal':
    121 							$order_status_id = $this->config->get('payment_pp_pro_iframe_canceled_reversal_status_id');
    122 							break;
    123 						case 'Completed':
    124 							$order_status_id = $this->config->get('payment_pp_pro_iframe_completed_status_id');
    125 							break;
    126 						case 'Denied':
    127 							$order_status_id = $this->config->get('payment_pp_pro_iframe_denied_status_id');
    128 							break;
    129 						case 'Expired':
    130 							$order_status_id = $this->config->get('payment_pp_pro_iframe_expired_status_id');
    131 							break;
    132 						case 'Failed':
    133 							$order_status_id = $this->config->get('payment_pp_pro_iframe_failed_status_id');
    134 							break;
    135 						case 'Pending':
    136 							$order_status_id = $this->config->get('payment_pp_pro_iframe_pending_status_id');
    137 							break;
    138 						case 'Processed':
    139 							$order_status_id = $this->config->get('payment_pp_pro_iframe_processed_status_id');
    140 							break;
    141 						case 'Refunded':
    142 							$order_status_id = $this->config->get('payment_pp_pro_iframe_processed_status_id');
    143 							break;
    144 						case 'Reversed':
    145 							$order_status_id = $this->config->get('payment_pp_pro_iframe_reversed_status_id');
    146 							break;
    147 						case 'Voided':
    148 							$order_status_id = $this->config->get('payment_pp_pro_iframe_voided_status_id');
    149 							break;
    150 					}
    151 
    152 					if (!$order_info['order_status_id']) {
    153 						$paypal_order_data = array(
    154 							'order_id'         => $order_id,
    155 							'capture_status'   => ($this->config->get('payment_pp_pro_iframe_transaction_method') == 'sale' ? 'Complete' : 'NotComplete'),
    156 							'currency_code'    => $this->request->post['mc_currency'],
    157 							'authorization_id' => $this->request->post['txn_id'],
    158 							'total'            => $this->request->post['mc_gross'],
    159 						);
    160 
    161 						$paypal_iframe_order_id = $this->model_extension_payment_pp_pro_iframe->addOrder($paypal_order_data);
    162 
    163 						$paypal_transaction_data = array(
    164 							'paypal_iframe_order_id' => $paypal_iframe_order_id,
    165 							'transaction_id'         => $this->request->post['txn_id'],
    166 							'parent_id'  => '',
    167 							'note'                   => '',
    168 							'msgsubid'               => '',
    169 							'receipt_id'             => $this->request->post['receipt_id'],
    170 							'payment_type'           => $this->request->post['payment_type'],
    171 							'payment_status'         => $this->request->post['payment_status'],
    172 							'pending_reason'         => (isset($this->request->post['pending_reason']) ? $this->request->post['pending_reason'] : ''),
    173 							'transaction_entity'     => ($this->config->get('payment_pp_pro_iframe_transaction_method') == 'sale' ? 'payment' : 'auth'),
    174 							'amount'                 => $this->request->post['mc_gross'],
    175 							'debug_data'             => json_encode($this->request->post),
    176 						);
    177 
    178 						$this->model_extension_payment_pp_pro_iframe->addTransaction($paypal_transaction_data);
    179 
    180 						$this->model_checkout_order->addOrderHistory($order_id, $order_status_id);
    181 					} else {
    182 						$this->model_checkout_order->addOrderHistory($order_id, $order_status_id);
    183 					}
    184 				} else {
    185 					$this->model_checkout_order->addOrderHistory($order_id, $this->config->get('config_order_status_id'));
    186 				}
    187 			}
    188 
    189 			curl_close($curl);
    190 		}
    191 	}
    192 
    193 	private function constructButtonData($order_info) {
    194 		$s_data = array();
    195 		$s_data['METHOD'] = 'BMCreateButton';
    196 		$s_data['VERSION'] = '65.2';
    197 		$s_data['BUTTONCODE'] = 'TOKEN';
    198 
    199 		$s_data['BUTTONLANGUAGE'] = 'en';
    200 		$s_data['BUTTONSOURCE'] = 'OpenCart_2.0_HSS';
    201 
    202 		$s_data['USER'] = $this->config->get('payment_pp_pro_iframe_user');
    203 		$s_data['SIGNATURE'] = $this->config->get('payment_pp_pro_iframe_sig');
    204 		$s_data['PWD'] = $this->config->get('payment_pp_pro_iframe_password');
    205 
    206 		$s_data['BUTTONTYPE'] = 'PAYMENT';
    207 		$s_data['L_BUTTONVAR0'] = 'subtotal=' . $this->currency->format($order_info['total'], $order_info['currency_code'], false, false);
    208 		$s_data['L_BUTTONVAR1'] = 'tax=0.00';
    209 		$s_data['L_BUTTONVAR2'] = 'shipping=0.00';
    210 		$s_data['L_BUTTONVAR3'] = 'handling=0.00';
    211 
    212 		if ($this->cart->hasShipping()) {
    213 			$s_data['L_BUTTONVAR4'] = 'first_name=' . urlencode($order_info['shipping_firstname']);
    214 			$s_data['L_BUTTONVAR5'] = 'last_name=' . urlencode($order_info['shipping_lastname']);
    215 			$s_data['L_BUTTONVAR6'] = 'address1=' . urlencode($order_info['shipping_address_1']);
    216 			$s_data['L_BUTTONVAR7'] = 'address2=' . urlencode($order_info['shipping_address_2']);
    217 			$s_data['L_BUTTONVAR8'] = 'city=' . urlencode($order_info['shipping_city']);
    218 			$s_data['L_BUTTONVAR9'] = 'state=' . urlencode($order_info['shipping_zone']);
    219 			$s_data['L_BUTTONVAR10'] = 'zip=' . urlencode($order_info['shipping_postcode']);
    220 			$s_data['L_BUTTONVAR11'] = 'country=' . urlencode($order_info['shipping_iso_code_2']);
    221 		} else {
    222 			$s_data['L_BUTTONVAR4'] = 'first_name=' . urlencode($order_info['payment_firstname']);
    223 			$s_data['L_BUTTONVAR5'] = 'last_name=' . urlencode($order_info['payment_lastname']);
    224 			$s_data['L_BUTTONVAR6'] = 'address1=' . urlencode($order_info['payment_address_1']);
    225 			$s_data['L_BUTTONVAR7'] = 'address2=' . urlencode($order_info['payment_address_2']);
    226 			$s_data['L_BUTTONVAR8'] = 'city=' . urlencode($order_info['payment_city']);
    227 			$s_data['L_BUTTONVAR9'] = 'state=' . urlencode($order_info['payment_zone']);
    228 			$s_data['L_BUTTONVAR10'] = 'zip=' . urlencode($order_info['payment_postcode']);
    229 			$s_data['L_BUTTONVAR11'] = 'country=' . urlencode($order_info['payment_iso_code_2']);
    230 		}
    231 
    232 		$s_data['L_BUTTONVAR12'] = 'billing_first_name=' . urlencode($order_info['payment_firstname']);
    233 		$s_data['L_BUTTONVAR13'] = 'billing_last_name=' . urlencode($order_info['payment_lastname']);
    234 		$s_data['L_BUTTONVAR14'] = 'billing_address1=' . urlencode($order_info['payment_address_1']);
    235 		$s_data['L_BUTTONVAR15'] = 'billing_address2=' . urlencode($order_info['payment_address_2']);
    236 		$s_data['L_BUTTONVAR16'] = 'billing_city=' . urlencode($order_info['payment_city']);
    237 		$s_data['L_BUTTONVAR17'] = 'billing_state=' . urlencode($order_info['payment_zone']);
    238 		$s_data['L_BUTTONVAR18'] = 'billing_zip=' . urlencode($order_info['payment_postcode']);
    239 		$s_data['L_BUTTONVAR19'] = 'billing_country=' . urlencode($order_info['payment_iso_code_2']);
    240 
    241 		$s_data['L_BUTTONVAR20'] = 'notify_url=' . $this->url->link('extension/payment/pp_pro_iframe/notify', '', true);
    242 		$s_data['L_BUTTONVAR21'] = 'cancel_return=' . $this->url->link('checkout/checkout', '', true);
    243 		$s_data['L_BUTTONVAR22'] = 'paymentaction=' . $this->config->get('payment_pp_pro_iframe_transaction_method');
    244 		$s_data['L_BUTTONVAR23'] = 'currency_code=' . urlencode($order_info['currency_code']);
    245 		$s_data['L_BUTTONVAR26'] = 'showBillingAddress=false';
    246 		$s_data['L_BUTTONVAR27'] = 'showShippingAddress=false';
    247 		$s_data['L_BUTTONVAR28'] = 'showBillingEmail=false';
    248 		$s_data['L_BUTTONVAR29'] = 'showBillingPhone=false';
    249 		$s_data['L_BUTTONVAR30'] = 'showCustomerName=true';
    250 		$s_data['L_BUTTONVAR31'] = 'showCardInfo=true';
    251 		$s_data['L_BUTTONVAR32'] = 'showHostedThankyouPage=false';
    252 		$s_data['L_BUTTONVAR33'] = 'bn=GBD';
    253 		$s_data['L_BUTTONVAR35'] = 'address_override=true';
    254 		$s_data['L_BUTTONVAR36'] = 'cpp_header_image=Red';
    255 		$s_data['L_BUTTONVAR44'] = 'bodyBgColor=#AEAEAE';
    256 		$s_data['L_BUTTONVAR47'] = 'PageTitleTextColor=Blue';
    257 		$s_data['L_BUTTONVAR48'] = 'PageCollapseBgColor=#AEAEAE';
    258 		$s_data['L_BUTTONVAR49'] = 'PageCollapseTextColor=#AEAEAE';
    259 		$s_data['L_BUTTONVAR50'] = 'PageButtonBgColor=#AEAEAE';
    260 		$s_data['L_BUTTONVAR51'] = 'orderSummaryBgColor=#AEAEAE';
    261 		$s_data['L_BUTTONVAR55'] = 'template=templateD';
    262 		$s_data['L_BUTTONVAR56'] = 'return=' . $this->url->link('checkout/success', '', true);
    263 		$s_data['L_BUTTONVAR57'] = 'custom=' . $this->encryption->encrypt($this->config->get('config_encryption'), $order_info['order_id']);
    264 
    265 		if ($this->config->get('payment_pp_pro_iframe_test')) {
    266 			$url = 'https://api-3t.sandbox.paypal.com/nvp';
    267 		} else {
    268 			$url = 'https://api-3t.paypal.com/nvp';
    269 		}
    270 
    271 		$curl = curl_init($url);
    272 
    273 		curl_setopt($curl, CURLOPT_PORT, 443);
    274 		curl_setopt($curl, CURLOPT_HEADER, 0);
    275 		curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
    276 		curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    277 		curl_setopt($curl, CURLOPT_FORBID_REUSE, 1);
    278 		curl_setopt($curl, CURLOPT_FRESH_CONNECT, 1);
    279 		curl_setopt($curl, CURLOPT_POST, 1);
    280 		curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($s_data, '', "&"));
    281 		curl_setopt($curl, CURLOPT_HTTPHEADER, array('X-VPS-REQUEST-ID: ' . md5($order_info['order_id'] . mt_rand())));
    282 
    283 		$response = curl_exec($curl);
    284 
    285 		$response_data = array();
    286 
    287 		parse_str($response, $response_data);
    288 		
    289 		if ($this->config->get('payment_pp_pro_iframe_debug')) {
    290 			$log = new Log('pp_pro_iframe.log');
    291 			$log->write(print_r(json_encode($response_data), 1));
    292 		}
    293 		
    294 		curl_close($curl);
    295 
    296 		if (!$response || !isset($response_data['HOSTEDBUTTONID'])) {
    297 			return false;
    298 		} else {
    299 			return $response_data['HOSTEDBUTTONID'];
    300 		}
    301 	}
    302 }