Skip to content

Instantly share code, notes, and snippets.

@SmileYzn
Last active November 26, 2022 11:41
Show Gist options
  • Save SmileYzn/ca7992a161c59b170edf480fdcea297d to your computer and use it in GitHub Desktop.
Save SmileYzn/ca7992a161c59b170edf480fdcea297d to your computer and use it in GitHub Desktop.
Consulta de frete nos correios
<?php
class Correios
{
/**
* Buscar o valor de frete no webservice dos correios
*
*
* @param type $cod_servico Código do serviço: SEDEX10, SEDEXACOBRAR, SEDEX, PAC
* @param type $cep_origem CEP de origem
* @param type $cep_destino CEP de destino
* @param type $peso Valor dado em Kg incluindo a embalagem
* @param type $altura Altura incluindo a embalagem
* @param type $largura Largura incluindo a embalagem
* @param type $comprimento Comprimento incluindo a embalagem em cm
* @param type $valor_declarado Valor declarado, indicar 0 se nao queira passar o valor
*
* @return boolean Array com os dados de frete, ou <b>FALSE<b>
*/
static function calculaFrete($cod_servico = 'PAC', $cep_origem, $cep_destino, $peso, $altura, $largura, $comprimento, $valor_declarado = '0')
{
// Código dos serviços dos correios
$cod_servico_array =
[
'SEDEX10' => 40215,
'SEDEXACOBRAR' => 40045,
'SEDEX' => 40010,
'PAC' => 41106
];
// Criar o código de serviço, ou PAC por padrão
$n_cod_servico = isset($cod_servico_array[$cod_servico]) ? $cod_servico_array[$cod_servico] : $cod_servico_array['PAC'];
// Cria os dados da consulta
$query =
[
'nCdEmpresa' => '',
'sDsSenha' => '',
'sCepOrigem' => $cep_origem,
'sCepDestino' => $cep_destino,
'nVlPeso' => $peso,
'nCdFormato' => '1',
'nVlComprimento' => $comprimento,
'nVlAltura' => $altura,
'nVlLargura' => $altura,
'sCdMaoPropria' => 'n',
'nVlValorDeclarado' => $valor_declarado,
'sCdAvisoRecebimento' => 'n',
'nCdServico' => $n_cod_servico,
'nVlDiametro' => '0',
'StrRetorno' => 'xml'
];
// URL da consulta
$url = "http://ws.correios.com.br/calculador/CalcPrecoPrazo.aspx?" . http_build_query($query);
// Se o PHP permitir abrir arquivos remotos
if (ini_get('allow_url_fopen'))
{
// Enviar requisição
$xml = simplexml_load_file($url, 'SimpleXMLElement', LIBXML_NOCDATA);
}
else
{
// Enviar requisição (cURL)
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, false);
$res = curl_exec($ch);
// Ler conteúdo XML
$xml = simplexml_load_string($res, 'SimpleXMLElement', LIBXML_NOCDATA);
// Close handle
curl_close($ch);
}
// Se houver o retorno
if (!empty($xml))
{
// Retornar array
return json_decode(json_encode($xml), true);
}
// Retorno
return false;
}
}
@SmileYzn
Copy link
Author

Atualizado para utilizar cURL quando não estiver disponível a abertura de arquivos remotos no PHP

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment