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

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