getRequest(); $tmp = $request->isSecure(); $host = $request->getUriPrefix(); $request->setIsSecure($tmp); return $host; } public static function getSecureItnUrl() { return self::getHost() . '/bm/itn/' . self::getPostSecureHash(); } public static function getSecureReturnUrl() { return self::getHost() . '/bm/return'; } public static function getPayments($activeOnly = true) { if (null === self::$payments) { $payments = array(); foreach (PaymentTypePeer::doSelectByModuleName('appBlueMedia') as $paymentType) { if (!$activeOnly || $paymentType->getActive()) { $payments[$paymentType->getConfigurationParameter('gateway_id')] = $paymentType; } if (!$paymentType->getConfigurationParameter('gateway_id')) { self::$blueMediaPayment = $paymentType; } } self::$payments = $payments; } return self::$payments; } public static function getBlueMediaPayment() { self::getPayments(); return self::$blueMediaPayment; } public function __construct() { $this->config = stConfig::getInstance('appBlueMedia'); } public function isBlik(Order $order) { $payment = $order->getOrderPayment(); if ($payment) { $paymentType = $payment->getPaymentType(); return $paymentType && $paymentType->getConfigurationParameter('gateway_id') == self::BLIK_GATEWAY || $payment->getConfigurationParameter('gateway_id') == self::BLIK_GATEWAY; } return false; } public function getServiceId() { return $this->config->get('id'); } public function getGatewayList($refresh = false) { if (null === $this->gatewayList) { $fc = stFunctionCache::getInstance('appBlueMediaPlugin'); if ($refresh) { $fc->removeAll(); } $fc->setLifeTime(86400); $this->gatewayList = $fc->cacheCall(array($this, 'getPaywayList'), array(), array('id' => 'paywaylist')); $fc->setLifeTime(time()); } return $this->gatewayList; } public function getGatewayInfo($gatewayId) { $gateways = $this->getGatewayList(); return isset($gateways[$gatewayId]) ? $gateways[$gatewayId] : null; } public function getPaywayList() { $params = array( 'ServiceID' => $this->config->get('id'), 'MessageID' => $this->randomString(32), ); $results = $this->gatewayCall('/paywayList', $params); $paywayList = array(); foreach ($results['gateway'] as $gateway) { $paywayList[$gateway['gatewayID']] = array( 'id' => $gateway['gatewayID'], 'name' => $gateway['gatewayName'], 'type' => $gateway['gatewayType'], 'bank' => $gateway['bankName'], 'icon' => $gateway['iconURL'], ); } return $paywayList; } public function createPayment(Order $order, array $params = array()) { $sf_context = sfContext::getInstance(); $i18n = $sf_context->getI18N(); $payment = $order->getOrderPayment(); if (!$payment) { stPayment::log('bluemedia', "Missing instance of Payment", stPayment::LOG_FATAL); throw new appBlueMediaException("Missing instance of Payment"); } $paymentType = $payment->getPaymentType(); if (!$paymentType) { stPayment::log('bluemedia', "Missing instance of PaymentType", stPayment::LOG_FATAL); throw new appBlueMediaException("Missing instance of PaymentType"); } $gateway_id = !$this->config->get('gateways_popup') ? $paymentType->getConfigurationParameter('gateway_id') : $payment->getConfigurationParameter('gateway_id'); mb_internal_encoding('UTF-8'); mb_regex_encoding("UTF-8"); $params = array_merge(array( 'ServiceID' => $this->getServiceId(), 'OrderID' => $order->getId(), 'Amount' => $order->getUnpaidAmount(), 'Description' => $sf_context->getRequest()->getUriPrefix() . '/ - ' . stTextAnalyzer::unaccent($i18n->__("Zamówienie nr", null, 'stOrder').' '.$order->getNumber()), 'GatewayID' => $gateway_id, 'Currency' => $order->getOrderCurrency()->getShortcut(), 'CustomerEmail' => $order->getOptClientEmail(), 'CustomerIP' => $order->getRemoteAddress(), ), $params); $response = $this->gatewayCall('/payment', $params, array('BmHeader: pay-bm-continue-transaction-url')); $this->lastResponse = $response; return $response; } public function getLastResponse() { return $this->lastResponse; } public function getGatewayUrl() { return $this->config->get('sandbox') ? 'https://pay-accept.bm.pl' : 'https://pay.bm.pl'; } final public function appendHash(array &$data) { $data['Hash'] = $this->createHash($data); return $data; } final public function createHash(array $data) { $result = ''; foreach ($data as $name => $value) { if (mb_strtolower($name) == 'hash' || empty($value)) { continue; } $result .= $value.'|'; } return hash('sha256', $result.$this->config->get('key')); } final public function verifyHash($hash, array $data) { return $hash == $this->createHash($data); } final public function randomString($length) { $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; $randstring = ''; for ($i = 0; $i < $length; $i++) { $randstring .= $characters[rand(0, strlen($characters) - 1)]; } return $randstring; } final public function readNotifyRequest($transactionXml) { $data = array(); $xmlReader = new XMLReader(); $xmlReader->XML($transactionXml, 'UTF-8', (LIBXML_NOERROR | LIBXML_NOWARNING)); while ($xmlReader->read()) { switch ($xmlReader->nodeType) { case XMLREADER::ELEMENT: $nodeName = ucfirst($xmlReader->name); $xmlReader->read(); $nodeValue = trim($xmlReader->value); if (!empty($nodeName) && !empty($nodeValue)) { $data[$nodeName] = $nodeValue; } break; } } $xmlReader->close(); return $data; } final public function returnNotifyStatus(array $data) { $this->appendHash($data); $xml = new XMLWriter(); $xml->openMemory(); $xml->startDocument('1.0', 'UTF-8'); $xml->startElement('confirmationList'); $xml->writeElement('serviceID', $data['ServiceID']); $xml->startElement('transactionsConfirmations'); $xml->startElement('transactionConfirmed'); $xml->writeElement('orderID', $data['OrderID']); $xml->writeElement('confirmation', $data['Status']); $xml->endElement(); $xml->endElement(); $xml->writeElement('hash', $data['Hash']); $xml->endElement(); return $xml->outputMemory(); } final public function parseXml($xml) { $data = $xml instanceof SimpleXMLElement ? $xml : simplexml_load_string($xml); return $data ? json_decode(json_encode($data), true) : null; } public function gatewayCall($url, array $params, array $headers = null) { $responseHeaders = array(); $url = $this->getGatewayUrl() . $url; $curl = curl_init($url); if ($headers) { curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); } $this->appendHash($params); stPayment::log("bluemedia", array( "Calling $url with parameters", $params, )); curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($params, '', '&')); curl_setopt($curl, CURLOPT_POST, 1); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true); curl_setopt($curl, CURLOPT_HEADERFUNCTION, function($curl, $header) use (&$headers) { $len = strlen($header); $responseHeaders[] = trim($header); return $len; }); $result = curl_exec($curl); $error = curl_error($curl); if ($error) { stPayment::log('bluemedia', array( "Curl error", $error ), stPayment::LOG_FATAL); throw new appBlueMediaException($error); } if ($result && $result != 'ERROR') { $xmlResult = simplexml_load_string($result); if (!$xmlResult) { stPayment::log('bluemedia', array( "Bład parsowania odpowiedzi", $result, ), stPayment::LOG_FATAL); throw new appBlueMediaException("Błąd parsowania"); } elseif ($xmlResult->getName() == 'error') { stPayment::log('bluemedia', array( "Api error", $xmlResult->description, ), stPayment::LOG_FATAL); throw new appBlueMediaException($xmlResult->description, $xmlResult->statusCode); } } $response = $this->parseXml($result); if ($result != 'ERROR') { stPayment::log('bluemedia', array( 'Response', $response, )); } else { stPayment::log('bluemedia', array( 'Response', $result, $responseHeaders, curl_getinfo($curl), ), stPayment::LOG_ERROR); } curl_close($curl); return $response; } public function getLogoPath() { return '/plugins/appBlueMediaPlugin/images/logo.png'; } public function isAutoRedirectEnabled() { return $this->config->get('autoredirect'); } public function checkPaymentConfiguration(PaymentType $paymentType) { if (!$this->config->get('enabled')) { return false; } $ok = $this->config->get('configuration_check', false); if (SF_APP == 'frontend') { $currencies = array('PLN'); $ok = $ok && in_array(stCurrency::getInstance(sfContext::getInstance())->get()->getShortcut(), $currencies); $ok = $ok && stTheme::getInstance(sfContext::getInstance())->getVersion() >= 7; if ($paymentType->getConfigurationParameter('gateway_id') == 700 && sfContext::getInstance()->getUser()->getBasket()->getTotalAmount(true, false) <= 200) { $ok = false; } } return $ok; } }