Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .version
Original file line number Diff line number Diff line change
@@ -1 +1 @@
2.3.2
2.4.0
10 changes: 10 additions & 0 deletions CHANGELOG.MD
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,16 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## 2.4.0

### Added

- Feature: new block added to success page, for BLIK payments will show message "confirm in bank payment app" and allow to retry payment if BLIK payment fails

### Changed

- updated payment icons

## 2.3.2

### Added
Expand Down
28 changes: 5 additions & 23 deletions Controller/Tpay/Create.php
Original file line number Diff line number Diff line change
Expand Up @@ -94,41 +94,23 @@ public function execute(): ResultInterface
$transactionUrl = str_replace('gtitle', 'title', $transactionUrl);
}

$this->tpayService->addCommentToHistory($orderId, 'Transaction link '.$transactionUrl);
if (!empty($transactionUrl)) {
$this->tpayService->addCommentToHistory($orderId, 'Transaction link '.$transactionUrl);
}
$paymentData['additional_information']['transaction_url'] = $transactionUrl;
$payment->setData($paymentData);
$this->tpayService->saveOrderPayment($payment);

if ($this->additionalPaymentInfoValidator->validateBlikIfPresent($additionalPaymentInformation) && $this->tpay->checkBlikLevel0Settings()) {
if (isset($transaction['payments']['errors']) && count($transaction['payments']['errors']) > 0) {
return $this->redirectFactory->redirectError();
}

return $this->redirectFactory->redirectSuccess();
}

if (!empty($transactionUrl)) {
return $this->redirectFactory->redirectTransaction($transactionUrl);
}

return $this->redirectFactory->redirectSuccess();
}

return $this->redirectFactory->redirectError();
}

/**
* Send BLIK code for transaction id
*
* @param string $blikTransactionId
* @param string $blikCode
* @param string $blikAlias
*/
protected function blikPay($blikTransactionId, $blikCode, $blikAlias): bool
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Gdzie ta metoda była użyta?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nie była, IDE wskazało martwy kod

{
$apiResult = $this->transaction->blik($blikTransactionId, $blikCode, $blikAlias);

return isset($apiResult['result']) && 1 === $apiResult['result'];
}

private function prepareTransaction($orderId, array $additionalPaymentInformation)
{
$data = $this->tpay->getTpayFormData($orderId);
Expand Down
2 changes: 1 addition & 1 deletion Controller/Tpay/Redirect.php
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ public function execute(): ResultInterface
$additionalPaymentInfo = $this->tpayService->getPayment($orderId)->getData()['additional_information'];

if ($this->additionalPaymentInfoValidator->validateCardData($additionalPaymentInfo)) {
return $this->redirectFactory->redirectCartPayment();
return $this->redirectFactory->redirectCardPayment();
}

if ($this->additionalPaymentInfoValidator->validatePresenceOfGroupOrChannel($additionalPaymentInfo) && $this->additionalPaymentInfoValidator->validateBlikIfPresent($additionalPaymentInfo)) {
Expand Down
113 changes: 113 additions & 0 deletions Controller/Tpay/Retry.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
<?php

declare(strict_types=1);

namespace Tpay\Magento2\Controller\Tpay;

use Magento\Checkout\Model\Session;
use Magento\Framework\App\Action\HttpPostActionInterface;
use Magento\Framework\App\ActionInterface;
use Magento\Framework\App\Request\Http;
use Magento\Framework\App\Request\InvalidRequestException;
use Magento\Framework\Controller\Result\JsonFactory;
use Magento\Framework\Controller\ResultInterface;
use Magento\Sales\Api\OrderRepositoryInterface;
use Tpay\Magento2\Model\ApiFacade\Transaction\TransactionApiFacade;
use Tpay\Magento2\Model\TpayPayment;
use Tpay\Magento2\Service\TpayService;

class Retry implements ActionInterface, HttpPostActionInterface
{
/** @var JsonFactory */
private $resultJsonFactory;

/** @var OrderRepositoryInterface */
private $orderRepository;

/** @var TransactionApiFacade */
private $transactionApi;

/** @var Http */
private $request;

/** @var TpayPayment */
private $tpay;

/** @var TpayService */
private $service;

/** @var Session */
private $checkoutSession;

public function __construct(JsonFactory $resultJsonFactory, OrderRepositoryInterface $orderRepository, TransactionApiFacade $transactionApi, Http $request, TpayPayment $tpay, TpayService $service, Session $checkoutSession)
{
$this->resultJsonFactory = $resultJsonFactory;
$this->orderRepository = $orderRepository;
$this->transactionApi = $transactionApi;
$this->request = $request;
$this->tpay = $tpay;
$this->service = $service;
$this->checkoutSession = $checkoutSession;
}

public function execute(): ResultInterface
{
$orderId = $this->request->getParam('order_id');
$transactionId = $this->request->getParam('transaction_id');
$order = $this->orderRepository->get($orderId);
$payment = $order->getPayment();
$response = $this->resultJsonFactory->create();

$orderTransactionId = $payment->getAdditionalInformation('transaction_id');
if ($transactionId !== $orderTransactionId) {
throw new InvalidRequestException($response->setData(['error' => true]));
}

$paymentAttemptsCount = (int) ($payment->getAdditionalInformation('payment_attempts_count') ?? 1);

$status = $this->transactionApi->getStatus($transactionId);

if (in_array($status['status'], ['paid', 'correct', 'success'])) {
return $response->setData(['status' => 'success']);
}

if (null !== $payment->getAdditionalInformation('old_transaction_id')) {
return $response->setData(['status' => 'error']);
}

$disableBlik = $paymentAttemptsCount >= 3;

$blikCode = $this->request->getParam('blikCode');

if (!empty($blikCode) && preg_match('/^\d{6}$/', $blikCode) && $paymentAttemptsCount <= 3) {
$result = $this->transactionApi->blik($transactionId, $blikCode, null);

$payment->setAdditionalInformation('payment_attempts_count', $paymentAttemptsCount + 1);
$this->service->saveOrderPayment($payment);

if (!empty($result['payments']['errors'])) {
return $response->setData(['status' => 'failed', 'errorMessage' => $result['payments']['errors'][0]['errorMessage'], 'disableBlik' => $disableBlik]);
}

return $response->setData(['status' => 'wait', 'disableBlik' => $disableBlik]);
}

$this->transactionApi->cancel($transactionId);

$data = $this->tpay->getTpayFormData($order->getIncrementId());
$data = $this->transactionApi->originApiFieldCorrect($data);
$transaction = $this->transactionApi->createTransaction($data);

$payment->setAdditionalInformation('transaction_id', $transaction['transactionId']);
$payment->setAdditionalInformation('old_transaction_id', $transactionId);
$this->service->saveOrderPayment($payment);
$this->service->addCommentToHistory($order->getIncrementId(), __('Retrying payment with redirect to paywall and new transaction %1, link: %2', $transaction['title'], $transaction['transactionPaymentUrl']));

$this->checkoutSession->setLastRealOrderId($order->getIncrementId());
$this->checkoutSession->setLastSuccessQuoteId($order->getQuoteId());
$this->checkoutSession->setLastQuoteId($order->getQuoteId());
$this->checkoutSession->setLastOrderId($order->getIncrementId());

return $response->setData(['redirect' => $transaction['transactionPaymentUrl']]);
}
}
64 changes: 64 additions & 0 deletions Controller/Tpay/Status.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
<?php

declare(strict_types=1);

namespace Tpay\Magento2\Controller\Tpay;

use Magento\Framework\App\Action\HttpGetActionInterface;
use Magento\Framework\App\ActionInterface;
use Magento\Framework\App\Request\InvalidRequestException;
use Magento\Framework\App\RequestInterface;
use Magento\Framework\Controller\Result\JsonFactory;
use Magento\Framework\Controller\ResultInterface;
use Magento\Sales\Api\OrderRepositoryInterface;
use Tpay\Magento2\Model\ApiFacade\Transaction\TransactionApiFacade;

class Status implements ActionInterface, HttpGetActionInterface
{
/** @var JsonFactory */
private $resultJsonFactory;

/** @var OrderRepositoryInterface */
private $orderRepository;

/** @var TransactionApiFacade */
private $transactionApi;

/** @var RequestInterface */
private $request;

public function __construct(JsonFactory $resultJsonFactory, OrderRepositoryInterface $orderRepository, TransactionApiFacade $transactionApi, RequestInterface $request)
{
$this->resultJsonFactory = $resultJsonFactory;
$this->orderRepository = $orderRepository;
$this->transactionApi = $transactionApi;
$this->request = $request;
}

public function execute(): ResultInterface
{
$orderId = $this->request->getParam('order_id');
$transactionId = $this->request->getParam('transaction_id');
$order = $this->orderRepository->get($orderId);
$payment = $order->getPayment();
$response = $this->resultJsonFactory->create();

$orderTransactionId = $payment->getAdditionalInformation('transaction_id');
if ($transactionId !== $orderTransactionId) {
throw new InvalidRequestException($response->setData(['error' => true]));
}

$status = $this->transactionApi->getStatus($transactionId);

if (in_array($status['status'], ['paid', 'correct', 'success'])) {
return $response->setData(['status' => 'success']);
}

$previousAttempts = (int) ($payment->getAdditionalInformation('payment_attempts_count') ?? 1);
if (count($status['payments']['attempts']) >= $previousAttempts) {
return $response->setData(['status' => 'failed', 'errorMessage' => __('Payment failed. Try again.')]);
}

return $response->setData(['status' => 'wait']);
}
}
9 changes: 1 addition & 8 deletions Controller/Tpay/Success.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,27 +6,20 @@

use Magento\Framework\App\ActionInterface;
use Magento\Framework\Controller\ResultInterface;
use Magento\Framework\Message\ManagerInterface;
use Tpay\Magento2\Service\RedirectHandler;

class Success implements ActionInterface
{
/** @var ManagerInterface */
private $messageManager;

/** @var RedirectHandler */
private $redirectFactory;

public function __construct(ManagerInterface $messageManager, RedirectHandler $redirectFactory)
public function __construct(RedirectHandler $redirectFactory)
{
$this->messageManager = $messageManager;
$this->redirectFactory = $redirectFactory;
}

public function execute(): ResultInterface
{
$this->messageManager->addSuccessMessage(__('Thank you for your payment!'));

return $this->redirectFactory->redirectCheckoutSuccess();
}
}
23 changes: 12 additions & 11 deletions Model/ApiFacade/OpenApi.php
Original file line number Diff line number Diff line change
Expand Up @@ -102,9 +102,7 @@ public function blik(string $transactionId, array $blikPaymentData): array
$additional_payment_data['blikPaymentData']['aliases'] = $blikPaymentData['aliases'];
}

$result = $this->tpayApi->transactions()->createInstantPaymentByTransactionId($additional_payment_data, $transactionId);

return $this->waitForBlikAccept($result);
return $this->tpayApi->transactions()->createInstantPaymentByTransactionId($additional_payment_data, $transactionId);
}

public function blikAlias(string $transactionId, array $aliases): array
Expand All @@ -118,9 +116,7 @@ public function blikAlias(string $transactionId, array $aliases): array
],
];

$result = $this->tpayApi->transactions()->createInstantPaymentByTransactionId($additional_payment_data, $transactionId);

return $this->waitForBlikAccept($result);
return $this->tpayApi->transactions()->createInstantPaymentByTransactionId($additional_payment_data, $transactionId);
}

public function createBlikZero(array $data): array
Expand Down Expand Up @@ -211,13 +207,18 @@ public function cancel(string $transactionId)
$this->tpayApi->transactions()->cancelTransaction($transactionId);
}

public function getStatus(string $paymentId): ?array
{
return $this->tpayApi->transactions()->getTransactionById($paymentId);
}

private function handleDataStructure(array $data): array
{
$paymentData = [
'amount' => $data['amount'],
'description' => $data['description'],
'hiddenDescription' => $data['crc'],
'lang' => strstr($data['language'], '_', true) ? strstr($data['language'], '_', true) : $data['language'],
'lang' => strstr($data['language'], '_', true) ?: $data['language'],
'payer' => [
'email' => $data['email'],
'name' => $data['name'],
Expand All @@ -236,27 +237,27 @@ private function handleDataStructure(array $data): array
],
];

if ($data['group'] && $data['channel']) {
if (!empty($data['group']) && !empty($data['channel'])) {
throw OpenApiException::channelAndGroupCollision();
}

if ($data['group']) {
if (!empty($data['group'])) {
$paymentData['pay']['groupId'] = $data['group'];

if (self::VM_GROUP === $data['group']) {
unset($paymentData['payer']['phone']);
}
}

if ($data['channel']) {
if (!empty($data['channel'])) {
$paymentData['pay']['channelId'] = $data['channel'];

if (self::VM_CHANNEL === $data['channel']) {
unset($paymentData['payer']['phone']);
}
}

if ($data['tax_id']) {
if (!empty($data['tax_id'])) {
$paymentData['payer']['taxId'] = $data['tax_id'];
}

Expand Down
4 changes: 4 additions & 0 deletions Model/ApiFacade/Refund/RefundApiFacade.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
namespace Tpay\Magento2\Model\ApiFacade\Refund;

use Magento\Payment\Model\InfoInterface;
use Tpay\Magento2\Model\ApiFacade\OpenApi;
use Tpay\Magento2\Model\ApiFacade\OpenApiFactory;

class RefundApiFacade
Expand All @@ -28,16 +29,19 @@ public function makeRefund(InfoInterface $payment, float $amount)
$storeId = $payment->getOrder()->getStoreId();
if (false !== strpos($payment->getLastTransId(), '-')) {
if ($payment->getAdditionalInformation('transaction_id')) {
/** @var OpenApi $openApi */
$openApi = $this->openApi->create(['storeId' => $storeId]);

return $openApi->makeRefund($payment, $amount);
}

/** @var RefundOriginApi $originApi */
$originApi = $this->originApi->create(['storeId' => $storeId]);

return $originApi->makeRefund($payment, $amount);
}

/** @var RefundCardOriginApi $refundOriginApi */
$refundOriginApi = $this->refundOriginApi->create(['storeId' => $storeId]);

return $refundOriginApi->makeCardRefund($payment, $amount);
Expand Down
Loading