app/Plugin/PaygentPayment42/PaygentEvent.php line 98

Open in your IDE?
  1. <?php
  2. namespace Plugin\PaygentPayment42;
  3. use Eccube\Common\Constant;
  4. use Eccube\Event\EventArgs;
  5. use Eccube\Event\EccubeEvents;
  6. use Eccube\Event\TemplateEvent;
  7. use Eccube\Common\EccubeConfig;
  8. use Plugin\PaygentPayment42\Repository\ConfigRepository;
  9. use Plugin\PaygentPayment42\Service\PaymentAdminFactory;
  10. use Symfony\Component\DependencyInjection\ContainerInterface;
  11. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  12. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  13. use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
  14. use Symfony\Component\Security\Csrf\CsrfToken;
  15. class PaygentEvent implements EventSubscriberInterface
  16. {
  17.     /**
  18.      * @var EccubeConfig
  19.      */
  20.     protected $eccubeConfig;
  21.     /**
  22.      * @var ConfigRepository
  23.      */
  24.     protected $configRepository;
  25.     /**
  26.      * @var SessionInterface
  27.      */
  28.     protected $session;
  29.     /**
  30.      * @var PaymentAdminFactory
  31.      */
  32.     protected $paymentAdminFactory;
  33.     /**
  34.      * @var ContainerInterface
  35.      */
  36.     protected $container;
  37.     /**
  38.      * PaygentEvent
  39.      *
  40.      * @param eccubeConfig $eccubeConfig
  41.      * @param ConfigRepository $configRepository
  42.      * @param SessionInterface $session
  43.      * @param PaymentAdminFactory $paymentAdminFactory
  44.      * @param ContainerInterface $container
  45.      */
  46.     public function __construct(
  47.         EccubeConfig $eccubeConfig,
  48.         ConfigRepository $configRepository,
  49.         SessionInterface $session,
  50.         PaymentAdminFactory $paymentAdminFactory,
  51.         ContainerInterface $container
  52.     ) {
  53.         $this->eccubeConfig $eccubeConfig;
  54.         $this->configRepository $configRepository;
  55.         $this->session $session;
  56.         $this->paymentAdminFactory $paymentAdminFactory;
  57.         $this->container $container;
  58.     }
  59.     /**
  60.      * {@inheritdoc}
  61.      */
  62.     public static function getSubscribedEvents()
  63.     {
  64.         return [
  65.             'Shopping/index.twig' => 'index',
  66.             'Shopping/confirm.twig' => 'confirm',
  67.             '@admin/Order/edit.twig' => 'onAdminOrderEditTwig',
  68.             EccubeEvents::ADMIN_ORDER_EDIT_INDEX_INITIALIZE => 'onAdminOrderEditIndexInitialize',
  69.             'Shopping/complete.twig' => 'complete'
  70.         ];
  71.     }
  72.     public function index(TemplateEvent $event)
  73.     {
  74.         $payment $event->getParameter('Order')->getPayment();
  75.         $paymentMethod $payment->getMethodClass();
  76.         // リンク型クレジットカードが選択されている時のみ処理
  77.         if (preg_match('/^Plugin\\\PaygentPayment42\\\Service\\\Method\\\Credit/'$paymentMethod)) {
  78.             $parameters $event->getParameters();
  79.             $parameters['paygent_credit_payment_id'] = $payment->getId();
  80.             $event->setParameters($parameters);
  81.             $event->addSnippet('@PaygentPayment42/default/Shopping/select_payment.twig');
  82.         }
  83.     }
  84.     public function confirm(TemplateEvent $event)
  85.     {
  86.         $paymentMethod $event->getParameter('Order')->getPayment()->getMethodClass();
  87.         if (preg_match('/^Plugin\\\PaygentPayment42\\\Service\\\Method/'$paymentMethod)) {
  88.             $event->addSnippet('@PaygentPayment42/default/Shopping/confirm_button.twig');
  89.         }
  90.     }
  91.     public function onAdminOrderEditTwig(TemplateEvent $event)
  92.     {
  93.         $parameters $event->getParameters();
  94.         $order $parameters['Order'];
  95.         $paymentInstance $this->paymentAdminFactory->getInstance($order->getPaygentPaymentMethod());
  96.         if ($paymentInstance) {
  97.             $methodName $paymentInstance->getPaymentMethodName($order->getPaygentPaymentMethod());
  98.             if ($methodName) {
  99.                 $event->addSnippet('@PaygentPayment42/admin/Order/payment_order_edit.twig');
  100.     
  101.                 $parameters $event->getParameters();
  102.                 $parameters['paygentMethodName'] = $methodName;
  103.                 $parameters['paygentStatusName'] = $paymentInstance->getPaymentStatusName($order->getPaygentKind());
  104.                 $parameters['paygentError'] = $order->getPaygentError();
  105.                 $parameters['paygentFlags'] = $paymentInstance->getPaygentFlags($order);
  106.                 if ($this->session->get('paygent_payment.order_edit_on_click_payment_button')) {
  107.                     $parameters['paygentOnClickButton'] = true;
  108.                 }
  109.                 $message $this->session->get('paygent_payment.order_edit_message');
  110.     
  111.                 if (isset($message)) {
  112.                     $parameters['paygentMessage'] = $message;
  113.                     $this->session->remove('paygent_payment.order_edit_message');
  114.                 }
  115.     
  116.                 $event->setParameters($parameters);
  117.             }
  118.         }
  119.         $this->session->remove('paygent_payment.order_edit_on_click_payment_button');
  120.     }
  121.     public function onAdminOrderEditIndexInitialize(EventArgs $event)
  122.     {
  123.         $request $event->getRequest();
  124.         $paygentType $request->get('paygentType');
  125.         if ($request->getMethod() === 'POST' && $paygentType) {
  126.             $this->checkToken();
  127.             $this->session->set('paygent_payment.order_edit_on_click_payment_button'true);
  128.             $order $event->getArgument('TargetOrder');
  129.             $paymentInstance $this->paymentAdminFactory->getInstance($order->getPaygentPaymentMethod());
  130.             $paygentFlags $paymentInstance->getPaygentFlags($order);
  131.             // $paygentTypeのチェック
  132.             if ($this->checkPaymentType($paygentFlags$paygentType)) {
  133.                 // 通信処理
  134.                 $res $paymentInstance->process($paygentType$order->getId());
  135.         
  136.                 if ($res) {
  137.                     // 結果出力
  138.                     if ($res['return'] === true) {
  139.                         $message $res['type'] . "に成功しました。";
  140.                     } elseif (isset($res['response']) && $res['response'] != "") {
  141.                         $message $res['type'] . "に失敗しました。" $res['response'];
  142.                     } else {
  143.                         $message $res['type'] . "に失敗しました。";
  144.                     }
  145.                     $this->session->set('paygent_payment.order_edit_message'$message);
  146.                 }
  147.             }
  148.         }
  149.     }
  150.     private function checkPaymentType($paygentFlags$paygentType)
  151.     {
  152.         if ((isset($paygentFlags['commit']) && $paygentFlags['commit'] == $paygentType)
  153.             || (isset($paygentFlags['change']) && $paygentFlags['change'] == $paygentType)
  154.             || (isset($paygentFlags['change_auth']) && $paygentFlags['change_auth'] == $paygentType)
  155.             || (isset($paygentFlags['cancel']) && $paygentFlags['cancel'] == $paygentType))
  156.         {
  157.             return true;
  158.         }
  159.         // 差分通知などでステータスが変わっている場合falseになる
  160.         // 例 複数タブで受注編集画面を表示、売上処理を行った後に別タブで売上ボタンを押した場合falseになる
  161.         return false;
  162.     }
  163.     public function complete(TemplateEvent $event)
  164.     {
  165.         $paymentMethod $event->getParameter('Order')->getPayment()->getMethodClass();
  166.         $paygentPaymentMethod $event->getParameter('Order')->getPaygentPaymentMethod();
  167.         // Paidyかつ0円決済フロー(ペイジェント決済画面を経由しないフロー)の場合は既存決済完了文を除去
  168.         if (preg_match('/^Plugin\\\PaygentPayment42\\\Service\\\Method\\\Module\\\Paidy/'$paymentMethod) && $paygentPaymentMethod) {
  169.             $event->addSnippet('@PaygentPayment42/default/Shopping/remove_complete_message.twig');
  170.         }
  171.     }
  172.     private function checkToken()
  173.     {
  174.         /** @var Request $request */
  175.         $request $this->container->get('request_stack')->getCurrentRequest();
  176.         $order $request->get('order');
  177.         if (!$this->isCsrfTokenValid('order'$order[Constant::TOKEN_NAME])) {
  178.             throw new AccessDeniedHttpException('CSRF token is invalid.');
  179.         }
  180.         return true;
  181.     }
  182.     /**
  183.      * @see Symfony\Bundle\FrameworkBundle\Controller\AbstractController
  184.      */
  185.     private function isCsrfTokenValid(string $tokenId, ?string $tokenValue): bool
  186.     {
  187.         if (!$this->container->has('security.csrf.token_manager')) {
  188.             throw new \LogicException('CSRF protection is not enabled in your application. Enable it with the "csrf_protection" key in "config/packages/framework.yaml".');
  189.         }
  190.         return $this->container->get('security.csrf.token_manager')->isTokenValid(new CsrfToken($tokenId$tokenValue));
  191.     }
  192. }