错误码
本章列出 /api/verify.php 可能返回的所有错误信息,便于客户端精确处理。错误信息主要通过 message 字段返回(无独立的 reason 字段)。
授权验证接口 (/api/verify.php)
| HTTP | message | 原因 | 客户端建议 |
| 200 |
授权有效 |
验证通过 |
正常流程 |
| 400 |
缺少域名参数 |
domain 为空 |
检查请求参数 |
| 400 |
缺少授权码参数 |
license_key 为空 |
检查请求参数 |
| 403 |
缺少 API 签名 |
未传 signature |
检查签名生成逻辑 |
| 403 |
签名验证失败 |
signature 不匹配 |
检查 api_secret、domain 标准化、serial 拼接顺序 |
| 200 |
授权码与域名不匹配(算法预校验失败) |
license_key 与 domain 不匹配 |
检查域名是否被换过 / 重新激活 |
| 200 |
授权码不存在或已被吊销 |
数据库无此 license |
检查授权码拼写 / 联系客服 |
| 200 |
授权已被禁用(status=xxx) |
license 状态非 active/expired |
联系客服 |
| 200 |
授权已被吊销 |
status = revoked |
联系客服 |
| 200 |
授权已被暂停 |
status = suspended |
联系客服 |
| 200 |
授权已过期 |
status = expired / 超过 expires_at |
续费 |
| 200 |
产品已停用 |
产品被管理员禁用 |
联系客服 |
| 200 |
产品标识验证失败(product_secret 不匹配) |
客户端 secret 与服务端不一致 |
核对 product_secret 配置 |
| 200 |
产品归属验证失败:授权记录绑定的产品与请求不一致 |
license 绑定的 product 与请求 product 不一致 |
核对 product slug |
| 429 |
请求过于频繁,请稍后再试 |
触发 IP 频率限制(默认 60 次/分钟) |
降低请求频率 / 优化本地缓存 |
| 503 |
服务端 API Secret 未配置 |
管理员未在系统设置里生成 API Secret |
联系管理员配置 |
易支付回调 (/epay_notify.php)
| 响应 | 说明 | 处理 |
| success |
处理成功 |
易支付停止重试 |
| fail(签名错) |
签名验证失败 |
核对 epay_key |
| fail(PID 错) |
商户 ID 不匹配 |
核对 epay_pid |
| fail(金额错) |
回调金额与订单金额不一致 |
检查订单创建时的金额 |
| fail(订单不存在) |
order_no 找不到 |
检查 out_trade_no |
| fail(500 内部错) |
complete_order 抛异常 |
查看错误日志 |
用户操作错误
| 错误 | 说明 | 处理 |
| 用户名已存在 |
注册时重名 |
换个用户名 |
| 邮箱已注册 |
邮箱已被使用 |
用邮箱找回密码 |
| 密码错误 |
登录密码错误 |
重试,连续 5 次会锁定 15 分钟 |
| 账号被禁用 |
管理员禁用了账号 |
联系客服 |
| 订单已超时 |
未在 30 分钟内支付 |
重新下单 |
| 域名已被使用 |
同一域名已有授权 |
在用户中心更换域名 |
错误处理最佳实践
客户端应该根据 message 关键词或 HTTP 状态码采取不同的处理:
<?php
function handle_verify_response($data, $http_code) {
// 网络/HTTP 层错误
if ($http_code === 429) {
return ['show' => false, 'msg' => '', 'retry' => true];
}
if ($http_code === 503) {
return ['show' => true, 'msg' => '授权服务暂不可用', 'retry' => true];
}
if ($http_code === 403) {
error_log('[CRITICAL] License signature invalid');
return ['show' => true, 'msg' => '授权服务异常,请联系插件作者', 'retry' => false];
}
// 业务层错误(HTTP 200 但 status !== success)
if (($data['status'] ?? '') !== 'success') {
$msg = $data['message'] ?? '验证失败';
if (str_contains($msg, '过期')) {
return ['show' => true, 'msg' => '授权已过期,请续费', 'retry' => false];
}
if (str_contains($msg, '暂停') || str_contains($msg, '吊销')) {
return ['show' => true, 'msg' => '授权已被暂停/吊销,请联系客服', 'retry' => false];
}
if (str_contains($msg, '域名')) {
return ['show' => true, 'msg' => '授权域名不匹配,请前往用户中心更换', 'retry' => false];
}
return ['show' => true, 'msg' => $msg, 'retry' => false];
}
// 成功
return ['show' => false, 'msg' => '', 'retry' => false, 'info' => $data['license']];
}