update wa official API

This commit is contained in:
WD - Dev
2025-10-07 21:01:15 +07:00
parent efca8f5f80
commit eb13c69431
55 changed files with 138040 additions and 1543 deletions
+153
View File
@@ -0,0 +1,153 @@
<?php
include __DIR__ . "/../config/connect.php";
// --- CONFIG LOGGING ---
$enableLogging = true;
$logFile = __DIR__ . '/webhook_log.jsonl';
function writeLog($data) {
global $enableLogging, $logFile;
if ($enableLogging) {
$logEntry = [
'timestamp' => date("Y-m-d H:i:s"),
'data' => $data
];
file_put_contents($logFile, json_encode($logEntry, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE) . PHP_EOL, FILE_APPEND);
}
}
// --- GET: Verifikasi Webhook ---
if ($_SERVER['REQUEST_METHOD'] === 'GET') {
$mode = $_GET['hub_mode'] ?? $_GET['hub.mode'] ?? null;
$token = $_GET['hub_verify_token'] ?? $_GET['hub.verify_token'] ?? null;
$challenge = $_GET['hub_challenge'] ?? $_GET['hub.challenge'] ?? null;
$phone_number_id = $_GET['phone_number_id'] ?? null;
$verify_token_db = null;
if ($phone_number_id) {
try {
$stmt = $pdo->prepare("SELECT verify_token FROM whatsapp_cloud_api WHERE number_id = :number_id");
$stmt->execute([':number_id' => $phone_number_id]);
$waAccount = $stmt->fetch(PDO::FETCH_ASSOC);
$verify_token_db = $waAccount['verify_token'] ?? null;
} catch (Exception $e) {
writeLog(["event"=>"DB_ERROR_VERIFY_TOKEN","number_id"=>$phone_number_id,"error"=>$e->getMessage()]);
}
}
if ($mode === 'subscribe' && $token && $token === ($verify_token_db ?? '')) {
writeLog(["event" => "WEBHOOK_VERIFIED", "number_id" => $phone_number_id]);
http_response_code(200);
echo $challenge;
} else {
writeLog(["event" => "WEBHOOK_VERIFICATION_FAILED", "number_id" => $phone_number_id, "token" => $token]);
http_response_code(403);
}
exit;
}
// --- POST: Terima pesan & status ---
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$input = file_get_contents('php://input');
$data = json_decode($input, true);
if (!$data || !isset($data['entry'])) {
writeLog(["event" => "INVALID_JSON_OR_ENTRY"]);
http_response_code(400);
exit;
}
foreach ($data['entry'] as $entry) {
foreach ($entry['changes'] ?? [] as $change) {
$value = $change['value'] ?? [];
// --- Pesan masuk ---
foreach ($value['messages'] ?? [] as $message) {
$from = $message['from'] ?? null;
$type = $message['type'] ?? null;
$phone_number_id = $value['metadata']['phone_number_id'] ?? null;
if (!$phone_number_id || !$from) continue;
try {
$stmt = $pdo->prepare("SELECT token_access FROM whatsapp_cloud_api WHERE number_id = :number_id");
$stmt->execute([':number_id' => $phone_number_id]);
$waAccount = $stmt->fetch(PDO::FETCH_ASSOC);
$access_token = $waAccount['token_access'] ?? null;
} catch (Exception $e) {
writeLog(["event"=>"DB_ERROR_ACCESS_TOKEN","number_id"=>$phone_number_id,"error"=>$e->getMessage()]);
continue;
}
if (!$access_token) continue;
$text = ($type === 'text') ? $message['text']['body'] ?? '' : '[Pesan non-teks: ' . $type . ']';
writeLog(["event" => "INCOMING_MESSAGE", "from" => $from, "type" => $type, "text" => $text]);
// --- Kirim balasan template ---
$reply = [
"messaging_product" => "whatsapp",
"to" => $from,
"type" => "template",
"template" => [
"name" => "customer_service_contact",
"language" => ["code" => "id"],
"components" => []
]
];
$url = "https://graph.facebook.com/v17.0/$phone_number_id/messages";
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"Authorization: Bearer $access_token",
"Content-Type: application/json"
]);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($reply));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
writeLog(["event"=>"REPLY_SENT","to"=>$from,"http_code"=>$http_code]);
}
// --- Status update ---
foreach ($value['statuses'] ?? [] as $statusEvent) {
$waMessageId = $statusEvent['id'] ?? null;
$status = $statusEvent['status'] ?? null;
// PHP 7.4 compatible
switch ($status) {
case 'sent': $finalStatus = 'PROSES'; break;
case 'delivered': $finalStatus = 'TERKIRIM'; break;
case 'read': $finalStatus = 'DIBACA'; break;
case 'failed': $finalStatus = 'GAGAL'; break;
default: $finalStatus = strtoupper($status); break;
}
if ($waMessageId) {
try {
$stmtMsg = $pdo->prepare("SELECT id, status FROM master_pesan WHERE wa_message_id = :wa_message_id");
$stmtMsg->execute([':wa_message_id' => $waMessageId]);
$pesanDB = $stmtMsg->fetch(PDO::FETCH_ASSOC);
} catch (Exception $e) {
continue;
}
if ($pesanDB) {
try {
$stmtUpdate = $pdo->prepare("UPDATE master_pesan SET status = :status WHERE id = :id");
$stmtUpdate->execute([':status' => $finalStatus, ':id' => $pesanDB['id']]);
writeLog(["event"=>"STATUS_UPDATED","wa_message_id"=>$waMessageId,"new_status"=>$finalStatus]);
} catch (Exception $e) {}
}
}
}
}
}
http_response_code(200);
echo "EVENT_RECEIVED";
exit;
}
http_response_code(404);
+34
View File
@@ -0,0 +1,34 @@
{"timestamp":"2025-10-04 20:53:17","data":{"event":"STATUS_UPDATED","wa_message_id":"wamid.HBgNNjI4MTI5ODY5ODQyMhUCABEYEkFERTI3OEY3M0E1NDdFNDYxQgA=","new_status":"PROSES"}}
{"timestamp":"2025-10-04 20:53:17","data":{"event":"STATUS_UPDATED","wa_message_id":"wamid.HBgNNjI4MTI5ODY5ODQyMhUCABEYEkFERTI3OEY3M0E1NDdFNDYxQgA=","new_status":"TERKIRIM"}}
{"timestamp":"2025-10-04 20:53:17","data":{"event":"STATUS_UPDATED","wa_message_id":"wamid.HBgNNjI4MTI5ODY5ODQyMhUCABEYEkFERTI3OEY3M0E1NDdFNDYxQgA=","new_status":"TERKIRIM"}}
{"timestamp":"2025-10-04 20:53:22","data":{"event":"STATUS_UPDATED","wa_message_id":"wamid.HBgNNjI4MTI5ODY5ODQyMhUCABEYEkFERTI3OEY3M0E1NDdFNDYxQgA=","new_status":"DIBACA"}}
{"timestamp":"2025-10-04 21:59:29","data":{"event":"STATUS_UPDATED","wa_message_id":"wamid.HBgNNjI4MTI5ODY5ODQyMhUCABEYEjI4QzBBOUQwMjNGMjE2RjhCMwA=","new_status":"PROSES"}}
{"timestamp":"2025-10-04 21:59:30","data":{"event":"STATUS_UPDATED","wa_message_id":"wamid.HBgNNjI4MTI5ODY5ODQyMhUCABEYEjI4QzBBOUQwMjNGMjE2RjhCMwA=","new_status":"TERKIRIM"}}
{"timestamp":"2025-10-04 21:59:56","data":{"event":"STATUS_UPDATED","wa_message_id":"wamid.HBgNNjI4MTI5ODY5ODQyMhUCABEYEjI4QzBBOUQwMjNGMjE2RjhCMwA=","new_status":"DIBACA"}}
{"timestamp":"2025-10-04 23:31:22","data":{"event":"STATUS_UPDATED","wa_message_id":"wamid.HBgNNjI4MTI5ODY5ODQyMhUCABEYEjBCNDMzNDY4NTA0MUU4NzUyNAA=","new_status":"PROSES"}}
{"timestamp":"2025-10-04 23:31:22","data":{"event":"STATUS_UPDATED","wa_message_id":"wamid.HBgNNjI4MTI5ODY5ODQyMhUCABEYEjBCNDMzNDY4NTA0MUU4NzUyNAA=","new_status":"TERKIRIM"}}
{"timestamp":"2025-10-04 23:31:27","data":{"event":"STATUS_UPDATED","wa_message_id":"wamid.HBgNNjI4MTI5ODY5ODQyMhUCABEYEjBCNDMzNDY4NTA0MUU4NzUyNAA=","new_status":"DIBACA"}}
{"timestamp":"2025-10-05 12:08:17","data":{"event":"STATUS_UPDATED","wa_message_id":"wamid.HBgNNjI4NTg2MzQ1ODQ0MBUCABEYEjYxQTlFQ0ZDMEEzRjgyRTY3NAA=","new_status":"PROSES"}}
{"timestamp":"2025-10-05 12:08:20","data":{"event":"STATUS_UPDATED","wa_message_id":"wamid.HBgNNjI4NTg2MzQ1ODQ0MBUCABEYEjYxQTlFQ0ZDMEEzRjgyRTY3NAA=","new_status":"TERKIRIM"}}
{"timestamp":"2025-10-05 12:47:01","data":{"event":"STATUS_UPDATED","wa_message_id":"wamid.HBgNNjI4NTg2MzQ1ODQ0MBUCABEYEjYxQTlFQ0ZDMEEzRjgyRTY3NAA=","new_status":"DIBACA"}}
{"timestamp":"2025-10-05 13:24:48","data":{"event":"STATUS_UPDATED","wa_message_id":"wamid.HBgNNjI4NTg4ODU2MTk4NxUCABEYEkJGNkI2M0U0RjY1N0I4ODdGRQA=","new_status":"GAGAL"}}
{"timestamp":"2025-10-05 13:25:00","data":{"event":"STATUS_UPDATED","wa_message_id":"wamid.HBgNNjI4NTg4ODU2MTk4NxUCABEYEkFGMDQzQkZBQzBFNDVGNTBDQgA=","new_status":"GAGAL"}}
{"timestamp":"2025-10-05 13:25:42","data":{"event":"STATUS_UPDATED","wa_message_id":"wamid.HBgNNjI4NTg4ODU2MTk4NxUCABEYEkQ1MUNDM0UyQjA4QzJBODUyRgA=","new_status":"GAGAL"}}
{"timestamp":"2025-10-05 13:28:27","data":{"event":"STATUS_UPDATED","wa_message_id":"wamid.HBgNNjI4NTg4ODU2MTk4NxUCABEYEkJBMTcyRTBDRTcxRTkwOEVEQwA=","new_status":"GAGAL"}}
{"timestamp":"2025-10-05 13:29:22","data":{"event":"STATUS_UPDATED","wa_message_id":"wamid.HBgNNjI4NTg4ODU2MTk4NxUCABEYEkVEN0Y3OTdDQjJEQkE3QkFFMQA=","new_status":"GAGAL"}}
{"timestamp":"2025-10-05 13:29:24","data":{"event":"STATUS_UPDATED","wa_message_id":"wamid.HBgNNjI4NTg4ODU2MTk4NxUCABEYEjU1RDhGNEI5N0FDOTNEN0EyNAA=","new_status":"GAGAL"}}
{"timestamp":"2025-10-05 13:34:32","data":{"event":"STATUS_UPDATED","wa_message_id":"wamid.HBgNNjI4NTY1NTU1ODAxNxUCABEYEjc0ODJGMDU3QzNDMzcxQkM0QwA=","new_status":"PROSES"}}
{"timestamp":"2025-10-05 13:34:34","data":{"event":"STATUS_UPDATED","wa_message_id":"wamid.HBgNNjI4NTY1NTU1ODAxNxUCABEYEjc0ODJGMDU3QzNDMzcxQkM0QwA=","new_status":"TERKIRIM"}}
{"timestamp":"2025-10-05 14:15:32","data":{"event":"STATUS_UPDATED","wa_message_id":"wamid.HBgNNjI4NTY1NTU1ODAxNxUCABEYEjc0ODJGMDU3QzNDMzcxQkM0QwA=","new_status":"DIBACA"}}
{"timestamp":"2025-10-05 14:18:40","data":{"event":"INCOMING_MESSAGE","from":"6285655558017","type":"image","text":"[Pesan non-teks: image]"}}
{"timestamp":"2025-10-05 14:18:41","data":{"event":"REPLY_SENT","to":"6285655558017","http_code":200}}
{"timestamp":"2025-10-05 14:30:41","data":{"event":"STATUS_UPDATED","wa_message_id":"wamid.HBgNNjI4MTU2MzY1ODcyNRUCABEYEjYzMkY5MzA3RkMzQkZEODVFQQA=","new_status":"PROSES"}}
{"timestamp":"2025-10-05 14:30:47","data":{"event":"STATUS_UPDATED","wa_message_id":"wamid.HBgNNjI4MTU2MzY1ODcyNRUCABEYEjYzMkY5MzA3RkMzQkZEODVFQQA=","new_status":"TERKIRIM"}}
{"timestamp":"2025-10-05 14:45:25","data":{"event":"STATUS_UPDATED","wa_message_id":"wamid.HBgNNjI4MjIxNjEzMjc3NxUCABEYEjYwOTFFOTZFOTZDODgyM0EzMgA=","new_status":"PROSES"}}
{"timestamp":"2025-10-05 14:45:39","data":{"event":"STATUS_UPDATED","wa_message_id":"wamid.HBgNNjI4MjIxNjEzMjc3NxUCABEYEjYwOTFFOTZFOTZDODgyM0EzMgA=","new_status":"TERKIRIM"}}
{"timestamp":"2025-10-05 14:45:44","data":{"event":"STATUS_UPDATED","wa_message_id":"wamid.HBgNNjI4MjIxNjEzMjc3NxUCABEYEjYwOTFFOTZFOTZDODgyM0EzMgA=","new_status":"DIBACA"}}
{"timestamp":"2025-10-05 15:59:08","data":{"event":"INCOMING_MESSAGE","from":"6285655558017","type":"text","text":"Transaksi pembayaran saya knp blom di konfirmasi"}}
{"timestamp":"2025-10-05 15:59:09","data":{"event":"REPLY_SENT","to":"6285655558017","http_code":200}}
{"timestamp":"2025-10-06 06:52:54","data":{"event":"STATUS_UPDATED","wa_message_id":"wamid.HBgNNjI4MTU2MzY1ODcyNRUCABEYEjYzMkY5MzA3RkMzQkZEODVFQQA=","new_status":"DIBACA"}}
{"timestamp":"2025-10-07 11:40:31","data":{"event":"INCOMING_MESSAGE","from":"6282114113413","type":"text","text":"Kenapa gangguan ya"}}
{"timestamp":"2025-10-07 11:40:32","data":{"event":"REPLY_SENT","to":"6282114113413","http_code":200}}