Calculer la signature de l'IPN
La signature se calcule selon la même
logique utilisée lors de la demande de paiement.
Les données transmises par la plateforme de paiement sont encodées en UTF-8.
Toute altération des données reçues aboutira à un calcul de signature erroné.
Vous devez calculer la signature avec les champs reçus dans la notification et pas ceux que vous avez transmis dans la demande de paiement.
- Prenez en considération la totalité des champs dont le nom commence par vads_.
- Triez ces champs par ordre alphabétique.
- Concaténez les valeurs de ces champs en les séparant avec le caractère "+".
- Concaténez le résultat avec la clé de test ou de production en les séparant avec le caractère "+".
- Selon l'algorithme de signature défini dans la configuration de votre
boutique:
- si votre boutique est configurée pour utiliser "SHA-1", appliquez la fonction de hachage SHA-1 sur la chaîne obtenue à l'étape précédente. Déprécié.
- si votre boutique est configurée pour utiliser
"HMAC-SHA-256", calculez et encodez au format Base64 la signature du
message en utilisant l'algorithme HMAC-SHA-256
avec les paramètres suivants:
- la fonction de hachage SHA-256,
- la clé de test ou de production (en fonction de la valeur du champ vads_ctx_mode) comme clé partagée,
- le résultat de l'étape précédente comme message à authentifier.
Exemples en PHP
function getSignature ($params,$key) { /** * Fonction qui calcule la signature. * $params : tableau contenant les champs reçus dans l'IPN. * $key : clé de TEST ou de PRODUCTION */ //Initialisation de la variable qui contiendra la chaine à chiffrer $contenu_signature = ""; //Tri des champs par ordre alphabétique ksort($params); foreach($params as $nom=>$valeur){ //Récupération des champs vads_ if (substr($nom,0,5)=='vads_'){ //Concaténation avec le séparateur "+" $contenu_signature .= $valeur."+"; } } //Ajout de la clé en fin de chaine $contenu_signature .= $key; //Encodage base64 de la chaine chiffrée avec l'algorithme HMAC-SHA-256 $sign = base64_encode(hash_hmac('sha256',$contenu_signature, $key, true)); return $sign; }