first commit
This commit is contained in:
175
class/payments/class.Quatro.php
Normal file
175
class/payments/class.Quatro.php
Normal file
@@ -0,0 +1,175 @@
|
||||
<?php
|
||||
|
||||
use Firebase\JWT\JWT;
|
||||
use KupShop\KupShopBundle\Config;
|
||||
|
||||
/**
|
||||
* Dependencies: `composer require firebase/php-jwt=^5.4.0`
|
||||
* Class Quatro.
|
||||
*/
|
||||
class Quatro extends Payment
|
||||
{
|
||||
public static $name = 'Quatro';
|
||||
public $class = 'Quatro';
|
||||
protected $pay_method = Payment::METHOD_INSTALLMENTS;
|
||||
protected $templateOrderView = 'payment.Quatro.orderView.tpl';
|
||||
|
||||
public function getCalcUrl(Decimal $price): ?string
|
||||
{
|
||||
$price = roundPrice($price, -1, 'DB', 0)->asInteger();
|
||||
if (empty($this->config['seller']) || $price > 10000 || $price < 100) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return "https://quatro.vub.sk/kalkulacka/{$this->config['seller']}?cenaTovaru={$price}";
|
||||
}
|
||||
|
||||
public function getGatewayUrl(): ?string
|
||||
{
|
||||
if (empty($this->config['seller'])) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return "https://quatroapi.vub.sk/stores/{$this->config['seller']}/create-application";
|
||||
}
|
||||
|
||||
public function processStep_1()
|
||||
{
|
||||
}
|
||||
|
||||
public function processStep_2()
|
||||
{
|
||||
// hack protože natvrdo lepěj ? ke callbacku
|
||||
$cn = str_replace('?cn=', '', getVal('h'));
|
||||
$id = getVal('id');
|
||||
$state = getVal('state');
|
||||
$sign = getVal('hmacSign');
|
||||
|
||||
if (hash_hmac('sha1', "cn={$cn}&id={$id}&state={$state}", base64_decode($this->config['key'])) != strtolower($sign) && !isDevelopment()) {
|
||||
throw new \KupShop\OrderingBundle\Exception\PaymentException('Chyba ověření podpisu');
|
||||
}
|
||||
|
||||
$remainingPayment = roundPrice($this->order->getRemainingPayment())->asFloat();
|
||||
if ($remainingPayment > 0.00) {
|
||||
if (!$this->getPendingPayment()) {
|
||||
$this->createPayment(
|
||||
$id,
|
||||
$remainingPayment,
|
||||
['paymentClass' => self::class]
|
||||
);
|
||||
}
|
||||
|
||||
if (getVal('state') == 'signed') {
|
||||
$paymentStatus = Payment::STATUS_FINISHED;
|
||||
} elseif (getVal('state') == 'canceled') {
|
||||
$paymentStatus = Payment::STATUS_STORNO;
|
||||
} else {
|
||||
$paymentStatus = Payment::STATUS_PENDING;
|
||||
}
|
||||
|
||||
// change payment status
|
||||
if (!$this->setStatus($paymentStatus, $id)) {
|
||||
logError(__FILE__, __LINE__, 'Payment::updatePaymentStatus: setStatus failed!');
|
||||
throw new \Exception('Set status failed');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected function getSubject()
|
||||
{
|
||||
$subject = '';
|
||||
foreach ($this->order->fetchItems() as $item) {
|
||||
if (!$item['id_product']) {
|
||||
continue;
|
||||
}
|
||||
/** @var Product $product */
|
||||
$product = $item['product'];
|
||||
$subject .= "{$product->fetchSections()[0]->getName()} - {$product->fetchProducer()['name']} - {$product->title},";
|
||||
}
|
||||
$subject = substr($subject, 0, -1);
|
||||
|
||||
if (strlen($subject) > 250) {
|
||||
$subject = substr($subject, 0, 247).'...';
|
||||
}
|
||||
|
||||
return $subject;
|
||||
}
|
||||
|
||||
public function getPayload()
|
||||
{
|
||||
$payload = [
|
||||
'application' => [
|
||||
'orderNumber' => $this->order->order_no,
|
||||
'applicant' => [
|
||||
'firstName' => $this->order->invoice_name,
|
||||
'lastName' => $this->order->invoice_surname,
|
||||
'email' => $this->order->invoice_email,
|
||||
'mobile' => $this->order->invoice_phone,
|
||||
'permanentAddress' => [
|
||||
'addressLine' => $this->order->invoice_street,
|
||||
'city' => $this->order->invoice_city,
|
||||
'zipCode' => $this->order->invoice_zip,
|
||||
'country' => $this->order->invoice_country,
|
||||
],
|
||||
],
|
||||
'subject' => $this->getSubject(),
|
||||
'totalAmount' => $this->order->total_price->asFloat(),
|
||||
'goodsAction' => null,
|
||||
'callback' => $this->getGenericPaymentUrl(2, ['h' => '']),
|
||||
],
|
||||
'iat' => time(),
|
||||
];
|
||||
$jwt = JWT::encode($payload, base64_decode($this->config['key']), 'HS256');
|
||||
|
||||
return $jwt;
|
||||
}
|
||||
|
||||
// https://www.kupshop.local/platby/Quatro/1/49698/?cf=2171114784fcbceb29f9b6bdc6f07e48&h=?cn=1000018425&id=0514186c-3eb6-4150-ac31-048eb330507d&state=canceled&hmacSign=95F512D8D7F14A02376A78CE94382A3F2301DA5E
|
||||
|
||||
public function accept($totalPrice, $freeDelivery)
|
||||
{
|
||||
$totalPrice = $totalPrice->getPriceWithVat()->asFloat();
|
||||
if ($totalPrice <= 0 && $this->order) {
|
||||
$totalPrice = $this->order->total_price;
|
||||
}
|
||||
|
||||
return parent::accept($totalPrice, $freeDelivery) && $totalPrice >= 100 && $totalPrice <= 10000;
|
||||
}
|
||||
|
||||
public static function getSettingsConfiguration(): array
|
||||
{
|
||||
return [
|
||||
'fields' => [
|
||||
'key' => [
|
||||
'title' => 'Bezpečnostní klíč',
|
||||
'type' => 'text',
|
||||
],
|
||||
'seller' => [
|
||||
'title' => 'Kód prodejny',
|
||||
'type' => 'text',
|
||||
],
|
||||
],
|
||||
];
|
||||
}
|
||||
|
||||
public function startPayment()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
public function hasOnlinePayment()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
public static function isEnabled($className)
|
||||
{
|
||||
$cfg = Config::get();
|
||||
|
||||
if (empty($cfg['Modules']['payments'][$className])) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user