Pessoal
No harbour temos essas funcoes disponiveis ? sem depender de nada externo ?
SHA-1 e base64
Moderador: Moderadores
function NFe_CSRT()
// #toya: 01/02/2019 - 15:23:23 - bnpx_gxn-2019 - Release .001.001
local Result := .t.
local cIdCSRT := ""
local cCSRT := ""
local cChaveNFe := ""
local cHashCSRT := ""
// Identificador do CSRT utilizado para montar o hash do CSRT
cIdCSRT := "01"
// O CSRT será um código alfanumérico (de 16 a 36 bytes) de conhecimento apenas
// da SEFAZ do emitente e da empresa responsável pelo sistema emissor de DFe.
// O conceito é bastante similar ao código CSC da NFCe
cCSRT := "G8063VRTNDMO886SFNK5LDUDEI24XJ22YIPO" //
cChaveNFe := "41180678393592000146558900000006041028190697"
// O hashCSRT é o resultado da função hash (SHA-1 – Base64) do CSRT fornecido pelo fisco mais a Chave de Acesso da NFe.
cHashCSRT := hb_sha1( cCSRT + cChaveNFe )
return Result
cHash := CSRT + cChave
cHash := Hb_SHA1( cHash, .t. ) // o segundo parãmetro deve ser .T. (Raw) e retorna uma string com 20 bytes.
cHash := hb_base64Encode( cHash, Len( cHash ) )retorna uma string com 28 caracteres, mas diferente do manual. Aqui sempre termina com 1 ou 2 sinais de igual dependo da combinação CSRT e Chave. Não sei se isso está correto, e tentei com várias codepages, nem sei se também faz diferença.
function NFe_CSRT()
local Result := .t.
local cIdCSRT := ""
local cCSRT := ""
local cChaveNFe := ""
local cHashCSRT := ""
local cBase64 := ""
cIdCSRT := "01"
cCSRT := "G8063VRTNDMO886SFNK5LDUDEI24XJ22YIPO"
cChaveNFe := "41180678393592000146558900000006041028190697"
cHashCSRT := hb_sha1( cCSRT + cChaveNFe )
msg_OK_titulo( 'cIdCSRT := "01"' + CRLF + 'cCSRT := "G8063VRTNDMO886SFNK5LDUDEI24XJ22YIPO"' + CRLF + 'cChaveNFe := "41180678393592000146558900000006041028190697"' + CRLF + 'cHashCSRT := hb_sha1( cCSRT + cChaveNFe )', "Hash do Código de Segurança do Responsável Técnico (CSRT)" )
cBase64 := HB_Base64Encode( HexToSTr( cHashCSRT ), 20 )
msg_OK_titulo( "<idCSRT>01</idCSRT>" + CRLF + "<hashCSRT>" + cBase64 + "</hashCSRT>", "Hash do Código de Segurança do Responsável Técnico (CSRT)" )
return Result
Function Main()
Clear Screen
cHash := "G8063VRTNDMO886SFNK5LDUDEI24XJ22YIPO"
cChave := "41180678393592000146558900000006041028190697"
/*
Passo 1: Concatenar o CSRT com a chave de acesso da NF-e/NFC-e
*/
cHash := cHash + cChave
?
? "Resultado passo 1: cHash + cChave:", cHash
/*
Passo 2: Aplicar o algorítmo SHA1 resultando em uma string de 40 caracteres em Hexadecimal:
*/
cHash := Hb_SHA1( cHash, .F. ) // se usar o segundo parâmetro como .T. (raw), elimine o passo 2A
?
? "Resultado passo 2 SHA1:", cHash
/*
Passo 2A: Passar Hexadecimal para String (usei assim apenas para entender o exemplo).
Se usar no passo acima dessa forma: cHash := Hb_SHA1( cHash, .T. ), elimene essa etapa.
*/
cHash := HexToStr( cHash )
?
? "Resultado passo 2A (Hex para Str):", cHash
/*
Passo 3: Passar o resultado anterior para Base 64, resultando numa string de 28 bytes:
*/
cHash := hb_base64Encode( cHash, Len( cHash ) )
cHash := StrTran( cHash, Hb_EOL() ) // sem quebra de linha (se der erro na validação, não use StrTran())
?
? "Resultado passo 3 (<hashCSRT> em Base 64):", cHash
?
? "Bingo: Agora o exemplo da NT esta certo..: aWv6LeEM4X6u4+qBI2OYZ8grigw="
?
Return Nil
Usuários vendo este fórum: Nenhum usuário registrado online e 7 visitantes