app/Customize/Plugin/AmazonPayV2_42/AmazonPayEvent.php line 147

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 Customize\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.         TokenStorageInterface $tokenStorage,
  88.         EccubeConfig $eccubeConfig,
  89.         UrlGeneratorInterface $router,
  90.         PaymentRepository $paymentRepository,
  91.         PluginRepository $pluginRepository,
  92.         ConfigRepository $configRepository,
  93.         ContainerInterface $container,
  94.         OrderHelper $orderHelper,
  95.         CartService $cartService,
  96.         AmazonRequestService $amazonRequestService,
  97.         DeliveryRepository $deliveryRepository,
  98.         PaymentOptionRepository $paymentOptionRepository,
  99.         AmazonBannerService $amazonBannerService
  100.     ) {
  101.         $this->requestStack $requestStack;
  102.         $this->session $requestStack->getSession();
  103.         $this->tokenStorage $tokenStorage;
  104.         $this->eccubeConfig $eccubeConfig;
  105.         $this->router $router;
  106.         $this->paymentRepository $paymentRepository;
  107.         $this->pluginRepository $pluginRepository;
  108.         $this->configRepository $configRepository;
  109.         $this->container $container;
  110.         $this->orderHelper $orderHelper;
  111.         $this->cartService $cartService;
  112.         $this->amazonRequestService $amazonRequestService;
  113.         $this->deliveryRepository $deliveryRepository;
  114.         $this->paymentOptionRepository $paymentOptionRepository;
  115.     }
  116.     /**
  117.      * {@inheritdoc}
  118.      */
  119.     public static function getSubscribedEvents()
  120.     {
  121.         return [
  122.             EccubeEvents::FRONT_CART_BUYSTEP_COMPLETE => 'amazon_cart_buystep',
  123.             'Cart/index.twig' => 'cart',
  124.             'Shopping/index.twig' => 'amazon_pay_shopping',
  125.             'Mypage/login.twig' => 'mypage_login',
  126.             'Shopping/confirm.twig' => 'amazon_pay_shopping_confirm',
  127.         ];
  128.     }
  129.     public function cart(TemplateEvent $event)
  130.     {
  131.         return $this->initAmazonPay($event);
  132.     }
  133.     public function amazon_cart_buystep(EventArgs $event)
  134.     {
  135.         // Amazonログインによる仮会員情報がセッションにセットされていたら
  136.         if ($this->orderHelper->getNonmember() && $this->session->get($this->sessionAmazonProfileKey)) {
  137.             // 仮会員情報を削除
  138.             $this->session->remove(OrderHelper::SESSION_NON_MEMBER);
  139.             $this->session->remove($this->sessionAmazonProfileKey);
  140.             $this->cartService->setPreOrderId(null);
  141.             $this->cartService->save();
  142.         }
  143.     }
  144.     public function amazon_pay_shopping(TemplateEvent $event)
  145.     {
  146.         $this->initAmazonPay($event);
  147.         $request $this->requestStack->getMainRequest();
  148.         $uri $request->getUri();
  149.         $parameters $event->getParameters();
  150.         if (preg_match('/shopping\/amazon_pay/'$uri) == false) {
  151.             $referer $request->headers->get('referer');
  152.             $Order $parameters['Order'];
  153.             $Payment $Order->getPayment();
  154.             // AmazonPay決済確認画面→クーポン入力画面→決済確認画面への遷移時にAmazonPay決済確認画面へ戻す
  155.             if ($Payment && $Payment->getMethodClass() === AmazonPay::class && preg_match('/shopping_coupon/'$referer)) {
  156.                 header("Location:" $this->router->generate('amazon_pay_shopping'));
  157.                 exit;
  158.             }
  159.             return;
  160.         }
  161.         $Config $this->configRepository->get();
  162.         $event->addSnippet('@AmazonPayV2_42/default/Shopping/widgets.twig');
  163.         $event->addSnippet('@AmazonPayV2_42/default/Shopping/customer_regist_v2.twig');
  164.         // チェックアウトセッションIDを取得する
  165.         $amazonCheckoutSessionId $this->session->get($this->sessionAmazonCheckoutSessionIdKey);
  166.         $parameters $event->getParameters();
  167.         $parameters['amazonCheckoutSessionId'] = $amazonCheckoutSessionId;
  168.         $parameters['AmazonPayV2Config'] = $Config;
  169.         // メルマガプラグイン利用時はチェックボックスを追加
  170.         if (
  171.             $this->pluginRepository->findOneBy(['code' => 'MailMagazine42''enabled' => true])
  172.             || $this->pluginRepository->findOneBy(['code' => 'PostCarrier42''enabled' => true])
  173.         ) {
  174.             $useMailMagazine true;
  175.         } else {
  176.             $useMailMagazine false;
  177.         }
  178.         $parameters['useMailMagazine'] = $useMailMagazine;
  179.         if ($Config->getEnv() == $this->eccubeConfig['amazon_pay_v2']['env']['prod']) {
  180.             $parameters['AmazonPayV2Api'] = $this->eccubeConfig['amazon_pay_v2']['api']['prod'];
  181.         } else {
  182.             $parameters['AmazonPayV2Api'] = $this->eccubeConfig['amazon_pay_v2']['api']['sandbox'];
  183.         }
  184.         $event->setParameters($parameters);
  185.     }
  186.     public function amazon_pay_shopping_confirm(TemplateEvent $event)
  187.     {
  188.         $request $this->requestStack->getMainRequest();
  189.         $uri $request->getUri();
  190.         if (preg_match('/shopping\/amazon_pay/'$uri) == false) {
  191.             return;
  192.         }
  193.         $Config $this->configRepository->get();
  194.         $event->addSnippet('@AmazonPayV2_42/default/Shopping/confirm_widgets.twig');
  195.         $event->addSnippet('@AmazonPayV2_42/default/Shopping/confirm_customer_regist_v2.twig');
  196.         $parameters $event->getParameters();
  197.         $parameters['AmazonPayV2Config'] = $Config;
  198.         // メルマガプラグイン利用時はチェックボックスを追加
  199.         if (
  200.             $this->pluginRepository->findOneBy(['code' => 'MailMagazine42''enabled' => true])
  201.             || $this->pluginRepository->findOneBy(['code' => 'PostCarrier42''enabled' => true])
  202.         ) {
  203.             $useMailMagazine true;
  204.         } else {
  205.             $useMailMagazine false;
  206.         }
  207.         $parameters['useMailMagazine'] = $useMailMagazine;
  208.         if ($Config->getEnv() == $this->eccubeConfig['amazon_pay_v2']['env']['prod']) {
  209.             $parameters['AmazonPayV2Api'] = $this->eccubeConfig['amazon_pay_v2']['api']['prod'];
  210.         } else {
  211.             $parameters['AmazonPayV2Api'] = $this->eccubeConfig['amazon_pay_v2']['api']['sandbox'];
  212.         }
  213.         $event->setParameters($parameters);
  214.     }
  215.     public function mypage_login(TemplateEvent $event)
  216.     {
  217.         $Config $this->configRepository->get();
  218.         if ($Config->getUseMypageLoginButton() == $this->eccubeConfig['amazon_pay_v2']['toggle']['off']) {
  219.             return;
  220.         }
  221.         $state $this->session->get($this->sessionAmazonLoginStateKey);
  222.         if (!$state) {
  223.             // stateが生成されていなければ、生成及びセッションセット
  224.             $state bin2hex(Random::string(16));
  225.             $this->session->set($this->sessionAmazonLoginStateKey$state);
  226.         }
  227.         $returnUrl $this->router->generate('login_with_amazon', ['state' => $state], UrlGeneratorInterface::ABSOLUTE_URL);
  228.         $parameters $event->getParameters();
  229.         $payload $this->amazonRequestService->createSigninPayload($returnUrl);
  230.         $signature $this->amazonRequestService->signaturePayload($payload);
  231.         $parameters['payload'] = $payload;
  232.         $parameters['signature'] = $signature;
  233.         $parameters['buttonColor'] = $Config->getMypageLoginButtonColor();
  234.         $parameters['AmazonPayV2Config'] = $Config;
  235.         if ($Config->getEnv() == $this->eccubeConfig['amazon_pay_v2']['env']['prod']) {
  236.             $parameters['AmazonPayV2Api'] = $this->eccubeConfig['amazon_pay_v2']['api']['prod'];
  237.         } else {
  238.             $parameters['AmazonPayV2Api'] = $this->eccubeConfig['amazon_pay_v2']['api']['sandbox'];
  239.         }
  240.         $event->setParameters($parameters);
  241.         if ($Config->getMypageLoginButtonPlace() == $this->eccubeConfig['amazon_pay_v2']['button_place']['auto']) {
  242.             $event->addSnippet('@AmazonPayV2_42/default/Mypage/login_page_button.twig');
  243.         }
  244.         $event->addSnippet('@AmazonPayV2_42/default/Mypage/amazon_login_js.twig');
  245.     }
  246.     private function initAmazonPay($event)
  247.     {
  248.         $Config $this->configRepository->get();
  249.         $parameters $event->getParameters();
  250.         if (empty($parameters['Carts'])) {
  251.             return;
  252.         }
  253.         if ($Config->getUseCartButton() == $this->eccubeConfig['amazon_pay_v2']['toggle']['off']) {
  254.             return;
  255.         }
  256.         // AmazonPayに紐づく商品種別の取得
  257.         $Payment $this->paymentRepository->findOneBy(['method_class' => AmazonPay::class]);
  258.         $AmazonDeliveries $this->paymentOptionRepository->findBy(['payment_id' => $Payment->getId()]);
  259.         $AmazonSaleTypes = [];
  260.         foreach ($AmazonDeliveries as $AmazonDelivery) {
  261.             $Delivery $this->deliveryRepository->findOneBy(['id' => $AmazonDelivery->getDelivery()->getId()]);
  262.             $AmazonSaleTypes[] = $Delivery->getSaleType()->getId();
  263.         }
  264.         $parameters['AmazonSaleTypes'] = $AmazonSaleTypes;
  265.         foreach ($parameters['Carts'] as $Cart) {
  266.             $cartKey $Cart->getCartKey();
  267.             $payload $this->amazonRequestService->createCheckoutSessionPayload($Cart->getCartKey());
  268.             $signature $this->amazonRequestService->signaturePayload($payload);
  269.             $parameters['cart'][$cartKey]['payload'] = $payload;
  270.             $parameters['cart'][$cartKey]['signature'] = $signature;
  271.         }
  272.         $parameters['AmazonPayV2Config'] = $Config;
  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.         $event->addSnippet('@AmazonPayV2_42/default/Cart/amazon_pay_js.twig');
  280.         if ($Config->getCartButtonPlace() == $this->eccubeConfig['amazon_pay_v2']['button_place']['auto']) {
  281.             $event->addSnippet('@AmazonPayV2_42/default/Cart/button.twig');
  282.         }
  283.     }
  284. }