Configuration de la liaison à un terminal Mollie

0000003253     -      11/08/2025

Mercator peut être lié aux terminaux de paiement Mollie. Le développement et les tests ont été effectués sur un terminal A35,

Mollie_A35

ainsi que sur le terminal A920Pro.

Mollie_A920pro

Les étapes suivantes doivent être effectuées afin de rendre cette liaison opérationnelle :

  • Créer et valider un compte marchand chez Mollie.
  • Ce compte doit contenir un profil.
  • Dans l'onglet "Paiements en personne" du profil, le terminal doit apparaître. Il est possible de commander un terminal à cet endroit.
  • Après avoir cliqué sur le terminal, il faut consulter "Informations sur le terminal" et noter "ID du terminal" (term_...)
  • Uniquement lors de la mise en route du premier terminal, il faut créer une clé d'API. Cela s'effectue via 
    • Plus dans le menu en haut
    • Développeurs
    • Il faut copier l'information "Livre API key". (Ne pas utiliser ici la clé de test)
  • Disposer dans le voucher de Mercator de l'option MOLLIE suivie de tous les ID de terminaux utilisés.
  • Dans "Outils / Paramètres / Modes Paiements", créer un ou plusieurs modes de paiements qui doivent être pris en charge par le terminal. Cela nécessite une liaison effectuée dans la colonne "Mollie".
  • S'assurer à tout instant que le terminal est connecté à Internet. Il n'y a en effet aucune connexion directe entre Mercator et le terminal. Mercator communique uniquement avec un webservice localisé sur les serveurs de Mollie. Le terminal en fait de même.

 

Dans Mercator, il faut renseigner l'API key dans l'option Terminal Paiements MOLLIE / Mollie API key (id = MOLLI_APIK). Ceci se fait une seule fois car cette option est commune à tous les postes.

Sur chaque poste, il faut associer le terminal utilisé. Cela se fait via les options de "Matériel Caisse" : Mollie ID terminal (id = MOLLIE_TID)

 

  Il est important de prendre en compte ces limitations imposées par les outils fournis par Mollie aux développeurs d'intégrations logicielles :

  • Au démarrage, Mercator n'est pas en mesure de vérifier si le terminal est réellement disponible (allumé, connecté à Internet, ...) Mercator est seulement en mesure de s'assurer que ce terminal existe et est "administrativement" disponible dans le portail.
  • Si une transaction est envoyée et que le terminal n'est pas accessible, aucun message d'erreur n'est affiché. Mercator attend la disponibilité du terminal.
  • Quand le terminal a perdu sa connexion à Internet, il est nécessaire de le redémarrer pour le réactiver ou d'attendre un délai suffisamment long.
  • Mercator n'a pas la possibilité d'annuler une transaction envoyée.  En conséquence, quand l'utilisateur annule une transaction dans Mercator via le bouton "Annuler", il est nécessaire de l'annuler aussi sur le terminal (bouton rouge). Si cette annulation n'est pas effectuée, il est possible pour un client de finaliser un paiement qui n'est plus attendu par Mercator.
  • Si une transaction est envoyée au terminal, alors que la précédente transaction n'a pas été annulée sur le terminal, aucun message d'erreur n'est affiché.

A noter :

La liaison au terminal n'accepte pas les montants négatifs. Les remboursements peuvent être effectués dans le portail Mollie ou via code spécifique (voir ci-dessous).

La liaison ne change pas le mode de paiement en fonction du type de carte utilisée. Ceci est sans objet puisque les paiements versés au marchand proviennent tous de Mollie, quel que soit le type de carte utilisée.

Il n'est pas possible de partager un même terminal entre plusieurs postes.


Voir aussi : xMollie


Nous montrons ci-dessous un exemple de code, à placer dans un bouton d'un écran de vente, permettant d'effectuer un remboursement du montant perçu préalablement sur cette même vente via le terminal Mollie. Ce remboursement n'affecte toutefois pas la caisse de Mercator.

Ce code représente une solution simple, améliorable selon des spécifications plus précises.

Zoom
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Linq;
using MercatorApi;
using MercatorController;
using System.Windows.Forms;
using MercatorExtensions;
using MercatorDatabase;

// <CompileWithRoslyn />

namespace MercatorUi.MovableControls.ButtonsCodes
{
    public static class Script
    {
        public static void Exec(MercatorUi.MovableControls.MovableButton clickedButton)
        {
            Forms.Billing.BillingForm billingForm = (Forms.Billing.BillingForm)clickedButton.Form;

            MercatorPayTerm.PayTermMollie payTermMollie = Globals.PayTerms.OfType<MercatorPayTerm.PayTermMollie>().FirstOrDefault();
            if (payTermMollie == null)
            {
                Dialogs.Stop("Option MOLLIE non présente !");
                return;
            }
            string transactionId = xFunctions.xMollie(billingForm.BillingEngine.PIEDS, "id", 1);
            if (transactionId == "")
            {
                Dialogs.Stop("Le premier mode de paiement n'est pas Mollie !");
                return;
            }
            double d = Dialogs.AskDouble("Montant à rembourser ?", 0, "### ##0.00");
            if (d == double.MinValue)
                return;

            var r = payTermMollie.Refund(transactionId, d, billingForm.BillingEngine.Journal + "_" + billingForm.BillingEngine.Piece, out string error);
            if (error != null)
                Dialogs.Stop(error);
            else
                Dialogs.Stop("Statut = " + r.status.ToString());
        }
    }
}

 


Dans ce second exemple, le remboursement est synchronisé avec la caisse de Mercator. Ce qui peut aussi être problématique si, in fine, le remboursement, pour des raisons diverses, n'est pas effectué par Mollie.

Pour implémenter ce code, il faut créer un autre mode de paiement. Par exemple, "Remboursement" et noter son numéro (21 ci-dessous). Ensuite, dans les séquences de ventes souhaitées, il faut placer ce code.

Vous noterez que dans tous les cas, ce code pose la question "Continuer ?" en affichant le résultat de l'opération de remboursement. La réponse qui indique que le remboursement a été pris en compte est "Statut = pending". Toutefois, si on sauvegarde plusieurs fois le même document, le remboursement ne pourra être modifié. Dans ce cas, le message sera "A duplicate refund has been detected". Mais il sera toutefois possible de poursuivre le processus de sauvegarde.

Ce code représente une solution simple, améliorable selon des spécifications plus précises.

Zoom
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Linq;
using System.Windows.Forms;
using MercatorApi;
using MercatorUi;
using MercatorExtensions;
using MercatorDatabase;
using MercatorController;

// <CompileWithRoslyn />

namespace Billing
{
    public class Customizer : MercatorUi.ICustomizers.IBillingEngineCreated, MercatorUi.ICustomizers.IBillingEngineClosed
    {
        public void BillingEngineCreated(MercatorUi.Engine.Gescom.BillingEngine billingEngine)
        {
            billingEngine.BeforeSave += billingEngine_BeforeSave;
        }

        public void BillingEngineClosed(MercatorUi.Engine.Gescom.BillingEngine billingEngine)
        {
            billingEngine.BeforeSave -= billingEngine_BeforeSave;
        }

        void billingEngine_BeforeSave(object sender, MercatorUi.Engine.Gescom.BillingEngine.BeforeSaveEventArgs e)
        {
            MercatorUi.Engine.Gescom.BillingEngine billingEngine = (MercatorUi.Engine.Gescom.BillingEngine)sender;
            for (int i = 1; i <= 9; i++)
            {
                if (billingEngine.PIEDS.Value<int>("typ_paiem" + i) == 21) // 21 = n° du mode de paiement "Remboursement"
                {
                    if (billingEngine.PIEDS.Value<double>("tot_paiem" + i).CompareTo(0d, 2) > 0)
                    {
                        Dialogs.Stop("Le montant sur le mode \"Remboursement\" doit être négatif !");
                        e.CancelSave = true;
                        return;
                    }
                    if (billingEngine.PIEDS.Value<double>("tot_paiem" + i).CompareTo(0d, 2) < 0)
                    {
                        MercatorPayTerm.PayTermMollie payTermMollie = MercatorUi.Globals.PayTerms.OfType<MercatorPayTerm.PayTermMollie>().FirstOrDefault();
                        if (payTermMollie == null)
                        {
                            Dialogs.Stop("Option MOLLIE non présente !");
                            e.CancelSave = true;
                            return;
                        }
                        string transactionId = xFunctions.xMollie(billingEngine.PIEDS, "id", 1);
                        if (transactionId == "")
                        {
                            Dialogs.Stop("Le premier mode de paiement n'est pas Mollie !");
                            e.CancelSave = true;
                            return;
                        }
                        var r = payTermMollie.Refund(transactionId, -billingEngine.PIEDS.Value<double>("tot_paiem" + i), billingEngine.Journal + "_" + billingEngine.Piece, out string error);
                        string msg = error ?? ("Statut = " + r.status.ToString());
                        if (!Dialogs.AnswerYesNo("Le résultat du remboursement Mollie est :\r\n" + msg + "\r\nContinuer ?"))
                        {
                            e.CancelSave = true;
                            return;
                        }
                    }
                }
            }
        }
    }
}


Cookies fonctionnels : Cookies nécessaires à l'utilisation du site et cookies de préférence. Ils ne contiennent aucune donnée à caractère personnel. (En savoir plus)

Cookies statistiques : Captation de statistiques liées aux comportements des internautes. (En savoir plus)

Cookies marketing : Pour effectuer le suivi des visiteurs au travers des sites web, à des fins publicitaires. (En savoir plus)