src/Controller/DonationController.php line 29

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Donation;
  4. use App\Entity\Project;
  5. use App\Entity\Member;
  6. use Doctrine\ORM\EntityManagerInterface;
  7. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  8. use Symfony\Component\HttpFoundation\Request;
  9. use Symfony\Component\HttpFoundation\Response;
  10. use Symfony\Component\Routing\Annotation\Route;
  11. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  12. use Stripe\Stripe;
  13. use Stripe\Checkout\Session;
  14. class DonationController extends AbstractController
  15. {
  16. private $em;
  17. public function __construct(EntityManagerInterface $em)
  18. {
  19. $this->em = $em;
  20. }
  21. /**
  22. * @Route("/dons", name="app_dons")
  23. */
  24. public function dons(): Response
  25. {
  26. $projects = $this->em->getRepository(Project::class)->findAll();
  27. return $this->render('donation/dons.html.twig', [
  28. 'projects' => $projects
  29. ]);
  30. }
  31. /**
  32. * @Route("/checkout/don", name="app_checkout", methods={"POST"})
  33. */
  34. public function checkout(Request $request): Response
  35. {
  36. $amount = $request->request->get('amount');
  37. $type = $request->request->get('donation_type');
  38. $firstname = $request->request->get('firstname');
  39. $lastname = $request->request->get('lastname');
  40. $email = $request->request->get('email');
  41. $isAnonymous = $request->request->get('anonymous') ? true : false;
  42. $projectId = $request->request->get('project_id');
  43. $donation = new Donation();
  44. $donation->setName($firstname . ' ' . $lastname);
  45. $donation->setEmail($email);
  46. $donation->setAmount((float)$amount);
  47. $donation->setIsAnonymous($isAnonymous);
  48. $donation->setCreatedAt(new \DateTime());
  49. if ($projectId) {
  50. $project = $this->em->getRepository(Project::class)->find($projectId);
  51. if ($project) {
  52. $donation->setProject($project);
  53. }
  54. }
  55. // Try to link to a member
  56. $memberId = $request->getSession()->get('member_id');
  57. if ($memberId) {
  58. $member = $this->em->getRepository(Member::class)->find($memberId);
  59. if ($member) {
  60. $donation->setMember($member);
  61. }
  62. } else {
  63. // Try by email
  64. $member = $this->em->getRepository(Member::class)->findOneBy(['email' => $email]);
  65. if ($member) {
  66. $donation->setMember($member);
  67. }
  68. }
  69. $this->em->persist($donation);
  70. $this->em->flush();
  71. Stripe::setApiKey($_ENV['STRIPE_SECRET_KEY']);
  72. $mode = $type === 'mensuel' ? 'subscription' : 'payment';
  73. $priceData = [
  74. 'currency' => 'eur',
  75. 'unit_amount' => $amount * 100,
  76. 'product_data' => [
  77. 'name' => 'Don WA BENIN' . ($projectId ? ' (Projet Spécifique)' : ''),
  78. ],
  79. ];
  80. if ($type === 'mensuel') {
  81. $priceData['recurring'] = ['interval' => 'month'];
  82. }
  83. $paymentMethodTypes = ['card', 'sepa_debit'];
  84. $session = Session::create([
  85. 'payment_method_types' => $paymentMethodTypes,
  86. 'line_items' => [[
  87. 'price_data' => $priceData,
  88. 'quantity' => 1,
  89. ]],
  90. 'mode' => $mode,
  91. 'success_url' => $this->generateUrl('app_checkout_success', [], UrlGeneratorInterface::ABSOLUTE_URL),
  92. 'cancel_url' => $this->generateUrl('app_checkout_cancel', [], UrlGeneratorInterface::ABSOLUTE_URL),
  93. 'metadata' => [
  94. 'type' => 'donation',
  95. 'donation_id' => $donation->getId()
  96. ]
  97. ]);
  98. return $this->redirect($session->url, 303);
  99. }
  100. /**
  101. * @Route("/checkout/success", name="app_checkout_success")
  102. */
  103. public function checkoutSuccess(): Response
  104. {
  105. return $this->render('donation/checkout_success.html.twig');
  106. }
  107. /**
  108. * @Route("/checkout/cancel", name="app_checkout_cancel")
  109. */
  110. public function checkoutCancel(): Response
  111. {
  112. return $this->render('donation/checkout_cancel.html.twig');
  113. }
  114. }