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.



Commentaires 21 commentaires

Un peu d'ergonomie


Dis donc, je me rends compte que je parle pas mal d'ergonomie et plus trop de Rails en ce moment. Allez, plus que quelques semaines pour finir les mastodontes de projets sur lesquels je bosse encore, et je pourrais avec plaisir re-découvrir (et donc re-parler de) Rails

En attendant donc... je suis tombé sur cet article fort interressant. Je suis assez d'accord avec l'auteur : il y a des interfaces proriétaires qui sont abominables, et des interfaces d'applis Open Source qui sont des modèles du genre. L'important, au final, c'est d'avoir quelqu'un d'assez "tyrannique" pour avoir une vision à long terme qui puissent être imprimée à l'ensemble de l'application.



Commentaires Aucun commentaire pour le moment

Google m'épate (encore)


C'est certain, ça vous est tous arrivé au moins une plusieurs fois : vous envoyez un Mail avec une pièce jointe hyper importante, genre "vous trouverez ci-joint mon CV" et juste après avoir cliqué sur "envoyer"... ben vous vous rendez compte benoitement que vous avez oublié d'attacher la fameuse pièce jointe.

Le truc que je viens de découvir avec GMail, c'est que dorénavant, si il vous arrivait d'écrire "vous trouverez ci-joint..." et que dans le même message vous n'attachez pas la pièce jointe : Google vous rappelle gentiement que vous avez écrit "vous trouverez en pièce jointe" alors que vous avez oublié d'attacher le document ! Dingue, non ?!

Ce genre de petite attention est très exactement un modèle du genre. Le pire, c'est que c'est d'une simplicité enfantine à mettre en place ('doit tenir dans moins de 10 lignes de JS, ce truc...), mais qu'il aura fallu que j'envoie des Mails sans pièce jointe pendant 13 ans avant que je ne tombe sur une interface capable de me corriger.



Commentaires Aucun commentaire pour le moment

Non, rien de rien... non, je n'y comprend plus rien


Petite devinette. Qui était interviewé cette après midi sur BFM et a déclaré distinctement, avec conviction et (apparemment) en pleine possession de ses facultés :

Je pense que dans les années qui viennent il y aura des formules d'abonnement avec lesquelles, pour x euros par mois, vous pourrez télécharger à peu près toute la musique que vous souhaitez

Réponse : Pascal Nègre !!! Dingue non ?! Parce que nous, pauvres geeks pas doués en marketing, ça faisait déja très longtemps qu'on avait eu cette même idée, mais on appelait ça "licence globale". Alors que là, "abonnement", c'est clair, ça change tout... (je vous invite à écouter ou lire la retransciption du podcast de BFM, je n'invente rien)

Maintenant, si quelqu'un peut m'expliquer la différence entre "abonnement" et "licence Globale", je suis preneur...



Commentaires Aucun commentaire pour le moment

Ouvrir systématiquement tous les liens extérieurs dans une nouvelle fenêtre


Voila bien une demande systématique de _tous_ les clients : "je veux que les liens s'ouvrent dans une nouvelle fenêtre". Certes, certes, cela fait des années que tout le monde utilise la fonctionnalité "ouvrir dans un nouvel onglet" du navigateur afin de choisir ce que l'on fait avec chaque lien, mais peu importe, c'est le client qui décide. Du coup, la p'tite dificulté que cette demande peut engendrer est sur deux plans :

  • L'attribut "target" est maintenant "deprecated", et il serait vraiment idiot de ne pas valider mes pages xhtml 1.0 uniquement pour cette raison. Donc, pas de "target='_blank'" en dur.
  • Enfin, avec un CMS, ce sont les clients qui saisissent eux mêmes les liens, au fil de leur contenu, avec (souvent) une quantité non négligeable de liens pointant vers leur propre site. Il y a donc des liens qu'il faut ouvrir dans la même page.

Une solution évidente au premier abord : ajouter un bouton radio dans la boite de dialogue permettant de créer les liens avec un label genre "ouvrir ce lien dans une nouvelle fenêtre". Je crois que c'est typiquement le genre de fausse bonne idée qui va m'amener une floppée de coups de téléphone et de Mails du genre :

  • Client : Ce lien ne s'ouvre pas comme je l'avais demandé !!!
  • Moi : Avez-vous bien coché la case "ouvrir dans une nouvelle fenêtre" ?
  • Client : Heuuuu, quelle case ?...".

Bref, partant de là, j'ai trouvé une idée simple pour tout le monde (et surtout le client), qui fonctionne sans faille, et sans ajouter un seul bouton, tout en restant valide XHTML 1.0. Le truc est tout simplement d'ajouter l'attribut 'target' de façon dynamique au chargement de la page, uniquement sur les liens commençant par "http:". Le tour est joué en seulement 3 lignes de JS (avec prototype) :

function addExtLink(){
  $$('a').each(function(this_link){
    if(/^http:/.test(this_link.readAttribute('href'))){
      this_link.writeAttribute('target', '_blank');
    }
  });
}

Je vous laisse le soin de charger ça sur 'dom:loaded'. Voila, c'était mon bout de code à 10c du jour :-).



Commentaires Aucun commentaire pour le moment

De belles Fonts dans tous les navigateurs et sans prise de tête avec la Google Font API


Depuis le temps qu'on doit se battre avec des images pour avoir un tant soit peu de variété au niveau des Fonts, c'est avec un vrai grand plaisir que j'ai d'abord accueilli les possibilitées ouvertes par CSS3 et l'attribut @font-face... hélas, je me suis rapidement retrouvé face aux différences d'implémentations entre navigateurs, avec des formats de fonts différents (TTF pour un peu tout le monde, et EOT pour IE), et des rendus plus ou moins approximatifs (étonnant, hein ?!).

Dans ce paysage, une solution devient alors très interessante : Google Font API. Le principe : vous incluez un bout de code, et Google se charge de vous envoyer la bonne font en fonction de votre navigateur. En prime, Google se charge du hosting et de la bande passante nécessaire à cette même font. Sympa, non ?

Un exemple en deux lignes

<head>
...
<link href='http://fonts.googleapis.com/css?family=Yanone+Kaffeesatz:extralight' rel='stylesheet' type='text/css'>
...
</head>

<body>
<h1 style='font-family:Yanone Kaffeesatz'>Foo Bar !<h1>
...

Ce qui nous donne à l'écran :

google fonts API example

Vous avez aussi la possibilité d'appeler l'API via Javascript (ce que je fais dans le projet sur lequel je suis), mais je vous laisse voir la doc ainsi que les différentes Fonts actuellement disponibles.



Commentaires Aucun commentaire pour le moment

+1 pour Gandi


Je confirme pour l'avoir testé aujourd'hui : le support technique et administratif de Gandi est vraiment top niveau. Certes, les domaines coutent (à peine) plus cher, mais le professionnalisme et la qualité de leur Hotline est un plus vraiment appréciable.



Commentaires Aucun commentaire pour le moment

API XML-RPC de Gandi et Ruby on Rails : que du bonheur !


Après plusieurs semaines d'hésitation, de recherche et de prospection, je vais finalement utiliser les services de Gandi afin de gérer les noms de domaine du (gros) projet sur lequel je travail. Quatre raisons à cela :

  • Gandi est basé en France, avec un helpdesk Mail et/ou téléphone sur lequel on peut compter
  • J'ai consulté et disséqué des dizaines d'offres revendeurs(worldwide). Finalement, Gandi n'est guère plus cher que les autres (pas le moins cher non plus... mais les différences se jouent à 2 ou 3 Euros près par an : pas de quoi prendre des risques en optant pour un Registrar exotique)
  • Si vous me lisez couramment, vous savez que j'accorde une importance primordiale à la documentation, et celle de l'API XML-RPC est un modèle du genre : re-mar-quable
  • C'est assez dingue, parce que le besoin doit quand même pas être si courant que ça... mais Il existe un plugin Rails pour communiquer avec l'API ! Décidemment, comme je l'ai entendu lors du dernier apéro Rails à Lyon : "grâce aux plugins, on a plus rien à faire, tout est déja pré-existant, testé et validé". Ca se confirme.

  • Concrétement, je viens de faire mes premiers essais en production ce matin, et il ne faut pas plus de 20 lignes de codes pour se connecter à l'API, vérifier si un domaine est libre, si oui, le réserver, le verrouiller et spécifier les DNS. 20 lignes, commentaires compris ! Merci Gandi, merci Rails, merci Xavier pour ton plugin.



    Commentaires Aucun commentaire pour le moment