PDV e terminal de balcão
Como o terminal de ponto de venda (POS) da plataforma antiga conversa com a Venddor: login do caixa, carga de produtos e clientes e fechamento da venda de balcão.
Um PDV (ponto de venda, ou POS) é o computador ou celular do caixa de uma loja física. Na plataforma antiga (Venddor 1.0), o aplicativo de balcão falava com a loja por quatro operações: entrar como caixa, baixar produtos, baixar clientes e fechar a venda. Estas rotas continuam no ar para que os terminais já instalados não parem. Elas não são a forma recomendada de começar uma integração nova.
Cada operação responde por vários nomes (pos_login, wk_pos_login, wkposlogin), com e sem o prefixo /api/v1.0. Todos os nomes de uma operação chamam o mesmo código e devolvem a mesma resposta.
Como funciona
- Credencial do terminal
Um administrador gera uma chave de API no painel (HTTP Basic
e-mail:chave_de_api) ou o terminal usa um JWT. Sem isso até o login responde 401. - Login do caixa
Login do caixa confere e-mail e senha do operador e devolve perfil, formas de pagamento e de envio da loja e um
access_token. - Carga de dados
Produtos e clientes alimentam a base local do terminal. Ambos são paginados.
- Venda
Fechar a venda cria o pedido, baixa o estoque e devolve o número do pedido para o recibo.
Conceitos-chave
Os nomes de cada operação
A plataforma antiga derivava o endereço do nome da classe do aplicativo (WkPosLogin virou wk_pos_login). A Venddor 2.0 renomeou para pos_*. Para não quebrar terminais instalados, os três nomes existem, e o servidor ignora maiúsculas e minúsculas e a barra final (/api/WkPosLogin funciona).
| Operação | Nome atual | Nome da Venddor 1.0 | Nome do app (sem sublinhado) |
|---|---|---|---|
| Login do caixa | pos_login | wk_pos_login | wkposlogin |
| Produtos | pos_products | wk_pos_get_all_products | wkposgetallproducts |
| Clientes | pos_customers | wk_pos_get_all_customers | wkposgetallcustomers |
| Fechar a venda | pos_checkout | wk_pos_checkout | wkposcheckout |
O envelope das respostas
Toda resposta das quatro operações tem o mesmo formato:
{ "status": 200, "data": { "success": true, "message": "" } }status é sempre 200. Quem diz se deu certo é data.success; quando é false, data.message traz o motivo (em inglês, como o servidor devolve). Os campos específicos de cada operação vêm dentro de data.
Ids e dinheiro
Em /api/v1.0 todo id é UUID. Em /api (sem versão) o servidor troca os UUID por números decimais em string ("1487324647") em toda a resposta, e aceita esses decimais na entrada. Exceção: payment_id e shipping_id das listas de pos_login continuam UUID. Valores em dinheiro são strings decimais com ponto ("1678.95"), nunca centavos.
O que o login devolve e o que ele não faz
O access_token do login é um JWT do caixa. Ele serve de Bearer em chamadas seguintes, mas só abre as rotas de catálogo e venda se o caixa for administrador. manager_id, ec_user_level e manager_discount_limit voltam sempre vazios, balance é sempre "0.00" e usergroups é sempre uma lista vazia: existem só para o app antigo não quebrar ao ler o JSON.
Endpoints
| Operação | Rota (com e sem /v1.0) | Autenticação | Página |
|---|---|---|---|
| Login do caixa | GET e POST /api/v1.0/pos_login e /api/pos_login | qualquer usuário autenticado | Login do caixa |
| Login (outros nomes) | GET e POST wk_pos_login, wkposlogin | idem | Nomes alternativos do login |
| Produtos | GET pos_products | administrador | Produtos e clientes |
| Clientes | GET pos_customers | administrador | Produtos e clientes |
| Produtos e clientes (outros nomes) | GET wk_pos_get_all_products, wkposgetallproducts, wk_pos_get_all_customers, wkposgetallcustomers | administrador | Nomes alternativos do catálogo |
| Fechar a venda | POST pos_checkout | administrador | Fechar a venda |
| Fechar a venda (outros nomes) | POST wk_pos_checkout, wkposcheckout | administrador | Nomes alternativos do fechamento |
Erros comuns
- Chamar
pos_loginsem credencial. O login não é público: semAuthorizationa resposta é401 Authentication required. Gere antes a chave de API do terminal. - Tratar o HTTP 200 como sucesso. Senha errada, produto inexistente e pedido recusado voltam com 200. Leia
data.success. - Esperar que o caixa comum consiga vender. Catálogo, clientes e fechamento exigem administrador; um caixa sem esse perfil vê
403 Forbidden: admin scope required. - Mandar preço no fechamento. O preço de cada item vem do catálogo;
price,subtotaletotaldo corpo são ignorados. - Vender produto físico e esperar que funcione. O fechamento não envia forma de envio; em lojas com frete ligado a venda é recusada com
shipping_service_unavailable. - Misturar ids de
/apie de/api/v1.0. Escolha uma forma e mantenha.