pablosanches / bling-sdk
SDK não oficial do Bling! Api V3
Requires
- php: >=8.2
- guzzlehttp/guzzle: ^7.8
Requires (Dev)
- fakerphp/faker: ^1.23
- friendsofphp/php-cs-fixer: ^3.55
- mockery/mockery: ^1.6
- phpunit/phpunit: ^10.5
- squizlabs/php_codesniffer: ^3.9
- symfony/var-dumper: ^6.4
README
Esta é uma SDK não oficial que facilita a integração com o Bling! utilizando a API V3.
Pule para:
- Instalação
- Introdução
- Contatos
- Categorias de Produtos
- Categorias Lojas
- Depósitos
- Estoques
- Produtos
- Produtos Lojas
- Produtos Variações
- Pedidos Vendas
- Criar um pedido de venda
- Atualizar um pedido de venda
- Remover um pedido de venda
- Remover múltiplos pedidos de vendas
- Buscar um pedido de venda
- Buscar todos os pedidos de venda
- Alterar a situação de um pedido de venda
- Lançar estoque de um pedido de venda especificando o depósito
- Lançar estoque de um pedido de venda no depósito padrão
- Estornar o estoque de um pedido de venda
- Lançar as contas de um pedido de venda
- Estornar as contas de um pedido de venda
- Gerar NFE de um pedido de venda
- Gerar NFCE de um pedido de venda
Instalação
Você pode instalar esta SDK via composer:
composer require pablosanches/bling-sdk
Introdução
A API V3 do Bling! utiliza do modelo de autenticação OAuth 2.0, sendo assim, antes de qualquer coisa você precisará registrar um aplicativo em sua conta do Bling! para conseguir realizar todas as etapas de autenticação, você pode saber mais aqui!
Esta SDK segue um padrão de roteamento dinâmico baseado nos módulos implementados, desta forma, você precisará construir a instância de client da SDK e chamar seus módulos através deste client.
Exemplo:
use PabloSanches\Bling\Client; try { $blingClient = Client::factory('<seu-token-aqui>'); $payload = [ 'nome' => 'Pablo Sanches' ]; $response = $bling->contatos()->criar($payload); } catch (\Exception $e) { // $e->getMessage(); }
Os modelos de resposta dos resources trazem alguns métodos que facilitam a integração:
use PabloSanches\Bling\Client; try { $blingClient = Client::factory('<seu-token-aqui>'); $payload = [ 'nome' => 'Pablo Sanches' ]; $response = $bling->contatos()->criar($payload); // Este método faz um unwrap do elemento data que o bling coloca por padrão em seu objeto de resposta var_dump($response->getData()); // Este método traz a reposta padrão do Bling var_dump($response->getContents()); // Este método traz o statusCode da requisição var_dump($response->getStatusCode()); // Este método indica se houve algum erro na requisição var_dump($response->hasError()); // Este método faz um unwrap do elemento error que o bling coloca por padrão em seu objeto de resposta de erros var_dump($response->getError()); // Este método exporta o conteúdo da resposta, independente se houve erro ou sucesso var_dump($response->export()); } catch (\Exception $e) { // $e->getMessage(); }
Em alguns casos o bling pode paginar e oferecer filtros para as requests
use PabloSanches\Bling\Client; try { $blingClient = Client::factory('<seu-token-aqui>'); $filtros = [ 'pagina' => 1, 'limite' => 100, 'criterio' => 1, 'dataInclusaoInicial' => '2024-01-01' ]; $response = $bling->contatos()->buscarTodos($filtros); } catch (\Exception $e) { // $e->getMessage(); }
Contatos
Criando um contato
use PabloSanches\Bling\Client; try { $blingClient = Client::factory('<seu-token-aqui>'); $payload = [ 'nome' => 'Pablo Sanches' ]; $response = $bling->contatos()->criar($payload); } catch (\Exception $e) { // $e->getMessage(); }
Atualizando um contato:
use PabloSanches\Bling\Client; try { $blingClient = Client::factory('<seu-token-aqui>'); $payload = [ 'nome' => 'Pablo Sanches' ]; $response = $bling->contatos()->atualizar($id, $payload); } catch (\Exception $e) { // $e->getMessage(); }
Buscando todos os contatos:
use PabloSanches\Bling\Client; try { $blingClient = Client::factory('<seu-token-aqui>'); $filtros = [ 'pagina' => 1, 'limite' => 100, 'criterio' => 1, 'dataInclusaoInicial' => '2024-01-01' ]; $response = $bling->contatos()->buscarTodos($filtros); } catch (\Exception $e) { // $e->getMessage(); }
Buscando contato por ID:
use PabloSanches\Bling\Client; try { $blingClient = Client::factory('<seu-token-aqui>'); $idContato = 1; $response = $bling->contatos()->buscar($idContato); } catch (\Exception $e) { // $e->getMessage(); }
Buscando tipos de um contato:
use PabloSanches\Bling\Client; try { $blingClient = Client::factory('<seu-token-aqui>'); $idContato = 1; $response = $bling->contatos()->buscarTipos($idContato); } catch (\Exception $e) { // $e->getMessage(); }
Buscando contatos consumidores finais:
use PabloSanches\Bling\Client; try { $blingClient = Client::factory('<seu-token-aqui>'); $idContato = 1; $response = $bling->contatos()->buscarConsumidoresFinais($idContato); } catch (\Exception $e) { // $e->getMessage(); }
Atualizando a situação de um contato:
use PabloSanches\Bling\Client; try { $blingClient = Client::factory('<seu-token-aqui>'); $idContato = 1; $situacao = 'A'; $response = $bling->contatos()->atualizarSituacao($idContato, $situacao); } catch (\Exception $e) { // $e->getMessage(); }
Atualizando a situação de múltiplos contatos:
use PabloSanches\Bling\Client; try { $blingClient = Client::factory('<seu-token-aqui>'); $idsContatos = [1, 2, 3, 4]; $situacao = 'A'; $response = $bling->contatos()->alterarSituacoesMultiplos($idsContatos, $situacao); } catch (\Exception $e) { // $e->getMessage(); }
Remover um contato pelo seu ID:
use PabloSanches\Bling\Client; try { $blingClient = Client::factory('<seu-token-aqui>'); $idContato = 1; $response = $bling->contatos()->remover($idContato); } catch (\Exception $e) { // $e->getMessage(); }
Remover múltiplos contatos:
use PabloSanches\Bling\Client; try { $blingClient = Client::factory('<seu-token-aqui>'); $idsContatos = [1, 2, 3, 4]; $response = $bling->contatos()->removerMultiplos($idContato); } catch (\Exception $e) { // $e->getMessage(); }
Categorias de Produtos
Criando uma categoria de produto:
use PabloSanches\Bling\Client; try { $blingClient = Client::factory('<seu-token-aqui>'); $payload = [ 'descricao' => 'Eletrônicos' ]; $response = $bling->categoriasProdutos()->criar($payload); } catch (\Exception $e) { // $e->getMessage(); }
Atualizando uma categoria de produtos:
use PabloSanches\Bling\Client; try { $blingClient = Client::factory('<seu-token-aqui>'); $payload = [ 'descricao' => 'Eletrônicos - Atualizado' ]; $idCategoria = 123456789; $response = $bling->categoriasProdutos()->atualizar($idCategoria, $payload); } catch (\Exception $e) { // $e->getMessage(); }
Buscando uma categoria de produtos pelo seu ID:
use PabloSanches\Bling\Client; try { $blingClient = Client::factory('<seu-token-aqui>'); $idCategoria = 123456789; $response = $bling->categoriasProdutos()->buscar($idCategoria); } catch (\Exception $e) { // $e->getMessage(); }
Buscando todos as categorias de produtos
use PabloSanches\Bling\Client; try { $blingClient = Client::factory('<seu-token-aqui>'); $response = $bling->categoriasProdutos()->buscarTodos(); } catch (\Exception $e) { // $e->getMessage(); }
Removendo uma categoria de produto
use PabloSanches\Bling\Client; try { $blingClient = Client::factory('<seu-token-aqui>'); $idCategoria = 123456789; $response = $bling->categoriasProdutos()->remover($idCategoria); } catch (\Exception $e) { // $e->getMessage(); }
Categorias Lojas
(Multilojas)
Para utilizar recursos do multilojas, você precisa especificar o parâmetro multilojas na construção do Client da SDK.
Exemplo:
use PabloSanches\Bling\Client; $blingClient = Client::factory('<seu-token-aqui>', ['multilojas' => '<id-integracao-aqui>']);
Criando um vínculo de uma categoria de produto
use PabloSanches\Bling\Client; try { $blingClient = Client::factory('<seu-token-aqui>', '<id-integracao-aqui>'); $payload = [ 'descricao' => 'Categoria de produto vinculado à loja', 'codigo' => '12345678', 'categoriaProduto' => ['id' => 12345678] ]; $response = $bling->categoriasLojas()->criar($payload); } catch (\Exception $e) { // $e->getMessage(); }
Atualizando um vínculo de uma categoria de produto
use PabloSanches\Bling\Client; try { $blingClient = Client::factory('<seu-token-aqui>', '<id-integracao-aqui>'); $payload = [ 'descricao' => 'Categoria de produto vinculado à loja', 'codigo' => '12345678', 'categoriaProduto' => ['id' => 12345678] ]; $idVinculo = 123456789; $response = $bling->categoriasLojas()->atualizar($idVinculo, $payload); } catch (\Exception $e) { // $e->getMessage(); }
Buscando um vínculo de categoria de produto pelo seu ID
use PabloSanches\Bling\Client; try { $blingClient = Client::factory('<seu-token-aqui>', '<id-integracao-aqui>'); $idVinculo = 123456789; $response = $bling->categoriasLojas()->buscar($idVinculo); } catch (\Exception $e) { // $e->getMessage(); }
Buscando todos os vínculos de categorias de produtos
use PabloSanches\Bling\Client; try { $blingClient = Client::factory('<seu-token-aqui>', '<id-integracao-aqui>'); $idVinculo = 123456789; $response = $bling->categoriasLojas()->buscarTodos(); } catch (\Exception $e) { // $e->getMessage(); }
Removendo um vínculo de uma categoria de produto
use PabloSanches\Bling\Client; try { $blingClient = Client::factory('<seu-token-aqui>', '<id-integracao-aqui>'); $idVinculo = 123456789; $response = $bling->categoriasLojas()->remover($idVinculo); } catch (\Exception $e) { // $e->getMessage(); }
Depósitos
Criando um depósito
use PabloSanches\Bling\Client; try { $blingClient = Client::factory('<seu-token-aqui>'); $payload = [ 'descricao' => 'Depósito Geral', 'situacao' => 1, 'padrao' => false, 'desconsiderarSaldo' => false ]; $response = $bling->depositos()->criar($payload); } catch (\Exception $e) { // $e->getMessage(); }
Alterando um depósito
use PabloSanches\Bling\Client; try { $blingClient = Client::factory('<seu-token-aqui>'); $payload = [ 'descricao' => 'Depósito Geral', 'situacao' => 1, 'padrao' => false, 'desconsiderarSaldo' => false ]; $idDeposito = 123456789; $response = $bling->depositos()->atualizar($idDeposito, $payload); } catch (\Exception $e) { // $e->getMessage(); }
Obtendo um depósito pelo ID
use PabloSanches\Bling\Client; try { $blingClient = Client::factory('<seu-token-aqui>'); $idDeposito = 123456789; $response = $bling->depositos()->buscar($idDeposito); } catch (\Exception $e) { // $e->getMessage(); }
Obtendo todos os depósitos
use PabloSanches\Bling\Client; try { $blingClient = Client::factory('<seu-token-aqui>'); $response = $bling->depositos()->buscarTodos(); } catch (\Exception $e) { // $e->getMessage(); }
Estoques
Criando um registro de estoque
use PabloSanches\Bling\Client; try { $blingClient = Client::factory('<seu-token-aqui>'); $payload = [ "produto" => ['id' => 123456789], "deposito" => ['id' => 123456789], "operacao" => "B", "preco" => 1500.75, "custo" => 1500.75, "quantidade" => 50.75, "observacoes" => "Observações de estoque" ]; $response = $bling->estoques()->criar($payload); } catch (\Exception $e) { // $e->getMessage(); }
Atualizando um registro de estoque
use PabloSanches\Bling\Client; try { $blingClient = Client::factory('<seu-token-aqui>'); $payload = [ "produto" => ['id' => 123456789], "deposito" => ['id' => 123456789], "operacao" => "B", "preco" => 1500.75, "custo" => 1500.75, "quantidade" => 50.75, "observacoes" => "Observações de estoque" ]; $idDoEstoque = 123456789; $response = $bling->estoques()->atualizar($idDoEstoque, $payload); } catch (\Exception $e) { // $e->getMessage(); }
Obtém o saldo em estoque de produtos em todos os depósitos
use PabloSanches\Bling\Client; try { $blingClient = Client::factory('<seu-token-aqui>'); $filtros = [ "idsProdutos" => ['id' => 123456789] ]; $response = $bling->estoques()->buscarTodos($filtros); } catch (\Exception $e) { // $e->getMessage(); }
Obtém o saldo em estoque de produtos pelo ID do depósito
use PabloSanches\Bling\Client; try { $blingClient = Client::factory('<seu-token-aqui>'); $filtros = [ "idDeposito" => 123456789, "idsProdutos" => ['id' => 123456789] ]; $response = $bling->estoques()->buscarPorDeposito($filtros); } catch (\Exception $e) { // $e->getMessage(); }
Produtos
Criar um produto
use PabloSanches\Bling\Client; try { $blingClient = Client::factory('<seu-token-aqui>'); $dadosProdutos = [...]; $response = $bling->produtos()->criar($dadosProdutos); } catch (\Exception $e) { // $e->getMessage(); }
Alterar um produto
use PabloSanches\Bling\Client; try { $blingClient = Client::factory('<seu-token-aqui>'); $idProduto = 123456789; $dadosProdutos = [...]; $response = $bling->produtos()->atualizar($idProduto, $dadosProdutos); } catch (\Exception $e) { // $e->getMessage(); }
Alterar a situação de múltiplos produtos
use PabloSanches\Bling\Client; try { $blingClient = Client::factory('<seu-token-aqui>'); $idsProdutos = [123456789, 123456789]; $situacao = 'A'; $response = $bling->produtos()->alterarSituacaoMultiplosProdutos($idsProdutos, $situacao); } catch (\Exception $e) { // $e->getMessage(); }
Alterar a situação de um produto
use PabloSanches\Bling\Client; try { $blingClient = Client::factory('<seu-token-aqui>'); $idProduto = 123456789; $situacao = 'A'; $response = $bling->produtos()->alterarSituacaoProduto($idProduto, $situacao); } catch (\Exception $e) { // $e->getMessage(); }
Obter um produto pelo seu ID
use PabloSanches\Bling\Client; try { $blingClient = Client::factory('<seu-token-aqui>'); $idProduto = 123456789; $response = $bling->produtos()->buscar($idProduto); } catch (\Exception $e) { // $e->getMessage(); }
Obter todos os produtos paginados
use PabloSanches\Bling\Client; try { $blingClient = Client::factory('<seu-token-aqui>'); $response = $bling->produtos()->buscarTodos(); } catch (\Exception $e) { // $e->getMessage(); }
Excluir um produto pelo seu id
use PabloSanches\Bling\Client; try { $blingClient = Client::factory('<seu-token-aqui>'); $idProduto = 123456789; $response = $bling->produtos()->remover($idProduto); } catch (\Exception $e) { // $e->getMessage(); }
Excluir múltiplos produtos
use PabloSanches\Bling\Client; try { $blingClient = Client::factory('<seu-token-aqui>'); $idProduto = [123456789, 123456789, 123456789]; $response = $bling->produtos()->removerMultiplos($idProduto); } catch (\Exception $e) { // $e->getMessage(); }
Produtos Lojas
Criar vínculo de produtos com lojas
use PabloSanches\Bling\Client; try { $blingClient = Client::factory('<seu-token-aqui>', '<id-integracao-aqui>'); $payload = [...]; $response = $bling->produtosLojas()->criar($payload); } catch (\Exception $e) { // $e->getMessage(); }
Altera vínculo de produtos com lojas
use PabloSanches\Bling\Client; try { $blingClient = Client::factory('<seu-token-aqui>', '<id-integracao-aqui>'); $idVinculo = 123456789; $payload = [...]; $response = $bling->produtosLojas()->atualizar($idVinculo, $payload); } catch (\Exception $e) { // $e->getMessage(); }
Obtém um vínculo de produtos com lojas
use PabloSanches\Bling\Client; try { $blingClient = Client::factory('<seu-token-aqui>', '<id-integracao-aqui>'); $idVinculo = 123456789; $response = $bling->produtosLojas()->buscar($idVinculo); } catch (\Exception $e) { // $e->getMessage(); }
Obtém um vínculo de todos produtos com lojas
use PabloSanches\Bling\Client; try { $blingClient = Client::factory('<seu-token-aqui>', '<id-integracao-aqui>'); $response = $bling->produtosLojas()->buscarTodos(); } catch (\Exception $e) { // $e->getMessage(); }
Remove o vínculo de produtos com lojas
use PabloSanches\Bling\Client; try { $blingClient = Client::factory('<seu-token-aqui>', '<id-integracao-aqui>'); $idVinculo = 123456789; $response = $bling->produtosLojas()->remover($idVinculo); } catch (\Exception $e) { // $e->getMessage(); }
Produtos Variações
Obter um produto e suas variações
use PabloSanches\Bling\Client; try { $blingClient = Client::factory('<seu-token-aqui>'); $response = $bling->produtosVariacoes()->buscar($idProdutoPai); } catch (\Exception $e) { // $e->getMessage(); }
Alterar o nome do atributo nas variações
use PabloSanches\Bling\Client; try { $blingClient = Client::factory('<seu-token-aqui>'); $payload = [...]; $response = $bling->produtosVariacoes()->alterarNomeAtributo($idProdutoPai, $payload); } catch (\Exception $e) { // $e->getMessage(); }
Retorna o produto pai com combinações de novas variações
use PabloSanches\Bling\Client; try { $blingClient = Client::factory('<seu-token-aqui>'); $payload = [...]; $response = $bling->produtosVariacoes()->gerarCombinacoes($payload); } catch (\Exception $e) { // $e->getMessage(); }
Pedidos Vendas
Criar um pedido de venda
use PabloSanches\Bling\Client; try { $blingClient = Client::factory('<seu-token-aqui>'); $payload = [...]; $response = $bling->pedidosVendas()->criar($payload); } catch (\Exception $e) { // $e->getMessage(); }
Atualizar um pedido de venda
use PabloSanches\Bling\Client; try { $blingClient = Client::factory('<seu-token-aqui>'); $idPedidoVenda = 123456789; $payload = [...]; $response = $bling->pedidosVendas()->atualizar($idPedidoVenda, $payload); } catch (\Exception $e) { // $e->getMessage(); }
Remover um pedido de venda
use PabloSanches\Bling\Client; try { $blingClient = Client::factory('<seu-token-aqui>'); $idPedidoVenda = 123456789; $response = $bling->pedidosVendas()->remover($idPedidoVenda); } catch (\Exception $e) { // $e->getMessage(); }
Remover múltiplos pedidos de vendas
use PabloSanches\Bling\Client; try { $blingClient = Client::factory('<seu-token-aqui>'); $idPedidoVenda = 123456789; $response = $bling->pedidosVendas()->removerMultiplos([$idPedidoVenda]); } catch (\Exception $e) { // $e->getMessage(); }
Buscar um pedido de venda
use PabloSanches\Bling\Client; try { $blingClient = Client::factory('<seu-token-aqui>'); $idPedidoVenda = 123456789; $response = $bling->pedidosVendas()->buscar($idPedidoVenda); } catch (\Exception $e) { // $e->getMessage(); }
Buscar todos os pedidos de venda
use PabloSanches\Bling\Client; try { $blingClient = Client::factory('<seu-token-aqui>'); $response = $bling->pedidosVendas()->buscarTodos(); } catch (\Exception $e) { // $e->getMessage(); }
Buscar todos os pedidos de venda
use PabloSanches\Bling\Client; try { $blingClient = Client::factory('<seu-token-aqui>'); $response = $bling->pedidosVendas()->buscarTodos(); } catch (\Exception $e) { // $e->getMessage(); }
Alterar a situação de um pedido de venda
use PabloSanches\Bling\Client; try { $blingClient = Client::factory('<seu-token-aqui>'); $idPedidoVenda = 123456789; $idSituacao = 123456789; $response = $bling->pedidosVendas()->alterarSituacao($idPedidoVenda, $idSituacao); } catch (\Exception $e) { // $e->getMessage(); }
Lançar estoque de um pedido de venda especificando o depósito
use PabloSanches\Bling\Client; try { $blingClient = Client::factory('<seu-token-aqui>'); $idPedidoVenda = 123456789; $idDeposito = 123456789; $response = $bling->pedidosVendas()->lancaEstoquePorDeposito($idPedidoVenda, $idDeposito); } catch (\Exception $e) { // $e->getMessage(); }
Lançar estoque de um pedido de venda no depósito padrão
use PabloSanches\Bling\Client; try { $blingClient = Client::factory('<seu-token-aqui>'); $idPedidoVenda = 123456789; $response = $bling->pedidosVendas()->lancaEstoque($idPedidoVenda); } catch (\Exception $e) { // $e->getMessage(); }
Estornar o estoque de um pedido de venda
use PabloSanches\Bling\Client; try { $blingClient = Client::factory('<seu-token-aqui>'); $idPedidoVenda = 123456789; $response = $bling->pedidosVendas()->estornarEstoque($idPedidoVenda); } catch (\Exception $e) { // $e->getMessage(); }
Lançar as contas de um pedido de venda
use PabloSanches\Bling\Client; try { $blingClient = Client::factory('<seu-token-aqui>'); $idPedidoVenda = 123456789; $response = $bling->pedidosVendas()->lancarContas($idPedidoVenda); } catch (\Exception $e) { // $e->getMessage(); }
Estornar as contas de um pedido de venda
use PabloSanches\Bling\Client; try { $blingClient = Client::factory('<seu-token-aqui>'); $idPedidoVenda = 123456789; $response = $bling->pedidosVendas()->estornarContas($idPedidoVenda); } catch (\Exception $e) { // $e->getMessage(); }
Gerar NFE de um pedido de venda
use PabloSanches\Bling\Client; try { $blingClient = Client::factory('<seu-token-aqui>'); $idPedidoVenda = 123456789; $response = $bling->pedidosVendas()->gerarNfe($idPedidoVenda); } catch (\Exception $e) { // $e->getMessage(); }
Gerar NFCE de um pedido de venda
use PabloSanches\Bling\Client; try { $blingClient = Client::factory('<seu-token-aqui>'); $idPedidoVenda = 123456789; $response = $bling->pedidosVendas()->gerarNfce($idPedidoVenda); } catch (\Exception $e) { // $e->getMessage(); }