Construire l'en-tête SOAP HEADER de la requête

Pour construire l'en-tête SOAP HEADER :

  1. Ajoutez un nouvel en-tête nommé shopId dont la valeur sera l'identifiant de la boutique.
    Sa valeur est disponible sur votre Back Office Marchand en sélectionant le menu Paramétrage > Boutique > onglet Certificats.
  2. Ajoutez un nouvel en-tête nommé timestamp.

    Sa valeur spécifie la représentation numérique de la date et de l'heure de la requête, codée dans le format ISO 8601 - W3C et UTC.

    Exemple de génération en PHP :
    $timestamp = gmdate("Y-m-d\TH:i:s\Z");
    Résultat : 2014-10-31T16:38:19Z
  3. Ajoutez un nouvel en-tête nommé mode.
    Sa valeur permet de définir le type de transaction. Elle peut être valorisée à TEST (pour une transaction de test) ou à PRODUCTION (pour une transaction réelle).
  4. Ajoutez un nouvel en-tête nommé requestId.

    L'attribut requestId est un UUID (identifiant universel unique). Sa valeur permet de calculer le jeton d'authentification.

    L'attribut requestId doit être généré par le site marchand. Son format doit respecter la syntaxe xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx (où M=1,2,3,4,5 et N=8,9,A,B).

    • Exemple de génération en JAVA :
      java.util.UUID.randomUUID().toString();
    • Exemple de génération en PHP :
      function gen_uuid() {
      	if (function_exists('random_bytes')) {
      		// PHP 7
      		$data = random_bytes(16);
      	} elseif (function_exists('openssl_random_pseudo_bytes')) {
      		// PHP 5.3, Open SSL required
      		$data = openssl_random_pseudo_bytes(16);
      	} else {	
      		return sprintf(
      			'%04x%04x-%04x-%04x-%04x-%04x%04x%04x',
      			mt_rand(0, 0xffff),
      			mt_rand(0, 0xffff),
      			mt_rand(0, 0xffff),
      			mt_rand(0, 0x0fff) | 0x4000,
      			mt_rand(0, 0x3fff) | 0x8000,
      			mt_rand(0, 0xffff),
      			mt_rand(0, 0xffff),
      			mt_rand(0, 0xffff)
      		);
      	}
      	
      	$data[6] = chr(ord($data[6]) & 0x0f | 0x40); // set version to 100
      	$data[8] = chr(ord($data[8]) & 0x3f | 0x80); // set bits 6 & 7 to 10
      	
      	return vsprintf('%s%s-%s-%s-%s-%s%s%s', str_split(bin2hex($data), 4));
      }
    • Exemple de génération en ASP.NET :
      System.Guid.NewGuid().toString();
  5. Ajoutez un nouvel en-tête nommé authToken.
    Pour obtenir sa valeur :
    1. Concaténez les attributs requestId et timestamp sans séparateur.

      Exemple de résultat de concaténation avec :

      • requestId = 04967dae-af01-43ff-a7d8-f3f228b9b1c2
      • timestamp = 2014-10-31T16:38:19Z
        "04967dae-af01-43ff-a7d8-f3f228b9b1c22014-10-31T16:38:19Z"
    2. Appliquez l'algorithme HMAC_SHA256 sur la chaîne obtenue en utilisant la valeur du certificat de test ou de production (en fonction de la valeur de mode) comme clé partagée.

    3. Encodez le résultat en Base64.
    • Exemple d'implémentation en JAVA 7 :
    public String hmacsha256(String stringToSign , String key ){
    	try {            
    		byte[] bytes = encode256 ( key .getBytes( "UTF-8" ), stringToSign .getBytes( "UTF-8" ));
    		return Base64.encodeBase64String( bytes );
    	} catch (Exception  e ){
    		throw new RuntimeException( e );
    	} 
    }    
    private static byte[] encode256(byte[]keyBytes, byte[] text ) throws NoSuchAlgorithmException, InvalidKeyException {
    	Mac  hmacSha1 ;
    	try {
    		hmacSha1 = Mac.getInstance ( "HmacSHA256" );
    	} catch (NoSuchAlgorithmException  nsae ){
    		hmacSha1 = Mac.getInstance ( "HMAC-SHA-256" );
    	}
    	SecretKeySpec macKey = new SecretKeySpec( keyBytes, "RAW" );
         hmacSha1.init( macKey );
    	return hmacSha1 .doFinal( text );  
    }

    Remarque : l’implémentation est basée sur la classe Mac du package javax.crypto.

    Exemple d'appel en JAVA:

    hmacsha256("04967dae-af01-43ff-a7d8-f3f228b9b1c22014-10-31T16:38:19Z", "1234567887654321")

    • Exemple d'implémentation en PHP :
    //$data est la concaténation des attributs requestId et timestamp
    //$shopKey est la valeur du certificat
    
    <?php $authToken = base64_encode(hash_hmac('sha256',$data, $shopKey, true));?>

    • Exemple d'implémentation en ASP.NET :
    private static byte[] StringEncode (string text)
    {
    	var encoding = new ASCIIEncoding();
    	return encoding.GetBytes(text);
    }
    private static string HashEncode(byte[] hash)
    {
    	return System.Convert.ToBase64String(hash)
    }
    private static byte[] HashHMAC (byte[] key, byte[] message)
    {
    	var hash = new HMACSHA256(key);
    	return hash.ComputeHash(message);
    }
    public String HmacSha256(String stringToSign, String key)
    {
    	return HashEncode(HashHMAC(StringEncode(key), StringEncode(stringToSign)));
    }
    Exemple d'appel en ASP.NET :
    HmacSha256("RF5GJlpZwcra2N7Ie/04Xn/SxFVnqy/61Yr6F6lFrHo=", "1234567887654321")
    Résultat :
    <soapHeader:authToken>NxoFUSsTqmMjwaDzTXyCN4nNpMOVJKb5UxHdS9TBuTg=</soapHeader:authToken>