38682-vm/includes/WablasService.php
2026-02-28 12:59:44 +00:00

135 lines
5.1 KiB
PHP

<?php
class WablasService {
private $pdo;
private $domain;
private $token;
private $secret_key;
private $is_enabled;
public function __construct($pdo) {
$this->pdo = $pdo;
$this->loadConfig();
}
private function loadConfig() {
$stmt = $this->pdo->prepare("SELECT setting_key, setting_value FROM integration_settings WHERE provider = 'wablas'");
$stmt->execute();
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
$settings = [];
foreach ($rows as $r) {
$settings[$r['setting_key']] = $r['setting_value'];
}
$this->domain = $settings['domain'] ?? '';
$this->token = $settings['token'] ?? '';
$this->secret_key = $settings['secret_key'] ?? '';
$this->is_enabled = ($settings['is_enabled'] ?? '0') === '1';
}
public function testConnection() {
if (empty($this->domain) || empty($this->token)) {
return ['success' => false, 'message' => 'Missing Domain or Token'];
}
// Common Wablas endpoint to check device status
$url = rtrim($this->domain, '/') . '/api/device/info?token=' . $this->token;
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$curlError = curl_error($ch);
curl_close($ch);
if ($curlError) {
return ['success' => false, 'message' => 'Connection failed: ' . $curlError];
}
$data = json_decode($response, true);
if ($httpCode >= 200 && $httpCode < 300) {
// Some APIs return 200 even on logical error, check for status field if exists
if (isset($data['status']) && $data['status'] === false) {
return ['success' => false, 'message' => 'API Error: ' . ($data['message'] ?? 'Unknown error')];
}
// Check for explicit disconnected status if available in data
if (isset($data['data']['status']) && $data['data']['status'] !== 'connected') {
return ['success' => false, 'message' => 'Device Status: ' . $data['data']['status'] . ' (May need re-scan)'];
}
return ['success' => true, 'message' => 'Connection successful! Device info retrieved.'];
}
// Handle error responses with JSON message
if ($data && isset($data['message'])) {
return ['success' => false, 'message' => 'Provider Error (' . $httpCode . '): ' . $data['message']];
}
return ['success' => false, 'message' => 'HTTP Error: ' . $httpCode];
}
public function sendMessage($phone, $message) {
if (!$this->is_enabled) {
return ['success' => false, 'message' => 'WhatsApp sending is disabled in settings'];
}
if (empty($this->domain) || empty($this->token)) {
return ['success' => false, 'message' => 'Wablas configuration missing'];
}
// Format phone number: ensure 968 country code if only 8 digits provided
$cleanPhone = preg_replace('/[^0-9]/', '', $phone);
if (strlen($cleanPhone) === 8) {
$phone = '968' . $cleanPhone;
} else {
$phone = $cleanPhone;
}
$payload = [
'phone' => $phone,
'message' => $message,
'secret' => $this->secret_key
];
// Assuming standard endpoint. If users use v2, it might be /api/v2/send-message
$url = rtrim($this->domain, '/') . '/api/send-message';
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"Authorization: " . $this->token,
"Content-Type: application/json"
]);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($payload));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_TIMEOUT, 10); // Added 10 second timeout
$response = curl_exec($ch);
$curlError = curl_error($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$curlCloseResult = curl_close($ch);
if ($curlError) {
return ['success' => false, 'message' => 'cURL Error: ' . $curlError];
}
$data = json_decode($response, true);
$msg = $data['message'] ?? $response;
if ($httpCode >= 200 && $httpCode < 300) {
if (isset($data['status']) && $data['status'] === false) {
return ['success' => false, 'message' => 'Wablas Error: ' . ($data['message'] ?? 'Unknown error')];
}
return ['success' => true, 'message' => 'Message sent successfully. Response: ' . (is_string($msg) ? substr($msg, 0, 100) : 'OK')];
}
return ['success' => false, 'message' => 'HTTP Error ' . $httpCode . ': ' . (is_string($msg) ? $msg : 'Unknown')];
}
}