segunda-feira, 23 de janeiro de 2012

Assinando o RPS da NFS-e de São Paulo

Há algum tempo atrás eu tive de implementar uma interface para emissão de NFS-e na prefeitura de São Paulo, e na época pesquisando em alguns forums vi que bastante gente tinha problema para gerar a assinatura do RPS que vai dentro da tag assinatura.
Após algumas pesquisas na internet e no manual da prefeitura eu consegui gerar essa assinatura, abaixo vou mostrar como fazer isso em java utilizando um certificado A1. O que veremos nesse post é como gerar o hash de assinatura de RPS (conteúdo da tag assinatura) e não como assinar o XML para envio.
Antes de mais nada você precisa ter a sequencia de caracateres ASCII a ser assinada, se não sabe como gerá-la consulte o manual NFe-Web-Service-v2-2 da prefeitura da página 23 a 25, pois lá explica detalhadamente como montar essa sequencia.

Primeiro importe as classes  Signature e BASE64Encoder


Agora inclua o método que faz a assinatura da sequencia ASCII


Primeiro é obtida uma instância do algorítimo RSA-SHA1, em seguida é informada a chave privada do certificado, a sequencia é convertida para bytes e finalmente o HASH é gerado.
O método getPrivateKey pode ser substituido pelo seu próprio método que obtem a chave privada do certificado, ou se preferir pode utilizar o exemplo abaixo:

Espero que isso ajude vocês em seus projetos de NFS-e para São Paulo. Valeu!!!

3 comentários:

  1. Código claro e simples.

    Gero a string assinada mas quando envio o lote dá Assinatura Digital Incorreta. Alguma ideia?

    ResponderExcluir
  2. Alguém ja assinou A TAG Assinatura da NFSe de São Paulo em ABAP?

    ResponderExcluir
  3. Pra mim também dá sempre o mesmo erro: Assinatura Digital do RPS incorreta. Todos os valores da string estão conforme o manual informa.
    Alguém ja assinou A TAG Assinatura da NFSe de São Paulo.

    ResponderExcluir