# Mercado Pago sur Odoo 18 : corriger les URL de retour

Odoo 18 avec Mercado Pago comme passerelle de paiement

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: [Comment personnaliser le frontend Odoo](https://tuwebmaster.com.ar/fr/personnaliser-interface-odoo-18/)

## Modifier payment_transaction.py

La solution était de modifier la méthode `_mercado_pago_prepare_preference_request_payload`qui 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

- Le modal Mercado Pago s'ouvre correctement.

- Les utilisateurs peuvent effectuer le paiement sans erreur.

- Les paiements approuvés, en attente ou en cours de traitement sont indiqués `/shop/confirmation`; tous les autres statuts retournent à `/shop`.

- Cela évite l'erreur 404 causée par un contrôleur d'URL de retour manquant.

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.

Étiquette d'auteur intégrée à la frontière

Note de l'auteur

Contenu

    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.

Page canonique : https://tuwebmaster.com.ar/fr/mercado-pago-odoo-18-correction-url-retour/
