<!DOCTYPE html>
<html lang="fr">
    <head>
        <meta charset="UTF-8">
        <style>
            label {line-height: 2em;}
            .container {
                width: 400px;
                height:200px;
                margin:0 auto;
                padding-top: 50px;
            }
            .submit {
                line-height: 2em;
                margin-top:10px;
                border: 1px solid green;
                background-color: green;
                width: 100%;
                color: #ffffff;
            }
        </style>
    </head>
    <body>
        <div class="container">
            <form method="POST" action="form_payment.php">
                <input type="hidden" name="lang" value="fr">
    
                <label for="vads_order_id">Identifiant marchand de la commande (vads_order_id)</label>
                <input type="text" name="vads_order_id" value="123456" size=20>
                <br>
    
                <h4>Informations client:</h4>
                <label for="vads_cust_id">Numéro client (vads_cust_id)</label>
                <input type="text" name="vads_cust_id" value="2380" size=20>
                <br>
    
                <label for="vads_cust_name">Nom (vads_cust_name)</label>
                <input type="text" name="vads_cust_name" value="Gandalf Le Blanc " size=20>
                <br>
    
                <label for="vads_cust_address">Adresse (vads_cust_address)</label>
                <input type="text" name="vads_cust_address" value="Middleearth" size=20>
                <br>
    
                <label for="vads_cust_zip">Code postal (vads_cust_zip)</label>
                <input type="text" name="vads_cust_zip" value="5555" size=20>
                <br>
    
                <label for="vads_cust_city">Ville (vads_cust_city)</label>
                <input type="text" name="vads_cust_city" value="Fondcombe" size=20>
                <br>
    
                <label for="vads_cust_country">Pays (vads_cust_country)</label>
                <input type="text" name="vads_cust_country" value="FR" size=20>
                <br>
    
                <label for="vads_cust_phone">Téléphone (vads_cust_phone)</label>
                <input type="text" name="vads_cust_phone" value="0606060606" size=20>
                <br>
    
                <label for="vads_cust_email">Email (vads_cust_email)</label>
                <input type="text" name="vads_cust_email" size=20>
                <br>
    
                <label for="vads_amount">Montant du paiement (vads_amount)</label>
                <input type="text" name="vads_amount" value="1000" size=20>
                <br>
    
                <button class="submit" type="submit" class="validationButton">
                    Confirmer les informations et payer ma commande
                </button>
            </form>
        </div>
    </body>
</html>

>>> Fichier functions.php
<?php
/* générer identifiant de la transaction
* Ici la valeur du compteur est stockée dans un fichier, pour éviter les 
* doublons. 
* À vous de construire votre identifiant en fonction de vos données et de votre * implémentation.
* Vous pouvez par exemple avoir un compteur simple dont la valeur courante est 
* stockée en bdd et qui est remis à zéro à la première transaction du jour.
*/
function getTransId()
{
    $count = (int) file_get_contents('./compteur/count.txt', false, null, 0, 6);
    ++$count;
    if ($count < 0 || $count > 899999) {
        $count = 0;
    }
    // ne pas oublier les droits d’écriture
    file_put_contents('./compteur/count.txt', $count);
    // trans_id : on rajoute des 0 au début si nécessaire
    $transId = sprintf('%06d', $count);

    return $transId;
}
// génerer la signature
function getSignature($field, $key)
{
    ksort($field);
    $contenuSignature = '';
    foreach ($field as $nomField => $valeurField) {
        if ('vads_' == substr($nomField, 0, 5)) {
            $contenuSignature .= $valeurField.'+';
        }
    }
    $contenuSignature .= $key;
    //Encodage base64 de la chaîne chiffrée avec l'algorithme HMAC-SHA-256
    $signature = base64_encode(hash_hmac('sha256', $contenuSignature, $key, true));

    return $signature;
}
// vérifier la signature
function CheckSignature($field, $key)
{
    $result = false;
    $signature = getSignature($field, $key);
    if (isset($field['signature']) && ($signature == $field['signature'])) {
        $result = true;
    }
    return $result;
}
Fichier «form_payment.php»

<?php
include "functions.php";
// lecture de la conf
$confTxt = parse_ini_file('config.ini');
// avec du YAML on aurait fait yaml_parse('config.yml')
// TEST ou PRODUCTION
if ('TEST' == $confTxt['vads_ctx_mode']) {
    $confTxt['key'] = $confTxt['TEST_key'];
} else {
    die('Que pour les tests on a dit !');
}
// on ajoute les champs de la conf au champs du formulaire précédant
$fields = array_merge($_POST, $confTxt);
$params = [];
// construction d'un tableau de paramètres à passer au serveur de paiement
foreach ($fields as $fieldName => $fieldValue) {
    if ('vads_' == substr($fieldName, 0, 5)) {
        $params[$fieldName] = $fieldValue;
    }
}
// gestion des 3 champs générés automatiquement à chaque paiement
// ajout de l'ID de transaction, unique sur une journée, 6 digits
$params['vads_trans_id'] = getTransId();
// ajout de la date
$params['vads_trans_date'] = gmdate('YmdHis', time());
// ajout de la signature
$params['signature'] = getSignature($params, $confTxt['key']);
$_POST['vads_trans_id'] = $params['vads_trans_id'];
$_POST['vads_trans_date'] = $params['vads_trans_date'];
$_POST['signature'] = $params['signature'];
$form = '<form name="pay_form" method="POST" action="https://secure.payzen.eu/vads-payment/">';
if (1 == $confTxt['debug']) {
    $form .= '<div id="Info"><p><b><u>Infos de DEBUG</u></b></p>';
}
if (ksort($params)) {
    foreach ($params as $nomParam => $valeurParam) {
       // affichage si debug = ON
        if (1 == $confTxt['debug']) {
            $form .= $nomParam.' : '.$valeurParam.'<br/>';
        }
        $form .= '<input type="hidden" name="'.$nomParam.'" value="'.$valeurParam.'" />';
    }
}
// si debug ajouter un bouton pour valider l'envoi vers le serveur de paiement
if (1 == $confTxt['debug']) {
    $form .= '
      <button type="submit" class="validationButton" >
      <span><em>PAYER</em></span>
      </button></div></form>';
} else {
    $form .= '</div></form><div id="Info">Redirection vers la plateforme de paiement</div>';
   $form .= '<script language="JavaScript">document.pay_form.submit();</script>';
}
echo $form;

<?php
include 'functions.php';
echo '
<html>
   <head>
      <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
      <title>Merci pour votre achat</title>
   </head>
   <body>
      <div>
      ';
      $confTxt = parse_ini_file('config.ini');
      if ('TEST' == $conf_txt['vads_ctx_mode']) {
         $key = $conf_txt['TEST_key'];
      } else {
         die('Que pour les tests on a dit !');
      }
      $control = CheckSignature($_POST, $key);
      if ('true' != $control) {
         // Gérer l'erreur, afficher une 404, prévenir un admin par mail => stopper l’exécution ici ...
      }
      // Seulement quelques exemples de statut possibles
      if (isset($_REQUEST['vads_trans_status'])) {
         switch ($_REQUEST['vads_trans_status']) {
            case 'ABANDONED':
               echo 'Paiement abandonné';
               break;
            case 'AUTHORISED':
               echo 'Paiement accepté';
               break;
            case 'REFUSED':
               echo 'Paiement refusé';
               break;
            case 'CANCELLED':
               echo 'Paiement annulé';
               break;
            default:
               // Gérer l'erreur, code inconnu = comportement anormal, stopper l’exécution
               break;
         }
      } else {
         // Pas de statut dans le retour: gérer l'erreur, afficher une 404, prévenir un admin par mail => stopper l’exécution ici ...
      }
      // pendant le dév vous pouvez tout afficher
      foreach ($_POST as $nom => $valeur) {
         if ('vads_' == substr($nom, 0, 5)) {
            echo "$nom = $valeur <br/>";
         }
      }
   echo '</div>
   </body>
</html> 
';