开放接口文档
开放平台接口文档
\\\\n本文说明对外接口(OpenAPI 3.0)的接入方式、签名规则、端点清单与错误码。所有内容均取自本站代码实读(app/middleware/OpenApiAuth.php、app/controller/openapi/Doc.php、route/app.php)。
1. 接入地址
\\\\n| 项目 | 值 |
|---|---|
| 接口基址 | https://www.huiyingclub.com/openapi/v1 |
| 实时契约(YAML) | /openapi/v1/doc(免鉴权) |
| 健康检查 | /openapi/v1/health(免鉴权) |
| 接口版本 | 仅 v1(Api-Version 请求头或 version 参数协商) |
已确认:契约 YAML 内 servers.url 当前已指向本站 https://www.huiyingclub.com/openapi/v1(r164 已完成由物业站 web.zhsqzfxt.com 迁移后的地址修正)。
2. 鉴权与签名
\\\\n2.1 公共参数
\\\\n| 参数 | 位置 | 说明 |
|---|---|---|
appid | query / body | 应用标识,由平台分配 |
timestamp | query / body | Unix 秒级时间戳,与服务端偏差不得超过 300 秒 |
nonce | query / body | 随机串,5 分钟内不可重复(防重放) |
sign_type | query / body | HMAC-SHA256(默认)或 RSA-SHA256 |
encrypt_type | query / body | 仅支持 none(AES 预留未实现) |
X-Sign | 请求头 | 签名值。不要放进 URL,避免签名进入 nginx 访问日志 |
2.2 待签串与签名计算
\\\\n- \\\\n\\\\t
- 收集全部请求参数(GET query + POST body); \\\\n\\\\t
- 剔除
sign,并剔除值为空(''/null)的参数; \\\\n\\\\t - 按参数名升序排序(
ksort); \\\\n\\\\t - 做
http_build_query得到待签串; \\\\n\\\\t - 计算签名:\\\\n\\\\t\\\\t
- \\\\n\\\\t\\\\t\\\\t
- HMAC-SHA256:
hash_hmac('sha256', 待签串, appsecret),取小写十六进制; \\\\n\\\\t\\\\t\\\\t - RSA-SHA256:对待签串做 SHA256 私钥签名后
base64,服务端用应用公钥openssl_verify校验。 \\\\n\\\\t\\\\t
\\\\n - HMAC-SHA256:
2.3 安全约束
\\\\n- \\\\n\\\\t
- 时间戳窗口:±300 秒(
OpenApiAuth::TS_DIFF) \\\\n\\\\t - nonce 防重放窗口:300 秒(
NONCE_TTL) \\\\n\\\\t - 限流:100 次/分钟/应用(
RATE_LIMIT) \\\\n\\\\t - 支持按应用配置 IP 白名单 \\\\n\\\\t
- 接口异常不会返回 HTTP 500,统一以
HTTP 200 + code信封返回 \\\\n
3. 免鉴权端点
\\\\n以下路径前缀在 OpenApiAuth::PUBLIC_PREFIX 中配置为免签名校验:health、oauth/authorize、oauth/token、oauth/refresh、doc、metrics。
路由开放状态:health 与 doc 已在 route/app.php 显式注册,当前可直接访问;oauth/authorize、oauth/token、oauth/refresh、metrics 已注册路由并对外可达(GET 返回实时计数 rate_limited/auth_fail/exception),OAuth2 其余端点(token/refresh/revoke/authorize)路由亦已打通,详见第 4 节状态列。
4. 端点清单
\\\\n| 方法 | 路径 | 说明 | 主要参数 | 状态(2026-09-20 复测,数据层已就绪) |
|---|---|---|---|---|
| GET | /health | 健康检查 | — | 已开放(免鉴权) |
| GET | /member/info | 会员信息 | mid(必填,会员ID) | 已开放(需签名) |
| GET | /member/level/list | 会员等级列表 | — | 已开放(需签名) |
| GET | /mall/category/list | 商城分类列表 | — | 已开放(需签名) |
| GET | /oauth/authorize | 获取授权码(OAuth2 授权码模式) | client_id、redirect_uri,可选 scope/state/code_challenge | 已开放(可达) |
| POST | /oauth/token | 获取访问令牌 | client_id、client_secret、grant_type、code 或 refresh_token | 已开放(可达) |
| POST | /oauth/refresh | 刷新访问令牌 | 同 /oauth/token | 已开放(可达) |
| POST | /oauth/revoke | 吊销令牌(RFC 7009) | token 或 access_token 或 Authorization: Bearer | 已开放(需签名) |
| GET | /metrics | 运行指标(限流/鉴权失败/异常计数) | — | 已开放(可达) |
数据层说明:开放平台所需的 5 张数据表(ddwx_openapi_app、ddwx_openapi_oauth_code、ddwx_openapi_oauth_token、ddwx_openapi_fee_order_rel、ddwx_openapi_log)已于 2026-09-20 在生产库创建,并初始化了运营站应用凭证。上方各签名 / OAuth2 端点现已返回真实业务响应(不再因缺表而 500)。联调示例:GET /oauth/authorize → 取 authorization_code → POST /oauth/token(grant_type=authorization_code)换取 access_token / refresh_token。
5. OAuth2 Bearer 方式
\\\\n除签名外,也支持在请求头携带 Authorization: Bearer <access_token>,服务端在 ddwx_openapi_oauth_token 表中校验令牌有效性。
6. 错误码
\\\\n| code | 含义 |
|---|---|
| 0 | 成功(响应信封 code 字段;HTTP 状态恒为 200) |
| 1001 | 缺少签名公共参数 / X-Sign 缺失 / 版本不支持 / 加密方式不支持 / 缺少必填业务参数 |
| 1002 | 签名错误,或应用未配置 RSA 公钥 / client_secret 错误 |
| 1003 | 时间戳无效或已过期 |
| 1004 | nonce 重复,疑似重放攻击 |
| 1005 | appid 不存在 |
| 1006 | 应用已被禁用 |
| 1007 | IP 不在白名单 |
| 1009 | 令牌无效或已过期(OAuth2 体系) |
| 2001 | 业务对象不存在(会员 / 地址 / 活动 / 返现明细等,具体见 data.msg) |
| 3001 | 业务处理失败(具体原因见 data.msg) |
| 429 | 请求过于频繁(触发限流) |
7. 响应结构
\\\\n{\\\\n "code": 0,\\\\n "msg": "success",\\\\n "data": { }\\\\n}\\\\n\\n\n