Ponte centralizada para integração com Meta SDK (Facebook, Instagram, WhatsApp). Resolve o problema de multi-tenant com subdomínios dinâmicos.
O Meta SDK exige que todos os domínios estejam cadastrados no Meta App Dashboard. Em aplicações multi-tenant com subdomínios dinâmicos (tenant1.app.com, tenant2.app.com), seria inviável cadastrar cada tenant.
Solução: Concentrar toda interação com o Meta SDK em um único domínio fixo (ex: sdk.beecrm.io). Cadastre apenas este domínio no Meta App.
Callback do OAuth server-side para Instagram/Facebook Messenger.
Query params:
code - Authorization code da Metastate - Token CSRF (opcional, validado no backend)error - Erro retornado pela Meta (se houver)Envia postMessage de volta ao opener com o code.
Bridge page para WhatsApp Business Embedded Signup.
Query params:
app_id - Meta App IDconfig_id - Meta Config ID (Embedded Signup)solution_id - Meta Solution ID (opcional)origin - URL do tenant que abriu o popupCarrega o Meta SDK, executa FB.login() e retorna os dados via postMessage.
sdk.beecrm.io (ou seu domínio)https://sdk.beecrm.io/oauth-callback.htmlhttps://sdk.beecrm.io// Usuário clica em "Conectar Instagram"
const params = new URLSearchParams({
app_id: '209689888852594',
redirect_uri: 'https://sdk.beecrm.io/oauth-callback.html',
state: yourCsrfToken,
scope: 'instagram_basic,instagram_manage_messages,...',
response_type: 'code'
});
const oauthUrl = `https://www.facebook.com/v21.0/dialog/oauth?${params}`;
const popup = window.open(oauthUrl, 'meta_oauth', 'width=600,height=700');
// Listener para receber o code
window.addEventListener('message', (event) => {
if (event.origin !== 'https://sdk.beecrm.io') return;
const data = event.data;
if (data.type === 'META_OAUTH_CALLBACK') {
if (data.success) {
// Usar data.code no backend para trocar por token
fetch('/api/channels/meta/pages', {
method: 'POST',
body: JSON.stringify({ code: data.code })
});
}
}
});
// Usuário clica em "Conectar WhatsApp"
const params = new URLSearchParams({
app_id: '1575450246598258',
config_id: '1231396158942382',
solution_id: '1456953348817413', // opcional
origin: window.location.origin
});
const url = `https://sdk.beecrm.io/embedded-signup.html?${params}`;
const popup = window.open(url, 'meta_embedded', 'width=700,height=750');
// Listener para receber os dados
window.addEventListener('message', (event) => {
if (event.origin !== 'https://sdk.beecrm.io') return;
const data = event.data;
if (data.type === 'META_EMBEDDED_SIGNUP_RESULT') {
if (data.success) {
// Enviar para backend finalizar
fetch('/api/channels/embedded-signup/complete', {
method: 'POST',
body: JSON.stringify({
code: data.code,
phone_number_id: data.phoneNumberId,
waba_id: data.wabaId,
business_id: data.businessId
})
});
}
}
});
Este projeto é 100% estático e pode ser hospedado em:
vercel --prodmeta-sdk-bridge/
├── index.html # Esta página (documentação)
├── oauth-callback.html # OAuth callback
├── embedded-signup.html # WhatsApp Embedded Signup
├── assets/
│ ├── css/
│ │ └── style.css # Estilos compartilhados
│ └── js/
│ ├── oauth.js # Lógica OAuth
│ └── embedded-signup.js # Lógica Embedded Signup
└── README.md
postMessage no tenant (event.origin)Made with ❤️ for multi-tenant apps