PageRenderTime 48ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 0ms

/admin/model/extension/payment/sagepay_server.php

https://gitlab.com/dadangnh/sb1-bon
PHP | 266 lines | 221 code | 45 blank | 0 comment | 32 complexity | 15bf9170c241da8d4e87185dcb2865ec MD5 | raw file
  1. <?php
  2. class ModelExtensionPaymentSagepayServer extends Model {
  3. public function install() {
  4. $this->db->query("
  5. CREATE TABLE IF NOT EXISTS `" . DB_PREFIX . "sagepay_server_order` (
  6. `sagepay_server_order_id` INT(11) NOT NULL AUTO_INCREMENT,
  7. `order_id` INT(11) NOT NULL,
  8. `customer_id` INT(11) NOT NULL,
  9. `VPSTxId` VARCHAR(50),
  10. `VendorTxCode` VARCHAR(50) NOT NULL,
  11. `SecurityKey` CHAR(50) NOT NULL,
  12. `TxAuthNo` INT(50),
  13. `date_added` DATETIME NOT NULL,
  14. `date_modified` DATETIME NOT NULL,
  15. `release_status` INT(1) DEFAULT NULL,
  16. `void_status` INT(1) DEFAULT NULL,
  17. `settle_type` INT(1) DEFAULT NULL,
  18. `rebate_status` INT(1) DEFAULT NULL,
  19. `currency_code` CHAR(3) NOT NULL,
  20. `total` DECIMAL( 10, 2 ) NOT NULL,
  21. PRIMARY KEY (`sagepay_server_order_id`)
  22. ) ENGINE=MyISAM DEFAULT COLLATE=utf8_general_ci;");
  23. $this->db->query("
  24. CREATE TABLE IF NOT EXISTS `" . DB_PREFIX . "sagepay_server_order_transaction` (
  25. `sagepay_server_order_transaction_id` INT(11) NOT NULL AUTO_INCREMENT,
  26. `sagepay_server_order_id` INT(11) NOT NULL,
  27. `date_added` DATETIME NOT NULL,
  28. `type` ENUM('auth', 'payment', 'rebate', 'void') DEFAULT NULL,
  29. `amount` DECIMAL( 10, 2 ) NOT NULL,
  30. PRIMARY KEY (`sagepay_server_order_transaction_id`)
  31. ) ENGINE=MyISAM DEFAULT COLLATE=utf8_general_ci;");
  32. $this->db->query("
  33. CREATE TABLE IF NOT EXISTS `" . DB_PREFIX . "sagepay_server_order_recurring` (
  34. `sagepay_server_order_recurring_id` INT(11) NOT NULL AUTO_INCREMENT,
  35. `order_id` INT(11) NOT NULL,
  36. `order_recurring_id` INT(11) NOT NULL,
  37. `VPSTxId` VARCHAR(50),
  38. `VendorTxCode` VARCHAR(50) NOT NULL,
  39. `SecurityKey` CHAR(50) NOT NULL,
  40. `TxAuthNo` INT(50),
  41. `date_added` DATETIME NOT NULL,
  42. `date_modified` DATETIME NOT NULL,
  43. `next_payment` DATETIME NOT NULL,
  44. `trial_end` datetime DEFAULT NULL,
  45. `subscription_end` datetime DEFAULT NULL,
  46. `currency_code` CHAR(3) NOT NULL,
  47. `total` DECIMAL( 10, 2 ) NOT NULL,
  48. PRIMARY KEY (`sagepay_server_order_recurring_id`)
  49. ) ENGINE=MyISAM DEFAULT COLLATE=utf8_general_ci;");
  50. $this->db->query("
  51. CREATE TABLE IF NOT EXISTS `" . DB_PREFIX . "sagepay_server_card` (
  52. `card_id` INT(11) NOT NULL AUTO_INCREMENT,
  53. `customer_id` INT(11) NOT NULL,
  54. `order_id` INT(11) NOT NULL,
  55. `token` VARCHAR(50) NOT NULL,
  56. `digits` VARCHAR(4) NOT NULL,
  57. `expiry` VARCHAR(5) NOT NULL,
  58. `type` VARCHAR(50) NOT NULL,
  59. PRIMARY KEY (`card_id`)
  60. ) ENGINE=MyISAM DEFAULT COLLATE=utf8_general_ci;");
  61. }
  62. public function uninstall() {
  63. $this->db->query("DROP TABLE IF EXISTS `" . DB_PREFIX . "sagepay_server_order`;");
  64. $this->db->query("DROP TABLE IF EXISTS `" . DB_PREFIX . "sagepay_server_order_transaction`;");
  65. $this->db->query("DROP TABLE IF EXISTS `" . DB_PREFIX . "sagepay_server_order_recurring`;");
  66. $this->db->query("DROP TABLE IF EXISTS `" . DB_PREFIX . "sagepay_server_card`;");
  67. }
  68. public function void($order_id) {
  69. $sagepay_server_order = $this->getOrder($order_id);
  70. if (!empty($sagepay_server_order) && $sagepay_server_order['release_status'] == 0) {
  71. $void_data = array();
  72. if ($this->config->get('sagepay_server_test') == 'live') {
  73. $url = 'https://live.sagepay.com/gateway/service/void.vsp';
  74. $void_data['VPSProtocol'] = '3.00';
  75. } elseif ($this->config->get('sagepay_server_test') == 'test') {
  76. $url = 'https://test.sagepay.com/gateway/service/void.vsp';
  77. $void_data['VPSProtocol'] = '3.00';
  78. } elseif ($this->config->get('sagepay_server_test') == 'sim') {
  79. $url = 'https://test.sagepay.com/Simulator/VSPServerGateway.asp?Service=VendorVoidTx';
  80. $void_data['VPSProtocol'] = '2.23';
  81. }
  82. $void_data['TxType'] = 'VOID';
  83. $void_data['Vendor'] = $this->config->get('sagepay_server_vendor');
  84. $void_data['VendorTxCode'] = $sagepay_server_order['VendorTxCode'];
  85. $void_data['VPSTxId'] = $sagepay_server_order['VPSTxId'];
  86. $void_data['SecurityKey'] = $sagepay_server_order['SecurityKey'];
  87. $void_data['TxAuthNo'] = $sagepay_server_order['TxAuthNo'];
  88. $response_data = $this->sendCurl($url, $void_data);
  89. return $response_data;
  90. } else {
  91. return false;
  92. }
  93. }
  94. public function updateVoidStatus($sagepay_server_order_id, $status) {
  95. $this->db->query("UPDATE `" . DB_PREFIX . "sagepay_server_order` SET `void_status` = '" . (int)$status . "' WHERE `sagepay_server_order_id` = '" . (int)$sagepay_server_order_id . "'");
  96. }
  97. public function release($order_id, $amount) {
  98. $sagepay_server_order = $this->getOrder($order_id);
  99. $total_released = $this->getTotalReleased($sagepay_server_order['sagepay_server_order_id']);
  100. if (!empty($sagepay_server_order) && $sagepay_server_order['release_status'] == 0 && ($total_released + $amount <= $sagepay_server_order['total'])) {
  101. $release_data = array();
  102. if ($this->config->get('sagepay_server_test') == 'live') {
  103. $url = 'https://live.sagepay.com/gateway/service/release.vsp';
  104. $release_data['VPSProtocol'] = '3.00';
  105. } elseif ($this->config->get('sagepay_server_test') == 'test') {
  106. $url = 'https://test.sagepay.com/gateway/service/release.vsp';
  107. $release_data['VPSProtocol'] = '3.00';
  108. } elseif ($this->config->get('sagepay_server_test') == 'sim') {
  109. $url = 'https://test.sagepay.com/Simulator/VSPServerGateway.asp?Service=VendorReleaseTx';
  110. $release_data['VPSProtocol'] = '2.23';
  111. }
  112. $release_data['TxType'] = 'RELEASE';
  113. $release_data['Vendor'] = $this->config->get('sagepay_server_vendor');
  114. $release_data['VendorTxCode'] = $sagepay_server_order['VendorTxCode'];
  115. $release_data['VPSTxId'] = $sagepay_server_order['VPSTxId'];
  116. $release_data['SecurityKey'] = $sagepay_server_order['SecurityKey'];
  117. $release_data['TxAuthNo'] = $sagepay_server_order['TxAuthNo'];
  118. $release_data['Amount'] = $amount;
  119. $response_data = $this->sendCurl($url, $release_data);
  120. return $response_data;
  121. } else {
  122. return false;
  123. }
  124. }
  125. public function updateReleaseStatus($sagepay_server_order_id, $status) {
  126. $this->db->query("UPDATE `" . DB_PREFIX . "sagepay_server_order` SET `release_status` = '" . (int)$status . "' WHERE `sagepay_server_order_id` = '" . (int)$sagepay_server_order_id . "'");
  127. }
  128. public function updateForRebate($sagepay_server_order_id, $order_ref) {
  129. $this->db->query("UPDATE `" . DB_PREFIX . "sagepay_server_order` SET `order_ref_previous` = '_multisettle_" . $this->db->escape($order_ref) . "' WHERE `sagepay_server_order_id` = '" . (int)$sagepay_server_order_id . "' LIMIT 1");
  130. }
  131. public function rebate($order_id, $amount) {
  132. $sagepay_server_order = $this->getOrder($order_id);
  133. if (!empty($sagepay_server_order) && $sagepay_server_order['rebate_status'] != 1) {
  134. $refund_data = array();
  135. if ($this->config->get('sagepay_server_test') == 'live') {
  136. $url = 'https://live.sagepay.com/gateway/service/refund.vsp';
  137. $refund_data['VPSProtocol'] = '3.00';
  138. } elseif ($this->config->get('sagepay_server_test') == 'test') {
  139. $url = 'https://test.sagepay.com/gateway/service/refund.vsp';
  140. $refund_data['VPSProtocol'] = '3.00';
  141. } elseif ($this->config->get('sagepay_server_test') == 'sim') {
  142. $url = 'https://test.sagepay.com/Simulator/VSPServerGateway.asp?Service=VendorRefundTx';
  143. $refund_data['VPSProtocol'] = '2.23';
  144. }
  145. $refund_data['TxType'] = 'REFUND';
  146. $refund_data['Vendor'] = $this->config->get('sagepay_server_vendor');
  147. $refund_data['VendorTxCode'] = $sagepay_server_order['sagepay_server_order_id'] . rand();
  148. $refund_data['Amount'] = $amount;
  149. $refund_data['Currency'] = $sagepay_server_order['currency_code'];
  150. $refund_data['Description'] = substr($this->config->get('config_name'), 0, 100);
  151. $refund_data['RelatedVPSTxId'] = $sagepay_server_order['VPSTxId'];
  152. $refund_data['RelatedVendorTxCode'] = $sagepay_server_order['VendorTxCode'];
  153. $refund_data['RelatedSecurityKey'] = $sagepay_server_order['SecurityKey'];
  154. $refund_data['RelatedTxAuthNo'] = $sagepay_server_order['TxAuthNo'];
  155. $response_data = $this->sendCurl($url, $refund_data);
  156. return $response_data;
  157. } else {
  158. return false;
  159. }
  160. }
  161. public function getOrder($order_id) {
  162. $qry = $this->db->query("SELECT * FROM `" . DB_PREFIX . "sagepay_server_order` WHERE `order_id` = '" . (int)$order_id . "' LIMIT 1");
  163. if ($qry->num_rows) {
  164. $order = $qry->row;
  165. $order['transactions'] = $this->getTransactions($order['sagepay_server_order_id']);
  166. return $order;
  167. } else {
  168. return false;
  169. }
  170. }
  171. private function getTransactions($sagepay_server_order_id) {
  172. $qry = $this->db->query("SELECT * FROM `" . DB_PREFIX . "sagepay_server_order_transaction` WHERE `sagepay_server_order_id` = '" . (int)$sagepay_server_order_id . "'");
  173. if ($qry->num_rows) {
  174. return $qry->rows;
  175. } else {
  176. return false;
  177. }
  178. }
  179. public function addTransaction($sagepay_server_order_id, $type, $total) {
  180. $this->db->query("INSERT INTO `" . DB_PREFIX . "sagepay_server_order_transaction` SET `sagepay_server_order_id` = '" . (int)$sagepay_server_order_id . "', `date_added` = now(), `type` = '" . $this->db->escape($type) . "', `amount` = '" . (float)$total . "'");
  181. }
  182. public function getTotalReleased($sagepay_server_order_id) {
  183. $query = $this->db->query("SELECT SUM(`amount`) AS `total` FROM `" . DB_PREFIX . "sagepay_server_order_transaction` WHERE `sagepay_server_order_id` = '" . (int)$sagepay_server_order_id . "' AND (`type` = 'payment' OR `type` = 'rebate')");
  184. return (float)$query->row['total'];
  185. }
  186. public function getTotalRebated($sagepay_server_order_id) {
  187. $query = $this->db->query("SELECT SUM(`amount`) AS `total` FROM `" . DB_PREFIX . "sagepay_server_order_transaction` WHERE `sagepay_server_order_id` = '" . (int)$sagepay_server_order_id . "' AND 'rebate'");
  188. return (float)$query->row['total'];
  189. }
  190. public function sendCurl($url, $payment_data) {
  191. $curl = curl_init($url);
  192. curl_setopt($curl, CURLOPT_PORT, 443);
  193. curl_setopt($curl, CURLOPT_HEADER, 0);
  194. curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
  195. curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
  196. curl_setopt($curl, CURLOPT_FOLLOWLOCATION, false);
  197. curl_setopt($curl, CURLOPT_FORBID_REUSE, 1);
  198. curl_setopt($curl, CURLOPT_FRESH_CONNECT, 1);
  199. curl_setopt($curl, CURLOPT_POST, 1);
  200. curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($payment_data));
  201. $response = curl_exec($curl);
  202. curl_close($curl);
  203. $response_info = explode(chr(10), $response);
  204. foreach ($response_info as $string) {
  205. if (strpos($string, '=') && isset($i)) {
  206. $parts = explode('=', $string, 2);
  207. $data['RepeatResponseData_' . $i][trim($parts[0])] = trim($parts[1]);
  208. } elseif (strpos($string, '=')) {
  209. $parts = explode('=', $string, 2);
  210. $data[trim($parts[0])] = trim($parts[1]);
  211. }
  212. }
  213. return $data;
  214. }
  215. public function logger($title, $data) {
  216. if ($this->config->get('sagepay_server_debug')) {
  217. $log = new Log('sagepay_server.log');
  218. $log->write($title . ': ' . print_r($data, 1));
  219. }
  220. }
  221. }