app/Plugin/np42/AlreadyOrderCheckByShippingEvent.php line 53

Open in your IDE?
  1. <?php
  2. namespace Plugin\np42;
  3. use Eccube\Entity\Master\OrderStatus;
  4. use Eccube\Entity\Order;
  5. use Eccube\Entity\Payment;
  6. use Eccube\Repository\OrderRepository;
  7. use Eccube\Service\CartService;
  8. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  9. use Symfony\Component\HttpFoundation\RedirectResponse;
  10. use Symfony\Component\HttpKernel\Event\RequestEvent;
  11. use Symfony\Component\HttpKernel\HttpKernel;
  12. use Symfony\Component\HttpKernel\KernelEvents;
  13. use Symfony\Component\Routing\RouterInterface;
  14. /**
  15.  * Webhookからの購入済みチェックイベント
  16.  *
  17.  * 1.「NP後払いで支払う」ボタン押下後、すぐにブラウザタブを閉じる。(注文完了画面が表示される前に閉じる)
  18.  * 2.管理画面:Webhookで新規受付になる(正常)
  19.  * 3.フロントを開くと、カートに商品が入ったまま。
  20.  * 4.カートに進む
  21.  * 5.支払方法がatone(一番上)になっているので、NP後払いに変更。
  22.  * 6.そのまま再度購入が出来てしまう。
  23.  */
  24. class AlreadyOrderCheckByShippingEvent implements EventSubscriberInterface
  25. {
  26.     protected OrderRepository $orderRepository;
  27.     protected CartService $cartService;
  28.     protected RouterInterface $router;
  29.     public function __construct(
  30.         OrderRepository $orderRepository,
  31.         CartService $cartService,
  32.         RouterInterface $router
  33.     ) {
  34.         $this->orderRepository $orderRepository;
  35.         $this->cartService $cartService;
  36.         $this->router $router;
  37.     }
  38.     /**
  39.      * @return array<string, mixed> The event names to listen to
  40.      */
  41.     public static function getSubscribedEvents()
  42.     {
  43.         return [
  44.             KernelEvents::REQUEST => 'onKernelRequest',
  45.         ];
  46.     }
  47.     public function onKernelRequest(RequestEvent $event)
  48.     {
  49.         if ($event->getRequestType() !== HttpKernel::MAIN_REQUEST) {
  50.             return;
  51.         }
  52.         // 購入ページを対象とする
  53.         if ($event->getRequest()->get('_route') === 'cart_handle_item'
  54.             || $event->getRequest()->get('_route') === 'cart'
  55.             || $event->getRequest()->get('_route') === 'cart_buystep'
  56.             || $event->getRequest()->get('_route') === 'shopping_checkout'
  57.             || $event->getRequest()->get('_route') === 'shopping_confirm'
  58.             || $event->getRequest()->get('_route') === 'shopping')
  59.         {
  60.             // 受注データ取得
  61.             $Order $this->orderRepository->findOneBy([
  62.                 'pre_order_id' => $this->cartService->getPreOrderId(),
  63.             ]);
  64.             if (!($Order instanceof Order)) {
  65.                 return;
  66.             }
  67.             // NPの場合、受注チェック
  68.             if ($Order->getPayment() instanceof Payment
  69.                 && (preg_match('/^Plugin\\\np42\\\Service\\\Method\\\Atone/'$Order->getPayment()->getMethodClass())
  70.                     || preg_match('/^Plugin\\\np42\\\Service\\\Method\\\TsudoAtone/'$Order->getPayment()->getMethodClass())
  71.                     || preg_match('/^Plugin\\\np42\\\Service\\\Method\\\Np/'$Order->getPayment()->getMethodClass())
  72.                 )
  73.             ) {
  74.                 // 新規受付の場合
  75.                 if ($Order->getOrderStatus()->getId() == OrderStatus::NEW) {
  76.                     // 受注がすでに完了して、カートに残っている場合、カート削除してリダイレクト
  77.                     $this->cartService->clear();
  78.                     $url      $this->router->generate("cart");
  79.                     $response = new RedirectResponse($url);
  80.                     $event->setResponse($response);
  81.                 }
  82.                 // 決済処理中の場合は、購入処理中に戻し、ポイントを戻す
  83.                 if ($Order->getOrderStatus()->getId() == OrderStatus::PENDING) {
  84.                 }
  85.             }
  86.         }
  87.     }
  88. }