/** * This event is fired after the payment method has been selected. It can be used to store * additional payment info in the cart. * @author Valérie isaksen * * @param VirtueMartCart $cart: the actual cart * @return null if the payment was not selected, true if the data is valid, error message if the data is not vlaid * */ public function plgVmOnSelectCheckPayment(VirtueMartCart $cart) { if (!$this->selectedThisByMethodId($cart->virtuemart_paymentmethod_id)) { return NULL; // Another method was selected, do nothing } if (!($method = $this->getVmPluginMethod($cart->virtuemart_paymentmethod_id))) { return NULL; // Another method was selected, do nothing } if (!class_exists('KlarnaAddr')) { require JPATH_VMKLARNAPLUGIN . DS . 'klarna' . DS . 'api' . DS . 'klarnaaddr.php'; } $session = JFactory::getSession(); $sessionKlarna = new stdClass(); //$post = JRequest::get('post'); $klarnaData_paymentmethod = JRequest::getVar('klarna_paymentmethod', ''); if ($klarnaData_paymentmethod == 'klarna_invoice') { $klarnaData_payment = "klarna_invoice"; $sessionKlarna->klarna_option = 'invoice'; } elseif ($klarnaData_paymentmethod == 'klarna_partPayment') { $klarnaData_payment = "klarna_partpay"; $sessionKlarna->klarna_option = 'part'; } elseif ($klarnaData_paymentmethod == 'klarna_speccamp') { $klarnaData_payment = "klarna_speccamp"; $sessionKlarna->klarna_option = 'spec'; } else { return NULL; } // Store payment_method_id so we can activate the // right payment in case something goes wrong. $sessionKlarna->virtuemart_payment_method_id = $cart->virtuemart_paymentmethod_id; $sessionKlarna->klarna_paymentmethod = $klarnaData_paymentmethod; $this->_getCartAddressCountryCode($cart, $country3, $countryId, 'country_3_code'); // $country2= strtolower($country2); if (empty($country3)) { $country3 = "SWE"; $countryId = ShopFunctions::getCountryIDByName($country3); } $cData = KlarnaHandler::countryData($method, strtoupper($country3)); $klarnaData = KlarnaHandler::getDataFromEditPayment(); $klarnaData['country'] = $cData['country_code']; //$country = $cData['country_code']; //KlarnaHandler::convertCountry($method, $country2); //$lang = $cData['language_code']; //KlarnaHandler::getLanguageForCountry($method, $country); // Get the correct data //Removes spaces, tabs, and other delimiters. // If it is a swedish customer we use the information from getAddress if (strtolower($cData['country_code']) == "se") { if (empty($klarnaData['socialNumber'])) { VmInfo('VMPAYMENT_KLARNA_MUST_VALID_PNO'); return false; } $swedish_addresses = klarnaHandler::getAddresses($klarnaData['socialNumber'], $cData, $method); if (empty($swedish_addresses)) { VmInfo('VMPAYMENT_KLARNA_NO_GETADDRESS'); return false; } //This example only works for GA_GIVEN. foreach ($swedish_addresses as $address) { if ($address->isCompany) { $klarnaData['company_name'] = $address->getCompanyName(); } else { $klarnaData['first_name'] = $address->getFirstName(); $klarnaData['last_name'] = $address->getLastName(); } $klarnaData['street'] = $address->getStreet(); $klarnaData['zip'] = $address->getZipCode(); $klarnaData['city'] = $address->getCity(); $klarnaData['country'] = $address->getCountryCode(); $countryId = $klarnaData['virtuemart_country_id'] = shopFunctions::getCountryIDByName($klarnaData['country']); } foreach ($klarnaData as $key => $value) { $klarnaData[$key] = mb_convert_encoding($klarnaData[$key], 'UTF-8', 'ISO-8859-1'); } } elseif (!KlarnaHandler::checkDataFromEditPayment($klarnaData)) { //VmInfo('VMPAYMENT_KLARNA_MISSING_DATA'); //return false; } $st = $this->getCartAddress($cart, $address_type, true); if ($address_type == 'BT') { $prefix = ''; } else { $prefix = 'shipto_'; } // Update the Shipping Address to what is specified in the register. $update_data = array($prefix . 'address_type_name' => 'Klarna', $prefix . 'company' => $klarnaData['company_name'], $prefix . 'first_name' => $klarnaData['first_name'], $prefix . 'middle_name' => $st['middle_name'], $prefix . 'last_name' => $klarnaData['last_name'], $prefix . 'address_1' => $klarnaData['street'], $prefix . 'address_2' => $klarnaData['house_ext'], $prefix . 'house_no' => $klarnaData['house_no'], $prefix . 'zip' => html_entity_decode($klarnaData['zip']), $prefix . 'city' => $klarnaData['city'], $prefix . 'virtuemart_country_id' => $countryId, $prefix . 'state' => '', $prefix . 'phone_1' => $klarnaData['phone'], $prefix . 'phone_2' => $st['phone_2'], $prefix . 'fax' => $st['fax'], $prefix . 'birthday' => empty($klarnaData['birthday']) ? $st['birthday'] : $klarnaData['birthday'], $prefix . 'social_number' => empty($klarnaData['pno']) ? $klarnaData['socialNumber'] : $klarnaData['pno'], 'address_type' => $address_type); if ($address_type == 'BT') { $update_data['email'] = $klarnaData['email']; } // save address in cart if different // if (false) { $cart->saveAddressInCart($update_data, $update_data['address_type'], true); //vmdebug('plgVmOnSelectCheckPayment $cart',$cart); //vmInfo(JText::_('VMPAYMENT_KLARNA_ADDRESS_UPDATED_NOTICE')); // } //} // Store the Klarna data in a session variable so // we can retrevie it later when we need it //$klarnaData['pclass'] = ($klarnaData_paymentmethod == 'klarna_invoice' ? -1 : intval(JRequest::getVar($kIndex . "paymentPlan"))); $klarnaData['pclass'] = $klarnaData_paymentmethod == 'klarna_invoice' ? -1 : intval(JRequest::getVar("klarna_paymentPlan")); $sessionKlarna->KLARNA_DATA = $klarnaData; // 2 letters small //$settings = KlarnaHandler::getCountryData($method, $cart_country2); try { $address = new KlarnaAddr($klarnaData['email'], $klarnaData['phone'], "", $klarnaData['first_name'], $klarnaData['last_name'], '', $klarnaData['street'], $klarnaData['zip'], $klarnaData['city'], $klarnaData['country'], $klarnaData['house_no'], $klarnaData['house_ext']); } catch (Exception $e) { VmInfo($e->getMessage()); return false; //KlarnaHandler::redirectPaymentMethod('message', $e->getMessage()); } if (isset($errors) && count($errors) > 0) { $msg = JText::_('VMPAYMENT_KLARNA_ERROR_TITLE_1'); foreach ($errors as $error) { $msg .= "<li> -" . $error . "</li>"; } $msg .= JText::_('VMPAYMENT_KLARNA_ERROR_TITLE_2'); unset($errors); VmError($msg); return false; //KlarnaHandler::redirectPaymentMethod('error', $msg); } $session->set('Klarna', serialize($sessionKlarna), 'vm'); return true; }
function getKlarnaAddress() { if (JVM_VERSION >= 2) { require_once JPATH_ROOT . DS . 'plugins' . DS . 'vmpayment' . DS . 'klarna' . DS . 'klarna.php'; require_once JPATH_ROOT . DS . 'plugins' . DS . 'vmpayment' . DS . 'klarna' . DS . 'klarna' . DS . 'api' . DS . 'klarnaaddr.php'; } else { require_once JPATH_ROOT . DS . 'plugins' . DS . 'vmpayment' . DS . 'klarna.php'; require_once JPATH_ROOT . DS . 'plugins' . DS . 'vmpayment' . DS . 'klarna' . DS . 'api' . DS . 'klarnaaddr.php'; } $klarna = new Klarna(); $q = "select * from #__virtuemart_paymentmethods where payment_element = 'klarna' and published = '1' limit 0,1"; $db = JFactory::getDBO(); $db->setQuery($q); $res = $db->loadAssoc(); if (empty($res)) { return null; } $id = $res['virtuemart_paymentmethod_id']; jimport('joomla.html.parameter'); $params = explode('|', $res['payment_params']); $obj = new stdclass(); foreach ($params as $item) { $item = explode('=', $item); $key = $item[0]; unset($item[0]); $item = implode('=', $item); if (!empty($item)) { $obj->{$key} = @json_decode($item); } } $cData = KlarnaHandler::countryData($obj, 'SWE'); $language = KlarnaLanguage::fromCode('SE'); $currency = KlarnaCurrency::fromCode($cData['currency_code']); $klarna->config($cData['eid'], $cData['secret'], $cData['country_code'], $language, $currency, $cData['mode']); /* $country = JRequest::getVar('virtuemart_country_id', ''); if (!empty($country) && (is_numeric($country))) { $q = 'select * from #__virtuemart_countries where virtuemart_country_id = '.$country.' limit 0,1'; $db->setQuery($q); $r = $db->loadAssoc(); $e = $db->getErrorMsg(); if (empty($r)) $c = 'se'; else $c = strtolower($r['country_2_code']); } else */ $c = 'se'; $klarna->setCountry($c); $klarna->setLanguage($language); $klarna->setCurrency($currency); //Attempt to get the address(es) associated with the SSN/PNO. $pn = JRequest::getVar('socialNumber', ''); $addrs = $klarna->getAddresses($pn); if (empty($addrs)) { return null; } $a = array(); foreach ($addrs as $key => $addr) { $a = $addr->toArray(); foreach ($a as $k => $v) { $a[$k] = utf8_encode($v); } return $a; //if (empty($ar)) return null; if ($addr->isCompany) { $a['company_name'] = $addr->getCompanyName(); } else { $a['company_name'] = ''; } $a['first_name'] = $addr->getFirstName(); $a['last_name'] = $addr->getLastName(); $a['address_1'] = $addr->getStreet(); $a['email'] = $addr->getEmail(); $a['phone_1'] = $addr->getTelno(); $a['phone_2'] = $addr->getCellno(); $a['address_2'] = $addr->getHouseExt(); $a['zip'] = $addr->getZipCode(); $a['city'] = $addr->getCity(); return $a; } return null; /* If there exists several addresses you would want to output a list in which the customer could choose the address which suits him/her. */ // Print them if available: foreach ($addrs as $key => $addr) { echo "<table>\n"; // This only works if the right getAddresses type is used. if ($addr->isCompany) { echo "\t<tr><td>Company</td><td> {$addr->getCompanyName()} </td></tr>\n"; } else { echo "\t<tr><td>First name</td><td>{$addr->getFirstName()}</td></tr>\n"; echo "\t<tr><td>Last name</td><td>{$addr->getLastName()}</td></tr>\n"; } echo "\t<tr><td>Street</td><td>{$addr->getStreet()}</td></tr>\n"; echo "\t<tr><td>Zip code</td><td>{$addr->getZipCode()}</td></tr>\n"; echo "\t<tr><td>City</td><td>{$addr->getCity()}</td></tr>\n"; echo "\t<tr><td>Country</td><td>{$addr->getCountryCode()}</td></tr>\n"; echo "</table>\n"; } //Something went wrong return null; echo "{$e->getMessage()} (#{$e->getCode()})\n"; return null; return null; }