PageRenderTime 23ms CodeModel.GetById 23ms RepoModel.GetById 1ms app.codeStats 0ms

/catalog/controller/payment/pp_pro_iframe.php

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