Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

BP-3649 refactor return url and add cancel and failed url #24

Open
wants to merge 7 commits into
base: develop
Choose a base branch
from
Open
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
25 changes: 25 additions & 0 deletions Model/AdditionalDataProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@

namespace Buckaroo\Magento2Graphql\Model;

use Buckaroo\Magento2\Gateway\Http\TransactionBuilder\AbstractTransactionBuilder;
use Buckaroo\Magento2Graphql\Plugin\AdditionalDataProviderPool;
use Buckaroo\Magento2Graphql\Model\Payment\Method\ConfigFactory;
use Magento\QuoteGraphQl\Model\Cart\Payment\AdditionalDataProviderInterface;
Expand Down Expand Up @@ -59,4 +60,28 @@ public function getData(array $args): array

return $args;
}

/**
* @param AdditionalDataProvider $subject
* @param array $result
* @param array $args
* @return array
* @suppressWarnings(PHPMD.UnusedFormalParameter)
*/
public function afterGetData(AdditionalDataProvider $subject, array $result, array $args): array
{
if (isset($args['buckaroo_additional']['return_url'])) {
$result[AbstractTransactionBuilder::ADDITIONAL_RETURN_URL] = $args['buckaroo_additional']['return_url'];
}
if (isset($args['buckaroo_additional']['cancel_url'])) {
$result[AbstractTransactionBuilder::ADDITIONAL_CANCEL_URL] = $args['buckaroo_additional']['cancel_url'];
}
if (isset($args['buckaroo_additional']['error_url'])) {
$result[AbstractTransactionBuilder::ADDITIONAL_ERROR_URL] = $args['buckaroo_additional']['error_url'];
}
if (isset($args['buckaroo_additional']['reject_url'])) {
$result[AbstractTransactionBuilder::ADDITIONAL_REJECT_URL] = $args['buckaroo_additional']['reject_url'];
}
return $result;
}
}
54 changes: 54 additions & 0 deletions Model/Payment/Method/AbstractMethodPlugin.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
<?php

namespace Buckaroo\Magento2Graphql\Model\Payment\Method;

use Buckaroo\Magento2\Model\Method\AbstractMethod;
use Magento\Framework\DataObject;
use Magento\Framework\Exception\LocalizedException;

class AbstractMethodPlugin
{
/**
* @param AbstractMethod $subject
* @param AbstractMethod $result
* @param DataObject|array $data
* @return AbstractMethod
* @throws LocalizedException
*/
public function afterAssignData(
AbstractMethod $subject,
AbstractMethod $result,
DataObject|array $data
): AbstractMethod {
if (!$data instanceof DataObject) {
return $result;
}
$additionalSkip = $data->getAdditionalData();

if (isset($additionalSkip['buckaroo_return_url'])) {
$subject->getInfoInstance()->setAdditionalInformation(
'buckaroo_return_url',
$additionalSkip['buckaroo_return_url']
);
}
if (isset($additionalSkip['buckaroo_cancel_url'])) {
$subject->getInfoInstance()->setAdditionalInformation(
'buckaroo_cancel_url',
$additionalSkip['buckaroo_cancel_url']
);
}
if (isset($additionalSkip['buckaroo_error_url'])) {
$subject->getInfoInstance()->setAdditionalInformation(
'buckaroo_error_url',
$additionalSkip['buckaroo_error_url']
);
}
if (isset($additionalSkip['buckaroo_reject_url'])) {
$subject->getInfoInstance()->setAdditionalInformation(
'buckaroo_reject_url',
$additionalSkip['buckaroo_reject_url']
);
}
return $result;
}
}
27 changes: 27 additions & 0 deletions Model/Payment/Method/Config/ReturnUrl.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
<?php

namespace Buckaroo\Magento2Graphql\Model\Payment\Method\Config;

class ReturnUrl
{
protected $returnUrl;

public function __construct(\Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig)
{
// Fetch the return URL from system configuration, or set a default value.
$this->returnUrl = $scopeConfig->getValue(
'payment/buckaroo/return_url',
\Magento\Store\Model\ScopeInterface::SCOPE_STORE
);

// Or you can set a default URL if not configured
if (!$this->returnUrl) {
$this->returnUrl = "https://default-return-url.com";
}
}

public function getReturnUrl()
{
return $this->returnUrl;
}
}
2 changes: 1 addition & 1 deletion Plugin/FixSession.php
Original file line number Diff line number Diff line change
Expand Up @@ -63,4 +63,4 @@ public function beforeSetPublicCookie(
}
return [$name, $value, $metadata];
}
}
}
185 changes: 185 additions & 0 deletions Plugin/OrderTransactionBuilderPlugin.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,185 @@
<?php

namespace Buckaroo\Magento2Graphql\Plugin;

use Buckaroo\Magento2\Gateway\Http\TransactionBuilder\AbstractTransactionBuilder;
use Buckaroo\Magento2\Gateway\Http\TransactionBuilder\Order as OrderTransactionBuilder;
use Buckaroo\Magento2\Model\ConfigProvider\Account;
use Buckaroo\Magento2\Model\ConfigProvider\Factory;
use Exception;
use Magento\Framework\App\Config\ScopeConfigInterface;

class OrderTransactionBuilderPlugin
{
public const DEFAULT_REDIRECT_PATH = 'checkout/onepage/succes/';

public function __construct(
private readonly Factory $configProviderFactory,
private readonly ScopeConfigInterface $scopeConfig
) {
}

/**
* Overwrite the return url to include the order_id and maskedId,
* There is an issue with `setReturnUrl` mutation not working, and we don't want to do extra mutations anyway.
*
* @param OrderTransactionBuilder $subject
* @param string $result
* @return string
* @throws Exception
* @suppressWarnings(PHPMD.UnusedFormalParameter)
*/
public function afterGetReturnUrl(
OrderTransactionBuilder $subject,
string $result
): string {
$returnUrl = $this->getReturnUrl($subject);
return $returnUrl . '?' . http_build_query([
'orderId' => $subject->getOrder()->getIncrementId(),
]);
}

/**
* When a specific returnURl is set on the payment, use that one.
* Otherwise, use the default return url.
*
* @param OrderTransactionBuilder $subject
* @return string
*/
protected function getReturnUrl(OrderTransactionBuilder $subject): string
{
$payment = $subject->getOrder()->getPayment();
$additionalInfo = $payment->getAdditionalInformation();
if (isset($additionalInfo[AbstractTransactionBuilder::ADDITIONAL_RETURN_URL])) {
return $additionalInfo[AbstractTransactionBuilder::ADDITIONAL_RETURN_URL];
}

return $this->getDefaultUrl();

}
/**
* Overwrite the return url to include the order_id and maskedId,
* There is an issue with `setReturnUrl` mutation not working, and we don't want to do extra mutations anyway.
*
* @param OrderTransactionBuilder $subject
* @param string $result
* @return string
* @throws Exception
* @suppressWarnings(PHPMD.UnusedFormalParameter)
*/
public function afterGetCancelUrl(
OrderTransactionBuilder $subject,
string $result
): string {
$cancelUrl = $this->getCancelUrl($subject);
return $cancelUrl . '?' . http_build_query([
'orderId' => $subject->getOrder()->getIncrementId(),
]);
}

/**
* When a specific returnURl is set on the payment, use that one.
* Otherwise, use the default return url.
*
* @param OrderTransactionBuilder $subject
* @return string
*/
protected function getCancelUrl(OrderTransactionBuilder $subject): string
{
$payment = $subject->getOrder()->getPayment();
$additionalInfo = $payment->getAdditionalInformation();
if (isset($additionalInfo[AbstractTransactionBuilder::ADDITIONAL_CANCEL_URL])) {
return $additionalInfo[AbstractTransactionBuilder::ADDITIONAL_CANCEL_URL];
}

return $this->getDefaultUrl();
}

/**
* Overwrite the return url to include the order_id and maskedId,
* There is an issue with `setReturnUrl` mutation not working, and we don't want to do extra mutations anyway.
*
* @param OrderTransactionBuilder $subject
* @param string $result
* @return string
* @throws Exception
* @suppressWarnings(PHPMD.UnusedFormalParameter)
*/
public function afterGetErrorUrl(
OrderTransactionBuilder $subject,
string $result
): string {
$errorUrl = $this->getErrorUrl($subject);
return $errorUrl . '?' . http_build_query([
'orderId' => $subject->getOrder()->getIncrementId(),
]);
}

/**
* When a specific returnURl is set on the payment, use that one.
* Otherwise, use the default return url.
*
* @param OrderTransactionBuilder $subject
* @return string
*/
protected function getErrorUrl(OrderTransactionBuilder $subject): string
{
$payment = $subject->getOrder()->getPayment();
$additionalInfo = $payment->getAdditionalInformation();
if (isset($additionalInfo[AbstractTransactionBuilder::ADDITIONAL_ERROR_URL])) {
return $additionalInfo[AbstractTransactionBuilder::ADDITIONAL_ERROR_URL];
}

return $this->getDefaultUrl();
}

/**
* Overwrite the return url to include the order_id and maskedId,
* There is an issue with `setReturnUrl` mutation not working, and we don't want to do extra mutations anyway.
*
* @param OrderTransactionBuilder $subject
* @param string $result
* @return string
* @throws Exception
* @suppressWarnings(PHPMD.UnusedFormalParameter)
*/
public function afterGetRejectUrl(
OrderTransactionBuilder $subject,
string $result
): string {
$rejectUrl = $this->getRejectUrl($subject);
return $rejectUrl . '?' . http_build_query([
'orderId' => $subject->getOrder()->getIncrementId(),
]);
}

/**
* When a specific returnURl is set on the payment, use that one.
* Otherwise, use the default return url.
*
* @param OrderTransactionBuilder $subject
* @return string
*/
protected function getRejectUrl(OrderTransactionBuilder $subject): string
{
$payment = $subject->getOrder()->getPayment();
$additionalInfo = $payment->getAdditionalInformation();
if (isset($additionalInfo[AbstractTransactionBuilder::ADDITIONAL_REJECT_URL])) {
return $additionalInfo[AbstractTransactionBuilder::ADDITIONAL_REJECT_URL];
}

return $this->getDefaultUrl();
}

protected function getDefaultUrl(){
$returnUrl = $this->scopeConfig->getValue('web/secure/frontend_base_link_url');
try {
/** @var Account $accountConfig */
$accountConfig = $this->configProviderFactory->get('account');
$returnUrl .= $accountConfig->getSuccessRedirect();
} catch (Exception $e) {
$returnUrl .= self::DEFAULT_REDIRECT_PATH;
}
return $returnUrl;
}
}
Loading