app/Plugin/AmazonPayV2_42/AmazonPayEvent.php line 332

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.     }
  132.     /**
  133.      * トップページのイベント
  134.      * Amazon様バナーを挿入する
  135.      *
  136.      * @param TemplateEvent $event
  137.      * @return void
  138.      */
  139.     public function add_banner_on_top(TemplateEvent $event)
  140.     {
  141.         $Config $this->configRepository->get();
  142.         
  143.         if ($Config->getUseAmazonBannerOnTop() == $this->eccubeConfig['amazon_pay_v2']['toggle']['off']) {
  144.             return;
  145.         }
  146.         if ($Config->getAmazonBannerPlaceOnTop() == $this->eccubeConfig['amazon_pay_v2']['button_place']['auto']) {
  147.             $event->addSnippet('@AmazonPayV2_42/default/amazon_banner_auto_on_top.twig');
  148.         }
  149.         
  150.         $event->addSnippet($this->amazonBannerService->getBannerCodeOnTop(), false);
  151.     }
  152.     public function cart(TemplateEvent $event)
  153.     {
  154.         $Config $this->configRepository->get();
  155.         if ($Config->getUseAmazonBannerOnCart() != $this->eccubeConfig['amazon_pay_v2']['toggle']['off']) {
  156.             if ($Config->getAmazonBannerPlaceOnCart() == $this->eccubeConfig['amazon_pay_v2']['button_place']['auto']) {
  157.                 $event->addSnippet('@AmazonPayV2_42/default/amazon_banner_auto_on_cart.twig');
  158.             }
  159.             $event->addSnippet($this->amazonBannerService->getBannerCodeOnCart(), false);
  160.         }
  161.         $parameters $event->getParameters();
  162.         if (empty($parameters['Carts'])) {
  163.             return;
  164.         }
  165.         if ($Config->getUseCartButton() == $this->eccubeConfig['amazon_pay_v2']['toggle']['off']) {
  166.             return;
  167.         }
  168.         // AmazonPayに紐づく商品種別の取得
  169.         $Payment $this->paymentRepository->findOneBy(['method_class' => AmazonPay::class]);
  170.         $AmazonDeliveries $this->paymentOptionRepository->findBy(['payment_id' => $Payment->getId()]);
  171.         $AmazonSaleTypes = [];
  172.         foreach ($AmazonDeliveries as $AmazonDelivery) {
  173.             $Delivery $this->deliveryRepository->findOneBy(['id' => $AmazonDelivery->getDelivery()->getId()]);
  174.             $AmazonSaleTypes[] = $Delivery->getSaleType()->getId();
  175.         }
  176.         $parameters['AmazonSaleTypes'] = $AmazonSaleTypes;
  177.         foreach ($parameters['Carts'] as $Cart) {
  178.             $cartKey $Cart->getCartKey();
  179.             $payload $this->amazonRequestService->createCheckoutSessionPayload($Cart->getCartKey());
  180.             $signature $this->amazonRequestService->signaturePayload($payload);
  181.             $parameters['cart'][$cartKey]['payload'] = $payload;
  182.             $parameters['cart'][$cartKey]['signature'] = $signature;
  183.         }
  184.         $parameters['AmazonPayV2Config'] = $Config;
  185.         if ($Config->getEnv() == $this->eccubeConfig['amazon_pay_v2']['env']['prod']) {
  186.             $parameters['AmazonPayV2Api'] = $this->eccubeConfig['amazon_pay_v2']['api']['prod'];
  187.         } else {
  188.             $parameters['AmazonPayV2Api'] = $this->eccubeConfig['amazon_pay_v2']['api']['sandbox'];
  189.         }
  190.         $event->setParameters($parameters);
  191.         $event->addSnippet('@AmazonPayV2_42/default/Cart/amazon_pay_js.twig');
  192.         if ($Config->getCartButtonPlace() == $this->eccubeConfig['amazon_pay_v2']['button_place']['auto']) {
  193.             $event->addSnippet('@AmazonPayV2_42/default/Cart/button.twig');
  194.         }
  195.     }
  196.     public function amazon_cart_buystep(EventArgs $event)
  197.     {
  198.         // Amazonログインによる仮会員情報がセッションにセットされていたら
  199.         if ($this->orderHelper->getNonmember() && $this->session->get($this->sessionAmazonProfileKey)) {
  200.             // 仮会員情報を削除
  201.             $this->session->remove(OrderHelper::SESSION_NON_MEMBER);
  202.             $this->session->remove($this->sessionAmazonProfileKey);
  203.             $this->cartService->setPreOrderId(null);
  204.             $this->cartService->save();
  205.         }
  206.     }
  207.     public function amazon_pay_shopping(TemplateEvent $event)
  208.     {
  209.         $request $this->requestStack->getMainRequest();
  210.         $uri $request->getUri();
  211.         $parameters $event->getParameters();
  212.         if (preg_match('/shopping\/amazon_pay/'$uri) == false) {
  213.             $referer $request->headers->get('referer');
  214.             $Order $parameters['Order'];
  215.             $Payment $Order->getPayment();
  216.             // AmazonPay決済確認画面→クーポン入力画面→決済確認画面への遷移時にAmazonPay決済確認画面へ戻す
  217.             if ($Payment && $Payment->getMethodClass() === AmazonPay::class && preg_match('/shopping_coupon/'$referer)) {
  218.                 header("Location:" $this->container->get('router')->generate('amazon_pay_shopping'));
  219.                 exit;
  220.             }
  221.             return;
  222.         }
  223.         $Config $this->configRepository->get();
  224.         $event->addSnippet('@AmazonPayV2_42/default/Shopping/widgets.twig');
  225.         $event->addSnippet('@AmazonPayV2_42/default/Shopping/customer_regist_v2.twig');
  226.         // チェックアウトセッションIDを取得する
  227.         $amazonCheckoutSessionId $this->session->get($this->sessionAmazonCheckoutSessionIdKey);
  228.         $parameters $event->getParameters();
  229.         $parameters['amazonCheckoutSessionId'] = $amazonCheckoutSessionId;
  230.         $parameters['AmazonPayV2Config'] = $Config;
  231.         // メルマガプラグイン利用時はチェックボックスを追加
  232.         if (
  233.             $this->pluginRepository->findOneBy(['code' => 'MailMagazine42''enabled' => true])
  234.             || $this->pluginRepository->findOneBy(['code' => 'PostCarrier42''enabled' => true])
  235.         ) {
  236.             $useMailMagazine true;
  237.         } else {
  238.             $useMailMagazine false;
  239.         }
  240.         $parameters['useMailMagazine'] = $useMailMagazine;
  241.         if ($Config->getEnv() == $this->eccubeConfig['amazon_pay_v2']['env']['prod']) {
  242.             $parameters['AmazonPayV2Api'] = $this->eccubeConfig['amazon_pay_v2']['api']['prod'];
  243.         } else {
  244.             $parameters['AmazonPayV2Api'] = $this->eccubeConfig['amazon_pay_v2']['api']['sandbox'];
  245.         }
  246.         $event->setParameters($parameters);
  247.     }
  248.     public function amazon_pay_shopping_confirm(TemplateEvent $event)
  249.     {
  250.         $request $this->requestStack->getMainRequest();
  251.         $uri $request->getUri();
  252.         if (preg_match('/shopping\/amazon_pay/'$uri) == false) {
  253.             return;
  254.         }
  255.         $Config $this->configRepository->get();
  256.         $event->addSnippet('@AmazonPayV2_42/default/Shopping/confirm_widgets.twig');
  257.         $event->addSnippet('@AmazonPayV2_42/default/Shopping/confirm_customer_regist_v2.twig');
  258.         $parameters $event->getParameters();
  259.         $parameters['AmazonPayV2Config'] = $Config;
  260.         // メルマガプラグイン利用時はチェックボックスを追加
  261.         if (
  262.             $this->pluginRepository->findOneBy(['code' => 'MailMagazine42''enabled' => true])
  263.             || $this->pluginRepository->findOneBy(['code' => 'PostCarrier42''enabled' => true])
  264.         ) {
  265.             $useMailMagazine true;
  266.         } else {
  267.             $useMailMagazine false;
  268.         }
  269.         $parameters['useMailMagazine'] = $useMailMagazine;
  270.         if ($Config->getEnv() == $this->eccubeConfig['amazon_pay_v2']['env']['prod']) {
  271.             $parameters['AmazonPayV2Api'] = $this->eccubeConfig['amazon_pay_v2']['api']['prod'];
  272.         } else {
  273.             $parameters['AmazonPayV2Api'] = $this->eccubeConfig['amazon_pay_v2']['api']['sandbox'];
  274.         }
  275.         $event->setParameters($parameters);
  276.     }
  277.     public function mypage_login(TemplateEvent $event)
  278.     {
  279.         $Config $this->configRepository->get();
  280.         if ($Config->getUseMypageLoginButton() == $this->eccubeConfig['amazon_pay_v2']['toggle']['off']) {
  281.             return;
  282.         }
  283.         $state $this->session->get($this->sessionAmazonLoginStateKey);
  284.         if (!$state) {
  285.             // stateが生成されていなければ、生成及びセッションセット
  286.             $state bin2hex(Random::string(16));
  287.             $this->session->set($this->sessionAmazonLoginStateKey$state);
  288.         }
  289.         $returnUrl $this->router->generate('login_with_amazon', ['state' => $state], UrlGeneratorInterface::ABSOLUTE_URL);
  290.         $parameters $event->getParameters();
  291.         $payload $this->amazonRequestService->createSigninPayload($returnUrl);
  292.         $signature $this->amazonRequestService->signaturePayload($payload);
  293.         $parameters['payload'] = $payload;
  294.         $parameters['signature'] = $signature;
  295.         $parameters['buttonColor'] = $Config->getMypageLoginButtonColor();
  296.         $parameters['AmazonPayV2Config'] = $Config;
  297.         if ($Config->getEnv() == $this->eccubeConfig['amazon_pay_v2']['env']['prod']) {
  298.             $parameters['AmazonPayV2Api'] = $this->eccubeConfig['amazon_pay_v2']['api']['prod'];
  299.         } else {
  300.             $parameters['AmazonPayV2Api'] = $this->eccubeConfig['amazon_pay_v2']['api']['sandbox'];
  301.         }
  302.         $event->setParameters($parameters);
  303.         if ($Config->getMypageLoginButtonPlace() == $this->eccubeConfig['amazon_pay_v2']['button_place']['auto']) {
  304.             $event->addSnippet('@AmazonPayV2_42/default/Mypage/login_page_button.twig');
  305.         }
  306.         $event->addSnippet('@AmazonPayV2_42/default/Mypage/amazon_login_js.twig');
  307.     }
  308. }