PageRenderTime 35ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 0ms

/catalog/controller/extension/payment/eway.php

https://gitlab.com/dadangnh/sb1-bon
PHP | 291 lines | 244 code | 44 blank | 3 comment | 39 complexity | 95690023618639c2fdeafbc40106231b MD5 | raw file
  1. <?php
  2. class ControllerExtensionPaymentEway extends Controller {
  3. public function index() {
  4. $this->load->language('extension/payment/eway');
  5. $data['button_confirm'] = $this->language->get('button_confirm');
  6. $data['button_pay'] = $this->language->get('button_pay');
  7. $data['text_credit_card'] = $this->language->get('text_credit_card');
  8. $data['text_loading'] = $this->language->get('text_loading');
  9. $data['entry_cc_name'] = $this->language->get('entry_cc_name');
  10. $data['entry_cc_number'] = $this->language->get('entry_cc_number');
  11. $data['entry_cc_expire_date'] = $this->language->get('entry_cc_expire_date');
  12. $data['entry_cc_cvv2'] = $this->language->get('entry_cc_cvv2');
  13. $data['text_card_type_pp'] = $this->language->get('text_card_type_pp');
  14. $data['text_card_type_mp'] = $this->language->get('text_card_type_mp');
  15. $data['text_card_type_vm'] = $this->language->get('text_card_type_vm');
  16. $data['text_type_help'] = $this->language->get('text_type_help');
  17. $data['help_cvv'] = $this->language->get('help_cvv');
  18. $data['help_cvv_amex'] = $this->language->get('help_cvv_amex');
  19. $data['payment_type'] = $this->config->get('eway_payment_type');
  20. $data['months'] = array();
  21. for ($i = 1; $i <= 12; $i++) {
  22. $data['months'][] = array(
  23. 'text' => sprintf('%02d', $i),
  24. 'value' => sprintf('%02d', $i)
  25. );
  26. }
  27. $today = getdate();
  28. $data['year_expire'] = array();
  29. for ($i = $today['year']; $i < $today['year'] + 11; $i++) {
  30. $data['year_expire'][] = array(
  31. 'text' => strftime('%Y', mktime(0, 0, 0, 1, 1, $i)),
  32. 'value' => strftime('%Y', mktime(0, 0, 0, 1, 1, $i))
  33. );
  34. }
  35. $this->load->model('checkout/order');
  36. $order_info = $this->model_checkout_order->getOrder($this->session->data['order_id']);
  37. $amount = $this->currency->format($order_info['total'], $order_info['currency_code'], $order_info['currency_value'], false);
  38. if ($this->config->get('eway_test')) {
  39. $data['text_testing'] = $this->language->get('text_testing');
  40. $data['Endpoint'] = 'Sandbox';
  41. } else {
  42. $data['Endpoint'] = 'Production';
  43. }
  44. $request = new stdClass();
  45. $request->Customer = new stdClass();
  46. $request->Customer->Title = 'Mr.';
  47. $request->Customer->FirstName = (string)substr($order_info['payment_firstname'], 0, 50);
  48. $request->Customer->LastName = (string)substr($order_info['payment_lastname'], 0, 50);
  49. $request->Customer->CompanyName = (string)substr($order_info['payment_company'], 0, 50);
  50. $request->Customer->Street1 = (string)substr($order_info['payment_address_1'], 0, 50);
  51. $request->Customer->Street2 = (string)substr($order_info['payment_address_2'], 0, 50);
  52. $request->Customer->City = (string)substr($order_info['payment_city'], 0, 50);
  53. $request->Customer->State = (string)substr($order_info['payment_zone'], 0, 50);
  54. $request->Customer->PostalCode = (string)substr($order_info['payment_postcode'], 0, 30);
  55. $request->Customer->Country = strtolower($order_info['payment_iso_code_2']);
  56. $request->Customer->Email = $order_info['email'];
  57. $request->Customer->Phone = (string)substr($order_info['telephone'], 0, 32);
  58. $request->ShippingAddress = new stdClass();
  59. $request->ShippingAddress->FirstName = (string)substr($order_info['shipping_firstname'], 0, 50);
  60. $request->ShippingAddress->LastName = (string)substr($order_info['shipping_lastname'], 0, 50);
  61. $request->ShippingAddress->Street1 = (string)substr($order_info['shipping_address_1'], 0, 50);
  62. $request->ShippingAddress->Street2 = (string)substr($order_info['shipping_address_2'], 0, 50);
  63. $request->ShippingAddress->City = (string)substr($order_info['shipping_city'], 0, 50);
  64. $request->ShippingAddress->State = (string)substr($order_info['shipping_zone'], 0, 50);
  65. $request->ShippingAddress->PostalCode = (string)substr($order_info['shipping_postcode'], 0, 30);
  66. $request->ShippingAddress->Country = strtolower($order_info['shipping_iso_code_2']);
  67. $request->ShippingAddress->Email = $order_info['email'];
  68. $request->ShippingAddress->Phone = (string)substr($order_info['telephone'], 0, 32);
  69. $request->ShippingAddress->ShippingMethod = "Unknown";
  70. $invoice_desc = '';
  71. foreach ($this->cart->getProducts() as $product) {
  72. $item_price = $this->currency->format($product['price'], $order_info['currency_code'], false, false);
  73. $item_total = $this->currency->format($product['total'], $order_info['currency_code'], false, false);
  74. $item = new stdClass();
  75. $item->SKU = (string)substr($product['product_id'], 0, 12);
  76. $item->Description = (string)substr($product['name'], 0, 26);
  77. $item->Quantity = strval($product['quantity']);
  78. $item->UnitCost = strval($item_price * 100);
  79. $item->Total = strval($item_total * 100);
  80. $request->Items[] = $item;
  81. $invoice_desc .= $product['name'] . ', ';
  82. }
  83. $invoice_desc = (string)substr($invoice_desc, 0, -2);
  84. if (strlen($invoice_desc) > 64) {
  85. $invoice_desc = (string)substr($invoice_desc, 0, 61) . '...';
  86. }
  87. $shipping = $this->currency->format($order_info['total'] - $this->cart->getSubTotal(), $order_info['currency_code'], false, false);
  88. if ($shipping > 0) {
  89. $item = new stdClass();
  90. $item->SKU = '';
  91. $item->Description = (string)substr($this->language->get('text_shipping'), 0, 26);
  92. $item->Quantity = 1;
  93. $item->UnitCost = $shipping * 100;
  94. $item->Total = $shipping * 100;
  95. $request->Items[] = $item;
  96. }
  97. $opt1 = new stdClass();
  98. $opt1->Value = $order_info['order_id'];
  99. $request->Options = array($opt1);
  100. $request->Payment = new stdClass();
  101. $request->Payment->TotalAmount = number_format($amount, 2, '.', '') * 100;
  102. $request->Payment->InvoiceNumber = $this->session->data['order_id'];
  103. $request->Payment->InvoiceDescription = $invoice_desc;
  104. $request->Payment->InvoiceReference = (string)substr($this->config->get('config_name'), 0, 40) . ' - #' . $order_info['order_id'];
  105. $request->Payment->CurrencyCode = $order_info['currency_code'];
  106. $request->RedirectUrl = $this->url->link('extension/payment/eway/callback', '', true);
  107. if ($this->config->get('eway_transaction_method') == 'auth') {
  108. $request->Method = 'Authorise';
  109. } else {
  110. $request->Method = 'ProcessPayment';
  111. }
  112. $request->TransactionType = 'Purchase';
  113. $request->DeviceID = 'opencart-' . VERSION . ' eway-trans-2.1.2';
  114. $request->CustomerIP = $this->request->server['REMOTE_ADDR'];
  115. $this->load->model('extension/payment/eway');
  116. $template = 'eway';
  117. if ($this->config->get('eway_paymode') == 'iframe') {
  118. $request->CancelUrl = 'http://www.example.org';
  119. $request->CustomerReadOnly = true;
  120. $result = $this->model_extension_payment_eway->getSharedAccessCode($request);
  121. $template = 'eway_iframe';
  122. } else {
  123. $result = $this->model_extension_payment_eway->getAccessCode($request);
  124. }
  125. // Check if any error returns
  126. if (isset($result->Errors)) {
  127. $error_array = explode(",", $result->Errors);
  128. $lbl_error = "";
  129. foreach ($error_array as $error) {
  130. $error = $this->language->get('text_card_message_' . $error);
  131. $lbl_error .= $error . "<br />\n";
  132. }
  133. $this->log->write('eWAY Payment error: ' . $lbl_error);
  134. }
  135. if (isset($lbl_error)) {
  136. $data['error'] = $lbl_error;
  137. } else {
  138. if ($this->config->get('eway_paymode') == 'iframe') {
  139. $data['callback'] = $this->url->link('extension/payment/eway/callback', 'AccessCode=' . $result->AccessCode, true);
  140. $data['SharedPaymentUrl'] = $result->SharedPaymentUrl;
  141. }
  142. $data['action'] = $result->FormActionURL;
  143. $data['AccessCode'] = $result->AccessCode;
  144. }
  145. return $this->load->view('extension/payment/' . $template, $data);
  146. }
  147. public function callback() {
  148. $this->load->language('extension/payment/eway');
  149. if (isset($this->request->get['AccessCode']) || isset($this->request->get['amp;AccessCode'])) {
  150. $this->load->model('extension/payment/eway');
  151. if (isset($this->request->get['amp;AccessCode'])) {
  152. $access_code = $this->request->get['amp;AccessCode'];
  153. } else {
  154. $access_code = $this->request->get['AccessCode'];
  155. }
  156. $result = $this->model_extension_payment_eway->getAccessCodeResult($access_code);
  157. $is_error = false;
  158. // Check if any error returns
  159. if (isset($result->Errors)) {
  160. $error_array = explode(",", $result->Errors);
  161. $is_error = true;
  162. $lbl_error = '';
  163. foreach ($error_array as $error) {
  164. $error = $this->language->get('text_card_message_' . $error);
  165. $lbl_error .= $error . ", ";
  166. }
  167. $this->log->write('eWAY error: ' . $lbl_error);
  168. }
  169. if (!$is_error) {
  170. $fraud = false;
  171. if (!$result->TransactionStatus) {
  172. $error_array = explode(", ", $result->ResponseMessage);
  173. $is_error = true;
  174. $lbl_error = '';
  175. $log_error = '';
  176. foreach ($error_array as $error) {
  177. // Don't show fraud issues to customers
  178. if (stripos($error, 'F') === false) {
  179. $lbl_error .= $this->language->get('text_card_message_' . $error);
  180. } else {
  181. $fraud = true;
  182. }
  183. $log_error .= $this->language->get('text_card_message_' . $error) . ", ";
  184. }
  185. $log_error = substr($log_error, 0, -2);
  186. $this->log->write('eWAY payment failed: ' . $log_error);
  187. }
  188. }
  189. $this->load->model('checkout/order');
  190. if ($is_error) {
  191. if ($fraud) {
  192. $this->response->redirect($this->url->link('checkout/failure', '', true));
  193. } else {
  194. $this->session->data['error'] = $this->language->get('text_transaction_failed');
  195. $this->response->redirect($this->url->link('checkout/checkout', '', true));
  196. }
  197. } else {
  198. $order_id = $result->Options[0]->Value;
  199. $order_info = $this->model_checkout_order->getOrder($order_id);
  200. $this->load->model('extension/payment/eway');
  201. $eway_order_data = array(
  202. 'order_id' => $order_id,
  203. 'transaction_id' => $result->TransactionID,
  204. 'amount' => $result->TotalAmount / 100,
  205. 'currency_code' => $order_info['currency_code'],
  206. 'debug_data' => json_encode($result)
  207. );
  208. $error_array = explode(", ", $result->ResponseMessage);
  209. $log_error = '';
  210. foreach ($error_array as $error) {
  211. if (stripos($error, 'F') !== false) {
  212. $fraud = true;
  213. $log_error .= $this->language->get('text_card_message_' . $error) . ", ";
  214. }
  215. }
  216. $log_error = substr($log_error, 0, -2);
  217. $eway_order_id = $this->model_extension_payment_eway->addOrder($eway_order_data);
  218. $this->model_extension_payment_eway->addTransaction($eway_order_id, $this->config->get('eway_transaction_method'), $result->TransactionID, $order_info);
  219. if ($fraud) {
  220. $message = 'Suspected fraud order: ' . $log_error . "\n";
  221. } else {
  222. $message = "eWAY Payment accepted\n";
  223. }
  224. $message .= 'Transaction ID: ' . $result->TransactionID . "\n";
  225. $message .= 'Authorisation Code: ' . $result->AuthorisationCode . "\n";
  226. $message .= 'Card Response Code: ' . $result->ResponseCode . "\n";
  227. if ($fraud) {
  228. $this->model_checkout_order->addOrderHistory($order_id, $this->config->get('eway_order_status_fraud_id'), $message);
  229. } elseif ($this->config->get('eway_transaction_method') == 'payment') {
  230. $this->model_checkout_order->addOrderHistory($order_id, $this->config->get('eway_order_status_id'), $message);
  231. } else {
  232. $this->model_checkout_order->addOrderHistory($order_id, $this->config->get('eway_order_status_auth_id'), $message);
  233. }
  234. if (!empty($result->Customer->TokenCustomerID) && $this->customer->isLogged() && !$this->model_checkout_order->checkToken($result->Customer->TokenCustomerID)) {
  235. $card_data = array();
  236. $card_data['customer_id'] = $this->customer->getId();
  237. $card_data['Token'] = $result->Customer->TokenCustomerID;
  238. $card_data['Last4Digits'] = substr(str_replace(' ', '', $result->Customer->CardDetails->Number), -4, 4);
  239. $card_data['ExpiryDate'] = $result->Customer->CardDetails->ExpiryMonth . '/' . $result->Customer->CardDetails->ExpiryYear;
  240. $card_data['CardType'] = '';
  241. $this->model_extension_payment_eway->addFullCard($this->session->data['order_id'], $card_data);
  242. }
  243. $this->response->redirect($this->url->link('checkout/success', '', true));
  244. }
  245. }
  246. }
  247. }