<?php
namespace Plugin\np42;
use Eccube\Entity\Master\OrderStatus;
use Eccube\Entity\Order;
use Eccube\Entity\Payment;
use Eccube\Repository\OrderRepository;
use Eccube\Service\CartService;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\HttpKernel\HttpKernel;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\Routing\RouterInterface;
/**
* Webhookからの購入済みチェックイベント
*
* 1.「NP後払いで支払う」ボタン押下後、すぐにブラウザタブを閉じる。(注文完了画面が表示される前に閉じる)
* 2.管理画面:Webhookで新規受付になる(正常)
* 3.フロントを開くと、カートに商品が入ったまま。
* 4.カートに進む
* 5.支払方法がatone(一番上)になっているので、NP後払いに変更。
* 6.そのまま再度購入が出来てしまう。
*/
class AlreadyOrderCheckByShippingEvent implements EventSubscriberInterface
{
protected OrderRepository $orderRepository;
protected CartService $cartService;
protected RouterInterface $router;
public function __construct(
OrderRepository $orderRepository,
CartService $cartService,
RouterInterface $router
) {
$this->orderRepository = $orderRepository;
$this->cartService = $cartService;
$this->router = $router;
}
/**
* @return array<string, mixed> The event names to listen to
*/
public static function getSubscribedEvents()
{
return [
KernelEvents::REQUEST => 'onKernelRequest',
];
}
public function onKernelRequest(RequestEvent $event)
{
if ($event->getRequestType() !== HttpKernel::MAIN_REQUEST) {
return;
}
// 購入ページを対象とする
if ($event->getRequest()->get('_route') === 'cart_handle_item'
|| $event->getRequest()->get('_route') === 'cart'
|| $event->getRequest()->get('_route') === 'cart_buystep'
|| $event->getRequest()->get('_route') === 'shopping_checkout'
|| $event->getRequest()->get('_route') === 'shopping_confirm'
|| $event->getRequest()->get('_route') === 'shopping')
{
// 受注データ取得
$Order = $this->orderRepository->findOneBy([
'pre_order_id' => $this->cartService->getPreOrderId(),
]);
if (!($Order instanceof Order)) {
return;
}
// NPの場合、受注チェック
if ($Order->getPayment() instanceof Payment
&& (preg_match('/^Plugin\\\np42\\\Service\\\Method\\\Atone/', $Order->getPayment()->getMethodClass())
|| preg_match('/^Plugin\\\np42\\\Service\\\Method\\\TsudoAtone/', $Order->getPayment()->getMethodClass())
|| preg_match('/^Plugin\\\np42\\\Service\\\Method\\\Np/', $Order->getPayment()->getMethodClass())
)
) {
// 新規受付の場合
if ($Order->getOrderStatus()->getId() == OrderStatus::NEW) {
// 受注がすでに完了して、カートに残っている場合、カート削除してリダイレクト
$this->cartService->clear();
$url = $this->router->generate("cart");
$response = new RedirectResponse($url);
$event->setResponse($response);
}
// 決済処理中の場合は、購入処理中に戻し、ポイントを戻す
if ($Order->getOrderStatus()->getId() == OrderStatus::PENDING) {
}
}
}
}
}