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