aboutsummaryrefslogtreecommitdiffstats
path: root/public/admin/model/extension/payment/firstdata_remote.php
diff options
context:
space:
mode:
Diffstat (limited to 'public/admin/model/extension/payment/firstdata_remote.php')
-rw-r--r--public/admin/model/extension/payment/firstdata_remote.php278
1 files changed, 278 insertions, 0 deletions
diff --git a/public/admin/model/extension/payment/firstdata_remote.php b/public/admin/model/extension/payment/firstdata_remote.php
new file mode 100644
index 0000000..9cbd1bc
--- /dev/null
+++ b/public/admin/model/extension/payment/firstdata_remote.php
@@ -0,0 +1,278 @@
+<?php
+class ModelExtensionPaymentFirstdataRemote extends Model {
+ public function install() {
+ $this->db->query("
+ CREATE TABLE IF NOT EXISTS `" . DB_PREFIX . "firstdata_remote_order` (
+ `firstdata_remote_order_id` INT(11) NOT NULL AUTO_INCREMENT,
+ `order_id` INT(11) NOT NULL,
+ `order_ref` CHAR(50) NOT NULL,
+ `date_added` DATETIME NOT NULL,
+ `date_modified` DATETIME NOT NULL,
+ `tdate` VARCHAR(30) NOT NULL,
+ `capture_status` INT(1) DEFAULT NULL,
+ `void_status` INT(1) DEFAULT NULL,
+ `refund_status` INT(1) DEFAULT NULL,
+ `currency_code` CHAR(3) NOT NULL,
+ `authcode` VARCHAR(30) NOT NULL,
+ `total` DECIMAL( 10, 2 ) NOT NULL,
+ PRIMARY KEY (`firstdata_remote_order_id`)
+ ) ENGINE=MyISAM DEFAULT COLLATE=utf8_general_ci;");
+
+ $this->db->query("
+ CREATE TABLE IF NOT EXISTS `" . DB_PREFIX . "firstdata_remote_order_transaction` (
+ `firstdata_remote_order_transaction_id` INT(11) NOT NULL AUTO_INCREMENT,
+ `firstdata_remote_order_id` INT(11) NOT NULL,
+ `date_added` DATETIME NOT NULL,
+ `type` ENUM('auth', 'payment', 'refund', 'void') DEFAULT NULL,
+ `amount` DECIMAL( 10, 2 ) NOT NULL,
+ PRIMARY KEY (`firstdata_remote_order_transaction_id`)
+ ) ENGINE=MyISAM DEFAULT COLLATE=utf8_general_ci;");
+
+ $this->db->query("
+ CREATE TABLE IF NOT EXISTS `" . DB_PREFIX . "firstdata_remote_card` (
+ `firstdata_remote_card_id` INT(11) NOT NULL AUTO_INCREMENT,
+ `customer_id` INT(11) NOT NULL,
+ `date_added` DATETIME NOT NULL,
+ `digits` CHAR(4) NOT NULL,
+ `expire_month` INT(2) NOT NULL,
+ `expire_year` INT(2) NOT NULL,
+ `card_type` CHAR(15) NOT NULL,
+ `token` CHAR(64) NOT NULL,
+ PRIMARY KEY (`firstdata_remote_card_id`)
+ ) ENGINE=MyISAM DEFAULT COLLATE=utf8_general_ci;");
+ }
+
+ public function uninstall() {
+ $this->db->query("DROP TABLE IF EXISTS `" . DB_PREFIX . "firstdata_remote_order`;");
+ $this->db->query("DROP TABLE IF EXISTS `" . DB_PREFIX . "firstdata_remote_order_transaction`;");
+ $this->db->query("DROP TABLE IF EXISTS `" . DB_PREFIX . "firstdata_remote_card`;");
+ }
+
+ public function call($xml) {
+ $ch = curl_init();
+ curl_setopt($ch, CURLOPT_URL, "https://test.ipg-online.com/ipgapi/services");
+ curl_setopt($ch, CURLOPT_POST, 1);
+ curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type: text/xml"));
+ curl_setopt($ch, CURLOPT_HTTPAUTH, 'CURLAUTH_BASIC');
+ curl_setopt($ch, CURLOPT_USERPWD, $this->config->get('firstdata_remote_user_id') . ':' . $this->config->get('firstdata_remote_password'));
+ curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1);
+ curl_setopt($ch, CURLOPT_CAINFO, $this->config->get('firstdata_remote_ca'));
+ curl_setopt($ch, CURLOPT_SSLCERT, $this->config->get('firstdata_remote_certificate'));
+ curl_setopt($ch, CURLOPT_SSLKEY, $this->config->get('firstdata_remote_key'));
+ curl_setopt($ch, CURLOPT_SSLKEYPASSWD, $this->config->get('firstdata_remote_key_pw'));
+ curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
+ curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
+ //curl_setopt($ch, CURLOPT_STDERR, fopen(DIR_LOGS . "/headers.txt", "w+"));
+ curl_setopt($ch, CURLOPT_VERBOSE, true);
+ $response = curl_exec ($ch);
+
+ $this->logger('Post data: ' . print_r($this->request->post, 1));
+ $this->logger('Request: ' . $xml);
+ $this->logger('Curl error #: ' . curl_errno($ch));
+ $this->logger('Curl error text: ' . curl_error($ch));
+ $this->logger('Curl response info: ' . print_r(curl_getinfo($ch), 1));
+ $this->logger('Curl response: ' . $response);
+
+ curl_close ($ch);
+
+ return $response;
+ }
+
+ public function void($order_ref, $tdate) {
+ $xml = '<?xml version="1.0" encoding="UTF-8"?>';
+ $xml .= '<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">';
+ $xml .= '<SOAP-ENV:Header />';
+ $xml .= '<SOAP-ENV:Body>';
+ $xml .= '<ipgapi:IPGApiOrderRequest xmlns:v1="http://ipg-online.com/ipgapi/schemas/v1" xmlns:ipgapi="http://ipg-online.com/ipgapi/schemas/ipgapi">';
+ $xml .= '<v1:Transaction>';
+ $xml .= '<v1:CreditCardTxType>';
+ $xml .= '<v1:Type>void</v1:Type>';
+ $xml .= '</v1:CreditCardTxType>';
+ $xml .= '<v1:TransactionDetails>';
+ $xml .= '<v1:OrderId>' . $order_ref . '</v1:OrderId>';
+ $xml .= '<v1:TDate>' . $tdate . '</v1:TDate>';
+ $xml .= '</v1:TransactionDetails>';
+ $xml .= '</v1:Transaction>';
+ $xml .= '</ipgapi:IPGApiOrderRequest>';
+ $xml .= '</SOAP-ENV:Body>';
+ $xml .= '</SOAP-ENV:Envelope>';
+
+ $xml = simplexml_load_string($this->call($xml));
+
+ $xml->registerXPathNamespace('ipgapi', 'http://ipg-online.com/ipgapi/schemas/ipgapi');
+ $xml->registerXPathNamespace('soap', 'http://schemas.xmlsoap.org/soap/envelope/');
+
+ $fault = $xml->xpath('//soap:Fault');
+
+ $response['fault'] = '';
+ if (!empty($fault[0]) && isset($fault[0]->detail)) {
+ $response['fault'] = (string)$fault[0]->detail;
+ }
+
+ $string = $xml->xpath('//ipgapi:ErrorMessage');
+ $response['error'] = isset($string[0]) ? (string)$string[0] : '';
+
+ $string = $xml->xpath('//ipgapi:TransactionResult');
+ $response['transaction_result'] = isset($string[0]) ? (string)$string[0] : '';
+
+ return $response;
+ }
+
+ public function updateVoidStatus($firstdata_remote_order_id, $status) {
+ $this->db->query("UPDATE `" . DB_PREFIX . "firstdata_remote_order` SET `void_status` = '" . (int)$status . "' WHERE `firstdata_remote_order_id` = '" . (int)$firstdata_remote_order_id . "'");
+ }
+
+ public function capture($order_ref, $total, $currency_code) {
+ $xml = '<?xml version="1.0" encoding="UTF-8"?>';
+ $xml .= '<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">';
+ $xml .= '<SOAP-ENV:Header />';
+ $xml .= '<SOAP-ENV:Body>';
+ $xml .= '<ipgapi:IPGApiOrderRequest xmlns:v1="http://ipg-online.com/ipgapi/schemas/v1" xmlns:ipgapi="http://ipg-online.com/ipgapi/schemas/ipgapi">';
+ $xml .= '<v1:Transaction>';
+ $xml .= '<v1:CreditCardTxType>';
+ $xml .= '<v1:Type>postAuth</v1:Type>';
+ $xml .= '</v1:CreditCardTxType>';
+ $xml .= '<v1:Payment>';
+ $xml .= '<v1:ChargeTotal>' . $total . '</v1:ChargeTotal>';
+ $xml .= '<v1:Currency>' . $this->mapCurrency($currency_code) . '</v1:Currency>';
+ $xml .= '</v1:Payment>';
+ $xml .= '<v1:TransactionDetails>';
+ $xml .= '<v1:OrderId>' . $order_ref . '</v1:OrderId>';
+ $xml .= '</v1:TransactionDetails>';
+ $xml .= '</v1:Transaction>';
+ $xml .= '</ipgapi:IPGApiOrderRequest>';
+ $xml .= '</SOAP-ENV:Body>';
+ $xml .= '</SOAP-ENV:Envelope>';
+
+ $xml = simplexml_load_string($this->call($xml));
+
+ $xml->registerXPathNamespace('ipgapi', 'http://ipg-online.com/ipgapi/schemas/ipgapi');
+ $xml->registerXPathNamespace('soap', 'http://schemas.xmlsoap.org/soap/envelope/');
+
+ $fault = $xml->xpath('//soap:Fault');
+
+ $response['fault'] = '';
+ if (!empty($fault[0]) && isset($fault[0]->detail)) {
+ $response['fault'] = (string)$fault[0]->detail;
+ }
+
+ $string = $xml->xpath('//ipgapi:ErrorMessage');
+ $response['error'] = isset($string[0]) ? (string)$string[0] : '';
+
+ $string = $xml->xpath('//ipgapi:TransactionResult');
+ $response['transaction_result'] = isset($string[0]) ? (string)$string[0] : '';
+
+ return $response;
+ }
+
+ public function updateCaptureStatus($firstdata_remote_order_id, $status) {
+ $this->db->query("UPDATE `" . DB_PREFIX . "firstdata_remote_order` SET `capture_status` = '" . (int)$status . "' WHERE `firstdata_remote_order_id` = '" . (int)$firstdata_remote_order_id . "'");
+ }
+
+ public function refund($order_ref, $total, $currency_code) {
+ $xml = '<?xml version="1.0" encoding="UTF-8"?>';
+ $xml .= '<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">';
+ $xml .= '<SOAP-ENV:Header />';
+ $xml .= '<SOAP-ENV:Body>';
+ $xml .= '<ipgapi:IPGApiOrderRequest xmlns:v1="http://ipg-online.com/ipgapi/schemas/v1" xmlns:ipgapi="http://ipg-online.com/ipgapi/schemas/ipgapi">';
+ $xml .= '<v1:Transaction>';
+ $xml .= '<v1:CreditCardTxType>';
+ $xml .= '<v1:Type>return</v1:Type>';
+ $xml .= '</v1:CreditCardTxType>';
+ $xml .= '<v1:Payment>';
+ $xml .= '<v1:ChargeTotal>' . $total . '</v1:ChargeTotal>';
+ $xml .= '<v1:Currency>' . $this->mapCurrency($currency_code) . '</v1:Currency>';
+ $xml .= '</v1:Payment>';
+ $xml .= '<v1:TransactionDetails>';
+ $xml .= '<v1:OrderId>' . $order_ref . '</v1:OrderId>';
+ $xml .= '</v1:TransactionDetails>';
+ $xml .= '</v1:Transaction>';
+ $xml .= '</ipgapi:IPGApiOrderRequest>';
+ $xml .= '</SOAP-ENV:Body>';
+ $xml .= '</SOAP-ENV:Envelope>';
+
+ $xml = simplexml_load_string($this->call($xml));
+
+ $xml->registerXPathNamespace('ipgapi', 'http://ipg-online.com/ipgapi/schemas/ipgapi');
+ $xml->registerXPathNamespace('soap', 'http://schemas.xmlsoap.org/soap/envelope/');
+
+ $fault = $xml->xpath('//soap:Fault');
+
+ $response['fault'] = '';
+ if (!empty($fault[0]) && isset($fault[0]->detail)) {
+ $response['fault'] = (string)$fault[0]->detail;
+ }
+
+ $string = $xml->xpath('//ipgapi:ErrorMessage');
+ $response['error'] = isset($string[0]) ? (string)$string[0] : '';
+
+ $string = $xml->xpath('//ipgapi:TransactionResult');
+ $response['transaction_result'] = isset($string[0]) ? (string)$string[0] : '';
+
+ return $response;
+ }
+
+ public function updateRefundStatus($firstdata_remote_order_id, $status) {
+ $this->db->query("UPDATE `" . DB_PREFIX . "firstdata_remote_order` SET `refund_status` = '" . (int)$status . "' WHERE `firstdata_remote_order_id` = '" . (int)$firstdata_remote_order_id . "'");
+ }
+
+ public function getOrder($order_id) {
+ $qry = $this->db->query("SELECT * FROM `" . DB_PREFIX . "firstdata_remote_order` WHERE `order_id` = '" . (int)$order_id . "' LIMIT 1");
+
+ if ($qry->num_rows) {
+ $order = $qry->row;
+ $order['transactions'] = $this->getTransactions($order['firstdata_remote_order_id']);
+
+ return $order;
+ } else {
+ return false;
+ }
+ }
+
+ private function getTransactions($firstdata_remote_order_id) {
+ $qry = $this->db->query("SELECT * FROM `" . DB_PREFIX . "firstdata_remote_order_transaction` WHERE `firstdata_remote_order_id` = '" . (int)$firstdata_remote_order_id . "'");
+
+ if ($qry->num_rows) {
+ return $qry->rows;
+ } else {
+ return false;
+ }
+ }
+
+ public function addTransaction($firstdata_remote_order_id, $type, $total) {
+ $this->db->query("INSERT INTO `" . DB_PREFIX . "firstdata_remote_order_transaction` SET `firstdata_remote_order_id` = '" . (int)$firstdata_remote_order_id . "', `date_added` = now(), `type` = '" . $this->db->escape($type) . "', `amount` = '" . (float)$total . "'");
+ }
+
+ public function logger($message) {
+ if ($this->config->get('firstdata_remote_debug') == 1) {
+ $log = new Log('firstdata_remote.log');
+ $log->write($message);
+ }
+ }
+
+ public function getTotalCaptured($firstdata_order_id) {
+ $query = $this->db->query("SELECT SUM(`amount`) AS `total` FROM `" . DB_PREFIX . "firstdata_remote_order_transaction` WHERE `firstdata_remote_order_id` = '" . (int)$firstdata_order_id . "' AND (`type` = 'payment' OR `type` = 'refund')");
+
+ return (float)$query->row['total'];
+ }
+
+ public function getTotalRefunded($firstdata_order_id) {
+ $query = $this->db->query("SELECT SUM(`amount`) AS `total` FROM `" . DB_PREFIX . "firstdata_remote_order_transaction` WHERE `firstdata_remote_order_id` = '" . (int)$firstdata_order_id . "' AND 'refund'");
+
+ return (float)$query->row['total'];
+ }
+
+ public function mapCurrency($code) {
+ $currency = array(
+ 'GBP' => 826,
+ 'USD' => 840,
+ 'EUR' => 978,
+ );
+
+ if (array_key_exists($code, $currency)) {
+ return $currency[$code];
+ } else {
+ return false;
+ }
+ }
+} \ No newline at end of file