src/Controller/Frontend/NotifyController.php line 52

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Frontend;
  3. use App\Utils\ApiSb;
  4. use App\Utils\MailerUtils;
  5. use App\Utils\NotifyUtils;
  6. use App\Utils\Payments\Opayo\OpayoRecurringSaver;
  7. use App\Utils\PayPalIPN;
  8. use App\Utils\SB;
  9. use Stripe\Event;
  10. use Stripe\Stripe;
  11. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  12. use Symfony\Component\HttpFoundation\Request;
  13. use Symfony\Component\HttpFoundation\Response;
  14. use Symfony\Component\HttpKernel\KernelInterface;
  15. use Symfony\Component\Routing\Annotation\Route;
  16. /**
  17.  * @Route("/notify")
  18.  */
  19. class NotifyController extends AbstractController
  20. {
  21.     private string $projectDir;
  22.     private NotifyUtils $notifyUtils;
  23.     private MailerUtils $mailerUtils;
  24.     private PayPalIPN $payPalIPN;
  25.     private SB $sbUtil;
  26.     public function __construct(
  27.         KernelInterface $kernel,
  28.         NotifyUtils $notifyUtils,
  29.         MailerUtils $mailerUtils,
  30.         PayPalIPN $payPalIPN,
  31.         SB $sbUtil
  32.     ) {
  33.         $this->projectDir  $kernel->getProjectDir();
  34.         $this->notifyUtils $notifyUtils;
  35.         $this->mailerUtils $mailerUtils;
  36.         $this->payPalIPN   $payPalIPN;
  37.         $this->sbUtil      $sbUtil;
  38.     }
  39.     /**
  40.      * @Route("/payu", name="fmApiPayuNotify")
  41.      * @Route("/payu/{lang}", name="fmApiPayuNotifyWithLang")
  42.      */
  43.     public function payuNotifyApiAction(Request $request$lang null): Response
  44.     {
  45.         if ($lang === null || $lang === 'pl')
  46.         {
  47.             \OpenPayU_Configuration::setOauthTokenCache(new \OauthCacheFile($this->projectDir '/var/payu/'));
  48.             \OpenPayU_Configuration::setEnvironment($_ENV['PAYU_ENVIRONMENT']);
  49.             \OpenPayU_Configuration::setMerchantPosId($_ENV['PAYU_MERCHANT_POS_ID']);
  50.             \OpenPayU_Configuration::setSignatureKey($_ENV['PAYU_SIGNATURE_KEY']);
  51.             \OpenPayU_Configuration::setOauthClientId($_ENV['PAYU_OAUTH_CLIENT_ID']);
  52.             \OpenPayU_Configuration::setOauthClientSecret($_ENV['PAYU_OAUTH_CLIENT_SECRET']);
  53.         }
  54.         elseif ($lang === 'es')
  55.         {
  56.             \OpenPayU_Configuration::setOauthTokenCache(new \OauthCacheFile($this->projectDir '/var/payu/'));
  57.             \OpenPayU_Configuration::setEnvironment($_ENV['PAYU_ENVIRONMENT']);
  58.             \OpenPayU_Configuration::setMerchantPosId($_ENV['ES_PAYU_MERCHANT_POS_ID']);
  59.             \OpenPayU_Configuration::setSignatureKey($_ENV['ES_PAYU_SIGNATURE_KEY']);
  60.             \OpenPayU_Configuration::setOauthClientId($_ENV['ES_PAYU_OAUTH_CLIENT_ID']);
  61.             \OpenPayU_Configuration::setOauthClientSecret($_ENV['ES_PAYU_OAUTH_CLIENT_SECRET']);
  62.         }
  63.         elseif ($lang === 'pt')
  64.         {
  65.             \OpenPayU_Configuration::setOauthTokenCache(new \OauthCacheFile($this->projectDir '/var/payu/'));
  66.             \OpenPayU_Configuration::setEnvironment($_ENV['PAYU_ENVIRONMENT']);
  67.             \OpenPayU_Configuration::setMerchantPosId($_ENV['PT_PAYU_MERCHANT_POS_ID']);
  68.             \OpenPayU_Configuration::setSignatureKey($_ENV['PT_PAYU_SIGNATURE_KEY']);
  69.             \OpenPayU_Configuration::setOauthClientId($_ENV['PT_PAYU_OAUTH_CLIENT_ID']);
  70.             \OpenPayU_Configuration::setOauthClientSecret($_ENV['PT_PAYU_OAUTH_CLIENT_SECRET']);
  71.         }
  72.         elseif ($lang === 'de')
  73.         {
  74.             \OpenPayU_Configuration::setOauthTokenCache(new \OauthCacheFile($this->projectDir '/var/payu/'));
  75.             \OpenPayU_Configuration::setEnvironment($_ENV['PAYU_ENVIRONMENT']);
  76.             \OpenPayU_Configuration::setMerchantPosId($_ENV['DE_PAYU_MERCHANT_POS_ID']);
  77.             \OpenPayU_Configuration::setSignatureKey($_ENV['DE_PAYU_SIGNATURE_KEY']);
  78.             \OpenPayU_Configuration::setOauthClientId($_ENV['DE_PAYU_OAUTH_CLIENT_ID']);
  79.             \OpenPayU_Configuration::setOauthClientSecret($_ENV['DE_PAYU_OAUTH_CLIENT_SECRET']);
  80.         }
  81.         elseif ($lang === 'test')
  82.         {
  83.             \OpenPayU_Configuration::setOauthTokenCache(new \OauthCacheFile($this->projectDir '/var/payu/'));
  84.             \OpenPayU_Configuration::setEnvironment('sandbox');
  85.             \OpenPayU_Configuration::setMerchantPosId($_ENV['TEST_PAYU_MERCHANT_POS_ID']);
  86.             \OpenPayU_Configuration::setSignatureKey($_ENV['TEST_PAYU_SIGNATURE_KEY']);
  87.             \OpenPayU_Configuration::setOauthClientId($_ENV['TEST_PAYU_OAUTH_CLIENT_ID']);
  88.             \OpenPayU_Configuration::setOauthClientSecret($_ENV['TEST_PAYU_OAUTH_CLIENT_SECRET']);
  89.         }
  90.         $content $request->getContent();
  91.         try
  92.         {
  93.             $payuContent \OpenPayU_Order::consumeNotification($content);
  94.         }
  95.         catch (\OpenPayU_Exception $e)
  96.         {
  97.             $messageBody $this->notifyUtils->convertContentToMessage(json_decode($contenttrue));
  98.             $this->mailerUtils->sendNotifyEmail(
  99.                 'PayU ERROR - GOS',
  100.                 'Error message: '.$e->getMessage().'<br>'.$messageBody.'</ul>'
  101.             );
  102.         }
  103.         if (!$payuContent instanceof \OpenPayU_Result)
  104.         {
  105.             $messageBody $this->notifyUtils->convertContentToMessage(json_decode($contenttrue));
  106.             $this->mailerUtils->sendNotifyEmail(
  107.                 'PayU ERROR2 - GOS',
  108.                 'Error message: '.$e->getMessage().'<br>'.$messageBody.'</ul><br>Route: ' $request->get('_route')
  109.             );
  110.             return new Response('');
  111.         }
  112.         $wfList $this->notifyUtils->checkOrdTran(
  113.             $payuContent->getResponse()->order->extOrderId,
  114.             $payuContent->getResponse()->order->orderId,
  115.             json_decode($contenttrue)
  116.         );
  117.         switch ($payuContent->getResponse()->order->status)
  118.         {
  119.             case 'COMPLETED':
  120.                 $status 2;
  121.                 break;
  122.             case 'REJECTED':
  123.                 $status 3;
  124.                 break;
  125.             case 'PENDING':
  126.                 $status 1;
  127.                 break;
  128.             case 'CANCELED':
  129.                 $status 3;
  130.                 break;
  131.             default:
  132.                 $status 999;
  133.         }
  134.         foreach ($wfList as $wf)
  135.         {
  136.             $this->notifyUtils->saveNotify(
  137.                 json_decode($contenttrue),
  138.                 $status,
  139.                 $wf,
  140.                 'payu',
  141.                 $payuContent->getResponse()->order->orderId,
  142.                 $payuContent->getResponse()->order->orderCreateDate
  143.             );
  144.             $this->notifyUtils->notifyUser($wf$status);
  145.             $this->sbUtil->updateOrderTransactionResultStatus($wf$status); // that's for recurring payments
  146.         }
  147.         return new Response('');
  148.     }
  149.     /**
  150.      * @Route("/payu-dev/test", name="fmApiPayuDevNotify")
  151.      */
  152.     public function payuNotifyTestAction(Request $request): Response
  153.     {
  154.         // change to your own sandbox account if you want to test notifies
  155.         \OpenPayU_Configuration::setOauthTokenCache(new \OauthCacheFile($this->projectDir '/var/payu/'));
  156.         \OpenPayU_Configuration::setEnvironment('sandbox');
  157.         \OpenPayU_Configuration::setMerchantPosId(575740);
  158.         \OpenPayU_Configuration::setSignatureKey('df2bd8f29ad5621685c440aaaf0e2d3a');
  159.         \OpenPayU_Configuration::setOauthClientId(575740);
  160.         \OpenPayU_Configuration::setOauthClientSecret('780bebc4d280d5c7f69abe7c33586494');
  161.         $messageBody $this->notifyUtils->convertContentToMessage(json_decode($request->getContent(), true));
  162.         $this->mailerUtils->sendNotifyEmail(
  163.             'PayU Test Notify',
  164.             $messageBody,
  165.             'lukasz.mikowski@forum-media.pl'
  166.         );
  167.         return new Response('');
  168.     }
  169.     /**
  170.      * @Route("/payulatam", name="fmApiPayulatamNotify", methods={"POST"})
  171.      */
  172.     public function payulatamNotifyApiAction(Request $request)
  173.     {
  174.         $content $request->request->all();
  175.         $wfList $this->notifyUtils->checkOrdTran(
  176.             $content['reference_sale'],
  177.             $content['transaction_id'],
  178.             $content
  179.         );
  180.         switch ($content['state_pol'])
  181.         {
  182.             case 4:
  183.                 $status 2;
  184.                 break;
  185.             case 6:
  186.                 $status 3;
  187.                 break;
  188.             case 104:
  189.                 $status 3;
  190.                 break;
  191.             case 7:
  192.                 $status 1;
  193.                 break;
  194.             default:
  195.                 $status 999;
  196.         }
  197.         foreach ($wfList as $wf)
  198.         {
  199.             $this->notifyUtils->saveNotify(
  200.                 $content,
  201.                 $status,
  202.                 $wf,
  203.                 'payu-latam',
  204.                 $content['transaction_id'],
  205.                 $content['transaction_date']
  206.             );
  207.         }
  208.         return new Response('<html><body></body></html>');
  209.     }
  210.     /**
  211.      * @Route("/paymentwall", name="fmApiPaymentwallNotify");
  212.      */
  213.     public function paymentwallNotifyApiAction(Request $request)
  214.     {
  215.         \Paymentwall_Config::getInstance()->set(array(
  216.             'api_type' => \Paymentwall_Config::API_GOODS,
  217.             'public_key' => $this->getParameter('paymentwall_public_key'),
  218.             'private_key' => $this->getParameter('paymentwall_private_key')
  219.         ));
  220.         $pingback = new \Paymentwall_Pingback($request->query->all(), $request->server->get('REMOTE_ADDR'));
  221.         if ($pingback->validate())
  222.         {
  223.             if ($pingback->getParameter('CHARGEBACK_TYPE') == 'refund')
  224.             {
  225.                 $status 16;
  226.             }
  227.             else if ($pingback->getParameter('CHARGEBACK_TYPE') == 'chargeback')
  228.             {
  229.                 $status 32;
  230.             }
  231.             else if ($pingback->isDeliverable())
  232.             {
  233.                 $status 2;
  234.             }
  235.             else if ($pingback->isCancelable())
  236.             {
  237.                 $status 3;
  238.             }
  239.             else if ($pingback->isUnderReview())
  240.             {
  241.                 $status 1;
  242.             }
  243.             else
  244.             {
  245.                 $status 999;
  246.             }
  247.             $paymentDate = (new \DateTime(
  248.                     $pingback->getParameter('payment_date_utc'),
  249.                     new \DateTimeZone('UTC')
  250.                 ))
  251.                 ->setTimeZone(new \DateTimeZone('Europe/Warsaw'));
  252.             $wfList $this->notifyUtils->checkOrdTran(
  253.                 $pingback->getParameter('wf'),
  254.                 $pingback->getParameter('ref'),
  255.                 $request->query->all()
  256.             );
  257.             foreach ($wfList as $wf)
  258.             {
  259.                 $this->notifyUtils->saveNotify(
  260.                     $request->query->all(),
  261.                     $status,
  262.                     $wf,
  263.                     'paymentwall',
  264.                     $pingback->getParameter('ref'),
  265.                     $paymentDate->format('Y-m-d H:i:s')
  266.                 );
  267.             }
  268.             return new Response('OK');
  269.         }
  270.         return new Response($pingback->getErrorSummary());
  271.     }
  272.     /**
  273.      * @Route("/paypal", name="fmApiPayPalNotify", methods={"POST"})
  274.      */
  275.     public function payPalNotifyApiAction(Request $request)
  276.     {
  277. //        $this->payPalIPN->useSandbox();
  278.         $verified $this->payPalIPN->verifyIPN();
  279.         if ($verified)
  280.         {
  281.             $content $request->request->all();
  282.             $wfList $this->notifyUtils->checkOrdTran($content['invoice'], $content['txn_id'], $content);
  283.             switch ($content['payment_status'])
  284.             {
  285.                 case 'Completed':
  286.                     $status 2;
  287.                     break;
  288.                 case 'Pending':
  289.                     $status 1;
  290.                     break;
  291.                 case 'Failed':
  292.                     $status 3;
  293.                     break;
  294.                 case 'Processed':
  295.                     $status 3;
  296.                     break;
  297.                 case 'Voided':
  298.                     $status 3;
  299.                     break;
  300.                 case 'Reversed':
  301.                     $status 3;
  302.                     break;
  303.                 case 'Refunded':
  304.                     $status 3;
  305.                     break;
  306.                 case 'Expired':
  307.                     $status 3;
  308.                     break;
  309.                 case 'Denied':
  310.                     $status 3;
  311.                     break;
  312.                 case 'Created':
  313.                     $status 3;
  314.                     break;
  315.                 case 'Canceled_Reversal':
  316.                     $status 3;
  317.                     break;
  318.                 default:
  319.                     $status 999;
  320.             }
  321.             foreach ($wfList as $wf)
  322.             {
  323.                 //WF27566-c077c/636247583e612 like
  324.                 $wf explode('/'$wf);
  325.                 $wf reset($wf);
  326.                 $this->notifyUtils->saveNotify(
  327.                     $content,
  328.                     $status,
  329.                     $wf,
  330.                     'paypal',
  331.                     $content['txn_id'],
  332.                     $content['payment_date']
  333.                 );
  334.             }
  335.         }
  336.         return new Response("<html><body></body></html>");
  337.     }
  338.     /**
  339.      * @Route("/dotpay", name="fmApiDotPayNotify", methods={"POST"})
  340.      */
  341.     public function dotPayNotifyApiAction(Request $request)
  342.     {
  343.         $content $request->request->all();
  344.         $wfList $this->notifyUtils->checkOrdTran(
  345.             $content['control'],
  346.             $content['operation_number'],
  347.             $content
  348.         );
  349.         if ($content['operation_type'] == 'payment')
  350.         {
  351.             switch ($content['operation_status'])
  352.             {
  353.                 case 'new':
  354.                     $status 1;
  355.                     break;
  356.                 case 'processing':
  357.                     $status 1;
  358.                     break;
  359.                 case 'completed':
  360.                     $status 2;
  361.                     break;
  362.                 case 'rejected':
  363.                     $status 3;
  364.                     break;
  365.                 case 'processing_realization_waiting':
  366.                     $status 1;
  367.                     break;
  368.                 case 'processing_realization':
  369.                     $status 1;
  370.                     break;
  371.                 default:
  372.                     $status 999;
  373.             }
  374.         }
  375.         else
  376.         {
  377.             $status 3;
  378.         }
  379.         foreach ($wfList as $wf)
  380.         {
  381.             $this->notifyUtils->saveNotify(
  382.                 $content,
  383.                 $status,
  384.                 $wf,
  385.                 'dotpay',
  386.                 $content['operation_number'],
  387.                 $content['operation_datetime']
  388.             );
  389.         }
  390.         return new Response('OK');
  391.     }
  392.     /**
  393.      * @Route("/worldpay", name="fmApiWorldPayNotify", methods={"POST"})
  394.      */
  395.     public function worldpayNotifyApiAction(Request $request)
  396.     {
  397.         $content $request->request->all();
  398.         $wfList $this->notifyUtils->checkOrdTran(
  399.             $content['cartId'],
  400.             $content['transId'],
  401.             $content
  402.         );
  403.         switch ($content['transStatus'])
  404.         {
  405.             case 'Y':
  406.                 $status 2;
  407.                 break;
  408.             case 'C':
  409.                 $status 3;
  410.                 break;
  411.             default:
  412.                 $status 999;
  413.         }
  414.         foreach ($wfList as $wf)
  415.         {
  416.             $this->notifyUtils->saveNotify(
  417.                 $content,
  418.                 $status,
  419.                 $wf,
  420.                 'worldpay',
  421.                 $content['transId'],
  422.                 date("Y-m-d H:i:s"$content['transTime']/1000)
  423.             );
  424.         }
  425.         if ($status !== 2)
  426.             $params['error'] = true;
  427.         $params['ordTran'] = $wfList[0];
  428.         return new Response($this->forward('App\Controller\Uniqskills\AfterPaymentController::afterPayUAction'$params)->getContent());
  429.     }
  430.     /**
  431.      * @Route("/opayo", name="fmApiOpayoNotify", methods={"POST"})
  432.      */
  433.     public function opayoNotifyApiAction(Request $requestOpayoRecurringSaver $opayoRecurringSaver)
  434.     {
  435.         $content $request->request->all();
  436.         $wfList $this->notifyUtils->checkOrdTran(
  437.             $content['ordTran'],
  438.             $content['transactionId'],
  439.             $content
  440.         );
  441.         if (empty($content['statusCode']))
  442.         {
  443.             $status 999;
  444.         }
  445.         elseif ($content['statusCode'] === '0000')
  446.         {
  447.             $status 2;
  448.         }
  449.         else
  450.         {
  451.             $status 3;
  452.         }
  453.         $isNetflix $content['isNetflix'];
  454.         $isRecurring $content['isRecurring'];
  455.         $domain $content['domain'];
  456.         $vendorTxCode $content['vendorTxCode'];
  457.         //Removing unnecessary, helper data
  458.         unset($content['ordTran']);
  459.         unset($content['isNetflix']);
  460.         unset($content['isRecurring']);
  461.         unset($content['domain']);
  462.         unset($content['vendorTxCode']);
  463.         foreach ($wfList as $wf)
  464.         {
  465.             $this->notifyUtils->saveNotify(
  466.                 $content,
  467.                 $status,
  468.                 $wf,
  469.                 'opayo',
  470.                 $content['transactionId'],
  471.                 date("Y-m-d H:i:s")
  472.             );
  473.         }
  474.         if ($status !== 2)
  475.         {
  476.             $params['error'] = true;
  477.         }
  478.         $params['ordTran'] = $wfList[0];
  479.         /*
  480.          * If recurring, save data in user_card table, which next will be sent to FO (check PaymentServiceProviderData).
  481.          * Then further recurring payments will be processed by FO.
  482.          */
  483.         if ($status === && $isRecurring == true)
  484.         {
  485.             $opayoRecurringSaver->saveTransaction($params['ordTran'], $content$vendorTxCode);
  486.         }
  487.         //redirect to either netflix portal or uniqskills
  488.         if ($isNetflix)
  489.         {
  490.             $scheme $_ENV['USING_HTTPS'] ? 'https://' 'http://';
  491.             $continueUrl parse_url($domainPHP_URL_SCHEME) === null $scheme $domain $domain;
  492.             if ($status == 2)
  493.             {
  494.                 $continueUrl .= '/payment-thank-you/' $params['ordTran'];
  495.             }
  496.             else
  497.             {
  498.                 $continueUrl .= '/koszyk/potwierdzenie/' $params['ordTran'] . '?error=1';
  499.             }
  500.             return $this->redirect($continueUrl);
  501.         }
  502.         return $this->redirectToRoute('fmUniqskillsAfterOpayo'$params);
  503.     }
  504.     /**
  505.      * @Route("/stripe", name="fmApiStripeNotify", methods={"POST"})
  506.      */
  507.     public function stripeNotifyApiAction(Request $request)
  508.     {
  509.         Stripe::setApiKey($_ENV['STRIPE_KEY']);
  510.         $payload $request->request->all();
  511.         try {
  512.             $event Event::constructFrom($payload);
  513.         } catch(\UnexpectedValueException $e) {
  514.             // Invalid payload
  515.             return new Response(''400);
  516.         }
  517.         switch ($event->type) {
  518.             case 'checkout.session.completed':
  519.                 $checkoutSession $event->data->object;
  520.                 $wfList $this->notifyUtils->checkOrdTran(
  521.                     $payload['data']['object']['client_reference_id'],
  522.                     $payload['data']['object']['payment_intent'],
  523.                     $payload['data']['object']
  524.                 );
  525.                 if ($checkoutSession->payment_status === 'paid' && $checkoutSession->status === 'complete') {
  526.                     $status 2;
  527.                 } else {
  528.                     $status 999;
  529.                 }
  530.                 foreach ($wfList as $wf)
  531.                 {
  532.                     //WF27566-c077c/636247583e612 like
  533.                     $wf explode('/'$wf);
  534.                     $wf reset($wf);
  535.                     $this->notifyUtils->saveNotify(
  536.                         $payload['data']['object'],
  537.                         $status,
  538.                         $wf,
  539.                         'stripe',
  540.                         $payload['data']['object']['payment_intent'],
  541.                         date("Y-m-d H:i:s"$payload['data']['object']['created'])
  542.                     );
  543.                 }
  544.                 break;
  545.             default:
  546.                 throw new \RuntimeException('Received unknown event type ' $event->type);
  547.         }
  548.         return new Response();
  549.     }
  550. }