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