app/Plugin/PaygentPayment/PaygentEvent.php line 128

Open in your IDE?
  1. <?php
  2. namespace Plugin\PaygentPayment;
  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\PaygentPayment\Repository\ConfigRepository;
  9. use Plugin\PaygentPayment\Service\PaymentAdminFactory;
  10. use Symfony\Bundle\FrameworkBundle\Controller\ControllerTrait;
  11. use Symfony\Component\DependencyInjection\ContainerInterface;
  12. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  13. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  14. use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
  15. class PaygentEvent implements EventSubscriberInterface
  16. {
  17.     use ControllerTrait;
  18.     /**
  19.      * @var EccubeConfig
  20.      */
  21.     protected $eccubeConfig;
  22.     /**
  23.      * @var ConfigRepository
  24.      */
  25.     protected $configRepository;
  26.     /**
  27.      * @var SessionInterface
  28.      */
  29.     protected $session;
  30.     /**
  31.      * @var PaymentAdminFactory
  32.      */
  33.     protected $paymentAdminFactory;
  34.     /**
  35.      * @var ContainerInterface
  36.      */
  37.     protected $container;
  38.     /**
  39.      * PaygentEvent
  40.      *
  41.      * @param eccubeConfig $eccubeConfig
  42.      * @param ConfigRepository $configRepository
  43.      * @param SessionInterface $session
  44.      * @param PaymentAdminFactory $paymentAdminFactory
  45.      * @param ContainerInterface $container
  46.      */
  47.     public function __construct(
  48.         EccubeConfig $eccubeConfig,
  49.         ConfigRepository $configRepository,
  50.         SessionInterface $session,
  51.         PaymentAdminFactory $paymentAdminFactory,
  52.         ContainerInterface $container
  53.     ) {
  54.         $this->eccubeConfig $eccubeConfig;
  55.         $this->configRepository $configRepository;
  56.         $this->session $session;
  57.         $this->paymentAdminFactory $paymentAdminFactory;
  58.         $this->container $container;
  59.     }
  60.     /**
  61.      * {@inheritdoc}
  62.      */
  63.     public static function getSubscribedEvents()
  64.     {
  65.         return [
  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 confirm(TemplateEvent $event)
  73.     {
  74.         $paymentMethod $event->getParameter('Order')->getPayment()->getMethodClass();
  75.         if (preg_match('/^Plugin\\\PaygentPayment\\\Service\\\Method/'$paymentMethod)) {
  76.             $event->addSnippet('@PaygentPayment/default/Shopping/confirm_button.twig');
  77.         }
  78.     }
  79.     public function onAdminOrderEditTwig(TemplateEvent $event)
  80.     {
  81.         $parameters $event->getParameters();
  82.         $order $parameters['Order'];
  83.         $paymentInstance $this->paymentAdminFactory->getInstance($order->getPaygentPaymentMethod());
  84.         if ($paymentInstance) {
  85.             $methodName $paymentInstance->getPaymentMethodName($order->getPaygentPaymentMethod());
  86.             if ($methodName) {
  87.                 $event->addSnippet('@PaygentPayment/admin/Order/payment_order_edit.twig');
  88.     
  89.                 $parameters $event->getParameters();
  90.                 $parameters['paygentMethodName'] = $methodName;
  91.                 $parameters['paygentStatusName'] = $paymentInstance->getPaymentStatusName($order->getPaygentKind());
  92.                 $parameters['paygentError'] = $order->getPaygentError();
  93.                 $parameters['paygentFlags'] = $paymentInstance->getPaygentFlags($order);
  94.                 if ($this->session->get('paygent_payment.order_edit_on_click_payment_button')) {
  95.                     $parameters['paygentOnClickButton'] = true;
  96.                 }
  97.                 $message $this->session->get('paygent_payment.order_edit_message');
  98.     
  99.                 if (isset($message)) {
  100.                     $parameters['paygentMessage'] = $message;
  101.                     $this->session->remove('paygent_payment.order_edit_message');
  102.                 }
  103.     
  104.                 $event->setParameters($parameters);
  105.             }
  106.         }
  107.         $this->session->remove('paygent_payment.order_edit_on_click_payment_button');
  108.     }
  109.     public function onAdminOrderEditIndexInitialize(EventArgs $event)
  110.     {
  111.         $request $event->getRequest();
  112.         $paygentType $request->get('paygentType');
  113.         if ($request->getMethod() === 'POST' && $paygentType) {
  114.             $this->checkToken();
  115.             $this->session->set('paygent_payment.order_edit_on_click_payment_button'true);
  116.             $order $event->getArgument('TargetOrder');
  117.             $paymentInstance $this->paymentAdminFactory->getInstance($order->getPaygentPaymentMethod());
  118.             $paygentFlags $paymentInstance->getPaygentFlags($order);
  119.             // $paygentTypeのチェック
  120.             if ($this->checkPaymentType($paygentFlags$paygentType)) {
  121.                 // 通信処理
  122.                 $res $paymentInstance->process($paygentType$order->getId());
  123.         
  124.                 if ($res) {
  125.                     // 結果出力
  126.                     if ($res['return'] === true) {
  127.                         $message $res['type'] . "に成功しました。";
  128.                     } elseif (isset($res['response']) && $res['response'] != "" && $order->getPaygentPaymentMethod() != $this->eccubeConfig['paygent_payment']['paygent_credit']) {
  129.                         $message $res['type'] . "に失敗しました。" $res['response'];
  130.                     } else {
  131.                         $message $res['type'] . "に失敗しました。";
  132.                     }
  133.                     $this->session->set('paygent_payment.order_edit_message'$message);
  134.                 }
  135.             }
  136.         }
  137.     }
  138.     private function checkPaymentType($paygentFlags$paygentType)
  139.     {
  140.         if ((isset($paygentFlags['commit']) && $paygentFlags['commit'] == $paygentType)
  141.             || (isset($paygentFlags['change']) && $paygentFlags['change'] == $paygentType)
  142.             || (isset($paygentFlags['change_auth']) && $paygentFlags['change_auth'] == $paygentType)
  143.             || (isset($paygentFlags['cancel']) && $paygentFlags['cancel'] == $paygentType))
  144.         {
  145.             return true;
  146.         }
  147.         // 差分通知などでステータスが変わっている場合falseになる
  148.         // 例 複数タブで受注編集画面を表示、売上処理を行った後に別タブで売上ボタンを押した場合falseになる
  149.         return false;
  150.     }
  151.     public function complete(TemplateEvent $event)
  152.     {
  153.         $paymentMethod $event->getParameter('Order')->getPayment()->getMethodClass();
  154.         if (preg_match('/^Plugin\\\PaygentPayment\\\Service\\\Method\\\Module\\\Paidy/'$paymentMethod)) {
  155.             $event->addSnippet('@PaygentPayment/default/Shopping/remove_complete_message.twig');
  156.         }
  157.     }
  158.     private function checkToken()
  159.     {
  160.         /** @var Request $request */
  161.         $request $this->container->get('request_stack')->getCurrentRequest();
  162.         $order $request->get('order');
  163.         if (!$this->isCsrfTokenValid('order'$order[Constant::TOKEN_NAME])) {
  164.             throw new AccessDeniedHttpException('CSRF token is invalid.');
  165.         }
  166.         return true;
  167.     }
  168. }