# Conceitos essenciais
Chaves, ambientes, ciclo de vida da ordem e idempotência — os conceitos essenciais do FaciConnect.
## Credenciais
| Credencial | Onde vive | Para que serve |
|---|---|---|
| `PUBLISHABLE_KEY` (`pk_test_…`/`pk_live_…`) | Frontend + backend | Inicializa a SDK e identifica a aplicação. |
| `CLIENT_ID` | **Só backend** | Identifica o parceiro na obtenção do token. |
| `CLIENT_SECRET` | **Só backend** | Segredo para obter o `access_token`. |
| `WEBHOOK_SECRET` | **Só backend** | Verifica a assinatura HMAC dos webhooks. |
`CLIENT_SECRET` e `WEBHOOK_SECRET` **nunca** podem ir para o bundle do frontend.
Mantenha-os em variáveis de ambiente no servidor.
### applicationUUID
Várias chamadas à API pedem `applicationUUID`. É a sua `PUBLISHABLE_KEY` **sem** o prefixo:
```js
const applicationUUID = PUBLISHABLE_KEY.replace(/^pk_(test|live)_/, '');
```
## Ambientes
| Ambiente | Prefixo da chave | Base URL |
|---|---|---|
| Sandbox | `pk_test_…` | `https://sandbox.api.faciconnect.com` |
| Produção | `pk_live_…` | `https://api.faciconnect.com` |
Teste **sempre** todo o fluxo com `pk_test_` antes de mudar para `pk_live_`.
Produção exige **HTTPS**.
## Ciclo de vida da ordem
Uma ordem tem três estados. A transição é dirigida pela FaciPay e confirmada pelo webhook.
```mermaid
stateDiagram-v2
[*] --> PEN: createPaymentOrder
PEN --> CON: pagamento confirmado
PEN --> CAN: cancelado / expirado
CON --> [*]
CAN --> [*]
```
| Estado | Significado | Ação típica |
|---|---|---|
| `PEN` | Pendente | Aguardar (Multicaixa Express) ou mostrar referência (EMIS). |
| `CON` | Confirmado / pago | Fulfillment: confirmação, email, libertar produto. |
| `CAN` | Cancelado | Reabrir carrinho, libertar stock. |
## A fonte da verdade
O estado autoritativo de um pagamento vem **sempre do webhook** no seu backend, não dos
callbacks do frontend. Os callbacks (`onApprove`, `onPending`, `onCancel`) servem para a
**experiência do utilizador**; a confirmação de negócio (libertar produto, faturar) só
acontece quando o webhook confirma `CON`.
O endpoint [`GET /facipaypartner/paymentByExternalTransaction`](/pt/api-reference/introduction)
é apenas uma **rede de segurança** (fallback) para quando o webhook falha ou atrasa.
## Idempotência
O `externalTransactionId` é a chave de idempotência. Garante que:
- Cada ordem tem um `externalTransactionId` **único** (ex.: `order_`).
- Se um webhook chegar repetido para uma ordem já em estado final (`CON`/`CAN`),
responde `200` **sem reprocessar**.
```js
function updateOrder(externalTransactionId, paymentStatus) {
const order = db.orders.find(externalTransactionId);
if (!order) return;
if (order.status === 'CON' || order.status === 'CAN') return; // já final → não reprocessa
db.orders.update(externalTransactionId, { status: paymentStatus });
}
```
## Recebimentos e taxas
**Onde fica o dinheiro.** Os valores recebidos são creditados na sua **conta FaciPay**. A
partir daí pode usá-los para pagamentos via FaciPay ou **levantar para o seu banco**. Sobre
cada transação aplica-se uma **taxa** — para os detalhes, fale com a equipa comercial da **Faci-X**.
Verificação HMAC do webhook, passo a passo por framework.