Página 4 de 5

NFS-e PMSP

Enviado: 25 Ago 2017 16:06
por JoséQuintas
Eu fiz um teste com o meu código do jeito que ta, e funcionou no A3 tbm ! na máquina do financeiro
E o que teve de diferente? alguma coisa que mencionei?

Nota: Eu apenas fui organizando, e na organização algumas coisas chamaram a atenção e postei.

NFS-e PMSP

Enviado: 25 Ago 2017 16:17
por JoséQuintas
está bem mais bonito o código assim !
Aí que está, não é questão de estar bonito.
É que está claro aonde estão as coisas, e fica melhor de trabalhar no fonte.
Considerar apenas porque é bonito de ver, a gente acaba achando que se trata de "frescura", e acabamos não fazendo.

Na prática, organizado fica bom de trabalhar, de enxergar as coisas, e de resolver problemas.
Estar bonito acaba sendo só uma consequência, não o ponto principal.

Ah é... e também porque aí só trata a parte do governo, não os detalhes de criação do XML.
Separar em partes ajuda, porque não mistura "assuntos".

NFS-e PMSP

Enviado: 25 Ago 2017 16:26
por JoséQuintas
Só aproveitando... no caso da SefazClass

Código: Selecionar todos

METHOD MDFeStatusServico( cUF, cCertificado, cAmbiente ) CLASS SefazClass

   ::Setup( cUF, cCertificado, cAmbiente, WS_MDFE_STATUSSERVICO )

   ::cSoapVersion := "1.00"
   ::cXmlEnvio    := [<consStatServMDFe versao="] + ::cSoapVersion + [" xmlns="http://www.portalfiscal.inf.br/mdfe">]
   ::cXmlEnvio    +=    XmlTag( "tpAmb", ::cAmbiente )
   ::cXmlEnvio    +=    XmlTag( "cUF", ::UFCodigo( ::cUF ) )
   ::cXmlEnvio    +=    XmlTag( "xServ", "STATUS" )
   ::cXmlEnvio    += [</consStatServMDFe>]
   ::XmlSoapPost()

   RETURN ::cXmlRetorno
Nesse caso cria o XML e já faz a comunicação.
Todos os parâmetros "diferentes" acabam sendo definidos em ::Setup()
A única coisa que resta pra conferir é mesmo o XML de consulta status.

É como eu disse antes: é relativamente simples, mas é chato e com detalhes.

É entregar o XML num endereço e acionar uma ação (SOAP ACTION).
Mas tem vários endereços diferentes, o envelope pode ter algum detalhe diferente, e SEMPRE depende do XML.
Boa parte do projeto NFE, CTE e MDFE é só pra escolher endereço, SOAP Action e Serviço.
A coisa em si, é simples: criar um XML, entregar num endereço, e pegar a resposta.

NFS-e PMSP

Enviado: 28 Ago 2017 13:22
por eduardomc00
Zé boa tarde.

Quando digo bonito, quero dizer fácil, legível, que da gosto de ver.

Sobre precisar do EXE da assinatura, tem uns procedimentos antes da assinatura que no Harbour eu não consegui fazer. inclusive, na época postei aqui no fórum e ninguém consegui me ajudar.

Simplesmente troquei de máquina no financeiro e funcionou. pode ser alguma coisa no certificado que foi instalado como novo drive. sei la

NFS-e PMSP

Enviado: 17 Abr 2018 10:22
por Toledo
JoséQuintas escreveu:Um primeiro protótipo.

https://github.com/JoseQuintas/nfse-sp- ... EClass.prg
Este link está quebrado... teria como compartilhar um novo link para o arquivo?

NFS-e PMSP

Enviado: 18 Abr 2018 10:03
por JoséQuintas
Como era parcial, e ficou parado, acabei excluindo.
Mas ainda estava aqui na máquina.
NFSEClass.prg
(6.12 KiB) Baixado 125 vezes
Talvez interessante eu deixar na pasta de rascunhos (drafts) da Sefazclass, assim como já tem esocial, e outros mais.

NFS-e PMSP

Enviado: 18 Abr 2018 10:19
por JoséQuintas
Pronto.
Na dúvida sobre o .XXX, porque nem lembrava mais disso.
Provavelmente é depois das alterações do post.

https://github.com/JoseQuintas/sefazcla ... EClass.prg
https://github.com/JoseQuintas/sefazcla ... nfsesp.xxx

Emito as minhas via TXT, sem certificado, opção disponível pra empresas do simples.
Não sei se fica disponível pra quem usa certificado.

NFS-e PMSP

Enviado: 15 Ago 2019 22:10
por luiz augusto
Boa Noite,

Baixei o exe que o Eduardomc00 disponibilizou pra assinar a TAG assinatura da NFSe paulistana, consegui montar o xml, criar a assinatura da TAG e assinar o o arquivo, mas ao enviar recebo a seguinte mensagem de erro:

<Erro xmlns=""><Codigo>1206</Codigo><Descricao>Assinatura Digital do RPS incorreta - String verificada (56663072A 00000003803720190815TNN00000000000010000000000000000008494300000000000000)
Já fiz e refiz varias vezes e dá sempre o mesmo erro. Algum colega que tenha finalizado a rotina de nota paulistana poderia dar alguma dica do que está faltando pra resolver o problema?

Agradeço,
Luiz Augusto

NFS-e PMSP

Enviado: 15 Ago 2019 22:28
por JoséQuintas
Já pesquisou por caracteres especiais?
Eles dão diferença de codepage e acabam causando diferença na assinatura.

NFS-e PMSP

Enviado: 15 Ago 2019 23:54
por Nascimento
acompanhando ... :)Pos

NFS-e PMSP

Enviado: 16 Ago 2019 23:13
por luiz augusto
Boa noite Quintas,

Obrigado por responder,

O arquivo StringParaAssinar.txt que eu crio com os dados necessarios para criar a assinatura, tem duas linhas, a primeira é o Serial do Certificado e a segunda, a string com as informações do rps, conforme abaixo:

A tag assinatura é composta pelo seguinte conteúdo:

************************COLOCAR AQUI A CHAVE PARA COMPARAR PARA VER SE ESTÁ CERTO*********************

+-------+----+-----------+-------++++--------------+--------------+----++-------------++-------------+
123456781234512345678901212345678111123456789012345123456789012345123451123456789012341123456789012341
+-------+----+-----------+-------++++--------------+--------------+----++-------------++-------------+
| | | | |||| | | || || |
A B C D EFGH I J KL MN O
+------------------------------------------+-------------+
| A-Inscrição Municipal do Prestador | 8 dígitos |
| B-Série do RPS | 5 diditos |
| C-Número do RPS | 12 dígitos |
| D-Data de Emissão do RPS | 8 dígitos |
| E-Tipo de Tributação do RPS | 1 dígito |
| F-Status do RPS | 1 dígito |
| G-ISS Retido | 1 dígito |
| H-Valor dos Serviços | 15 dígitos |
| I-Valor das deduções | 15 dígitos |
| J-Código do Serviço Prestado | 5 dígitos |
| K-Indicador de CPF/CNPJ do tomador | 1 dígito |
| L-CPF/CNPJ do tomador | 14 dígitos |
| M-Indicador de CPF/CNPJ do Intermediário | 1 dígito |
| N-CPF/CNPJ do Intermediário | 14 dígitos |
| O-ISS Retido Intermediário | 1 dígito |
+------------------------------------------+-------------+
| TOTAL DE DÍGITOS | 102 dígitos |
+------------------------------------------+-------------+

o que eu reparei, é que tanto na primeira linha, como na segunda, tem o CR + LF, mas se eu tirar isso da primeira linha, o arquivo passa a ter somente uma linha e dai o executavel não vai ler corretamente o arquivo, pois o mesmo só vai ter uma linha após retirar o CR + LF. Na segunda linha, não dá problema se retirar os caracteres.

Após assinar, dai retiro estes caracteres da string assinada, conforme abaixo:

cRET := MEMOREAD( "StringAssinada.txt" )
cRET := STRTRAN( cRET, CHR(13), "" )
cRET := STRTRAN( cRET, CHR(10), "" )

O fato é que ainda não consegui resolver está pendencia, agradeço quem puder ajudar,

Luiz

NFS-e PMSP

Enviado: 17 Ago 2019 00:48
por JoséQuintas
Agora não entendi mais nada.
XML é tudo numa linha só.

NFS-e PMSP

Enviado: 17 Ago 2019 10:48
por luiz augusto
Bom dia,

hehe, eu explico:
está é a string pra assinar

7B4A1C1D8CD520A7394E5446394B44F7
56663072A 00000003803720190815TNN00000000000010000000000000000084942300000000000000
que é gravada em um arquivo txt que o exe assinarps vai ler gravado com este comando


nHandle := FCREATE( "StringParaAssinar.txt" )
FWRITE( nHandle, cSerialCert + CHR(13) + CHR(10) + cCHA )
FCLOSE( nHandle )

ok?

Ao assinar, o assinarps.exe cria um arquivo chamado StringAssinada.txt com este conteudo:

Xbv4k4G75Zc4+1zemN54pWal6ky2Zm+xw1WJ8gR9FKngTNAwAM2CDsdkvB/7KmiIaRtTJDzVASAH3UcMK7xWqAVruUjBj9d+EWnZIzloePkO7gUYpt+KuG9InTuq6Uu/ylM+t95clGH+oggpYEkeTtA6nL5an7tIW4o+rsnefZpHAaA56/ofqmQC3Ov4ZL2XVe0IwOMViQjObyFGKmKlIjkxDVMMWeqgFm2cfQ786ck7/QD4E2tprufd1Pta17wbDIYAqL1igVVOUQ5392VVHYrKdpGl7EWRIRa9cDIZPVhHpe9dxNzwQtMysh0HfuR3i8/1WaPfX9AElEEQE+cJkw==

que vou ler com este comando

cRET := MEMOREAD( "StringAssinada.txt" )
cRET := STRTRAN( cRET, CHR(13), "" )
cRET := STRTRAN( cRET, CHR(10), "" )

incluindo na TAG assinatura.

Ao enviar para webservice, recebo este retorno:

<Erro xmlns=""><Codigo>1206</Codigo><Descricao>Assinatura Digital do RPS incorreta - String verificada (56663072A 00000003803720190815TNN00000000000010000000000000000008494300000000000000)</Descricao><ChaveRPS><InscricaoPrestador>56663072</InscricaoPrestador><SerieRPS>A</SerieRPS><NumeroRPS>38037</NumeroRPS></ChaveRPS></Erro>

É isso.

Luiz

NFS-e PMSP

Enviado: 31 Ago 2022 08:13
por malcarli
Bom dia, preciso implementar nfse para sp. A classe do Mestre Quintas, falta a assinatura e portanto infelizmente não dá para usar e não sei implementar a mesma. Alguém teria os arquivos mais atualizados da versão do colega Eduardo e que esteja funcionando para compartilhar para todos nós?

Obrigado


Att.

Marcelo A. L. Carli
Marília/SP
Capital Nacional do Alimento ®
https://malc-informatica.ueniweb.com
Insta: @malcarli25
Email / Skype: malcarli@life.com.br

NFS-e PMSP

Enviado: 31 Ago 2022 11:37
por JoséQuintas
Eu dei uma idéia de como assinar usando a sefazclass.
Primeiro é assinar a nota, e depois o lote.
Na assinatura da nota, é direto, normal.

Dentro de ze_sefazassina:

Código: Selecionar todos

STATIC FUNCTION AssinaAjustaInformacao( cTxtXml, cXmlTagInicial, cXmlTagFinal, cRetorno, lComURI )

   LOCAL aDelimitadores, nPos, nPosIni, nPosFim, cURI

   aDelimitadores := { ;
      { "<enviMDFe",              "</MDFe></enviMDFe>" }, ;
      { "<eventoMDFe",            "</eventoMDFe>" }, ;
      { "<eventoCTe",             "</eventoCTe>" }, ;
      { "<infMDFe",               "</MDFe>" }, ;
      { "<infCte",                "</CTe>" }, ;
      { "<infNFe",                "</NFe>" }, ;
      { "<infDPEC",               "</envDPEC>" }, ;
      { "<infInut",               "<inutNFe>" }, ;
      { "<infCanc",               "</cancNFe>" }, ;
      { "<infInut",               "</inutNFe>" }, ;
      { "<infInut",               "</inutCTe>" }, ;
      { "<infEvento",             "</evento>" }, ;
      { "<evtInfoEmpregador",     "</eSocial>" }, ;
      { "<PedidoEnvioLoteRPS",    "</RPS>" }, ;
      { "<PedidoEnvioRPS",        "</RPS>" }, ;
      { "<infPedidoCancelamento", "</Pedido>" }, ;               // NFSE ABRASF Cancelamento
      { "<LoteRps",               "</EnviarLoteRpsEnvio>" }, ;   // NFSE ABRASF Lote
      { "<infRps",                "</Rps>" } }                   // NFSE ABRASF RPS
Acima é referência do que deve existir no XML.

Código: Selecionar todos

FUNCTION CapicomAssinaXml( cTxtXml, cCertCN, lRemoveAnterior, cPassword, lComURI )
Não tem muito o que mexer, talvez confunda quem não está acostumado com XML.
cTxtXml -> o arquivo XML
cCertCN -> o nome do certificado
lRemoveAnterior - Se remove assinatura(s) anterior(es)
cPassword -> senha do certificado
lComURI -> se o bloco de assinatura vai indicar a URI, que é o nome do bloco a ser assinado

Na assinatura normal, o lRemoveAnterior é verdadeiro, no caso da prefeitura é a nota individual
Na assinatura de lote, o lRemoveAnterior é falso, pra não remover a assinatura da(s) nota(s)
Acho que no lote esse lComURI é falso, talvez possa confirmar em alguma nota exemplo.

Código: Selecionar todos

STATIC FUNCTION AssinaBlocoAssinatura( cURI, lComURI )

   LOCAL cSignatureNode := ""

   IF lComURI
      cURI := "#" + cURI
   ENDIF
A diferença entre com e sem URI é a acima, dá pra confirmar olhando um lote assinado, ou, na tentativa/erro, ao assinar o lote.

olhando novamente a função:

Código: Selecionar todos

FUNCTION CapicomAssinaXml( cTxtXml, cCertCN, lRemoveAnterior, cPassword, lComURI )
Não lembro mais, mas numa primeira tentativa, a mais provável

Código: Selecionar todos

cXmlNota := "xxxxxx"
cXmlAssinado := ze_assinaXml( cXmlNota, "nomecertificado", .T.,"senha se precisar" )
cXmlLote := "xxxx" + cXmlAssinado + "xxxx" 
cXmlTransmite := ze_AssinaXml( cXmlNota, "nomecertificado", .F.,  "senha se precisar", .F. )
Como deve estar olhando o manual, pra gerar o XML, deve ter o esquema do lote no manual pra ajustar a linha que cria cXmlLote.