PageRenderTime 49ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 0ms

/admin/model/payment/pp_pro_iframe.php

https://gitlab.com/shapcy/opencart
PHP | 261 lines | 213 code | 48 blank | 0 comment | 17 complexity | 602d1ca2894bc42ff2f359c207775a1e MD5 | raw file
  1. <?php
  2. class ModelPaymentPPProIframe extends Model {
  3. public function install() {
  4. $this->db->query("
  5. CREATE TABLE IF NOT EXISTS `" . DB_PREFIX . "paypal_iframe_order` (
  6. `paypal_iframe_order_id` int(11) NOT NULL AUTO_INCREMENT,
  7. `order_id` int(11) NOT NULL,
  8. `date_added` DATETIME NOT NULL,
  9. `date_modified` DATETIME NOT NULL,
  10. `capture_status` ENUM('Complete','NotComplete') DEFAULT NULL,
  11. `currency_code` CHAR(3) NOT NULL,
  12. `authorization_id` VARCHAR(30) NOT NULL,
  13. `total` DECIMAL( 10, 2 ) NOT NULL,
  14. PRIMARY KEY (`paypal_iframe_order_id`)
  15. ) ENGINE=MyISAM DEFAULT COLLATE=utf8_general_ci;");
  16. $this->db->query("
  17. CREATE TABLE IF NOT EXISTS `" . DB_PREFIX . "paypal_iframe_order_transaction` (
  18. `paypal_iframe_order_transaction_id` int(11) NOT NULL AUTO_INCREMENT,
  19. `paypal_iframe_order_id` int(11) NOT NULL,
  20. `transaction_id` CHAR(20) NOT NULL,
  21. `parent_id` CHAR(20) NOT NULL,
  22. `date_added` DATETIME NOT NULL,
  23. `note` VARCHAR(255) NOT NULL,
  24. `msgsubid` CHAR(38) NOT NULL,
  25. `receipt_id` CHAR(20) NOT NULL,
  26. `payment_type` ENUM('none','echeck','instant', 'refund', 'void') DEFAULT NULL,
  27. `payment_status` CHAR(20) NOT NULL,
  28. `pending_reason` CHAR(50) NOT NULL,
  29. `transaction_entity` CHAR(50) NOT NULL,
  30. `amount` DECIMAL( 10, 2 ) NOT NULL,
  31. `debug_data` TEXT NOT NULL,
  32. `call_data` TEXT NOT NULL,
  33. PRIMARY KEY (`paypal_iframe_order_transaction_id`)
  34. ) ENGINE=MyISAM DEFAULT COLLATE=utf8_general_ci;");
  35. }
  36. public function uninstall() {
  37. $this->db->query("DROP TABLE IF EXISTS `" . DB_PREFIX . "paypal_iframe_order_transaction`;");
  38. $this->db->query("DROP TABLE IF EXISTS `" . DB_PREFIX . "paypal_iframe_order`;");
  39. }
  40. private function getTransactions($paypal_iframe_order_id) {
  41. $qry = $this->db->query("SELECT `ot`.*, ( SELECT count(`ot2`.`paypal_iframe_order_id`) FROM `" . DB_PREFIX . "paypal_iframe_order_transaction` `ot2` WHERE `ot2`.`parent_id` = `ot`.`transaction_id` ) AS `children` FROM `" . DB_PREFIX . "paypal_iframe_order_transaction` `ot` WHERE `paypal_iframe_order_id` = '" . (int)$paypal_iframe_order_id . "'");
  42. if ($qry->num_rows) {
  43. return $qry->rows;
  44. } else {
  45. return false;
  46. }
  47. }
  48. public function getTotalCaptured($paypal_iframe_order_id) {
  49. $qry = $this->db->query("SELECT SUM(`amount`) AS `amount` FROM `" . DB_PREFIX . "paypal_iframe_order_transaction` WHERE `paypal_iframe_order_id` = '" . (int)$paypal_iframe_order_id . "' AND `pending_reason` != 'authorization' AND (`payment_status` = 'Partially-Refunded' OR `payment_status` = 'Completed' OR `payment_status` = 'Pending') AND `transaction_entity` = 'payment'");
  50. return $qry->row['amount'];
  51. }
  52. public function getTotalRefunded($paypal_iframe_order_id) {
  53. $qry = $this->db->query("SELECT SUM(`amount`) AS `amount` FROM `" . DB_PREFIX . "paypal_iframe_order_transaction` WHERE `paypal_iframe_order_id` = '" . (int)$paypal_iframe_order_id . "' AND `payment_status` = 'Refunded'");
  54. return $qry->row['amount'];
  55. }
  56. public function getTotalRefundedTransaction($transaction_id) {
  57. $qry = $this->db->query("SELECT SUM(`amount`) AS `amount` FROM `" . DB_PREFIX . "paypal_iframe_order_transaction` WHERE `parent_id` = '" . $this->db->escape($transaction_id) . "' AND `payment_type` = 'refund'");
  58. return $qry->row['amount'];
  59. }
  60. public function getOrder($order_id) {
  61. $qry = $this->db->query("SELECT * FROM `" . DB_PREFIX . "paypal_iframe_order` WHERE `order_id` = '" . (int)$order_id . "' LIMIT 1");
  62. if ($qry->num_rows) {
  63. $order = $qry->row;
  64. $order['transactions'] = $this->getTransactions($order['paypal_iframe_order_id']);
  65. $order['captured'] = $this->getTotalCaptured($order['paypal_iframe_order_id']);
  66. return $order;
  67. } else {
  68. return false;
  69. }
  70. }
  71. public function call($data) {
  72. if ($this->config->get('pp_pro_iframe_test') == 1) {
  73. $api_endpoint = 'https://api-3t.sandbox.paypal.com/nvp';
  74. } else {
  75. $api_endpoint = 'https://api-3t.paypal.com/nvp';
  76. }
  77. $settings = array(
  78. 'USER' => $this->config->get('pp_pro_iframe_user'),
  79. 'PWD' => $this->config->get('pp_pro_iframe_password'),
  80. 'SIGNATURE' => $this->config->get('pp_pro_iframe_sig'),
  81. 'VERSION' => '84',
  82. 'BUTTONSOURCE' => 'WM_PRO_OPENCART_UK_' . VERSION,
  83. );
  84. $this->log($data, 'Call data');
  85. $defaults = array(
  86. CURLOPT_POST => 1,
  87. CURLOPT_HEADER => 0,
  88. CURLOPT_URL => $api_endpoint,
  89. CURLOPT_USERAGENT => "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1",
  90. CURLOPT_FRESH_CONNECT => 1,
  91. CURLOPT_RETURNTRANSFER => 1,
  92. CURLOPT_FORBID_REUSE => 1,
  93. CURLOPT_TIMEOUT => 0,
  94. CURLOPT_SSL_VERIFYPEER => 0,
  95. CURLOPT_SSL_VERIFYHOST => 0,
  96. CURLOPT_POSTFIELDS => http_build_query(array_merge($data, $settings), '', "&")
  97. );
  98. $ch = curl_init();
  99. curl_setopt_array($ch, $defaults);
  100. if (!$result = curl_exec($ch)) {
  101. $log_data = array(
  102. 'curl_error' => curl_error($ch),
  103. 'curl_errno' => curl_errno($ch)
  104. );
  105. $this->log($log_data, 'CURL failed');
  106. return false;
  107. }
  108. $this->log($result, 'Result');
  109. curl_close($ch);
  110. return $this->cleanReturn($result);
  111. }
  112. public function updateOrder($capture_status, $order_id) {
  113. $this->db->query("UPDATE `" . DB_PREFIX . "paypal_iframe_order` SET `date_modified` = now(), `capture_status` = '" . $this->db->escape($capture_status) . "' WHERE `order_id` = '" . (int)$order_id . "'");
  114. }
  115. public function updateTransaction($transaction) {
  116. $this->db->query("
  117. UPDATE " . DB_PREFIX . "paypal_iframe_order_transaction
  118. SET paypal_iframe_order_id = " . (int)$transaction['paypal_iframe_order_id'] . ",
  119. transaction_id = '" . $this->db->escape($transaction['transaction_id']) . "',
  120. parent_id = '" . $this->db->escape($transaction['parent_id']) . "',
  121. date_added = '" . $this->db->escape($transaction['date_added']) . "',
  122. note = '" . $this->db->escape($transaction['note']) . "',
  123. msgsubid = '" . $this->db->escape($transaction['msgsubid']) . "',
  124. receipt_id = '" . $this->db->escape($transaction['receipt_id']) . "',
  125. payment_type = '" . $this->db->escape($transaction['payment_type']) . "',
  126. payment_status = '" . $this->db->escape($transaction['payment_status']) . "',
  127. pending_reason = '" . $this->db->escape($transaction['pending_reason']) . "',
  128. transaction_entity = '" . $this->db->escape($transaction['transaction_entity']) . "',
  129. amount = '" . $this->db->escape($transaction['amount']) . "',
  130. debug_data = '" . $this->db->escape($transaction['debug_data']) . "',
  131. call_data = '" . $this->db->escape($transaction['call_data']) . "'
  132. WHERE paypal_iframe_order_transaction_id = " . (int)$transaction['paypal_iframe_order_transaction_id'] . "
  133. ");
  134. }
  135. public function addTransaction($transaction_data, $request_data = array()) {
  136. $this->db->query("INSERT INTO `" . DB_PREFIX . "paypal_iframe_order_transaction` SET `paypal_iframe_order_id` = '" . (int)$transaction_data['paypal_iframe_order_id'] . "', `transaction_id` = '" . $this->db->escape($transaction_data['transaction_id']) . "', `parent_id` = '" . $this->db->escape($transaction_data['parent_id']) . "', `date_added` = NOW(), `note` = '" . $this->db->escape($transaction_data['note']) . "', `msgsubid` = '" . $this->db->escape($transaction_data['msgsubid']) . "', `receipt_id` = '" . $this->db->escape($transaction_data['receipt_id']) . "', `payment_type` = '" . $this->db->escape($transaction_data['payment_type']) . "', `payment_status` = '" . $this->db->escape($transaction_data['payment_status']) . "', `pending_reason` = '" . $this->db->escape($transaction_data['pending_reason']) . "', `transaction_entity` = '" . $this->db->escape($transaction_data['transaction_entity']) . "', `amount` = '" . (float)$transaction_data['amount'] . "', `debug_data` = '" . $this->db->escape($transaction_data['debug_data']) . "'");
  137. $paypal_iframe_order_transaction_id = $this->db->getLastId();
  138. if ($request_data) {
  139. $serialized_data = json_encode($request_data);
  140. $this->db->query("
  141. UPDATE " . DB_PREFIX . "paypal_iframe_order_transaction
  142. SET call_data = '" . $this->db->escape($serialized_data) . "'
  143. WHERE paypal_iframe_order_transaction_id = " . (int)$paypal_iframe_order_transaction_id . "
  144. LIMIT 1
  145. ");
  146. }
  147. return $paypal_iframe_order_transaction_id;
  148. }
  149. public function log($data, $title = null) {
  150. if ($this->config->get('pp_pro_iframe_debug')) {
  151. $log = new Log('pp_pro_iframe.log');
  152. $log->write($title . ': ' . json_encode($data));
  153. }
  154. }
  155. public function getTransaction($transaction_id) {
  156. $call_data = array(
  157. 'METHOD' => 'GetTransactionDetails',
  158. 'TRANSACTIONID' => $transaction_id,
  159. );
  160. return $this->call($call_data);
  161. }
  162. public function getOrderId($transaction_id) {
  163. $qry = $this->db->query("SELECT `o`.`order_id` FROM `" . DB_PREFIX . "paypal_iframe_order_transaction` `ot` LEFT JOIN `" . DB_PREFIX . "paypal_iframe_order` `o` ON `o`.`paypal_iframe_order_id` = `ot`.`paypal_iframe_order_id` WHERE `ot`.`transaction_id` = '" . $this->db->escape($transaction_id) . "' LIMIT 1");
  164. if ($qry->num_rows) {
  165. return $qry->row['order_id'];
  166. } else {
  167. return false;
  168. }
  169. }
  170. public function updateAuthorizationId($paypal_iframe_order_id, $authorization_id) {
  171. $this->db->query("
  172. UPDATE `" . DB_PREFIX . "paypal_iframe_order`
  173. SET `authorization_id` = '" . $this->db->escape($authorization_id) . "'
  174. WHERE `paypal_iframe_order_id` = '" . $this->db->escape($paypal_iframe_order_id) . "'
  175. ");
  176. }
  177. public function updateRefundTransaction($transaction_id, $transaction_type) {
  178. $this->db->query("UPDATE `" . DB_PREFIX . "paypal_iframe_order_transaction` SET `payment_status` = '" . $this->db->escape($transaction_type) . "' WHERE `transaction_id` = '" . $this->db->escape($transaction_id) . "' LIMIT 1");
  179. }
  180. public function getFailedTransaction($paypl_iframe_order_transaction_id) {
  181. $result = $this->db->query("
  182. SELECT *
  183. FROM " . DB_PREFIX . "paypal_iframe_order_transaction
  184. WHERE paypal_iframe_order_transaction_id = " . (int)$paypl_iframe_order_transaction_id . "
  185. ")->row;
  186. if ($result) {
  187. return $result;
  188. } else {
  189. return false;
  190. }
  191. }
  192. public function getLocalTransaction($transaction_id) {
  193. $result = $this->db->query("
  194. SELECT *
  195. FROM " . DB_PREFIX . "paypal_iframe_order_transaction
  196. WHERE transaction_id = '" . $this->db->escape($transaction_id) . "'
  197. ")->row;
  198. if ($result) {
  199. return $result;
  200. } else {
  201. return false;
  202. }
  203. }
  204. protected function cleanReturn($data) {
  205. $data = explode('&', $data);
  206. $arr = array();
  207. foreach ($data as $k => $v) {
  208. $tmp = explode('=', $v);
  209. $arr[$tmp[0]] = urldecode($tmp[1]);
  210. }
  211. return $arr;
  212. }
  213. }