# generateButton()
Cria o botão de pagamento com callbacks e opções de aparência e pagamento.
`facipay.generateButton(params)` cria um botão de pagamento. Devolve um
[objeto Button](/pt/sdk/button-object) que renderiza com `.render()`.
```js
const button = facipay.generateButton({
createOrder: async () => referenceNumber,
onApprove: async (data, actions) => { /* ... */ },
options: {
style: { width: '100%', shape: 'pill' },
config: { lang: 'pt', showAmount: true },
paymentConfig: { theme: 'light', allowedPaymentMethods: ['FPMCXEXPRSS', 'FPSOLPG'] },
},
});
button.render('#facipay-button-container');
```
## Callbacks
Chamado antes de abrir o popup. Cria a ordem no seu backend e devolve o `referenceNumber`
como **string não-vazia**. Detalhes em [Callbacks](/pt/sdk/callbacks).
Pagamento aprovado (Multicaixa Express).
Pagamento pendente (Referência EMIS) — há uma referência a mostrar ao cliente.
Pagamento cancelado pelo utilizador.
Erro durante a transação.
O botão foi inicializado. `actions` permite `enable()` / `disable()`.
Clique no botão, antes do `createOrder()`. `actions` permite `enable()`, `disable()` e
`reject()` (interrompe o fluxo). Útil para validar formulários.
## options.style
Largura do botão (ex.: `'100%'`, `320`). Default `'100%'`.
Forma do botão. Default `'pill'`.
## options.config
Idioma do texto do botão e do checkout.
Mostra o valor total no botão. Requer referências de pagamento (ver
[Referências múltiplas](/pt/sdk/recipes/multiple-references)).
## options.paymentConfig
Tema do checkout.
Métodos visíveis no checkout. Default `['FPMCXEXPRSS', 'FPSOLPGEXT', 'FPSOLPG']`:
- `FPMCXEXPRSS` — Multicaixa Express
- `FPSOLPGEXT` — Referência EMIS
- `FPSOLPG` — **Pagamento direto via FaciPay** (sempre disponível)
O **pagamento direto via FaciPay** é sempre a opção padrão e **não pode ser desativado**.
Ver [Métodos de pagamento](/pt/get-started/introduction#metodos-de-pagamento).
Método pré-selecionado no checkout. Default `'FPMCXEXPRSS'`.
Mostra a UI de progresso durante o processamento.
Validade da referência EMIS, em **minutos** (ex.: `1440` = 24h).
Dados do cliente: `{ name, phone }`. Também pode defini-los em runtime com
[`button.addCustomerInfo()`](/pt/sdk/button-object).
## Exemplo completo
```js
facipay.generateButton({
async createOrder() {
const r = await fetch('/api/facipay/create-order', { method: 'POST' });
const { referenceNumber } = await r.json();
return referenceNumber;
},
async onApprove(data, actions) {
actions.onPopupWindowClosed(() => {
window.location.href = `/sucesso?orderId=${data.payment.orderId}`;
});
},
async onPending(data, actions) {
actions.onPopupWindowClosed(() => {
const ref = data.payment.data.paymentReference;
window.location.href = `/pendente?ref=${ref}`;
});
},
async onCancel() { window.location.href = '/cancelado'; },
async onError(e) { console.error(e); },
options: {
style: { width: '100%', shape: 'pill' },
config: { lang: 'pt', showAmount: true },
paymentConfig: {
theme: 'light',
allowedPaymentMethods: ['FPMCXEXPRSS', 'FPSOLPGEXT', 'FPSOLPG'],
showUIOfProcessingInfo: true,
referencePaymentLifeSpan: 1440,
},
},
}).render('#facipay-button-container');
```
Assinaturas e shapes de dados de cada callback.