CalcPrecoPrazo falhando {Possível Solução}
fhferreira opened this issue · 8 comments
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];
```
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.
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.
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?
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';
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.
QuilhaSoft@81d1a3e
Criei uma PR com a solução, talvez não seja definitiva mas é a minima alteração possível
#469
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.
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.