Skip to content

Cálculo de Frete e busca de endereços dos Correios com PHP

License

Notifications You must be signed in to change notification settings

EscapeWork/Frete

Folders and files

NameName
Last commit message
Last commit date

Latest commit

15d7076 · Aug 24, 2022

History

75 Commits
Sep 30, 2016
Sep 30, 2016
Jul 8, 2016
Nov 30, 2017
Apr 25, 2014
Apr 21, 2016
Apr 5, 2020
Sep 30, 2016
May 11, 2016
Jul 25, 2014
Aug 23, 2022
May 11, 2016
May 11, 2016
Apr 5, 2020

Repository files navigation

EscapeWork/Frete

License MIT

Biblioteca PHP que utiliza os webservices dos correios para cálculo de frete, rastreamento de encomendas e busca de endereços através do CEP.

Instalação

Instalação via composer.

$ composer require escapework/frete:"0.5.*"

Calculando preço e prazo

use EscapeWork\Frete\Correios\PrecoPrazo;
use EscapeWork\Frete\Correios\Data;
use EscapeWork\Frete\FreteException;

$frete = new PrecoPrazo();
$frete->setCodigoServico(Data::SEDEX)
      ->setCodigoEmpresa('Codigo')      # opcional
      ->setSenha('Senha')               # opcional
      ->setCepOrigem('cep de origem')   # apenas numeros, sem hifen(-)
      ->setCepDestino('cep de destino') # apenas numeros, sem hifen(-)
      ->setComprimento(30)              # obrigatorio
      ->setAltura(30)                   # obrigatorio
      ->setLargura(30)                  # obrigatorio
      ->setDiametro(30)                 # obrigatorio
      ->setPeso(0.5);                   # obrigatorio

try {
    $result = $frete->calculate();

    echo $result['cServico']['Valor'];
    echo $result['cServico']['PrazoEntrega'];

    var_dump($result); // debugge o resultado!
}
catch (FreteException $e) {
    // trate o erro adequadamente (e não escrevendo na tela)
    echo $e->getMessage();
    echo $e->getCode(); // este código é o código de erro dos correios
                        // pode ser usado pra dar mensagens como CEP inválido para o cliente
}

Tipos de frete disponíveis

EscapeWork\Frete\Correios\Data::SEDEX;          # sedex
EscapeWork\Frete\Correios\Data::SEDEX_A_COBRAR; # sedex a cobrar
EscapeWork\Frete\Correios\Data::SEDEX_10;       # sedex 10
EscapeWork\Frete\Correios\Data::SEDEX_HOJE;     # sedex hoje
EscapeWork\Frete\Correios\Data::PAC;            # pac

Buscando múltiplos serviços

Também é possível obter um array com vários serviços (Sedex e PAC, por exemplo) utilizando a classe PrecoPrazo.

$frete = new PrecoPrazo();
$frete->setCodigoServico([Data::SEDEX, Data::PAC])
      ... // todo os setters igual a chamada acima

try {
    $results = $frete->calculate();

    foreach ($results as $result) {
        echo $result['cServico']['Valor'];
        echo $result['cServico']['PrazoEntrega'];

        var_dump($result); // debugge o resultado!
    }
}
catch (FreteException $e) {
    // trate o erro adequadamente (e não escrevendo na tela)
    echo $e->getMessage();
}

Calculando para múltiplos produtos

Não existe nenhuma maneira completamente certa de se fazer isso (até onde ser). Eu recomendo usar a raiz cúbica dos produtos somadas para isto. Você pode ver mais informações aqui:

http://www.dothcom.net/blog/comercio-eletronico/calculo-de-frete-com-multiplos-volumes-dos-correios/

Rastreamento de encomendas

Fazendo o rastreio de encomendas online.

use EscapeWork\Frete\Correios\Rastreamento;
use EscapeWork\Frete\FreteException;

$rastreamento = new Rastreamento;
$rastreamento->setUsuario('ECT')
             ->setSenha('SRO')
             ->setObjetos('SQ458226057BR');

try {
    $result = $rastreamento->track();

    var_dump($result->delivered()); // se a entrega já foi finalizada (true ou false)
    var_dump($result->inTransit()); // se o pacote está em transito (true ou false)

    echo $result['evento']['tipo'];
    echo $result['evento']['status'];
    echo $result['evento']['data'];
    echo $result['evento']['hora'];
    echo $result['evento']['descricao'];

    var_dump($result); // debugar, debugar!
}
catch (FreteException $e) {
    // trate o erro adequadamente (e não escrevendo na tela)
    echo $e->getMessage();
}

Buscando múltiplas encomendas

Também é possível buscar múltiplas encomendas com a classe Rastreamento.

$rastreamento = new Rastreamento;
$rastreamento->setUsuario('ECT')
             ->setSenha('SRO')
             ->setObjetos(['SQ458226057BR', 'SQ458226057BR']); // passe um array com os objetos

try {
    $results = $rastreamento->track();

    foreach ($results as $result) {
        var_dump($result->delivered());
        ...
    }
}

Consulta de CEP pelo webservice dos correios

Você também pode buscar o endereço através de um CEP.

use EscapeWork\Frete\Correios\ConsultaCEP;
use EscapeWork\Frete\FreteException;

try {
    $consulta = new ConsultaCEP;
    $result   = $consulta->setCep(93320080)
                         ->find();

    # ou, pra facilitar, você pode usar o método
    # ConsultaCEP::search(93320080)

    echo $result->bairro;
    echo $result->cep;
    echo $result->cidade;
    echo $result->complemento;
    echo $result->complemento2;
    echo $result->end;
    echo $result->uf;

    var_dump($result); // debugar, debugar!
}
catch (FreteException $e) {
    // trate o erro adequadamente (e não escrevendo na tela)
    echo $e->getMessage();
}

Testes

Caso queira rodar os testes em seu computador, clone o repositório, execute um composer install --dev, e depois execute o seguinte comando no terminal:

$ vendor/bin/phpspec run

Referências

Referências utilizadas para o desenvolvimento.

License

See License