使用文档

时光授权系统文档

从快速开始到 API 对接,全面了解授权系统的使用与集成

错误码

本章列出 /api/verify.php 可能返回的所有错误信息,便于客户端精确处理。错误信息主要通过 message 字段返回(无独立的 reason 字段)。

授权验证接口 (/api/verify.php)

HTTPmessage原因客户端建议
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']];
}