Nfse - GerarNfse - Laravel/Php

Bom dia pessoal, estou fazendo a integração com a Prefeitura de Pitangui - MG, eles usam a versão 2.02 da ABRASF.

Estou travado no GerarNfse, gostaria de saber como assino o XML, a minha assinatura parece estár correta, validei ela pelo SoapUI. vou deixar abaixo a minha funcção.
Obrigado.

    public function gerar()
    {
        $soap = new SoapClient('https://pitanguimg.gestaoiss.com.br/ws/nfse.asmx?WSDL');

        $message = '<?xml version="1.0" encoding="utf-8"?>
        <soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
          <soap12:Body>
            <GerarNfseRequest xmlns="http://nfse.abrasf.org.br">
              <nfseCabecMsg xmlns=""><![CDATA[<cabecalho xmlns="http://www.abrasf.org.br/nfse.xsd" versao="2.02"><versaoDados>2.02</versaoDados></cabecalho>]]></nfseCabecMsg>
              <nfseDadosMsg xmlns=""><![CDATA[<GerarNfseEnvio xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.abrasf.org.br/nfse.xsd">
                <Rps>
                    <InfDeclaracaoPrestacaoServico Id="infRps184288390001904">
                        <Rps>
                            <IdentificacaoRps>
                                <Numero>4</Numero>
                                <Serie>CC2</Serie>
                                <Tipo>1</Tipo>
                            </IdentificacaoRps>
                            <DataEmissao>2023-03-28</DataEmissao>
                            <Status>1</Status>
                        </Rps>
                        <Competencia>2023-03-28</Competencia>
                        <Servico>
                            <Valores>
                                <ValorServicos>5000</ValorServicos>
                                <ValorIss>0.00</ValorIss>
                            </Valores>
                            <IssRetido>1</IssRetido>
                            <ResponsavelRetencao>1</ResponsavelRetencao>
                            <ItemListaServico>0107</ItemListaServico>
                            <CodigoCnae>6209100</CodigoCnae>
                            <CodigoTributacaoMunicipio>0107</CodigoTributacaoMunicipio>
                            <Discriminacao>Teste realizado pelo Call Center para validação do Igor.</Discriminacao>
                            <CodigoMunicipio>9999999</CodigoMunicipio>
                            <CodigoPais>1058</CodigoPais>
                            <ExigibilidadeISS>1</ExigibilidadeISS>
                            <MunicipioIncidencia>9999999</MunicipioIncidencia>
                        </Servico>
                        <Prestador>
                            <CpfCnpj>
                                <Cnpj>18428839000190</Cnpj>
                            </CpfCnpj>
                            <InscricaoMunicipal>18428839000190</InscricaoMunicipal>
                        </Prestador>
                        <Tomador>
                            <IdentificacaoTomador>
                                <CpfCnpj>
                                    <Cnpj>52101603000183</Cnpj>
                                </CpfCnpj>
                                <InscricaoMunicipal>19476</InscricaoMunicipal>
                            </IdentificacaoTomador>
                            <RazaoSocial>SUBSTITUTO TRIBUTÁRIO TESTE WS</RazaoSocial>
                            <Endereco>
                                <Endereco>Avenida Tonico dos Santos</Endereco>
                                <Numero>846</Numero>
                                <Complemento>Bloc2, apt7</Complemento>
                                <Bairro>Jardim Induberaba</Bairro>
                                <CodigoMunicipio>3170107</CodigoMunicipio>
                                <Uf>MG</Uf>
                                <CodigoPais>1058</CodigoPais>
                                <Cep>38040000</Cep>
                            </Endereco>
                            <Contato>
                                <Telefone>11111111111</Telefone>
                                <Email>[email protected]</Email>
                            </Contato>
                        </Tomador>
                        <OptanteSimplesNacional>2</OptanteSimplesNacional>
                        <IncentivoFiscal>2</IncentivoFiscal>
                    </InfDeclaracaoPrestacaoServico>
                </Rps>
                    </GerarNfseEnvio>]]></nfseDadosMsg>
            </GerarNfseRequest>
          </soap12:Body>
        </soap12:Envelope>';

        $response = $soap->GerarNfse($message);
    }

Consegui fazer a geração, agora o meu problema está sendo sendo a assinatura.
Assinei a tag InfDeclaracaoPrestacaoServico e quando tento enviar o XML pelo SoapUI recebo a mensagem de: O RPS deve conter assinatura digital vinculada a certificado digital padrão ICP Brasil, não revogado e não expirado.

Segue a minha função de enviar.

    public function gerar()
    {
        $soap = new SoapClient('https://pitanguimg.gestaoiss.com.br/ws/nfse.asmx?WSDL');

        $dom = new DOMDocument();
        $dom->formatOutput = true;
        $dom->preserveWhiteSpace = true;

        $gerarNfseEnvio = $dom->createElement('GerarNfseEnvio');
        $gerarNfseEnvio->setAttribute('xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance');
        $gerarNfseEnvio->setAttribute('xmlns:xsd', 'http://www.w3.org/2001/XMLSchema');
        $gerarNfseEnvio->setAttribute('xmlns', 'http://www.abrasf.org.br/nfse.xsd');

        $rps = $dom->createElement('Rps');

        // InfDeclaracaoPrestacaoServico
        $infDeclaracaoPrestacaoServico = $dom->createElement('InfDeclaracaoPrestacaoServico');
        $infDeclaracaoPrestacaoServico->setAttribute('Id', '');

        $rpsDeclaracao = $dom->createElement('Rps');
        $infDeclaracaoPrestacaoServico->appendChild($rpsDeclaracao);

        // IdentificacaoRps
        $identificacaoRps = $dom->createElement('IdentificacaoRps');
        $identificacaoRps->appendChild($dom->createElement('Numero', '1'));
        $identificacaoRps->appendChild($dom->createElement('Serie', 'CC2'));
        $identificacaoRps->appendChild($dom->createElement('Tipo', '1'));
        $rpsDeclaracao->appendChild($identificacaoRps);

        // DataEmissao e Status
        $rpsDeclaracao->appendChild($dom->createElement('DataEmissao', '2023-03-28'));
        $rpsDeclaracao->appendChild($dom->createElement('Status', '1'));

        // Competencia
        $infDeclaracaoPrestacaoServico->appendChild($dom->createElement('Competencia', '2023-03-28'));

        // Servico
        $servico = $dom->createElement('Servico');
        $valores = $dom->createElement('Valores');
        $valores->appendChild($dom->createElement('ValorServicos', '5000'));
        $valores->appendChild($dom->createElement('ValorIss', '0.00'));
        $servico->appendChild($valores);
        $servico->appendChild($dom->createElement('IssRetido', '1'));
        $servico->appendChild($dom->createElement('ResponsavelRetencao', '1'));
        $servico->appendChild($dom->createElement('ItemListaServico', '0107'));
        $servico->appendChild($dom->createElement('CodigoCnae', '6209100'));
        $servico->appendChild($dom->createElement('CodigoTributacaoMunicipio', '1'));
        $servico->appendChild($dom->createElement('Discriminacao', 'Teste realizado pelo Call Center para validação do Igor.'));
        $servico->appendChild($dom->createElement('CodigoMunicipio', '9999999'));
        $servico->appendChild($dom->createElement('CodigoPais', '1058'));
        $servico->appendChild($dom->createElement('ExigibilidadeISS', '1'));
        $servico->appendChild($dom->createElement('MunicipioIncidencia', '9999999'));
        $infDeclaracaoPrestacaoServico->appendChild($servico);

        // Prestador
        $prestador = $dom->createElement('Prestador');
        $cpfCnpjPrestador = $dom->createElement('CpfCnpj');
        $cpfCnpjPrestador->appendChild($dom->createElement('Cnpj', '52101603000183'));
        $prestador->appendChild($cpfCnpjPrestador);
        $prestador->appendChild($dom->createElement('InscricaoMunicipal', '19476'));
        $infDeclaracaoPrestacaoServico->appendChild($prestador);

        // Tomador
        $tomador = $dom->createElement('Tomador');
        $identificacaoTomador = $dom->createElement('IdentificacaoTomador');
        $cpfCnpjTomador = $dom->createElement('CpfCnpj');
        $cpfCnpjTomador->appendChild($dom->createElement('Cnpj', '52101603000183'));
        $identificacaoTomador->appendChild($cpfCnpjTomador);
        $identificacaoTomador->appendChild($dom->createElement('InscricaoMunicipal', '19476'));
        $tomador->appendChild($identificacaoTomador);
        $tomador->appendChild($dom->createElement('RazaoSocial', 'SUBSTITUTO TRIBUTARIO TESTE WS'));
        $enderecoTomador = $dom->createElement('Endereco');
        $enderecoTomador->appendChild($dom->createElement('Endereco', 'Avenida Tonico dos Santos'));
        $enderecoTomador->appendChild($dom->createElement('Numero', '846'));
        $enderecoTomador->appendChild($dom->createElement('Complemento', 'Bloc2, apt7'));
        $enderecoTomador->appendChild($dom->createElement('Bairro', 'Jardim Induberaba'));
        $enderecoTomador->appendChild($dom->createElement('CodigoMunicipio', '3170107'));
        $enderecoTomador->appendChild($dom->createElement('Uf', 'MG'));
        $enderecoTomador->appendChild($dom->createElement('CodigoPais', '1058'));
        $enderecoTomador->appendChild($dom->createElement('Cep', '38040000'));
        $tomador->appendChild($enderecoTomador);
        $contato = $dom->createElement('Contato');
        $contato->appendChild($dom->createElement('Telefone', '11111111111'));
        $contato->appendChild($dom->createElement('Email', '[email protected]'));
        $tomador->appendChild($contato);
        $infDeclaracaoPrestacaoServico->appendChild($tomador);

        // OptanteSimplesNacional e IncentivoFiscal
        $infDeclaracaoPrestacaoServico->appendChild($dom->createElement('OptanteSimplesNacional', '2'));
        $infDeclaracaoPrestacaoServico->appendChild($dom->createElement('IncentivoFiscal', '2'));

        $rps->appendChild($infDeclaracaoPrestacaoServico);
        // Adicionar InfDeclaracaoPrestacaoServico ao GerarNfseEnvio
        $gerarNfseEnvio->appendChild($rps);

        // Adicionando raiz <GerarNfseEnvio> ao documento DOM
        $dom->appendChild($gerarNfseEnvio);

        $decl = str_replace(array("\t"), '', $dom->saveXML());
        $decl = $this->remove_accents($decl);
        $decl = $this->assinaXML($decl, 'InfDeclaracaoPrestacaoServico');

        $envelope = '
        <soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
          <soap12:Body>
            <GerarNfseRequest xmlns="http://nfse.abrasf.org.br">
              <nfseCabecMsg xmlns=""><![CDATA[<cabecalho xmlns="http://www.abrasf.org.br/nfse.xsd" versao="2.02"><versaoDados>2.02</versaoDados></cabecalho>]]></nfseCabecMsg>
              <nfseDadosMsg xmlns=""><![CDATA[%DadosMsg%]]></nfseDadosMsg>
            </GerarNfseRequest>
          </soap12:Body>
        </soap12:Envelope>';

        $envelope = str_replace('%DadosMsg%', $decl, $envelope);
        $response = $soap->GerarNfse($envelope);
    }

Use uma função de assinatura separa do seu código
Como essa por exemplo:

Este tópico foi fechado automaticamente 30 dias depois da última resposta. Novas respostas não são mais permitidas.