Construir o cabeçalho SOAP HEADER da solicitação

Para construir o cabeçalho SOAP HEADER:

  1. Acrescentar um novo cabeçalho chamado shopId cujo valor será o código da loja.
    Pode encontrar o valor no seu Back Office Estabelecimento comercial selecionando o menu Configuração > Loja > aba Chaves.
  2. Acrescentar um novo cabeçalho chamado timestamp.

    O valor dele especifica a representação numérica da data e da hora da solicitação, codificado em formato ISO 8601 - W3C e UTC.

    Exemplo de geração em PHP :
    $timestamp = gmdate("Y-m-d\TH:i:s\Z");
    Resultado: 2014-10-31T16:38:19Z
  3. Acrescentar um novo cabeçalho chamado mode.
    O valor dele permite definir o tipo de transação. Pode ter o valor TEST (para uma transação de teste) ou PRODUCTION (para uma transação real).
  4. Acrescentar um novo cabeçalho chamado requestId.

    O atributo requestId é um UUID (código universal único). O valor dele permite calcular a ficha de autenticação.

    O atributo requestId deve ser gerado pelo site de e-commerce. O formato dele deve respeitar a síntaxe xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx (onde M=1,2,3,4,5 e N=8,9,A,B).

    • Exemplo de geração em JAVA :
      java.util.UUID.randomUUID().toString();
    • Exemplo de geração em 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));
      }
    • Exemplo de geração em ASP.NET :
      System.Guid.NewGuid().toString();
  5. Acrescentar um novo cabeçalho chamado authToken.
    Para obter o valor dele:
    1. Concatenar os atributos requestId e timestamp sem separador.

      Exemplo de resultado de concatenação com :

      • requestId = 04967dae-af01-43ff-a7d8-f3f228b9b1c2
      • timestamp = 2014-10-31T16:38:19Z
        "04967dae-af01-43ff-a7d8-f3f228b9b1c22014-10-31T16:38:19Z"
    2. Aplicar o algoritmo HMAC_SHA256 no string obtido com o valor do chave de teste ou de produção (em função do valor de mode) como chave compartilhada.

    3. Codificar o resultado em Base64.
    • Exemplo de implementação em 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 );  
    }

    Observação: a implementação se baseia na classe Mac do package javax.crypto.

    Exemplo de chamada em JAVA

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

    • Exemplo de implementação em PHP:
    //$data est la concaténation des attributs requestId et timestamp
    //$shopKey est la valeur de la clé
    
    <?php $authToken = base64_encode(hash_hmac('sha256',$data, $shopKey, true));?>

    • Exemplo de implementação em 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)));
    }
    Exemplo de chamada em ASP.NET:
    HmacSha256("RF5GJlpZwcra2N7Ie/04Xn/SxFVnqy/61Yr6F6lFrHo=", "1234567887654321")
    Resultado :
    <soapHeader:authToken>NxoFUSsTqmMjwaDzTXyCN4nNpMOVJKb5UxHdS9TBuTg=</soapHeader:authToken>