app/Plugin/PayJp42/PayJpEvent.php line 149

Open in your IDE?
  1. <?php
  2. /*
  3. * Plugin Name : PayJp
  4. *
  5. * Copyright (C) 2018 Subspire Inc. All Rights Reserved.
  6. * http://www.subspire.co.jp/
  7. *
  8. * For the full copyright and license information, please view the LICENSE
  9. * file that was distributed with this source code.
  10. */
  11. namespace Plugin\PayJp42;
  12. use Eccube\Common\EccubeConfig;
  13. use Eccube\Event\TemplateEvent;
  14. use Eccube\Event\EventArgs;
  15. use Eccube\Entity\Payment;
  16. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  17. use Plugin\PayJp42\Repository\PayJpConfigRepository;
  18. use Plugin\PayJp42\Service\Method\PayJpCreditCard;
  19. use Plugin\PayJp42\Entity\PayJpOrder;
  20. use Plugin\PayJp42\Repository\PayJpOrderRepository;
  21. use Eccube\Repository\Master\OrderStatusRepository;
  22. use Eccube\Entity\Master\OrderStatus;
  23. use Eccube\Entity\Order;
  24. use Doctrine\ORM\EntityManagerInterface;
  25. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  26. use Symfony\Component\DependencyInjection\ContainerInterface;
  27. class PayJpEvent implements EventSubscriberInterface
  28. {
  29.     /**
  30.      * @var エラーメッセージ
  31.      */
  32.     private $errorMessage null;
  33.     /**
  34.      * @var 国際化
  35.      */
  36.     private static $i18n = array();
  37.     /**
  38.      * @var EntityManagerInterface
  39.      */
  40.     protected $entityManager;
  41.     /**
  42.      * @var PayJpConfigRepository
  43.      */
  44.     protected $payJpConfigRepository;
  45.     /**
  46.      * @var OrderStatusRepository
  47.      */
  48.     private $orderStatusRepository;
  49.     /**
  50.      * @var PayJpOrderRepository
  51.      */
  52.     private $payJpOrderRepository;
  53.     /**
  54.      * @var string ロケール(jaかenのいずれか)
  55.      */
  56.     private $locale 'en';
  57.     /**
  58.      * @var EccubeConfig
  59.      */
  60.     protected $eccubeConfig;
  61.     protected $container;
  62.     public function __construct(
  63.         EccubeConfig $eccubeConfig,
  64.         PayJpConfigRepository $payJpConfigRepository,
  65.         PayJpOrderRepository $payJpOrderRepository,
  66.         OrderStatusRepository $orderStatusRepository,
  67.         EntityManagerInterface $entityManager,
  68.         ContainerInterface $container
  69.     )
  70.     {
  71.         $this->eccubeConfig $eccubeConfig;
  72.         $this->locale=$this->eccubeConfig['locale'];
  73.         $this->payJpConfigRepository $payJpConfigRepository;
  74.         $this->payJpOrderRepository $payJpOrderRepository;
  75.         $this->orderStatusRepository $orderStatusRepository;
  76.         $this->entityManager $entityManager;
  77.         $this->container $container;
  78.     }
  79.     /**
  80.      * @return array
  81.      */
  82.     public static function getSubscribedEvents()
  83.     {
  84.         return [
  85.             'Shopping/index.twig' => 'onShoppingIndexTwig',
  86.             'Shopping/confirm.twig' => 'onShoppingConfirmTwig',
  87.             'front.shopping.complete.initialize'=>'onFrontShoppingCompleteInitialize',
  88.             '@admin/Order/index.twig' => 'onAdminOrderIndexTwig',
  89.             '@admin/Order/edit.twig' => 'onAdminOrderEditTwig'
  90.         ];
  91.     }
  92.     /**
  93.      * @param TemplateEvent $event
  94.      */
  95.     public function onShoppingIndexTwig(TemplateEvent $event)
  96.     {
  97.         $Order=$event->getParameter('Order');
  98.         //dump($Order); die;
  99.         if($Order) {
  100.             if ($Order->getPayment()->getMethodClass() === PayJpCreditCard::class && $this->isEligiblePaymentMethod($Order->getPayment(),$Order->getPaymentTotal())) {
  101.                 /*if(isset($_REQUEST['card_error'])){
  102.                     $this->errorMessage=$_REQUEST['card_error'];
  103.                 }*/
  104.                 $PayJpConfig $this->payJpConfigRepository->get();
  105.                 $payJpCSS 'PayJp42/Resource/assets/css/pay_jp.css.twig';
  106.                 $event->addAsset($payJpCSS);
  107.                 $payJpOfficialJS 'PayJp42/Resource/assets/js/pay_jp_official.js.twig';
  108.                 $event->addAsset($payJpOfficialJS);
  109.                 // JSファイルがなければオンデマンドで生成
  110.                 if (!file_exists($this->getScriptDiskPath())) {
  111.                     $this->makeScript();
  112.                 }
  113.                 $event->setParameter('payJpLocale'$this->locale);
  114.                 $event->setParameter('payJpConfig'$PayJpConfig);
  115.                 $event->setParameter('payJpErrorMessage'$this->errorMessage);
  116.                 $event->setParameter('payJpCreditCardPaymentId'$Order->getPayment()->getId());
  117.                 // $payJpJS= 'PayJp42/Resource/assets/js/pay_jp_' . $this->locale . '.js.twig';
  118.                 // $event->addAsset($payJpJS);
  119.                 // $event->addSnippet('@PayJp42/default/Shopping/pay_jp_credit_card.twig');
  120.             }
  121.         }
  122.     }
  123.     /**
  124.      * @param TemplateEvent $event
  125.      */
  126.     public function onShoppingConfirmTwig(TemplateEvent $event)
  127.     {
  128.         $Order=$event->getParameter('Order');
  129.         if($Order) {
  130.             if ($Order->getPayment()->getMethodClass() === PayJpCreditCard::class) {
  131.                 $PayJpConfig $this->payJpConfigRepository->get();
  132.                 $event->setParameter('payJpConfig'$PayJpConfig);
  133.                 $event->setParameter('payJpErrorMessage'$this->errorMessage);
  134.                 //$event->addSnippet('@PayJp42/default/Shopping/pay_jp_credit_card_confirm.twig');
  135.                 $event->addSnippet('@PayJp42/default/Shopping/shopping.js.twig');
  136.             }
  137.         }
  138.     }
  139.     /**
  140.      * @param EventArgs $event
  141.      */
  142.     public function onFrontShoppingCompleteInitialize(EventArgs $event){
  143.         $Order=$event->getArgument('Order');
  144.         if($Order) {
  145.             if ($Order->getPayment()->getMethodClass() === PayJpCreditCard::class) {
  146.                 $payJpOrder $this->payJpOrderRepository->findOneBy(array('Order'=>$Order));
  147.                 if($payJpOrder) {
  148.                     $payJpChargeID $payJpOrder->getPayJpChargeId();
  149.                     $chargeCaptured $payJpOrder->getIsChargeCaptured();
  150.                     if (!empty($payJpChargeID) && $chargeCaptured) {
  151.                         $Today = new \DateTime();
  152.                         $Order->setPaymentDate($Today);
  153.                         $OrderStatus $this->orderStatusRepository->find(OrderStatus::PAID);
  154.                         $Order->setOrderStatus($OrderStatus);
  155.                         $this->entityManager->persist($Order);
  156.                         $this->entityManager->flush($Order);
  157.                     }
  158.                 }
  159.             }
  160.         }
  161.     }
  162.     /**
  163.      * @param TemplateEvent $event
  164.      */
  165.     public function onAdminOrderIndexTwig(TemplateEvent $event)
  166.     {
  167.         // 表示対象の受注一覧を取得
  168.         $pagination $event->getParameter('pagination');
  169.         if (empty($pagination) || count($pagination) == 0)
  170.         {
  171.             return;
  172.         }
  173.         $OrderToSearch=array();
  174.         foreach ($pagination as $Order){
  175.             $OrderToSearch[] = $Order;
  176.         }
  177.         if (empty($OrderToSearch)) {
  178.             return;
  179.         }
  180.         $PayJpOrders $this->payJpOrderRepository->findBy(array('Order'=>$OrderToSearch));
  181.         if (!$PayJpOrders)
  182.         {
  183.             return;
  184.         }
  185.         $PayJpOrdersMapping = array();
  186.         foreach($PayJpOrders as $payJpOrder) {
  187.             $Order $payJpOrder->getOrder();
  188.             $OrderId $Order->getId();
  189.             $dashboard_url $this->getPayJpChargeDashboardLink() . $payJpOrder->getPayJpChargeId();
  190.             $order_edit_url $this->container->get('router')->generate('admin_order_edit', array('id' => $OrderId), UrlGeneratorInterface::ABSOLUTE_URL);
  191.             $PayJpOrdersMapping[] = (object)[
  192.                 'order_edit_url' => $order_edit_url,
  193.                 'charge_id' => $payJpOrder->getPayJpChargeId(),
  194.                 'dashboard_url' => $dashboard_url,
  195.                 'is_charge_captured' => $payJpOrder->getIsChargeCaptured(),
  196.                 'Order'   =>  $Order,
  197.             ];
  198.         }
  199.         //$event->setParameter('PayJpOrders', $PayJpOrders);
  200.         $event->setParameter('PayJpOrdersMapping'$PayJpOrdersMapping);
  201.         //$event->setParameter('payJpChargeDashboardLink',$this->getPayJpChargeDashboardLink());
  202.         $asset 'PayJp42/Resource/assets/js/admin/order_index.js.twig';
  203.         $event->addAsset($asset);
  204.     }
  205.     /**
  206.      * @param TemplateEvent $event
  207.      */
  208.     public function onAdminOrderEditTwig(TemplateEvent $event)
  209.     {
  210.         // 表示対象の受注情報を取得
  211.         $Order $event->getParameter('Order');
  212.         if (!$Order)
  213.         {
  214.             return;
  215.         }
  216.         $PayJpConfig $this->payJpConfigRepository->getConfigByOrder($Order);
  217.         // EC-CUBE支払方法の取得
  218.         $Payment $Order->getPayment();
  219.         if (!$Payment)
  220.         {
  221.             return;
  222.         }
  223.         if ($Order->getPayment()->getMethodClass() === PayJpCreditCard::class) {
  224.             $PayJpOrder $this->payJpOrderRepository->findOneBy(array('Order'=>$Order));
  225.             if (!$PayJpOrder)
  226.             {
  227.                 return;
  228.             }
  229.             if($PayJpOrder->getIsChargeRefunded()==&& $PayJpOrder->getSelectedRefundOption()==&& $PayJpOrder->getRefundedAmount()==0) {
  230.                 $PayJpOrder->setSelectedRefundOption(1);
  231.                 $PayJpOrder->setRefundedAmount($Order->getPaymentTotal());
  232.                 $this->entityManager->persist($PayJpOrder);
  233.                 $this->entityManager->flush($PayJpOrder);
  234.             }
  235.             $publishableKey=$PayJpConfig->public_api_key;
  236.             if(strpos($publishableKey'live') !== false) {
  237.                 $isLive true;
  238.             } else {
  239.                 $isLive false;
  240.             }
  241.             $event->setParameter('PayJpConfig'$PayJpConfig);
  242.             $event->setParameter('PayJpOrder'$PayJpOrder);
  243.             $event->setParameter('PayJpChargeDashboardLink',$this->getPayJpChargeDashboardLink($isLive));
  244.             $event->addSnippet('@PayJp42/admin/Order/edit.twig');
  245.             //$asset = 'PayJp42/Resource/assets/js/admin/order_edit.js.twig';
  246.             //$event->addAsset($asset);
  247.         }
  248.     }
  249.     private function getScriptDiskPath() {
  250.         return dirname(__FILE__).'/Resource/assets/js/pay_jp_' $this->locale '.js.twig';
  251.     }
  252.     private function makeScript() {
  253.         $buff file_get_contents(dirname(__FILE__) . '/Resource/assets/js/pay_jp.js.twig');
  254.         $out_path $this->getScriptDiskPath();
  255.         $m = array();
  256.         preg_match_all('/\{\{ (\w+) \}\}/'$buff$m);
  257.         for ($i 0$i sizeof($m[0]); $i++) {
  258.             //$buff = str_replace($m[0][$i], self::getLocalizedString($m[1][$i], $this->locale), $buff);
  259.             if($m[1][$i]=='locale'){
  260.                 $buff str_replace($m[0][$i], $this->locale$buff);
  261.             }
  262.         }
  263.         file_put_contents($out_path$buff);
  264.     }
  265.     private function getPayJpChargeDashboardLink(){
  266.         $chargeDashboardLink='https://pay.jp/d/charges/';
  267.         return $chargeDashboardLink;
  268.     }
  269.     public static function getLocalizedString($id$locale) {
  270.         if (! isset(self::$i18n[$locale])) {
  271.             $tmp_loader = new \Symfony\Component\Translation\Loader\YamlFileLoader();
  272.             $catalogue $tmp_loader->load(dirname(__FILE__) . "/Resource/locale/messages.$locale.yml"'ja''pay_jp');
  273.             self::$i18n[$locale] = $catalogue->all('pay_jp');
  274.         }
  275.         if (isset(self::$i18n[$locale][$id])) {
  276.             return self::$i18n[$locale][$id];
  277.         }
  278.         return '--';
  279.     }
  280.     private function isEligiblePaymentMethod(Payment $Payment,$total){
  281.         $min $Payment->getRuleMin();
  282.         $max $Payment->getRuleMax();
  283.         if (null !== $min && $total $min) {
  284.             return false;
  285.         }
  286.         if (null !== $max && $total $max) {
  287.             return false;
  288.         }
  289.         return true;
  290.     }
  291. }