Créer des modules supplémentaires des systèmes de paiement

De ISPWiki.

Le système de paiements est décrit dans 2 sections dans l'interface de BILLmanager:
1. Sur le niveau de Provider - Sociétés->Modes de paiement accéptés;
2. Sur le niveau de Client - Crédits/Paiements;


Pour créer votre l'interface de paiements vous avez besoin de: créer le programme ou le script qui vous permet de remplir et traiter les champs du formulaire et si c'est nécessaire effectuer le paiement; créer le document-xml avec la description des éléments de l'interface et avec les messages en langues différentes; créer les scripts cgi ou les programmes pour échanger les données avec les passerelles de paiements;


Sommaire

Document XML

Le document-XML doit être placé dans le fichier /usr/local/ispmgr/etc et doit être nommé comme billmgr_mod_xxx.xml. Vous pouvez spécifier tout nom au lieu de xxx, par exemple, test (billmgr_mod_test.xml). Le document doit être encodé dans dans UTF-8. Par exemple:

 <?xml version="1.0" encoding="UTF-8"?>
 <mgrdata>
   <metadata name="company.paymethod.edit_XXX" type="form">
     <form>
       <field name="name">
         <input type="text" name="name" empty="no"/>
       </field>
       <field name="minamount">
         <input type="text" name="minamount"/>
       </field>
       ----the filds you need----
     </form>
       <jscript>
               document.frm.func.value = 'company.paymethod.edit';
       </jscript>
   </metadata>
   <metadata name="credit.pay.XXX" type="form">
     <form>
       <field name="amount">
         <input type="text" name="amount" readonly="yes"/>
       </field>
       ----the filds you need----        
       <field name="merchantfield">  S'il faut visiter le site du système de paiements
         <link name="merchant"/>
       </field>
     </form>
     <jscript> S'il faut visiter le site du système de paiements
       function GoMerchant(id, lnk) {
         window.open('/mancgi/testcgi?elid='+id);
         if (lnk) {
           lnk.className = 'disabled';
           lnk.onclick = function () { return false; }
         }
       }
     </jscript>
   </metadata>
   <lang name="en">
     <messages name="credit.pay.XXX">
       <msg name="amount">Amount</msg>
       <msg name="merchant">Pay now</msg>
       <msg name="title">XXX pay method</msg>
       <msg name="hint_default">Fill form</msg>
       <msg name="hint_amount">Amount</msg>
       ---other messages----
     </messages>
   </lang>
 </mgrdata>

XXX est le nom interne du système de paiements. Il est vivement conseillé de créer la description des messages en anglais, autrement les autres langues ne seront pas créées. Attention: le champ merchant est nécessaire si le système de paiements permet de visiter le site de ce système.


Gestionnaire des programmes

Le programme/script doit être placé dans la catalogue /usr/local/ispmgr/sbin/. Le nom de fichier doit être à partir de pm. Les symboles en arrière de pm sont le nom du système interne de paiements qui sera utilisé par les éléments de l'interface. Le programme doit donner la liste de fonctionnalités citées par blanc lors du lancement avec le paramètre feature.

Liste de fonctionnalités

pmtune Le programme change le formulaire de modification du moyen de paiement. BILLmanager donne le formulaire décrit en réponse de l'entrée du document-XML. Puis, il attend le document-XML modifié.

pmvalidate Le programme vérifie les valeurs introduites par l'utilisateur pour éviter l'entrée des données incorrectes. Puis BILLmanager envoie le document-XML qui contient le formulaire rempli. Si les valeurs sont param1, param2 b param3 le document- XML sera suivant:

 <?xml version="1.0" encoding="UTF-8"?>
 <doc>
   <param1>value</param1>
   <param2>value</param2>
   <param3>value</param3>
 </doc>

Si valeurs sont correctes, le programme doit donner pmok, en cas d'erreur - Error: nom_de_paramètre. Si tout est bien, BILLmanager spécifie les paramètres au format XML dans le tableau companycrtype dans le champ params. Vous pouvez utiliser ces données lors de la création des paiements.

crtune Le programme change le formulaire de création d'un paiement. Il fonctionne comme pmtune.

crget Le programme remplit le formulaire de création d'un paiement pour remplir automatiquement le formulaire de modification d'un paiement. Il fonctionne comme le programme pmtune.

crset Cela est utilisé si l'utilisateur n'a pas besoin de visiter le site du système de paiements et il effectue le paiement sur la base de données introduites. Ce moyen est utilisé lors de la facturation via WebMoney et Ogone. Le principe a été créé sur la base de LongTask. En cas d'erreur le message d'erreur sera suivant:

 crid code_de_paiement description_d_erreur

L'utilisateur voit la bannière jaune suivante:

Il y avait une erreur pendant le paiement. Code: 'code_de_paiement' Error: 'message d'erreur' Corrigez les données incorrectes ou contactez au support technique.

Vous pouvez inscrire le montant ici

 /usr/local/ispmgr/sbin/mgrctl -m billmgr credit.setpaid elid=code_de_paiement info="données à sauvegarder"

Programme Cgi

S'il faut échanger les données entre le système de paiements, créez les programmes-cgi. Vous avez besoin de placer ces programmes dans /usr/local/ispmgr/cgi L'adresse-Https sera comme - https://your_domain/mancgi/XXX, XXX est le nom de fichier.

Structure de base de données

Les tableaux nécessaires pour que vous puissiez créer le module:

1. companycrtype - l'information sur le moyen de paiement. Colonnes:
1.1 id - le code du moyen de paiement;
1.2 currency - la monnaieа. Le lien sur le tableau de currency;
1.3 minamount - le montant minimum de paiement;
1.4 params - le document-XML avec les paramètres introduits dans le formulaire;

2. credit - le tableau de paiements. Colonnes:
2.1 id - le code de paiement;
2.2 nativeamount - le montant en monnaie du paiement;
2.3 state - le statut de paiement;
2.4 userinfo - le document-XML avec les paramètres introduits dans le formulaire;
2.5 info - cela est déstiné à sauvegarder l'information sur le paiement; par exemple: les données envoyées par la passerelle.


Exemple de script en langage Perl

L'exemple cité ci-dessous décrit les fonctions de test que vous pouvez utiliser lors de la création de l'interface de paiement. Il faut utiliser les modules suivants XML::LibXML и Mysql. Le nom de fichier - pmtest. Cet exemple ne réalise aucun protocole, il dit comment réaliser les fonctions de votre système.
Exemple:
La grande partie de fonctions spécifie comment le processus a été lancé: comme LongTask ou pas, en fonction de cela ces fonctions sont lancées par plusieurs moyens .
pmtune - dit comment remplir select. pmvalidate - vérifie le contenu de testinput (doit contenir "test"), par contre revient l'erreur. crtune - Дdit comment remplir select. crget - prend les valeurs de la base et remplit le formulaire.

 #!/usr/bin/perl
 no warnings; 
 use XML::LibXML;
 use Mysql;
open(DEBUG, ">>/tmp/debug.log"); open (FD3, '<&3'); my @ltparams; my $count = 0; while (<FD3>) { chomp; $ltparams[$count] = $_; $count = $count + 1; }
if ($count){ print DEBUG "longtask\n"; my $res = longtask(); open (FD3, '>&3'); seek(FD3, 0, 0); truncate(FD3, 0); if($res){ print FD3 "ERR $res\n"; } else { print FD3 "OK!\n"; } system "/usr/local/ispmgr/sbin/mgrctl -m billmgr longtask"; exit; } }
foreach $x(@ARGV) { if ($x eq "pmtune"){ pmtune(); } if ($x eq "feature"){ print "pmtune pmvalidate crtune crget crset"; } if ($x eq "pmvalidate"){ pmvalidate(); } if ($x eq "crtune"){ crtune(); } if ($x eq "crget"){ crget(); } if ($x eq "crset"){ crset(); } } close(DEBUG);
sub longtask(){ print DEBUG $ltparams[1]; if($ltparams[1] eq "crset"){ crset(); } }
sub GetInputXml(){ my $input; my $buf = <STDIN>; while($buf) { $input = "$input$buf"; $buf = <STDIN>; } return $input; }
sub pmvalidate{ my $parser = XML::LibXML->new(); my $xml = $parser->parse_string(GetInputXml()); @testinput = $xml->getElementsByTagName('testinput'); print DEBUG $testinput[0]->textContent; if($testinput[0]->textContent eq "test"){ print "pmok"; } else { print "Error: testinput"; } }
sub pmtune{ my $input = GetInputXml; my $parser = XML::LibXML->new(); my $xml = $parser->parse_string($input); my $root = $xml->getDocumentElement(); my $elem2 = $xml->createElement("slist"); $elem2->setAttributeNode($xml->createAttribute("name","testselect")); my $slist1=$xml->createElement("msg"); $slist1->appendText( "select_1"); $elem2->appendChild($slist1); my $slist2=$xml->createElement("msg"); $slist2->appendText( "select_2"); $elem2->appendChild($slist2); my $slist3=$xml->createElement("msg"); $slist3->appendText( "select_3"); $elem2->appendChild($slist3); $root->appendChild($elem2); #print DEBUG $root->toString; print $root->toString; }
sub crtune{ my $input = GetInputXml; my $parser = XML::LibXML->new(); my $xml = $parser->parse_string($input); my $root = $xml->getDocumentElement(); my $elem2 = $xml->createElement("slist"); $elem2->setAttributeNode($xml->createAttribute("name","testselect")); my $slist1=$xml->createElement("msg"); $slist1->appendText( "select_1"); $elem2->appendChild($slist1); my $slist2=$xml->createElement("msg"); $slist2->appendText( "select_2"); $elem2->appendChild($slist2); my $slist3=$xml->createElement("msg"); $slist3->appendText( "select_3"); $elem2->appendChild($slist3); $root->appendChild($elem2); #print DEBUG $root->toString; print $root->toString; }
sub crget{ my $input = GetInputXml; my $parser = XML::LibXML->new(); my $xml = $parser->parse_string($input); my $root = $xml->getDocumentElement(); my @xelid = $xml->getElementsByTagName('elid'); #print DEBUG $xelid[0]->textContent; my $elid = $xelid[0]->textContent; $user = "root"; $password = "1"; $database = "billmgr"; $host = "localhost"; my $query="select cr.nativeamount, cr.state, cu.iso, type.params from credit cr \ join companycrtype type on type.id=cr.type join currency cu on cu.id=type.currency where cr.id=$elid"; $dbh = Mysql->Connect($host,$database,$user,$password); $sth = $dbh->Query($query); @arr = $sth->FetchRow; my $elem = $xml->createElement("amount"); $elem->appendText("$arr[0] $arr[2]"); $root->appendChild($elem); if($arr[1] eq "4"){ $elem = $xml->createElement("merchant"); $elem->appendText("GoMerchant($elid, this); return false;"); $root->appendChild($elem); } else { #$root->removeChild($xml->findnodes("//field/merchantfield")); } print $root->toString; }
sub crset(){ print DEBUG "\nin crset\n"; print DEBUG "credit id: $ltparams[2]"; return "crid $ltparams[2] Test error"; }


Exemple du document-XML

 <?xml version="1.0" encoding="UTF-8"?>
 <mgrdata>
   <metadata name="company.paymethod.edit_test" type="form">
     <form>
       <field name="name">
         <input type="text" name="name" empty="no"/>
       </field>
       <field name="minamount">
         <input type="text" name="minamount"/>
       </field>
       <field name="testselect">
         <select name="testselect"/>
       </field>
       <field name="testinput">
         <input type="text" name="testinput"/>
       </field>
     </form>
     <jscript>
       document.frm.func.value = 'company.paymethod.edit';
     </jscript>
   </metadata>
   <metadata name="credit.pay.test" type="form">
     <form>
       <field name="amount">
         <input type="text" name="amount" readonly="yes"/>
       </field>
       <field name="testselect">
         <select name="testselect"/>
       </field>
         <field name="merchantfield">
       <link name="merchant"/>
         </field>
     </form>
     <jscript>
       function GoMerchant(id, lnk) {
         window.open('/mancgi/testcgi?elid='+id);
         if (lnk) {
           lnk.className = 'disabled';
           lnk.onclick = function () { return false; }
         }
       }
     </jscript>
   </metadata>
   <lang name="en">
     <messages name="credit.pay.test">
       <msg name="amount">Amount</msg>
       <msg name="merchant">pay now</msg>
       <msg name="testselect">Testselect</msg>
       <msg name="title">Test pay method</msg>
       <msg name="hint_default">Fill form</msg>
       <msg name="hint_amount">Amount</msg>
     </messages>
   </lang>
 </mgrdata>
Cet article vous a-t-il été utile? Oui | Non
Outils personnels