Napojení eshopu na bránu Essox Komerční banky

Kalkulačka, žádost o půjčku, kontrola stavu smlouvy

Dokumentace Essoxu nemá žádný ukázkový příklad, nicméně napojení na webové služby není nějak složité. Jedná se jen o sestavení GET dotazů obsahujícího XML požadavku + při kontrole stavu smlouvy čtení jednoho XML na odpovdi.

Na několik záludností jsem ale při řešení narazil...

1. nevalidní certifikát na testovací verzi.

CURL nic nevracel, dokud jsem si neuvědomil, že i v prohlížeči jsem odklikával varování na špatný certifikát. Volání stačí rozšířit curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);

2. přesměrování adresy a očekávání cookies před redirectem

I s tímto si umí poradit CURL, nejprve je nutné mu přidat parameter, aby následoval i přesměrování curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true). Takto by si skript ale neuložil cookies - k tomu slouží parametr curl_setopt($ch, CURLOPT_COOKIEFILE, '')

Celou třídu pro komunikaci s webovou službou Essox najdete zde:

/** * Třída pro spojení se službou Essox, pro zobrazení kalkulačky a nebo přesměrování objednávky do KB Essox pro zřízení půjčky * Class Essox */ class Essox { const production = false; // true pro produkční připojení k serverům essox const EsxCode = 5; // nemám ponětí proč 5, v návodu jsem odpověd nedohledal... const serviceName_Calc = 'Calculation'; const serviceName_newContract = 'NewContract'; const serviceName_checkStatus = 'Request'; /** * Přístupy k testovacímu serveru * @var array */ private static $connection_dev = [ 'url' => 'https://e-smlouvy.test.essox.cz/', 'userName' => 'essoxtest', 'encryptKey' => '****' ]; /** * Přístupy k produkčnímu serveru * @var array */ private static $connection_prod = [ 'url' => 'https://e-smlouvy.essox.cz/', 'userName' => '****', 'encryptKey' => '****' ]; private $timestamp; private $connection; /** * Konstruktor - nastaví timestamp a připojení k serveru essoxu * @throws Exception */ public function __construct() { if (self::production === true) { $this->connection = self::$connection_prod; } else { $this->connection = self::$connection_dev; } $timestamp = new \DateTime(); $this->timestamp = $timestamp->format('YmdHis'); } /** * Metoda připraví požadavaná data pro webovou službu essoxu (sestaví XML i s kontrolním hashem) * @param $serviceName string konstanta pro typ splužby * @param $data array vstupní data * @return string */ private function prepareData($serviceName, $data) { $xml = new SimpleXMLElement(''); $xml->addChild('Version',1.0); $xml->addChild('ServiceName',$serviceName); $baseParameters = $xml->addChild('BaseParameters'); $extendedParameters = $xml->addChild('ExtendedParameters'); $baseParameters->addChild('UserName', $this->connection['userName']); $baseParameters->addChild('Price', $data['price']); $baseParameters->addChild('Timestamp', $this->timestamp); $baseParameters->addChild('HashKey', sha1(implode('#', [$this->connection['userName'], $this->connection['encryptKey'], $data['price'], $this->timestamp]))); if (isset($data['orderId'])) { $extendedParameters->addChild('OrderId', $data['orderId']); } return base64_encode($xml->asXML()); } /** * Vygenerování odkazu pro přesměrování na kalkulačku * @param $price int cena objednávky * @return string */ public function calculator($price) { $data = $this->prepareData(self::serviceName_Calc, ['price' => round($price)]); return $this->connection['url'] . '?ESXCode=' . self::EsxCode . '&ESXAuth=' . $data; } /** * Vygenerování odkazu pro přesměrování na formulář pro zajištění financování * @param $orderId int číslo objednávky * @param $price int cena objednávky * @return string */ public function newContract($orderId, $price) { $data = $this->prepareData(self::serviceName_newContract, ['orderId' => $orderId, 'price' => round($price)]); return $this->connection['url'] . '?ESXCode=' . self::EsxCode . '&ESXAuth=' . $data; } /** * Zjištění stavu žádosti * @param $orderId int číslo objednávky * @param $price int číslo objdnávky * @return array|bool */ public function checkStatus($orderId, $price) { $data = $this->prepareData(self::serviceName_checkStatus, ['orderId' => $orderId, 'price' => round($price)]); $url = $this->connection['url']. '?'.http_build_query(['ESXCode' => self::EsxCode,'ESXAuth' => $data]); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_COOKIEFILE, ''); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); if (!self::production) { curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); } // essox na testovací verzi nemá platný certifikát $content = curl_exec($ch); curl_close($ch); $xml = new SimpleXMLElement($content); if ($xml !== false) { if (!isset($xml->BusinessCase)) { return false; } return [ 'proposalNumber' => $xml->BusinessCase->ProposalNumber, 'contractNumber' => $xml->BusinessCase->ContractNumber, 'authorizationResultCode' => $xml->BusinessCase->AuthorizationResultId, 'authorizationResult' => $xml->BusinessCase->AuthorizationResult, 'contractStatusCode' => $xml->BusinessCase->ContractStatusId, 'contractStatus' => $xml->BusinessCase->ContractStatus[0] ]; } return false; } }

PHP prosinec 2018