app/Plugin/AmazonPayV2_42/AmazonPayEvent.php line 335

Open in your IDE?
  1. <?php
  2. /*
  3.  * Amazon Pay V2 for EC-CUBE4.2
  4.  * Copyright(c) 2023 EC-CUBE CO.,LTD. all rights reserved.
  5.  *
  6.  * https://www.ec-cube.co.jp/
  7.  *
  8.  * This program is not free software.
  9.  * It applies to terms of service.
  10.  *
  11.  */
  12. namespace Plugin\AmazonPayV2_42;
  13. use Eccube\Event\TemplateEvent;
  14. use Eccube\Event\EventArgs;
  15. use Eccube\Event\EccubeEvents;
  16. use Eccube\Common\EccubeConfig;
  17. use Eccube\Repository\PaymentRepository;
  18. use Eccube\Repository\PluginRepository;
  19. use Eccube\Service\OrderHelper;
  20. use Eccube\Service\CartService;
  21. use Plugin\AmazonPayV2_42\Repository\ConfigRepository;
  22. use Plugin\AmazonPayV2_42\Service\AmazonRequestService;
  23. use Plugin\AmazonPayV2_42\Service\Method\AmazonPay;
  24. use Plugin\AmazonPayV2_42\phpseclib\Crypt\Random;
  25. use Psr\Container\ContainerInterface;
  26. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  27. use Symfony\Component\HttpFoundation\RequestStack;
  28. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  29. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
  30. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  31. use Eccube\Repository\DeliveryRepository;
  32. use Eccube\Repository\PaymentOptionRepository;
  33. use Plugin\AmazonPayV2_42\Entity\AmazonBanner;
  34. use Plugin\AmazonPayV2_42\Service\AmazonBannerService;
  35. class AmazonPayEvent implements EventSubscriberInterface
  36. {
  37.     /**
  38.      * @var string プロファイル情報キー
  39.      */
  40.     private $sessionAmazonProfileKey 'amazon_pay_v2.profile';
  41.     /**
  42.      * @var string プロファイル情報キー
  43.      */
  44.     private $sessionAmazonCheckoutSessionIdKey 'amazon_pay_v2.checkout_session_id';
  45.     /**
  46.      * @var string Amazonログインステート
  47.      */
  48.     private $sessionAmazonLoginStateKey 'amazon_pay_v2.amazon_login_state';
  49.     /**
  50.      * @var EccubeConfig
  51.      */
  52.     protected $eccubeConfig;
  53.     /**
  54.      * @var UrlGeneratorInterface
  55.      */
  56.     private $router;
  57.     /**
  58.      * @var ConfigRepository
  59.      */
  60.     protected $configRepository;
  61.     /**
  62.      * @var AmazonRequestService
  63.      */
  64.     protected $amazonRequestService;
  65.     /**
  66.      * @var DeliveryRepository
  67.      */
  68.     protected $deliveryRepository;
  69.     /**
  70.      * @var DeliveryRepository
  71.      */
  72.     protected $paymentOptionRepository;
  73.     /**
  74.      * Amazon Payバナーサービス
  75.      *
  76.      * @var AmazonBannerService
  77.      */
  78.     protected $amazonBannerService;
  79.     /**
  80.      * AmazonPayEvent
  81.      *
  82.      * @param eccubeConfig $eccubeConfig
  83.      * @param ConfigRepository $configRepository
  84.      */
  85.     public function __construct(
  86.         RequestStack $requestStack,
  87.          
  88.         TokenStorageInterface $tokenStorage,
  89.         EccubeConfig $eccubeConfig,
  90.         UrlGeneratorInterface $router,
  91.         PaymentRepository $paymentRepository,
  92.         PluginRepository $pluginRepository,
  93.         ConfigRepository $configRepository,
  94.         ContainerInterface $container,
  95.         OrderHelper $orderHelper,
  96.         CartService $cartService,
  97.         AmazonRequestService $amazonRequestService,
  98.         DeliveryRepository $deliveryRepository,
  99.         PaymentOptionRepository $paymentOptionRepository,
  100.         AmazonBannerService $amazonBannerService
  101.     ) {
  102.         $this->requestStack $requestStack;
  103.         $this->session $requestStack->getSession();
  104.         $this->tokenStorage $tokenStorage;
  105.         $this->eccubeConfig $eccubeConfig;
  106.         $this->router $router;
  107.         $this->paymentRepository $paymentRepository;
  108.         $this->pluginRepository $pluginRepository;
  109.         $this->configRepository $configRepository;
  110.         $this->container $container;
  111.         $this->orderHelper $orderHelper;
  112.         $this->cartService $cartService;
  113.         $this->amazonRequestService $amazonRequestService;
  114.         $this->deliveryRepository $deliveryRepository;
  115.         $this->paymentOptionRepository $paymentOptionRepository;
  116.         $this->amazonBannerService $amazonBannerService;
  117.     }
  118.     /**
  119.      * {@inheritdoc}
  120.      */
  121.     public static function getSubscribedEvents()
  122.     {
  123.         return [
  124.             EccubeEvents::FRONT_CART_BUYSTEP_COMPLETE => 'amazon_cart_buystep',
  125.             'Cart/index.twig' => 'cart',
  126.             'Shopping/index.twig' => 'amazon_pay_shopping',
  127.             'Mypage/login.twig' => 'mypage_login',
  128.             'Shopping/confirm.twig' => 'amazon_pay_shopping_confirm',
  129.             'index.twig' => 'add_banner_on_top',
  130.             //ショッピングページでも使用できるよう追加
  131.                         'Shopping/index.twig' => 'shopping'
  132.                         'Shopping/login.twig' => 'shopping_login',
  133.         ];
  134.     }
  135.     /**
  136.      * トップページのイベント
  137.      * Amazon様バナーを挿入する
  138.      *
  139.      * @param TemplateEvent $event
  140.      * @return void
  141.      */
  142.     public function add_banner_on_top(TemplateEvent $event)
  143.     {
  144.         $Config $this->configRepository->get();
  145.         
  146.         if ($Config->getUseAmazonBannerOnTop() == $this->eccubeConfig['amazon_pay_v2']['toggle']['off']) {
  147.             return;
  148.         }
  149.         if ($Config->getAmazonBannerPlaceOnTop() == $this->eccubeConfig['amazon_pay_v2']['button_place']['auto']) {
  150.             $event->addSnippet('@AmazonPayV2_42/default/amazon_banner_auto_on_top.twig');
  151.         }
  152.         
  153.         $event->addSnippet($this->amazonBannerService->getBannerCodeOnTop(), false);
  154.     }
  155.     public function cart(TemplateEvent $event)
  156.     {
  157.         $Config $this->configRepository->get();
  158.         if ($Config->getUseAmazonBannerOnCart() != $this->eccubeConfig['amazon_pay_v2']['toggle']['off']) {
  159.             if ($Config->getAmazonBannerPlaceOnCart() == $this->eccubeConfig['amazon_pay_v2']['button_place']['auto']) {
  160.                 $event->addSnippet('@AmazonPayV2_42/default/amazon_banner_auto_on_cart.twig');
  161.             }
  162.             $event->addSnippet($this->amazonBannerService->getBannerCodeOnCart(), false);
  163.         }
  164.         $parameters $event->getParameters();
  165.         if (empty($parameters['Carts'])) {
  166.             return;
  167.         }
  168.         if ($Config->getUseCartButton() == $this->eccubeConfig['amazon_pay_v2']['toggle']['off']) {
  169.             return;
  170.         }
  171.         // AmazonPayに紐づく商品種別の取得
  172.         $Payment $this->paymentRepository->findOneBy(['method_class' => AmazonPay::class]);
  173.         $AmazonDeliveries $this->paymentOptionRepository->findBy(['payment_id' => $Payment->getId()]);
  174.         $AmazonSaleTypes = [];
  175.         foreach ($AmazonDeliveries as $AmazonDelivery) {
  176.             $Delivery $this->deliveryRepository->findOneBy(['id' => $AmazonDelivery->getDelivery()->getId()]);
  177.             $AmazonSaleTypes[] = $Delivery->getSaleType()->getId();
  178.         }
  179.         $parameters['AmazonSaleTypes'] = $AmazonSaleTypes;
  180.         foreach ($parameters['Carts'] as $Cart) {
  181.             $cartKey $Cart->getCartKey();
  182.             $payload $this->amazonRequestService->createCheckoutSessionPayload($Cart->getCartKey());
  183.             $signature $this->amazonRequestService->signaturePayload($payload);
  184.             $parameters['cart'][$cartKey]['payload'] = $payload;
  185.             $parameters['cart'][$cartKey]['signature'] = $signature;
  186.         }
  187.         $parameters['AmazonPayV2Config'] = $Config;
  188.         if ($Config->getEnv() == $this->eccubeConfig['amazon_pay_v2']['env']['prod']) {
  189.             $parameters['AmazonPayV2Api'] = $this->eccubeConfig['amazon_pay_v2']['api']['prod'];
  190.         } else {
  191.             $parameters['AmazonPayV2Api'] = $this->eccubeConfig['amazon_pay_v2']['api']['sandbox'];
  192.         }
  193.         $event->setParameters($parameters);
  194.         $event->addSnippet('@AmazonPayV2_42/default/Cart/amazon_pay_js.twig');
  195.         if ($Config->getCartButtonPlace() == $this->eccubeConfig['amazon_pay_v2']['button_place']['auto']) {
  196.             $event->addSnippet('@AmazonPayV2_42/default/Cart/button.twig');
  197.         }
  198.     }
  199.     public function amazon_cart_buystep(EventArgs $event)
  200.     {
  201.         // Amazonログインによる仮会員情報がセッションにセットされていたら
  202.         if ($this->orderHelper->getNonmember() && $this->session->get($this->sessionAmazonProfileKey)) {
  203.             // 仮会員情報を削除
  204.             $this->session->remove(OrderHelper::SESSION_NON_MEMBER);
  205.             $this->session->remove($this->sessionAmazonProfileKey);
  206.             $this->cartService->setPreOrderId(null);
  207.             $this->cartService->save();
  208.         }
  209.     }
  210.     public function amazon_pay_shopping(TemplateEvent $event)
  211.     {
  212.         $request $this->requestStack->getMainRequest();
  213.         $uri $request->getUri();
  214.         $parameters $event->getParameters();
  215.         if (preg_match('/shopping\/amazon_pay/'$uri) == false) {
  216.             $referer $request->headers->get('referer');
  217.             $Order $parameters['Order'];
  218.             $Payment $Order->getPayment();
  219.             // AmazonPay決済確認画面→クーポン入力画面→決済確認画面への遷移時にAmazonPay決済確認画面へ戻す
  220.             if ($Payment && $Payment->getMethodClass() === AmazonPay::class && preg_match('/shopping_coupon/'$referer)) {
  221.                 header("Location:" $this->router->generate('amazon_pay_shopping'));
  222.                 exit;
  223.             }
  224.             return;
  225.         }
  226.         $Config $this->configRepository->get();
  227.         $event->addSnippet('@AmazonPayV2_42/default/Shopping/widgets.twig');
  228.         $event->addSnippet('@AmazonPayV2_42/default/Shopping/customer_regist_v2.twig');
  229.         // チェックアウトセッションIDを取得する
  230.         $amazonCheckoutSessionId $this->session->get($this->sessionAmazonCheckoutSessionIdKey);
  231.         $parameters $event->getParameters();
  232.         $parameters['amazonCheckoutSessionId'] = $amazonCheckoutSessionId;
  233.         $parameters['AmazonPayV2Config'] = $Config;
  234.         // メルマガプラグイン利用時はチェックボックスを追加
  235.         if (
  236.             $this->pluginRepository->findOneBy(['code' => 'MailMagazine42''enabled' => true])
  237.             || $this->pluginRepository->findOneBy(['code' => 'PostCarrier42''enabled' => true])
  238.         ) {
  239.             $useMailMagazine true;
  240.         } else {
  241.             $useMailMagazine false;
  242.         }
  243.         $parameters['useMailMagazine'] = $useMailMagazine;
  244.         if ($Config->getEnv() == $this->eccubeConfig['amazon_pay_v2']['env']['prod']) {
  245.             $parameters['AmazonPayV2Api'] = $this->eccubeConfig['amazon_pay_v2']['api']['prod'];
  246.         } else {
  247.             $parameters['AmazonPayV2Api'] = $this->eccubeConfig['amazon_pay_v2']['api']['sandbox'];
  248.         }
  249.         $event->setParameters($parameters);
  250.     }
  251.     public function amazon_pay_shopping_confirm(TemplateEvent $event)
  252.     {
  253.         $request $this->requestStack->getMainRequest();
  254.         $uri $request->getUri();
  255.         if (preg_match('/shopping\/amazon_pay/'$uri) == false) {
  256.             return;
  257.         }
  258.         $Config $this->configRepository->get();
  259.         $event->addSnippet('@AmazonPayV2_42/default/Shopping/confirm_widgets.twig');
  260.         $event->addSnippet('@AmazonPayV2_42/default/Shopping/confirm_customer_regist_v2.twig');
  261.         $parameters $event->getParameters();
  262.         $parameters['AmazonPayV2Config'] = $Config;
  263.         // メルマガプラグイン利用時はチェックボックスを追加
  264.         if (
  265.             $this->pluginRepository->findOneBy(['code' => 'MailMagazine42''enabled' => true])
  266.             || $this->pluginRepository->findOneBy(['code' => 'PostCarrier42''enabled' => true])
  267.         ) {
  268.             $useMailMagazine true;
  269.         } else {
  270.             $useMailMagazine false;
  271.         }
  272.         $parameters['useMailMagazine'] = $useMailMagazine;
  273.         if ($Config->getEnv() == $this->eccubeConfig['amazon_pay_v2']['env']['prod']) {
  274.             $parameters['AmazonPayV2Api'] = $this->eccubeConfig['amazon_pay_v2']['api']['prod'];
  275.         } else {
  276.             $parameters['AmazonPayV2Api'] = $this->eccubeConfig['amazon_pay_v2']['api']['sandbox'];
  277.         }
  278.         $event->setParameters($parameters);
  279.     }
  280.     public function mypage_login(TemplateEvent $event)
  281.     {
  282.         $Config $this->configRepository->get();
  283.         if ($Config->getUseMypageLoginButton() == $this->eccubeConfig['amazon_pay_v2']['toggle']['off']) {
  284.             return;
  285.         }
  286.         $state $this->session->get($this->sessionAmazonLoginStateKey);
  287.         if (!$state) {
  288.             // stateが生成されていなければ、生成及びセッションセット
  289.             $state bin2hex(Random::string(16));
  290.             $this->session->set($this->sessionAmazonLoginStateKey$state);
  291.         }
  292.         $returnUrl $this->router->generate('login_with_amazon', ['state' => $state], UrlGeneratorInterface::ABSOLUTE_URL);
  293.         $parameters $event->getParameters();
  294.         $payload $this->amazonRequestService->createSigninPayload($returnUrl);
  295.         $signature $this->amazonRequestService->signaturePayload($payload);
  296.         $parameters['payload'] = $payload;
  297.         $parameters['signature'] = $signature;
  298.         $parameters['buttonColor'] = $Config->getMypageLoginButtonColor();
  299.         $parameters['AmazonPayV2Config'] = $Config;
  300.         if ($Config->getEnv() == $this->eccubeConfig['amazon_pay_v2']['env']['prod']) {
  301.             $parameters['AmazonPayV2Api'] = $this->eccubeConfig['amazon_pay_v2']['api']['prod'];
  302.         } else {
  303.             $parameters['AmazonPayV2Api'] = $this->eccubeConfig['amazon_pay_v2']['api']['sandbox'];
  304.         }
  305.         $event->setParameters($parameters);
  306.         if ($Config->getMypageLoginButtonPlace() == $this->eccubeConfig['amazon_pay_v2']['button_place']['auto']) {
  307.             $event->addSnippet('@AmazonPayV2_42/default/Mypage/login_page_button.twig');
  308.         }
  309.         $event->addSnippet('@AmazonPayV2_42/default/Mypage/amazon_login_js.twig');
  310.     }
  311.     
  312.     // ショッピングページでも使用できるよう追加
  313.     public function shopping(TemplateEvent $event)
  314.         {
  315.             
  316.             $parameters $event->getParameters();
  317.             if (empty($parameters['Carts'])) {
  318.                 $parameters['Carts'] = $this->cartService->getCarts();
  319.             }
  320.             $event->setParameters($parameters);
  321.             $this->amazon_pay_shopping($event);
  322.             $this->cart($event);
  323.         }
  324.     // ショッピングページでも使用できるよう追加
  325.         public function shopping_login(TemplateEvent $event)
  326.         {
  327.             $parameters $event->getParameters();
  328.             if (empty($parameters['Carts'])) {
  329.                 $parameters['Carts'] = $this->cartService->getCarts();
  330.             }
  331.             $event->setParameters($parameters);
  332.             $this->cart($event);
  333.         }
  334. }