src/Controller/Front/PaymentController.php line 105

  1. <?php
  2. namespace App\Controller\Front;
  3. use App\Entity\Abonnement;
  4. use App\Entity\Cours;
  5. use App\Entity\Payment;
  6. use App\Repository\AbonnementItemRepository;
  7. use App\Repository\EleveRepository;
  8. use App\Repository\NetworkConfigRepository;
  9. use App\Repository\PaymentMethodRepository;
  10. use App\Repository\PaymentRepository;
  11. use App\Repository\UserRepository;
  12. use App\Utils\Keys;
  13. use App\Utils\PaymentUtil;
  14. use Doctrine\ORM\EntityManagerInterface;
  15. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  16. use Symfony\Component\HttpFoundation\Request;
  17. use Symfony\Component\HttpFoundation\Response;
  18. use Symfony\Component\Routing\Annotation\Route;
  19. #[Route('/payment')]
  20. class PaymentController extends AbstractController
  21. {
  22.     public function __construct(private Keys $keys)
  23.     {
  24.     }
  25.     #[Route('/'name'app_front_payment')]
  26.     public function index(): Response
  27.     {
  28.         return $this->render('front/payment/index.html.twig', [
  29.             'controller_name' => 'paymentController',
  30.         ]);
  31.     }
  32.     #[Route('/course/{slug}/buy'name'app_front_payment_buy_course'methods: ['GET''POST'])]
  33.     public function devenirPremiumOrByCourse(Cours $courseRequest $requestUserRepository $userRepositoryNetworkConfigRepository $networkConfigRepositoryPaymentMethodRepository $paymentMethodRepositoryPaymentRepository $paymentRepositoryEleveRepository $eleveRepositoryEntityManagerInterface $em)
  34.     {
  35.         // La fonction nécessite que l'on soit connecté et surtout qu'on soit élève
  36.         $this->denyAccessUnlessGranted('ROLE_STUDENT');
  37.         $errorMessage null;
  38.         $eleve $eleveRepository->findOneBy(['utilisateur' => $this->getUser()]);
  39.         if ($eleve === null) {
  40.             throw $this->createAccessDeniedException("Vous devez être élève !");
  41.         }
  42.         if ($request->request->get('initiate_payment')) {
  43.             if ($this->isCsrfTokenValid('payment' $course->getId(), $request->request->get('_token'))) {
  44.                 // En fonction de la methode de payment choisie on fait appel à l'API indiquée
  45.                 $paymentMethod $paymentMethodRepository->findOneBy(['code' => $request->request->get('payment_method')]);
  46.                 $reference 'AK-' . (time() + rand(10000100000000000));
  47.                 $phoneNumber $request->request->get('phone');
  48.                 $apiResponse PaymentUtil::initierPayment($eleve->getUtilisateur(), $course$paymentMethod$this->keys$reference$phoneNumber);
  49.                 // dd($apiResponse);
  50.                 
  51.                 if ($apiResponse['isPaied'] && isset($apiResponse['responseData']['payment_url']) && isset($apiResponse['responseData']['transaction_ref']) && isset($apiResponse['responseData']['status'])) {
  52.                     // $eleve->addCour($course);
  53.                     $payment = new Payment();
  54.                     $today date_format(new \DateTimeImmutable(), 'Y-m-d H:i:s');
  55.                     $expiredAt strtotime($today ' +' 31 ' day');
  56.                     $payment->setEleve($eleve)
  57.                         ->setPaymentMethod($paymentMethod)
  58.                         ->setCours($course)
  59.                         ->setPaidAt(new \DateTimeImmutable())
  60.                         ->setIsExpired(false)
  61.                         ->setTransactionReference($apiResponse['responseData']['transaction_ref'])
  62.                         ->setStatus('En cours')
  63.                         ->setAmount($course->getMontantAbonnement())
  64.                         ->setReference($reference)
  65.                         ->setExpiredAt(new \DateTimeImmutable(date('Y-m-d H:i:s'$expiredAt)));
  66.                     $paymentRepository->save($paymenttrue);
  67.                     $this->addFlash('success'"Votre paiement a été initié !");
  68.                     return $this->redirect($apiResponse['responseData']['payment_url']);
  69.                     // $networkConfigs = $networkConfigRepository->findAll();
  70.                     // if (!empty($networkConfigs)) {
  71.                     //     ManageNetwork::manage($eleve->getUtilisateur(), $networkConfigs[0], $userRepository, $em);
  72.                     // }
  73.                     // return $this->redirectToRoute('app_front_course_details', ['slug' => $course->getSlug()]);
  74.                 } elseif (!$apiResponse['isPaied']) {
  75.                     $errorMessage $apiResponse['response']['message'];
  76.                 }
  77.             } else {
  78.                 throw $this->createAccessDeniedException("Operation impossible");
  79.             }
  80.         }
  81.         return $this->render('front/payment/buy_course.html.twig', [
  82.             'isCoursePage' => true,
  83.             'course' => $course,
  84.             'student' => $eleve,
  85.             'paymentMethods' => $course->getPaymentMethods(),
  86.             'errorMessage' => $errorMessage,
  87.         ]);
  88.     }
  89.     #[Route('/abonnement/{slug}/subscribe'name'app_front_payment_buy_plan'methods: ['GET''POST'])]
  90.     public function subscribePlan(Request $requestAbonnement $abonnementEleveRepository $eleveRepositoryPaymentRepository $paymentRepositoryPaymentMethodRepository $paymentMethodRepositoryAbonnementItemRepository $abonnementItemRepository): Response
  91.     {
  92.         // La fonction nécessite que l'on soit connecté et surtout qu'on soit élève
  93.         $this->denyAccessUnlessGranted('ROLE_STUDENT');
  94.         $errorMessage null;
  95.         $eleve $eleveRepository->findOneBy(['utilisateur' => $this->getUser()]);
  96.         if ($eleve === null) {
  97.             throw $this->createAccessDeniedException();
  98.         }
  99.         if ($request->request->get('initiate_payment')) {
  100.             if ($this->isCsrfTokenValid('payment' $abonnement->getId(), $request->request->get('_token'))) {
  101.                 // En fonction de la methode de payment choisie on fait appel à l'API indiquée
  102.                 $paymentMethod $paymentMethodRepository->findOneBy(['code' => $request->request->get('payment_method')]);
  103.                 $reference 'KU-' . (time() + rand(10000100000000000));
  104.                 $phoneNumber $request->request->get('phone');
  105.                 $apiResponse PaymentUtil::initierPaymentPlan($eleve->getUtilisateur(), $abonnement$paymentMethod$this->keys$reference$phoneNumber);
  106.                 if ($apiResponse['isPaied'] && isset($apiResponse['responseData']['payment_url']) && isset($apiResponse['responseData']['transaction_ref']) && isset($apiResponse['responseData']['status'])) {
  107.                     $payment = new Payment();
  108.                     $today date_format(new \DateTimeImmutable(), 'Y-m-d H:i:s');
  109.                     $expiredAt strtotime($today ' +' $abonnement->getDuree() . ' day');
  110.                     $payment->setEleve($eleve)
  111.                         ->setAbonnement($abonnement)
  112.                         ->setIsExpired(true)
  113.                         ->setPaymentMethod($paymentMethod)
  114.                         ->setReference($reference)
  115.                         ->setAmount($abonnement->getMontant())
  116.                         ->setTransactionReference($apiResponse['responseData']['transaction_ref'])
  117.                         ->setStatus('En cours')
  118.                         ->setExpiredAt(new \DateTimeImmutable(date('Y-m-d H:i:s'$expiredAt)));
  119.                     $paymentRepository->save($payment);
  120.                     $eleve->setIsPremium(false);
  121.                     $eleveRepository->save($elevetrue);
  122.                     // $this->addFlash('success', "Votre paiement a été initié !");
  123.                     return $this->redirect($apiResponse['responseData']['payment_url']);
  124.                     // return $this->redirectToRoute('app_home');
  125.                 } elseif (!$apiResponse['isPaied']) {
  126.                     $errorMessage $apiResponse['response']['message'];
  127.                 }
  128.             } else {
  129.                 throw $this->createAccessDeniedException("Operation impossible ! Formulaire potentiellement corrompu.");
  130.             }
  131.         }
  132.         return $this->render('front/payment/subscribe_abonnement.html.twig', [
  133.             'plan' => $abonnement,
  134.             'student' => $eleve,
  135.             'abonnementItems' => $abonnementItemRepository->findAll(),
  136.             'errorMessage' => $errorMessage,
  137.         ]);
  138.     }
  139.     #[Route('/error'name'error'methods: ['GET'])]
  140.     public function error()
  141.     {
  142.         return $this->render('error/payment-error.html.twig'
  143.         );
  144.     }
  145.     #[Route('/success'name'success'methods: ['GET'])]
  146.     public function success()
  147.     {
  148.         return $this->render('error/payment-success.html.twig'
  149.         );
  150.     }
  151. }