shop.balmet.com

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

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 }