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 }