shop.balmet.com

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README

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 }