Configuration du paiement sécurisé Ogone (Partie 1)

ingenico

paiements-ogone
Ogone est un opérateur de services de paiement en ligne, il propose aux sites e-commerce une solution de paiement virtuel qui sert de passerelle entre leur boutique en ligne et leur banque.

Depuis Janvier 2013, La société belge Ogone a été rachetée par le leader mondial des solutions de paiements Ingenico Group (ePayments et services).

Dans cet article, je vais vous expliquer comment implémenter le paiement avec ASP .NET C# dans  la page du panier d'un site e-Commerce.

Sur vote site e-commerce, le client peut valider son panier et procéder au paiement sécurisé dans la page « Panier ».

Le bouton « Valider mon panier » assure la validation du formulaire Html de la page et la redirection automatique du client en mode sécurisé vers la page paiement Ogone.

Site_eCommerce

Paramètres de paiement et configuration

Pour commencer, il vous faudra créer un compte de test gratuit par ici.

Commençons par l'ajout des paramètres de paiement, que j'estime nécessaires et suffisants, dans le fichier Web.config de l'application.

<!--OGONE configuration-->
<add key="OGONE_PSPID" value="imehdad"/>
<add key="OGONE_PaiementLink" value="https://secure.ogone.com/ncol/test/orderstandard_utf8.asp"/>
<add key="OGONE_SHA_IN" value="mySecretKey2Secure"/>
<add key="OGONE_SHA_OUT" value="secondSecretKey2Secure"/>
<add key="OGONE_ACCEPTURL" value="https://test.netapsys.fr/Integration/fr/ShoppingCart/SuccessPaiement"/>
<add key="OGONE_CANCELURL" value="https://test.netapsys.fr/Integration/fr/ShoppingCart/CancelPaiement"/>
<add key="OGONE_DECLINEURL" value="https://test.netapsys.fr/Integration/fr/ShoppingCart/DeclinePaiement"/>
<add key="OGONE_EXCEPTIONURL" value="https://test.netapsys.fr/Integration/fr/ShoppingCart/FailurePaiement"/>
Web.config

Les autres paramètres comme les informations relatives à la commande et au client sont à définir dans le code.

1/ PSPID : est l'identifiant unique du marchand e-Commerce Ogone, choisi par l'utilisateur lors de la création du compte (non modifiable par la suite).

2/ PaiementLink : Lien de la page du paiement Ogone.

3/SHA_IN : est la clé secrète qui doit garantir l'intégrité des données de paiement, qui garantit que personne ne peut altérer les détails d'une transaction, par exemple pour réduire le montant ou l'identifiant de la commande. Cette clé sert à calculer la signature SHA_IN lorsque les données sont soumises à la page de paiement Ogone.

- Où se trouve t-elle ? : "Configuration" > "Information technique" > "Contrôle de données et d’origine" > " Contrôles pour e-Commerce "

shsign

4/ ACCEPTURL : URL de redirection lorsque le paiement a été autorisé, stocké, accepté ou est en attente d'être acceptée.

5/ CANCELURL : URL de redirection lorsque le paiement a été annulé par le client.

6/ DECLINEURL : URL de redirection lorsque le client décline l'autorisation plus de fois que le nombre maximum autorisé (tel que défini dans la section "Payment retry" de l'onglet "Transaction").

7/ EXCEPTIONURL : URL de redirection lorsque le résultat du paiement est incertain.

- Où se trouvent-ils ? : "Configuration" > "Information technique" > "Retour d'information sur la transaction" > " e-Commerce " > "Redirection HTTP dans le navigateur"

URLs

Les autres paramètres concernant les informations sur la commande et le client sont directement récupérées dans le code et envoyées dans la requête : OrderId, Amount, Currency Language, CN, Email, Brand, OwnerAddress, OwnerZip, OwnerTown, OwnerCity.

Redirect and Post

Maintenant que notre compte est bien configuré, nous allons implémenter une méthode qui nous permet d’envoyer les paramètres de paiement au serveur via une requête Http Post sur une URL externe à notre application.

Afin d'éviter de mettre tous les champs en hidden dans le formulaire, de conserver l'ordre d'envoi des paramètres Ogone (très important!) et d'éviter pas mal d'appels serveur car certains de ces paramètres nécessitent un calcul côté serveur, j'ai choisi d'utiliser une bibliothèque appelée Fluentx.Mvc.

Cette bibliothèque contient des classes d'aide et les méthodes d'extension utilisées pour asp.net MVC.

Pour installer Fluentx Mvc, il suffit d'exécuter la commande suivante dans la console Package Manager : PM>Install-Package Fluentx.Mvc

Deux références vont s'ajouter à votre projet Web, Fluentx et Fluentx.Mvc :

References

La fonction "RedirectAndPost" sera utilisée pour poster les paramètres et rediriger vers l'url de la page de paiement Ogone.

Ainsi, lors du clic sur le bouton "Valider mon panier", on appelle la méthode "ConfirmBasket" qui met à jour le panier, crée la commande et nous redirige vers la page de paiement :

[HttpPost]
[ActionName("ConfirmBasket")]
public ActionResult ConfirmBasket (MyOrderVM myModel)
{
   if (CurrentUser != null)
   {
      int clientId = CurrentUser.cli_Id;
      //Mettre à jour le panier
      Panier panier = _PanierModel.UpdatePanier(myModel);
      //Créer la commande
      Commande commande =_OrderModel.CreateOrder(myModel, panier);
      //Constituer les paramètres du paiement       
      Dictionary<string, object> parametres = _OrderModel.SetOgoneParametresPaiement(commande, DatabaseLanguageId);
 
      return this.RedirectAndPost(ConfigurationManager.AppSettings["OGONE_PaiementLink"], parametres);
    }
    return RedirectToAction("Index", "Home");
}
ConfirmBasket

Configuration des paramètres sortants

Dans la méthode "SetOgoneParametresPaiement", on construit un dictionnaire <Clé, valeur> de tous les paramètres de la requête Http Post dans l'ordre alphabétique (important!) :

public Dictionary<string, object> SetOgoneParametresPaiement(Commande commande, byte languageId)
        {
            Client client = _ClientBusiness.GetClientById(commande.cmd_cli_Id);
 
            Adresse adresse = _ClientBusiness.GetAdressById(commande.cmd_adr_Id_Facturation);
 
            Dictionary<string, object> parametres = new Dictionary<string, object>();
 
            //Récupérer par ordre alphabetique tout les paramètres
            parametres.Add("ACCEPTURL", ConfigurationManager.AppSettings["OGONE_ACCEPTURL"]);
 
            if (commande.cmd_TotalTTC >= 1)
            {
                parametres.Add("AMOUNT", ((int)(commande.cmd_TotalTTC * 100)).ToString());
            }
            else
            {
                parametres.Add("AMOUNT", "100"); //minimun de 1 euro par transaction
            }
 
            //Mode de paiement
            var modePaiement = _LocalizationBusiness.GetNomModePaiement(languageId, commande.cmd_mpai_Id);
            if (String.IsNullOrEmpty(modePaiement))
            {
                modePaiement = "VISA";
            }
            parametres.Add("BRAND", modePaiement); //VISA, MaestroUK, American Express, CB
 
            parametres.Add("CANCELURL", ConfigurationManager.AppSettings["OGONE_CANCELURL"]);
 
            parametres.Add("CN", String.Format("{0} {1}", adresse.adr_Prenom, adresse.adr_Nom));
 
            parametres.Add("CURRENCY", "EUR");
 
            parametres.Add("DECLINEURL", ConfigurationManager.AppSettings["OGONE_DECLINEURL"]);
 
            parametres.Add("EMAIL", client.cli_Email);
 
            parametres.Add("EXCEPTIONURL", ConfigurationManager.AppSettings["OGONE_EXCEPTIONURL"]);
 
            parametres.Add("LANGUAGE", Consts.Cultures.FR_FR);
 
            parametres.Add("OPERATION", "SAL"); //SAL ou RES
 
            parametres.Add("ORDERID", commande.cmd_Id.ToString());
 
            parametres.Add("OWNERADDRESS", adresse.adr_Ligne1);
 
            parametres.Add("OWNERCTY", adresse.Pays.pay_Code);
 
            if (!String.IsNullOrEmpty(adresse.adr_Telephone))
            {
                parametres.Add("OWNERTELNO", adresse.adr_Telephone);
            }
            var adresseVille = adresse.adr_Ville;
            if (adresseVille.Length > 40)
                adresseVille = adresse.adr_Ville.Substring(0, 40);
 
            parametres.Add("OWNERTOWN", adresseVille);
 
            parametres.Add("OWNERZIP", adresse.adr_CodePostal);
 
            parametres.Add("PM", "CreditCard");
 
            parametres.Add("PSPID", ConfigurationManager.AppSettings["OGONE_PSPID"]);
 
            //Calculer la signature SHA1
            string signature = "";
 
            foreach (System.Collections.Generic.KeyValuePair<string, object> pair in parametres)
            {
                signature += String.Format("{0}={1}{2}", pair.Key, pair.Value, ConfigurationManager.AppSettings["OGONE_SHA_IN"]);
            }
 
            parametres.Add("SHASIGN", PasswordHelper.HashUTF8String(signature));
 
            return parametres;
        }
  }
SetOgoneParametresPaiement

Calcul de la signature SHA-IN

La signature calculée est créée en concaténant les valeurs des champs envoyés avec la commande (triés par ordre alphabétique, dans le format ‘paramètre=valeur’), séparés par la clé SHA-IN, comme indiqué à la fin de la méthode ci-dessus.

Cas d'erreur et journal d'erreur

Lors de l'envoi de la requête de paiement Ogone, il est possible de rencontrer une erreur.

Par exemple, je modifie la clé SHA-IN, je change dans le web.config sa valeur et donc je calcule mes paramètres avec une clé différente que celle indiquée dans le back-office. Voici ce que j'obtiens comme erreur :

erreur_ogone

La page de paiement ne donne pas de détails sur l'erreur. Pour cela, il faut aller consulter le journal d'erreur dans le back-office Ogone.

journal_erreurs

Maintenant, que l'on a l'erreur, il faudra l'interpréter. Ogone met à disposition (heureusement) la liste de toutes les erreurs possibles dans ce document. Voici la description de l'erreur :

"Vous recevez ce message d’erreur lorsque la SHASIGN envoyée dans les champs HTML masqués pour la transaction ne correspond pas à la SHASIGN calculée de notre côté sur la base des informations de la commande et de la chaîne supplémentaire (mot de passe/phrase) saisie dans le champ « Clé SHA-IN » sous l’onglet « Contrôle de données et d’origine », dans la rubrique « Contrôles pour e-Commerce » de la page d’information technique."

Cas de succès de paiement

Maintenant, je corrige la valeur de la clé secrète SHASIGN, et je renvoie ma requête. Ogone vérifie bien l’exactitude des paramètres de ma requête et me redirige vers la page de paiement où je suis invitée à renseigner mes identifiants de carte bancaire et confirmer le paiement :

page_paiement

Ogone met à disposition des numéros de carte bancaire de test pour tout les comptes de test, et même si vous testez avec des vraies coordonnées bancaires, vous ne serez pas débité sur un compte de test.

- Où se trouvent-elles ? : "Configuration" > "Information technique" > "Info de test"

CB_tests

Je saisis le numéro de carte bancaire VISA "4111111111111111", une date d'expiration antérieure à la date du jour et un code de vérification à 3 chiffres et je confirme le paiement:

saisie_info_paiement

Ogone traite la transaction et affiche la page de "Confirmation du paiement" qui contient la référence du paiement:

confirmation_paiement

Maintenant que le paiement est accepté et la transaction est créée, Ogone vous envoie un ticket électronique de paiement qui contient le récapitulatif de votre transaction, voici un aperçu du mail:

eTicket_paiement

On peut aussi configurer Ogone pour envoyer un mail de confirmation du paiement à notre client de notre part, voici un exemple:

mail confirmation de paiement

 

Un commentaire

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Captcha *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.