# 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.