klarna_account.php (10127B)
1 <?php 2 class ControllerExtensionPaymentKlarnaAccount extends Controller { 3 private $error = array(); 4 private $pclasses = array(); 5 6 public function index() { 7 $this->load->language('extension/payment/klarna_account'); 8 9 $this->document->setTitle($this->language->get('heading_title')); 10 11 $this->load->model('setting/setting'); 12 13 if (($this->request->server['REQUEST_METHOD'] == 'POST') && $this->validate()) { 14 $status = false; 15 16 foreach ($this->request->post['payment_klarna_account_'] as $klarna_account) { 17 if ($klarna_account['status']) { 18 $status = true; 19 20 break; 21 } 22 } 23 24 $klarna_data = array( 25 'klarna_account_pclasses' => $this->pclasses, 26 'klarna_account_status' => $status 27 ); 28 29 $this->model_setting_setting->editSetting('payment_klarna_account', array_merge($this->request->post, $klarna_data)); 30 31 $this->session->data['success'] = $this->language->get('text_success'); 32 33 $this->response->redirect($this->url->link('marketplace/extension', 'user_token=' . $this->session->data['user_token'] . '&type=payment', true)); 34 } 35 36 if (isset($this->error['warning'])) { 37 $data['error_warning'] = $this->error['warning']; 38 } else { 39 $data['error_warning'] = ''; 40 } 41 42 if (isset($this->session->data['success'])) { 43 $data['success'] = $this->session->data['success']; 44 45 unset($this->session->data['success']); 46 } else { 47 $data['success'] = ''; 48 } 49 50 $data['breadcrumbs'] = array(); 51 52 $data['breadcrumbs'][] = array( 53 'text' => $this->language->get('text_home'), 54 'href' => $this->url->link('common/dashboard', 'user_token=' . $this->session->data['user_token'], true) 55 ); 56 57 $data['breadcrumbs'][] = array( 58 'text' => $this->language->get('text_extension'), 59 'href' => $this->url->link('marketplace/extension', 'user_token=' . $this->session->data['user_token'] . '&type=payment', true) 60 ); 61 62 $data['breadcrumbs'][] = array( 63 'text' => $this->language->get('heading_title'), 64 'href' => $this->url->link('extension/payment/klarna_account', 'user_token=' . $this->session->data['user_token'], true) 65 ); 66 67 $data['action'] = $this->url->link('extension/payment/klarna_account', 'user_token=' . $this->session->data['user_token'], true); 68 69 $data['cancel'] = $this->url->link('marketplace/extension', 'user_token=' . $this->session->data['user_token'] . '&type=payment', true); 70 71 $data['countries'] = array(); 72 73 $data['countries'][] = array( 74 'name' => $this->language->get('text_germany'), 75 'code' => 'DEU' 76 ); 77 78 $data['countries'][] = array( 79 'name' => $this->language->get('text_netherlands'), 80 'code' => 'NLD' 81 ); 82 83 $data['countries'][] = array( 84 'name' => $this->language->get('text_denmark'), 85 'code' => 'DNK' 86 ); 87 88 $data['countries'][] = array( 89 'name' => $this->language->get('text_sweden'), 90 'code' => 'SWE' 91 ); 92 93 $data['countries'][] = array( 94 'name' => $this->language->get('text_norway'), 95 'code' => 'NOR' 96 ); 97 98 $data['countries'][] = array( 99 'name' => $this->language->get('text_finland'), 100 'code' => 'FIN' 101 ); 102 103 if (isset($this->request->post['payment_klarna_account'])) { 104 $data['payment_klarna_account'] = $this->request->post['payment_klarna_account']; 105 } else { 106 $data['payment_klarna_account'] = $this->config->get('payment_klarna_account'); 107 } 108 109 $this->load->model('localisation/geo_zone'); 110 111 $data['geo_zones'] = $this->model_localisation_geo_zone->getGeoZones(); 112 113 $this->load->model('localisation/order_status'); 114 115 $data['order_statuses'] = $this->model_localisation_order_status->getOrderStatuses(); 116 117 $file = DIR_LOGS . 'klarna_account.log'; 118 119 if (file_exists($file)) { 120 $data['log'] = file_get_contents($file, FILE_USE_INCLUDE_PATH, null); 121 } else { 122 $data['log'] = ''; 123 } 124 125 $data['clear'] = $this->url->link('extension/payment/klarna_account/clear', 'user_token=' . $this->session->data['user_token'], true); 126 127 $data['header'] = $this->load->controller('common/header'); 128 $data['column_left'] = $this->load->controller('common/column_left'); 129 $data['footer'] = $this->load->controller('common/footer'); 130 131 $this->response->setOutput($this->load->view('extension/payment/klarna_account', $data)); 132 } 133 134 private function validate() { 135 if (!$this->user->hasPermission('modify', 'extension/payment/klarna_account')) { 136 $this->error['warning'] = $this->language->get('error_permission'); 137 } 138 139 $log = new Log('klarna_account.log'); 140 141 $country = array( 142 'NOR' => array( 143 'currency' => 1, 144 'country' => 164, 145 'language' => 97, 146 ), 147 'SWE' => array( 148 'currency' => 0, 149 'country' => 209, 150 'language' => 138, 151 ), 152 'FIN' => array( 153 'currency' => 2, 154 'country' => 73, 155 'language' => 101, 156 ), 157 'DNK' => array( 158 'currency' => 3, 159 'country' => 59, 160 'language' => 27, 161 ), 162 'DEU' => array( 163 'currency' => 2, 164 'country' => 81, 165 'language' => 28, 166 ), 167 'NLD' => array( 168 'currency' => 2, 169 'country' => 154, 170 'language' => 101, 171 ), 172 ); 173 174 foreach ($this->request->post['klarna_account'] as $key => $klarna_account) { 175 if ($klarna_account['status']) { 176 $digest = base64_encode(pack("H*", hash('sha256', $klarna_account['merchant'] . ':' . $country[$key]['currency'] . ':' . $klarna_account['secret']))); 177 178 $xml = '<methodCall>'; 179 $xml .= ' <methodName>get_pclasses</methodName>'; 180 $xml .= ' <params>'; 181 $xml .= ' <param><value><string>4.1</string></value></param>'; 182 $xml .= ' <param><value><string>API:OPENCART:' . VERSION . '</string></value></param>'; 183 $xml .= ' <param><value><int>' . (int)$klarna_account['merchant'] . '</int></value></param>'; 184 $xml .= ' <param><value><int>' . $country[$key]['currency'] . '</int></value></param>'; 185 $xml .= ' <param><value><string>' . $digest . '</string></value></param>'; 186 $xml .= ' <param><value><int>' . $country[$key]['country'] . '</int></value></param>'; 187 $xml .= ' <param><value><int>' . $country[$key]['language'] . '</int></value></param>'; 188 $xml .= ' </params>'; 189 $xml .= '</methodCall>'; 190 191 if ($klarna_account['server'] == 'live') { 192 $url = 'https://payment.klarna.com'; 193 } else { 194 $url = 'https://payment.testdrive.klarna.com'; 195 } 196 197 $curl = curl_init(); 198 199 $header = array(); 200 201 $header[] = 'Content-Type: text/xml'; 202 $header[] = 'Content-Length: ' . strlen($xml); 203 204 curl_setopt($curl, CURLOPT_URL, $url); 205 curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); 206 curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2); 207 curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'POST'); 208 curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); 209 curl_setopt($curl, CURLOPT_HTTPHEADER, $header); 210 curl_setopt($curl, CURLOPT_POSTFIELDS, $xml); 211 212 $response = curl_exec($curl); 213 214 if ($response !== false) { 215 $xml = new DOMDocument(); 216 $xml->loadXML($response); 217 218 $xpath = new DOMXPath($xml); 219 220 $nodes = $xpath->query('//methodResponse/params/param/value'); 221 222 if ($nodes->length == 0) { 223 $this->error['warning'] = $this->language->get('error_log'); 224 225 $error_code = $xpath->query('//methodResponse/fault/value/struct/member/value/int')->item(0)->nodeValue; 226 $error_message = $xpath->query('//methodResponse/fault/value/struct/member/value/string')->item(0)->nodeValue; 227 228 $log->write(sprintf($this->language->get('error_pclass'), $key, $error_code, $error_message)); 229 230 continue; 231 } 232 233 $pclasses = $this->parseResponse($nodes->item(0)->firstChild, $xml); 234 235 while ($pclasses) { 236 $pclass = array_slice($pclasses, 0, 10); 237 $pclasses = array_slice($pclasses, 10); 238 239 $pclass[3] /= 100; 240 $pclass[4] /= 100; 241 $pclass[5] /= 100; 242 $pclass[6] /= 100; 243 $pclass[9] = ($pclass[9] != '-') ? strtotime($pclass[9]) : $pclass[9]; 244 245 array_unshift($pclass, $klarna_account['merchant']); 246 247 $this->pclasses[$key][] = array( 248 'eid' => intval($pclass[0]), 249 'id' => intval($pclass[1]), 250 'description' => $pclass[2], 251 'months' => intval($pclass[3]), 252 'startfee' => floatval($pclass[4]), 253 'invoicefee' => floatval($pclass[5]), 254 'interestrate' => floatval($pclass[6]), 255 'minamount' => floatval($pclass[7]), 256 'country' => intval($pclass[8]), 257 'type' => intval($pclass[9]), 258 ); 259 } 260 } else { 261 $this->error['warning'] = $this->language->get('error_log'); 262 263 $log->write(sprintf($this->language->get('error_curl'), curl_errno($curl), curl_error($curl))); 264 } 265 266 curl_close($curl); 267 } 268 } 269 270 return !$this->error; 271 } 272 273 private function parseResponse($node, $document) { 274 $child = $node; 275 276 switch ($child->nodeName) { 277 case 'string': 278 $value = $child->nodeValue; 279 break; 280 case 'boolean': 281 $value = (string)$child->nodeValue; 282 283 if ($value == '0') { 284 $value = false; 285 } elseif ($value == '1') { 286 $value = true; 287 } else { 288 $value = null; 289 } 290 291 break; 292 case 'integer': 293 case 'int': 294 case 'i4': 295 case 'i8': 296 $value = (int)$child->nodeValue; 297 break; 298 case 'array': 299 $value = array(); 300 301 $xpath = new DOMXPath($document); 302 $entries = $xpath->query('.//array/data/value', $child); 303 304 for ($i = 0; $i < $entries->length; $i++) { 305 $value[] = $this->parseResponse($entries->item($i)->firstChild, $document); 306 } 307 308 break; 309 default: 310 $value = null; 311 } 312 313 return $value; 314 } 315 316 public function clear() { 317 $this->load->language('extension/payment/klarna_account'); 318 319 $file = DIR_LOGS . 'klarna_account.log'; 320 321 $handle = fopen($file, 'w+'); 322 323 fclose($handle); 324 325 $this->session->data['success'] = $this->language->get('text_success'); 326 327 $this->response->redirect($this->url->link('extension/payment/klarna_account', 'user_token=' . $this->session->data['user_token'], true)); 328 } 329 }