Bonjour,

Je mets en place un système de paiement en ligne via l'API Stripe Intent. Lors de mes tests, tout se passe correctement au niveau du paiement. Lors du traitement du statut du paiement également, hormis le fait que je tente d'envoyer un mail lors de la réception d'un statut "succeed", mais celui-ci ne part pas.

Voici mon code :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
 
    /**
     * @Route("/payment/status", name="payment.status")
     */
    public function paymentStatus(AdvertRepository $advertRepository, Request $request, ObjectManager $manager, \Swift_Mailer $mailer)
    {  
 
        $endpoint_secret = $this->getParameter('stripe_endpoint_secret');
 
        $payload = @file_get_contents('php://input');
        $sig_header = $_SERVER['HTTP_STRIPE_SIGNATURE'];
        $event = null;
 
        try 
        {
 
            $event = \Stripe\Webhook::constructEvent($payload, $sig_header, $endpoint_secret);
 
        } 
        catch(\UnexpectedValueException $e) 
        {
 
            // Invalid payload
            http_response_code(400);
            exit();
        } 
 
        catch(\Stripe\Error\SignatureVerification $e) 
        {
 
            // Invalid signature
            http_response_code(400);
            exit();
 
        }
 
        if ($event->type == "payment_intent.succeeded") 
        {
 
            $intent = $event->data->object;
...
 
            // Je mets à jour l'annonce  : tout se passe correctement 
...
            // Je génère une facture au format PDF  : tout se passe correctement 
...
           // J'enregistre la facture en base de données  : tout se passe correctement 
...            
 
            //Sending an email confirmation about the success payment
            $mail = new Mail;
 
            $user = $advert->getOwner()->getUser();
 
            $mail->setReceiver($user)
                 ->setSender(null)
                 ->setSubject($this->getParameter('succeed_payment_email_subject'))
                 ->setFirstname($this->getParameter('administrateur_firstname'))
                 ->setName($this->getParameter('administrateur_name'))
                 ->setEmailFrom($this->getParameter('administrateur_email'))
                 ->setTemplate('Communication/succeedPaymentEmail.html.twig')
                 ->setMessage($this->renderView(
                                                $mail->getTemplate(), 
                                                ['user' => $user]
                                               )
                             )
            ;
 
            if ($mail->sendEmail($mailer))
            {                
 
                $manager->persist($mail);
                $manager->flush();
                // Le mail est bien enregistré en base de données alors qu'il n'est pas envoyé
 
            }
 
            http_response_code(200);
 
            exit();
 
        } 
        elseif ($event->type == "payment_intent.payment_failed") 
        {
 
            $intent = $event->data->object;
            $error_message = $intent->last_payment_error ? $intent->last_payment_error->message : "";
            printf("Failed: %s, %s", $intent->id, $error_message);
            http_response_code(200);
            exit();
 
        }        
 
    }
En base de données, je retrouve bien le mail. Donc, $mail->sendEmail($mailer) me retourne bien true, comme attendu en retour de la méthode de mon entité Mail :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
 
    public function sendEmail(\Swift_Mailer $mailer)
    {
 
        $email = (new \Swift_Message($this->subject));
 
        if(is_null($this->sender))
        {
 
            $email->setFrom([$this->emailFrom => $this->firstname . ' ' . $this->name]);
 
        }
        else
        {
            $email->setFrom([$this->sender->getEmail => $this->sender->getUserName]);
 
        }
 
        $email
                ->setTo($this->receiver->getEmail())
                ->setBody(
                            $this->message,
                            'text/html'
                         )
        ;
 
        $result = $mailer->send($email);
 
        return $result;
 
    }
Cependant, le mail n'est pas envoyé (je ne le vois pas arriver dans la messagerie MailDev).

Or, si je fais un test en créant une nouvelle route directement appelée dans le navigateur et non via l'appel d'un webhook de Stripe, tout fonctionne correctement.

Quelqu'un aurait une idée?

Merci d'avance pour votre aide.