432 lines
17 KiB
PHP
432 lines
17 KiB
PHP
<?php
|
|
/**
|
|
* Herramienta para encontrar el Phone Number ID correcto
|
|
* Fecha: 5 de enero de 2026
|
|
*/
|
|
|
|
require_once 'config/config.php';
|
|
|
|
if (!isUserLoggedIn()) {
|
|
header('Location: login.php');
|
|
exit;
|
|
}
|
|
|
|
$result = null;
|
|
$error = null;
|
|
|
|
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
|
$action = $_POST['action'] ?? '';
|
|
|
|
if ($action === 'find_numbers') {
|
|
$token = $_POST['token'] ?? getConfigFromDB('whatsapp_token', WHATSAPP_TOKEN);
|
|
|
|
if (empty($token) || $token === 'TU_TOKEN_DE_WHATSAPP_AQUI') {
|
|
$error = 'Token de WhatsApp requerido';
|
|
} else {
|
|
$result = findAvailablePhoneNumbers($token);
|
|
}
|
|
} elseif ($action === 'update_config') {
|
|
$newPhoneId = $_POST['phone_id'] ?? '';
|
|
|
|
if (empty($newPhoneId)) {
|
|
$error = 'Phone Number ID requerido';
|
|
} else {
|
|
try {
|
|
$db = Database::getInstance();
|
|
|
|
// Actualizar en base de datos
|
|
$existing = $db->fetch("SELECT id FROM system_config WHERE config_key = 'whatsapp_phone_number_id'");
|
|
|
|
if ($existing) {
|
|
$db->query(
|
|
"UPDATE system_config SET config_value = ?, updated_at = NOW() WHERE config_key = 'whatsapp_phone_number_id'",
|
|
[$newPhoneId]
|
|
);
|
|
} else {
|
|
$db->query(
|
|
"INSERT INTO system_config (config_key, config_value, created_at, updated_at) VALUES ('whatsapp_phone_number_id', ?, NOW(), NOW())",
|
|
[$newPhoneId]
|
|
);
|
|
}
|
|
|
|
$result = ['success' => true, 'message' => 'Phone Number ID actualizado correctamente'];
|
|
|
|
// Probar nueva configuración
|
|
$testResult = testNewConfig($newPhoneId);
|
|
$result['test'] = $testResult;
|
|
|
|
} catch (Exception $e) {
|
|
$error = 'Error actualizando configuración: ' . $e->getMessage();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
function findAvailablePhoneNumbers($token) {
|
|
try {
|
|
// Método 1: Buscar a través de Business Account
|
|
$ch = curl_init();
|
|
$url = 'https://graph.facebook.com/v18.0/me/businesses';
|
|
|
|
curl_setopt_array($ch, [
|
|
CURLOPT_URL => $url,
|
|
CURLOPT_RETURNTRANSFER => true,
|
|
CURLOPT_HTTPHEADER => [
|
|
'Authorization: Bearer ' . $token,
|
|
'Content-Type: application/json'
|
|
],
|
|
CURLOPT_TIMEOUT => 15,
|
|
CURLOPT_SSL_VERIFYPEER => true
|
|
]);
|
|
|
|
$response = curl_exec($ch);
|
|
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
|
$curlError = curl_error($ch);
|
|
curl_close($ch);
|
|
|
|
if ($curlError) {
|
|
return ['success' => false, 'error' => 'Error cURL: ' . $curlError];
|
|
}
|
|
|
|
$decoded = json_decode($response, true);
|
|
|
|
if ($httpCode !== 200) {
|
|
// Método 2: Intentar obtener info de la app directamente
|
|
return findPhoneNumbersFromApp($token);
|
|
}
|
|
|
|
$phoneNumbers = [];
|
|
|
|
if (isset($decoded['data']) && is_array($decoded['data'])) {
|
|
foreach ($decoded['data'] as $business) {
|
|
$businessId = $business['id'];
|
|
$phoneNumbersData = getPhoneNumbersFromBusiness($token, $businessId);
|
|
|
|
if ($phoneNumbersData['success']) {
|
|
$phoneNumbers = array_merge($phoneNumbers, $phoneNumbersData['numbers']);
|
|
}
|
|
}
|
|
}
|
|
|
|
return [
|
|
'success' => true,
|
|
'numbers' => $phoneNumbers,
|
|
'method' => 'business_account'
|
|
];
|
|
|
|
} catch (Exception $e) {
|
|
return ['success' => false, 'error' => $e->getMessage()];
|
|
}
|
|
}
|
|
|
|
function findPhoneNumbersFromApp($token) {
|
|
try {
|
|
// Intentar con diferentes endpoints
|
|
$endpoints = [
|
|
'https://graph.facebook.com/v18.0/me',
|
|
'https://graph.facebook.com/v18.0/me/accounts',
|
|
'https://graph.facebook.com/v18.0/me/applications'
|
|
];
|
|
|
|
foreach ($endpoints as $endpoint) {
|
|
$ch = curl_init();
|
|
|
|
curl_setopt_array($ch, [
|
|
CURLOPT_URL => $endpoint,
|
|
CURLOPT_RETURNTRANSFER => true,
|
|
CURLOPT_HTTPHEADER => [
|
|
'Authorization: Bearer ' . $token,
|
|
'Content-Type: application/json'
|
|
],
|
|
CURLOPT_TIMEOUT => 10,
|
|
CURLOPT_SSL_VERIFYPEER => true
|
|
]);
|
|
|
|
$response = curl_exec($ch);
|
|
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
|
curl_close($ch);
|
|
|
|
if ($httpCode === 200) {
|
|
$decoded = json_decode($response, true);
|
|
// Aquí podrías analizar la respuesta para encontrar números
|
|
}
|
|
}
|
|
|
|
return [
|
|
'success' => false,
|
|
'error' => 'No se pudieron encontrar números automáticamente. Debe obtenerlos manualmente de Facebook for Developers.',
|
|
'manual_steps' => [
|
|
'1. Ve a https://developers.facebook.com/apps',
|
|
'2. Selecciona tu aplicación WhatsApp Business',
|
|
'3. Ve a Productos > WhatsApp > Configuración',
|
|
'4. En la sección "Números de teléfono", copia el Phone Number ID',
|
|
'5. Pega el ID en el formulario de abajo'
|
|
]
|
|
];
|
|
|
|
} catch (Exception $e) {
|
|
return ['success' => false, 'error' => $e->getMessage()];
|
|
}
|
|
}
|
|
|
|
function getPhoneNumbersFromBusiness($token, $businessId) {
|
|
try {
|
|
$ch = curl_init();
|
|
$url = "https://graph.facebook.com/v18.0/{$businessId}/phone_numbers";
|
|
|
|
curl_setopt_array($ch, [
|
|
CURLOPT_URL => $url,
|
|
CURLOPT_RETURNTRANSFER => true,
|
|
CURLOPT_HTTPHEADER => [
|
|
'Authorization: Bearer ' . $token,
|
|
'Content-Type: application/json'
|
|
],
|
|
CURLOPT_TIMEOUT => 10,
|
|
CURLOPT_SSL_VERIFYPEER => true
|
|
]);
|
|
|
|
$response = curl_exec($ch);
|
|
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
|
curl_close($ch);
|
|
|
|
if ($httpCode === 200) {
|
|
$decoded = json_decode($response, true);
|
|
|
|
if (isset($decoded['data'])) {
|
|
return [
|
|
'success' => true,
|
|
'numbers' => $decoded['data']
|
|
];
|
|
}
|
|
}
|
|
|
|
return ['success' => false, 'numbers' => []];
|
|
|
|
} catch (Exception $e) {
|
|
return ['success' => false, 'numbers' => []];
|
|
}
|
|
}
|
|
|
|
function testNewConfig($phoneId) {
|
|
try {
|
|
$token = getConfigFromDB('whatsapp_token', WHATSAPP_TOKEN);
|
|
|
|
$ch = curl_init();
|
|
$url = WHATSAPP_API_URL . $phoneId;
|
|
|
|
curl_setopt_array($ch, [
|
|
CURLOPT_URL => $url,
|
|
CURLOPT_RETURNTRANSFER => true,
|
|
CURLOPT_HTTPHEADER => [
|
|
'Authorization: Bearer ' . $token,
|
|
'Content-Type: application/json'
|
|
],
|
|
CURLOPT_TIMEOUT => 10,
|
|
CURLOPT_SSL_VERIFYPEER => true
|
|
]);
|
|
|
|
$response = curl_exec($ch);
|
|
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
|
$curlError = curl_error($ch);
|
|
curl_close($ch);
|
|
|
|
if ($curlError) {
|
|
return ['success' => false, 'message' => 'Error: ' . $curlError];
|
|
}
|
|
|
|
$decoded = json_decode($response, true);
|
|
|
|
if ($httpCode === 200) {
|
|
$displayName = $decoded['display_phone_number'] ?? 'N/A';
|
|
return ['success' => true, 'message' => "✅ Configuración válida. Número: $displayName"];
|
|
} else {
|
|
$errorMsg = $decoded['error']['message'] ?? 'Error desconocido';
|
|
return ['success' => false, 'message' => "❌ Error: $errorMsg"];
|
|
}
|
|
|
|
} catch (Exception $e) {
|
|
return ['success' => false, 'message' => 'Error: ' . $e->getMessage()];
|
|
}
|
|
}
|
|
?>
|
|
<!DOCTYPE html>
|
|
<html lang="es">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<title>Buscar Phone Number ID Correcto</title>
|
|
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
|
|
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css" rel="stylesheet">
|
|
<style>
|
|
.whatsapp-green { background: linear-gradient(135deg, #25D366, #128C7E); }
|
|
.phone-card { border: 2px solid #ddd; transition: all 0.3s; }
|
|
.phone-card:hover { border-color: #25D366; box-shadow: 0 4px 15px rgba(37,211,102,0.2); }
|
|
.phone-card.selected { border-color: #25D366; background: #f0fff4; }
|
|
</style>
|
|
</head>
|
|
<body class="bg-light">
|
|
<div class="container my-4">
|
|
|
|
<!-- Header -->
|
|
<div class="card whatsapp-green text-white mb-4">
|
|
<div class="card-body text-center">
|
|
<h1><i class="fab fa-whatsapp me-2"></i>Buscar Phone Number ID Correcto</h1>
|
|
<p class="mb-0">Encuentra y configura el Phone Number ID válido para tu cuenta</p>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Problema Detectado -->
|
|
<div class="alert alert-danger">
|
|
<h5><i class="fas fa-exclamation-triangle me-2"></i>Problema Detectado</h5>
|
|
<p class="mb-1"><strong>Phone Number ID Actual:</strong> <code>858157464051987</code></p>
|
|
<p class="mb-0"><strong>Error:</strong> Este ID no existe, no tienes permisos, o no soporta la operación solicitada.</p>
|
|
</div>
|
|
|
|
<?php if ($error): ?>
|
|
<div class="alert alert-danger">
|
|
<i class="fas fa-times-circle me-2"></i><?= htmlspecialchars($error) ?>
|
|
</div>
|
|
<?php endif; ?>
|
|
|
|
<?php if ($result && isset($result['success']) && $result['success']): ?>
|
|
<div class="alert alert-success">
|
|
<i class="fas fa-check-circle me-2"></i><?= htmlspecialchars($result['message'] ?? 'Operación exitosa') ?>
|
|
<?php if (isset($result['test'])): ?>
|
|
<br><strong>Prueba:</strong> <?= htmlspecialchars($result['test']['message']) ?>
|
|
<?php endif; ?>
|
|
</div>
|
|
<?php endif; ?>
|
|
|
|
<div class="row">
|
|
<!-- Paso 1: Buscar números automáticamente -->
|
|
<div class="col-md-6">
|
|
<div class="card mb-4">
|
|
<div class="card-header bg-primary text-white">
|
|
<h5><i class="fas fa-search me-2"></i>Paso 1: Buscar Automáticamente</h5>
|
|
</div>
|
|
<div class="card-body">
|
|
<p>Intentar encontrar números de WhatsApp asociados a tu token:</p>
|
|
|
|
<form method="POST">
|
|
<input type="hidden" name="action" value="find_numbers">
|
|
|
|
<div class="mb-3">
|
|
<label class="form-label">Token de WhatsApp</label>
|
|
<input type="text" class="form-control" name="token"
|
|
value="<?= substr(getConfigFromDB('whatsapp_token', WHATSAPP_TOKEN), 0, 30) ?>..." readonly>
|
|
</div>
|
|
|
|
<button type="submit" class="btn btn-primary">
|
|
<i class="fas fa-search me-2"></i>Buscar Números
|
|
</button>
|
|
</form>
|
|
|
|
<?php if ($result && isset($result['numbers'])): ?>
|
|
<hr>
|
|
<h6>Números Encontrados:</h6>
|
|
<?php if (empty($result['numbers'])): ?>
|
|
<div class="alert alert-warning">
|
|
<p>No se encontraron números automáticamente.</p>
|
|
<?php if (isset($result['manual_steps'])): ?>
|
|
<strong>Pasos manuales:</strong>
|
|
<ol>
|
|
<?php foreach ($result['manual_steps'] as $step): ?>
|
|
<li><?= htmlspecialchars($step) ?></li>
|
|
<?php endforeach; ?>
|
|
</ol>
|
|
<?php endif; ?>
|
|
</div>
|
|
<?php else: ?>
|
|
<?php foreach ($result['numbers'] as $number): ?>
|
|
<div class="phone-card card mb-2 p-3">
|
|
<div class="d-flex justify-content-between align-items-center">
|
|
<div>
|
|
<strong><?= htmlspecialchars($number['display_phone_number'] ?? $number['id']) ?></strong><br>
|
|
<small class="text-muted">ID: <?= htmlspecialchars($number['id']) ?></small>
|
|
</div>
|
|
<button class="btn btn-success btn-sm"
|
|
onclick="selectPhoneNumber('<?= htmlspecialchars($number['id']) ?>')">
|
|
<i class="fas fa-check me-1"></i>Usar Este
|
|
</button>
|
|
</div>
|
|
</div>
|
|
<?php endforeach; ?>
|
|
<?php endif; ?>
|
|
<?php endif; ?>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Paso 2: Configuración manual -->
|
|
<div class="col-md-6">
|
|
<div class="card mb-4">
|
|
<div class="card-header bg-success text-white">
|
|
<h5><i class="fas fa-edit me-2"></i>Paso 2: Configuración Manual</h5>
|
|
</div>
|
|
<div class="card-body">
|
|
<p>Si conoces el Phone Number ID correcto, ingrésalo aquí:</p>
|
|
|
|
<form method="POST">
|
|
<input type="hidden" name="action" value="update_config">
|
|
|
|
<div class="mb-3">
|
|
<label class="form-label">Nuevo Phone Number ID</label>
|
|
<input type="text" class="form-control" name="phone_id" id="phone_id"
|
|
placeholder="123456789012345" required>
|
|
<small class="text-muted">Debe ser numérico, 10-20 dígitos</small>
|
|
</div>
|
|
|
|
<button type="submit" class="btn btn-success">
|
|
<i class="fas fa-save me-2"></i>Actualizar y Probar
|
|
</button>
|
|
</form>
|
|
|
|
<hr>
|
|
|
|
<h6>¿Cómo obtener el Phone Number ID?</h6>
|
|
<ol class="small">
|
|
<li>Ve a <a href="https://developers.facebook.com/apps" target="_blank">Facebook for Developers</a></li>
|
|
<li>Selecciona tu aplicación WhatsApp Business</li>
|
|
<li>Ve a <strong>Productos → WhatsApp → Configuración</strong></li>
|
|
<li>En "Números de teléfono", encuentra tu número</li>
|
|
<li>Copia el <strong>Phone Number ID</strong></li>
|
|
<li>Pégalo en el campo de arriba</li>
|
|
</ol>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Enlaces útiles -->
|
|
<div class="text-center">
|
|
<a href="index.php" class="btn btn-outline-primary me-2">
|
|
<i class="fas fa-arrow-left me-2"></i>Volver al Panel
|
|
</a>
|
|
<a href="diagnostico_whatsapp_avanzado.php" class="btn btn-outline-info me-2">
|
|
<i class="fas fa-stethoscope me-2"></i>Diagnóstico Completo
|
|
</a>
|
|
<a href="solucionador_whatsapp.php" class="btn btn-outline-warning">
|
|
<i class="fas fa-tools me-2"></i>Herramientas de Solución
|
|
</a>
|
|
</div>
|
|
</div>
|
|
|
|
<script>
|
|
function selectPhoneNumber(phoneId) {
|
|
document.getElementById('phone_id').value = phoneId;
|
|
|
|
// Highlight selected
|
|
document.querySelectorAll('.phone-card').forEach(card => {
|
|
card.classList.remove('selected');
|
|
});
|
|
event.target.closest('.phone-card').classList.add('selected');
|
|
|
|
// Scroll to form
|
|
document.getElementById('phone_id').scrollIntoView({behavior: 'smooth'});
|
|
document.getElementById('phone_id').focus();
|
|
}
|
|
</script>
|
|
|
|
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
|
|
</body>
|
|
</html>
|