Aller au contenu
Nous concevons, développons et accompagnons vos projets numériques.
Retour au blog

Mercado Pago sur Odoo 18 : corriger les URL de retour

·

Odoo 18 avec Mercado Pago comme passerelle de paiement
Solution Mercado Pago pour Odoo 18 Retour URL Fix

Lors d'une récente implémentation d'Odoo 18 utilisant Mercado Pago comme passerelle de paiement, j'ai rencontré un problème qui n'était pas officiellement documenté et qui n'avait aucune solution de travail dans les forums ou les référentiels: le modal Mercado Pago n'a pas ouvert à la caisse. Au lieu de cela, une erreur a indiqué que les paramètres « URL de retour » manquaient.

Cela a empêché les utilisateurs d'effectuer le paiement. La partie la plus frustrante était de découvrir qu'il n'y avait aucun moyen de configurer ces URL via l'interface Odoo. Bien que le module payment_mercado_pago vous permet d'entrer des informations d'identification et activer le fournisseur, il n'offre aucun champ pour back_urls Mercado Pago doit rediriger les utilisateurs correctement après le paiement.

Pourquoi back_urls ne peut-il pas être configuré via l'interface ?

Le module officiel de Mercado Pago pour Odoo, connu sous le nom payment_mercado_pago, est maintenu par la communauté et ne suit pas le cycle de mise à jour régulier des modules Odoo officiels. Les mises à jour n'ont pas de calendrier fixe et dépendent des contributions volontaires.

Le module n'a donc pas de paramètre fournisseur pour les URL de retour. Parce que le backend construit automatiquement la charge utile Mercado Pago, l'interface n'offre aucun moyen de la modifier.

Pourquoi ai-je modifié le code directement ?

L'approche idéale serait un module personnalisé qui hériterait des classes requises et remplacerait les méthodes à modifier. Cela permet de séparer les modifications du code d'origine et de les protéger des futures mises à jour du module.

Cependant, ce module n'est pas mis à jour fréquemment, et j'avais un environnement intermédiaire pour les tests, donc j'ai édité le fichier source directement. Ceci n'est pas recommandé pour la production sans contrôle de version ou test préalable.

Pour un exemple d'extension de fonctionnalité via un module personnalisé sans modifier les fichiers de base, consultez mon article sur la personnalisation du frontend Odoo avec CSS, JS et XML à l'aide de l'héritage de module:

Modifier payment_transaction.py

La solution était de modifier la méthode _mercado_pago_prepare_preference_request_payloadqui construit la charge utile envoyée à Mercado Pago pour créer la préférence de paiement.

La méthode est située à:
addons/payment_mercado_pago/models/payment_transaction.py

A l'intérieur de cette méthode, j'ai ajouté manuellement back_urls Bloquer le dictionnaire retourné. Ce dictionnaire représente le corps de la requête envoyée à Mercado Pago et doit contenir les URL de retour.

Extrait modifié:


				
					return {
    'auto_return': 'approved',
    'back_urls': {
        'success': "https://tusitio.com/payment/mp/return",
        'pending': "https://tusitio.com/payment/mp/return",
        'failure': "https://tusitio.com/payment/mp/return",
    },
    'external_reference': self.reference,
    ...
}

				
			

Ce bloc appartient à la méthode qui définit également des paramètres tels que external_reference, le items, le notification_url et les détails de la payer. Les back_urls doit être à ce niveau, car Mercado Pago les attend dans la charge utile de préférence.

Mise en œuvre du contrôleur de retour

Une fois que Mercado Pago a les URL de retour, ces routes doivent exister dans Odoo. Sinon, les utilisateurs seront redirigés vers une page 404.

La mise à jour de janvier 2026 inclut le contrôleur complet que j'utilise pour conserver la session du panier et envoyer les clients à la page de confirmation de commande.

J'ai ajouté save_sessionTrue à la route. Le contrôleur lit l'état ou, s'il est absent, collection_status et enregistre la référence et l'état via l'enregistreur Odoo standard.

Les statuts approuvé, réussi, en attente et in_process mènent à /shop/confirmation. Tous les autres statuts reviennent sur /shop.

L'affichage de la page de confirmation d'un paiement en attente ou en cours de traitement ne signifie pas que les fonds ont été reçus. Une redirection de navigateur ne valide pas le paiement : la transaction doit être mise à jour via une notification Mercado Pago vérifiée.

Fichier : return_controller.py Lieu: payment_mercado_pago/controllers/

# path: payment_mercado_pago/controllers/return_controller.py

import logging

from odoo import http

from odoo.http import request



_logger = logging.getLogger(__name__)



class MercadoPagoReturnController(http.Controller):



    # Agregamos save_session=True para asegurar que no se pierda el carrito/usuario

    @http.route('/payment/mp/return', type='http', auth='public', csrf=False, save_session=True)

    def mercadopago_return(self, **kwargs):

        """Captura el retorno del cliente desde Mercado Pago y redirige."""

        

        # 1. Obtenemos estado y referencia

        # MP a veces usa 'collection_status' en lugar de 'status'

        status = kwargs.get('status') or kwargs.get('collection_status')

        reference = kwargs.get('external_reference')



        # 2. Log estándar de Odoo (más rápido que escribir en ir.logging manualmente)

        _logger.info("MercadoPago Return: Ref=%s - Status=%s - Params=%s", reference, status, kwargs)



        # 3. Estados que muestran la confirmación del pedido

        

        confirmation_states = ['approved', 'success', 'pending', 'in_process']



        if status in confirmation_states:

            # Si es aprobado O pendiente (rapipago/tarjeta en revision), va a la Thank You Page

            return request.redirect('/shop/confirmation')

            

        # 4. Solo si falla realmente, volvemos al shop

        _logger.warning("MercadoPago Return no aprobado. Redirigiendo a shop. Status: %s", status)

        return request.redirect('/shop')

Et l'a importé dans le correspondant __init__.py fichier :


				
					from . import main
from . import return_controller

				
			

Après le redémarrage du service Odoo (sudo systemctl restart odoo), le flux a fonctionné.

Résultat

Si ça t'aide, super. Si vous l'adaptez, c'est encore mieux. Les questions, suggestions et expériences sont les bienvenues dans les commentaires. J'espère que cela aidera d'autres techniciens travaillant avec Odoo et les passerelles de paiement.

Note de l'auteur

Je suis Sasha Herscovich, et je conçois, développe et fournit un assistance technique pour les boutiques en ligne construits avec WordPress et Odoo. Je résolve de vrais problèmes tous les jours et je partage parfois ce que je rencontre au cas où cela aiderait quelqu’un d’autre.

Ce blog contient des idées, des solutions et des extraits de code que j'utilise dans de vrais projets. Certains sont pour les personnes qui gèrent leurs propres sites web; d'autres sont pour les développeurs et les concepteurs qui cherchent à améliorer leur travail, gagner du temps ou comprendre comment résoudre un problème particulier.

Je ne vends pas de formules magiques ou de solutions universelles. Je partage ce qui fonctionne pour moi, ce que je teste et ce que j'apprends en cours de route. Si cela vous aide, bienvenue. Et si vous souhaitez commenter, améliorer ou adapter quelque chose, je serais ravi de le faire.

Laisser un commentaire

Votre commentaire sera examiné avant qu'il n'apparaisse. Votre adresse e-mail reste privée. Les champs marqués d'une * sont obligatoires.