所有商家端接口使用 token 请求头;平台接口使用现有若依后台认证和权限注解。业务错误沿用 AjaxResult 与国际化消息。
基础路径:/merchant/subaccounts
GET /merchant/subaccounts仅主账号可调用。返回所属分管账号及授权店铺。
{
"code": 200,
"data": [
{
"userId": 501,
"name": "张三",
"phone": "+886900000001",
"ownerEnabled": true,
"platformEnabled": true,
"online": true,
"lastLoginAt": "2026-08-28T10:30:00",
"stores": [
{ "storeId": 101, "storeName": "店铺 A" },
{ "storeId": 102, "storeName": "店铺 B" }
]
}
]
}
POST /merchant/subaccounts仅主账号可调用。
{
"phone": "+886900000001",
"name": "张三",
"password": "前端RSA加密值",
"storeIds": [101, 102]
}
规则:手机号和登录名使用规范化后的同一手机号;手机号全局唯一;storeIds 非空且全部属于当前主账号;账号创建和授权写入同一事务;不创建钱包。
PUT /merchant/subaccounts/{subaccountUserId}仅所属主账号可调用,用于修改姓名和授权店铺。
{
"name": "张三",
"storeIds": [102, 103]
}
PUT /merchant/subaccounts/{subaccountUserId}/password仅所属主账号可调用。
{ "password": "前端RSA加密值" }
成功后撤销该分管账号现有商家 App/PC 会话,要求重新登录。
PUT /merchant/subaccounts/{subaccountUserId}/status仅所属主账号可调用,只修改主账号控制状态。
{ "enabled": false }
停用时立即撤销该账号商家 App/PC 会话;启用不能覆盖平台停用状态。
基础路径:/infouser/merchant-subaccounts
GET /infouser/merchant-subaccounts?merchantUserId={id}需要 infouser:user:list。merchantUserId 必须对应类型 1 主账号。响应结构与商家端列表一致,不返回密码、CID、Token 或商户敏感资料。
PUT /infouser/merchant-subaccounts/{subaccountUserId}/platform-status需要 infouser:user:edit。
{ "enabled": false }
只修改平台控制状态。停用时撤销会话;恢复后如果主账号控制状态仍为停用,账号仍不可用。
平台不提供新增、密码重置或店铺授权修改接口。
POST /infouser/user/shanglodeing现有接口扩展:允许 user_type=5。签发 Token 前校验平台状态、主账号控制状态和所属主账号状态;成功后更新 CID 与 lastLoginAt。类型 5 不执行商家资料审核或钱包逻辑。
POST /infouser/user/merchantLogout请求头:token。删除当前 JWT 对应 Redis 会话。前端在清除本地 token 前调用;删除失败不返回 Token 内容。
以下有效商家端能力必须统一使用登录身份和实际门店归属校验:
| 能力 | 主账号 | 分管账号 |
|---|---|---|
| 店铺列表 | 全部自有店铺 | 全部授权店铺 |
| 店铺详情、基础资料、营业状态、营业时间 | 自有店铺 | 授权店铺 |
| 新增、删除店铺 | 允许 | 拒绝 |
| 商品、分类、规格查询与维护 | 自有店铺 | 授权店铺 |
| 订单列表、详情、商家状态操作、退款 | 自有店铺 | 授权店铺 |
| 分管账号管理 | 允许 | 拒绝 |
| 收款配置、提现、结算、跨店财务 | 允许 | 拒绝 |
所有写接口不得使用请求体中的 userId、shId 作为授权依据;订单、商品等先按 ID 查询实际 mdId 再校验。
内部服务接口:
void sendStoreNotification(
Long storeId,
Long ownerUserId,
String titleKey,
String contentKey,
String body,
String orderNo
);
返回值不影响原订单事务。每个选中账号先生成自己的 push_message,再尝试外部推送;单个账号失败只记录日志。店铺无法解析时只向 ownerUserId 兜底。