
Si vous n’avez pas lu la première étape de ce tutoriel je vous conseille de le faire car, sans cela, ce qui va suivre ne vous sera pas d’un grand secours.
La première étape vous a donc permis d’afficher les cartes bleues, en cliquant sur l’une d’entre elles vous êtes redirigé vers le serveur de la banque et vous pouvez indiquer un numéro de carte bleue. Il faut maintenant configurer les fichiers en cas d’annulation par le client et les fichiers call_autoresponse.php ainsi que response.php
Pourquoi deux fichiers qui font la même chose
Le fichier call_response.php a le même rôle que response.php mais il a son importance. En effet, il est appelé automatiquement par le serveur de la banque pour renvoyer le résultat de la transaction. Vous me direz dans ce cas c’est response.php qui ne sert à rien. Et bien non, car vous ne pouvez pas savoir si l’utilisateur arrivera sur votre page de remerciement (celle qui appelle le fichier response.php) avant que le serveur de la banque n’ait appelé call_auto_response.php (parfois Internet c’est lent). Il faut donc que ces deux fichiers puissent faire le même traitement sans pour autant créer de doublon.
Ensuite chacun de ces deux fichiers a sa petite particularité. Call_autoresponse.php aura pour rôle non seulement de mettre à jour la base de données mais aussi d’écrire dans un fichier logs afin d’avoir une trace des transactions. Le fichier call_response.php quant à lui sera appelé par le navigateur du visiteur et pourra donc afficher des informations utiles (nous verrons que finalement , comme pour call_request.php, ce n’est pas lui qui affichera directement les messages).
Le fichier call_response.php
// Recuperation de la variable cryptee DATA
$message="message=$HTTP_POST_VARS[DATA]";
// Initialisation du chemin du fichier pathfile
$pathfile="pathfile=/homez.316/monsite/www/cbatos/pathfile";
// Initialisation du chemin de l'executable response
$path_bin = "/homez.316/monsite/cgi-bin/response";
// Appel du binaire response
$result=exec("$path_bin $pathfile $message");
// Sortie de la fonction : !code!error!v1!v2!v3!...!v29
// - code=0 : la fonction retourne les donnees de la transaction dans les variables v1, v2, ...
// : Ces variables sont decrites dans le GUIDE DU PROGRAMMEUR
// - code=-1 : La fonction retourne un message d'erreur dans la variable error
// on separe les differents champs et on les met dans une variable tableau
$tableau = explode ("!", $result);
// Recuperation des donnees de la reponse
$code = $tableau[1];
$error = $tableau[2];
$merchant_id = $tableau[3];
$merchant_country = $tableau[4];
$amount = $tableau[5];
$transaction_id = $tableau[6];
$payment_means = $tableau[7];
$transmission_date= $tableau[8];
$payment_time = $tableau[9];
$payment_date = $tableau[10];
$response_code = $tableau[11];
$payment_certificate = $tableau[12];
$authorisation_id = $tableau[13];
$currency_code = $tableau[14];
$card_number = $tableau[15];
$cvv_flag = $tableau[16];
$cvv_response_code = $tableau[17];
$bank_response_code = $tableau[18];
$complementary_code = $tableau[19];
$complementary_info = $tableau[20];
$return_context = $tableau[21];
$caddie = $tableau[22];
$receipt_complement = $tableau[23];
$merchant_language = $tableau[24];
$language = $tableau[25];
$customer_id = $tableau[26];
$order_id = $tableau[27];
$customer_email = $tableau[28];
$customer_ip_address = $tableau[29];
$capture_day = $tableau[30];
$capture_mode = $tableau[31];
$data = $tableau[32];
// analyse du code retour
if (( $code == "" ) && ( $error == "" ) )
{
$erreurMsg="<BR><CENTER>erreur appel response</CENTER><BR>";
$erreurMsg.="executable response non trouve $path_bin";
}
// Erreur, affiche le message d'erreur
else if ( $code != 0 ){
$erreurMsg="<center><b><h2>Erreur appel API de paiement.</h2></center></b>";
$erreurMsg.="<br><br><br>";
$erreurMsg.=" message erreur : $error <br>";
}
include('save_abo_bdd.php');
$path_file est le chemin du fichier path_file (comme pour call_request.php)
$path_bin est le chemin vers le fichier response
Le fichier save_abo_bdd.php correspond à VOTRE script qui va enregistrer les informations dans la base de données. Il devra se baser sur la valeur de la variable $response_code pour savoir si le paiement a été accepté.
Une fois votre fichier call_response.php prêt il vous suffit de l’inclure dans un fichier merci.php (le nom est libre mais il faudra penser à modifier votre fichier call_request.php car nous avons utilisé ce nom de fichier comme référence).
Le fichier call_autoresponse.php
le code de ce fichier est le même que celui de call_response.php à ceci près que l’on va remplacer la partie qui enregistre les erreurs dans la variable $erreurMsg par un code qui va écrire dans un fichier logs.txt
// Recuperation de la variable cryptee DATA
$message="message=$HTTP_POST_VARS[DATA]";
// Initialisation du chemin du fichier pathfile
$pathfile="pathfile=/homez.316/monsite/www/cbatos/pathfile";
// Initialisation du chemin de l'executable response
$path_bin = "/homez.316/monsite/cgi-bin/response";
// Appel du binaire response
$result=exec("$path_bin $pathfile $message");
// Sortie de la fonction : !code!error!v1!v2!v3!...!v29
// - code=0 : la fonction retourne les donnees de la transaction dans les variables v1, v2, ...
// : Ces variables sont decrites dans le GUIDE DU PROGRAMMEUR
// - code=-1 : La fonction retourne un message d'erreur dans la variable error
// on separe les differents champs et on les met dans une variable tableau
$tableau = explode ("!", $result);
// Recuperation des donnees de la reponse
$code = $tableau[1];
$error = $tableau[2];
$merchant_id = $tableau[3];
$merchant_country = $tableau[4];
$amount = $tableau[5];
$transaction_id = $tableau[6];
$payment_means = $tableau[7];
$transmission_date= $tableau[8];
$payment_time = $tableau[9];
$payment_date = $tableau[10];
$response_code = $tableau[11];
$payment_certificate = $tableau[12];
$authorisation_id = $tableau[13];
$currency_code = $tableau[14];
$card_number = $tableau[15];
$cvv_flag = $tableau[16];
$cvv_response_code = $tableau[17];
$bank_response_code = $tableau[18];
$complementary_code = $tableau[19];
$complementary_info = $tableau[20];
$return_context = $tableau[21];
$caddie = $tableau[22];
$receipt_complement = $tableau[23];
$merchant_language = $tableau[24];
$language = $tableau[25];
$customer_id = $tableau[26];
$order_id = $tableau[27];
$customer_email = $tableau[28];
$customer_ip_address = $tableau[29];
$capture_day = $tableau[30];
$capture_mode = $tableau[31];
$data = $tableau[32];
$logfile="/homez.316/monsite/www/cbatos/logs.txt";
// Ouverture du fichier de log en append
$fp=fopen($logfile, "a");
// analyse du code retour
if (( $code == "" ) && ( $error == "" ) ) {
fwrite($fp, "erreur appel response\n");
fwrite($fp, "executable response non trouve $path_bin\n");
}
// Erreur, sauvegarde le message d'erreur
else if ( $code != 0 ){
fwrite($fp, " API call error.\n");
fwrite($fp, "Error message : $error\n");
}
else {
// OK, Sauvegarde des champs de la reponse
fwrite( $fp, "merchant_id : $merchant_id\n");
fwrite( $fp, "merchant_country : $merchant_country\n");
fwrite( $fp, "amount : $amount\n");
fwrite( $fp, "transaction_id : $transaction_id\n");
fwrite( $fp, "transmission_date: $transmission_date\n");
fwrite( $fp, "payment_means: $payment_means\n");
fwrite( $fp, "payment_time : $payment_time\n");
fwrite( $fp, "payment_date : $payment_date\n");
fwrite( $fp, "response_code : $response_code\n");
fwrite( $fp, "payment_certificate : $payment_certificate\n");
fwrite( $fp, "authorisation_id : $authorisation_id\n");
fwrite( $fp, "currency_code : $currency_code\n");
fwrite( $fp, "card_number : $card_number\n");
fwrite( $fp, "cvv_flag: $cvv_flag\n");
fwrite( $fp, "cvv_response_code: $cvv_response_code\n");
fwrite( $fp, "bank_response_code: $bank_response_code\n");
fwrite( $fp, "complementary_code: $complementary_code\n");
fwrite( $fp, "complementary_info: $complementary_info\n");
fwrite( $fp, "return_context: $return_context\n");
fwrite( $fp, "caddie : $caddie\n");
fwrite( $fp, "receipt_complement: $receipt_complement\n");
fwrite( $fp, "merchant_language: $merchant_language\n");
fwrite( $fp, "language: $language\n");
fwrite( $fp, "customer_id: $customer_id\n");
fwrite( $fp, "order_id: $order_id\n");
fwrite( $fp, "customer_email: $customer_email\n");
fwrite( $fp, "customer_ip_address: $customer_ip_address\n");
fwrite( $fp, "capture_day: $capture_day\n");
fwrite( $fp, "capture_mode: $capture_mode\n");
fwrite( $fp, "data: $data\n");
fwrite( $fp, "-------------------------------------------\n");
}
include('save_abo_bdd.php');
Dans le cas présent cela suppose que le fichier logs.txt se trouve dans le dossier cbatos à la racine de mon site et avec l’autorisation d’écriture. (CHMOD je sais plus combien
)
Le fichier annulation.php
Ce fichier est finalement le même que le fichier merci.php, il devra inclure call_response.php et mettre à jour la base de données. La seule différence est qu’il n’affichera pas forcément le même message. Vous pouvez parfaitement utiliser votre fichier merci.php pour gérer les annulations (il suffit d’étudier response_code pour savoir si la transaction est validée ou annulée).
Vous pouvez également lire « les erreurs fréquentes lors de l’installation d’un paiement Atos« .
Tags : atos, paiement sécurisé, sips
- Permalien
- maniT4c
- 18 déc 2009 7:32
- Commentaires (13)
le 20 décembre 2009 à 12:56
Merci pour ce tutoriel simple et clair qui devrait aider pas mal de monde
le 5 janvier 2010 à 12:19
Thx pour ce tuto hyper simple !!
le 9 janvier 2010 à 13:32
Bonjour,
Le site bestfoiegras.com marchand a fonctionné sur une ancienne version ATOS/SIPS; après une mise-à-jour de OSC 2.2 et ATOS 6 le paiement en ligne par e-transactions ne fonctionne plus:
Le fichiers sont bien installé, les « request » et « reponse » dans le dossier /atos/.
La page des CC de la banque s’affiche, mais je n’ai pas de rétour des commandes.
Je suis étonné par vos fichiers response.php, call_request.php, et call_response.php qui ne figurent pas dans la version OSC 2.2, par contre atos_response.php est présent.
Dans l’ancienne version du site les fichiers « request » et « response » étaient dans le répertoire /cgi-bin/, à la racine du site (sur OVH) et le chemin évidement été /homez.yy/xxxxx/cgi-bin/request.
Avec remerciement,
– einar
le 9 janvier 2010 à 14:43
le nom des fichiers importe peu du moment que les appels de ces fichiers sont justes.
Je ne connais pas bien OSC je ne l’ai jamais utilisé. Il doit y avoir un fichier de log qui est écrit lors de la réponse de la banque. Vous devriez commencer par l’ouvrir et voir ce qui y ai inscrit.
Si vous n’avez rien qui s’ajoute dans ce fichier lorsque vous faites un test c’est que l’erreur se pose avant l’écriture dans le fichier. Si vous avez les messages qui s’affiche vous devriez y voir l’erreur.
le 28 avril 2010 à 21:30
est-ce que quelqu’un a pu installer atos sur des systemes non bases sur linux et processeurs de type x86 intel ou compatibles? (windows exclu aussi)
le 29 avril 2010 à 8:05
bonjour @d godefroy et merci pour ton commentaire.
Je n’ai jamais installé de paiement sécu sur un autre type de serveur qu’un Linux. Par contre si ma mémoire est bonne lorsque tu contact la banque pour obtenir les fichiers de l’api ainsi que la documentation tu dois leur spécifier le système d’exploitation du serveur afin qu’ils t’envoient le bon lot de fichiers.
Mais si tu es ni sous linux ni sous windows je pense que ça va être difficile. Le mieux est de contacter le service technique d’atos.
le 8 octobre 2010 à 16:08
Pour:
// Initialisation du chemin de l’executable response
$path_bin = « /homez.316/monsite/cgi-bin/response »;
Je recommande:
$path_bin = realpath(‘/’). »/cgi-bin/response »;
C’est sans doute évident pour la majorité d’entre vous, cela permet de s’affranchir d’une modification du Home Dir de l’utilisateur.
le 16 novembre 2010 à 18:46
request non trouvé , pourtant le chemin est bon (phpinfo.php) les droits dossier et fichiers sont en 755 et l’api est 64 bits sur serveur 64 bits
jamais vu une merde comme ce truc d’atos
le 17 février 2011 à 17:37
Bonjour !
Mon problème est étrange. Tout semble fonctionner, j’ai un envoie d email au client en cas de paiement, et la carte fonctionne (je suis en pré-prod, donc je ne peux pas vérifier si le débit est effectif, mais a priori, tout est bon).
Mon souci, c’est que quand je reviens sur ma page MERCI.PHP ou ANNULATION.PHP, dans les deux cas, j’ai ce message d’erruer, venant de Call_Response.php :
———
Erreur appel API de paiement.
message erreur :
API ERROR
Error get DATA response parameter (wrong length)
———
Je n’arrive pas a m’en défaire, et je ne comprends vraiment pas ou est l’erreur !
Merci à toi Manitac en tout cas, ton tuto m’a enlevé une fière chandelle du pied !
le 23 juin 2011 à 20:15
Bonsoir,
Chacun sait que les 2 problèmes principaux sont: les droits sur les fichiers et répertoire et la déclaration des chemins…
Pour compliquer voici un jolie bug sur lequel j’ai séché aujourd’hui :
les variables F_DEFAULT, F_PARAM et F_CERTIFICATE du fichier pathfile sont limitées en taille!!! (78 caractères je crois mais j’ai pas le courage de vérifier!)
J’ai donc été obligé de déplacer mon site dans l’arbo du serveur… grr
Bon courage
le 24 juin 2011 à 7:45
Merci @benoit pour le partage j’ai jamais rencontré le problème mais j’avoue ne pas avoir compte les caractères à ce niveau
.
le 21 septembre 2011 à 12:03
Merci pour ce tuto
mais comment le commerçant peut-il savoir que le paiement a été effectué
merci
sophie
le 21 septembre 2011 à 13:34
@sofyt c’est le rôle du fichier ’save_abo_bdd.php’ qui va d’une part modifier la base de donnée selon le résultat renvoyé par la banque et pourquoi pas avertir le commerçant par email.
Mais comme je l’explique dans le tuto ce fichier dépend entièrement du développement interne du site.