PageRenderTime 48ms CodeModel.GetById 21ms RepoModel.GetById 1ms app.codeStats 0ms

/catalog/controller/payment/sagepay.php

https://bitbucket.org/jjasko/opencart_serbian
PHP | 257 lines | 193 code | 64 blank | 0 comment | 42 complexity | edced3a34a007e9762af9d07bca3471a MD5 | raw file
  1. <?php
  2. class ControllerPaymentSagepay extends Controller {
  3. protected function index() {
  4. $this->language->load('payment/sagepay');
  5. $this->data['button_confirm'] = $this->language->get('button_confirm');
  6. if ($this->config->get('sagepay_test') == 'live') {
  7. $this->data['action'] = 'https://live.sagepay.com/gateway/service/vspform-register.vsp';
  8. } elseif ($this->config->get('sagepay_test') == 'test') {
  9. $this->data['action'] = 'https://test.sagepay.com/gateway/service/vspform-register.vsp';
  10. } elseif ($this->config->get('sagepay_test') == 'sim') {
  11. $this->data['action'] = 'https://test.sagepay.com/simulator/vspformgateway.asp';
  12. }
  13. $vendor = $this->config->get('sagepay_vendor');
  14. $password = $this->config->get('sagepay_password');
  15. $this->load->model('checkout/order');
  16. $order_info = $this->model_checkout_order->getOrder($this->session->data['order_id']);
  17. $data = array();
  18. $data['VendorTxCode'] = $this->session->data['order_id'];
  19. $data['ReferrerID'] = 'E511AF91-E4A0-42DE-80B0-09C981A3FB61';
  20. $data['Amount'] = $this->currency->format($order_info['total'], $order_info['currency_code'], $order_info['currency_value'], false);
  21. $data['Currency'] = $order_info['currency_code'];
  22. $data['Description'] = sprintf($this->language->get('text_description'), date($this->language->get('date_format_short')), $this->session->data['order_id']);
  23. $data['SuccessURL'] = str_replace('&amp;', '&', $this->url->link('payment/sagepay/success', 'order_id=' . $this->session->data['order_id']));
  24. $data['FailureURL'] = str_replace('&amp;', '&', $this->url->link('checkout/checkout', '', 'SSL'));
  25. $data['CustomerName'] = html_entity_decode($order_info['payment_firstname'] . ' ' . $order_info['payment_lastname'], ENT_QUOTES, 'UTF-8');
  26. $data['SendEMail'] = '1';
  27. $data['CustomerEMail'] = $order_info['email'];
  28. $data['VendorEMail'] = $this->config->get('config_email');
  29. $data['BillingFirstnames'] = $order_info['payment_firstname'];
  30. $data['BillingSurname'] = $order_info['payment_lastname'];
  31. $data['BillingAddress1'] = $order_info['payment_address_1'];
  32. if ($order_info['payment_address_2']) {
  33. $data['BillingAddress2'] = $order_info['payment_address_2'];
  34. }
  35. $data['BillingCity'] = $order_info['payment_city'];
  36. $data['BillingPostCode'] = $order_info['payment_postcode'];
  37. $data['BillingCountry'] = $order_info['payment_iso_code_2'];
  38. if ($order_info['payment_iso_code_2'] == 'US') {
  39. $data['BillingState'] = $order_info['payment_zone_code'];
  40. }
  41. $data['BillingPhone'] = $order_info['telephone'];
  42. if ($this->cart->hasShipping()) {
  43. $data['DeliveryFirstnames'] = $order_info['shipping_firstname'];
  44. $data['DeliverySurname'] = $order_info['shipping_lastname'];
  45. $data['DeliveryAddress1'] = $order_info['shipping_address_1'];
  46. if ($order_info['shipping_address_2']) {
  47. $data['DeliveryAddress2'] = $order_info['shipping_address_2'];
  48. }
  49. $data['DeliveryCity'] = $order_info['shipping_city'];
  50. $data['DeliveryPostCode'] = $order_info['shipping_postcode'];
  51. $data['DeliveryCountry'] = $order_info['shipping_iso_code_2'];
  52. if ($order_info['shipping_iso_code_2'] == 'US') {
  53. $data['DeliveryState'] = $order_info['shipping_zone_code'];
  54. }
  55. $data['DeliveryPhone'] = $order_info['telephone'];
  56. } else {
  57. $data['DeliveryFirstnames'] = $order_info['payment_firstname'];
  58. $data['DeliverySurname'] = $order_info['payment_lastname'];
  59. $data['DeliveryAddress1'] = $order_info['payment_address_1'];
  60. if ($order_info['payment_address_2']) {
  61. $data['DeliveryAddress2'] = $order_info['payment_address_2'];
  62. }
  63. $data['DeliveryCity'] = $order_info['payment_city'];
  64. $data['DeliveryPostCode'] = $order_info['payment_postcode'];
  65. $data['DeliveryCountry'] = $order_info['payment_iso_code_2'];
  66. if ($order_info['payment_iso_code_2'] == 'US') {
  67. $data['DeliveryState'] = $order_info['payment_zone_code'];
  68. }
  69. $data['DeliveryPhone'] = $order_info['telephone'];
  70. }
  71. $data['AllowGiftAid'] = '0';
  72. if (!$this->config->get('sagepay_transaction')) {
  73. $data['ApplyAVSCV2'] = '0';
  74. }
  75. $data['Apply3DSecure'] = '0';
  76. $this->data['transaction'] = $this->config->get('sagepay_transaction');
  77. $this->data['vendor'] = $vendor;
  78. $crypt_data = array();
  79. foreach($data as $key => $value){
  80. $crypt_data[] = $key . '=' . $value;
  81. }
  82. $this->data['crypt'] = base64_encode($this->simpleXor(implode('&', $crypt_data), $password));
  83. if (file_exists(DIR_TEMPLATE . $this->config->get('config_template') . '/template/payment/sagepay.tpl')) {
  84. $this->template = $this->config->get('config_template') . '/template/payment/sagepay.tpl';
  85. } else {
  86. $this->template = 'default/template/payment/sagepay.tpl';
  87. }
  88. $this->render();
  89. }
  90. public function success() {
  91. if (isset($this->request->get['crypt'])) {
  92. $string = base64_decode(str_replace(' ', '+', $this->request->get['crypt']));
  93. $password = $this->config->get('sagepay_password');
  94. $output = $this->simpleXor($string, $password);
  95. $data = $this->getToken($output);
  96. if ($data && is_array($data)) {
  97. $this->load->model('checkout/order');
  98. $this->model_checkout_order->confirm($this->request->get['order_id'], $this->config->get('config_order_status_id'));
  99. $message = '';
  100. if (isset($data['VPSTxId'])) {
  101. $message .= 'VPSTxId: ' . $data['VPSTxId'] . "\n";
  102. }
  103. if (isset($data['TxAuthNo'])) {
  104. $message .= 'TxAuthNo: ' . $data['TxAuthNo'] . "\n";
  105. }
  106. if (isset($data['AVSCV2'])) {
  107. $message .= 'AVSCV2: ' . $data['AVSCV2'] . "\n";
  108. }
  109. if (isset($data['AddressResult'])) {
  110. $message .= 'AddressResult: ' . $data['AddressResult'] . "\n";
  111. }
  112. if (isset($data['PostCodeResult'])) {
  113. $message .= 'PostCodeResult: ' . $data['PostCodeResult'] . "\n";
  114. }
  115. if (isset($data['CV2Result'])) {
  116. $message .= 'CV2Result: ' . $data['CV2Result'] . "\n";
  117. }
  118. if (isset($data['3DSecureStatus'])) {
  119. $message .= '3DSecureStatus: ' . $data['3DSecureStatus'] . "\n";
  120. }
  121. if (isset($data['CAVV'])) {
  122. $message .= 'CAVV: ' . $data['CAVV'] . "\n";
  123. }
  124. if (isset($data['CardType'])) {
  125. $message .= 'CardType: ' . $data['CardType'] . "\n";
  126. }
  127. if (isset($data['Last4Digits'])) {
  128. $message .= 'Last4Digits: ' . $data['Last4Digits'] . "\n";
  129. }
  130. if ($data['Status'] == 'OK') {
  131. $this->model_checkout_order->update($this->request->get['order_id'], $this->config->get('sagepay_order_status_id'), $message, false);
  132. } else {
  133. $this->model_checkout_order->update($this->request->get['order_id'], $this->config->get('config_order_status_id'), $message, false);
  134. }
  135. $this->redirect($this->url->link('checkout/success'));
  136. }
  137. }
  138. }
  139. private function simpleXor($string, $password) {
  140. $data = array();
  141. for ($i = 0; $i < utf8_strlen($password); $i++) {
  142. $data[$i] = ord(substr($password, $i, 1));
  143. }
  144. $output = '';
  145. for ($i = 0; $i < utf8_strlen($string); $i++) {
  146. $output .= chr(ord(substr($string, $i, 1)) ^ ($data[$i % utf8_strlen($password)]));
  147. }
  148. return $output;
  149. }
  150. private function getToken($string) {
  151. $tokens = array(
  152. 'Status',
  153. 'StatusDetail',
  154. 'VendorTxCode',
  155. 'VPSTxId',
  156. 'TxAuthNo',
  157. 'Amount',
  158. 'AVSCV2',
  159. 'AddressResult',
  160. 'PostCodeResult',
  161. 'CV2Result',
  162. 'GiftAid',
  163. '3DSecureStatus',
  164. 'CAVV',
  165. 'AddressStatus',
  166. 'CardType',
  167. 'Last4Digits',
  168. 'PayerStatus',
  169. 'CardType'
  170. );
  171. $output = array();
  172. $data = array();
  173. for ($i = count($tokens) - 1; $i >= 0; $i--){
  174. $start = strpos($string, $tokens[$i]);
  175. if ($start){
  176. $data[$i]['start'] = $start;
  177. $data[$i]['token'] = $tokens[$i];
  178. }
  179. }
  180. sort($data);
  181. for ($i = 0; $i < count($data); $i++){
  182. $start = $data[$i]['start'] + strlen($data[$i]['token']) + 1;
  183. if ($i == (count($data) - 1)) {
  184. $output[$data[$i]['token']] = substr($string, $start);
  185. } else {
  186. $length = $data[$i+1]['start'] - $data[$i]['start'] - strlen($data[$i]['token']) - 2;
  187. $output[$data[$i]['token']] = substr($string, $start, $length);
  188. }
  189. }
  190. return $output;
  191. }
  192. }
  193. ?>