Files
whatsapp/encontrar_phone_id.php
T
2026-01-12 11:06:43 -05:00

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>