文档目录
API接口

简介

本文件为 DouPHP 的 API 端 REST 接口层文档,面向移动端开发者、小程序开发者与第三方集成商。内容覆盖:

  • RESTful 风格路由、HTTP 方法与 URL 模式
  • 认证授权机制(Bearer Token、鉴权中间件、权限策略)
  • 公共模块接口规范(用户、商品、订单等)
  • 请求/响应格式、错误码与错误处理
  • 版本管理、向后兼容性与限流策略
  • 测试方法与调试建议

API 端作为统一的服务出口,为小程序、移动应用、单页应用(SPA)以及第三方系统提供标准化的 JSON 接口服务。

项目结构

API 入口统一通过 api/index.php 启动,使用声明式路由与分层中间件完成请求分发。核心路径要点:

  • 入口:api/index.php
  • 路由解析:ApiResolver、Router
  • 中间件:安全头、代理信任、限流、用户认证
  • 控制器:按模块划分(user、product、order 等)
  • 鉴权门面:Auth(基于不透明 token)
  • 配置:应用密钥、调试开关等
graph TB
Client["客户端<br/>小程序/移动应用/第三方"] --> Entry["API 入口<br/>api/index.php"]
Entry --> Router["路由调度<br/>Router"]
Router --> Resolver["路由解析<br/>ApiResolver"]
Resolver --> MW["中间件栈<br/>SecurityHeaders / TrustProxy / Throttle / UserAuth"]
MW --> Controller["业务控制器<br/>UserController / ProductController / OrderController"]
Controller --> Service["服务层/门面<br/>DB / auth('api') / 业务服务"]
Service --> Response["统一响应<br/>ApiResponse"]

核心组件

  • 入口与异常处理:统一捕获未处理异常并返回 JSON 500;支持站点调试时输出详细堆栈。
  • 路由系统:以 ?route=module[/sub][/action] 形式进入,匹配后产出 DispatchPlan,交由中央 Dispatcher 执行。
  • 中间件栈:默认包含安全头、代理信任、限流;当启用会员功能时自动加入用户认证中间件。
  • 鉴权门面:基于不透明 token 的 Guard,提供身份注入、上下文解析、登录态检查等方法。
  • 控制器基类:封装 API 端通用能力(如会员中心导航构建)。

架构总览

请求从入口进入,经路由解析命中控制器与方法,中间件在管道中依次执行(安全头→代理信任→限流→用户认证),最终由控制器调用服务并返回统一 JSON 响应。

sequenceDiagram
participant C as "客户端"
participant E as "入口 api/index.php"
participant R as "Router"
participant A as "ApiResolver"
participant M as "中间件栈"
participant Ctrl as "控制器"
participant S as "服务/门面"
participant Resp as "ApiResponse"
C->>E : HTTP 请求
E->>R : dispatch()
R->>A : resolve(request, container)
A-->>R : DispatchPlan(含中间件列表)
R->>M : 执行中间件管道
M->>Ctrl : 命中控制器方法
Ctrl->>S : 调用服务/门面
S-->>Ctrl : 数据/结果
Ctrl->>Resp : success()/error()
Resp-->>C : JSON 响应

详细组件分析

认证与授权机制

  • 认证方式:Bearer Token(Authorization: Bearer &lt;token>)
  • 令牌生命周期:登录成功后签发;退出时吊销;过期或无效则拒绝访问
  • 鉴权中间件:UserAuthMiddleware 负责从请求头提取 token,调用 auth('api')->resolveUserContext 解析上下文并注入到当前请求
  • 权限策略:middleware.php 中定义各模块/动作的鉴权级别(public、optional、required),以及 work_required 子策略用于工作端校验
  • 未认证/无权限:分别返回 401/403 JSON 错误
flowchart TD
Start(["请求进入"]) --> Extract["提取 Authorization: Bearer"]
Extract --> Resolve{"auth('api')->resolveUserContext"}
Resolve --> |ok| Inject["注入用户与工作端上下文"]
Resolve --> |not ok| Reject401["返回 401 未登录"]
Inject --> CheckMode{"鉴权模式 required?"}
CheckMode --> |否| Next["继续后续中间件/控制器"]
CheckMode --> |是| WorkCheck{"是否要求工作端身份?"}
WorkCheck --> |否| Next
WorkCheck --> |是| HasWork{"hasWorkIdentity?"}
HasWork --> |是| Next
HasWork --> |否| Reject403["返回 403 无工作端权限"]

限流策略

  • 适用场景:登录/注册/找回密码/短信验证码下发、匿名写接口(留言/咨询/邮件订阅)、防伪查询、LLM 对话等
  • 规则:按 module/sub/action 维度配置配额(次数/时间窗口),超限返回 429 并附带 Retry-After
  • 扩展:可在 ThrottleMiddleware 中新增路由键与配额
flowchart TD
Req["请求到达"] --> Match["匹配限流规则"]
Match --> Found{"找到规则?"}
Found --> |否| Pass["放行"]
Found --> |是| Count["计数统计"]
Count --> Over{"超过配额?"}
Over --> |否| Pass
Over --> |是| Reject["返回 429 + Retry-After"]

用户管理模块(user)

  • 主要路由:
    • GET/POST user/*:会员中心首页、注册、登录、手机登录、密码重置、资料编辑、修改密码、退出、SNS 绑定、地区数据、文件上传/删除、登录态检查、头像上传
    • GET user/weixin/get_phone、GET user/weixin/login、POST user/weixin/pay:微信相关能力
    • GET user/work/index:工作端索引
    • GET/POST user/contact/*:联系人管理
  • 典型流程(登录):
    • 客户端提交用户名/密码或手机号+验证码
    • 控制器验证凭据,成功则签发 token 并返回用户信息
    • 后续请求携带 Authorization: Bearer &lt;token> 进行鉴权
sequenceDiagram
participant App as "客户端"
participant UC as "UserController"
participant LS as "LoginService"
participant UA as "UserAuthService"
participant Auth as "auth('api')"
App->>UC : POST user/login_post
UC->>LS : validateLoginCredentials(...)
LS-->>UC : 结果(用户/字段)
UC->>UA : login(user, field)
UA-->>UC : token
UC-->>App : {user, dou.auth.is_work}
App->>UC : 后续请求带 Authorization : Bearer
UC->>Auth : id()/check()
Auth-->>UC : 已登录上下文

商品管理模块(product)

  • 主要路由:
    • GET product:商品列表(支持分类、品牌、排序、分页)
    • GET product/{id}:商品详情
    • GET product/attribute_list:属性计算
    • product/work/*:核销端增删改查(store/update/destroy)
  • 典型流程(列表):
    • 解析分类 ID、归档参数、页码、品牌、排序
    • 构建商品列表数据并返回
flowchart TD
In["GET product"] --> Parse["解析分类/归档/页码/品牌/排序"]
Parse --> Build["构建商品列表数据"]
Build --> Return["返回 ApiResponse.success(data)"]

订单处理模块(order)

  • 主要路由:
    • GET order:购物车首页(需登录)
    • order/user/*:我的订单(index/show/cancel)
    • order/cart/*:购物车资源操作(cart_number/store/update/destroy)
    • order/checkout/*:结算流程(index/checkout_post/success/change_shipping/use_coupon)
    • order/cashier/*:收银台(pay/pay_evidence)
    • order/work/*:核销端(index/show/order_cancel/pay_check/tracking)
  • 典型流程(购物车):
    • 校验登录态,获取用户 ID
    • 读取购物车数据并返回
sequenceDiagram
participant App as "客户端"
participant OC as "OrderController"
participant OS as "OrderService"
App->>OC : GET order
OC->>OC : mustLoginUserId()
OC->>OS : getCart(userId)
OS-->>OC : cart
OC-->>App : {title, cart}

依赖关系分析

  • 入口依赖路由与中间件:入口将 route 字符串写入 Request,随后由 Router 与 ApiResolver 解析并组装中间件栈
  • 中间件依赖配置:鉴权模式与 work_required 策略来自 middleware.php
  • 控制器依赖服务与门面:通过依赖注入或服务门面访问业务逻辑
  • 鉴权门面依赖 token 服务:ApiTokenService 负责 token 的解析与吊销
graph LR
Entry["api/index.php"] --> Router["Router"]
Router --> Resolver["ApiResolver"]
Resolver --> MW["中间件(限流/认证)"]
MW --> Controllers["控制器"]
Controllers --> Facade["Auth 门面"]
Facade --> TokenSvc["ApiTokenService"]

性能与限流

  • 限流:对高频敏感接口实施 IP 维度的限流,避免滥用与刷量
  • 缓存:可结合服务层与存储层优化热点数据(如商品列表、分类树)
  • 数据库:合理使用索引与分页,减少全表扫描
  • 响应体:仅返回必要字段,降低网络开销

故障排查指南

  • 未捕获异常:入口统一捕获并返回 JSON 500;开启站点调试时可输出详细堆栈
  • 鉴权失败:检查 Authorization 头是否正确、token 是否有效、鉴权模式配置是否合理
  • 限流触发:关注 429 响应与 Retry-After 头,调整调用频率或申请更高配额
  • 路由未命中:确认 route 参数格式与模块/动作是否存在

结论

DouPHP API 端采用声明式路由与分层中间件架构,提供统一的认证授权、限流与安全头策略。通过模块化控制器与服务层解耦,便于扩展与维护。建议在生产环境关闭调试、严格配置鉴权模式与限流规则,并结合监控与日志完善可观测性。

附录:公共API参考

通用约定

  • 基础URL:/api/index.php?route=模块/子模块/动作
  • 认证:需要认证的接口需在 Authorization 头携带 Bearer <token>
  • 响应格式:统一使用 ApiResponse 返回 JSON,包含状态码与消息
  • 错误码:使用 ApiCodes 中的标准错误码(如未登录、未找到、服务器错误、速率限制等)

用户模块(user)

  • GET/POST user/register:注册表单/提交
  • GET/POST user/login:登录表单/提交
  • GET/POST user/login_phone:手机登录表单/提交
  • GET/POST user/password_reset:密码重置表单/提交
  • GET/POST user/edit:资料编辑表单/提交
  • GET/POST user/password:修改密码表单/提交
  • POST user/logout:退出登录(吊销 token)
  • GET/POST user/sns:第三方账号管理/引导
  • GET user/area:省市区数据
  • POST user/filebox:文件上传
  • POST user/filedel:文件删除
  • GET user/check_login_state:登录态检查
  • POST user/upload_avatar:上传头像
  • GET user/weixin/get_phone:微信获取手机号
  • GET user/weixin/login:微信登录
  • POST user/weixin/pay:微信支付

示例(登录)

  • 请求:POST /api/index.php?route=user/login_post
  • 请求体:username、password(或 mobile、verification、verification_data)
  • 响应:{ user, dou: { auth: { is_work } } }

示例(退出)

  • 请求:POST /api/index.php?route=user/logout
  • 头部:Authorization: Bearer &lt;token>
  • 响应:空数据

商品模块(product)

  • GET product:商品列表(支持 category_id、brand_id、by、sort、page、year、month)
  • GET product/{id}:商品详情
  • GET product/attribute_list:属性计算
  • POST/PUT/DELETE product/work/*:核销端增删改

示例(列表)

  • 请求:GET /api/index.php?route=product&id=分类ID&page=1&brand_id=品牌ID&by=排序字段&sort=asc/desc
  • 响应:{ title, category_id, product_category, ... }

订单模块(order)

  • GET order:购物车首页(需登录)
  • GET/POST order/user/*:我的订单(index/show/cancel)
  • GET/POST/PUT/DELETE order/cart/*:购物车资源(cart_number/store/update/destroy)
  • POST order/checkout/*:结算流程(index/checkout_post/success/change_shipping/use_coupon)
  • GET/POST order/cashier/*:收银台(pay/pay_evidence)
  • GET/POST order/work/*:核销端(index/show/order_cancel/pay_check/tracking)

示例(购物车)

  • 请求:GET /api/index.php?route=order
  • 头部:Authorization: Bearer &lt;token>
  • 响应:{ title, cart }

版本管理与兼容性

  • 路由命名空间:所有路由名称以 api. 前缀组织,便于未来版本化(如 api.v1.*)
  • 向后兼容:新增动作优先以 optional/public 策略上线,逐步收紧至 required
  • 变更策略:保持旧路由可用,新路由通过子模块或新版本前缀引入

测试与调试

  • 本地调试:开启 DOU_DEBUG 后可获得更详细的异常信息
  • 工具建议:使用 Postman/Curl 构造请求,设置 Authorization 头与必要的请求体
  • 常见问题:
    • 401:检查 token 是否有效、是否过期
    • 403:检查鉴权模式与 work_required 策略
    • 404:检查 route 参数与模块/动作是否存在
    • 429:检查限流规则与重试间隔
添加日期:2026-10-05