worldpay.php (6335B)
1 <?php 2 3 class ModelExtensionPaymentWorldpay extends Model { 4 5 public function install() { 6 $this->db->query(" 7 CREATE TABLE IF NOT EXISTS `" . DB_PREFIX . "worldpay_order` ( 8 `worldpay_order_id` INT(11) NOT NULL AUTO_INCREMENT, 9 `order_id` INT(11) NOT NULL, 10 `order_code` VARCHAR(50), 11 `date_added` DATETIME NOT NULL, 12 `date_modified` DATETIME NOT NULL, 13 `refund_status` INT(1) DEFAULT NULL, 14 `currency_code` CHAR(3) NOT NULL, 15 `total` DECIMAL( 10, 2 ) NOT NULL, 16 PRIMARY KEY (`worldpay_order_id`) 17 ) ENGINE=MyISAM DEFAULT COLLATE=utf8_general_ci;"); 18 19 $this->db->query(" 20 CREATE TABLE IF NOT EXISTS `" . DB_PREFIX . "worldpay_order_transaction` ( 21 `worldpay_order_transaction_id` INT(11) NOT NULL AUTO_INCREMENT, 22 `worldpay_order_id` INT(11) NOT NULL, 23 `date_added` DATETIME NOT NULL, 24 `type` ENUM('payment', 'refund') DEFAULT NULL, 25 `amount` DECIMAL( 10, 2 ) NOT NULL, 26 PRIMARY KEY (`worldpay_order_transaction_id`) 27 ) ENGINE=MyISAM DEFAULT COLLATE=utf8_general_ci;"); 28 29 $this->db->query(" 30 CREATE TABLE IF NOT EXISTS `" . DB_PREFIX . "worldpay_order_recurring` ( 31 `worldpay_order_recurring_id` INT(11) NOT NULL AUTO_INCREMENT, 32 `order_id` INT(11) NOT NULL, 33 `order_recurring_id` INT(11) NOT NULL, 34 `order_code` VARCHAR(50), 35 `token` VARCHAR(50), 36 `date_added` DATETIME NOT NULL, 37 `date_modified` DATETIME NOT NULL, 38 `next_payment` DATETIME NOT NULL, 39 `trial_end` datetime DEFAULT NULL, 40 `subscription_end` datetime DEFAULT NULL, 41 `currency_code` CHAR(3) NOT NULL, 42 `total` DECIMAL( 10, 2 ) NOT NULL, 43 PRIMARY KEY (`worldpay_order_recurring_id`) 44 ) ENGINE=MyISAM DEFAULT COLLATE=utf8_general_ci;"); 45 46 $this->db->query(" 47 CREATE TABLE IF NOT EXISTS `" . DB_PREFIX . "worldpay_card` ( 48 `card_id` INT(11) NOT NULL AUTO_INCREMENT, 49 `customer_id` INT(11) NOT NULL, 50 `order_id` INT(11) NOT NULL, 51 `token` VARCHAR(50) NOT NULL, 52 `digits` VARCHAR(22) NOT NULL, 53 `expiry` VARCHAR(5) NOT NULL, 54 `type` VARCHAR(50) NOT NULL, 55 PRIMARY KEY (`card_id`) 56 ) ENGINE=MyISAM DEFAULT COLLATE=utf8_general_ci;"); 57 } 58 59 public function uninstall() { 60 $this->db->query("DROP TABLE IF EXISTS `" . DB_PREFIX . "worldpay_order`;"); 61 $this->db->query("DROP TABLE IF EXISTS `" . DB_PREFIX . "worldpay_order_transaction`;"); 62 $this->db->query("DROP TABLE IF EXISTS `" . DB_PREFIX . "worldpay_order_recurring`;"); 63 $this->db->query("DROP TABLE IF EXISTS `" . DB_PREFIX . "worldpay_card`;"); 64 } 65 66 public function refund($order_id, $amount) { 67 $worldpay_order = $this->getOrder($order_id); 68 69 if (!empty($worldpay_order) && $worldpay_order['refund_status'] != 1) { 70 $order['refundAmount'] = (int)($amount * 100); 71 72 $url = $worldpay_order['order_code'] . '/refund'; 73 74 $response_data = $this->sendCurl($url, $order); 75 76 return $response_data; 77 } else { 78 return false; 79 } 80 } 81 82 public function updateRefundStatus($worldpay_order_id, $status) { 83 $this->db->query("UPDATE `" . DB_PREFIX . "worldpay_order` SET `refund_status` = '" . (int)$status . "' WHERE `worldpay_order_id` = '" . (int)$worldpay_order_id . "'"); 84 } 85 86 public function getOrder($order_id) { 87 88 $qry = $this->db->query("SELECT * FROM `" . DB_PREFIX . "worldpay_order` WHERE `order_id` = '" . (int)$order_id . "' LIMIT 1"); 89 90 if ($qry->num_rows) { 91 $order = $qry->row; 92 $order['transactions'] = $this->getTransactions($order['worldpay_order_id'], $qry->row['currency_code']); 93 94 return $order; 95 } else { 96 return false; 97 } 98 } 99 100 private function getTransactions($worldpay_order_id, $currency_code) { 101 $query = $this->db->query("SELECT * FROM `" . DB_PREFIX . "worldpay_order_transaction` WHERE `worldpay_order_id` = '" . (int)$worldpay_order_id . "'"); 102 103 $transactions = array(); 104 if ($query->num_rows) { 105 foreach ($query->rows as $row) { 106 $row['amount'] = $this->currency->format($row['amount'], $currency_code, false); 107 $transactions[] = $row; 108 } 109 return $transactions; 110 } else { 111 return false; 112 } 113 } 114 115 public function addTransaction($worldpay_order_id, $type, $total) { 116 $this->db->query("INSERT INTO `" . DB_PREFIX . "worldpay_order_transaction` SET `worldpay_order_id` = '" . (int)$worldpay_order_id . "', `date_added` = now(), `type` = '" . $this->db->escape($type) . "', `amount` = '" . (double)$total . "'"); 117 } 118 119 public function getTotalReleased($worldpay_order_id) { 120 $query = $this->db->query("SELECT SUM(`amount`) AS `total` FROM `" . DB_PREFIX . "worldpay_order_transaction` WHERE `worldpay_order_id` = '" . (int)$worldpay_order_id . "' AND (`type` = 'payment' OR `type` = 'refund')"); 121 122 return (double)$query->row['total']; 123 } 124 125 public function getTotalRefunded($worldpay_order_id) { 126 $query = $this->db->query("SELECT SUM(`amount`) AS `total` FROM `" . DB_PREFIX . "worldpay_order_transaction` WHERE `worldpay_order_id` = '" . (int)$worldpay_order_id . "' AND 'refund'"); 127 128 return (double)$query->row['total']; 129 } 130 131 public function sendCurl($url, $order) { 132 133 $json = json_encode($order); 134 135 $curl = curl_init(); 136 137 curl_setopt($curl, CURLOPT_URL, 'https://api.worldpay.com/v1/orders/' . $url); 138 curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'POST'); 139 curl_setopt($curl, CURLOPT_POSTFIELDS, $json); 140 curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); 141 curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 0); 142 curl_setopt($curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0); 143 curl_setopt($curl, CURLOPT_TIMEOUT, 10); 144 curl_setopt( 145 $curl, CURLOPT_HTTPHEADER, array( 146 "Authorization: " . $this->config->get('payment_worldpay_service_key'), 147 "Content-Type: application/json", 148 "Content-Length: " . strlen($json) 149 ) 150 ); 151 152 $result = json_decode(curl_exec($curl)); 153 curl_close($curl); 154 155 $response = array(); 156 157 if (isset($result)) { 158 $response['status'] = $result->httpStatusCode; 159 $response['message'] = $result->message; 160 $response['full_details'] = $result; 161 } else { 162 $response['status'] = 'success'; 163 } 164 165 return $response; 166 } 167 168 public function logger($message) { 169 if ($this->config->get('worldpay_debug') == 1) { 170 $log = new Log('worldpay.log'); 171 $log->write($message); 172 } 173 } 174 175 }