@sinnu-dev/sdk 0.0.0-stage → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +161 -2
- package/dist/index.cjs +895 -0
- package/dist/index.d.cts +1285 -0
- package/dist/index.d.ts +1285 -0
- package/dist/index.js +850 -0
- package/package.json +63 -5
package/README.md
CHANGED
|
@@ -1,3 +1,162 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Sinnu SDK para Node.js
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
SDK oficial da [Sinnu](https://sinnu.com.br) para receber com **Pix** e **cartão de crédito**
|
|
4
|
+
direto do seu sistema.
|
|
5
|
+
|
|
6
|
+
Feito para **agências**, **prestadores de serviço**, **SaaS** e qualquer negócio que
|
|
7
|
+
cobra clientes pela internet: gere um link de pagamento, mande para o cliente e saiba na
|
|
8
|
+
hora quando o dinheiro entrou.
|
|
9
|
+
|
|
10
|
+
📘 **Documentação completa:** [docs.sinnu.com.br](https://docs.sinnu.com.br)
|
|
11
|
+
|
|
12
|
+
## O que dá para fazer
|
|
13
|
+
|
|
14
|
+
- **Cobrar** com links de pagamento: Pix e cartão em até 12x, no checkout hospedado da Sinnu.
|
|
15
|
+
- **Acompanhar** as transações: status, valor bruto, taxas e valor líquido.
|
|
16
|
+
- **Estornar** uma venda pelo próprio sistema.
|
|
17
|
+
- **Ser avisado** de cada pagamento por webhook, com assinatura verificada.
|
|
18
|
+
|
|
19
|
+
## Instalação
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
npm install @sinnu-dev/sdk
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Requer Node.js 18 ou mais recente. Funciona com TypeScript e JavaScript (ESM e CommonJS).
|
|
26
|
+
|
|
27
|
+
## Primeiros passos
|
|
28
|
+
|
|
29
|
+
Gere sua **chave secreta** (`sk_live_...`) no painel da Sinnu, em **Chave de API**, e guarde
|
|
30
|
+
em uma variável de ambiente do servidor.
|
|
31
|
+
|
|
32
|
+
> A chave secreta dá acesso à sua conta. Use só no backend: nunca no navegador nem no app.
|
|
33
|
+
|
|
34
|
+
```ts
|
|
35
|
+
import { Sinnu } from "@sinnu-dev/sdk";
|
|
36
|
+
|
|
37
|
+
const sinnu = new Sinnu({ apiKey: process.env.SINNU_API_KEY! });
|
|
38
|
+
|
|
39
|
+
const link = await sinnu.links.create({
|
|
40
|
+
title: "Consultoria inicial",
|
|
41
|
+
amountCents: 9900, // R$ 99,00
|
|
42
|
+
methods: ["pix", "credit_card"],
|
|
43
|
+
maxInstallments: 12,
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
// Envie esta URL para o seu cliente pagar.
|
|
47
|
+
console.log(sinnu.checkout.url(link.slug));
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
Valores são sempre em **centavos**: `9900` é R$ 99,00.
|
|
51
|
+
|
|
52
|
+
## Cobrar pedidos do seu sistema
|
|
53
|
+
|
|
54
|
+
O link é o produto e pode ser vendido muitas vezes. Para saber qual pedido cada venda
|
|
55
|
+
pagou, abra o checkout com a referência do pedido:
|
|
56
|
+
|
|
57
|
+
```ts
|
|
58
|
+
const link = await sinnu.links.create({
|
|
59
|
+
title: "Consultoria inicial",
|
|
60
|
+
amountCents: 9900,
|
|
61
|
+
externalReference: "CONSULTORIA-1H", // código do produto no seu sistema
|
|
62
|
+
redirectUrl: "https://sualoja.com.br/obrigado", // ou o deep link do app: meuapp://pedido
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
// Um checkout por pedido: a referência volta na transação e no webhook.
|
|
66
|
+
const url = sinnu.checkout.url(link.slug, { reference: "pedido-123" });
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
Depois do pagamento confirmado, o comprador volta para o `redirectUrl` (liberado por empresa:
|
|
70
|
+
confirme com a Sinnu se já está ativo para a sua) com
|
|
71
|
+
`transactionId`, `reference` e `status=approved` na query. Use esses parâmetros só para
|
|
72
|
+
mostrar a tela certa: libere o pedido pelo webhook ou por `transactions.get(transactionId)`.
|
|
73
|
+
|
|
74
|
+
## Acompanhar transações
|
|
75
|
+
|
|
76
|
+
```ts
|
|
77
|
+
const page = await sinnu.transactions.list({ status: "approved" });
|
|
78
|
+
console.log(`${page.total} vendas aprovadas`);
|
|
79
|
+
|
|
80
|
+
// Ou percorra todas as páginas:
|
|
81
|
+
for await (const tx of sinnu.transactions.listAll({ status: "approved" })) {
|
|
82
|
+
console.log(tx.id, tx.method, tx.amount, tx.net);
|
|
83
|
+
}
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
## Estornar uma venda
|
|
87
|
+
|
|
88
|
+
O estorno é sempre do valor total da transação. A chave precisa do escopo `transactions:refund`; sem ele, a API responde `403`.
|
|
89
|
+
|
|
90
|
+
```ts
|
|
91
|
+
const tx = await sinnu.transactions.refund("ID_DA_TRANSACAO", {
|
|
92
|
+
reason: "Pedido cancelado pelo cliente",
|
|
93
|
+
});
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
## Receber webhooks
|
|
97
|
+
|
|
98
|
+
A Sinnu avisa seu sistema a cada evento de pagamento. Verifique a assinatura com o
|
|
99
|
+
**corpo cru** da requisição antes de processar:
|
|
100
|
+
|
|
101
|
+
```ts
|
|
102
|
+
import { constructEvent, SinnuWebhookSignatureError } from "@sinnu-dev/sdk";
|
|
103
|
+
|
|
104
|
+
try {
|
|
105
|
+
const event = constructEvent({
|
|
106
|
+
payload: rawBody,
|
|
107
|
+
signature: req.headers["x-sinnu-signature"],
|
|
108
|
+
secret: process.env.SINNU_WEBHOOK_SECRET!,
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
if (event.type === "transaction.approved") {
|
|
112
|
+
// event.data.reference é o pedido do seu sistema (o ?ref= do checkout):
|
|
113
|
+
// libere o pedido, envie o acesso, emita a nota...
|
|
114
|
+
}
|
|
115
|
+
} catch (err) {
|
|
116
|
+
if (err instanceof SinnuWebhookSignatureError) {
|
|
117
|
+
// assinatura inválida: responda 400 e descarte
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
## Tratamento de erros
|
|
123
|
+
|
|
124
|
+
Toda falha da API vira um `SinnuError` (ou uma subclasse), com o status HTTP em
|
|
125
|
+
`statusCode`:
|
|
126
|
+
|
|
127
|
+
```ts
|
|
128
|
+
import { SinnuAuthError, SinnuError, SinnuValidationError } from "@sinnu-dev/sdk";
|
|
129
|
+
|
|
130
|
+
try {
|
|
131
|
+
await sinnu.links.create({ title: "Teste", amountCents: 500 });
|
|
132
|
+
} catch (err) {
|
|
133
|
+
if (err instanceof SinnuAuthError) console.error("Chave de API inválida");
|
|
134
|
+
else if (err instanceof SinnuValidationError) console.error(err.body);
|
|
135
|
+
else if (err instanceof SinnuError) console.error(err.statusCode, err.message);
|
|
136
|
+
}
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
Também existem `SinnuNotFoundError` e `SinnuRateLimitError`.
|
|
140
|
+
|
|
141
|
+
## Recursos
|
|
142
|
+
|
|
143
|
+
| Recurso | Métodos |
|
|
144
|
+
|---|---|
|
|
145
|
+
| `sinnu.links` | `create`, `get`, `update`, `archive`, `list`, `listAll`, `transactions` |
|
|
146
|
+
| `sinnu.transactions` | `list`, `listAll`, `get`, `refund` |
|
|
147
|
+
| `sinnu.checkout` | `url` |
|
|
148
|
+
| `sinnu.webhooks` | `constructEvent`, `verifySignature`, `computeSignature` |
|
|
149
|
+
|
|
150
|
+
Para chamar direto qualquer rota da API pública com tipos, use `sinnu.http`.
|
|
151
|
+
|
|
152
|
+
## Links úteis
|
|
153
|
+
|
|
154
|
+
- [Guia do SDK](https://docs.sinnu.com.br/sdk)
|
|
155
|
+
- [Início rápido](https://docs.sinnu.com.br/guias/inicio-rapido)
|
|
156
|
+
- [Autenticação](https://docs.sinnu.com.br/guias/autenticacao)
|
|
157
|
+
- [Webhooks](https://docs.sinnu.com.br/guias/webhooks)
|
|
158
|
+
- [Referência da API](https://docs.sinnu.com.br/api-reference)
|
|
159
|
+
|
|
160
|
+
## Licença
|
|
161
|
+
|
|
162
|
+
MIT
|