Встроенная регистрация - ошибка замена «кода» на токен (Meta, Tech Provider)Javascript

Форум по Javascript
Ответить Пред. темаСлед. тема
Anonymous
 Встроенная регистрация - ошибка замена «кода» на токен (Meta, Tech Provider)

Сообщение Anonymous »

Я изо всех сил пытался заставить это работать в течение нескольких месяцев, и я действительно не знаю, куда идти. Документация не помогла мне с ошибками. Понимая процессы, я зарегистрировался, чтобы стать техническим провайдером и выполнил все шаги. Я не мог получить доступ к своей учетной записи песочницы, поэтому я создал новую учетную запись и проверяю встроенную регистрацию. Для моей компании все работает отлично, но я не могу правильно зарегистрировать другие компании. Но мой код не завершил шаг обмена «кодом» на токен. В моем менеджере я вижу, что эта тестовая учетная запись была зарегистрирована, но я не могу отправлять сообщения через нее, и я не могу зарегистрировать ее в своем веб -хуку. Есть ли способ генерировать этот токен вручную? Где мне получить информацию, которая мне нужна для выполнения этих шагов? Как Business_customer_phone_number_id, app_id, app_secret ...
Следуйте этой документации:
https://developers.facebook.com/docs/wh ... h-provider
https://developers.facebook.com/docs/wh ... ementation> Я выполнил все шаги, изложенные в этих двух документах. (index.html) < /p>



xxxx- Cadastro


[*]





// DEFINICAO DE VARIAVEIS
// ------------ Minhas informacoes ------------
let APP_ID = "123"; // seu APP ID
let ID_CONFIG = "xxxx"; // seu ID de configuração
let GRAPH_API_VERSION = "v22.0"; // versao da API
// ------------ Variaveis do cliente ao concluir o fluxo ------------
let CUSTOMER_BUSINESS_PHONE_NUMBER_ID = ""; // ID do número de telefone comercial do cliente
let CUSTOMER_WABA_ID = ""; // ID da conta comercial do WhatsApp do cliente
let CUSTOMER_BUSINESS_PORTFOLIO_ID = ""; // ID do portfólio de negócios do cliente
let FLOW_FINISH_TYPE = ""; // Indica que o cliente concluiu o fluxo com sucesso
// FINISH concluiu fluxo padrao
// FINISH_ONLY_WABA concluiu fluxo sem um número de telefone
// FINISH_WHATSAPP_BUSINESS_APP_ONBOARDING concluiu fluxo com um número do WhatsApp Business
// ------------ Variaveis do cliente ao abandonar o fluxo ------------
let CURRENT_STEP = ""; // tela q o cliente estava visualizando antes de abandonar o fluxo
// ------------ Variaveis do cliente ao entrar no fluxo e receber um erro ------------
let ERROR_MESSAGE = ""; // descrição do erro
let ERROR_ID = ""; // ID do erro
let SESSION_ID = ""; // ID de sessão (inclua este ID se entrar em contato com o suporte)
let TIMESTAMP = ""; // data e hora - indica quando o cliente utilizou o Embedded Signup
// ------------ Variaveis da ETAPA 1 trocar o CODE pelo TOKEN ------------
let CODE = ""; // código retornado pelo Cadastro incorporado ao concluir o fluxo
let APP_SECRET = ""; // chave secreta do app: Painel de Apps > Chave secreta do app > Básico
let BUSINESS_TOKEN = ""; // retorno da ETAPA 1: token da empresa do cliente
// ------------ Variaveis da ETAPA 2 assinar WEBHOOK ------------

// ------------ Variaveis da ETAPA 3 cadastrar telefone do cliente ------------
let DESIRED_PIN = ""; // definir valor como um número de 6 dígitos (PIN de confirmação)
// ------------ Variaveis da ETAPA 4 enviar mensagem de teste ------------
let WHATSAPP_USER_NUMBER = "xxxx"; // seu num de tel pra enviar/receber msg (nn pode ser de uma API nuvem)
let BODY_TEXT = "Olá! Esta é uma mensagem de teste da NAME OF THE MY BUSINESS via API WhatsApp Business"; // texto do corpo da mensagem
let WHATSAPP_USER_ID = ""; // seu número de identificação do usuário do WhatsApp
let WHATSAPP_MESSAGE_ID = ""; // ID da mensagem do WhatsApp
let CAMPO_json = "";

function insereTentativaCadJS(dados) {
fetch('enviar_bd.php', {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify(dados)
})
.then(res => res.json())
.then(response => {
console.log("Servidor respondeu:", response.mensagem);
})
.catch(err => {
console.error("Erro ao enviar dados:", err);
});
}

//
// Janela de inicialização do SDK
window.fbAsyncInit = function(){
FB.init({
appId : APP_ID, // o ID do seu aplicativo vai aqui
autoLogAppEvents : true,
xfbml : true,
version : GRAPH_API_VERSION // A versão da Graph API vai aqui
});
};
//
// Janela do ouvinte de eventos de mensagem de registro de sessão
window.addEventListener('message', (event) => {
if (!event.origin.endsWith('facebook.com')/* && (event.origin !== "https://web.facebook.com")*/){
return;
}
try{
const data = JSON.parse(event.data);
if (data.type === 'WA_EMBEDDED_SIGNUP'){

// Verifica a string JSON gerada
const jsonData = JSON.stringify(data);

// --------------------------------------- SE O CLIENTE CONCLUIU O FLUXO COM SUCESSO
if (data.event === 'FINISH' || data.event === 'FINISH_ONLY_WABA' || data.event === 'FINISH_WHATSAPP_BUSINESS_APP_ONBOARDING'){
FLOW_FINISH_TYPE = data.event;
CUSTOMER_BUSINESS_PHONE_NUMBER_ID = data.data.phone_number_id;
CUSTOMER_WABA_ID = data.data.waba_id;
CUSTOMER_BUSINESS_PORTFOLIO_ID = data.data.business_id;
CODE = data.data.code;

CAMPO_json = JSON.stringify(data, null, 2);
const dados1 = {APP_ID,ID_CONFIG,GRAPH_API_VERSION,CUSTOMER_BUSINESS_PHONE_NUMBER_ID,CUSTOMER_WABA_ID,CUSTOMER_BUSINESS_PORTFOLIO_ID,FLOW_FINISH_TYPE,CURRENT_STEP,ERROR_MESSAGE,ERROR_ID,SESSION_ID,TIMESTAMP,CODE,APP_SECRET,BUSINESS_TOKEN,DESIRED_PIN,WHATSAPP_USER_NUMBER,BODY_TEXT,WHATSAPP_USER_ID,WHATSAPP_MESSAGE_ID,CAMPO_json};

insereTentativaCadJS(dados1);
// --------------------------------------- SE O CLIENTE ABANDONOU O FLUXO
}else if (data.event === 'CANCEL'){
CURRENT_STEP = data.data.current_step;

CAMPO_json = JSON.stringify(data, null, 2);
const dados2 = {APP_ID,ID_CONFIG,GRAPH_API_VERSION,CUSTOMER_BUSINESS_PHONE_NUMBER_ID,CUSTOMER_WABA_ID,CUSTOMER_BUSINESS_PORTFOLIO_ID,FLOW_FINISH_TYPE,CURRENT_STEP,ERROR_MESSAGE,ERROR_ID,SESSION_ID,TIMESTAMP,CODE,APP_SECRET,BUSINESS_TOKEN,DESIRED_PIN,WHATSAPP_USER_NUMBER,BODY_TEXT,WHATSAPP_USER_ID,WHATSAPP_MESSAGE_ID,CAMPO_json};

insereTentativaCadJS(dados2);
// --------------------------------------- SE O CLIENTE RECEBEU MSG DE ERRO
}else if (data.event === 'ERROR'){
ERROR_MESSAGE = data.data.error_message;
ERROR_ID = data.data.error_id;
SESSION_ID = data.data.session_id;
TIMESTAMP = data.data.timestamp;

document.getElementById("parte-fluxo").textContent = JSON.stringify(data, null, 2);

CAMPO_json = JSON.stringify(data, null, 2);
const dados3 = {APP_ID,ID_CONFIG,GRAPH_API_VERSION,CUSTOMER_BUSINESS_PHONE_NUMBER_ID,CUSTOMER_WABA_ID,CUSTOMER_BUSINESS_PORTFOLIO_ID,FLOW_FINISH_TYPE,CURRENT_STEP,ERROR_MESSAGE,ERROR_ID,SESSION_ID,TIMESTAMP,CODE,APP_SECRET,BUSINESS_TOKEN,DESIRED_PIN,WHATSAPP_USER_NUMBER,BODY_TEXT,WHATSAPP_USER_ID,WHATSAPP_MESSAGE_ID,CAMPO_json};

insereTentativaCadJS(dados3);
}
}
// Exibir os dados recebidos no HTML
document.getElementById("parte-fluxo").textContent = JSON.stringify(data, null, 2);
}catch{
console.log('message event: ', event.data);
}
});

//
// Retorno de chamada de resposta
// Sempre que um cliente empresarial concluir com sucesso o fluxo de inscrição incorporada, enviaremos um código de token trocável CODE
// Adicione seu próprio código personalizado à instrução if-else que envia esse código ao seu servidor para que você possa trocá-lo posteriormente pelo token comercial do cliente ao integrá-lo
const fbLoginCallback = (response) => {
if (response.authResponse){
CODE = response.authResponse.code;

// Exibir os dados recebidos no HTML
document.getElementById("retorno-chamada").textContent = JSON.stringify(CODE, null, 2);
document.getElementById("retorno-chamada").textContent = JSON.stringify(response, null, 2);

// Exibir variáveis iniciais na tela
const statusDiv = document.getElementById("status-output");
statusDiv.innerHTML = `
📥 Code recebido: ${CODE}
`;

document.getElementById("parte-fluxo").textContent = JSON.stringify(data, null, 2);

CAMPO_json = JSON.stringify(response, null, 2);
const dados4 = {APP_ID,ID_CONFIG,GRAPH_API_VERSION,CUSTOMER_BUSINESS_PHONE_NUMBER_ID,CUSTOMER_WABA_ID,CUSTOMER_BUSINESS_PORTFOLIO_ID,FLOW_FINISH_TYPE,CURRENT_STEP,ERROR_MESSAGE,ERROR_ID,SESSION_ID,TIMESTAMP,CODE,APP_SECRET,BUSINESS_TOKEN,DESIRED_PIN,WHATSAPP_USER_NUMBER,BODY_TEXT,WHATSAPP_USER_ID,WHATSAPP_MESSAGE_ID,CAMPO_json};

insereTentativaCadJS(dados4);
// --------------------------------------------------------------- ETAPA 1 – TROCA CODE PELO TOKEN
fetch('https://NAME OF THE MY BUSINESS.com.br/crm/whatsapp/embedded_signup/trocar_token.php', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ code: CODE }) // code do EmbeddedSignup, não do fbLoginCallback
})
.then(res => res.json())
.then(tokenData => {
BUSINESS_TOKEN = tokenData.access_token;

CAMPO_json = JSON.stringify(res, null, 2);
const dados5 = {APP_ID,ID_CONFIG,GRAPH_API_VERSION,CUSTOMER_BUSINESS_PHONE_NUMBER_ID,CUSTOMER_WABA_ID,CUSTOMER_BUSINESS_PORTFOLIO_ID,FLOW_FINISH_TYPE,CURRENT_STEP,ERROR_MESSAGE,ERROR_ID,SESSION_ID,TIMESTAMP,CODE,APP_SECRET,BUSINESS_TOKEN,DESIRED_PIN,WHATSAPP_USER_NUMBER,BODY_TEXT,WHATSAPP_USER_ID,WHATSAPP_MESSAGE_ID,CAMPO_json};

insereTentativaCadJS(dados5);
// -------------------------------------------------------------------- ETAPA 2 – ASSINA WEBHOOK
return fetch('https://NAME OF THE MY BUSINESS.com.br/crm/whatsapp/embedded_signup/assinar_webhook.php', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
waba_id: CUSTOMER_WABA_ID,
business_token: BUSINESS_TOKEN
})
}).then(res => res.json())
.then(webhookData => {
DESIRED_PIN = "123456";

document.getElementById("etapa2").textContent = JSON.stringify(webhookData, null, 2);
statusDiv.innerHTML += `
✅ Webhook assinado com sucesso!
`;
statusDiv.innerHTML += `
🔁 Registrando número com PIN ${DESIRED_PIN}...
`;

CAMPO_json = JSON.stringify(webhookData, null, 2);
const dados6 = {APP_ID,ID_CONFIG,GRAPH_API_VERSION,CUSTOMER_BUSINESS_PHONE_NUMBER_ID,CUSTOMER_WABA_ID,CUSTOMER_BUSINESS_PORTFOLIO_ID,FLOW_FINISH_TYPE,CURRENT_STEP,ERROR_MESSAGE,ERROR_ID,SESSION_ID,TIMESTAMP,CODE,APP_SECRET,BUSINESS_TOKEN,DESIRED_PIN,WHATSAPP_USER_NUMBER,BODY_TEXT,WHATSAPP_USER_ID,WHATSAPP_MESSAGE_ID,CAMPO_json};

insereTentativaCadJS(dados6);
// ---------------------------------------------------------- ETAPA 3 – REGISTRA NUM CLIENTE
return fetch('https://NAME OF THE MY BUSINESS.com.br/crm/whatsapp/embedded_signup/registrar_numero.php', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
phone_number_id: CUSTOMER_BUSINESS_PHONE_NUMBER_ID,
business_token: BUSINESS_TOKEN,
pin: DESIRED_PIN // ⚠️ PIN fixo, mude se quiser que o cliente defina
})
});
}).then(res => res.json())
.then(registroData => {
document.getElementById("etapa3").textContent = JSON.stringify(registroData, null, 2);
CAMPO_json = JSON.stringify(registroData, null, 2);
const dados7 = {APP_ID,ID_CONFIG,GRAPH_API_VERSION,CUSTOMER_BUSINESS_PHONE_NUMBER_ID,CUSTOMER_WABA_ID,CUSTOMER_BUSINESS_PORTFOLIO_ID,FLOW_FINISH_TYPE,CURRENT_STEP,ERROR_MESSAGE,ERROR_ID,SESSION_ID,TIMESTAMP,CODE,APP_SECRET,BUSINESS_TOKEN,DESIRED_PIN,WHATSAPP_USER_NUMBER,BODY_TEXT,WHATSAPP_USER_ID,WHATSAPP_MESSAGE_ID,CAMPO_json};

insereTentativaCadJS(dados7);
// ------------------------------------------------------ ETAPA 4 – ENVIAR MENSAGEM DE TESTE
return fetch(`https://graph.facebook.com/v21.0/${CUST ... }/messages`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${BUSINESS_TOKEN}`
},
body: JSON.stringify({
messaging_product: "whatsapp",
recipient_type: "individual",
to: WHATSAPP_USER_NUMBER,
type: "text",
text: {
body: BODY_TEXT,
}
})
}).then(response => response.json())
.then(responseJson => {

CAMPO_json = JSON.stringify(responseJson, null, 2);
const dados8 = {APP_ID,ID_CONFIG,GRAPH_API_VERSION,CUSTOMER_BUSINESS_PHONE_NUMBER_ID,CUSTOMER_WABA_ID,CUSTOMER_BUSINESS_PORTFOLIO_ID,FLOW_FINISH_TYPE,CURRENT_STEP,ERROR_MESSAGE,ERROR_ID,SESSION_ID,TIMESTAMP,CODE,APP_SECRET,BUSINESS_TOKEN,DESIRED_PIN,WHATSAPP_USER_NUMBER,BODY_TEXT,WHATSAPP_USER_ID,WHATSAPP_MESSAGE_ID,CAMPO_json};

insereTentativaCadJS(dados8);
}).catch(error => {
CAMPO_json = JSON.stringify(error, null, 2);

const dadosErro = {
APP_ID, ID_CONFIG, GRAPH_API_VERSION,
CUSTOMER_BUSINESS_PHONE_NUMBER_ID, CUSTOMER_WABA_ID,
CUSTOMER_BUSINESS_PORTFOLIO_ID, FLOW_FINISH_TYPE,
CURRENT_STEP, ERROR_MESSAGE, ERROR_ID, SESSION_ID,
TIMESTAMP, CODE, APP_SECRET, BUSINESS_TOKEN,
DESIRED_PIN, WHATSAPP_USER_NUMBER, BODY_TEXT,
WHATSAPP_USER_ID, WHATSAPP_MESSAGE_ID, CAMPO_json
};

insereTentativaCadJS(dadosErro);
});
})

})
.then(res => res.json())
.then(messageResponse => {
// Salvando os dados da resposta
if (messageResponse.contacts && messageResponse.contacts.length > 0) {
WHATSAPP_USER_ID = messageResponse.contacts[0].wa_id;
}

if (messageResponse.messages && messageResponse.messages.length > 0) {
WHATSAPP_MESSAGE_ID = messageResponse.messages[0].id;
}

const dados9 = {APP_ID,ID_CONFIG,GRAPH_API_VERSION,CUSTOMER_BUSINESS_PHONE_NUMBER_ID,CUSTOMER_WABA_ID,CUSTOMER_BUSINESS_PORTFOLIO_ID,FLOW_FINISH_TYPE,CURRENT_STEP,ERROR_MESSAGE,ERROR_ID,SESSION_ID,TIMESTAMP,CODE,APP_SECRET,BUSINESS_TOKEN,DESIRED_PIN,WHATSAPP_USER_NUMBER,BODY_TEXT,WHATSAPP_USER_ID,WHATSAPP_MESSAGE_ID};

insereTentativaCadJS(dados9);
alert("Mensagem de teste enviada com sucesso!");
})
.catch(err => {
console.error("Erro no processo de integração:", err);
alert("Erro no cadastro. Veja o console para mais detalhes.");
statusDiv.innerHTML += `
❌ Erro no processo de integração. Veja o console para detalhes.
`;
});
}else{
console.log('else response.authResponse: ', response); // remover após o teste
// seu código vai aqui
}
}

//
// Método de inicialização e registro de retorno de chamada
const launchWhatsAppSignup = () => {
FB.login(fbLoginCallback,{
config_id : ID_CONFIG, // seu ID de configuração vai aqui peguei de https://developers.facebook.com/apps/11 ... 1548077814 // painel de apps > Inicio Rapido > Integração > Auxiliar de configuração do Cadastro incorporado > Configuracao do App
response_type : 'code', // must be set to 'code' for System User access token
override_default_response_type : true,
extras : {
setup : {},
featureType : '', // Deixe em branco se você estiver integrando o cliente empresarial usando o fluxo padrão
sessionInfoVersion : '3'
}
});
}



NAME OF THE MY BUSINESS




Tela de Cadastro



Importante: Habilitar Pop-ups
Para fazer login com o Facebook, você precisa permitir pop-ups neste site:
  • Se você vir um ícone de pop-up bloqueado na barra de endereço, clique nele
  • Selecione "Sempre permitir pop-ups de [este site]"
  • Clique em "Concluído" ou "Pronto"
  • Tente fazer login novamente
Nota: A localização exata dessas opções pode variar dependendo do seu navegador.



Como fazer login:
  • Clique no botão "Continuar com Facebook" abaixo
  • Você será redirecionado para a página de login do Facebook
  • Faça login com suas credenciais do Facebook
  • Autorize o acesso à sua conta



Login with Facebook
Session info response:


SDK response:



Status da Integração:

INFORMACOES:









< /code>
Я знаю, что код длинный, но это в основном документация с добавленной «отпечатками». И некоторые «привлечь», чтобы сделать запросы.

Подробнее здесь: https://stackoverflow.com/questions/796 ... h-provider
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Javascript»