shop.balmet.com

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

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 }