query->has('id')) { $providerId = (string) ((int) $request->query('id')); $status = trim(strip_tags((string) $request->query('status', ''))); $log = SmsLog::query()->where('provider_message_id', $providerId)->first(); if ($log) { $meta = (array) $log->meta; $meta['delivery_report'] = [ 'raw_status' => $status, 'received_at' => now()->toIso8601String(), ]; // Naive mapping: mark delivered for common success statuses $normalized = strtoupper($status); if (in_array($normalized, ['DELIVERED', 'DELIVRD', 'OK'], true)) { $log->status = 'delivered'; $log->delivered_at = now(); } elseif (in_array($normalized, ['FAILED', 'UNDELIV', 'UNDELIVERED', 'ERROR'], true)) { $log->status = 'failed'; $log->failed_at = now(); $log->error_code = $normalized; } $log->meta = $meta; $log->save(); } else { Log::warning('sms.webhook.delivery.unknown_id', ['provider_id' => $providerId, 'status' => $status]); } return response()->json(['ok' => true]); } // Reply via POST: smsId, m (message), from, to, time if ($request->isMethod('post') && $request->post('smsId')) { $providerId = (string) ((int) $request->post('smsId')); $msg = trim(strip_tags((string) $request->post('m', ''))); $fromNumber = (string) $request->post('from', ''); $toNumber = (string) $request->post('to', ''); $timestamp = (int) $request->post('time', time()); $log = SmsLog::query()->where('provider_message_id', $providerId)->first(); if ($log) { $meta = (array) $log->meta; $replies = isset($meta['replies']) && is_array($meta['replies']) ? $meta['replies'] : []; $replies[] = [ 'message' => $msg, 'from' => $fromNumber, 'to' => $toNumber, 'time' => date('c', $timestamp), ]; $meta['replies'] = $replies; $log->meta = $meta; $log->save(); } else { Log::warning('sms.webhook.reply.unknown_id', [ 'provider_id' => $providerId, 'from' => $fromNumber, 'to' => $toNumber, ]); } return response()->json(['ok' => true]); } // Unknown payload return response()->json(['ok' => false, 'reason' => 'unsupported payload'], 400); } }