app/Plugin/GmoEpsilon4/Controller/PaymentController.php line 118

Open in your IDE?
  1. <?php
  2. namespace Plugin\GmoEpsilon4\Controller;
  3. use Eccube\Common\EccubeConfig;
  4. use Eccube\Controller\AbstractController;
  5. use Eccube\Entity\Master\OrderStatus;
  6. use Eccube\Entity\Order;
  7. use Eccube\Repository\Master\OrderStatusRepository;
  8. use Eccube\Repository\OrderRepository;
  9. use Eccube\Service\CartService;
  10. use Eccube\Service\MailService;
  11. use Eccube\Service\PurchaseFlow\PurchaseContext;
  12. use Eccube\Service\PurchaseFlow\PurchaseFlow;
  13. use Eccube\Service\ShoppingService;
  14. use Plugin\GmoEpsilon4\Repository\ConfigRepository;
  15. use Plugin\GmoEpsilon4\Service\GmoEpsilonRequestService;
  16. use Plugin\GmoEpsilon4\Util\PaymentUtil;
  17. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
  18. use Symfony\Component\HttpFoundation\RedirectResponse;
  19. use Symfony\Component\HttpFoundation\Request;
  20. use Symfony\Component\HttpFoundation\Response;
  21. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  22. use Twig_Environment;
  23. /**
  24.  * リンク式決済の注文/戻る/完了通知を処理する.
  25.  */
  26. class PaymentController extends AbstractController
  27. {
  28.     /**
  29.      * @var OrderRepository
  30.      */
  31.     protected $orderRepository;
  32.     /**
  33.      * @var OrderStatusRepository
  34.      */
  35.     protected $orderStatusRepository;
  36.     /**
  37.      * @var PurchaseFlow
  38.      */
  39.     protected $purchaseFlow;
  40.     /**
  41.      * @var CartService
  42.      */
  43.     protected $cartService;
  44.     /**
  45.      * PaymentController constructor.
  46.      *
  47.      * @param OrderRepository $orderRepository
  48.      * @param ShoppingService $shoppingService
  49.      */
  50.     public function __construct(
  51.         EccubeConfig $eccubeConfig,
  52.         Twig_Environment $twig,
  53.         OrderRepository $orderRepository,
  54.         OrderStatusRepository $orderStatusRepository,
  55.         PurchaseFlow $shoppingPurchaseFlow,
  56.         CartService $cartService,
  57.         MailService $mailService,
  58.         ConfigRepository $configRepository,
  59.         GmoEpsilonRequestService $gmoEpsilonRequestService
  60.     ) {
  61.         $this->eccubeConfig $eccubeConfig;
  62.         $this->twig $twig;
  63.         $this->orderRepository $orderRepository;
  64.         $this->orderStatusRepository $orderStatusRepository;
  65.         $this->purchaseFlow $shoppingPurchaseFlow;
  66.         $this->cartService $cartService;
  67.         $this->mailService $mailService;
  68.         $this->gmoEpsilonRequestService $gmoEpsilonRequestService;
  69.         $this->Config $configRepository->get();
  70.         $this->objPayUtil = new PaymentUtil($this->eccubeConfig);
  71.     }
  72.     /**
  73.      * @Route("/shopping/epsilon_payment/back", name="gmo_epsilon4_back")
  74.      *
  75.      * @param Request $request
  76.      *
  77.      * @return RedirectResponse
  78.      */
  79.     public function back(Request $request)
  80.     {
  81.         $orderId $this->objPayUtil->getOrderId($request->get('order_number'));
  82.         $Order $this->getOrderByNo($orderId);
  83.         if (!$Order) {
  84.             throw new NotFoundHttpException();
  85.         }
  86.         if ($this->getUser() != $Order->getCustomer()) {
  87.             throw new NotFoundHttpException();
  88.         }
  89.         // 受注ステータスを購入処理中へ変更
  90.         $OrderStatus $this->orderStatusRepository->find(OrderStatus::PROCESSING);
  91.         $Order->setOrderStatus($OrderStatus);
  92.         // purchaseFlow::rollbackを呼び出し, 購入処理をロールバックする.
  93.         $this->purchaseFlow->rollback($Order, new PurchaseContext());
  94.         $this->entityManager->flush();
  95.         return $this->redirectToRoute('shopping');
  96.     }
  97.     /**
  98.      * 完了画面へ遷移する.
  99.      *
  100.      * @Route("/shopping/epsilon_payment/complete", name="gmo_epsilon4_complete")
  101.      */
  102.     public function complete(Request $request)
  103.     {
  104.         $orderId $this->objPayUtil->getOrderId($request->get('order_number'));
  105.         logs('gmo_epsilon')->addInfo('決済完了通知 : start.'.print_r($request->getContent(),true));
  106.         if (empty($orderId)) {
  107.             // コンビニ(後払い系も?)の場合、sessionからorderNoを拾う
  108.             $orderId $this->session->get('eccube.plugin.epsilon.orderId', []);
  109.         }
  110.         logs('gmo_epsilon')->addInfo('orderId='.$orderId);
  111.         // 決済処理中の受注を取得
  112.         $Order $this->getOrderByNo($orderId);
  113.         if (!$Order || empty($Order)) {
  114.             // レスポンスにorder_numberが含まれていない決済を考慮してオーダー情報確認CGIから受注番号を取得
  115.             $arrXML $this->getOrderInfo($request->get('trans_code'));
  116.             $err_code $this->gmoEpsilonRequestService->getXMLValue($arrXML'RESULT''ERR_CODE');
  117.             if (empty($err_code)) {
  118.                 $orderNo $this->gmoEpsilonRequestService->getXMLValue($arrXML'RESULT''ORDER_NUMBER');
  119.                 $orderId $this->objPayUtil->getOrderId($orderNo);
  120.                 //$Order = $this->orderRepository->find($orderId);
  121.                 // 決済処理中の受注を取得
  122.                 $Order $this->getOrderByNo($orderId);
  123.             }
  124.             if (!$Order || empty($Order)) {
  125.                 logs('gmo_epsilon')->addInfo('NotFoundHttpException : オーダー情報が取得できない');
  126.                 throw new NotFoundHttpException();
  127.             }
  128.         }
  129.         if ($this->getUser() != $Order->getCustomer()) {
  130.             throw new NotFoundHttpException();
  131.         }
  132.         if (!is_null($Order->getPayment())) {
  133.             $method_class $Order->getPayment()->getMethodClass();
  134.             // 決済方法に応じたインスタンスを取得
  135.             $PaymentMethod $this->container->get($method_class);
  136.             $PaymentMethod->setOrder($Order);
  137.             $PaymentMethod->setRequest($request);
  138.             // メールリンク決済の場合、選択された支払方法を取得
  139.             if (preg_match('/Maillink/'$method_class)) {
  140.                 $arrXML $this->getOrderInfo($request->get('trans_code'));
  141.                 // エラーチェック
  142.                 $err_code $this->gmoEpsilonRequestService->getXMLValue($arrXML'RESULT''ERR_CODE');
  143.                 if (empty($err_code)) {
  144.                     $PaymentMethod->payment_code $this->gmoEpsilonRequestService->getXMLValue($arrXML'RESULT''PAYMENT_CODE');
  145.                 }
  146.             }
  147.         }
  148.         // 購入完了処理
  149.         $PaymentMethod->compProcess();
  150.         // FIXME 完了画面を表示するため, 受注IDをセッションに保持する
  151.         $this->session->set('eccube.front.shopping.order.id'$Order->getId());
  152.         $this->entityManager->flush();
  153.         return $this->redirectToRoute('shopping_complete');
  154.     }
  155.     /**
  156.      * 結果通知URLを受け取る.
  157.      *
  158.      * @Route("/epsilon_receive_complete", name="gmo_epsilon4_receive_complete")
  159.      */
  160.     public function receiveComplete(Request $request)
  161.     {
  162.         logs('gmo_epsilon')->addInfo('決済完了通知 : start.');
  163.         // 注文完了画面の処理と競合するため、処理を遅らせる
  164.         sleep(2);
  165.         // 決済会社から受注番号を受け取る
  166.         $orderId $this->objPayUtil->getOrderId($request->get('order_number'));
  167.         logs('gmo_epsilon')->addInfo('orderId='.$orderId);
  168.         $Order $this->getOrderByNo($orderId);
  169.         if (!$Order || empty($Order)) {
  170.             //$Order = $this->orderRepository->findOneBy(['order_no' => $orderId]);
  171.             $Order $this->getOrderByNo($orderId);
  172.             if (!$Order || empty($Order)) {
  173.                 logs('gmo_epsilon')->error('決済完了通知 : Not Found Order. POST param argument ' print_r($request->getContent(), true));
  174.                 // 異常応答
  175.                 return new Response(0);
  176.             }
  177.             logs('gmo_epsilon')->addInfo('決済完了通知 : end. 対象データ処理済み');
  178.             // 正常終了 完了画面で処理済み
  179.             return new Response(1);
  180.         }
  181.         $contract_code $this->Config->getContractCode();
  182.         if ($contract_code != $request->get('contract_code') ||
  183.                 empty($request->get('trans_code')) ||
  184.                 empty($request->get('state'))
  185.         ) {
  186.             logs('gmo_epsilon')->error('決済完了通知 : POST param argument ' print_r($request->getContent(), true));
  187.             // 異常応答
  188.             return new Response(0);
  189.         }
  190.         // purchaseFlow::commitを呼び出し, 購入処理を完了させる.
  191.         $this->purchaseFlow->commit($Order, new PurchaseContext());
  192.         // 受注ステータスを新規受付へ変更
  193.         $OrderStatus $this->orderStatusRepository->find(OrderStatus::NEW);
  194.         $Order->setOrderStatus($OrderStatus);
  195.         $Order->setPaymentDate(new \DateTime());
  196.         // 会員の場合、購入回数、購入金額などを更新
  197.         if ($Customer $Order->getCustomer()) {
  198.             $this->orderRepository->updateOrderSummary($Customer);
  199.         }
  200.         // トランザクションコードを登録
  201.         $Order->setTransCode($request->get('trans_code'));
  202.         // カートを削除する
  203.         $this->cartService->clear();
  204.         // メール送信
  205.         $MailHistory $this->mailService->sendOrderMail($Order);
  206.         $this->entityManager->flush();
  207.         logs('gmo_epsilon')->addInfo('決済完了通知 : end.');
  208.         // 正常応答
  209.         return new Response(1);
  210.     }
  211.     /**
  212.      * 結果通知URLを受け取る.
  213.      *
  214.      * @Route("/epsilon_receive_conveni_and_payeasy_complete", name="gmo_epsilon4_receive_conveni_and_payeasy_complete")
  215.      */
  216.     public function receiveConveniAndPayeasyComplete(Request $request)
  217.     {
  218.         logs('gmo_epsilon')->addInfo('決済完了通知(コンビニ、ペイジー) : start.');
  219.         // 受注情報を取得
  220.         $Order $this->orderRepository->findOneBy([
  221.             'order_no' => $this->objPayUtil->getOrderId($request->get('order_number')),
  222.             'trans_code' => $request->get('trans_code'),
  223.         ]);
  224.         if (!$Order) {
  225.             logs('gmo_epsilon')->error('決済完了通知 : Not Found Order. POST param argument ' print_r($request->getContent(), true));
  226.             // 異常応答
  227.             return new Response(0);
  228.         }
  229.         // 受注ステータスを対応中へ変更
  230.         $OrderStatus $this->orderStatusRepository->find(OrderStatus::IN_PROGRESS);
  231.         $Order->setOrderStatus($OrderStatus);
  232.         $Order->setPaymentDate(new \DateTime());
  233.         $this->entityManager->flush();
  234.         logs('gmo_epsilon')->addInfo('決済完了通知(コンビニ、ペイジー) : end.');
  235.         // 正常応答
  236.         return new Response(1);
  237.     }
  238.     /**
  239.      * 注文番号で受注を検索する.
  240.      *
  241.      * @param $orderId
  242.      *
  243.      * @return Order
  244.      */
  245.     private function getOrderByNo($orderId)
  246.     {
  247.         /** @var OrderStatus $pendingOrderStatus */
  248.         $pendingOrderStatus $this->orderStatusRepository->find(OrderStatus::PENDING);
  249.         /** @var Order $Order */
  250.         $Order $this->orderRepository->findOneBy([
  251.             'order_no' => $orderId,
  252.             'OrderStatus' => $pendingOrderStatus,
  253.         ]);
  254.         return $Order;
  255.     }
  256.     function getOrderInfo($trans_code)
  257.     {
  258.         $info_conf_url $this->Config->getInfoConfUrl();
  259.         $contract_code $this->Config->getContractCode();
  260.         // リクエストパラメータを設定
  261.         $arrParameter = array(
  262.             'contract_code' => $contract_code,
  263.             'trans_code' => $trans_code,
  264.         );
  265.         // リクエスト送信
  266.         $arrXML $this->gmoEpsilonRequestService->sendData($info_conf_url$arrParameter);
  267.         return $arrXML;
  268.     }
  269. }