错误码
本文档列出智能采购平台 API 的所有错误码及其说明。
错误码格式
错误码由 5 位数字组成,格式为:XYZNN
- X - 错误类别(4=客户端错误,5=服务端错误)
- YZ - HTTP 状态码的后两位(如 01=401,04=404)
- NN - 具体错误编号(01-99)
HTTP 状态码映射
| HTTP 状态码 | 说明 | 错误码范围 |
|---|---|---|
| 400 | Bad Request | 40001-40099 |
| 401 | Unauthorized | 40101-40199 |
| 403 | Forbidden | 40301-40399 |
| 404 | Not Found | 40401-40499 |
| 409 | Conflict | 40901-40999 |
| 429 | Too Many Requests | 42901-42999 |
| 500 | Internal Server Error | 50001-50099 |
| 503 | Service Unavailable | 50301-50399 |
客户端错误(4xxxx)
400 Bad Request - 请求参数错误
| 错误码 | 错误消息 | 说明 | 解决方案 |
|---|---|---|---|
40001 | 请求参数错误 | 请求参数格式或值不正确 | 检查请求参数是否符合 API 文档规范 |
40002 | 必填参数缺失 | 缺少必填的请求参数 | 补充缺失的必填参数 |
40003 | 参数格式错误 | 参数类型或格式不符合要求 | 按照文档要求的格式传递参数 |
40004 | 参数值超出范围 | 参数值不在允许的范围内 | 检查参数的最大/最小值限制 |
40005 | JSON 格式错误 | 请求体不是有效的 JSON 格式 | 确保请求体是有效的 JSON 字符串 |
40006 | 请求体过大 | 请求体大小超过限制(1MB) | 减小请求体大小或分批请求 |
40007 | URL 过长 | 请求 URL 超过最大长度限制 | 使用 POST 请求或减少查询参数 |
40008 | 不支持的内容类型 | Content-Type 不支持 | 使用 application/json |
40009 | 字段验证失败 | 字段值不符合验证规则 | 检查字段的验证规则(如正则表达式) |
示例响应:
{
"code": 40001,
"message": "请求参数错误",
"data": {
"field": "price",
"reason": "价格必须大于0",
"value": -100
}
}401 Unauthorized - 认证失败
| 错误码 | 错误消息 | 说明 | 解决方案 |
|---|---|---|---|
40101 | 签名验证失败 | HMAC 签名计算错误 | 检查签名算法和参数顺序 |
40102 | 时间戳过期 | 请求时间戳与服务器时间相差超过 5 分钟 | 同步本地时间或使用 NTP 服务 |
40103 | App ID 不存在 | 提供的 App ID 无效 | 确认 App ID 是否正确 |
40104 | App Secret 错误 | 使用的密钥不正确 | 确认 App Secret 是否正确 |
40105 | 认证头缺失 | 缺少必需的认证请求头 | 添加 X-App-Id、X-Timestamp、X-Signature |
40106 | 时间戳格式错误 | 时间戳不是有效的毫秒级时间戳 | 使用 Date.now() 生成毫秒级时间戳 |
40107 | 签名格式错误 | 签名不是有效的十六进制字符串 | 确保使用 hex 编码的签名 |
示例响应:
{
"code": 40101,
"message": "签名验证失败",
"data": {
"reason": "签名计算错误,请检查签名算法",
"expectedFormat": "HMAC-SHA256(secret, METHOD + PATH + TIMESTAMP + BODY)"
}
}403 Forbidden - 权限不足
| 错误码 | 错误消息 | 说明 | 解决方案 |
|---|---|---|---|
40301 | IP 不在白名单 | 请求来源 IP 未配置白名单 | 在控制台配置 IP 白名单 |
40302 | 权限不足 | 当前应用没有访问该资源的权限 | 联系管理员分配相应权限 |
40303 | 应用已禁用 | 应用已被停用或删除 | 联系管理员恢复应用 |
40304 | 资源访问受限 | 该资源不允许当前用户访问 | 确认资源所有权或申请访问权限 |
40305 | 操作不允许 | 当前状态下不允许该操作 | 检查资源状态是否允许该操作 |
示例响应:
{
"code": 40301,
"message": "IP 不在白名单",
"data": {
"clientIp": "192.168.1.100",
"reason": "请在控制台添加该 IP 到白名单"
}
}404 Not Found - 资源不存在
| 错误码 | 错误消息 | 说明 | 解决方案 |
|---|---|---|---|
40401 | 资源不存在 | 请求的资源 ID 不存在 | 确认资源 ID 是否正确 |
40402 | 接口不存在 | 请求的 API 路径不存在 | 检查 API 路径是否正确 |
40403 | 用户不存在 | 指定的用户 ID 不存在 | 确认用户 ID 是否正确 |
40404 | 意图不存在 | 指定的采购意图不存在 | 确认意图 ID 是否正确 |
示例响应:
{
"code": 40404,
"message": "意图不存在",
"data": {
"intentId": "intent_123456",
"reason": "该采购意图可能已被删除或 ID 错误"
}
}409 Conflict - 资源冲突
| 错误码 | 错误消息 | 说明 | 解决方案 |
|---|---|---|---|
40901 | 资源已存在 | 尝试创建已存在的资源 | 使用更新接口或检查资源是否已创建 |
40902 | 状态冲突 | 资源当前状态不允许该操作 | 检查资源状态后再执行操作 |
40903 | 并发冲突 | 资源被其他请求修改 | 刷新资源状态后重试 |
40904 | 版本冲突 | 资源版本已更新 | 获取最新版本后重试 |
示例响应:
{
"code": 40902,
"message": "状态冲突",
"data": {
"intentId": "intent_123",
"currentStatus": "COMPLETED",
"reason": "已完成的意图不能被取消"
}
}429 Too Many Requests - 请求频率超限
| 错误码 | 错误消息 | 说明 | 解决方案 |
|---|---|---|---|
42901 | 请求频率超限 | 超过 QPS 限制 | 降低请求频率或联系支持提升限额 |
42902 | 并发请求过多 | 同时进行的请求数超限 | 控制并发请求数 |
42903 | 配额已用尽 | API 调用配额已用完 | 等待配额重置或升级套餐 |
示例响应:
{
"code": 42901,
"message": "请求频率超限",
"data": {
"limit": 100,
"current": 105,
"retryAfter": 60,
"resetTime": "2026-02-25T10:31:00Z"
}
}重试建议:
async function retryWithBackoff(fn: () => Promise<Response>, maxRetries = 3) {
for (let i = 0; i < maxRetries; i++) {
const response = await fn();
if (response.status === 429) {
const retryAfter = parseInt(response.headers.get('Retry-After') || '60');
await sleep(retryAfter * 1000);
continue;
}
return response;
}
throw new Error('Max retries exceeded');
}服务端错误(5xxxx)
500 Internal Server Error - 服务器内部错误
| 错误码 | 错误消息 | 说明 | 解决方案 |
|---|---|---|---|
50001 | 服务器内部错误 | 服务器处理请求时发生未知错误 | 联系技术支持,提供 Request ID |
50002 | 数据库错误 | 数据库操作失败 | 稍后重试,如持续出现联系技术支持 |
50003 | 第三方服务错误 | 调用外部服务失败 | 稍后重试 |
50004 | 配置错误 | 服务配置异常 | 联系技术支持 |
50005 | 数据处理错误 | 数据处理过程中出错 | 检查数据格式或联系技术支持 |
示例响应:
{
"code": 50001,
"message": "服务器内部错误",
"data": {
"requestId": "req_1708851000000_abc123",
"reason": "服务器处理请求时发生错误,请联系技术支持"
}
}503 Service Unavailable - 服务不可用
| 错误码 | 错误消息 | 说明 | 解决方案 |
|---|---|---|---|
50301 | 服务暂时不可用 | 服务正在维护或升级 | 等待服务恢复,关注公告 |
50302 | 服务过载 | 服务器负载过高 | 稍后重试 |
50303 | 依赖服务不可用 | 依赖的外部服务不可用 | 等待服务恢复 |
示例响应:
{
"code": 50301,
"message": "服务暂时不可用",
"data": {
"reason": "系统正在进行维护升级",
"estimatedRecoveryTime": "2026-02-25T12:00:00Z",
"retryAfter": 3600
}
}特定业务错误
采购意图相关错误
| 错误码 | 错误消息 | 说明 | 解决方案 |
|---|---|---|---|
41001 | 不支持的电商平台 | platform 字段值无效 | 使用 TAOBAO、JD 或 PDD |
41002 | 商品 URL 无效 | productUrl 格式错误或无法访问 | 提供有效的商品链接 |
41003 | 价格异常 | 商品价格超出合理范围 | 检查价格是否正确 |
41004 | 数量超限 | 采购数量超过单次最大限制 | 减少数量或分批采购 |
41005 | 收货地址无效 | 地址格式不正确或不支持配送 | 提供有效的收货地址 |
41006 | 手机号格式错误 | 手机号不符合规范 | 使用 11 位有效手机号 |
41007 | 商品已下架 | 商品链接对应的商品已下架 | 更换其他商品 |
41008 | 库存不足 | 商品库存不足 | 减少采购数量 |
示例响应:
{
"code": 41002,
"message": "商品 URL 无效",
"data": {
"field": "productUrl",
"value": "https://invalid-url",
"reason": "无法访问该商品链接,请检查 URL 是否正确"
}
}错误处理最佳实践
1. 错误重试策略
async function apiCallWithRetry<T>(
fn: () => Promise<T>,
options = { maxRetries: 3, backoffMs: 1000 }
): Promise<T> {
const { maxRetries, backoffMs } = options;
for (let i = 0; i < maxRetries; i++) {
try {
return await fn();
} catch (error) {
const shouldRetry =
error.code >= 50000 || // 服务器错误
error.code === 42901; // 频率限制
if (!shouldRetry || i === maxRetries - 1) {
throw error;
}
// 指数退避
const delay = backoffMs * Math.pow(2, i);
await sleep(delay);
}
}
}2. 错误日志记录
function logApiError(error: ApiError, requestContext: any) {
console.error('API Error:', {
code: error.code,
message: error.message,
requestId: error.data?.requestId,
endpoint: requestContext.endpoint,
method: requestContext.method,
timestamp: new Date().toISOString(),
});
}3. 用户友好的错误提示
function getUserFriendlyMessage(errorCode: number): string {
const messages: Record<number, string> = {
40001: '请检查输入的信息是否正确',
40101: '登录信息已过期,请重新登录',
40404: '未找到相关信息',
42901: '操作过于频繁,请稍后再试',
50001: '服务暂时不可用,请稍后再试',
};
return messages[errorCode] || '操作失败,请稍后再试';
}4. 错误监控和告警
interface ErrorMetrics {
errorCode: number;
count: number;
lastOccurrence: Date;
}
class ErrorMonitor {
private metrics = new Map<number, ErrorMetrics>();
track(errorCode: number) {
const metric = this.metrics.get(errorCode) || {
errorCode,
count: 0,
lastOccurrence: new Date()
};
metric.count++;
metric.lastOccurrence = new Date();
this.metrics.set(errorCode, metric);
// 触发告警
if (metric.count > 100) {
this.alert(`Error ${errorCode} occurred ${metric.count} times`);
}
}
alert(message: string) {
// 发送告警通知
console.warn('ALERT:', message);
}
}获取帮助
如果您遇到无法解决的错误:
-
查看 Request ID:每个响应都包含
X-Request-Id请求头,提供此 ID 可以帮助技术支持快速定位问题 -
检查 API 状态:访问 服务状态页面 查看是否有已知问题
-
联系技术支持:
- 📧 邮箱:support@procure-core.com
- 💬 开发者社区:GitHub Discussions
-
提供错误信息:
- 错误码和错误消息
- Request ID
- 请求时间
- 请求参数(脱敏后)
- 复现步骤