Skip to content

Commit 5db817a

Browse files
Release/v2.1.0 (#23)
* PLUG-115: Show description in checkout * PLUG-132: On failure, redirect users back to checkout * Make polling for payment status more aggressive --------- Co-authored-by: Artyom Jaksov <[email protected]>
1 parent 05d3ae7 commit 5db817a

File tree

21 files changed

+241
-53
lines changed

21 files changed

+241
-53
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,5 @@
22
.idea
33
*.zip
44
.DS_Store
5+
docker
6+
.vscode

Api/Config/System/SettingInterface.php

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ interface SettingInterface
2323
public const XML_PATH_PAYMENT_PAGE_PRIMARY_COLOR = 'payment/truelayer/payment_page_primary_color';
2424
public const XML_PATH_PAYMENT_PAGE_SECONDARY_COLOR = 'payment/truelayer/payment_page_secondary_color';
2525
public const XML_PATH_PAYMENT_PAGE_TERTIARY_COLOR = 'payment/truelayer/payment_page_tertiary_color';
26+
public const XML_PATH_DESCRIPTION = 'payment/truelayer/description';
27+
public const XML_PATH_SHOW_DESCRIPTION = 'payment/truelayer/show_description';
2628

2729
/**
2830
* Get minimum allowed order total
@@ -80,4 +82,18 @@ public function sendInvoiceEmail(): bool;
8082
* @return bool
8183
*/
8284
public function sendOrderEmail(): bool;
85+
86+
/**
87+
* Get payment method description
88+
*
89+
* @return string|null
90+
*/
91+
public function getDescription(): ?string;
92+
93+
/**
94+
* Get show description of payment method during checkout flag
95+
*
96+
* @return bool
97+
*/
98+
public function getShowDescription(): bool;
8399
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
<?php
2+
3+
/**
4+
* Copyright © TrueLayer Ltd. All rights reserved.
5+
* See COPYING.txt for license details.
6+
*/
7+
8+
declare(strict_types=1);
9+
10+
namespace TrueLayer\Connect\Block\Checkout;
11+
12+
use Magento\Framework\View\Element\Template;
13+
use Magento\Framework\View\Element\Template\Context;
14+
use TrueLayer\Connect\Service\Order\PaymentErrorMessageManager;
15+
16+
class PaymentErrorMessage extends Template
17+
{
18+
private PaymentErrorMessageManager $manager;
19+
20+
/**
21+
* @param Context $context
22+
* @param PaymentErrorMessageManager $manager
23+
*/
24+
public function __construct(Context $context, PaymentErrorMessageManager $manager)
25+
{
26+
parent::__construct($context);
27+
$this->manager = $manager;
28+
}
29+
30+
/**
31+
* @return string|null
32+
*/
33+
public function getMessage(): ?string
34+
{
35+
$message = $this->manager->getMessage();
36+
37+
if ($message) {
38+
return $message->getData()['text'] ?: null;
39+
}
40+
41+
return null;
42+
}
43+
}

CHANGELOG.md

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,21 @@ All notable changes to this project will be documented in this file.
55
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres
66
to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
77

8+
## [v2.1.0] - 2024-07-17
9+
10+
### Added
11+
12+
- New option to hide or show payment method description
13+
14+
### Changed
15+
16+
- Improved UX for failed or canceled payments by redirecting users back to the checkout billing step
17+
- More aggressive payment status checking on user return flow
18+
19+
### Fixed
20+
21+
- Payment method description not rendering on checkout page
22+
823
## [v2.0.0] - 2024-06-19
924

1025
### Added
@@ -61,4 +76,4 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6176
### Changed
6277

6378
- Wait for payment status updates on customer checkout
64-
- Admin panel improvements and fixes
79+
- Admin panel improvements and fixes

Controller/Checkout/Status.php

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232

3333
class Status extends BaseController implements HttpPostActionInterface
3434
{
35-
private const CHECK_API_AFTER_ATTEMPTS = 7;
35+
private const CHECK_API_AFTER_ATTEMPTS = 25;
3636

3737
private Session $session;
3838
private OrderRepositoryInterface $orderRepository;
@@ -124,7 +124,7 @@ private function getFinalPaymentStatusResponse(string $paymentId): ?ResultInterf
124124
$errorText = PaymentFailureReasonHelper::getHumanReadableLabel($transaction->getFailureReason());
125125
$this->paymentErrorMessageManager->addMessage($errorText . ' ' . __('Please try again.'));
126126

127-
return $this->urlResponse('checkout/cart');
127+
return $this->urlResponse('checkout/#payment');
128128
}
129129

130130
return null;
@@ -184,8 +184,8 @@ private function shouldCheckTLApi(): bool
184184
private function noPaymentFoundResponse(): ResultInterface
185185
{
186186
$this->logger->error('Could not load TL payment');
187-
$this->context->getMessageManager()->addErrorMessage(__('No payment found'));
188-
return $this->urlResponse('checkout/cart');
187+
$this->paymentErrorMessageManager->addMessage((string) __('No payment found'));
188+
return $this->urlResponse('checkout/#payment');
189189
}
190190

191191
/**

Helper/PaymentFailureReasonHelper.php

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,18 @@ class PaymentFailureReasonHelper
1414
public static function getHumanReadableLabel(string $reason = null): Phrase
1515
{
1616
switch ($reason) {
17-
case 'cancelled':
17+
case 'canceled':
1818
return __('You cancelled the payment.');
1919
case 'expired':
2020
return __('Payment has expired.');
2121
case 'not_authorized':
2222
return __('Payment was not authorized.');
23+
case 'authorization_failed':
24+
return __('Payment authorisation failed.');
2325
case 'provider_error':
2426
return __('Your provider has encountered an error.');
27+
case 'provider_rejected':
28+
return __('Your provider rejected the payment.');
2529
default:
2630
return __("Payment failed.");
2731
}

Model/Config/System/SettingsRepository.php

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,4 +82,20 @@ public function sendOrderEmail(): bool
8282
{
8383
return $this->isSetFlag(self::XML_PATH_SEND_ORDER_EMAIL);
8484
}
85+
86+
/**
87+
* @inheritDoc
88+
*/
89+
public function getDescription(): ?string
90+
{
91+
return $this->getStoreValue(self::XML_PATH_DESCRIPTION);
92+
}
93+
94+
/**
95+
* @inheritDoc
96+
*/
97+
public function getShowDescription(): bool
98+
{
99+
return $this->isSetFlag(self::XML_PATH_SHOW_DESCRIPTION);
100+
}
85101
}

Model/Ui/ConfigProvider.php

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,23 @@
88
namespace TrueLayer\Connect\Model\Ui;
99

1010
use Magento\Checkout\Model\ConfigProviderInterface;
11+
use TrueLayer\Connect\Model\Config\System\SettingsRepository;
1112

1213
/**
1314
* Payment Config Provider
1415
*/
1516
class ConfigProvider implements ConfigProviderInterface
1617
{
18+
/**
19+
* @var SettingsRepository
20+
*/
21+
private $settingsRepository;
22+
23+
public function __construct(
24+
SettingsRepository $settingsRepository
25+
) {
26+
$this->settingsRepository = $settingsRepository;
27+
}
1728
public const CODE = 'truelayer';
1829

1930
/**
@@ -23,9 +34,15 @@ class ConfigProvider implements ConfigProviderInterface
2334
*/
2435
public function getConfig(): array
2536
{
37+
$description = $this->settingsRepository->getShowDescription()
38+
? $this->settingsRepository->getDescription()
39+
: null;
40+
2641
return [
2742
'payment' => [
28-
self::CODE => []
43+
self::CODE => [
44+
'description' => $description
45+
]
2946
]
3047
];
3148
}

Service/Order/PaymentErrorMessageManager.php

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@ class PaymentErrorMessageManager
1414
{
1515
private ManagerInterface $messageManager;
1616

17+
public const MESSAGE_GROUP = 'truelayer_payment';
18+
public const MESSAGE_ID = 'truelayer_payment_error';
19+
1720
/**
1821
* @param ManagerInterface $messageManager
1922
*/
@@ -30,9 +33,33 @@ public function __construct(ManagerInterface $messageManager)
3033
public function addMessage(string $text): void
3134
{
3235
$message = $this->messageManager
33-
->createMessage(MessageInterface::TYPE_ERROR, 'truelayer_payment_error')
36+
->createMessage(MessageInterface::TYPE_ERROR, self::MESSAGE_ID)
3437
->setData(['text' => $text]);
3538

36-
$this->messageManager->addUniqueMessages([ $message ]);
39+
$this->messageManager->addUniqueMessages([ $message ], self::MESSAGE_GROUP);
40+
}
41+
42+
/**
43+
* @return MessageInterface|null
44+
*/
45+
public function getMessage(): ?MessageInterface
46+
{
47+
$message = $this->messageManager
48+
->getMessages(false, self::MESSAGE_GROUP)
49+
->getMessageByIdentifier(self::MESSAGE_ID);
50+
51+
$this->clearMessage();
52+
53+
return $message;
54+
}
55+
56+
public function clearMessage(): void
57+
{
58+
$messages = $this->messageManager->getMessages(true, self::MESSAGE_GROUP);
59+
$messages->deleteMessageByIdentifier(self::MESSAGE_ID);
60+
61+
if ($messages->getCount()) {
62+
$this->messageManager->addMessages($messages->getItems(), self::MESSAGE_GROUP);
63+
}
3764
}
3865
}

composer.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"name": "truelayer/magento2",
33
"description": "TrueLayer extension for Magento 2",
44
"type": "magento2-module",
5-
"version": "2.0.0",
5+
"version": "2.1.0",
66
"license": [
77
"OSL-3.0",
88
"AFL-3.0"

etc/adminhtml/system/settings.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,11 @@
1717
<label>Description</label>
1818
<config_path>payment/truelayer/description</config_path>
1919
</field>
20+
<field id="show_description" translate="label" type="select" sortOrder="12" showInDefault="1" showInWebsite="1" showInStore="1" canRestore="1">
21+
<label>Show Description During Checkout</label>
22+
<source_model>Magento\Config\Model\Config\Source\Yesno</source_model>
23+
<config_path>payment/truelayer/show_description</config_path>
24+
</field>
2025
<field id="heading_limits" translate="label comment" type="text" sortOrder="50" showInDefault="1" showInWebsite="1" showInStore="1">
2126
<label>Limits and Sort Order</label>
2227
<comment><![CDATA[TrueLayer will only work in the countries that you have originally signed up to with us. If you would like to know more about country availability, please reach out to your Sales rep.]]></comment>

etc/config.xml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,11 @@
1010
<default>
1111
<payment>
1212
<truelayer>
13-
<version>2.0.0</version>
13+
<version>2.1.0</version>
1414
<model>TrueLayerFacade</model>
1515
<title>TrueLayer</title>
16-
<description>Pay using TrueLayer</description>
16+
<description>Make a direct payment securely from your bank app - no card needed</description>
17+
<show_description>0</show_description>
1718
<active>0</active>
1819
<payment_action>authorize</payment_action>
1920
<can_use_checkout>1</can_use_checkout>

etc/frontend/di.xml

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,10 @@
11
<?xml version="1.0"?>
22
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
3-
<type name="Magento\Framework\View\Element\Message\MessageConfigurationsPool">
3+
<type name="Magento\Checkout\Model\CompositeConfigProvider">
44
<arguments>
5-
<argument name="configurationsMap" xsi:type="array">
6-
<item name="truelayer_payment_error" xsi:type="array">
7-
<item name="renderer" xsi:type="const">\Magento\Framework\View\Element\Message\Renderer\BlockRenderer::CODE</item>
8-
<item name="data" xsi:type="array">
9-
<item name="template" xsi:type="string">TrueLayer_Connect::checkout/payment_error_message.phtml</item>
10-
</item>
11-
</item>
5+
<argument name="configProviders" xsi:type="array">
6+
<item name="truelayer_payment_config_provider" xsi:type="object">TrueLayer\Connect\Model\Ui\ConfigProvider</item>
127
</argument>
138
</arguments>
149
</type>
15-
</config>
10+
</config>

view/frontend/layout/checkout_index_index.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@
1010
<css src="TrueLayer_Connect::css/styles.css"/>
1111
</head>
1212
<body>
13+
<referenceContainer name="content">
14+
<block class="TrueLayer\Connect\Block\Checkout\PaymentErrorMessage" name="truelayer_checkout_paymenterrormessage" template="TrueLayer_Connect::checkout/payment_error_message.phtml" />
15+
</referenceContainer>
1316
<referenceBlock name="checkout.root">
1417
<arguments>
1518
<argument name="jsLayout" xsi:type="array">
Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,28 @@
11
<?php
22

33
use Magento\Framework\Escaper;
4+
use TrueLayer\Connect\Block\Checkout\PaymentErrorMessage;
45

56
/**
67
* @var Escaper $escaper
8+
* @var PaymentErrorMessage $block
79
*/
8-
?>
910

10-
<span class="truelayer-payment-error">
11-
<?=$escaper->escapeHtml(__($block->getData('text')));?>
12-
</span>
11+
$message = $block->getMessage();
12+
$errorMessage = empty($message) ? 'null' : ('"'.$escaper->escapeHtml(__($message)).'"');
13+
?>
1314

1415
<script type="text/x-magento-init">
1516
{
16-
".truelayer-payment-error": {
17+
"*": {
1718
"Magento_Ui/js/core/app": {
1819
"components": {
19-
"truelayer-pending": {
20-
"component": "TrueLayer_Connect/js/cart_refresh"
20+
"truelayer-error-message": {
21+
"component": "TrueLayer_Connect/js/payment_error_message",
22+
"errorMessage": <?= $errorMessage ?>
2123
}
2224
}
2325
}
2426
}
2527
}
26-
</script>
28+
</script>

view/frontend/web/css/styles.css

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,3 +15,11 @@ input#truelayer:before {
1515
margin-top: -15px;
1616
margin-left: 25px;
1717
}
18+
19+
#truelayer-description {
20+
display: block;
21+
padding-left: 22px;
22+
padding-top: 10px;
23+
padding-bottom: 0px;
24+
margin-bottom: 0px;
25+
}

0 commit comments

Comments
 (0)