PageRenderTime 40ms CodeModel.GetById 12ms RepoModel.GetById 0ms app.codeStats 0ms

/catalog/controller/payment/sagepay_direct.php

https://bitbucket.org/jjasko/opencart_serbian
PHP | 360 lines | 275 code | 85 blank | 0 comment | 57 complexity | aa9f1d94c4da99b7bdb2c8a941bb69d9 MD5 | raw file
  1. <?php
  2. class ControllerPaymentSagepayDirect extends Controller {
  3. protected function index() {
  4. $this->language->load('payment/sagepay_direct');
  5. $this->data['text_credit_card'] = $this->language->get('text_credit_card');
  6. $this->data['text_start_date'] = $this->language->get('text_start_date');
  7. $this->data['text_issue'] = $this->language->get('text_issue');
  8. $this->data['text_wait'] = $this->language->get('text_wait');
  9. $this->data['entry_cc_owner'] = $this->language->get('entry_cc_owner');
  10. $this->data['entry_cc_type'] = $this->language->get('entry_cc_type');
  11. $this->data['entry_cc_number'] = $this->language->get('entry_cc_number');
  12. $this->data['entry_cc_start_date'] = $this->language->get('entry_cc_start_date');
  13. $this->data['entry_cc_expire_date'] = $this->language->get('entry_cc_expire_date');
  14. $this->data['entry_cc_cvv2'] = $this->language->get('entry_cc_cvv2');
  15. $this->data['entry_cc_issue'] = $this->language->get('entry_cc_issue');
  16. $this->data['button_confirm'] = $this->language->get('button_confirm');
  17. $this->data['cards'] = array();
  18. $this->data['cards'][] = array(
  19. 'text' => 'Visa',
  20. 'value' => 'VISA'
  21. );
  22. $this->data['cards'][] = array(
  23. 'text' => 'MasterCard',
  24. 'value' => 'MC'
  25. );
  26. $this->data['cards'][] = array(
  27. 'text' => 'Visa Delta/Debit',
  28. 'value' => 'DELTA'
  29. );
  30. $this->data['cards'][] = array(
  31. 'text' => 'Solo',
  32. 'value' => 'SOLO'
  33. );
  34. $this->data['cards'][] = array(
  35. 'text' => 'Maestro',
  36. 'value' => 'MAESTRO'
  37. );
  38. $this->data['cards'][] = array(
  39. 'text' => 'Visa Electron UK Debit',
  40. 'value' => 'UKE'
  41. );
  42. $this->data['cards'][] = array(
  43. 'text' => 'American Express',
  44. 'value' => 'AMEX'
  45. );
  46. $this->data['cards'][] = array(
  47. 'text' => 'Diners Club',
  48. 'value' => 'DC'
  49. );
  50. $this->data['cards'][] = array(
  51. 'text' => 'Japan Credit Bureau',
  52. 'value' => 'JCB'
  53. );
  54. $this->data['months'] = array();
  55. for ($i = 1; $i <= 12; $i++) {
  56. $this->data['months'][] = array(
  57. 'text' => strftime('%B', mktime(0, 0, 0, $i, 1, 2000)),
  58. 'value' => sprintf('%02d', $i)
  59. );
  60. }
  61. $today = getdate();
  62. $this->data['year_valid'] = array();
  63. for ($i = $today['year'] - 10; $i < $today['year'] + 1; $i++) {
  64. $this->data['year_valid'][] = array(
  65. 'text' => strftime('%Y', mktime(0, 0, 0, 1, 1, $i)),
  66. 'value' => strftime('%Y', mktime(0, 0, 0, 1, 1, $i))
  67. );
  68. }
  69. $this->data['year_expire'] = array();
  70. for ($i = $today['year']; $i < $today['year'] + 11; $i++) {
  71. $this->data['year_expire'][] = array(
  72. 'text' => strftime('%Y', mktime(0, 0, 0, 1, 1, $i)),
  73. 'value' => strftime('%Y', mktime(0, 0, 0, 1, 1, $i))
  74. );
  75. }
  76. if (file_exists(DIR_TEMPLATE . $this->config->get('config_template') . '/template/payment/sagepay_direct.tpl')) {
  77. $this->template = $this->config->get('config_template') . '/template/payment/sagepay_direct.tpl';
  78. } else {
  79. $this->template = 'default/template/payment/sagepay_direct.tpl';
  80. }
  81. $this->render();
  82. }
  83. public function send() {
  84. if ($this->config->get('sagepay_direct_test') == 'live') {
  85. $url = 'https://live.sagepay.com/gateway/service/vspdirect-register.vsp';
  86. } elseif ($this->config->get('sagepay_direct_test') == 'test') {
  87. $url = 'https://test.sagepay.com/gateway/service/vspdirect-register.vsp';
  88. } elseif ($this->config->get('sagepay_direct_test') == 'sim') {
  89. $url = 'https://test.sagepay.com/Simulator/VSPDirectGateway.asp';
  90. }
  91. $this->load->model('checkout/order');
  92. $order_info = $this->model_checkout_order->getOrder($this->session->data['order_id']);
  93. $data = array();
  94. $data['VPSProtocol'] = '2.23';
  95. $data['ReferrerID'] = 'E511AF91-E4A0-42DE-80B0-09C981A3FB61';
  96. $data['Vendor'] = $this->config->get('sagepay_direct_vendor');
  97. $data['VendorTxCode'] = $this->session->data['order_id'];
  98. $data['Amount'] = $this->currency->format($order_info['total'], $order_info['currency_code'], 1.00000, false);
  99. $data['Currency'] = $this->currency->getCode();
  100. $data['Description'] = substr($this->config->get('config_name'), 0, 100);
  101. $data['CardHolder'] = $this->request->post['cc_owner'];
  102. $data['CardNumber'] = $this->request->post['cc_number'];
  103. $data['ExpiryDate'] = $this->request->post['cc_expire_date_month'] . substr($this->request->post['cc_expire_date_year'], 2);
  104. $data['CardType'] = $this->request->post['cc_type'];
  105. $data['TxType'] = $this->config->get('sagepay_direct_transaction');
  106. $data['StartDate'] = $this->request->post['cc_start_date_month'] . substr($this->request->post['cc_start_date_year'], 2);
  107. $data['IssueNumber'] = $this->request->post['cc_issue'];
  108. $data['CV2'] = $this->request->post['cc_cvv2'];
  109. $data['BillingSurname'] = substr($order_info['payment_lastname'], 0, 20);
  110. $data['BillingFirstnames'] = substr($order_info['payment_firstname'], 0, 20);
  111. $data['BillingAddress1'] = substr($order_info['payment_address_1'], 0, 100);
  112. if ($order_info['payment_address_2']) {
  113. $data['BillingAddress2'] = $order_info['payment_address_2'];
  114. }
  115. $data['BillingCity'] = substr($order_info['payment_city'], 0, 40);
  116. $data['BillingPostCode'] = substr($order_info['payment_postcode'], 0, 10);
  117. $data['BillingCountry'] = $order_info['payment_iso_code_2'];
  118. if ($order_info['payment_iso_code_2'] == 'US') {
  119. $data['BillingState'] = $order_info['payment_zone_code'];
  120. }
  121. $data['BillingPhone'] = substr($order_info['telephone'], 0, 20);
  122. if ($this->cart->hasShipping()) {
  123. $data['DeliverySurname'] = substr($order_info['shipping_lastname'], 0, 20);
  124. $data['DeliveryFirstnames'] = substr($order_info['shipping_firstname'], 0, 20);
  125. $data['DeliveryAddress1'] = substr($order_info['shipping_address_1'], 0, 100);
  126. if ($order_info['shipping_address_2']) {
  127. $data['DeliveryAddress2'] = $order_info['shipping_address_2'];
  128. }
  129. $data['DeliveryCity'] = substr($order_info['shipping_city'], 0, 40);
  130. $data['DeliveryPostCode'] = substr($order_info['shipping_postcode'], 0, 10);
  131. $data['DeliveryCountry'] = $order_info['shipping_iso_code_2'];
  132. if ($order_info['shipping_iso_code_2'] == 'US') {
  133. $data['DeliveryState'] = $order_info['shipping_zone_code'];
  134. }
  135. $data['CustomerName'] = substr($order_info['firstname'] . ' ' . $order_info['lastname'], 0, 100);
  136. $data['DeliveryPhone'] = substr($order_info['telephone'], 0, 20);
  137. } else {
  138. $data['DeliveryFirstnames'] = $order_info['payment_firstname'];
  139. $data['DeliverySurname'] = $order_info['payment_lastname'];
  140. $data['DeliveryAddress1'] = $order_info['payment_address_1'];
  141. if ($order_info['payment_address_2']) {
  142. $data['DeliveryAddress2'] = $order_info['payment_address_2'];
  143. }
  144. $data['DeliveryCity'] = $order_info['payment_city'];
  145. $data['DeliveryPostCode'] = $order_info['payment_postcode'];
  146. $data['DeliveryCountry'] = $order_info['payment_iso_code_2'];
  147. if ($order_info['payment_iso_code_2'] == 'US') {
  148. $data['DeliveryState'] = $order_info['payment_zone_code'];
  149. }
  150. $data['DeliveryPhone'] = $order_info['telephone'];
  151. }
  152. $data['CustomerEMail'] = substr($order_info['email'], 0, 255);
  153. $data['Apply3DSecure'] = '0';
  154. $data['ClientIPAddress'] = $this->request->server['REMOTE_ADDR'];
  155. $curl = curl_init($url);
  156. curl_setopt($curl, CURLOPT_PORT, 443);
  157. curl_setopt($curl, CURLOPT_HEADER, 0);
  158. curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
  159. curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
  160. curl_setopt($curl, CURLOPT_FORBID_REUSE, 1);
  161. curl_setopt($curl, CURLOPT_FRESH_CONNECT, 1);
  162. curl_setopt($curl, CURLOPT_POST, 1);
  163. curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($data));
  164. $response = curl_exec($curl);
  165. curl_close($curl);
  166. $data = array();
  167. $response_data = explode(chr(10), $response);
  168. foreach ($response_data as $string) {
  169. if (strpos($string, '=')) {
  170. $parts = explode('=', $string, 2);
  171. $data[trim($parts[0])] = trim($parts[1]);
  172. }
  173. }
  174. $json = array();
  175. if ($data['Status'] == '3DAUTH') {
  176. $json['ACSURL'] = $data['ACSURL'];
  177. $json['MD'] = $data['MD'];
  178. $json['PaReq'] = $data['PAReq'];
  179. $json['TermUrl'] = $this->url->link('payment/sagepay_direct/callback');
  180. } elseif ($data['Status'] == 'OK' || $data['Status'] == 'AUTHENTICATED' || $data['Status'] == 'REGISTERED') {
  181. $this->model_checkout_order->confirm($this->session->data['order_id'], $this->config->get('config_order_status_id'));
  182. $message = '';
  183. if (isset($data['TxAuthNo'])) {
  184. $message .= 'TxAuthNo: ' . $data['TxAuthNo'] . "\n";
  185. }
  186. if (isset($data['AVSCV2'])) {
  187. $message .= 'AVSCV2: ' . $data['AVSCV2'] . "\n";
  188. }
  189. if (isset($data['AddressResult'])) {
  190. $message .= 'AddressResult: ' . $data['AddressResult'] . "\n";
  191. }
  192. if (isset($data['PostCodeResult'])) {
  193. $message .= 'PostCodeResult: ' . $data['PostCodeResult'] . "\n";
  194. }
  195. if (isset($data['CV2Result'])) {
  196. $message .= 'CV2Result: ' . $data['CV2Result'] . "\n";
  197. }
  198. if (isset($data['3DSecureStatus'])) {
  199. $message .= '3DSecureStatus: ' . $data['3DSecureStatus'] . "\n";
  200. }
  201. if (isset($data['CAVV'])) {
  202. $message .= 'CAVV: ' . $data['CAVV'] . "\n";
  203. }
  204. $this->model_checkout_order->update($this->session->data['order_id'], $this->config->get('sagepay_direct_order_status_id'), $message, false);
  205. $json['success'] = $this->url->link('checkout/success');
  206. } else {
  207. $json['error'] = $data['StatusDetail'];
  208. }
  209. $this->response->setOutput(json_encode($json));
  210. }
  211. public function callback() {
  212. if (isset($this->session->data['order_id'])) {
  213. if ($this->config->get('sagepay_direct_test') == 'live') {
  214. $url = 'https://live.sagepay.com/gateway/service/direct3dcallback.vsp';
  215. } elseif ($this->config->get('sagepay_direct_test') == 'test') {
  216. $url = 'https://test.sagepay.com/gateway/service/direct3dcallback.vsp';
  217. } elseif ($this->config->get('sagepay_direct_test') == 'sim') {
  218. $url = 'https://test.sagepay.com/Simulator/VSPDirectCallback.asp';
  219. }
  220. $curl = curl_init($url);
  221. curl_setopt($curl, CURLOPT_PORT, 443);
  222. curl_setopt($curl, CURLOPT_HEADER, 0);
  223. curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
  224. curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
  225. curl_setopt($curl, CURLOPT_FORBID_REUSE, 1);
  226. curl_setopt($curl, CURLOPT_FRESH_CONNECT, 1);
  227. curl_setopt($curl, CURLOPT_POST, 1);
  228. curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($this->request->post));
  229. $response = curl_exec($curl);
  230. curl_close($curl);
  231. $data = array();
  232. $response_data = explode(chr(10), $response);
  233. foreach ($response_data as $string) {
  234. if (strpos($string, '=')) {
  235. $parts = explode('=', $string, 2);
  236. $data[trim($parts[0])] = trim($parts[1]);
  237. }
  238. }
  239. if ($data['Status'] == 'OK' || $data['Status'] == 'AUTHENTICATED' || $data['Status'] == 'REGISTERED') {
  240. $this->load->model('checkout/order');
  241. $this->model_checkout_order->confirm($this->session->data['order_id'], $this->config->get('config_order_status_id'));
  242. $message = '';
  243. if (isset($data['TxAuthNo'])) {
  244. $message .= 'TxAuthNo: ' . $data['TxAuthNo'] . "\n";
  245. }
  246. if (isset($data['AVSCV2'])) {
  247. $message .= 'AVSCV2: ' . $data['AVSCV2'] . "\n";
  248. }
  249. if (isset($data['AddressResult'])) {
  250. $message .= 'AddressResult: ' . $data['AddressResult'] . "\n";
  251. }
  252. if (isset($data['PostCodeResult'])) {
  253. $message .= 'PostCodeResult: ' . $data['PostCodeResult'] . "\n";
  254. }
  255. if (isset($data['CV2Result'])) {
  256. $message .= 'CV2Result: ' . $data['CV2Result'] . "\n";
  257. }
  258. if (isset($data['3DSecureStatus'])) {
  259. $message .= '3DSecureStatus: ' . $data['3DSecureStatus'] . "\n";
  260. }
  261. if (isset($data['CAVV'])) {
  262. $message .= 'CAVV: ' . $data['CAVV'] . "\n";
  263. }
  264. $this->model_checkout_order->update($this->session->data['order_id'], $this->config->get('sagepay_direct_order_status_id'), $message, false);
  265. $this->redirect($this->url->link('checkout/success'));
  266. } else {
  267. $this->session->data['error'] = $data['StatusDetail'];
  268. $this->redirect($this->url->link('checkout/checkout', '', 'SSL'));
  269. }
  270. } else {
  271. $this->redirect($this->url->link('account/login', '', 'SSL'));
  272. }
  273. }
  274. }
  275. ?>