stavarengo / php-sigep

PHP client library for the Brazilian Post Office Web Service. Integração com Web Service do Correios. Consulta preços e prazos, imprime etiquetas e PLP, etc.
https://phpsigep.stavarengo.me
MIT License
363 stars 249 forks source link

CalcPrecoPrazo falhando {Possível Solução} #438

Closed fhferreira closed 3 years ago

fhferreira commented 3 years ago

Percebi que o serviço CalcPrecoPrazo tem falhado o dia todo e ao que parece, parece que ao acessar o "WSDL" o POST é definido para bater na porta 8081/8082 porém ao realizar tal chamada o método não processa, fica travado, mesmo tentando pelo próprio form do WSDL.

<?php

require_once __DIR__ . '/bootstrap-exemplos.php';

$dimensao = new \PhpSigep\Model\Dimensao();
$dimensao->setTipo(\PhpSigep\Model\Dimensao::TIPO_PACOTE_CAIXA);
$dimensao->setAltura(15); // em centímetros
$dimensao->setComprimento(17); // em centímetros
$dimensao->setLargura(12); // em centímetros

$params = new \PhpSigep\Model\CalcPrecoPrazo();
$params->setAccessData(new \PhpSigep\Model\AccessDataHomologacao());
$params->setCepOrigem('30170-010');
$params->setCepDestino('04538-132');
$params->setServicosPostagem(\PhpSigep\Model\ServicoDePostagem::getAll());
$params->setAjustarDimensaoMinima(true);
$params->setDimensao($dimensao);
$params->setPeso(0.150);// 150 gramas

$phpSigep = new PhpSigep\Services\SoapClient\Real();
$result = $phpSigep->calcPrecoPrazo($params);

var_dump((array)$result);

a alternativa que encontrei foi chamar diretamente o método sem ir pelo WSDL e "forçar" a porta 80:

$url = 'http://ws.correios.com.br/calculador/CalcPrecoPrazo.asmx/CalcPrecoPrazo';
        $isProduction = $this->environment === Config::ENV_PRODUCTION;

        $soapArgs = [
            'nCdEmpresa' => $isProduction ? $this->admin_code : '',
            'sDsSenha' => $isProduction ? $this->password : '',
            'nCdServico' => $activeServices,
            'sCepOrigem' => str_replace('-', '', $originZip),
            'sCepDestino' => str_replace('-', '', $request->zip_code),
            'nCdFormato' => PackageType::BOX,
            'nVlLargura' =>  $request->default_width,
            'nVlAltura' => $request->default_height,
            'nVlPeso' => $request->default_weight/1000,
            'nVlComprimento' => $request->default_length,
            'nVlDiametro' => 0,
            'sCdMaoPropria' => 'N',
            'nVlValorDeclarado' => 0,
            'sCdAvisoRecebimento' => 'N'
        ];

        if ($extraOwnHands) {
            $params['sCdMaoPropria'] = $extraOwnHands ? 'S' : 'N';
        }

        if ($extraDeliveryAlert) {
            $params['sCdAvisoRecebimento'] = $extraDeliveryAlert ? 'S' : 'N';
        }

        if ($extraDeclaredAmount > 0) {
            $amount = $extraDeclaredAmount;
            if (!$amount OR $amount < Correios::MINIMUM_PRICE) {
                $amount = Correios::MINIMUM_PRICE;
            }
            $params['nVlValorDeclarado'] = number_format($amount, 2, '', '');
        }

        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
        curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($soapArgs));
        curl_setopt($ch, CURLOPT_TIMEOUT, 30);
        $result = curl_exec($ch);
        curl_close($ch);

        $xml = @simplexml_load_string($result);
        $xml = json_decode(json_encode((array) $xml), 0);

        $shipments = [];
        foreach ($xml->Servicos as $services) {
            foreach ($services as $service) {
                try {
                    $service->Valor = str_replace(',', '.', $service->Valor);
                    $service->ValorAvisoRecebimento = str_replace(',', '.', $service->ValorAvisoRecebimento);
                    $service->ValorMaoPropria = str_replace(',', '.', $service->ValorMaoPropria);
                    $service->ValorValorDeclarado = str_replace(',', '.', $service->ValorValorDeclarado);

                    if (!$returnAll && $service->Valor == 0) {
                        continue;
                    }

                    try {
                        $info = new ServicoDePostagem($service->Codigo);
                    } catch (\Exception $e) {
                        $info = new \stdClass();
                    }

                    $shipments[] = [
                        'codigo'                => $service->Codigo,
                        'idServico'             => $info->getIdServico(),
                        'nome'                  => trim(str_replace($service->Codigo, '', $info->getNome())),
                        'valor'                 => $service->Valor,
                        'prazoEntrega'          => $service->PrazoEntrega,
                        'valorMaoPropria'       => $service->ValorMaoPropria,
                        'valorAvisoRecebimento' => $service->ValorAvisoRecebimento,
                        'valorValorDeclarado'   => $service->ValorValorDeclarado,
                        'entregaDomiciliar'     => $service->EntregaDomiciliar == 'S' ? true : false,
                        'entregaSabado'         => $service->EntregaSabado == 'S' ? true : false,
                        'erroCodigo'            => $service->Erro,
                        'erroMsg'               => $service->MsgErro,
                        'obsFim'                => $service->obsFim,
                    ];
                } catch (\Exception $e) {
                    \Log::error(print_r($service, true));
                    \Log::error($e);
                }
            }
        }

        return ['url' => $url, 'params' => $params, 'shippments' => $shipments];
stale[bot] commented 3 years ago

This issue has been automatically marked as stale because it has not had any recent activity. It will be closed in 5 days if no further activity occurs.

rodrigojob commented 3 years ago

Eu também percebi falhas de conexão e vi que no SOAP a consulta é através da porta 8084. Não encontro onde está esta configuração. Não está no código, nem no WSDL.

rodrigosoumoreira commented 3 years ago

Eu também percebi falhas de conexão e vi que no SOAP a consulta é através da porta 8084. Não encontro onde está esta configuração. Não está no código, nem no WSDL.

Conseguiu resolver?

cinetica commented 3 years ago

Tente alterar somente o endpoint de consulta de "?WSDL" para "?wsdl" em Config.php

const WSDL_CAL_PRECO_PRAZO = 'http://ws.correios.com.br/calculador/CalcPrecoPrazo.asmx?wsdl';

Rctnet commented 3 years ago

Ola senhores, fiz uma alteração agora pouco que possivelmente resolve o problema, postei no meu fork, farei alguns testes e mando uma PR se der tudo certo Segue o link com a minha correção. https://github.com/QuilhaSoft/php-sigep/commit/81d1a3e590cba5c11fb56a2ed9729f6da568d07a

Rctnet commented 3 years ago

Criei uma PR com a solução, talvez não seja definitiva mas é a minima alteração possível https://github.com/stavarengo/php-sigep/pull/469

stale[bot] commented 3 years ago

This issue has been automatically marked as stale because it has not had any recent activity. It will be closed in 5 days if no further activity occurs.

stale[bot] commented 3 years ago

This issue has been automatically closed because it has not had any recent activity. If you have a question or comment, please open a new issue.