Files
kupshop/bundles/KupShop/OrderingBundle/OmniPay.php
2025-08-02 16:30:27 +02:00

115 lines
3.1 KiB
PHP

<?php
declare(strict_types=1);
namespace KupShop\OrderingBundle;
use KupShop\KupShopBundle\Config;
use KupShop\KupShopBundle\Exception\RedirectException;
use Omnipay\Common\GatewayInterface;
use Omnipay\Common\Message\ResponseInterface;
use Payment;
abstract class OmniPay extends \Payment
{
abstract public static function getOmnipayName(): string;
abstract public function configureGateway(GatewayInterface $gateway, \Order $order): GatewayInterface;
public function getGatewayOptions(\Order $order): array
{
return [];
}
public function processStep_1()
{
$gateway = $this->getGateway();
try {
// Auth
$response = $gateway->purchase($this->getGatewayOptions($this->order))->send();
if ($response->isRedirect()) {
$response->redirect();
} else {
echo $response->getMessage();
}
} catch (\Exception $e) {
getRaven()->captureException($e);
echo $e->getMessage();
}
exit;
}
public function processStep_5()
{
$gateway = $this->getGateway();
try {
$response = $gateway->completePurchase($this->getGatewayOptions($this->order))->send();
if ($response->isSuccessful()) {
$op_id_payment = $response->getTransactionReference();
$this->status = \Payment::STATUS_FINISHED;
// Ensure payment exists
if (!$this->getStatus($op_id_payment)) {
$this->createPaymentFromResponse($response);
}
// change payment status to finished
if (!$this->setStatus(\Payment::STATUS_FINISHED, $op_id_payment)) {
throw new \Exception('Omnipay::updatePaymentStatus: setStatus failed!');
}
$this->success(translate('paymentSuccess', 'payment'));
} else {
if (($response->getData()['ResponseCode'] ?? false) == 15) {
$this->error(translate('payment_storno', 'payment'));
}
$this->step(-3, 'storno');
}
} catch (RedirectException $e) {
throw $e;
} catch (\Exception $e) {
getRaven()->captureException($e);
$this->step(-3, 'Storno because some error happened');
}
}
public function getGateway(): GatewayInterface
{
$gateway = \Omnipay\Omnipay::create(static::getOmnipayName());
return $this->configureGateway($gateway, $this->order);
}
public static function isEnabled($className)
{
$cfg = Config::get();
if (empty($cfg['Modules']['payments'][$className])) {
return false;
}
return true;
}
protected function createPaymentFromResponse(ResponseInterface $response)
{
$this->createPayment(
$response->getTransactionReference(),
str_replace(',', '.', $response->getData()['Amount']),
['paymentClass' => static::class]
);
}
public function hasOnlinePayment()
{
return true;
}
}