shop.balmet.com

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

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 }