THELIA Forum

Welcome to the THELIA support and discusssion forum

Announcement

Rejoignez la communauté sur le Discord Thelia : https://discord.gg/YgwpYEE3y3

Offline


Hello,

Je viens d'installer le module Payzen mais je rencontre un petit soucis, en effet la commande est validée et le mail envoyé avant même le paiement par carte bancaire.

Un event à configurer pour éviter ça ?

Merci d'avance

Offline


Une réponse possible par rapport à ce problème, j'ai essayé de catcher l'event ORDER:BEFORE:PAYMENT et de stopper la propagation mais comment vérifier que le paiement a bien été validé ensuite par Payzen pour pouvoir passer la commande en "payée" et envoyer le mail de confirmation ?

Offline


Il te faut faire un listener qui intercepte l'event ORDER_SEND_CONFIRMATION_EMAIL, pour le dispatcher uniquement lorsque la commande est payée

    /**
     * Checks if we are the payment module for the order, and if the order is paid,
     * then send a confirmation email to the customer.
     *
     * @param OrderEvent $event
     * @throws \Exception
     */
    public function updateOrderStatus(OrderEvent $event)
    {
        $module= new Payzen();

        if ($event->getOrder()->isPaid() && $module->isPaymentModuleFor($event->getOrder())) {
            // Send now the order confirmation email to the customer
            $event->getDispatcher()->dispatch(TheliaEvents::ORDER_SEND_CONFIRMATION_EMAIL, $event);
        }
    }

    /**
     * Send the confirmation message only if the order is paid.
     *
     * @param OrderEvent $event
     */
    public function checkSendOrderConfirmationMessageToCustomer(OrderEvent $event)
    {
        $module= new Payzen();

        if ($module->isPaymentModuleFor($event->getOrder())) {
            if (! $event->getOrder()->isPaid()) {
                $event->stopPropagation();
            }
        }
    }

    public static function getSubscribedEvents()
    {
        return array(
            TheliaEvents::ORDER_UPDATE_STATUS => array("updateOrderStatus", 128),
            TheliaEvents::ORDER_SEND_CONFIRMATION_EMAIL => array("checkSendOrderConfirmationMessageToCustomer", 130)
        );
    }

OpenStudio Toulouse

Offline


Ok, je vais voir ça de mon côté, c'est l'url de retour de Payzen qui permet de modifier le status d'une commande à payée ?

Offline

Offline


Merci pour l'aide,

J'ai bien remplacé l'Event Listener SendConfirmationEmail par votre exemple, cela n'envoi pas la confirmation de commande au client donc c'est bon cependant j'ai un autre problème, l'url de retour semble ne pas fonctionner, elle est pourtant bien configuré dans le BO Payzen mais une fois la commande validée le client ne reçois aucun mail, de même sur le BO de Thelia, la commande n'est pas mis à jour.

Cela pourrait venir d'une mauvaise configuration de l'url de retour du côté de Payzen ?

Merci d'avance pour vos réponses

Offline


Il faut regarder dans le fichier log/payzen.log si le module est invoqué par l'URL de retour.

Regarder aussi dans log/log-thelia.txt si une erreur s'est produite. Vérifier dans le access.log que l'URL est bien appelée. Tester "à la main" l'URL de retour en mode développement (index_dev.php).

Vérifier aussi dans le BO Payzen le retour de l'appel de l'URL.


OpenStudio Toulouse

Offline


Bonjour,

je déterre ce sujet car je rencontre le même problème. J'ai intercepté les deux évents ORDER_SEND_NOTIFICATION_EMAIL et ORDER_SEND_CONFIRMATION_EMAIL
et ni le webmaster ni le client ne reçoive leur e-mail avant paiement.

Une fois le paiement effectué, la commande passe bien sur le statut payée automatiquement sur le BO mais je n'arrive pas à envoyer à partir de là les mails de notifications webmaster et confirmation client.

Une piste serait la bienvenue !

Ma class :

    public function checkSendConfirmationEmail(OrderEvent $event)
    {
        $payzen= new Payzen();

        if($payzen->isPaymentModuleFor($event->getOrder()) && !$event->getOrder()->isPaid()) {
            $event->stopPropagation();
        }
    }

    /**
     * Checks if we are the payment module for the order, and if the order is paid,
     * then send a confirmation email to the customer.
     *
     * @params OrderEvent $order
     */
    public function updateOrderStatus(OrderEvent $event)
    {
        $payzen = new Payzen();

        if($payzen->isPaymentModuleFor($event->getOrder()) && $event->getOrder()->isPaid()) {
            $this->dispatcher->dispatch(TheliaEvents::ORDER_SEND_NOTIFICATION_EMAIL, $event);
            $this->dispatcher->dispatch(TheliaEvents::ORDER_SEND_CONFIRMATION_EMAIL, $event);

            Tlog::getInstance()->debug("Notification email sent to webmaster " . $order->getCustomer()->getEmail());
            Tlog::getInstance()->debug("Confirmation email sent to customer " . $order->getCustomer()->getEmail());
        }
    }

    public static function getSubscribedEvents()
    {
        return array(
            TheliaEvents::ORDER_UPDATE_STATUS           => array("updateOrderStatus", 128),
            TheliaEvents::ORDER_SEND_NOTIFICATION_EMAIL => array("checkSendConfirmationEmail", 256),
            TheliaEvents::ORDER_SEND_CONFIRMATION_EMAIL => array("checkSendConfirmationEmail", 256),
        );
    }

Merci smile

Offline


Regarde le module Atos, qui a un event listener dédié : https://github.com/thelia-modules/Atos/ … nEmail.php, la différence est qu'il envoie toujours le mail de notification à l'admin du site, plus un mail de confirmation de paiement en plus du mail de confirmation de commande.


OpenStudio Toulouse

Offline


Je suis suis juste gogole en fait. Merci Roadster ! wink