app/Plugin/StripePaymentGateway42/Controller/Admin/OrderController.php line 100

Open in your IDE?
  1. <?php
  2. /*
  3. * Plugin Name : StripePaymentGateway42
  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\StripePaymentGateway42\Controller\Admin;
  12. use Symfony\Component\Routing\Annotation\Route;
  13. use Eccube\Common\EccubeConfig;
  14. use Eccube\Controller\AbstractController;
  15. use Eccube\Entity\Order;
  16. use Eccube\Entity\Customer;
  17. use Eccube\Entity\Master\OrderStatus;
  18. use Eccube\Repository\OrderRepository;
  19. use Eccube\Repository\Master\OrderStatusRepository;
  20. use Plugin\StripePaymentGateway42\Repository\StripeConfigRepository;
  21. use Plugin\StripePaymentGateway42\Repository\StripeOrderRepository;
  22. use Plugin\StripePaymentGateway42\Entity\StripeCustomer;
  23. use Plugin\StripePaymentGateway42\Entity\StripeOrder;
  24. use Plugin\StripePaymentGateway42\Repository\StripeCustomerRepository;
  25. use Plugin\StripePaymentGateway42\Service\Method\StripeCreditCard;
  26. use Plugin\StripePaymentGateway42\Entity\StripeLog;
  27. use Plugin\StripePaymentGateway42\Entity\StripeConfig;
  28. use Plugin\StripePaymentGateway42\StripeClient;
  29. use Symfony\Component\Routing\RouterInterface;
  30. use Psr\Container\ContainerInterface;
  31. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
  32. use Symfony\Component\HttpFoundation\Request;
  33. use Symfony\Component\HttpFoundation\Response;
  34. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  35. use Eccube\Service\OrderStateMachine;
  36. class OrderController extends AbstractController
  37. {
  38.     /**
  39.      * @var OrderRepository
  40.      */
  41.     protected $orderRepository;
  42.     /**
  43.      * @var OrderStatusRepository
  44.      */
  45.     private $orderStatusRepository;
  46.     /**
  47.      * @var StripeConfigRepository
  48.      */
  49.     protected $stripeConfigRepository;
  50.     /**
  51.      * @var StripeOrderRepository
  52.      */
  53.     private $stripeOrderRepository;
  54.     /**
  55.      * @var StripeCustomerRepository
  56.      */
  57.     private $stripeCustomerRepository;
  58.     /**
  59.      * @var OrderStateMachine
  60.      */
  61.     protected $orderStateMachine;
  62.     /**
  63.      * ConfigController constructor.
  64.      * @param ContainerInterface $container
  65.      * @param OrderStateMachine $orderStateMachine ;
  66.      */
  67.     public function __construct(ContainerInterface $containerOrderStateMachine $orderStateMachine){
  68.         $this->container $container;
  69.         $this->orderStateMachine $orderStateMachine;
  70.         $this->eccubeConfig $this->container->get('Eccube\Common\EccubeConfig');
  71.         $this->translator $this->container->get('translator');
  72.         $this->formFactory $this->container->get('form.factory');
  73.         $this->eventDispatcher $this->container->get('event_dispatcher');
  74.         $this->session $this->container->get('session');
  75.         $this->router $this->container->get('router');
  76.         $this->entityManager $this->container->get('doctrine.orm.entity_manager');
  77.         $this->orderRepository $this->entityManager->getRepository(Order::class);
  78.         $this->orderStatusRepository $this->entityManager->getRepository(OrderStatus::class);
  79.         $this->stripeConfigRepository $this->entityManager->getRepository(StripeConfig::class);
  80.         $this->stripeOrderRepository $this->entityManager->getRepository(StripeOrder::class);
  81.         $this->stripeCustomerRepository $this->entityManager->getRepository(StripeCustomer::class);
  82.     }
  83.     /**
  84.      * @Route("/%eccube_admin_route%/stripe_payment_gateway/order_payment/{id}/capture_transaction", name="stripe_payment_gateway_admin_order_capture")
  85.      */
  86.     public function charge(Request $request$id nullRouterInterface $router)
  87.     {
  88.         //$StripeConfig = $this->stripeConfigRepository->get();
  89. //        $isAuthAndCaptureOn=$StripeConfig->getIsAuthAndCaptureOn();
  90. //        if(!$isAuthAndCaptureOn) {
  91. //            $this->addError('stripe_payment_gateway.admin.order.error.invalid_request', 'admin');
  92. //            return $this->redirectToRoute('admin_order');
  93. //        }
  94.         //BOC check if order exist
  95.         /** @var Order $Order */
  96.         $Order $this->orderRepository->find($id);
  97.         if (null === $Order) {
  98.             $this->addError('stripe_payment_gateway.admin.order.error.invalid_request''admin');
  99.             return $this->redirectToRoute('admin_order');
  100.         }
  101.         $StripeConfig $this->stripeConfigRepository->getConfigByOrder($Order);
  102.         //EOC check if order exist
  103.         //BOC check if Stripe Order
  104.         /** @var StripeOrder $stripeOrder **/
  105.         $stripeOrder $this->stripeOrderRepository->findOneBy(array('Order' => $Order));
  106.         if (null === $stripeOrder) {
  107.             $this->addError('stripe_payment_gateway.admin.order.error.invalid_request''admin');
  108.             return $this->redirectToRoute('admin_order_edit', ['id' => $Order->getId()]);
  109.         }
  110.         //EOC check if Stripe Order
  111.         //BOC check if refunded
  112.         if ($stripeOrder->getIsChargeRefunded()) {
  113.             $this->addError('stripe_payment_gateway.admin.order.error.refunded''admin');
  114.             return $this->redirectToRoute('admin_order_edit', ['id' => $Order->getId()]);
  115.         }
  116.         //EOC check if refunded
  117.         //BOC check if already captured
  118.         if ($stripeOrder->getIsChargeCaptured()) {
  119.             $this->addError('stripe_payment_gateway.admin.order.error.already_captured''admin');
  120.             return $this->redirectToRoute('admin_order_edit', ['id' => $Order->getId()]);
  121.         }
  122.         //EOC check if already captured
  123.         //BOC retrieve and check if captured for order_id already
  124.         $stripeClient = new StripeClient($StripeConfig->secret_key);
  125.         if($stripeClient->isPaymentIntentId($stripeOrder->getStripePaymentIntentId())) { // new version for 3ds2
  126.             $paymentIntent $stripeClient->retrievePaymentIntent($stripeOrder->getStripePaymentIntentId());
  127.             if( is_array($paymentIntent) && isset($paymentIntent['error']) ) {
  128.                 $this->addError(StripeClient::getErrorMessageFromCode($paymentIntent['error'], $this->eccubeConfig['locale']), 'admin');
  129.                 return $this->redirectToRoute('admin_order_edit', ['id' => $Order->getId()]);
  130.             }
  131.             if($paymentIntent->metadata->order==$Order->getId() && $paymentIntent->status=='succeeded'){
  132.                 //BOC update charge id and capture status
  133.                 //foreach($paymentIntent->charges as $charge) {
  134.                     $stripeOrder->setStripeChargeId($paymentIntent->latest_charge);
  135.                     //break;
  136.                 //}
  137.                 $stripeOrder->setIsChargeCaptured(true);
  138.                 $this->entityManager->persist($stripeOrder);
  139.                 $this->entityManager->flush($stripeOrder);
  140.                 //EOC update charge id and capture status
  141.                 //BOC update payment status
  142.                 $stripeChargeID $stripeOrder->getStripeChargeId();
  143.                 if (!empty($stripeChargeID)) {
  144.                     $Today = new \DateTime();
  145.                     $Order->setPaymentDate($Today);
  146.                     $OrderStatus $this->orderStatusRepository->find(OrderStatus::PAID);
  147.                     $Order->setOrderStatus($OrderStatus);
  148.                     $this->entityManager->persist($Order);
  149.                     $this->entityManager->flush($Order);
  150.                 }
  151.                 //EOC update payment status
  152.                 $this->addError('stripe_payment_gateway.admin.order.error.already_captured''admin');
  153.                 return $this->redirectToRoute('admin_order_edit', ['id' => $Order->getId()]);
  154.             }
  155.             //EOC retrieve and check if captured for order_id already
  156.             //BOC capture payment
  157.             $this->writeRequestLog($Order'capturePaymentIntent');
  158.             $paymentIntent $stripeClient->capturePaymentIntent($paymentIntent$Order->getPaymentTotal(), $Order->getCurrencyCode());
  159.             $this->writeResponseLog($Order'capturePaymentIntent'$paymentIntent);
  160.             //EOC capture payment
  161.             //BOC check if error
  162.             if (is_array($paymentIntent) && isset($paymentIntent['error'])) {
  163.                 $errorMessage StripeClient::getErrorMessageFromCode($paymentIntent['error'], $this->eccubeConfig['locale']);
  164.                 $this->addError($errorMessage'admin');
  165.                 return $this->redirectToRoute('admin_order_edit', ['id' => $Order->getId()]);
  166.             } //EOC check if error
  167.             else {
  168.                 //BOC update charge id and capture status
  169.                 //foreach($paymentIntent->charges as $charge) {
  170.                     $stripeOrder->setStripeChargeId($paymentIntent->latest_charge);
  171.                     //break;
  172.                 //}
  173.                 $stripeOrder->setIsChargeCaptured(true);
  174.                 $this->entityManager->persist($stripeOrder);
  175.                 $this->entityManager->flush($stripeOrder);
  176.                 //EOC update charge id and capture status
  177.                 //BOC update payment status
  178.                 $stripeChargeID $stripeOrder->getStripeChargeId();
  179.                 if (!empty($stripeChargeID)) {
  180.                     $Today = new \DateTime();
  181.                     $Order->setPaymentDate($Today);
  182.                     $OrderStatus $this->orderStatusRepository->find(OrderStatus::PAID);
  183.                     $Order->setOrderStatus($OrderStatus);
  184.                     $this->entityManager->persist($Order);
  185.                     $this->entityManager->flush($Order);
  186.                 }
  187.                 //EOC update payment status
  188.                 $this->addSuccess('stripe_payment_gateway.admin.order.success.capture''admin');
  189.                 return $this->redirectToRoute('admin_order_edit', ['id' => $Order->getId()]);
  190.             }
  191.         } else if ($stripeClient->isStripeToken($stripeOrder->getStripePaymentIntentId())) {
  192.             //BOC check if Stripe Customer
  193.             $Customer $Order->getCustomer();
  194.             $isEcCustomer false;
  195.             $isStripeCustomer false;
  196.             if ($Customer instanceof Customer) {
  197.                 $isEcCustomer true;
  198.                 $StripeCustomer $this->stripeCustomerRepository->findOneBy(array('Customer' => $Customer));
  199.                 if ($StripeCustomer instanceof StripeCustomer) {
  200.                     $isStripeCustomer true;
  201.                 }
  202.             }
  203.             //EOC check if Stripe Customer
  204.             //BOC retrieve stripe customer id
  205.             if ($isStripeCustomer) {
  206.                 $stripeCustomerId $StripeCustomer->getStripeCustomerId();
  207.             } else if (!$isEcCustomer && $stripeOrder->getStripeCustomerIdForGuestCheckout()) {
  208.                 $stripeCustomerId $stripeOrder->getStripeCustomerIdForGuestCheckout();
  209.             } else {
  210.                 $this->addError('stripe_payment_gateway.admin.order.error.invalid_request''admin');
  211.                 return $this->redirectToRoute('admin_order_edit', ['id' => $Order->getId()]);
  212.             }
  213.             //EOC retrieve stripe customer id
  214.             //BOC capture payment
  215.             $this->writeRequestLog($Order'createChargeWithCustomer');
  216.             $chargeResult $stripeClient->createChargeWithCustomer($Order->getPaymentTotal(), $stripeCustomerId$Order->getId(), true);
  217.             $this->writeResponseLog($Order'createChargeWithCustomer'$chargeResult);
  218.             //EOC capture payment
  219.             //BOC check if error
  220.             if (is_array($chargeResult) && isset($chargeResult['error'])) {
  221.                 $errorMessage StripeClient::getErrorMessageFromCode($chargeResult['error'], $this->eccubeConfig['locale']);
  222.                 $this->addError($errorMessage'admin');
  223.                 return $this->redirectToRoute('admin_order_edit', ['id' => $Order->getId()]);
  224.             } //EOC check if error
  225.             else {
  226.                 //BOC update charge id and capture status
  227.                 $stripeOrder->setStripeChargeId($chargeResult->__get('id'));
  228.                 $stripeOrder->setIsChargeCaptured(true);
  229.                 $this->entityManager->persist($stripeOrder);
  230.                 $this->entityManager->flush($stripeOrder);
  231.                 //EOC update charge id and capture status
  232.                 //BOC update payment status
  233.                 $stripeChargeID $stripeOrder->getStripeChargeId();
  234.                 if (!empty($stripeChargeID)) {
  235.                     $Today = new \DateTime();
  236.                     $Order->setPaymentDate($Today);
  237.                     $OrderStatus $this->orderStatusRepository->find(OrderStatus::PAID);
  238.                     $Order->setOrderStatus($OrderStatus);
  239.                     $this->entityManager->persist($Order);
  240.                     $this->entityManager->flush($Order);
  241.                 }
  242.                 //EOC update payment status
  243.                 $this->addSuccess('stripe_payment_gateway.admin.order.success.capture''admin');
  244.                 return $this->redirectToRoute('admin_order_edit', ['id' => $Order->getId()]);
  245.             }
  246.         } else {
  247.             $this->addError('stripe_payment_gateway.admin.order.error.invalid_request''admin');
  248.             return $this->redirectToRoute('admin_order');
  249.         }
  250.     }
  251.     /**
  252.      * @Route("/%eccube_admin_route%/stripe_payment_gateway/order_payment/{id}/refund_transaction", name="stripe_payment_gateway_admin_order_refund")
  253.      */
  254.     public function refund(Request $request$id nullRouterInterface $router)
  255.     {
  256.         //$StripeConfig = $this->stripeConfigRepository->get();
  257.         //BOC check if order exist
  258.         $Order $this->orderRepository->find($id);
  259.         if (null === $Order) {
  260.             $this->addError('stripe_payment_gateway.admin.order.error.invalid_request''admin');
  261.             return $this->redirectToRoute('admin_order');
  262.         }
  263.         //EOC check if order exist
  264.         $StripeConfig $this->stripeConfigRepository->getConfigByOrder($Order);
  265.         if ($request->getMethod() == 'POST'){
  266.             //BOC check if Stripe Order
  267.             $stripeOrder $this->stripeOrderRepository->findOneBy(array('Order' => $Order));
  268.             if (null === $stripeOrder) {
  269.                 $this->addError('stripe_payment_gateway.admin.order.error.invalid_request''admin');
  270.                 return $this->redirectToRoute('admin_order_edit', ['id' => $Order->getId()]);
  271.             }
  272.             //EOC check if Stripe Order
  273.             //BOC check if refunded
  274.             if ($stripeOrder->getIsChargeRefunded()) {
  275.                 $this->addError('stripe_payment_gateway.admin.order.error.refunded''admin');
  276.                 return $this->redirectToRoute('admin_order_edit', ['id' => $Order->getId()]);
  277.             }
  278.             //EOC check if refunded
  279.             //BOC retrieve and check if valid charge id and not already refunded
  280.             $stripeClient = new StripeClient($StripeConfig->secret_key);
  281.             $chargeForOrder $stripeClient->retrieveCharge($stripeOrder->getStripeChargeId());
  282.             if (isset($chargeForOrder)) {
  283.                 if ($chargeForOrder->refunded) {
  284.                     //BOC update charge id and capture status
  285.                     $stripeOrder->setIsChargeRefunded(true);
  286.                     $this->entityManager->persist($stripeOrder);
  287.                     $this->entityManager->flush($stripeOrder);
  288.                     //EOC update charge id and capture status
  289.                     //BOC update Order Status
  290.                     $OrderStatus $this->orderStatusRepository->find(OrderStatus::CANCEL);
  291.                     try{
  292.                         if ($this->orderStateMachine->can($Order$OrderStatus)) {
  293.                             $this->orderStateMachine->apply($Order$OrderStatus);
  294.                             $this->entityManager->flush();
  295.                         }
  296.                     } catch (\Exception $e) {
  297.                         log_error($e->getMessage());
  298.                     }
  299.                     //EOC update Order Status
  300.                     $this->addError('stripe_payment_gateway.admin.order.error.refunded''admin');
  301.                     return $this->redirectToRoute('admin_order_edit', ['id' => $Order->getId()]);
  302.                 }
  303.             } else {
  304.                 $this->addError('stripe_payment_gateway.admin.order.error.invalid_request''admin');
  305.                 return $this->redirectToRoute('admin_order_edit', ['id' => $Order->getId()]);
  306.             }
  307.             //EOC retrieve and check if valid charge id and not already refunded
  308.             //BOC refund option and amount calculation
  309.             $refund_option $request->request->get('refund_option');
  310.             $refund_amount 0;
  311.             //BOC partial refund
  312.             if ($refund_option == 3) {
  313.                 $refund_amount $request->request->get('refund_amount');
  314.                 if (empty($refund_amount) || !is_int($refund_amount+0)) {
  315.                     $this->addError('stripe_payment_gateway.admin.order.refund_amount.error.invalid''admin');
  316.                     return $this->redirectToRoute('admin_order_edit', ['id' => $Order->getId()]);
  317.                 } else if($refund_amount>$Order->getPaymentTotal()){
  318.                     $this->addError('stripe_payment_gateway.admin.order.refund_amount.error.exceeded''admin');
  319.                     return $this->redirectToRoute('admin_order_edit', ['id' => $Order->getId()]);
  320.                 }
  321.             }
  322.             //EOC partial refund
  323.             //BOC calculate refund amount based on fees entered
  324.             if($refund_option==2){
  325.                 if($StripeConfig->stripe_fees_percent == 0){
  326.                     $this->addError('stripe_payment_gateway.admin.order.refund_option.error.invalid''admin');
  327.                     return $this->redirectToRoute('admin_order_edit', ['id' => $Order->getId()]);
  328.                 }
  329.                 $refund_amount=floor($Order->getPaymentTotal()-($Order->getPaymentTotal()*($StripeConfig->stripe_fees_percent/100)));
  330.             }
  331.             //EOC calculate refund amount based on fees entered
  332.             //BOC full refund option
  333.             if($refund_option==1){
  334.                 $refund_amount=floor($Order->getPaymentTotal());
  335.             }
  336.             //EOC full refund option
  337.             //BOC refund option and amount calculation
  338.             //BOC refund payment
  339.             $this->writeRequestLog($Order'createRefundForCharge');
  340.             $chargeResult $stripeClient->createRefund($stripeOrder->getStripeChargeId(),$refund_amount,$Order->getCurrencyCode());
  341.             $this->writeResponseLog($Order'createRefundForCharge'$chargeResult);
  342.             //EOC refund payment
  343.             //BOC check if error
  344.             if (is_array($chargeResult) && isset($chargeResult['error'])) {
  345.                 $errorMessage StripeClient::getErrorMessageFromCode($chargeResult['error'], $this->eccubeConfig['locale']);
  346.                 $this->addError($errorMessage'admin');
  347.                 return $this->redirectToRoute('admin_order_edit', ['id' => $Order->getId()]);
  348.             }
  349.             //EOC check if error
  350.             //BOC update charge id and capture status
  351.             $stripeOrder->setIsChargeRefunded(true);
  352.             $stripeOrder->setSelectedRefundOption($refund_option);
  353.             $stripeOrder->setRefundedAmount($refund_amount);
  354.             $this->entityManager->persist($stripeOrder);
  355.             $this->entityManager->flush($stripeOrder);
  356.             //EOC update charge id and capture status
  357.             //BOC update Order Status
  358.             $OrderStatus $this->orderStatusRepository->find(OrderStatus::CANCEL);
  359.             try{
  360.                 if ($this->orderStateMachine->can($Order$OrderStatus)) {
  361.                     $this->orderStateMachine->apply($Order$OrderStatus);
  362.                     $this->entityManager->flush();
  363.                 }
  364.             } catch (\Exception $e) {
  365.                 log_error($e->getMessage());
  366.             }
  367.             //EOC update Order Status
  368.             $this->addSuccess('stripe_payment_gateway.admin.order.success.capture''admin');
  369.             return $this->redirectToRoute('admin_order_edit', ['id' => $Order->getId()]);
  370.         } else {
  371.             $this->addError('stripe_payment_gateway.admin.order.error.invalid_request''admin');
  372.             return $this->redirectToRoute('admin_order');
  373.         }
  374.     }
  375.     private function writeRequestLog(Order $order$api) {
  376.         $logMessage '[Order' $order->getId() . '][' $api '] リクエスト実行';
  377.         log_info($logMessage);
  378.         $stripeLog = new StripeLog();
  379.         $stripeLog->setMessage($logMessage);
  380.         $stripeLog->setCreatedAt(new \DateTime());
  381.         $this->entityManager->persist($stripeLog);
  382.     }
  383.     private function writeResponseLog(Order $order$api$result) {
  384.         $logMessage '[Order' $order->getId() . '][' $api '] ';
  385.         if (is_object($result)) {
  386.             $logMessage .= '成功';
  387.         } elseif (! is_array($result)) {
  388.             $logMessage .= print_r($resulttrue);
  389.         } elseif (isset($result['error'])) {
  390.             $logMessage .= $result['error']['message'];
  391.         } else {
  392.             $logMessage .= '成功';
  393.         }
  394.         log_info($logMessage);
  395.         $stripeLog = new StripeLog();
  396.         $stripeLog->setMessage($logMessage);
  397.         $stripeLog->setCreatedAt(new \DateTime());
  398.         $this->entityManager->persist($stripeLog);
  399.     }
  400. }