0.3.0, publicado no Maven Central e no Swift Package Manager, com o código em github.com/bonifiq/bonifiq-sdk sob a licença Apache 2.0.O que o SDK oferece
O SDK é feito em Kotlin Multiplatform e é distribuído em duas partes:Hub pronto
Login seguro
Cupom no carrinho
Cashback no checkout
Telas próprias
Sempre atualizado
Requisitos
0.3.0 é compilada com Kotlin 2.4.20, Compose Multiplatform 1.12.1, Android Gradle Plugin 9.4.1 e compileSdk 37. Use essas versões ou mais novas: versões anteriores podem funcionar, mas não têm suporte.
Por onde começar
Como funciona
- Login: o app prova quem é o cliente, pela sessão VTEX ou por um código enviado por e-mail. O SDK troca essa prova por um SecureToken, guarda o token em memória e renova quando pode.
- Telas: o hub (o widget da BonifiQ), as telas prontas do SDK ou as suas usam a API Widget com esse token.
- Eventos: quando algo precisa acontecer fora da BonifiQ, como aplicar um cupom, o SDK avisa o app. Quem mexe no carrinho é sempre o app.
Passo 1: o hub pronto, em poucas linhas
Instale
Adicione o SDK ao módulo do app (ou ao módulo compartilhado, se o projeto é Kotlin Multiplatform):mavenCentral()) nos projetos Android e Kotlin Multiplatform.
Crie uma instância
Crie uma única instância para o app inteiro e compartilhe, por exemplo, pela sua injeção de dependências:tenant é a chave pública da loja na BonifiQ, a mesma usada no header X-BQ-Tenant da API Widget.
Mostre o hub
- É o widget da BonifiQ: o mesmo do site da loja, aberto num WebView. O cliente tem saldo, recompensas, cupons, extrato, regulamento, missões, quiz, níveis e indicação.
- Sem cliente logado: o widget mostra o programa e convida o cliente a entrar.
- Com cliente logado (passo 2): o widget mostra os pontos, as recompensas e os cupons dele.
- Visual e textos: vêm do painel da BonifiQ, como no site. Não é preciso configurar nada no app.
- Sempre atualizado: quando a BonifiQ melhora o widget, o app recebe a novidade sem publicar uma nova versão.
Exemplo completo no Android
Os três arquivos abaixo bastam para abrir o hub numa tela do app. A instância fica na classeApplication, para ser a mesma em todas as telas:
Passo 2: identifique o cliente
O SDK não chama a sua plataforma de e-commerce. O app entrega ao SDK uma prova de quem é o cliente, e o SDK troca essa prova por um SecureToken da BonifiQ. As funções de login sãosuspend: chame-as numa coroutine, por exemplo com viewModelScope.launch. Elas lançam BonifiQException quando não conseguem entrar (veja os erros).
- Loja VTEX
- Código por e-mail
Quando o app abre de novo
O SDK guarda a sessão só em memória. Cada vez que o app é aberto, o cliente começa anônimo na BonifiQ:- Loja VTEX: se o cliente já está logado na loja, chame
loginWithVtexde novo na inicialização do app. Ele não percebe nada. - Código por e-mail: o cliente precisa entrar de novo.
Estado do login
Acompanhe o estado do login para adaptar a interface:Passo 3: reaja ao que acontece no hub
O hub avisa o app por eventos. São três:Passo 4: cashback no checkout
Se a loja usa cashback, coloque o card pronto na tela de finalização da compra. Ele mostra o saldo, quanto pode ser usado nesta compra, e aplica ou remove o cashback:amount:

- Recarregue o carrinho em
onCartChanged. Ele é chamado depois de aplicar ou remover o cashback. - Avise a BonifiQ quando o carrinho mudar. Depois de alterar itens ou cupons, chame
bonifiq.checkout.refreshCashback(cartId). - Confirme antes de fechar o pedido. Chame
refreshCashbackde novo. Se o resultado vier comremoved = true, recarregue o carrinho e mostre a mensagem ao cliente antes de seguir.
Passo 5: saldo em qualquer tela
Mostre o saldo do cliente no topo da loja, com atalho para o hub:Passo 6: telas do seu jeito
Se o app tem identidade visual própria, use só obonifiq-core e desenhe as telas. O login (passo 2) é o mesmo.
suspend. No Swift, elas viram async throws (veja como usar):
Erros
As funções lançam apenasBonifiQException:
O hub por dentro
OBonifiQLoyalty abre o widget da BonifiQ dentro de um WebView, no modo app. É o mesmo widget do site da loja, com todos os recursos dele, e as novidades chegam sem publicar uma nova versão do app. O login do passo 2 e os eventos do passo 3 ligam o widget ao app.
-
Endereço do widget: é o configurado para a loja na BonifiQ. Se o time BonifiQ indicar outro endereço para testes, use
widgetUrl: - Segurança: o token do cliente vai ao widget por mensagem, nunca pela URL. O WebView só conversa com o domínio do widget, e links para outros sites abrem no navegador.
- Se o widget não carregar em 12 segundos, ou a configuração da loja não responder, o hub mostra “Não foi possível carregar o programa de fidelidade” com Tentar novamente.
-
Sem WebView compatível (desktop, ou Android com o WebView desatualizado), o hub avisa que o programa não está disponível no aparelho, e o botão Fechar emite
LoyaltyEvent.Close. -
Carrinho: o widget ainda não recebe o
cartId. Os resgates não ficam associados ao carrinho, mas o eventoApplyCouponchega ao app do mesmo jeito. - Strava: em desafios de corrida, o cliente conecta a conta do Strava sem sair do app. O SDK abre o app do Strava, se estiver instalado, ou a tela de login do sistema por cima do app. No Android isso não exige nada; no iOS, abrir o app do Strava pede uma configuração opcional (veja na seção de iOS).
Integrando o widget sem o SDK (React Native, Flutter)
Integrando o widget sem o SDK (React Native, Flutter)
https://widget.bonifiq.com.br/?bqapp=1&tenant=SEU_TENANTDo widget para o app:auth (com secureToken e customer: {email, name, id}), tokenRefreshed (com secureToken) e logout.Canais:- widget → app:
window.ReactNativeWebView.postMessageno React Native, ou umJavaScriptChannelchamadoBonifiQNativeno Flutter; - app → widget:
window.BonifiQEmbed.receive(<json>).
iOS (Swift)
O frameworkBonifiQ traz o core e as telas. O hub vem pronto como UIViewController, para UIKit e SwiftUI.
Instale pelo Swift Package Manager: no Xcode, File → Add Package Dependencies com a URL https://github.com/bonifiq/bonifiq-sdk (versão 0.3.0 ou mais nova), ou no Package.swift:
Info.plist do app a chave CADisableMinimumFrameDurationOnPhone com valor true. Sem ela, o Compose encerra o app ao mostrar a tela.
Strava no iOS (opcional)
Sem configuração, o cliente conecta o Strava pela tela de login do sistema, que aparece por cima do app e aproveita a sessão do Safari. Para abrir o app do Strava, que pede só um toque para autorizar:-
Registre o esquema
bq.seguido do bundle id em minúsculas noInfo.plist:Info.plist -
Repasse ao SDK as URLs que o app recebe:
_, ele não vira um esquema de URL válido, e o cliente conecta o Strava pelo navegador.
Usando o core no Swift
As funções do passo 6 chegam ao Swift comoasync throws. O BonifiQException vem dentro do erro, em userInfo["KotlinException"]:
App de demonstração
O app de demonstração é uma loja completa, em Kotlin Multiplatform (Android, iOS e desktop), ligada a uma loja VTEX de testes e ao programa de fidelidade dela. Use-o como referência de integração: cada passo deste guia está implementado nele. O cliente consegue:- navegar pelo catálogo, montar o carrinho, entrar na loja (código por e-mail da VTEX) e fechar o pedido;
- ver o saldo no topo da loja;
- resgatar recompensas na aba Fidelidade e aplicar o cupom no carrinho com um toque;
- usar cashback na finalização da compra.
- Desktop:
./gradlew :desktopApp:run. No desktop, a aba Fidelidade avisa que o hub não está disponível, porque não há WebView. - Android:
./gradlew :androidApp:assembleDebuge instale o APK num aparelho - iOS: abra
iosApp/iosApp.xcodeprojno Xcode
Testando a integração
- Logs: com
enableLogging = true, o SDK escreve no console o método, a URL e o status de cada chamada. No Android, eles aparecem no Logcat com a tagSystem.out. Tokens, headers e corpos nunca são registrados. Desligue antes de publicar. - Outro endereço do widget: se o time BonifiQ indicar um widget de testes, use
widgetUrl. - Cliente de testes: use um cliente criado para testes. Os resgates gastam pontos de verdade e geram cupons válidos na loja.
- Sem login, o hub abre e mostra as recompensas.
- Depois do login, o hub mostra o saldo do cliente.
- Ao fechar e abrir o app com o cliente logado na loja, o saldo aparece sem pedir login de novo (loja VTEX).
- O cupom resgatado entra no carrinho.
- Aplicar e remover cashback atualiza o total do carrinho, e o
refreshCashbackroda antes de fechar o pedido. - Ao sair do app, o cliente sai também da BonifiQ.
- O
enableLoggingestá desligado.
Dados e privacidade
Use estas informações para preencher a seção de segurança dos dados do Google Play e os detalhes de privacidade da App Store.- Para onde vão os dados: o SDK só se comunica com a API da BonifiQ (
api.bonifiq.com.br). No hub, o WebView também carrega o widget da BonifiQ. - O que é enviado:
- o
tenantda loja, em todas as chamadas; - no login VTEX, os tokens da sessão VTEX, que a BonifiQ usa para confirmar o cliente com a VTEX;
- no login por código, o e-mail e o código;
- o SecureToken, nas chamadas do cliente logado;
- o id e o total do carrinho, nos resgates e no cashback.
- o
- O que fica no aparelho: nada é gravado em disco. O SecureToken fica só em memória e é descartado quando o app fecha ou no
logout(). - Métricas e erros: o SDK não coleta métricas de uso. O widget, como no site da loja, usa o Google Analytics para métricas de uso e o Sentry para registrar erros técnicos, sem identificar o cliente.
Solução de problemas
O hub aparece cortado ou com espaço sobrando
O hub aparece cortado ou com espaço sobrando
BonifiQLoyalty um tamanho definido, por exemplo Modifier.fillMaxSize(). Evite colocá-lo dentro de uma coluna com rolagem: o hub já rola sozinho.O cliente está logado na loja, mas o hub pede para entrar
O cliente está logado na loja, mas o hub pede para entrar
loginWithVtex (ou o login por código). Confira se o app chama o login depois que o cliente entra na loja e também quando o app abre de novo. Com enableLogging = true, a chamada a vendors/vtex/securelogin deve aparecer com status 200.O cupom resgatado não entrou no carrinho
O cupom resgatado não entrou no carrinho
LoyaltyEvent.ApplyCoupon, e o app aplica na plataforma. Confira se o evento é tratado e se o carrinho é recarregado depois de aplicar o cupom.O cashback sumiu do carrinho
O cashback sumiu do carrinho
refreshCashback devolve removed = true e uma message para mostrar ao cliente.O hub mostra que não foi possível carregar o programa
O hub mostra que não foi possível carregar o programa
/pub/widget/app/config). Costuma ser rede instável: Tentar novamente carrega de novo. Para investigar, use enableLogging = true e veja se a chamada a app/config volta com status 200.O hub avisa que o programa não está disponível no aparelho
O hub avisa que o programa não está disponível no aparelho
WEB_MESSAGE_LISTENER, que vem com o Android System WebView atualizado pela Play Store. No desktop o hub nunca abre, porque não há WebView.O app fecha ao abrir o hub no iOS
O app fecha ao abrir o hub no iOS
CADisableMinimumFrameDurationOnPhone com valor true no Info.plist. Veja a seção de iOS.Referência rápida
Configuração (BonifiQConfig)
Boas práticas
- Uma instância por app. Ela guarda a sessão do cliente e o cache das configurações da loja.
- Entre na BonifiQ ao abrir o app. Se o cliente está logado na loja VTEX, chame
loginWithVtexna inicialização. - Faça logout junto com o app. Chame
bonifiq.auth.logout()quando o cliente sair. - Não guarde o SecureToken. O SDK cuida dele em memória e renova quando pode.
- Recarregue o carrinho depois de mexer no cashback, e confira com
refreshCashbackantes de fechar o pedido. - Desligue o
enableLoggingem produção.
Versões
O SDK segue o versionamento semântico. Antes da 1.0, uma nova versão0.x pode trazer mudanças incompatíveis; cada versão tem as mudanças descritas nas releases do GitHub.
Para saber qual versão o app está usando, consulte BonifiQ.VERSION.
Dúvidas comuns
Preciso de uma chave de API no app?
Preciso de uma chave de API no app?
tenant, que é público.Minha loja não é VTEX. Posso usar o SDK?
Minha loja não é VTEX. Posso usar o SDK?
Posso mudar as cores e os textos?
Posso mudar as cores e os textos?
LocalBonifiQStrings. Para controle total da interface, use o bonifiq-core (passo 6).O que acontece quando o token do cliente expira?
O que acontece quando o token do cliente expira?
Expired depois de 60 minutos: o SDK encerra a sessão no hub e emite LoginRequired para o app abrir o login.E se o widget não carregar?
E se o widget não carregar?
Suporte
Em caso de dúvidas ou problemas na integração:- Central de Ajuda: suporte.bonifiq.com.br
- E-mail: suporte@bonifiq.com.br
- API Widget: documentação
- Código do SDK e problemas: github.com/bonifiq/bonifiq-sdk (licença Apache 2.0)