Dialoguer facilement avec les serveurs de paiement Paybox depuis Rails
Décidement, les Railers Lyonnais font dans la monétique, ces temps ci... Après l'excelllllent plugin pour SIPS/Atos écrit par Damien Mathieu il y a peu, j'ai eu cette semaine à m'interfacer avec cet autre grand prestataire du paiement en ligne Hexagonal qu'est Paybox. A ce propos, juste un petit mot, parce que sans leur aide j'aurais eu du mal, mais la hotline de chez Paybox est remarquable : décroché en 1 sonnerie, réponses pertinentes, numéro non surtaxé... que du bonheur.
Bref, après une soirée à tourner autour de Net:HTTP sur du SSL, j'ai finalement codé une p'tite Class bien pratique pour dialoguer avec Paybox directement et en toute sécurité depuis vos controllers, vous pouvez la télécharger ici.
Concrétement, l'utilisation est super simple : déposez le fichier paybox.rb dans vos modèles, puis il vous suffit d'instancier la classe de cette façon :
# Controller
response = Paybox.new(
:operation=>'00003',
:amount=>'1000',
:user_id=>'99',
:card_nbr=>'1234567891234567',
:expire=>'0311',
:cvv2=>'123'
)
Nous effectuons ici une opération de type '00003' (demande d'autorisation + débit) de 1000 centimes sur notre abonné identifié par l'ID '99', titulaire de la carte '1234567891234567', avec la date de validité au 03/2011 et le code cvv2 '123'.
Maintenant, pour lire la réponse, c'est toujours aussi simple :
# Controller response.coderesponse = '00000' #=> requete effectuée avec succès # Ou bien encore : response.commentaire = "PAYBOX : Numéro de porteur invalide" #=> Oooops, numéro de carte invalide
Et comme je suis vraiment gentil, j'ai même documenté tous les codes envois/retours de Paybox. Si tout se passe bien, vous n'avez même pas besoin de la doc officielle (au demeurant très bien faite). Bon, par contre, je ne sais pas écrire de commentaires ni de noms de variables autrement qu'en Anglais, et toute la doc (et les variables, WTF !) de Paybox sont en Français pur et dur, alors n'ayez pas peur du Mix Fran-glais...
Edit : Franck a refactorisé et inséré tout ça (en mieux) dans un plugin dispo sur Github.
salut à tous!
je suis étudiant en Monetique et debutant en programmation et j'ai un projet d'ecole de devellopement d'un CMS pour le transfert d'argent. mon inquiètude c'est comment dialoguer avec un serveur distant pour les traitements( monetiques, bancaires). je medit peut etre qu'il ya un API mais bon que j'ignore! aidez svp...
Bon oui, effectivement, avec le recul je reconnais que c'est une bonne idée d'avoir intégré Paybox direct+ dans ActiveMerchant.
Ceci dit, je ne fais que du sur-mesure, et je préfère généralement avoir plusieurs petits plugins très spécialisés plutôt qu'un gros monstre dont je ne me sert que de 1% des features.
Enfin bref, on va pas se prendre la tête :
# si vous voulez mettre Paybox dans un Spree ou autre CMS, utilisez ActiveMerchant
# si vous faites du sur mesure et que vous n'avez besoin que de Paybox, servez vous du Plugin,
# si vous avez envie de faire joujou et comprendre comment ça marche, downloadez ma simple Classe.
Tous les goûts sont dans la nature :-)
L'interet d'intégrer ca a active merchant serait de proposer facilement le paiment pour une boutique de type spree.
Justement Paybox a été intégré il y a 2 mois à Active Merchant à partir de ce code, tu peux t'en rendre compte dans les sources de active merchant, voilou
@pierre : IMHO ActiveMerchant concerne les plateformes de paiement US, et je pense qu'il vaut mieux le laisser où il est afin d'éviter que ça devienne un monstre informe avec des rustines de partout. Enfin, ce n'est que mon humble avis.
Par contre, oui, effectivement, il serait bien de centraliser dans un gem/plugin la plupart des méthodes de paiement Françaises (ATOS/SPplus/Paybox/Ogone/Cybermut). Ceci dit, techniquement, chacun de ces prestataires utilisant des méthodes vraiment très différentes, en ce qui me concerne, je ne vois pas trop comment articuler tout ça pour le résultat soit utilisable de façon _simple_ pour le développeur final... disons que j'y songe en ce moment.
Une question comme ca :
Pourquoi ne pas avoir intégrer tout ca a active_merchant ?
Pierre
à la place de
:ARCHIVAGE=>"#{this_date.to_i}",
il faut
:ARCHIVAGE=>this_date.to_i,
(Sinon vous aurez une erreur "Some+values+exceed+max+length")
Effectivement, en ce qui me concerne, je controle que le CVV2 soit un Integer dans mon controller, ceci dit, il faut faire attention avec les codes genre '002', par exemple. En Int, '002' ça fait ça fait '2' tout court, et là ça va coincer car il faut 3 digits ! Du coup, je le passe en String, après avoir vérifié que chaque digit soit un entier.
Mais tu as raison, ça peut être interessant de faire cette validation depuis la classe elle même, et non en amont depuis le controlleur. Je ferais la modif quand j'aurai 5mn...
J'avais oublie de t'indiquer que le cvv2 (cryptogramme) doit être en integer uniquement, sinon ca crache une erreur 00002, j'avais corrigé ca dans le code mais j'ai ommis de te l'indiquer aussi, ce qui fait qu'il y a eu une maj de paybox pour activemerchant et que ca n'a pas été mise à jour aussi cette erreur comme je l'avais pas indiqué.
Cordialement VANDENBOGAERDE Nicolas
Un gand MERCI pour cette classe.
Bon travail Guillaume !
Rhoooo, 'sont gentils comme tout chez Paybox...
Bonjour,
Je vous remercie de votre contribution et vous confirme que notre Equipe Support Clients est à votre écoute pour toute précision et assistance au 04 68 85 79 90.
Une documentation dédiée à vos tests est disponible en téléchargement depuis l'adresse http://www1.paybox.com/telechargements/PAYBOX - PARAMETRES DE TEST.pdf
Infos commerciales via www.paybox.com
Solutions ecommerce sur http://www1.paybox.com/solution.aspx?id=2
Bhouuuu, honte à moi, j'ai copié/coller comme une brute le code que j'utilisais en test dans mon appli ("simplissime.fr", donc). En fait, le paramètre archivage est transmis à la banque et sert à identifier la transaction. Si j'en crois la doc, il est spécifié "devrait être unique, sur 12 carctères", je passe donc maintenant un Time stamp Unix (int 11). Concernant le pays, tu m'apprend quelque chose, merci de ta remarque !
Enfin, concernant "warning: peer certificate won't be verified in this SSL session ", ce warning n'apparait effectivement pas sur la plateforme de test, mais remonte lors de l'utilisation d'un vrai compte sur la pleteforme de Prod. Dans ce cas, ajouter :
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
A la ligne 119 règle bien le problème. Je viens de mettre à jour le code avec ces différentes remarques.
Merci de tes remarques, 'content que ma Class puisse être utile. Si tu es Lyonnais, effectivement, on aura l'occasion d'en parler au prochain apéro :-)
C'est bon ton code passe très bien, par contre j'ai appellé paybox ce matin, et il y a des petites corrections par rapport a ton code,
en fait il faut que tu dans la trame que tu envois pays => fr, c'est paybox qui te le retourne en fait selon le numéro de carte bancaire, de plus en reference => "siplicime.fr", le champs est trop long, c'est limité a un certin nombre de caractère donc j'ai juste mis 'simplicisme' et c'est bon, ca marche du premier coup. j'ai corrigé le code des diffèrentes informations qu'ils m'ont dit, et cela marche très bien.
Je te dis encore félicitation pour ce code, et j'espère qu'on se verra à un apéro rails un de ses jours pour qu'on puisse en parler, et excuse moi du temps que je t'ai pris.
Bien Cordialement
Paybox:0x1010bacf0 @numappel="0000000000", @rang=" ", @numtrans="0000000000", @codereponse="00014", @site=" ", @commentaire="Some+values+exceed+max+length", @autorisation="AUTORISATION", @numquestion="0000000000"
Suite du message précédent
Erreur "00014" qui signifie "Trame reçue incohérente."
pourquoi ?
Bien cordialement
J'ai testé ton code et j'ai un soucis
irb(main):004:0> response = Paybox.new(
irb(main):005:1* :operation=>'00003',
irb(main):006:1* :amount=>'1000',
irb(main):007:1* :user_id=>'99',
irb(main):008:1* :card_nbr=>'1234567891234567',
irb(main):009:1* :expire=>'0311',
irb(main):010:1* :cvv2=>'123'
irb(main):011:1> )
warning: peer certificate won't be verified in this SSL session
=> #
en codereponse j'ai 00014 qui signifie qu'il y a un problème dans la trame envoyé si tu peux m'expliquer d'ou vient se problème.
j'ai revu toutes la doc de paybox par rapport à ton code et juste en test pour le moment, et je n'ai rien vu d'innormal.
de plus que j'essaye sur ma machine ou sur les serveurs de alwaysdata c'est toujours pareil.
Pour les versions de ruby j'ai testé en ruby 1.8.7, et ruby 1.9 mais toujours la même réponse, et en rails v 3.0.0.
Cela étant dit je voulais te féléciter pour ce morceau de code, qui va me rendre un grand service, et je suis sur pas qu'a moi, et aussi pour la rapidité de ta réponse.
Cordialement
Essaye d'ajouter :
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
Ligne 119, juste après "http.use_ssl = true". Ceci dit, pas testé...
Faudrait voir exactement avec quelle version de Rails et de Ruby, dans quelles conditions (quelle offre de Paybox ?)
J'ai testé ton code et j'ai un soucis
irb(main):004:0> response = Paybox.new(
irb(main):005:1* :operation=>'00003',
irb(main):006:1* :amount=>'1000',
irb(main):007:1* :user_id=>'99',
irb(main):008:1* :card_nbr=>'1234567891234567',
irb(main):009:1* :expire=>'0311',
irb(main):010:1* :cvv2=>'123'
irb(main):011:1> )
warning: peer certificate won't be verified in this SSL session
=> #
en codereponse j'ai 00014 qui signifie qu'il y a un problème dans la trame envoyé si tu peux m'expliquer d'ou vient se problème.
Effectivement, c'est une bonne idée : on pourrait faire évoluer Payme vers un "ActiveMerchant" à la Française ! J'en parlerai avec Damien au prochain apéro Rails lyonnais (demain, donc).
Ceci dit, j'avoue que je suis comme toi, question temps disponible c'est vraiment serré en ce moment...
Bonne initiative. Je pense que Payme peut être facilement modifié pour supporter les autres fournisseurs (j'avais pensé à implémenter celui de la Banque Populaire, simple construction de formulaire etc.)
Si jamais je trouve un peu de temps (et ça va être dur mais qui sait...), j'aimerai aussi que Payme devienne un Rails::Engine à-la-Devise.
Envie de donner votre avis ?