Um widget de pagamento white-label completo para o Cartão Simples, que pode ser integrado em qualquer site via CDN ou usado como SDK npm. Suporta Shadow DOM, acessibilidade completa, e configuração de tema customizada.
- ā Widget White-Label com temas customizĆ”veis
- ā Bootstrap leve (1.8KB gzipped) com carregamento assĆncrono
- ā Shadow DOM com fallback para iframe sandbox
- ā MĆŗltiplos formatos: SDK npm + CDN
- ā Acessibilidade completa (ARIA, foco, teclado)
- ā ValidaƧƵes robustas com Zod + React Hook Form
- ā TypeScript com tipagem completa
- ā AnimaƧƵes suaves com Framer Motion
- ā Responsivo e otimizado para mobile
Adicione o snippet no seu HTML:
<script
src="https://cdn.cartaosimples.com/widget-bootstrap.v1.min.js"
data-merchant-id="seu-merchant-123"
data-primary="#FF6600"
data-secondary="#0A0A0A"
data-logo="https://seusite.com/logo.png"
data-border-radius="12px"
data-env="production"
async
></script>Ou usando configuração via JavaScript:
<script
src="https://cdn.cartaosimples.com/widget-bootstrap.v1.min.js"
async
></script>
<script>
window.PaymentWidgetInit = {
orderId: "seu-merchant-123",
primaryColor: "#FF6600",
logoUrl: "https://seusite.com/logo.png",
apiBaseUrl: "https://api.cartaosimples.com",
onSuccess: (data) => {
console.log("Pagamento realizado:", data);
},
onError: (error) => {
console.error("Erro:", error);
},
};
</script>npm install cartao-simples-widgetPara React:
import { PaymentWidget } from "cartao-simples-widget";
function App() {
return (
<PaymentWidget
config={{
orderId: "seu-merchant-123",
primaryColor: "#FF6600",
onSuccess: (data) => console.log("Sucesso:", data),
onError: (error) => console.error("Erro:", error),
}}
/>
);
}Para Vanilla JS:
import { mount } from "cartao-simples-widget";
const widget = mount(document.getElementById("widget-container"), {
orderId: "seu-merchant-123",
primaryColor: "#FF6600",
onSuccess: (data) => console.log("Sucesso:", data),
});
// Controle programƔtico
widget.open();
widget.close();// Via CDN
window.PaymentWidget.init({
orderId: "merchant-123",
autoOpen: false,
});
window.PaymentWidget.open();
window.PaymentWidget.close();
window.PaymentWidget.destroy();| Propriedade | Tipo | Padrão | Descrição |
|---|---|---|---|
orderId |
string |
- | Obrigatório - ID único do parceiro |
primaryColor |
string |
#ff6600 |
Cor primƔria (hex) |
secondaryColor |
string |
#0a0a0a |
Cor secundƔria (hex) |
logoUrl |
string |
- | URL do logo do parceiro |
borderRadius |
string |
md |
sm|md|lg|full|{valor}px |
environment |
string |
staging |
staging|production |
apiBaseUrl |
string |
- | URL da API personalizada |
autoOpen |
boolean |
false |
Abrir automaticamente após init |
{
onSuccess: (data: PaymentSuccessData) => void;
onError: (error: PaymentError) => void;
onOpen: () => void;
onClose: () => void;
}{
transactionId: "txn_123456789",
token: "tok_abcdef123",
orderId: "merchant_001",
amount?: 1500.00,
installments?: 12,
timestamp: "2024-01-15T10:30:00Z"
}- Shadow DOM para isolamento completo de CSS/JS
- Iframe sandbox como fallback com permissƵes mĆnimas
- HTTPS obrigatório em produção
- Validação de origins com
postMessage - Sanitização de dados com Zod schemas
- Sem
eval()- código totalmente seguro - Conformidade LGPD - dados criptografados
- ā
ARIA completo -
role="dialog",aria-modal="true" - ā Trap de foco dentro do modal
- ā Navegação por teclado - Tab, Shift+Tab, ESC
- ā Screen readers - labels e descriƧƵes adequadas
- ā Alto contraste - cores acessĆveis
- ā Responsive - funciona em qualquer dispositivo
- Autorização ā Checkbox de consentimento para anĆ”lise
- AnĆ”lise de CrĆ©dito ā FormulĆ”rio com dados pessoais
- Resultado ā Aprovação/reprovação instantĆ¢nea
- EndereƧo ā Confirmação de dados de entrega
- Pagamento ā Dados do cartĆ£o + parcelas
- Confirmação ā Sucesso e próximos passos
# Clonar repositório
git clone <repo>
cd cartao-simples-widget
# Instalar dependĆŖncias
npm install
# Desenvolvimento
npm run dev
# Builds
npm run build # Todos os builds
npm run build:sdk # SDK para npm
npm run build:cdn # CDN bundle
npm run build:bootstrap # Bootstrap leve
# Linting e type-check
npm run lint
npm run lint:fix
npm run type-checksrc/
āāā bootstrap/ # Loader leve (CDN entry)
āāā cdn/ # Bundle completo (CDN)
āāā sdk/ # ExportaƧƵes SDK (npm)
āāā components/ # Componentes React
ā āāā steps/ # Steps do formulĆ”rio
ā āāā PaymentWidget.tsx
ā āāā PaymentModal.tsx
ā āāā ThemeProvider.tsx
āāā types/ # DefiniƧƵes TypeScript
āāā utils/ # UtilitĆ”rios (masks, logger)
āāā schemas/ # ValidaƧƵes Zod
āāā styles/ # CSS customizado
# Criar bucket
aws s3 mb s3://cartao-simples-widget
# Upload dos arquivos
aws s3 sync dist/ s3://cartao-simples-widget/ --public-read
# Criar distribuição CloudFront
aws cloudfront create-distribution --distribution-config file://cloudfront.json{
"CORSRules": [
{
"AllowedHeaders": ["*"],
"AllowedMethods": ["GET", "HEAD"],
"AllowedOrigins": ["*"],
"MaxAgeSeconds": 3600
}
]
}https://cdn.cartaosimples.com/widget-bootstrap.v1.min.js (1.8KB)
https://cdn.cartaosimples.com/widget.v1.min.js (122KB)
<script
src="https://cdn.cartaosimples.com/widget-bootstrap.v1.min.js"
integrity="sha384-HASH_AQUI"
crossorigin="anonymous"
async
></script><!DOCTYPE html>
<html>
<head>
<title>Minha Loja</title>
</head>
<body>
<button id="payment-btn">
Parcele suas compras sem comprometer o limite do cartão
</button>
<script
src="https://cdn.cartaosimles.com/widget-bootstrap.v1.min.js"
async
></script>
<script>
document.getElementById("payment-btn").addEventListener("click", () => {
window.PaymentWidget.init({
orderId: "loja-123",
primaryColor: "#FF6600",
onSuccess: (data) => {
// Redirecionar para pƔgina de sucesso
window.location.href = `/success?token=${data.token}`;
},
});
});
</script>
</body>
</html>function add_cartao_simples_widget() {
wp_enqueue_script(
'cartao-simples-widget',
'https://cdn.cartaosimples.com/widget-bootstrap.v1.min.js',
[],
'1.0.0',
true
);
}
add_action('wp_enqueue_scripts', 'add_cartao_simples_widget');import { PaymentWidget } from "cartao-simples-widget";
import { useState } from "react";
export default function CheckoutPage() {
const [isOpen, setIsOpen] = useState(false);
return (
<div>
<button onClick={() => setIsOpen(true)}>
Finalizar com Cartão Simples
</button>
<PaymentWidget
config={{
orderId: process.env.NEXT_PUBLIC_MERCHANT_ID!,
primaryColor: "#FF6600",
onSuccess: (data) => {
// Processar pagamento
router.push(`/success?token=${data.token}`);
},
onClose: () => setIsOpen(false),
}}
initialState={{ isOpen }}
/>
</div>
);
}Para informações detalhadas sobre deploy, configuração e troubleshooting, consulte a documentação completa na pasta docs/:
- š Ćndice de Documentação - Navegação por todas as documentaƧƵes
- š Quick Start - Comece em 5 minutos
- š¦ Guia de Deploy CDN - Deploy completo no CloudFront
- āļø Configuração CloudFront - NOVO! Setup automĆ”tico e manual
- šØ Guia de Uso do Widget - APIs e exemplos de integração
- š§ Solução CORS - Configuração CORS e troubleshooting
- š» Comandos Ćteis - ReferĆŖncia rĆ”pida de comandos
- š Resumo Visual - Status e mĆ©tricas do projeto
- š Servidor Local - Como testar localmente
# 1. Configure o CloudFront (apenas primeira vez)
./setup-cloudfront.sh production
# 2. FaƧa o deploy
./deploy.sh production# Deploy direto no S3 (sem CloudFront)
./deploy.sh stagingO script setup-cloudfront.sh automaticamente:
- ā Cria Origin Access Identity (OAI)
- ā Cria distribuição CloudFront
- ā Configura bucket S3
- ā Gera relatório com URLs e próximos passos
ā Widget nĆ£o aparece
- Verificar se o
orderIdestĆ” correto - Conferir console por erros de CORS
- Verificar se o script carregou (
window.PaymentWidgetexiste)
ā Erro "ERR_NAME_NOT_RESOLVED"
- CDN URL incorreta - deve ser
https://d2x7cg3k3on9lk.cloudfront.net - Verificar configuração em
src/bootstrap/index.ts
ā Erro CORS
- Bucket S3 precisa ter CORS configurado
- Executar
./deploy.shpara aplicar automaticamente - Ver documentação CORS
ā Cache desatualizado
- Invalidar cache do CloudFront:
aws cloudfront create-invalidation --distribution-id EOLJNTE5PW5O9 --paths "/*" - Aguardar 1-2 minutos para propagação
Para mais soluƧƵes, consulte o Guia de Deploy CDN completo.
- Fork o repositório
- Crie uma branch:
git checkout -b feature/nova-funcionalidade - Commit:
git commit -m 'Adiciona nova funcionalidade' - Push:
git push origin feature/nova-funcionalidade - Abra um Pull Request
MIT License - veja LICENSE para detalhes.
š” DĆŗvidas? Entre em contato: dev@cartaosimples.com
š Documentação completa: https://docs.cartaosimples.com/widget