safeLoad(); $baseUrl = 'http://127.0.0.1:8787'; function requestJson(string $method, string $url, array $payload = [], array $headers = []): array { $ch = curl_init(); $defaultHeaders = ['Accept: application/json']; if ($payload) { $defaultHeaders[] = 'Content-Type: application/json'; } foreach ($headers as $header) { $defaultHeaders[] = $header; } curl_setopt_array($ch, [ CURLOPT_URL => $url, CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 10, CURLOPT_CUSTOMREQUEST => $method, CURLOPT_HTTPHEADER => $defaultHeaders, ]); if ($payload) { curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($payload, JSON_UNESCAPED_UNICODE)); } $response = curl_exec($ch); $errno = curl_errno($ch); $error = curl_error($ch); $httpCode = (int)curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); if ($errno) { throw new RuntimeException("HTTP {$method} {$url} failed: {$error}"); } $decoded = json_decode((string)$response, true); return [ 'status' => $httpCode, 'body' => is_array($decoded) ? $decoded : ['raw' => $response], ]; } function assertOk(string $label, array $response): void { $status = $response['status']; $body = $response['body']; $code = $body['code'] ?? null; if ($status !== 200 || $code !== 0) { throw new RuntimeException("{$label} failed: http={$status} body=" . json_encode($body, JSON_UNESCAPED_UNICODE)); } echo "[PASS] {$label}\n"; } try { assertOk('app home', requestJson('GET', $baseUrl . '/api/app/home/index')); assertOk('app help center', requestJson('GET', $baseUrl . '/api/app/help-center')); $appLogin = requestJson('POST', $baseUrl . '/api/app/auth/login/password', [ 'mobile' => '13800000000', 'password' => 'User@123456', ]); assertOk('app login', $appLogin); $appToken = $appLogin['body']['data']['token'] ?? ''; if (!$appToken) { throw new RuntimeException('app login did not return token'); } $appAuthHeader = ['Authorization: Bearer ' . $appToken]; assertOk('app me', requestJson('GET', $baseUrl . '/api/app/auth/me', [], $appAuthHeader)); $appReports = requestJson('GET', $baseUrl . '/api/app/reports', [], $appAuthHeader); assertOk('app reports', $appReports); $appOrders = requestJson('GET', $baseUrl . '/api/app/orders', [], $appAuthHeader); assertOk('app orders', $appOrders); assertOk('app messages summary', requestJson('GET', $baseUrl . '/api/app/messages/summary', [], $appAuthHeader)); assertOk('app addresses', requestJson('GET', $baseUrl . '/api/app/addresses', [], $appAuthHeader)); assertOk('app settings', requestJson('GET', $baseUrl . '/api/app/settings', [], $appAuthHeader)); $completedOrder = null; foreach (($appOrders['body']['data']['list'] ?? []) as $item) { if (($item['order_status'] ?? '') === 'completed') { $completedOrder = $item; break; } } if ($completedOrder) { $orderDetail = requestJson('GET', $baseUrl . '/api/app/order/detail?id=' . (int)$completedOrder['order_id'], [], $appAuthHeader); assertOk('app order detail completed', $orderDetail); } $reportNo = $appReports['body']['data']['list'][0]['report_no'] ?? ''; if ($reportNo !== '') { $reportDetail = requestJson('GET', $baseUrl . '/api/app/report/detail?report_no=' . rawurlencode($reportNo)); assertOk('app public report detail', $reportDetail); $isZhongjianReport = ($reportDetail['body']['data']['report_header']['service_provider'] ?? '') === 'zhongjian'; $verifyQr = $reportDetail['body']['data']['verify_info']['verify_qrcode_url'] ?? ''; if (!$isZhongjianReport && $verifyQr === '') { throw new RuntimeException('app public report detail missing verify_qrcode_url'); } if (!$isZhongjianReport) { assertOk('app public verify', requestJson('GET', $baseUrl . '/api/app/verify?report_no=' . rawurlencode($reportNo))); } } $appLogout = requestJson('POST', $baseUrl . '/api/app/auth/logout', [], $appAuthHeader); assertOk('app logout', $appLogout); $login = requestJson('POST', $baseUrl . '/api/admin/auth/login', [ 'mobile' => '13800138000', 'password' => 'Anxinyan@2026!', ]); assertOk('admin login', $login); $token = $login['body']['data']['token'] ?? ''; if (!$token) { throw new RuntimeException('admin login did not return token'); } $authHeader = ['Authorization: Bearer ' . $token]; assertOk('admin me', requestJson('GET', $baseUrl . '/api/admin/auth/me', [], $authHeader)); assertOk('admin dashboard', requestJson('GET', $baseUrl . '/api/admin/dashboard', [], $authHeader)); assertOk('admin users overview', requestJson('GET', $baseUrl . '/api/admin/users/overview', [], $authHeader)); assertOk('admin access overview', requestJson('GET', $baseUrl . '/api/admin/access/overview', [], $authHeader)); assertOk('admin system configs', requestJson('GET', $baseUrl . '/api/admin/system-configs', [], $authHeader)); $adminOrders = requestJson('GET', $baseUrl . '/api/admin/orders', [], $authHeader); assertOk('admin orders', $adminOrders); $adminCompletedOrder = null; foreach (($adminOrders['body']['data']['list'] ?? []) as $item) { if (($item['order_status'] ?? '') === 'completed') { $adminCompletedOrder = $item; break; } } if ($adminCompletedOrder) { $adminOrderDetail = requestJson('GET', $baseUrl . '/api/admin/order/detail?id=' . (int)$adminCompletedOrder['id'], [], $authHeader); assertOk('admin order detail completed', $adminOrderDetail); } $logout = requestJson('POST', $baseUrl . '/api/admin/auth/logout', [], $authHeader); assertOk('admin logout', $logout); echo "SMOKE_OK\n"; } catch (Throwable $e) { fwrite(STDERR, "SMOKE_FAIL: " . $e->getMessage() . "\n"); exit(1); }