Tài liệu / Nâng cao/ Xử lý lỗi

Xử lý lỗi

Nâng cao Cập nhật: 22/03/2026

Mã lỗi HTTP

HTTP StatusMã lỗiMô tảCách xử lý
400INVALID_REQUESTTham số không hợp lệ hoặc thiếuKiểm tra lại body/params
401UNAUTHORIZEDAPI key không hợp lệ hoặc thiếu headerKiểm tra API key và header Authorization
403FORBIDDENKhông có quyền truy cập tài nguyênKiểm tra quyền của API key
404NOT_FOUNDTài nguyên không tồn tạiKiểm tra ID hoặc slug
429RATE_LIMIT_EXCEEDEDVượt giới hạn 60 req/phútChờ theo retry_after giây
500INTERNAL_ERRORLỗi nội bộ serverThử lại sau, liên hệ support nếu tiếp diễn

Định dạng Response lỗi

{
  "success": false,
  "error": {
    "code": "RATE_LIMIT_EXCEEDED",
    "message": "Too many requests. Retry after 45 seconds.",
    "retry_after": 45
  }
}

Xử lý Rate Limit (429)

<?php
// PHP: Retry với exponential backoff
function requestWithRetry(string $url, array $headers, int $maxRetries = 3): array
{
    $delay = 1;
    for ($i = 0; $i < $maxRetries; $i++) {
        $ch = curl_init($url);
        curl_setopt_array($ch, [
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_HTTPHEADER     => $headers,
        ]);
        $response = curl_exec($ch);
        $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        curl_close($ch);

        if ($httpCode === 429) {
            $data       = json_decode($response, true);
            $retryAfter = $data['error']['retry_after'] ?? $delay;
            error_log("Rate limit, thử lại sau {$retryAfter}s (lần " . ($i + 1) . ")");
            sleep($retryAfter);
            $delay *= 2; // Exponential backoff
            continue;
        }

        return ['code' => $httpCode, 'body' => json_decode($response, true)];
    }

    throw new RuntimeException('Đã vượt quá số lần thử lại');
}
// Node.js: Retry với exponential backoff
async function requestWithRetry(url, options, maxRetries = 3) {
    let delay = 1000; // 1 giây

    for (let i = 0; i < maxRetries; i++) {
        try {
            const response = await axios(url, options);
            return response.data;
        } catch (error) {
            if (error.response?.status === 429) {
                const retryAfter = error.response.data.error.retry_after || delay / 1000;
                console.warn(`Rate limit, thử lại sau ${retryAfter}s`);
                await new Promise(resolve => setTimeout(resolve, retryAfter * 1000));
                delay *= 2;
                continue;
            }
            throw error; // Lỗi khác — không retry
        }
    }
    throw new Error('Đã vượt quá số lần thử lại');
}

Idempotency — Tránh xử lý trùng

ThueAPI có thể gửi lại webhook nếu server của bạn không phản hồi kịp. Luôn kiểm tra transactionNumber trước khi xử lý:

<?php
// Kiểm tra trùng lặp trước khi xử lý
$txNumber = $transaction['transactionNumber'];
$exists   = Transaction::where('transaction_number', $txNumber)->exists();

if ($exists) {
    // Trả về success nhưng không xử lý lại
    return response()->json(['success' => true]);
}

// Xử lý giao dịch mới
Transaction::create([...]);
ThueAPI.VN
Đăng nhập với Google
hoặc đăng nhập bằng email
Quên mật khẩu?

Chưa có tài khoản?

Đăng ký với Google
hoặc đăng ký bằng email

Bằng cách đăng ký, bạn đồng ý với Điều khoản dịch vụChính sách bảo mật của chúng tôi.

Đã có tài khoản?