app/Plugin/VeriTrans4G2/Service/Payment/BaseService.php line 865

Open in your IDE?
  1. <?php
  2. /*
  3.  * Copyright (c) 2018 VeriTrans Inc., a Digital Garage company. All rights reserved.
  4.  * http://www.veritrans.co.jp/
  5.  */
  6. namespace Plugin\VeriTrans4G2\Service\Payment;
  7. use Doctrine\DBAL\Exception\DriverException;
  8. use Doctrine\DBAL\Exception\LockWaitTimeoutException;
  9. use Doctrine\DBAL\LockMode;
  10. use Plugin\VeriTrans4G2\Entity\Vt4gPaymentMethod;
  11. use Plugin\VeriTrans4G2\Entity\Vt4gOrderPayment;
  12. use Plugin\VeriTrans4G2\Entity\Vt4gOrderLog;
  13. use Eccube\Entity\Order;
  14. use Eccube\Entity\Master\OrderStatus;
  15. use Eccube\Service\MailService;
  16. use Eccube\Service\PurchaseFlow\PurchaseContext;
  17. use Eccube\Service\PurchaseFlow\PurchaseFlow;
  18. use Eccube\Security\Core\Encoder\PasswordEncoder;
  19. use Eccube\Service\CartService;
  20. use Symfony\Component\DependencyInjection\ContainerInterface;
  21. use Symfony\Component\HttpFoundation\Response;
  22. use Symfony\Component\Mailer\MailerInterface;
  23. use tgMdk\TGMDK_Transaction;
  24. use tgMdk\dto\BankAuthorizeRequestDto;
  25. use tgMdk\dto\CvsAuthorizeRequestDto;
  26. use tgMdk\dto\CardCancelRequestDto;
  27. use tgMdk\dto\CvsCancelRequestDto;
  28. use tgMdk\dto\UpopCancelRequestDto;
  29. use tgMdk\dto\RakutenCancelRequestDto;
  30. use tgMdk\dto\RecruitCancelRequestDto;
  31. use tgMdk\dto\LinepayCancelRequestDto;
  32. use tgMdk\dto\AlipayRefundRequestDto;
  33. use tgMdk\dto\PaypalCancelRequestDto;
  34. use tgMdk\dto\PaypayCancelRequestDto;
  35. use tgMdk\dto\UpopCaptureRequestDto;
  36. use tgMdk\dto\RakutenCaptureRequestDto;
  37. use tgMdk\dto\RecruitCaptureRequestDto;
  38. use tgMdk\dto\LinepayCaptureRequestDto;
  39. use tgMdk\dto\PaypalCaptureRequestDto;
  40. use tgMdk\dto\UpopRefundRequestDto;
  41. use tgMdk\dto\PaypalRefundRequestDto;
  42. use tgMdk\dto\PaypayCaptureRequestDto;
  43. use tgMdk\dto\PaypayRefundRequestDto;
  44. use tgMdk\dto\RakutenUpdateAuthorizeRequestDto;
  45. use Twig\Environment;
  46. /**
  47.  * 決済処理 基底クラス
  48.  */
  49. class BaseService
  50. {
  51.     public $mailData = [];
  52.     public $logData  = [];
  53.     public $timeKey '';
  54.     public $isPaymentRecv false;
  55.     /**
  56.      * コンテナ
  57.      */
  58.     protected $container;
  59.     /**
  60.      * エンティティーマネージャー
  61.      */
  62.     protected $em;
  63.     /**
  64.      * 汎用処理用サービス
  65.      */
  66.     protected $util;
  67.     /**
  68.      * VT用固定値配列
  69.      */
  70.     protected $vt4gConst;
  71.     /**
  72.      * MDK Logger
  73.      */
  74.     protected $mdkLogger;
  75.     /**
  76.      * パスワードエンコーダ
  77.      */
  78.     protected $passwordEncoder;
  79.     /**
  80.      * カートサービス
  81.      */
  82.     protected $cartService;
  83.     /**
  84.      * メールサービス
  85.      */
  86.     protected $mailService;
  87.     /**
  88.      * 決済結果
  89.      */
  90.     protected $paymentResult;
  91.     /**
  92.      * 決済エラー時デフォルトメッセージ
  93.      */
  94.     protected $defaultErrorMessage;
  95.     /**
  96.      * @var PurchaseFlow
  97.      */
  98.     protected $purchaseFlow;
  99.     /**
  100.      * メーラー
  101.      */
  102.     protected $mailer;
  103.     /**
  104.      * @var Environment twigオブジェクト
  105.      */
  106.     protected $twig;
  107.     /**
  108.      * コンストラクタ
  109.      *
  110.      * @param ContainerInterface $container
  111.      * @param PurchaseFlow $shoppingPurchaseFlow
  112.      * @param PasswordEncoder $passwordEncoder
  113.      * @param CartService $cartService
  114.      * @param MailService $mailService
  115.      * @param MailerInterface $mailer
  116.      *
  117.      * @return void
  118.      */
  119.     public function __construct(
  120.         ContainerInterface $container,
  121.         PurchaseFlow $shoppingPurchaseFlow,
  122.         PasswordEncoder $passwordEncoder,
  123.         CartService $cartService,
  124.         MailService $mailService,
  125.         MailerInterface $mailer,
  126.         Environment $twig
  127.     ){
  128.         $this->container $container;
  129.         $mdkService $this->container->get('vt4g_plugin.service.vt4g_mdk');
  130.         $mdkService->checkMdk();
  131.         $this->mdkLogger $mdkService->getMdkLogger();
  132.         $this->util $container->get('vt4g_plugin.service.util');
  133.         $this->passwordEncoder $passwordEncoder;
  134.         $this->cartService $cartService;
  135.         $this->mailService $mailService;
  136.         $this->mailer $mailer;
  137.         $this->em $container->get('doctrine.orm.entity_manager');
  138.         $this->vt4gConst $this->container->getParameter('vt4g_plugin.const');
  139.         $this->purchaseFlow $shoppingPurchaseFlow;
  140.         $this->defaultErrorMessage trans('vt4g_plugin.payment.shopping.error');
  141.         $this->twig $twig;
  142.     }
  143.     /**
  144.      * 各決済方法の共通チェック処理
  145.      *
  146.      * @param  object         $cartService CartServiceクラスインスタンス
  147.      * @param  object         $order       注文データ
  148.      * @return boolean|object              チェック結果|ビューレスポンス
  149.      */
  150.     public function checkPaymentData($cartService$order)
  151.     {
  152.         // 注文データが存在しない場合
  153.         if (empty($order)) {
  154.             return $this->makeErrorResponse();
  155.         }
  156.         // 注文ステータスを取得
  157.         $orderStatus $order->getOrderStatus()->getId();
  158.         // 新規受付
  159.         $isNew $orderStatus == OrderStatus::NEW;
  160.         // 入金済み
  161.         $isPaid $orderStatus == OrderStatus::PAID;
  162.         // 決済処理中
  163.         $isPending $orderStatus == OrderStatus::PENDING;
  164.         // 新規受付 or 入金済み or 決済処理中以外の場合はエラー画面を表示
  165.         return !($isNew || $isPaid || $isPending)
  166.             ? $this->makeErrorResponse()
  167.             : true;
  168.     }
  169.     /**
  170.      * 管理画面からの決済操作時の更新処理
  171.      *
  172.      * @param  object $orderPayment    決済データ
  173.      * @param  object $operationResult MDKリクエスト結果データ
  174.      * @param  object $orderStatus 注文ステータス
  175.      * @return void
  176.      */
  177.     public function updateByAdmin($orderPayment$operationResult$orderStatus='')
  178.     {
  179.         $payStatus $operationResult['payStatus'];
  180.         $hasCaptureTotal = isset($operationResult['captureTotal']);
  181.         $hasCardAmout = isset($operationResult['card_amount']);
  182.         if ($hasCaptureTotal) {
  183.             $memo10 unserialize($orderPayment->getMemo10());
  184.             $memo10['captureTotal'] = $operationResult['captureTotal'];
  185.             // 返金操作 かつ 残りの金額がある場合は「売上」・ない場合は「取消」
  186.             if ($payStatus == $this->vt4gConst['VT4G_PAY_STATUS']['REFUND']['VALUE']) {
  187.                 $payStatus $operationResult['captureTotal'] == 0
  188.                     $this->vt4gConst['VT4G_PAY_STATUS']['CANCEL']['VALUE']
  189.                     : $this->vt4gConst['VT4G_PAY_STATUS']['CAPTURE']['VALUE'];
  190.             }
  191.             // 取消の場合 売上時金額を0にする
  192.             if ($payStatus == $this->vt4gConst['VT4G_PAY_STATUS']['CANCEL']['VALUE']) {
  193.                 $memo10['captureTotal'] = 0;
  194.             }
  195.         } else if ($hasCardAmout) {
  196.             $memo10 unserialize($orderPayment->getMemo10());
  197.             $memo10['card_amount'] = $operationResult['card_amount'];
  198.         }
  199.         if ($operationResult['isNewly'] ?? false) {
  200.             $orderPayment->setMemo01($operationResult['orderId']);
  201.             if (isset($operationResult['customerId'])) {
  202.                 $orderPayment->setMemo02($operationResult['customerId']);
  203.             }
  204.             $orderPayment->setMemo06(serialize($this->mailData));
  205.             if($hasCardAmout) {
  206.                 $memo10['card_type'] = $operationResult['card_type'];
  207.                 $orderPayment->setMemo07($operationResult['cardNumber']);
  208.             }
  209.             if(isset($operationResult['rollbackDate'])) {
  210.                 $orderPayment->setRollbackDate($operationResult['rollbackDate']);
  211.             }
  212.         }
  213.         $orderPayment->setMemo04($payStatus);
  214.         $orderPayment->setMemo05(serialize($operationResult));
  215.         if ($hasCaptureTotal || $hasCardAmout) {
  216.             $orderPayment->setMemo10(serialize($memo10));
  217.         }
  218.         $this->em->persist($orderPayment);
  219.         //決済ステータスが売上に更新し、注文ステータスが新規受付の場合は注文ステータスを入金済に変更する。
  220.         if($orderStatus === OrderStatus::NEW && $payStatus === $this->vt4gConst['VT4G_PAY_STATUS']['CAPTURE']['VALUE']){
  221.             $orderStatus $this->em->getRepository(OrderStatus::class)->find(OrderStatus::PAID);
  222.             if(!empty($orderStatus)){
  223.                 $this->em->getRepository(Order::class)->changeStatus($orderPayment->getOrderId(), $orderStatus);
  224.             }
  225.         }
  226.         // ログ情報
  227.         $orderLog = new Vt4gOrderLog;
  228.         $orderLog->setOrderId($orderPayment->getOrderId());
  229.         $orderLog->setVt4gLog(serialize($this->logData));
  230.         $this->em->persist($orderLog);
  231.     }
  232.     /**
  233.      * MDK仕様の受注番号を返す
  234.      *
  235.      * @param  integer $orderId 受注番号
  236.      * @return string         MDK仕様の受注番号
  237.      */
  238.     protected function getMdkOrderId($orderId)
  239.     {
  240.         $pluginSetting $this->util->getPluginSetting();
  241.         $orderIdPrefix $pluginSetting['vt4g_order_id_prefix'];
  242.         // ランダム文字列を生成
  243.         $random bin2hex($this->passwordEncoder->createSalt(4));
  244.         // プレフィックス + ランダム文字列 + 0埋めされた受注番号
  245.         return $orderIdPrefix.$random.$this->util->zeroPadding($orderId11);
  246.     }
  247.     /**
  248.      * 注文ステータスの変更
  249.      *
  250.      * @param  object  $order       注文データ
  251.      * @param  integer $withCapture 処理区分
  252.      * @return boolean              変更したかどうか
  253.      */
  254.     protected function setNewOrderStatus($order$withCapture)
  255.     {
  256.         $paymentMethod $this->util->getPaymentMethod($order->getPayment()->getId());
  257.         // 各決済の新規注文時の決済ステータスを判定
  258.         $status $this->getNewOrderStatus($paymentMethod$withCapture);
  259.         // ステータスの設定が存在しなければエラー
  260.         if (empty($status)) {
  261.             return false;
  262.         }
  263.         // ステータスの登録
  264.         $orderStatus $this->em->getRepository(OrderStatus::class)->find($status);
  265.         if (empty($orderStatus)) {
  266.             return false;
  267.         }
  268.         $nowOrderStatusId $order->getOrderStatus()->getId();
  269.         if ($nowOrderStatusId === OrderStatus::NEW || $nowOrderStatusId === OrderStatus::PENDING) {
  270.             $this->em->getRepository(Order::class)->changeStatus($order->getId(), $orderStatus);
  271.         }
  272.         return true;
  273.     }
  274.     /**
  275.      * レスポンスの初期化
  276.      *
  277.      * @return array 初期化されたレスポンス
  278.      */
  279.     protected function initPaymentResult()
  280.     {
  281.         $this->paymentResult = [
  282.             'isOK'        => false,
  283.             'vResultCode' => 'error',
  284.             'mErrMsg'     => trans('vt4g_plugin.payment.shopping.system.error')
  285.         ];
  286.         return $this->paymentResult;
  287.     }
  288.     /**
  289.      * 受注完了処理
  290.      *
  291.      * @param  Order  $order    注文データ
  292.      * @param  Vt4gOrderPayment $orderPayment 注文に紐づく決済データ
  293.      * @param  array  $payment  処理中の決済データ
  294.      * @param  array  $logData  ログ情報
  295.      * @param  array  $mailData メール情報
  296.      * @param  string $token    MDKトークン
  297.      * @return void
  298.      */
  299.     protected function completeOrder($order$orderPayment$payment$logData = [], $mailData = [], $token '')
  300.     {
  301.         // メッセージ追加(結果通知のときは画面を出さないので追加しない)
  302.         if (!$this->isPaymentRecv) {
  303.             $payment['orderCompleteFlg'] = true;
  304.             $this->addOrderCompleteMessage($order);
  305.         }
  306.         try {
  307.             // 受注更新
  308.             $this->updateOrder($order$orderPayment$payment$logData$mailData$token);
  309.         } catch (\Doctrine\DBAL\Exception $e) {
  310.             $msg $e->getMessage();
  311.             if(strpos($msg,'deadlock') !== false || strpos($msg,'Deadlock') !== false) {
  312.                 $this->isPaymentRecv
  313.                     $this->mdkLogger->info(sprintf(trans('vt4g_plugin.db.deadlock'),'結果通知'))
  314.                     : $this->mdkLogger->info(sprintf(trans('vt4g_plugin.db.deadlock'),'決済センター戻り'));
  315.             } else {
  316.                 $this->mdkLogger->error($e->getMessage());
  317.                 throw $e;
  318.             }
  319.         }
  320.         // カートを削除
  321.         $cartService $this->cartService;
  322.         $cartService->clear();
  323.         // メール送信
  324.         if ($this->shouldSendMail($order$orderPayment)) {
  325.             $this->sendOrderMail($order);
  326.             $this->updateSentOrderMailToSent($orderPayment);
  327.         }
  328.         if (!$this->isPaymentRecv) {
  329.             $this->em->commit();
  330.         }
  331.     }
  332.     /**
  333.      * 決済情報への追加処理
  334.      *
  335.      * @param  Order            $order    注文データ
  336.      * @param  Vt4gOrderPayment $orderPayment 注文に紐づく決済データ
  337.      * @param  array            $payment  処理中の決済データ
  338.      * @param  array            $logData  ログ情報
  339.      * @param  array            $mailData メール情報
  340.      * @param  string           $token    MDKトークン
  341.      * @return Vt4gOrderPayment           決済情報
  342.      */
  343.     protected function setOrderPayment($order$orderPayment$payment$logData = [], $mailData = [], $token '')
  344.     {
  345.         $paymentMethod $this->em->getRepository(Vt4gPaymentMethod::class)->find($order->getPayment()->getId());
  346.         $customer $order->getCustomer();
  347.         if (empty($payment)) {
  348.             return $orderPayment;
  349.         }
  350.         // 各カラムに値を設定
  351.         $orderPayment->setOrderId($order->getId());
  352.         $orderPayment->setMemo01($payment['orderId']);
  353.         if (!empty($customer)) {
  354.             $orderPayment->setMemo02($customer->getId());
  355.         }
  356.         $orderPayment->setMemo03($paymentMethod->getMemo03());
  357.         if (isset($payment['payStatus']) && empty($orderPayment->getMemo04())) {
  358.             $orderPayment->setMemo04($payment['payStatus']);
  359.         }
  360.         $orderPayment->setMemo05(serialize($payment));
  361.         if (!empty($mailData)) {
  362.             $orderPayment->setMemo06(serialize($mailData));
  363.         }
  364.         if (isset($payment['cardNumber'])) {
  365.             $orderPayment->setMemo07($payment['cardNumber']);
  366.         }
  367.         if (!empty($token)) {
  368.             $orderPayment->setMemo08($token);
  369.         }
  370.         if (isset($payment['captureTotal'])) {
  371.             $memo10 unserialize($orderPayment->getMemo10());
  372.             $memo10['captureTotal'] = $payment['captureTotal'];
  373.             $orderPayment->setMemo10(serialize($memo10));
  374.         }
  375.         if (isset($payment['refundFlg'])) {
  376.             $memo10 unserialize($orderPayment->getMemo10());
  377.             $memo10['refundFlg'] = $payment['refundFlg'];
  378.             $orderPayment->setMemo10(serialize($memo10));
  379.         }
  380.         if (isset($payment['lastPayStatus'])) {
  381.             $memo10 unserialize($orderPayment->getMemo10());
  382.             $memo10['lastPayStatus'] = $payment['lastPayStatus'];
  383.             $orderPayment->setMemo10(serialize($memo10));
  384.         }
  385.         if (isset($payment['cardType'])) {
  386.             $memo10 = [];
  387.             if (unserialize($orderPayment->getMemo10()) === false) {
  388.                 $memo10['card_amount'] = '';
  389.             } else {
  390.                 $memo10 unserialize($orderPayment->getMemo10());
  391.             }
  392.             $memo10['card_type'] = $payment['cardType'];
  393.             $orderPayment->setMemo10(serialize($memo10));
  394.         }
  395.         if (isset($payment['cardAmount'])) {
  396.             $memo10 unserialize($orderPayment->getMemo10());
  397.             $memo10['card_amount'] = $payment['cardAmount'];
  398.             $orderPayment->setMemo10(serialize($memo10));
  399.         }
  400.         if (isset($payment['orderCompleteFlg'])) {
  401.             $memo10 unserialize($orderPayment->getMemo10());
  402.             $memo10['orderCompleteFlg'] = $payment['orderCompleteFlg'];
  403.             $orderPayment->setMemo10(serialize($memo10));
  404.         }
  405.         if (isset($payment['sentOrderMail'])) {
  406.             $memo10 unserialize($orderPayment->getMemo10());
  407.             $memo10['sentOrderMail'] = $payment['sentOrderMail'];
  408.             $orderPayment->setMemo10(serialize($memo10));
  409.         }
  410.         // 少額与信の使用有無を記録
  411.         if (isset($payment['useFewCredit'])) {
  412.             $memo10 unserialize($orderPayment->getMemo10());
  413.             $memo10['useFewCredit'] = $payment['useFewCredit'];
  414.             $orderPayment->setMemo10(serialize($memo10));
  415.         }
  416.         // かんたん決済の利用有無を記録
  417.         if (isset($payment['doRegistReTradeCardinfo'])) {
  418.             $memo10 unserialize($orderPayment->getMemo10());
  419.             $memo10['doRegistReTradeCardinfo'] = $payment['doRegistReTradeCardinfo'];
  420.             $orderPayment->setMemo10(serialize($memo10));
  421.         }
  422.         // カード名義を記録
  423.         if (isset($payment['cardName'])) {
  424.             $memo10 unserialize($orderPayment->getMemo10());
  425.             $memo10['cardName'] = $payment['cardName'];
  426.             $orderPayment->setMemo10(serialize($memo10));
  427.         }
  428.         // ロールバック日時
  429.         if (isset($payment['rollbackDate'])) {
  430.             $orderPayment->setRollbackDate($payment['rollbackDate']);
  431.         }
  432.         $this->em->persist($orderPayment);
  433.         $this->em->flush();
  434.         return $orderPayment;
  435.     }
  436.     /**
  437.      * 決済ログテーブルにログを追加
  438.      *
  439.      * @param  Order $order    注文データ
  440.      */
  441.     protected function setOrderLog($order)
  442.     {
  443.         if (empty($this->logData)) {
  444.             return false;
  445.         }
  446.         $orderLogMethod = new Vt4gOrderLog;
  447.         $orderLogMethod->setOrderId($order->getId());
  448.         $orderLogMethod->setVt4gLog(serialize($this->logData));
  449.         $this->em->persist($orderLogMethod);
  450.         $this->em->flush();
  451.         return $orderLogMethod;
  452.     }
  453.     /**
  454.      * 注文データの更新
  455.      *
  456.      * @param  Order  $order    注文データ
  457.      * @param  Vt4gOrderPayment $orderPayment 注文に紐づく決済データ
  458.      * @param  array  $payment  処理中の決済データ
  459.      * @param  array  $logData  ログ情報
  460.      * @param  array  $mailData メール情報
  461.      * @param  string $token    MDKトークン
  462.      * @return void
  463.      */
  464.     protected function updateOrder($order$orderPayment$payment$logData = [], $mailData = [], $token '')
  465.     {
  466.         // 注文情報の確定(決済ステータスが値なしの場合のみ実行)
  467.         if (empty($orderPayment) || empty($orderPayment->getMemo04())) {
  468.             $this->purchaseFlow->commit($order, new PurchaseContext());
  469.         }
  470.         // 決済情報の更新
  471.         $this->setOrderPayment($order$orderPayment$payment$logData$mailData$token);
  472.         // 決済ログテーブルにログを追加
  473.         $this->setOrderLog($order);
  474.         // ステータスの更新
  475.         $withCapture = isset($payment['withCapture']) ? $payment['withCapture'] : 0;
  476.         $this->setNewOrderStatus($order$withCapture);
  477.         $this->em->flush();
  478.     }
  479.     /**
  480.      * メールタイトルの設定
  481.      *
  482.      * @param  string $title タイトル
  483.      * @return void
  484.      */
  485.     protected function setMailTitle($title)
  486.     {
  487.         $this->mailData['title'] = $title;
  488.     }
  489.     /**
  490.      * メールの説明
  491.      *
  492.      * @param string $explan 説明文
  493.      * @return void
  494.      */
  495.     public function setMailExplan($explan)
  496.     {
  497.         $this->mailData['explan'] = $explan;
  498.     }
  499.     /**
  500.      * メール情報の追加
  501.      *
  502.      * @param  string $title   タイトル
  503.      * @param  string $content 本文
  504.      * @return void
  505.      */
  506.     protected function setMailInfo($title$content)
  507.     {
  508.         $this->mailData['message'][] = compact('title''content');
  509.     }
  510.     /**
  511.      * メール情報の追加(広告)
  512.      *
  513.      * @param string $title    タイトル
  514.      * @param string $content  本文
  515.      * @return void
  516.      */
  517.     public function setMailAd($vResultCode$tradUrl)
  518.     {
  519.         $this->mailData['message'][] = array(
  520.                 'vResultCode'=>$vResultCode,
  521.                 'tradUrl'=>$tradUrl,
  522.         );
  523.     }
  524.     /**
  525.      * 決済方法ごとのメール設定を反映
  526.      *
  527.      * @param  object $paymentMethod PaymentMethodクラスインスタンス
  528.      * @return void
  529.      */
  530.     protected function setMailAdminSetting($paymentMethod)
  531.     {
  532.         if (empty($paymentMethod)) {
  533.             return;
  534.         }
  535.         $memo05 unserialize($paymentMethod->getMemo05());
  536.         $title  $memo05['order_mail_title1'] ?? null;
  537.         $body   $memo05['order_mail_body1'] ?? null;
  538.         // タイトル・本文が両方設定されている場合のみ追加
  539.         if (isset($title$body)) {
  540.             $this->setMailInfo($title$body);
  541.         }
  542.     }
  543.     /**
  544.      * ログ情報の先頭部分
  545.      *
  546.      * @param  integer $payId         決済方法の内部ID
  547.      * @param  string  $timeKey       ログキー(現在時間)
  548.      * @param  array   $paymentResult 決済リクエスト結果データ
  549.      * @return void
  550.      */
  551.     public function setLogHead($payId$timeKey ''$paymentResult null)
  552.     {
  553.         if (is_null($paymentResult)) {
  554.             $paymentResult $this->paymentResult;
  555.         }
  556.         $this->timeKey $timeKey;
  557.         $this->logData = array();
  558.         $pay_name        $this->util->getPayName($payId);
  559.         $pay_status_name $this->util->getPaymentStatusName($paymentResult['payStatus']);
  560.         if ($paymentResult['mStatus'] == $this->vt4gConst['VT4G_RESPONSE']['MSTATUS']['OK']) {
  561.             $msg '成功';
  562.         } elseif ($paymentResult['mStatus'] == $this->vt4gConst['VT4G_RESPONSE']['MSTATUS']['PENDING']) {
  563.             $msg '保留';
  564.         } else {
  565.             $msg '失敗';
  566.         }
  567.         $this->setLogInfo('決済取引ID'$paymentResult['orderId']);
  568.         $this->setLogInfo($pay_name"[$pay_status_name]" $msg);
  569.     }
  570.     /**
  571.      * ログ情報の追加
  572.      *
  573.      * @param  string $title   タイトル
  574.      * @param  string $content 出力内容
  575.      * @return void
  576.      */
  577.     protected function setLogInfo($title$content)
  578.     {
  579.         if (empty($this->timeKey)) {
  580.             $this->timeKey date('Y-m-d H:i:s');
  581.         }
  582.         $this->logData[$this->timeKey][] = compact('title''content');
  583.     }
  584.     /**
  585.      * ロールバック
  586.      *
  587.      * @param  Order $order 注文データ
  588.      * @return void
  589.      */
  590.     public function rollback($order$useTransaction true)
  591.     {
  592.         // 購入処理中の場合は何も行わない
  593.         if ($order->getOrderStatus()->getId() === OrderStatus::PROCESSING) {
  594.             return;
  595.         }
  596.         if ($useTransaction) {
  597.             $this->em->beginTransaction();
  598.         }
  599.         // 決済データの削除
  600.         $orderPayment $this->em->getRepository(Vt4gOrderPayment::class)->find($order->getId());
  601.         if (!empty($orderPayment)) {
  602.             $this->em->remove($orderPayment);
  603.         }
  604.         // EC-CUBE側 購入処理のロールバック
  605.         // 同一ユーザーで複数の注文を並行して操作している場合、カート情報と注文情報が紐づかない可能性があるため、
  606.         // カート情報でチェックを行うPreOrderIdValidatorを使わずにロールバックする。
  607.         // [想定パターン]
  608.         // ・カート情報がクリアされていた場合
  609.         // ・最後にカート投入した注文とは異なる注文の場合
  610.         if (empty($this->cartService) || $this->cartService->getPreOrderId() !== $order->getPreOrderId()){
  611.             $this->purchaseFlow->setPurchaseProcessors($this->container->get('vt4g_plugin.purchase.flow.shopping.purchase.rollback'));
  612.         }
  613.         // EC-CUBE側 購入処理のロールバック
  614.         $this->purchaseFlow->rollback($order, new PurchaseContext());
  615.         // 購入処理中へ更新
  616.         $order->setOrderStatus($this->em->getRepository(OrderStatus::class)->find(OrderStatus::PROCESSING));
  617.         $this->em->flush();
  618.         if ($useTransaction) {
  619.             $this->em->commit();
  620.         }
  621.     }
  622.     /**
  623.      * 各決済の新規の注文ステータスを取得
  624.      * ネットバンクはvt4g_shopping_payment_completeアクセス時に値を新規受付に更新する
  625.      *
  626.      * @param  object  $paymentMethod 決済方法データ
  627.      * @param  integer $withCapture   処理区分
  628.      * @return integer                注文ステータス
  629.      */
  630.     private function getNewOrderStatus($paymentMethod$withCapture)
  631.     {
  632.         switch ($paymentMethod->getMemo03()) {
  633.             case $this->vt4gConst['VT4G_PAYTYPEID_CREDIT']:  // クレジットカード決済
  634.             case $this->vt4gConst['VT4G_PAYTYPEID_UPOP']:    // 銀聯
  635.             case $this->vt4gConst['VT4G_PAYTYPEID_RAKUTEN']: // 楽天
  636.             case $this->vt4gConst['VT4G_PAYTYPEID_RAKUTEN_V2']: // 楽天V2
  637.             case $this->vt4gConst['VT4G_PAYTYPEID_RECRUIT']: // リクルート
  638.             case $this->vt4gConst['VT4G_PAYTYPEID_LINEPAY']: // ライン
  639.             case $this->vt4gConst['VT4G_PAYTYPEID_PAYPAL']:  // PayPal
  640.             case $this->vt4gConst['VT4G_PAYTYPEID_PAYPAY']:  // PayPay
  641.                 return $withCapture === 1
  642.                     OrderStatus::PAID // 入金済み
  643.                     OrderStatus::NEW; // 新規受付
  644.             case $this->vt4gConst['VT4G_PAYTYPEID_CVS']:    // コンビニ決済
  645.             case $this->vt4gConst['VT4G_PAYTYPEID_ATM']:    // ATM決済
  646.                 return OrderStatus::NEW; // 新規受付
  647.             case $this->vt4gConst['VT4G_PAYTYPEID_BANK']:   // ネットバンク決済
  648.                 return OrderStatus::PENDING// 決済処理中
  649.             case $this->vt4gConst['VT4G_PAYTYPEID_ALIPAY']:  // Alipay
  650.                 return OrderStatus::PAID// 入金済み
  651.         }
  652.         return '';
  653.     }
  654.     /**
  655.      * 各決済の新規の決済ステータスを取得
  656.      * ネットバンクはvt4g_shopping_payment_completeアクセス時に値を申込に更新する
  657.      *
  658.      * @param  object  $paymentMethod 決済方法データ
  659.      * @param  integer $withCapture   処理区分
  660.      * @return integer $status        決済ステータス
  661.      */
  662.     public function getNewPaymentStatus($paymentMethod$withCapture 0)
  663.     {
  664.         $status '';
  665.         switch ($paymentMethod->getMemo03()) {
  666.             case $this->vt4gConst['VT4G_PAYTYPEID_CREDIT']:  // クレジット
  667.             case $this->vt4gConst['VT4G_PAYTYPEID_UPOP']:    // 銀聯
  668.             case $this->vt4gConst['VT4G_PAYTYPEID_RAKUTEN']: // 楽天
  669.             case $this->vt4gConst['VT4G_PAYTYPEID_RAKUTEN_V2']: // 楽天V2
  670.             case $this->vt4gConst['VT4G_PAYTYPEID_RECRUIT']: // リクルート
  671.             case $this->vt4gConst['VT4G_PAYTYPEID_LINEPAY']: // ライン
  672.             case $this->vt4gConst['VT4G_PAYTYPEID_PAYPAL']:  // PayPal
  673.             case $this->vt4gConst['VT4G_PAYTYPEID_PAYPAY']:  // PayPay
  674.                 $status $withCapture === 1
  675.                     $this->vt4gConst['VT4G_PAY_STATUS']['CAPTURE']['VALUE']
  676.                     : $this->vt4gConst['VT4G_PAY_STATUS']['AUTH']['VALUE'];
  677.                 break;
  678.             case $this->vt4gConst['VT4G_PAYTYPEID_CVS']:  // コンビニ
  679.             case $this->vt4gConst['VT4G_PAYTYPEID_ATM']:  // ATM
  680.                 $status $this->vt4gConst['VT4G_PAY_STATUS']['REQUEST']['VALUE']; // 申込
  681.                 break;
  682.             case $this->vt4gConst['VT4G_PAYTYPEID_BANK']: // ネットバンク
  683.                 break;
  684.             case $this->vt4gConst['VT4G_PAYTYPEID_ALIPAY']: // アリペイ
  685.                 $status $this->vt4gConst['VT4G_PAY_STATUS']['CAPTURE']['VALUE']; // 売上
  686.                 break;
  687.             default:
  688.                 break;
  689.         }
  690.         return $status;
  691.     }
  692.     /**
  693.      * 決済時の処理区分を取得
  694.      * @param  object $order 注文データ
  695.      * @return integer||null 処理区分、取得できない場合はnull
  696.      */
  697.     public function getWithCapture($order)
  698.     {
  699.         $orderPayment $this->util->getOrderPayment($order);
  700.         $memo05 method_exists($orderPayment'getMemo05')
  701.                 ? unserialize($orderPayment->getMemo05())
  702.                 : null;
  703.         if (isset($memo05['withCapture'])) {
  704.             return $memo05['withCapture'];
  705.         } else {
  706.             return null;
  707.         }
  708.     }
  709.     /**
  710.      * 決済エラー用レスポンスを生成
  711.      *
  712.      * @param  string   $errorMessage エラーメッセージ
  713.      * @return Response               ビューレスポンス
  714.      */
  715.     public function makeErrorResponse($errorMessage null)
  716.     {
  717.         $content $this->twig->render('error.twig', [
  718.             'error_title'   => '決済エラー',
  719.             'error_message' => $errorMessage ?? trans('vt4g_plugin.payment.shopping.not.order'),
  720.         ]);
  721.         return new Response($content);
  722.     }
  723.     /**
  724.      * 決済完了メッセージを取得
  725.      *
  726.      * @param  array   $mailData メール情報
  727.      * @param  boolean $forMail  メール用テンプレートを使用するかどうか
  728.      * @return string            決済完了メッセージ
  729.      */
  730.     public function getCompleteMessage($mailData = [], $forMail false)
  731.     {
  732.         if (empty($mailData)) {
  733.             $mailData $this->mailData;
  734.         }
  735.         // メール情報が未設定 もしくは メッセージが未設定の場合は何もしない
  736.         if (empty($mailData) || !array_key_exists('message'$mailData)) {
  737.             return '';
  738.         }
  739.         $engine $this->container->get('twig');
  740.         $param = ['arrOther' => $mailData];
  741.         $dir $this->vt4gConst['VT4G_CODE'].'/Resource/template/default/';
  742.         $path $forMail
  743.             'Mail/'
  744.             'Shopping/';
  745.         $filename $forMail
  746.             'vt4g_order_complete.twig'
  747.             'vt4g_payment_complete.twig';
  748.         $template $dir.$path.$filename;
  749.         return $engine->render($template$paramnull);
  750.     }
  751.     /**
  752.      * 完了メッセージを追加
  753.      *
  754.      * @param  Order &$order Orderクラスインスタンス
  755.      * @return void
  756.      */
  757.     protected function addOrderCompleteMessage(&$order)
  758.     {
  759.         $paymentId $order->getPayment()->getId();
  760.         $paymentMethod $this->util->getPaymentMethod($paymentId);
  761.         $paymentMethodId $paymentMethod->getMemo03();
  762.         // ネットバンクのみ完了画面メッセージ固定
  763.         $bankMailData = [];
  764.         if ($paymentMethodId == $this->vt4gConst['VT4G_PAYTYPEID_BANK']) {
  765.             $bankMailData['title'] = $this->mailData['title'];
  766.             $memo05 unserialize($paymentMethod->getMemo05());
  767.             $title $memo05['order_mail_title1'] ?? null;
  768.             $content $memo05['order_mail_body1'] ?? null;
  769.             // タイトル・本文が両方設定されている場合のみ追加
  770.             if (isset($title$content)) {
  771.                 $bankMailData['message'][] = compact('title''content');
  772.             }
  773.         }
  774.         $message = !empty($bankMailData)
  775.             ? $this->getCompleteMessage($bankMailData)
  776.             : $this->getCompleteMessage();
  777.         if (!empty($message)) {
  778.             // 注文完了画面にメッセージを追加
  779.             $order->appendCompleteMessage($message);
  780.         }
  781.     }
  782.     /**
  783.      * メール送信
  784.      *
  785.      * @param  Order &$order Orderクラスインスタンス
  786.      * @return void
  787.      */
  788.     public function sendOrderMail(&$order)
  789.     {
  790.         $this->mdkLogger->info(trans('vt4g_plugin.payment.mail.start'));
  791.         $this->mailService->sendOrderMail($order);
  792.         $this->mdkLogger->info(trans('vt4g_plugin.payment.mail.complete'));
  793.         // 本体側の処理でflushが実行されないためここで実行
  794.         $this->em->flush();
  795.     }
  796.     /**
  797.      * メールを送信するか判定
  798.      *
  799.      * @param  Order            $order        注文データ
  800.      * @param  Vt4gOrderPayment $orderPayment 決済データ
  801.      * @return boolean                        ture:送信する、false:送信しない
  802.      */
  803.     protected function shouldSendMail($order$orderPayment)
  804.     {
  805.         $paymentId $order->getPayment()->getId();
  806.         $paymentInfo $this->util->getPaymentMethodInfo($paymentId);
  807.         $paymentId $this->util->getPaymentMethod($paymentId)->getMemo03();
  808.         // 決済の判定
  809.         $isCredit $paymentId == $this->vt4gConst['VT4G_PAYTYPEID_CREDIT'];
  810.         $isATM    $paymentId == $this->vt4gConst['VT4G_PAYTYPEID_ATM'];
  811.         $isCVS    $paymentId == $this->vt4gConst['VT4G_PAYTYPEID_CVS'];
  812.         $isBank   $paymentId == $this->vt4gConst['VT4G_PAYTYPEID_BANK'];
  813.         // クレジットカード決済 かつ 本人認証なしの場合
  814.         // ATM決済の場合
  815.         // コンビニ決済の場合
  816.         if ($isCredit && !$paymentInfo['mpi_flg']
  817.             || $isATM
  818.             || $isCVS
  819.         ) {
  820.             return true;
  821.         }
  822.         // ネットバンク決済の場合
  823.         // 注文完了メール送信タイミングが決済申込完了時ではない場合
  824.         if ($isBank) {
  825.             return $paymentInfo['mailTiming'] != $this->vt4gConst['VT4G_MAIL_TIMING']['BANK']['ON_PAYMENT'] ? false true;
  826.         }
  827.         // 注文完了メール送信状況が送信済みの場合(注文完了メール送信状況の登録がない注文の場合も送信しない)
  828.         $memo10 unserialize($orderPayment->getMemo10());
  829.         if (!array_key_exists('sentOrderMail'$memo10) || $memo10['sentOrderMail']) {
  830.             return false;
  831.         }
  832.         // 結果(入金)通知の場合は結果通知プログラムで判定するのでfalse
  833.         if ($this->isPaymentRecv) {
  834.             return false;
  835.         }
  836.         return true;
  837.     }
  838.     /**
  839.      * 注文完了メール送信状況を送信済みに更新
  840.      *
  841.      * @param Vt4gOrderPayment $orderPayment 決済データ
  842.      * @return void
  843.      */
  844.     public function updateSentOrderMailToSent($orderPayment)
  845.     {
  846.         $memo10 unserialize($orderPayment->getMemo10());
  847.         $memo10['sentOrderMail'] = true;
  848.         $orderPayment->setMemo10(serialize($memo10));
  849.         $this->em->persist($orderPayment);
  850.         $this->em->flush();
  851.     }
  852.     /**
  853.      * レコードロックした注文情報と決済情報を取得
  854.      * @param  int   $orderId 注文ID
  855.      * @return array [Order, Vt4gOrderPayment] OrderとVt4gOrderPaymentのオブジェクトを格納した配列
  856.      * @throws LockWaitTimeoutException MySQLのロック解除待ちのタイムアウト発生時
  857.      * @throws DriverException PostgreSQLのロック解除待ちのタイムアウト発生時 (MySQLとPostgreSQLのSQL実行時間のタイムアウトも含む)
  858.      */
  859.     public function getLockedOrder($orderId)
  860.     {
  861.         $isMySQL 'mysql' == $this->em->getConnection()->getDatabasePlatform()->getName();
  862.         $isPostgreSQL 'postgresql' == $this->em->getConnection()->getDatabasePlatform()->getName();
  863.         $timeout $this->vt4gConst['VT4G_LOCK_TIMEOUT'] ?? ini_get('max_execution_time');
  864.         $sql '';
  865.         if ($isPostgreSQL) {
  866.             $sql sprintf("SET lock_timeout = %s;"$timeout 1000);
  867.             $this->em->getConnection()->executeQuery($sql);
  868.         } elseif ($isMySQL) {
  869.             $sql sprintf("SET innodb_lock_wait_timeout = %s;"$timeout);
  870.             $this->em->getConnection()->executeQuery($sql);
  871.         }
  872.         try {
  873.             $this->mdkLogger->info($sql);
  874.             $orderPayment $this->em->find(Vt4gOrderPayment::class, $orderIdLockMode::PESSIMISTIC_WRITE);
  875.             $order $this->em->find(Order::class, $orderIdLockMode::PESSIMISTIC_WRITE);
  876.         } catch (LockWaitTimeoutException $e) {
  877.             $this->mdkLogger->error('LockWaitTimeoutException');
  878.             $this->mdkLogger->error($e->getMessage());
  879.             $this->mdkLogger->error($e->getTraceAsString());
  880.             $this->em->rollback();
  881.             throw $e;
  882.         } catch (DriverException $e) {
  883.             $this->mdkLogger->error('DriverException');
  884.             $this->mdkLogger->error($e->getMessage());
  885.             $this->mdkLogger->error($e->getTraceAsString());
  886.             $this->em->rollback();
  887.             throw $e;
  888.         }
  889.         return [$order$orderPayment];
  890.     }
  891.     /**
  892.      * 決済処理の実行
  893.      *
  894.      * @param  array $payload 決済処理に使用するデータ
  895.      * @return array          決済処理結果データ
  896.      */
  897.     protected function operateNewly($payload)
  898.     {
  899.         $paymentId     $payload['order']->getPayment()->getId();
  900.         $payId         $payload['orderPayment']->getMemo03();
  901.         $payName       $this->util->getPayName($payId);
  902.         $paymentInfo   $this->util->getPaymentMethodInfo($paymentId);
  903.         $paymentMethod $this->util->getPaymentMethod($paymentId);
  904.         $serviceOptionType = ($payId == $this->vt4gConst['VT4G_PAYTYPEID_CVS'])
  905.             ? $payload['inputs']->get('conveni')
  906.             : null;
  907.         $this->mdkLogger->info(
  908.             sprintf(
  909.                 trans('vt4g_plugin.admin.order.credit.newly.start'),
  910.                 $payName
  911.             )
  912.         );
  913.         // レスポンス初期化
  914.         $operationResult $this->initPaymentResult();
  915.         switch ($payId) {
  916.             case $this->vt4gConst['VT4G_PAYTYPEID_CVS']:
  917.                 if (is_null($serviceOptionType)) {
  918.                     return $operationResult;
  919.                 }
  920.                 $mdkRequest = new CvsAuthorizeRequestDto();
  921.                 $this->setRequestParam($mdkRequest$payload['order'], $paymentInfo$serviceOptionType);
  922.                 break;
  923.             case $this->vt4gConst['VT4G_PAYTYPEID_ATM']:
  924.                 $mdkRequest = new BankAuthorizeRequestDto();
  925.                 $this->setRequestParam($mdkRequest$payload['order'], $paymentInfo);
  926.                 break;
  927.             default:
  928.                 return $operationResult;
  929.         }
  930.         $mdkTransaction = new TGMDK_Transaction();
  931.         $mdkResponse $mdkTransaction->execute($mdkRequest);
  932.         // レスポンス検証
  933.         if (!isset($mdkResponse)) {
  934.             $this->mdkLogger->fatal(trans('vt4g_plugin.payment.shopping.mdk.error'));
  935.             $operationResult['message'] = trans('vt4g_plugin.payment.shopping.error');
  936.             return $operationResult;
  937.         }
  938.         // 結果コード
  939.         $operationResult['mStatus'] = $mdkResponse->getMStatus();
  940.         // 詳細コード
  941.         $operationResult['vResultCode'] = $mdkResponse->getVResultCode();
  942.         // エラーメッセージ
  943.         $operationResult['mErrMsg'] = $mdkResponse->getMErrMsg();
  944.         // 異常終了レスポンスの場合
  945.         if ($operationResult['mStatus'] !== $this->vt4gConst['VT4G_RESPONSE']['MSTATUS']['OK']) {
  946.             $operationResult['message']  = $operationResult['vResultCode'].':';
  947.             $operationResult['message'] .= $operationResult['mErrMsg'];
  948.             return $operationResult;
  949.         }
  950.         $operationResult['isOK']      = true;
  951.         // 有効期限
  952.         $operationResult['limitDate'] = $mdkRequest->getPayLimit();
  953.         // 取引ID
  954.         $operationResult['orderId']   = $mdkResponse->getOrderId();
  955.         // trAd URL
  956.         $operationResult['tradUrl']   = '';
  957.         // 決済ステータス
  958.         $operationResult['payStatus'] = $this->getNewPaymentStatus($paymentMethod);
  959.         // 決済金額
  960.         $operationResult['captureTotal'] = floor($payload['order']->getPaymentTotal());
  961.         switch ($payId) {
  962.             case $this->vt4gConst['VT4G_PAYTYPEID_CVS']: // コンビニ決済
  963.                 // 電話番号
  964.                 $operationResult['telNo']        = $mdkRequest->getTelNo();
  965.                 // 受付番号
  966.                 $operationResult['receiptNo']    = $mdkResponse->getReceiptNo();
  967.                 // 払込URL(一部店舗のみ)
  968.                 $operationResult['haraikomiUrl'] = $mdkResponse->getHaraikomiUrl();
  969.                 // 決済サービスオプション
  970.                 $operationResult['serviceOptionType'] = $serviceOptionType;
  971.                 $rollbackDate $this->util->getRollbackDate($operationResult['limitDate'], $this->vt4gConst['VT4G_PAYTYPEID_CVS']);
  972.                 $operationResult['rollbackDate'] = $rollbackDate;
  973.                 $cvsName $this->util->getConveniNameByCode($serviceOptionType);
  974.                 $cvsData $this->translateRecpNo($serviceOptionType$operationResult['receiptNo'], $operationResult['telNo'], true);
  975.                 // ログの生成
  976.                 $this->setLogHead($payId''$operationResult);
  977.                 $this->setLogInfo('店舗'$cvsName);
  978.                 // コンビニ受付番号等
  979.                 foreach ($cvsData as $key => $val) {
  980.                     $this->setLogInfo($key$val);
  981.                 }
  982.                 $this->setLogInfo('支払期限'$operationResult['limitDate']);
  983.                 break;
  984.             case $this->vt4gConst['VT4G_PAYTYPEID_ATM']: // ATM決済
  985.                 // 収納期間番号
  986.                 $operationResult['shunoKikanNo'] = $mdkResponse->getShunoKikanNo();
  987.                 // お客様番号
  988.                 $operationResult['customerNo']   = $mdkResponse->getCustomerNo();
  989.                 // 確認番号
  990.                 $operationResult['confirmNo']    = $mdkResponse->getConfirmNo();
  991.                 $rollbackDate $this->util->getRollbackDate($operationResult['limitDate'], $this->vt4gConst['VT4G_PAYTYPEID_ATM']);
  992.                 $operationResult['rollbackDate'] = $rollbackDate;
  993.                 // ログ情報の設定
  994.                 $this->setLog($payload['order'], $operationResult);
  995.                 break;
  996.             default:
  997.                 break;
  998.         }
  999.         return $operationResult;
  1000.     }
  1001.     /**
  1002.      * キャンセル処理の実行
  1003.      *
  1004.      * @param  array $payload キャンセル処理に使用するデータ
  1005.      * @return array          キャンセル処理結果データ
  1006.      */
  1007.     public function operateCancel($payload)
  1008.     {
  1009.         $payId   $payload['orderPayment']->getMemo03();
  1010.         $payName $this->util->getPayName($payId);
  1011.         $isRakuten $payId == $this->vt4gConst['VT4G_PAYTYPEID_RAKUTEN'];
  1012.         $payStatusName $isRakuten
  1013.             $this->vt4gConst['VT4G_PAY_STATUS']['CANCEL_REQUEST']['LABEL']
  1014.             : $this->vt4gConst['VT4G_PAY_STATUS']['CANCEL']['LABEL'];
  1015.         $this->mdkLogger->info("管理者{$payName}[{$payStatusName}]通信実行");
  1016.         // 決済申込時の結果データ
  1017.         $prevPaymentResult unserialize($payload['orderPayment']->getMemo05());
  1018.         // レスポンス初期化
  1019.         $operationResult $this->initPaymentResult();
  1020.         // キャンセル対象の取引ID
  1021.         $paymentOrderId $payload['orderPayment']->getMemo01();
  1022.         // memo01から取得できない場合
  1023.         if (empty($paymentOrderId)) {
  1024.             // 決済申込時のレスポンスから取得できない場合
  1025.             if (empty($prevPaymentResult['orderId'])) {
  1026.                 $this->mdkLogger->fatal(trans('vt4g_plugin.payment.shopping.mdk.error'));
  1027.                 $operationResult['message'] = trans('vt4g_plugin.payment.shopping.error');
  1028.                 return [$operationResult, []];
  1029.             }
  1030.             // 決済申込時の結果から取得
  1031.             $paymentOrderId $prevPaymentResult['orderId'];
  1032.         }
  1033.         switch ($payId) {
  1034.             case $this->vt4gConst['VT4G_PAYTYPEID_CREDIT']: // クレジットカード決済
  1035.                 $mdkRequest = new CardCancelRequestDto();
  1036.                 break;
  1037.             case $this->vt4gConst['VT4G_PAYTYPEID_CVS']: // コンビニ決済
  1038.                 $mdkRequest = new CvsCancelRequestDto();
  1039.                 // 決済サービスオプションを設定
  1040.                 $mdkRequest->setServiceOptionType($prevPaymentResult['serviceOptionType']);
  1041.                 break;
  1042.             case $this->vt4gConst['VT4G_PAYTYPEID_UPOP']: // 銀聯
  1043.                 $mdkRequest = new UpopCancelRequestDto();
  1044.                 break;
  1045.             case $this->vt4gConst['VT4G_PAYTYPEID_RAKUTEN']: // 楽天
  1046.                 $mdkRequest = new RakutenCancelRequestDto();
  1047.                 $arrMemo10 unserialize($payload['orderPayment']->getMemo10());
  1048.                 $arrMemo10['lastPayStatus'] = $payload['orderPayment']->getMemo04();
  1049.                 $payload['orderPayment']->setMemo10(serialize($arrMemo10));
  1050.                 break;
  1051.             case $this->vt4gConst['VT4G_PAYTYPEID_RAKUTEN_V2']: // 楽天v2
  1052.                 $mdkRequest = new RakutenCancelRequestDto();
  1053.                 break;
  1054.             case $this->vt4gConst['VT4G_PAYTYPEID_RECRUIT']: // リクルート
  1055.                 $mdkRequest = new RecruitCancelRequestDto();
  1056.                 break;
  1057.             case $this->vt4gConst['VT4G_PAYTYPEID_LINEPAY']: // ライン
  1058.                 $mdkRequest = new LinepayCancelRequestDto();
  1059.                 break;
  1060.             case $this->vt4gConst['VT4G_PAYTYPEID_ALIPAY']: // アリペイ
  1061.                 $paymentId   $payload['order']->getPayment()->getId();
  1062.                 $paymentInfo $this->util->getPaymentMethodInfo($paymentId);
  1063.                 $arrMemo10   unserialize($payload['orderPayment']->getMemo10());
  1064.                 $mdkRequest = new AlipayRefundRequestDto();
  1065.                 $mdkRequest->setAmount($arrMemo10['captureTotal']);
  1066.                 $mdkRequest->setReason($paymentInfo['refund_reason']);
  1067.                 $operationResult['amount']        = $arrMemo10['captureTotal'];
  1068.                 $operationResult['refund_reason'] = $paymentInfo["refund_reason"];
  1069.                 break;
  1070.             case $this->vt4gConst['VT4G_PAYTYPEID_PAYPAL']: // paypal
  1071.                 $mdkRequest = new PaypalCancelRequestDto();
  1072.                 break;
  1073.             case $this->vt4gConst['VT4G_PAYTYPEID_PAYPAY']: // paypay
  1074.                 $mdkRequest = new PaypayCancelRequestDto();
  1075.                 $mdkRequest->setServiceOptionType($this->vt4gConst['VT4G_PAYPAY_SERVICE_OPTION_TYPE']);
  1076.                 break;
  1077.             default:
  1078.                 return [$operationResult, []];
  1079.         }
  1080.         // キャンセル対象の取引IDを設定
  1081.         $mdkRequest->setOrderId($paymentOrderId);
  1082.         $mdkTransaction = new TGMDK_Transaction();
  1083.         $mdkResponse $mdkTransaction->execute($mdkRequest);
  1084.         // レスポンス検証
  1085.         if (!isset($mdkResponse)) {
  1086.             $this->mdkLogger->fatal(trans('vt4g_plugin.payment.shopping.mdk.error'));
  1087.             $operationResult['message'] = trans('vt4g_plugin.payment.shopping.error');
  1088.             return [$operationResult, []];
  1089.         }
  1090.         // 結果コード
  1091.         $operationResult['mStatus'] = $mdkResponse->getMStatus();
  1092.         // 詳細コード
  1093.         $operationResult['vResultCode'] = $mdkResponse->getVResultCode();
  1094.         // エラーメッセージ
  1095.         $operationResult['mErrMsg'] = $mdkResponse->getMErrMsg();
  1096.         // 正常終了レスポンス以外の場合
  1097.         if ($operationResult['mStatus'] !== $this->vt4gConst['VT4G_RESPONSE']['MSTATUS']['OK']) {
  1098.             $operationResult['message']  = $operationResult['vResultCode'].':';
  1099.             $operationResult['message'] .= $operationResult['mErrMsg'];
  1100.             return [$operationResult$mdkResponse];
  1101.         }
  1102.         $operationResult['isOK']         = true;
  1103.         // 取引ID
  1104.         $operationResult['orderId']      = $mdkResponse->getOrderId();
  1105.         // 決済サービスタイプ
  1106.         $operationResult['serviceType']  = $mdkResponse->getServiceType();
  1107.         // 決済ステータス
  1108.         $operationResult['payStatus']    = $isRakuten
  1109.             $this->vt4gConst['VT4G_PAY_STATUS']['CANCEL_REQUEST']['VALUE']
  1110.             : $this->vt4gConst['VT4G_PAY_STATUS']['CANCEL']['VALUE'];
  1111.         // 売上金額
  1112.         $operationResult['captureTotal'] = floor($payload['order']->getPaymentTotal());
  1113.         // ログの生成
  1114.         $this->setLogHead($payload['orderPayment']->getMemo03(), ''$operationResult);
  1115.         return [$operationResult$mdkResponse];
  1116.     }
  1117.     /**
  1118.      * 売上処理
  1119.      *
  1120.      * @param  array $payload 売上処理に使用するデータ
  1121.      * @return array          売上処理結果データ
  1122.      */
  1123.     public function operateCapture($payload)
  1124.     {
  1125.         $payId   $payload['orderPayment']->getMemo03();
  1126.         $payName $this->util->getPayName($payId);
  1127.         $isRakuten $payId == $this->vt4gConst['VT4G_PAYTYPEID_RAKUTEN'];
  1128.         $payStatusName $isRakuten
  1129.             $this->vt4gConst['VT4G_PAY_STATUS']['CAPTURE_REQUEST']['LABEL']
  1130.             : $this->vt4gConst['VT4G_PAY_STATUS']['CAPTURE']['LABEL'];
  1131.         $this->mdkLogger->info("管理者{$payName}[{$payStatusName}]通信実行");
  1132.         // 決済申込時の結果データ
  1133.         $prevPaymentResult unserialize($payload['orderPayment']->getMemo05());
  1134.         // レスポンス初期化
  1135.         $operationResult $this->initPaymentResult();
  1136.         // リクエストの取得
  1137.         switch ($payId) {
  1138.             case $this->vt4gConst['VT4G_PAYTYPEID_UPOP']: // 銀聯
  1139.                 $mdkRequest = new UpopCaptureRequestDto();
  1140.                 break;
  1141.             case $this->vt4gConst['VT4G_PAYTYPEID_RAKUTEN']: // 楽天
  1142.                 $mdkRequest = new RakutenCaptureRequestDto();
  1143.                 $arrMemo10 unserialize($payload['orderPayment']->getMemo10());
  1144.                 $arrMemo10['lastPayStatus'] = $payload['orderPayment']->getMemo04();
  1145.                 $payload['orderPayment']->setMemo10(serialize($arrMemo10));
  1146.                 break;
  1147.             case $this->vt4gConst['VT4G_PAYTYPEID_RAKUTEN_V2']: // 楽天V2
  1148.                 $mdkRequest = new RakutenCaptureRequestDto();
  1149.                 break;
  1150.             case $this->vt4gConst['VT4G_PAYTYPEID_RECRUIT']: // リクルート
  1151.                 $mdkRequest = new RecruitCaptureRequestDto();
  1152.                 break;
  1153.             case $this->vt4gConst['VT4G_PAYTYPEID_LINEPAY']: // ライン
  1154.                 $mdkRequest = new LinepayCaptureRequestDto();
  1155.                 break;
  1156.             case $this->vt4gConst['VT4G_PAYTYPEID_PAYPAL']: // paypal
  1157.                 $mdkRequest = new PaypalCaptureRequestDto();
  1158.                 $mdkRequest->setAction('capture');
  1159.                 break;
  1160.             case $this->vt4gConst['VT4G_PAYTYPEID_PAYPAY']: // paypay
  1161.                 $mdkRequest = new PaypayCaptureRequestDto();
  1162.                 $mdkRequest->setServiceOptionType($this->vt4gConst['VT4G_PAYPAY_SERVICE_OPTION_TYPE']);
  1163.                 break;
  1164.             default:
  1165.                 return [$operationResult, []];
  1166.         }
  1167.         $mdkRequest->setAmount(floor($payload['order']->getPaymentTotal()));
  1168.         $mdkRequest->setOrderId($prevPaymentResult['orderId']);
  1169.         $objTransaction = new TGMDK_Transaction();
  1170.         $mdkResponse $objTransaction->execute($mdkRequest);
  1171.         if (!isset($mdkResponse)) {
  1172.             $this->mdkLogger->fatal(trans('vt4g_plugin.payment.shopping.mdk.error'));
  1173.             $operationResult['message'] = trans('vt4g_plugin.payment.shopping.error');
  1174.             return [$operationResult, []];
  1175.         }
  1176.         // 結果コード
  1177.         $operationResult['mStatus']     = $mdkResponse->getMStatus();
  1178.         // 詳細コード
  1179.         $operationResult['vResultCode'] = $mdkResponse->getVResultCode();
  1180.         // エラーメッセージ
  1181.         $operationResult['mErrMsg']     = $mdkResponse->getMErrMsg();
  1182.         // 正常終了レスポンス以外の場合
  1183.         if ($operationResult['mStatus'] !== $this->vt4gConst['VT4G_RESPONSE']['MSTATUS']['OK']) {
  1184.             $operationResult['message']  = $operationResult['vResultCode'].':';
  1185.             $operationResult['message'] .= $operationResult['mErrMsg'];
  1186.             return [$operationResult$mdkResponse];
  1187.         }
  1188.         $operationResult['isOK']         = true;
  1189.         // 取引ID
  1190.         $operationResult['orderId']      = $mdkResponse->getOrderId();
  1191.         // 決済サービスタイプ
  1192.         $operationResult['serviceType']  = $mdkResponse->getServiceType();
  1193.         // 決済ステータス
  1194.         $operationResult['payStatus']    = $isRakuten
  1195.             $this->vt4gConst['VT4G_PAY_STATUS']['CAPTURE_REQUEST']['VALUE']
  1196.             : $this->vt4gConst['VT4G_PAY_STATUS']['CAPTURE']['VALUE'];
  1197.         // 売上金額
  1198.         $operationResult['captureTotal'] = floor($payload['order']->getPaymentTotal());
  1199.         // ログの生成
  1200.         $this->setLogHead($payId''$operationResult);
  1201.         return [$operationResult$mdkResponse];
  1202.     }
  1203.     /**
  1204.      * 返金処理
  1205.      *
  1206.      * @param  array $payload 返金処理に使用するデータ
  1207.      * @return array          返金処理結果データ
  1208.      */
  1209.     public function operateRefund($payload)
  1210.     {
  1211.         $payId   $payload['orderPayment']->getMemo03();
  1212.         $payName $this->util->getPayName($payId);
  1213.         $isRakuten $payId == $this->vt4gConst['VT4G_PAYTYPEID_RAKUTEN'];
  1214.         if ($isRakuten) {
  1215.             $payStatusName $this->vt4gConst['VT4G_PAY_STATUS']['REDUCTION_REQUEST']['LABEL'];
  1216.         } else if (isset($payload['refundAll']) && $payload['refundAll']) {
  1217.             $payStatusName $this->vt4gConst['VT4G_OPERATION_NAME']['REFUND_ALL'];
  1218.         } else {
  1219.             $payStatusName $this->vt4gConst['VT4G_OPERATION_NAME']['REFUND'];
  1220.         }
  1221.         $this->mdkLogger->info("管理者{$payName}[{$payStatusName}]通信実行");
  1222.         // 決済申込時のレスポンス
  1223.         $prevPaymentResult unserialize($payload['orderPayment']->getMemo05());
  1224.         // 減額
  1225.         $amount    0;
  1226.         $arrMemo10 unserialize($payload['orderPayment']->getMemo10());
  1227.         if (isset($arrMemo10['captureTotal'])) {
  1228.             if (isset($payload['refundAll']) && $payload['refundAll']) {
  1229.                 $amount $arrMemo10['captureTotal'];
  1230.             } else {
  1231.                 $amount $arrMemo10['captureTotal'] - $payload['order']->getPaymentTotal();
  1232.             }
  1233.         }
  1234.         // レスポンス初期化
  1235.         $operationResult $this->initPaymentResult();
  1236.         // リクエストの取得
  1237.         switch ($payId) {
  1238.             case $this->vt4gConst['VT4G_PAYTYPEID_UPOP']: // 銀聯
  1239.                 $mdkRequest = new UpopRefundRequestDto();
  1240.                 $arrMemo10['refundFlg'] = true;
  1241.                 $payload['orderPayment']->setMemo10(serialize($arrMemo10));
  1242.                 break;
  1243.             case $this->vt4gConst['VT4G_PAYTYPEID_RAKUTEN']: // 楽天
  1244.                 $mdkRequest = new RakutenCancelRequestDto();
  1245.                 $arrMemo10['lastPayStatus'] = $payload['orderPayment']->getMemo04();
  1246.                 $payload['orderPayment']->setMemo10(serialize($arrMemo10));
  1247.                 break;
  1248.             case $this->vt4gConst['VT4G_PAYTYPEID_RAKUTEN_V2']: // 楽天V2
  1249.                 $mdkRequest = new RakutenCancelRequestDto();
  1250.                 break;
  1251.             case $this->vt4gConst['VT4G_PAYTYPEID_RECRUIT']: // リクルート
  1252.                 $mdkRequest = new RecruitCancelRequestDto();
  1253.                 break;
  1254.             case $this->vt4gConst['VT4G_PAYTYPEID_LINEPAY']: // ライン
  1255.                 $mdkRequest = new LinepayCancelRequestDto();
  1256.                 break;
  1257.             case $this->vt4gConst['VT4G_PAYTYPEID_ALIPAY']:
  1258.                 $paymentId   $payload['order']->getPayment()->getId();
  1259.                 $paymentInfo $this->util->getPaymentMethodInfo($paymentId);
  1260.                 $mdkRequest  = new AlipayRefundRequestDto();
  1261.                 $mdkRequest->setReason($paymentInfo['refund_reason']);
  1262.                 $operationResult['refund_reason'] = $paymentInfo['refund_reason'];
  1263.                 break;
  1264.             case $this->vt4gConst['VT4G_PAYTYPEID_PAYPAL']: // paypal
  1265.                 $mdkRequest = new PaypalRefundRequestDto();
  1266.                 $arrMemo10['refundFlg'] = true;
  1267.                 $payload['orderPayment']->setMemo10(serialize($arrMemo10));
  1268.                 break;
  1269.             case $this->vt4gConst['VT4G_PAYTYPEID_PAYPAY']: // paypay
  1270.                 $mdkRequest = new PaypayRefundRequestDto();
  1271.                 $mdkRequest->setServiceOptionType($this->vt4gConst['VT4G_PAYPAY_SERVICE_OPTION_TYPE']);
  1272.                 break;
  1273.             default:
  1274.                 return [$operationResult, []];
  1275.         }
  1276.         $mdkRequest->setAmount($amount);
  1277.         $mdkRequest->setOrderId($prevPaymentResult['orderId']);
  1278.         $objTransaction = new TGMDK_Transaction();
  1279.         $mdkResponse $objTransaction->execute($mdkRequest);
  1280.         if (!isset($mdkResponse)) {
  1281.             $this->mdkLogger->fatal(trans('vt4g_plugin.payment.shopping.mdk.error'));
  1282.             $operationResult['message'] = trans('vt4g_plugin.payment.shopping.error');
  1283.             return [$operationResult, []];
  1284.         }
  1285.         // 結果コード
  1286.         $operationResult['mStatus']     = $mdkResponse->getMStatus();
  1287.         // 詳細コード
  1288.         $operationResult['vResultCode'] = $mdkResponse->getVResultCode();
  1289.         // エラーメッセージ
  1290.         $operationResult['mErrMsg']     = $mdkResponse->getMErrMsg();
  1291.         // 正常終了レスポンス以外の場合
  1292.         if ($operationResult['mStatus'] !== $this->vt4gConst['VT4G_RESPONSE']['MSTATUS']['OK']) {
  1293.             $operationResult['message']  = $operationResult['vResultCode'].':';
  1294.             $operationResult['message'] .= $operationResult['mErrMsg'];
  1295.             return [$operationResult$mdkResponse];
  1296.         }
  1297.         $operationResult['isOK']         = true;
  1298.         // 取引ID
  1299.         $operationResult['orderId']      = $mdkResponse->getOrderId();
  1300.         // 決済サービスタイプ
  1301.         $operationResult['serviceType']  = $mdkResponse->getServiceType();
  1302.         // 決済ステータス
  1303.         $operationResult['payStatus']    = $isRakuten
  1304.             $this->vt4gConst['VT4G_PAY_STATUS']['REDUCTION_REQUEST']['VALUE']
  1305.             : $this->vt4gConst['VT4G_PAY_STATUS']['REFUND']['VALUE'];
  1306.         // 売上金額
  1307.         $operationResult['captureTotal'] = (isset($payload['refundAll']) && $payload['refundAll']) ? floor($payload['order']->getPaymentTotal());
  1308.         // 減額
  1309.         $operationResult['amount']       = $amount;
  1310.         // ログの生成
  1311.         $this->setLogHead($payId''$operationResult);
  1312.         return [$operationResult$mdkResponse];
  1313.     }
  1314.     /**
  1315.      * 与信変更
  1316.      *
  1317.      * @param  array $payload 与信変更に使用するデータ
  1318.      * @return array          与信変更処理結果データ
  1319.      */
  1320.     public function operateUpdateauth($payload)
  1321.     {
  1322.         $payId   $payload['orderPayment']->getMemo03();
  1323.         $payName $this->util->getPayName($payId);
  1324.         $payStatusName $this->vt4gConst['VT4G_PAY_STATUS'][$payload['mode']]['LABEL'];
  1325.         $this->mdkLogger->info("管理者{$payName}[{$payStatusName}]通信実行");
  1326.         // 決済申込時の結果データ
  1327.         $prevPaymentResult unserialize($payload['orderPayment']->getMemo05());
  1328.         // 与信変更対象の取引ID
  1329.         $paymentOrderId $payload['orderPayment']->getMemo01();
  1330.         // レスポンス初期化
  1331.         $operationResult $this->initPaymentResult();
  1332.         // memo01から取得できない場合
  1333.         if (empty($paymentOrderId)) {
  1334.             // 決済申込時のレスポンスから取得できない場合
  1335.             if (empty($prevPaymentResult['orderId'])) {
  1336.                 $this->mdkLogger->fatal(trans('vt4g_plugin.payment.shopping.mdk.error'));
  1337.                 $operationResult['message'] = trans('vt4g_plugin.payment.shopping.error');
  1338.                 return [$operationResult, []];
  1339.             }
  1340.             // 決済申込時の結果から取得
  1341.             $paymentOrderId $prevPaymentResult['orderId'];
  1342.         }
  1343.         // リクエストの取得
  1344.         switch ($payId) {
  1345.             case $this->vt4gConst['VT4G_PAYTYPEID_RAKUTEN_V2']: // 楽天V2
  1346.                 $mdkRequest = new RakutenUpdateAuthorizeRequestDto();
  1347.                 break;
  1348.             default:
  1349.                 return [$operationResult, []];
  1350.         }
  1351.         $mdkRequest->setOrderId($paymentOrderId);
  1352.         switch ($payload['mode']) {
  1353.             case $this->vt4gConst['VT4G_OPERATION_UPDATEAUTH_EXTENSION']:
  1354.                 // 与信変更 (与信延長)
  1355.                 $mdkRequest->setAuthExtensionFlag(true);
  1356.                 break;
  1357.             case $this->vt4gConst['VT4G_OPERATION_UPDATEAUTH_AMOUNT']:
  1358.                 // 与信変更 (金額変更)
  1359.                 $mdkRequest->setAmount(floor($payload['order']->getPaymentTotal()));
  1360.                 break;
  1361.             case $this->vt4gConst['VT4G_OPERATION_UPDATEAUTH_AMOUNT_AND_EXTENSION']:
  1362.                 // 与信変更 (与信延長 + 金額変更)
  1363.                 $mdkRequest->setAuthExtensionFlag(true);
  1364.                 $mdkRequest->setAmount(floor($payload['order']->getPaymentTotal()));
  1365.                 break;
  1366.             default:
  1367.                 break;
  1368.         }
  1369.         $objTransaction = new TGMDK_Transaction();
  1370.         $mdkResponse $objTransaction->execute($mdkRequest);
  1371.         if (!isset($mdkResponse)) {
  1372.             $this->mdkLogger->fatal(trans('vt4g_plugin.payment.shopping.mdk.error'));
  1373.             $operationResult['message'] = trans('vt4g_plugin.payment.shopping.error');
  1374.             return [$operationResult, []];
  1375.         }
  1376.         // 結果コード
  1377.         $operationResult['mStatus']     = $mdkResponse->getMStatus();
  1378.         // 詳細コード
  1379.         $operationResult['vResultCode'] = $mdkResponse->getVResultCode();
  1380.         // エラーメッセージ
  1381.         $operationResult['mErrMsg']     = $mdkResponse->getMErrMsg();
  1382.         // 正常終了レスポンス以外の場合
  1383.         if ($operationResult['mStatus'] !== $this->vt4gConst['VT4G_RESPONSE']['MSTATUS']['OK']) {
  1384.             $operationResult['message']  = $operationResult['vResultCode'].':';
  1385.             $operationResult['message'] .= $operationResult['mErrMsg'];
  1386.             return [$operationResult$mdkResponse];
  1387.         }
  1388.         $operationResult['isOK']         = true;
  1389.         // 取引ID
  1390.         $operationResult['orderId']      = $mdkResponse->getOrderId();
  1391.         // 決済サービスタイプ
  1392.         $operationResult['serviceType']  = $mdkResponse->getServiceType();
  1393.         // 決済ステータス
  1394.         $operationResult['payStatus']    = $this->vt4gConst['VT4G_PAY_STATUS'][$payload['mode']]['VALUE'];
  1395.         // 売上金額
  1396.         $operationResult['captureTotal'] = floor($payload['order']->getPaymentTotal());
  1397.         // ログの生成
  1398.         $this->setLogHead($payId''$operationResult);
  1399.         // ログは与信変更を表示するが、payStatusは与信で更新を行う。
  1400.         $operationResult['payStatus']    = $this->vt4gConst['VT4G_PAY_STATUS']['AUTH']['VALUE'];
  1401.         return [$operationResult$mdkResponse];
  1402.     }
  1403.     /**
  1404.      * ログのマージ
  1405.      *
  1406.      * @param  array $storedLogMap データベースに保存済みのログ
  1407.      * @param  array $newLogMap    新規追加のログ
  1408.      * @return array               マージされたログ
  1409.      */
  1410.     private function getMergeLog($storedLogMap$newLogMap)
  1411.     {
  1412.         // 保存済みのログリスト
  1413.         if (empty($storedLogMap)) {
  1414.             return $newLogMap;
  1415.         }
  1416.         $keys array_keys($newLogMap);
  1417.         $changes = [];
  1418.         foreach ($keys as $index => $key) {
  1419.             if (array_key_exists($key$storedLogMap)) {
  1420.                 $changes["{$key} {$index}"] = $newLogMap[$key];
  1421.             } else {
  1422.                 $changes[$key] = $newLogMap[$key];
  1423.             }
  1424.         }
  1425.         return array_merge($storedLogMap$changes);
  1426.     }
  1427.     /**
  1428.      * 支払方法の説明を取得
  1429.      *
  1430.      * @param string $optionType サービスオプションタイプ
  1431.      * @return string 結果
  1432.      */
  1433.     public function getExplain($optionType)
  1434.     {
  1435.         // サービスオプションタイプからファイル名生成
  1436.         $path $this->container->getParameter('plugin_realdir'). '/' $this->vt4gConst['VT4G_CODE'] . $this->vt4gConst['VT4G_DOC_PATH'];
  1437.         $path .= sprintf($this->vt4gConst['VT4G_EXPLAIN_FILE_NAME_FMT'], $optionType);
  1438.         // あれば取得
  1439.         if (file_exists($path) == true) {
  1440.             $rtnExplain file_get_contents($path);
  1441.         }
  1442.         return $rtnExplain ?? '';
  1443.     }
  1444. }