Skip to content

Commit e96d2d2

Browse files
committed
Refactor plugin, fix order id not saved in new magento versions, and added real_order_id to metadata
1 parent ceb0af1 commit e96d2d2

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

44 files changed

+1072
-1235
lines changed

Moyasar/Mysr/Console/Command/CheckPendingPaymentsCommand.php renamed to Moyasar/Mysr/Console/Command/CheckPending.php

Lines changed: 68 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,24 @@
33
namespace Moyasar\Mysr\Console\Command;
44

55
use DateTime;
6+
use Exception;
67
use Magento\Framework\Api\SearchCriteriaBuilder;
78
use Magento\Framework\App\Cache\Frontend\Pool;
89
use Magento\Framework\App\ObjectManager;
910
use Magento\Sales\Model\Order;
1011
use Magento\Sales\Model\OrderRepository;
12+
use Moyasar\Mysr\Helper\Http\Exceptions\HttpException;
13+
use Moyasar\Mysr\Helper\Http\QuickHttp;
1114
use Moyasar\Mysr\Helper\MoyasarHelper;
15+
use Moyasar\Mysr\Model\Payment\MoyasarPayments;
1216
use Psr\Log\LoggerInterface;
1317
use Symfony\Component\Console\Command\Command;
1418
use Symfony\Component\Console\Input\ArgvInput;
1519
use Symfony\Component\Console\Input\InputInterface;
1620
use Symfony\Component\Console\Output\ConsoleOutput;
1721
use Symfony\Component\Console\Output\OutputInterface;
1822

19-
class CheckPendingPaymentsCommand extends Command
23+
class CheckPending extends Command
2024
{
2125
/**
2226
* @var InputInterface
@@ -48,6 +52,11 @@ class CheckPendingPaymentsCommand extends Command
4852
*/
4953
protected $logger;
5054

55+
/**
56+
* @var QuickHttp
57+
*/
58+
protected $http;
59+
5160
public function __construct()
5261
{
5362
parent::__construct('moyasar:payment:process');
@@ -75,6 +84,7 @@ protected function initServices()
7584
$this->moyasarHelper = $objectManager->get(MoyasarHelper::class);
7685
$this->cachePool = $objectManager->get(Pool::class);
7786
$this->logger = $objectManager->get(LoggerInterface::class);
87+
$this->http = new QuickHttp();
7888
}
7989

8090
/**
@@ -88,6 +98,10 @@ protected function execute(InputInterface $input, OutputInterface $output)
8898
$orders = $this->getPendingOrders();
8999

90100
foreach ($orders as $order) {
101+
if ($order->getPayment()->getMethod() != MoyasarPayments::CODE) {
102+
continue;
103+
}
104+
91105
$this->process($order);
92106
}
93107

@@ -99,14 +113,6 @@ protected function execute(InputInterface $input, OutputInterface $output)
99113
*/
100114
private function process($order)
101115
{
102-
if (
103-
$order->getState() != Order::STATE_NEW &&
104-
$order->getState() != Order::STATE_PENDING_PAYMENT &&
105-
$order->getState() != Order::STATE_PAYMENT_REVIEW
106-
) {
107-
return;
108-
}
109-
110116
$cacheKey = 'moyasar-order-checked-' . $order->getId();
111117

112118
// If already checked within the last 5 minutes, skip
@@ -126,21 +132,50 @@ private function process($order)
126132
*/
127133
private function processPayment($order)
128134
{
129-
$payment = $order->getPayment();
135+
$this->logger->info("Processing pending order " . $order->getIncrementId());
130136

131-
if (is_null($payment)) {
137+
$orderPayment = $order->getPayment();
138+
$paymentId = $orderPayment->getLastTransId();
139+
if (! $paymentId) {
140+
$this->logger->warning("Cannot find payment ID for order " . $order->getIncrementId());
132141
return;
133142
}
134143

135-
$additionalInfo = $payment->getAdditionalInformation();
144+
try {
145+
$this->logger->info("Fetching Moyasar payment $paymentId...");
136146

137-
if (! isset($additionalInfo['moyasar_payment_id'])) {
138-
return;
139-
}
147+
$payment = $this->http
148+
->basic_auth($this->moyasarHelper->secretApiKey())
149+
->get($this->moyasarHelper->apiBaseUrl("/v1/payments/$paymentId"))
150+
->json();
151+
152+
$this->logger->info("Fetched payment $paymentId.");
153+
154+
if ($payment['status'] != 'paid') {
155+
$message = __('Payment failed');
156+
if ($sourceMessage = $payment['source']['message']) {
157+
$message .= ': ' . $sourceMessage;
158+
}
140159

141-
$moyasarPaymentId = $additionalInfo['moyasar_payment_id'];
160+
return $this->processFailedPayment($payment, $order, [$message]);
161+
}
142162

143-
$this->moyasarHelper->verifyAndProcess($order, $moyasarPaymentId, null);
163+
$errors = $this->moyasarHelper->checkPaymentForErrors($order, $payment);
164+
if (count($errors) > 0) {
165+
array_unshift($errors, 'Un-matching payment details ' . $payment['id']);
166+
return $this->processFailedPayment($payment, $order, $errors);
167+
}
168+
169+
$order->addCommentToStatusHistory('Order was canceled automatically by cron jobs.');
170+
$this->moyasarHelper->processSuccessfulOrder($order, $payment);
171+
172+
$this->logger->info("Processed order " . $order->getIncrementId());
173+
} catch (HttpException $e) {
174+
$this->logger->error($e);
175+
$this->logger->info($e->response->body());
176+
} catch (Exception $e) {
177+
$this->logger->error($e);
178+
}
144179
}
145180

146181
private function criteriaBuilder()
@@ -154,35 +189,33 @@ private function getPendingOrders()
154189
$dateStart->modify('-5 day');
155190

156191
$dateEnd = new DateTime();
157-
$dateEnd->modify('-2 minute');
158-
159-
$search = $this->criteriaBuilder()
160-
->addFilter('state', Order::STATE_NEW)
161-
->addFilter('created_at', $dateStart->format('Y-m-d H:i:s'), 'gteq')
162-
->addFilter('created_at', $dateEnd->format('Y-m-d H:i:s'), 'lteq')
163-
->create();
192+
$dateEnd->modify('-15 minute');
164193

165194
$pendingPaymentSearch = $this->criteriaBuilder()
166195
->addFilter('state', Order::STATE_PENDING_PAYMENT)
167196
->addFilter('created_at', $dateStart->format('Y-m-d H:i:s'), 'gteq')
168197
->addFilter('created_at', $dateEnd->format('Y-m-d H:i:s'), 'lteq')
169198
->create();
170199

171-
$reviewPaymentSearch = $this->criteriaBuilder()
172-
->addFilter('state', Order::STATE_PAYMENT_REVIEW)
173-
->addFilter('created_at', $dateStart->format('Y-m-d H:i:s'), 'gteq')
174-
->addFilter('created_at', $dateEnd->format('Y-m-d H:i:s'), 'lteq')
175-
->create();
176-
177-
return array_merge(
178-
$this->orderRepository->getList($search)->getItems(),
179-
$this->orderRepository->getList($pendingPaymentSearch)->getItems(),
180-
$this->orderRepository->getList($reviewPaymentSearch)->getItems()
181-
);
200+
return $this->orderRepository->getList($pendingPaymentSearch)->getItems();
182201
}
183202

184203
private function cache()
185204
{
186205
return $this->cachePool->current();
187206
}
207+
208+
/**
209+
* @param array $payment
210+
* @param Order $order
211+
* @param array $errors
212+
* @return mixed
213+
*/
214+
private function processFailedPayment($payment, $order, $errors)
215+
{
216+
$order->registerCancellation(implode("\n", $errors));
217+
$order->getPayment()->setLastTransId($payment['id']);
218+
$order->addCommentToStatusHistory('Order was canceled automatically by cron jobs.');
219+
$order->save();
220+
}
188221
}

Moyasar/Mysr/Controller/Order/Cancel.php

Lines changed: 17 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
use Magento\Checkout\Model\Session;
66
use Magento\Framework\App\Action\Context;
77
use Magento\Framework\App\Action\HttpPostActionInterface;
8+
use Magento\Framework\Controller\ResultFactory;
89
use Magento\Framework\UrlInterface;
910
use Moyasar\Mysr\Controller\ReadsJson;
1011
use Moyasar\Mysr\Helper\MoyasarHelper;
@@ -43,36 +44,34 @@ public function __construct(Context $context, Session $checkout, MoyasarHelper $
4344

4445
public function execute()
4546
{
46-
$response = $this->context->getResponse();
47-
4847
$order = $this->checkout->getLastRealOrder();
4948
if (!$order || !$order->getId()) {
50-
$response->setStatusCode(400);
51-
$response->representJson(json_encode([
52-
'message' => 'No order available'
53-
]));
54-
55-
return $response;
49+
return $this->context
50+
->getResultFactory()
51+
->create(ResultFactory::TYPE_RAW)
52+
->setHttpResponseCode(200);
5653
}
5754

5855
$paymentId = $this->getJson('payment_id');
5956
$errors = $this->getJson('errors', []);
6057
$errorMsg = is_null($paymentId) ?
61-
'Payment Attempt Failed, and Order have been canceled.' :
62-
'Payment ' . $paymentId . ' failed and order has been canceled.';
58+
__('Payment Attempt Failed, and Order have been canceled.') :
59+
__('Payment %payment_id failed and order has been canceled', ['payment_id' => $paymentId]);
6360

6461
foreach ($errors as $error) {
6562
$order->addCommentToStatusHistory($error);
6663
}
6764

68-
$this->moyasarHelper->cancelCurrentOrder($order, $errorMsg);
6965
$this->checkout->restoreQuote();
70-
71-
$response->representJson(json_encode([
72-
'message' => 'Order canceled',
73-
'redirect_to' => $this->url->getUrl('checkout/cart')
74-
]));
75-
76-
return $response;
66+
$order->registerCancellation($errorMsg);
67+
$order->save();
68+
69+
return $this->context
70+
->getResultFactory()
71+
->create(ResultFactory::TYPE_JSON)
72+
->setData([
73+
'message' => __('Order canceled'),
74+
'redirect_to' => $this->url->getUrl('checkout/cart')
75+
]);
7776
}
7877
}

Moyasar/Mysr/Controller/Order/Data.php

Lines changed: 38 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,37 +3,59 @@
33
namespace Moyasar\Mysr\Controller\Order;
44

55
use Magento\Checkout\Model\Session;
6-
use Magento\Framework\App\Action\Action;
76
use Magento\Framework\App\Action\Context;
8-
use Magento\Sales\Model\Order;
7+
use Magento\Framework\App\ActionInterface;
98
use Magento\Framework\Controller\ResultFactory;
9+
use Magento\Sales\Api\Data\OrderAddressInterface;
1010

11-
class Data extends Action
11+
class Data implements ActionInterface
1212
{
13+
private $context;
1314
protected $checkoutSession;
1415

1516
public function __construct(Context $context, Session $checkoutSession)
1617
{
17-
parent::__construct($context);
18+
$this->context = $context;
1819
$this->checkoutSession = $checkoutSession;
1920
}
2021

2122
public function execute()
2223
{
23-
$order = $this->currentOrder();
24-
25-
$orderId = $order->getIncrementId();
26-
$total = $order->getBaseGrandTotal();
27-
28-
return $this->resultFactory->create(ResultFactory::TYPE_JSON)
29-
->setData([
30-
'orderId' => $orderId,
31-
'total' => $total,
32-
]);
24+
$order = $this->checkoutSession->getLastRealOrder();
25+
$data = [
26+
'order_id' => $order->getId(),
27+
'real_order_id' => $order->getRealOrderId(),
28+
];
29+
30+
if ($address = $order->getShippingAddress()) {
31+
$data = array_merge($data, $this->mapAddress($address));
32+
}
33+
34+
return $this->context
35+
->getResultFactory()
36+
->create(ResultFactory::TYPE_JSON)
37+
->setData($data);
3338
}
3439

35-
protected function currentOrder()
40+
private function mapAddress(OrderAddressInterface $address)
3641
{
37-
return $this->checkoutSession->getLastRealOrder();
42+
$keys = [
43+
OrderAddressInterface::FIRSTNAME,
44+
OrderAddressInterface::MIDDLENAME,
45+
OrderAddressInterface::LASTNAME,
46+
OrderAddressInterface::STREET,
47+
OrderAddressInterface::CITY,
48+
OrderAddressInterface::REGION,
49+
OrderAddressInterface::POSTCODE,
50+
OrderAddressInterface::EMAIL,
51+
OrderAddressInterface::TELEPHONE,
52+
OrderAddressInterface::COMPANY,
53+
];
54+
55+
$prefix = $address->getAddressType();
56+
57+
return array_merge(...array_map(function ($key) use ($address, $prefix) {
58+
return [$prefix . "_" . $key => $address->getData($key)];
59+
}, $keys));
3860
}
3961
}

0 commit comments

Comments
 (0)