GithubHelp home page GithubHelp logo

sped-common's Introduction

PHP Supported Version Actions Latest Stable Version Join the chat at https://gitter.im/nfephp-org/sped-common

sped-common

Classes comuns usadas nas atividades e classes das API de NFe, CTe, MDFe, e-Financeira, eSfinge, eSocial

Version v5.1.x

sped-common's People

Contributors

andersonls avatar billbarsch avatar eduardokum avatar gersonfs avatar gitter-badger avatar gleidson2012 avatar guilhermenastrini avatar gustavomews avatar joaomarcos96 avatar juliansansat avatar lidani avatar lpj145 avatar lucaszanotte avatar matheusryndack avatar olavocneto avatar robmachado avatar samuelbasso avatar thiagolcks avatar tonicospinelli avatar zoiosilva avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

sped-common's Issues

ErrorException: Undefined index: organizationalUnitName

Na maioria dos casos o campo organizationalUnitName existe, porém encontramos um caso que a informação é inexistente.

Certificado empresa A:
screen shot 2017-09-26 at 08 58 28

Certificado empresa B:
screen shot 2017-09-26 at 08 59 02

../nfephp-org/sped-common/src/Certificate/PublicKey.php:98

Digest Value não corresponde ao conteúdo

Boa tarde gente.
Primeiramente muito obrigado pelas classes, realmente estão me ajudando muito.
Estou com um problema na assinatura do XML da NFSe. Estou tendo o seguinte retorno:

(
[mEnvioLoteRPSSincronoResult] => 0001-01-01T00:00:00E0800Erro na geração da assinatura!
Assinatura inválida. A Assinatura da nota não confere com a informação contida no XML.Verifique as informações do seu Certificado Digital
)

A função Signer::isSigned retorna o seguinte:

The XML content does not match the Digest Value. Probably modified after it was signed

Ainda estou realizando testes, então o código está provisório, mas estou fazendo o seguinte:

`
function AssinarXML_GerarXMLAssinado() {
$xml = file_get_contents("caminho do xml assinavel");

$tagname = 'InfDeclaracaoPrestacaoServico';

$mark = 'Id'; 

$algorithm = OPENSSL_ALGO_SHA1; 

$canonical = [true,false,null,null]; 

$rootname = 'tcDeclaracaoPrestacaoServico';

try {
    
    $pfx = file_get_contents('caminho do certificado .pfx');
    $certificate = Certificate::readPfx($pfx, 'senha do certificado .pfx');

    $signed = Signer::sign(
        $certificate,
        $xml,
        $tagname,
        $mark,
        $algorithm,
        $canonical,
        $rootname
    );


    $arquivoXMLFinal = fopen("caminho para gravar um xml com a string assinada", "w") or die("Erro ao gravar XML!");
    fwrite($arquivoXMLFinal, $signed);        
    fclose($arquivoXMLFinal);

} catch (\Exception $e) {
    //aqui você trata a exceção
    echo $e->getMessage();
}

}
`

Será que o problema é porque eu estou gravando o XML assinado em um arquivo? Será que preciso assinar direto o XML? Se for isso, tem como fazer isso nessa biblioteca?

Ressalto que a estrutura da assinatura está totalmente correta conforme o modelo da prefeitura, tem Reference ID e tudo mais.

Muito obrigado desde já e parabéns pela biblioteca, muito útil!

Certificado A3 e A5 na nuvem

Gostaria de saber se existe a possibilidade hoje no framework de usar A3 e A5 na nuvem, se não existe se tem alguma previsão ou alguma possibilidade de vir a existir...

Obrigado pelas informações!

OpenSSL 3

Prezados, estou no ubuntu 22.04 que está com o novo OpenSSL 3.0.2 15 Mar 2022 (Library: OpenSSL 3.0.2 15 Mar 2022) (até então era o 1.1.1). Meu PHP:
PHP 8.1.5 (cli) (built: Apr 21 2022 10:32:13) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.1.5, Copyright (c) Zend Technologies
with Zend OPcache v8.1.5, Copyright (c), by Zend Technologies
with Xdebug v3.1.4, Copyright (c) 2002-2022, by Derick Rethans

Ao tentar assinar uma nfe tenho o erro PHP Fatal error: Uncaught NFePHP\Common\Exception\CertificateException: Impossivel ler o certificado, ocorreu o seguinte erro: (error:0308010C:digital envelope routines::unsupported)

Este erro não ocorre na versão 1.1.1 do OpenSSL.
Alguém mais passando por isso?

Erro em quebra de linha na tag informação complementar (infCpl) após upgrade para versão v5.0.48

Ao emitir uma NF-e, na tag <infCpl> as quebras de linha que antes eram convertidas para a tag <br /> agora estão sendo salvas como < br/>, ao imprimir o DANFE diretamente a partir do conteúdo do XML, as quebras de linha acabam não funcionando.

Fiz o downgrade do package para a versão anterior: v5.0.47 e funciona normalmente, o problema está de fato na versão v5.0.48. É um problema de fato, ou foi feito propositalmente?

Exemplo do problema na versão 5.0.48:
image

Exemplo do comportamento na versão 5.0.47
image

Função str_contains somente PHP 8

Boas!
A inclusão da função str_contains na function between do \src\Certificate\PublicKey.php obriga usar o PHP 8.
É essa a intenção mesmo?

NFePHP\Common\Signer::isSigned está pegando a tag errada

Para fazer a validação do DigestValue do XML o método isSigned() realiza uma busca no atributo @id e o foreach retorna sempre a última tag, sendo que para gerar o DigestValue a tag a ser verificada é a infNFe.

Exemplo:

<nfeProc versao="3.10" xmlns="http://www.portalfiscal.inf.br/nfe">
    <NFe xmlns="http://www.portalfiscal.inf.br/nfe">
        <infNFe Id="NFe99999999999999999999999900000000000000000000" versao="3.10">
            ...
        </infNFe>
    </NFe>
    <protNFe versao="3.10">
        <infProt Id="ID999999999999999">
            ...
        </infProt>
    </protNFe>
</nfeProc>

Trecho que apresenta o problema:

private static function digestCheck(
        $xml,
        $tagname = '',
        $canonical = [true,false,null,null]
    ) {
        ...
                $xpath = new \DOMXPath($dom);
                $entries = $xpath->query('//@Id');
                foreach ($entries as $entry) {
                    $tagname = $entry->ownerElement->nodeName;
                }
        ...
}

Para resolver o problema basta inserir um break no foreach para ele retornar a primeira tag:

private static function digestCheck(
        $xml,
        $tagname = '',
        $canonical = [true,false,null,null]
    ) {
        ...
                $xpath = new \DOMXPath($dom);
                $entries = $xpath->query('//@Id');
                foreach ($entries as $entry) {
                    $tagname = $entry->ownerElement->nodeName;
                    break;
                }
        ...
}

Certificado Transmissor sem CNPJ

Pessoa desculpe me postar uma pergunta aqui que não se reference a nota eletrônica, mais eu estou a vários dias sem solução, gostaria da ajuda de voces.

Eu preciso comunicar a um serviço da receita https://sisobrapref.receita.economia.gov.br/sisobraprefWS/recepcao?wsdl porem ele exige uma criptografia na comunicação com a transferência da informação do CNPJ "OID: 2.16.76.1.3.3"

Porem todas as forma que que tente sempre tenho a mesma resposta Certificado Transmissor sem CNPJ

eu já tentei a forma do soap nativo do php SoapClient e também as classe SoapCurl e SoapNative do projeto nfephp-org/sped-common

O comando me retorna o CNPJ no certificado corretamente
$certificado->getCnpj();

se alguém puder me dar um norte eu agradeço muito.

definindo responsabilidade do certificado

certificado deve ser um value object que deverá conter as seguintes propriedades:

  • companyName: string nome da empresa
  • companyIdentifier: string cnpj da empresa
  • privateKey: string chave privada PEM
  • publicKey: string chave pública PEM
  • certificate: string certificado PEM (chave publica + cadeia )
  • caInfo: string caminho absoluto para cacerts do sistema operacional
  • validFrom: \DateTime data de início da validade do certificado
  • validTo: \DateTime data de término da validade do certificado

os comportamentos esperados:

  • encrypt($text, $algorithm): string fará a criptografia baseada em um algoritmo
  • isExpired(): bool verifica de a data atual está dentro do período de validade do certificado

EDIT:

  • alterado nome de sign para encrypt
  • novas propriedades adicionadas certificate, companyIdentifier

classe para ler certificado

devemos criar uma classe para fazer a leitura do arquivo de certificado do tipo A1

talvez nesse momento não precise criar uma interface, a não ser que tenhamos outros tipos de leitores de certificado

comportamento esperado:

  • load($content, $password = ''): Certificate após ler o certificado deve retornar o objeto relacionado - depende da issue #41
    • em caso de sucesso na leitura do certificado deverá retornar uma instancia da classe Certificate
    • em caso de falha na leitura, deverá lançar uma exception UnexpectedContentException::cannotRead

Comunicação Via SOAP / PrivateKey

Após atualização hoje dos últimos branch do mês via composer. voltou a me aparecer o erro:

An error occurred while trying to communication via soap, communication via soap Unable to load client cert -8018.

Havia utilizado a solução abaixo (setEncriptPrivateKey) que não funciona mais e não achei nenhuma alteração que pudesse causar isso. Conseguem dar uma luz? Alguém teve o mesmo problema?

$soap = new SoapCurl($certificate);
$soap->setEncriptPrivateKey(false);

$tools = new Tools($configjson, $certificate);
$tools->loadSoapClass($soap);

Obrigado

Sugestão: Melhorias de processos e execução de código

Opa, beleza, galera, ao preparar uma api aqui pra mim, eu vie que existe algo que é muito trivial, fácil de fazer, e bom demais pra rodar em cima de documentos speds, que são as execuções de macros, assim eu poderia tirar mais responsabilidade nas montagem e separar regras de limpeza, condição, retornos, para exclusão dependendo que regras fossem passadas, adotei esse modelo aqui e ficou muito legal para construir o xml, inclusive pode se adotar um dicionário interno, onde a api irá obedece-lo de forma padrão na construção e quando alguém quiser implementar de sua maneira o poderá fazer, farei a postagem de algum código mais pra frente, mas fica muito bom.

Curl NSS + Classe certificado não funciona

Olá, estou tentando usar a v4.00 do CTe, que usa a v5.00 do sped-common, mas estou com problemas na comunicação do CURL utilizando a classe de certificados.

Nas versões anteriores, que usavam os certs PEM eu nunca tive problemas.
Eu dei um dump no objeto do cert e parece tudo ok também, ele leu tudo e gerou tudo que precisava (aparentemente).

O certificado também funcionou normalmente para assinar o CTe.

StackTrace do erro:

PHP Fatal error:  Uncaught exception 'NFePHP\Common\Exception\SoapException' with message 'An error occurred while trying to communication via soap, unable to load client cert: -8018 (SEC_ERROR_UNKNOWN_PKCS11_ERROR) [https://homologacao.nfe.fazenda.sp.gov.br/cteWEB/services/cteRecepcao.asmx]' in /mnt/dados/user/ctesync_v3/vendor/nfephp-org/sped-common/src/Exception/SoapException.php:24
Stack trace:
#0 /mnt/dados/user/ctesync_v3/vendor/nfephp-org/sped-common/src/Soap/SoapCurl.php(126): NFePHP\Common\Exception\SoapException::soapFault('unable to load ...')
#1 /mnt/dados/user/ctesync_v3/vendor/nfephp-org/sped-cte/src/Common/Tools.php(531): NFePHP\Common\Soap\SoapCurl->send('https://homolog...', 'cteRecepcaoLote', '"http://www.por...', 2, Array, Array, '<cteDadosMsg xm...', Object(SoapHeader))
#2 /mnt/dados/user/ctesync_v3/vendor/nfephp-org/sped-cte/src/Tools.php(88): NFePHP\CTe\Common\Tools->sendRequest('<cteDadosMsg xm...', Array)
#3 /mnt/dados/user/ctesync_v3/examples/testaEnvio.php(92): NFePHP\CTe\Tools->sefazEnviaLote(Array,  in /mnt/dados/user/ctesync_v3/vendor/nfephp-org/sped-common/src/Exception/SoapException.php on line 24

Procurando na Web achei esses links relacionando o erro ao fato de o curl ter sido compilado usando NSS ao invés de OpenSSL:
https://stackoverflow.com/questions/19265100/curl-command-unable-to-load-client-cert-8018
https://stackoverflow.com/questions/20969241/curl-58-unable-to-load-client-key-8178

Info do meu curl (Amazon Linux 32 bits):

$ curl -V
curl 7.47.1 (i686-redhat-linux-gnu) libcurl/7.47.1 NSS/3.21.3 Basic ECC zlib/1.2.8 libidn/1.18 libpsl/0.6.2 (+libicu/50.1.2) libssh2/1.4.2
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp scp sftp smb smbs smtp smtps telnet tftp 
Features: AsynchDNS IDN IPv6 Largefile GSS-API Kerberos SPNEGO NTLM NTLM_WB SSL libz UnixSockets PSL

Sinceramente não sei como tentar resolver isso no momento.
Qualquer idéia é bem-vinda!

Talvez eu volte pra v3.00 do CTe por conta disso :(

EDIT: Teria como eu forçar uso do SoapNative ou algo assim ao invés do curl?

Melhorar a forma de identificação dos XML

Para que sejam corretamente utilizados em vários locais é necessário que os xml sejam corretamente identificados quanto ao que são e a que projeto pertencem. Principalmente na montagem de documentos auxiliares (Danfe, Danfce, Dacce, etc.)

PSR/LOG

poderia por favor liberar o pacote para que seja possível instalar com uma dependência mais nova do psr/log

"psr/log": "^1.0.1 || ^2.0 || ^3.0"

Possibilidade de Assinar uma Tag dentro de outra com o mesmo Nome

Estou usando essa biblioteca como base para integração com a Prefeitura de Goiania ( por mas que tenha outra já com esse intuito ).

Porém a validação do Request para Goiania é feito na Tag Rps dentro da tag InfDeclaracaoPrestacaoServico

Sendo o Path para o nó a ser assinado: Rps -> InfDeclaracaoPrestacaoServico -> Rps

O Método Signer::sign aceita um parâmetro tagname, porém não consegui fazer ele selecionar a tag correta.

Há a possibilidade de mudar a visibilidade desses métodos para protected para poder ser sobreescritos?

Sugestão: Casos de testes de unidade extras para a função Signer::sign.

Inspirado pela discussão iniciada no PR #181, talvez seria bom termos casos de teste de unidade testando a assinatura digital de documentos com estruturas diferentes. Assim, quando alguém tiver a inspiração de fazer uma melhoria no método Sign, ficaria mais seguro de não estar quebrando o uso nos outros componentes.

problema de compatibilidade com o symfony/yam

Há um problema de compatibilidade com o symfony/yam na hora de instalar pelo composer

composer require nfephp-org/sped-cte:dev-master

segue o erro:

  Problem 1
    - Installation request for nfephp-org/sped-cte dev-master -> satisfiable by nfephp-org/sped-cte[dev-master].
    - nfephp-org/sped-cte dev-master requires symfony/yaml ^3.3 -> satisfiable by symfony/yaml[3.3.x-dev, 3.4.x-dev, v3.3.0, v3.3.0-BETA1, v3.3.0-RC1, v3.3.1, v3.3.10, v3.3.11, v3.3.12, v3.3.13, v3.3.14, v3.3.15, v3.3.2, v3.3.3, v3.3.4, v3.3.5, v3.3.6, v3.3.7, v3.3.8, v3.3.9, v3.4.0, v3.4.0-BETA1, v3.4.0-BETA2, v3.4.0-BETA3, v3.4.0-BETA4, v3.4.0-RC1, v3.4.0-RC2, v3.4.1, v3.4.2, v3.4.3] but these conflict with your requirements or minimum-stability.

acredito que se vocês atualizarem a versão do yam no composer para a versão 4.0.3 resolve o problema

Não adiciona elemento ao node XML quando valor é 0

Testando as informações evento do empregador no eSocial.
Ao enviar o campo Indicativo de Cooperativa (indCoop) com valor 0 (Não é cooperativa) percebi que o campo não estava sendo enviado para o eSocial.

Localizei a causa do problema na classe DOMImproved metodo addChild.
Ao informar valor 0 (zero) em um campo não obrigatório, a classe não cria o node.

O problema, pelo que identifiquei, é o uso da função empty, que sempre retorna vazio para valores, 0 ou string 0. Aqui eu resolvi o problema forçando o tipo: $content !== ''

SoapBase::setTemporaryFolder faz a chamada do SoapBase::saveTemporarilyKeyFiles

No construtor da classe SoapBase é realizado a chamada do SoapBase::setTemporaryFolder, onde é chamado o SoapBase::saveTemporarilyKeyFiles criando os temporários, e logo após é chamado SoapBase::saveTemporarilyKeyFiles novamente. Isso tem real necessidade? Pois SoapBase::removeTemporarilyFiles vai remover apenas os últimos.

No construtor:

$this->setTemporaryFolder(sys_get_temp_dir() . '/sped/');
if (null !== $certificate) {
$this->saveTemporarilyKeyFiles();
}

No SoapBase::setTemporaryFolder:

if (null !== $this->certificate) {
$this->saveTemporarilyKeyFiles();
}

A saída verbosa do curl deve ser parametrizada

Ao definir true na opção CURLOPT_VERBOSE a saída verbosa é direcionada para a stderr.
Caso você possua programas/testes que geram saída formatada, haverá mistura entre a stdout e stderr.

// fully-qualified name: \NFePHP\Common\Soap\CurlSoap
curl_setopt($oCurl, CURLOPT_VERBOSE, 1);

É possível criar múltiplas assinaturas num unico Documento XML?

Olá pessoal! Isso é mais uma duvida do que uma issue, mas vi que tem a tag com help wanted, resolvi abrir.

Não encontrei no código um método que crie múltiplas assinaturas, e quando tento utilizar o Signer:sign() pela segunda vez, ele acaba removendo a assinatura anterior.
Estou utilizando o projeto para montar NFS-e, e no momento a que necessita de duas assinaturas é a cidade de Porto Alegre - RS.
Existe algum método? Grato desde já

BUG certificado sendo removido mesmo em operações concorrentes

A Classe SOAP requer os certificados em arquivo para usar, a SoapBase::class cria esses arquivos de forma temporária e depois os remove. Mas quando existem operações concorrentes com o mesmo certificado (mesmo CNPJ) pode ocorrer de uma operação remover os certificados que seriam usados em outra.

Problema: Validação confusa

public static function isValid($xml, $xsd)

Há algum meio de retornar esse resultado menos confuso, sinto que em relação a validação anterior esse modo ta meio complexo e confuso pra resolver, só consegui resolver os erros do xml com outro validador o da tecnhospeed.

Falha ao assinar xml nfse campinas

Eu estou com um problema, na hora de assinar um xml, ele monta e assina certinho o documento mas quando tento enviar fala que está com erro na assinatura, fui verificar a assinatura e retorna o seguinte erro.

Reference 1 digest is invalid because the computed digest differs from the digest in the XML.

Dúvida: É possível usar a classe para assinar documentos txt?

Boa tarde,
Estou desenvolvendo uma rotina para exportação de um arquivo TXT para o estado de Santa Catarina.
De acordo com o manual, esse arquivo deve ser assinado usando o certificado do PAF.

Já utilizamos essa classe no sistema para fazer a assinatura de documentos XML das notas, mas não encontrei uma forma de faze-lo em arquivos texto.

É possível?

Erro de ortografia

return new static("Impossivel carregar cURL, "
. "verifique se libcurl foi intalada. $message");

Emitente.php


namespace NFePHP\Emitente;


class Emitente {
	private $xNome;
	private $xFant;
	private $CNPJ;
	private $IE;
	
	/*
	 * Discutir se são necessários.
	*/
// 	private $xLgr;
// 	private $nro;
// 	private $xCpl;
// 	private $xBairro;
// 	private $cMun;
// 	private $xMun;
	
// 	private $CEP;
// 	private $UF;
// 	private $xPais;

	private $json;
	
	public function __set($attr, $value)
	{
		if (method_exists($this, $attr)) {
			$this->$attr();
		} else {
			$this->$attr = $value;
		}
	}
	
	
	public function __get($attr)
	{
		return $this->$attr;
	}
	
	public function __toString()
	{
		print_r($this);
	}
	
	
	public function __toArray()
	{
		//TODO Atributos para array
	}
	
	public function __toJson()
	{
		// TODO Atributos para json
	}
	
	/*
	 * Cria atributos a partir de um json 
	*/
	public function __serializer()
	{
		
	}
	
	
};


Foi o que pensei até o momento.

PHP 8.1 Erro de indice do array

Poderia por favor verificar no arquivo PublicKey.php

linha 111 $this->icp = $detail['subject']['organizationName'];

no php 8.1 se o indice do array não existir está dando erro.

SoapInterface sem o método público httpVersion

Bom dia! Em uma implementação, precisei forçar o http version para 1.1:

$nfeTools->soap->httpVersion('1.1');

Mas o método não existe na SoapInterface, apenas na classe SoapBase (que implementa a SoapInterface). Fiquei na dúvida se estou fazendo algo errado, ou se o método realmente está faltando na interface.

Erro quando na razão social do emitente contem a caractere '&'

"message": "DOMDocument::createElement(): unterminated entity reference CIA",
"exception": "ErrorException",
"file": "C:\xampp\htdocs\topsoftweb\api\vendor\nfephp-org\sped-common\src\DOMImproved.php",
"line": 185,
"trace": [
{
"function": "handleError",
"class": "Illuminate\Foundation\Bootstrap\HandleExceptions",
"type": "->"
},
{
"file": "C:\xampp\htdocs\topsoftweb\api\vendor\nfephp-org\sped-common\src\DOMImproved.php",
"line": 185,
"function": "createElement",
"class": "DOMDocument",
"type": "->"
},

Erro de permissões em ambiente compartilhado

Olá

Estou usando este projeto em alguns clientes num servidor de hospedagem compartilhada com CPanel. Quando ativei o sistema no 2º cliente, tive problemas de permissão nesta parte:

$this->setTemporaryFolder(sys_get_temp_dir() . '/sped/');

A pasta sys_get_temp_dir() . '/sped/' só tem permissão de escrita para o usuário que criou ela, logo meu segundo usuário linux não consegue criar subpastas dentro dela. Teria como mudar a permissão dessa pasta sped para 777 e as demais manter a permissão atual? Acho que não tem problema, pois para cada cnpj há uma sub-pasta no caso do projeto sped-nfe.

Ou então permitir definir o local dessa pasta via arquivo de configuração ou algum setter.

FileNotFoundException em sistemas altamente concorrentes

Em um sistema altamente concorrente, esse trecho de código está lançando FileNotFoundExceptions. Isso porque 2 processos podem ao mesmo tempo listar os arquivos antigos, porém só 1 deles vai remover primeiro o arquivo, quando o 2º tentar chamar o método getTimestamp ou delete o arquivo já não vai mais existir e irá lançar uma exception.

Pensei em passar a option disable_asserts com valor true para o construtor de Fylesystem, o que acha?

$contents = $this->filesystem->listContents($this->certsdir, true);
$dt = new \DateTime();
$tint = new \DateInterval("PT".$this->waitingTime."M");
$tint->invert = 1;
$tsLimit = $dt->add($tint)->getTimestamp();
foreach ($contents as $item) {
if ($item['type'] == 'file') {
$timestamp = $this->filesystem->getTimestamp($item['path']);
if ($timestamp < $tsLimit) {
$this->filesystem->delete($item['path']);
}
}
}
}

getDistDFe

Eu li um Issue na NFEPHP (atualmente depreciada, que havia esta função, a qual não estou conseguindo encontrar) nfephp-org/nfephp#214.
Gostaria de saber se já há algo semelhante desenvolvido nas bibliotecas atuais. E se não ha ainda, como eu poderia utilizar a função da biblioteca anterior, ou até ajudar a transportar esta função para as novas bibliotecas. Agradeço imensamente a ajuda.

Definições ClientRequest e ServicesRequest Interface

Client abstrato responsável em enviar a Requisição, recebe um Service Interface que implementa métodos necessários para requisição do Serviço .
Proposta.

Client

  • send(ServiceRequest $service): Monta a requisição, envia e retorna resposta da requisição.

ServiceRequest

  • withUri($uri): recebe url do serviço
  • withHeader($header): recebe headers do serviço
  • withBody($body):recebe body context do serviço

File not found at path CNPJ/certs/RAND.pem

Eventualmente tem ocorrido esse erro: File not found at path CNPJ/certs/RAND.pem
Tenho cerca de 40 caixas rodando ao mesmo tempo, no mesmo usuário unix.
Poderia o método SoapBase.removeTemporarilyFiles() estar removendo arquivos que ainda estão sendo usados?

Classe Certificate\PublicKey (validFrom e validTo) do certificado

Alguém verificou se a hora de expirar o certificado não está retorando corretamente?

$this->validFrom = \DateTime::createFromFormat('ymdHis\Z', $detail['validFrom']); $this->validTo = \DateTime::createFromFormat('ymdHis\Z', $detail['validTo']);

Estou com um caso aqui que o default timezone do PHP está America/Sao_Paulo, e a data / hora de expirar em 08/04/2022 13:10:00

quando na verdade seria 08/04/2022 10:10:00.

Resumindo: O certificado está expirando 3 horas depois do horário que está no arquifo pfx.

EDIT:

[validFrom] => 210408131000Z [validTo] => 220408131000Z [validFrom_time_t] => 1617887400 [validTo_time_t] => 1649423400

Poderia ser pego direto do time_t?

Validar Assinatura

Como eu faço para validar um xml que contenha varias assinaturas, no caso de um rps que tenho que assinar a rps e o lote

Signer::isSigned($xml, $tagname)

o digestCheck esta pegando para verificar o campo errado $informedDigest.

public static function digestCheck($xml, $tagname = '', $canonical = self::CANONICAL)
    {
        $dom = new \DOMDocument('1.0', 'utf-8');
        $dom->formatOutput = false;
        $dom->preserveWhiteSpace = false;
        $dom->loadXML($xml);
        $root = $dom->documentElement;
        $signature = $dom->getElementsByTagName('Signature')->item(0);
        $sigURI = $signature->getElementsByTagName('Reference')->item(0)->getAttribute('URI');
        if (empty($tagname)) {
            if (empty($sigURI)) {
                $tagname = $root->nodeName;
            } else {
                $xpath = new \DOMXPath($dom);
                $entries = $xpath->query('//@Id');
                foreach ($entries as $entry) {
                    $tagname = $entry->ownerElement->nodeName;
                    break;
                }
            }
        }
        $node = $dom->getElementsByTagName($tagname)->item(0);
        if (empty($node)) {
            throw SignerException::tagNotFound($tagname);
        }
        $sigMethAlgo = $signature->getElementsByTagName('SignatureMethod')->item(0)->getAttribute('Algorithm');
        $algorithm = 'sha256';
        if ($sigMethAlgo == 'http://www.w3.org/2000/09/xmldsig#rsa-sha1') {
            $algorithm = 'sha1';
        }
        if ($sigURI == '') {
            $node->removeChild($signature);
        }
        $calculatedDigest = self::makeDigest($node, $algorithm, $canonical);
        $informedDigest = $signature->getElementsByTagName('DigestValue')->item(0)->nodeValue;
        if ($calculatedDigest != $informedDigest) {
            throw SignerException::digestComparisonFailed();
        }
        return true;
    }

Assinatura após a Tag

Eu preciso colocar a assinatura após o nó assinado

hoje elé esta assinando e colocando dentro da raiz CompNfse

<CompNfse xmlns="http://www.abrasf.org.br/nfse.xsd">
	<Nfse versao="2.03">
		<InfNfse Id="NFSe201800000113953">
			....
		</InfNfse>		
	</Nfse>	
	<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
		....
	</Signature>
</CompNfse>

preciso que assinatura seja colocado após o nó assinado InfNfse

<?xml version="1.0" encoding="UTF-8"?>
<CompNfse xmlns="http://www.abrasf.org.br/nfse.xsd">
	<Nfse versao="2.03">
		<InfNfse Id="NFSe201800000113953">
			....
		</InfNfse>
		<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
			....
		</Signature>
	</Nfse>	
</CompNfse>

estou chamando dessa forma
Signer::sign($certificate, $xml, 'InfNfse', 'Id');

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.