Files
grzanieplus.pl/plugins/stPayNowPlugin/lib/stPayNow.class.php
2025-03-12 17:06:23 +01:00

213 lines
5.4 KiB
PHP

<?php
require __DIR__ . '/../vendor/autoload.php';
class stPayNow implements stPaymentInterface
{
/**
* Konfiguracja płatności
*
* @var stConfig
*/
protected $config;
/**
* Ostatni błąd płatności
*
* @var string
*/
protected $lastError = null;
public function __construct()
{
$this->config = stConfig::getInstance('stPayNow');
}
/**
* Zwraca scieżke do loga płatności
*
* @return string
*/
public function getLogoPath()
{
return '/plugins/stPayNowPlugin/images/logo.png';
}
/**
* Utwórz nową płatność
*
* @param Order $order Instancja modelu Order
* @return string|false
*/
public function createPayment(Order $order)
{
$context = sfContext::getInstance();
$i18n = $context->getI18N();
$paymentData = array(
"amount" => stPrice::round($order->getUnpaidAmount() * 100, 0),
"currency" => $order->getOrderCurrency()->getShortcut(),
"externalId" => $order->getNumber(),
"description" => $i18n->__("Zamówienie nr", null, 'stOrder').' '.$order->getNumber(),
'continueUrl' => $context->getController()->genUrl('@stPayNowReturn?id='.$order->getId().'&hash_code='.$order->getHashCode(), true),
"buyer" => array(
"email" => $order->getOptClientEmail(),
),
);
self::log("Creating Payment Request for order {$order->getNumber()}: ". self::logFormat($paymentData));
return $this->paymentRequest($paymentData);
}
/**
* Sprawdza poprawność konfiguracja płatności
*
* @return bool
*/
public function validateConfiguration()
{
return false !== $this->paymentRequest(array(
"amount" => 100,
"currency" => 'PLN',
"externalId" => "test-".uniqid(),
"description" => "Configuration Test",
"buyer" => array(
"email" => 'email@example.com',
)
));
}
/**
* Tworzy nowe żądanie utworzenia płatności
*
* @param array $paymentData
* @return string|false Link do utworzonej płatności
*/
public function paymentRequest(array $paymentData)
{
$client = new \Paynow\Client($this->config->get('api_key'), $this->config->get('api_signature_key'), $this->isSandbox() ? \Paynow\Environment::SANDBOX : \Paynow\Environment::PRODUCTION);
$idempotencyKey = uniqid($paymentData['externalId'] . '_');
try
{
$payment = new \Paynow\Service\Payment($client);
$result = $payment->authorize($paymentData, $idempotencyKey);
}
catch (\PayNow\Exception\PaynowException $exception)
{
$this->lastError = $exception->getMessage();
return false;
}
if ($result->status == 'ERROR')
{
$this->lastError = 'Payment initialization failed';
return false;
}
$this->lastError = null;
return $result->redirectUrl;
}
/**
* Zwraca informacje o statusie płatności
*
* @param string $data
* @param array $headers
* @return array
*/
public function parseStatusNotification($data, array $headers)
{
$notificationData = json_decode($data, true);
if (!$notificationData)
{
self::log("parseStatusNotification malformed json: ". $data);
}
try
{
new \Paynow\Notification($this->config->get('api_signature_key'), $data, $headers);
}
catch (\Exception $e)
{
self::log("parseStatusNotification exception: ". $e->getMessage());
return false;
}
return $notificationData;
}
/**
* Zwraca ostatni błąd
*
* @return string
*/
public function getLastError()
{
return $this->lastError;
}
/**
* Sprawdza czy płatność jest w trybie testowym/sandbox
*
* @return bool
*/
public function isSandbox()
{
return $this->config->get('sandbox');
}
/**
* Sprawdza czy płatność ma włączone autoprzekierowanie
*
* @return bool
*/
public function isAutoRedirectEnabled()
{
return $this->config->get('autoredirect');
}
/**
* Sprawdza czy płatnośc jest poprawnie skonfigurowana
*
* @return bool
*/
public function checkPaymentConfiguration()
{
return $this->config->get('enabled');
}
/**
* Zwraca token bezpieczeństwa
*
* @return string
*/
public static function getSecurityToken()
{
return stSecureToken::generate(array('123456789'));
}
/**
* Zwraca adres powiadomienia o statusie płatności
*
* @return string
*/
public static function getNotifyUrl()
{
return st_url_for('@stPayNowNotify?token=' . self::getSecurityToken(), true, 'frontend', null, null, true, stConfig::getInstance('stSecurityBackend')->get('ssl'));
}
public static function logFormat($value)
{
return json_encode($value, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
}
public static function log($message)
{
stPayment::log('paynow', $message);
}
}