微信凭据安全、租户与权限
凭据密文存储
wx_app 中的以下字段通过 WxCredentialTypeHandler 自动加解密:
secrettokenaes_key
Pro 的商户密钥与证书由独立支付模块管理,不纳入本模块凭据轮换。
数据库中保存的是带版本信息的 WXENC 密文,业务服务读取实体时得到明文。接口、日志、异常和页面都不应输出完整明文。
WX_CREDENTIAL_KEY_V1
密钥要求:
- 原始长度必须为 32 字节。
- 使用 Base64 传入环境变量。
- 同一环境的所有微信后台实例保持一致。
- 生产、预发布、测试环境使用不同密钥。
- 保存到密钥管理系统或部署平台 Secret,不能进入 SQL、Git、截图和工单正文。
生成后配置到所有微信后台实例,并通过账号健康中心确认凭据可以正常解密和获取 access token。
密钥轮换
密钥环支持多版本:
wx:
credentials:
primary-key-id: v2
keys:
v1: ${WX_CREDENTIAL_KEY_V1:}
v2: ${WX_CREDENTIAL_KEY_V2:}
推荐步骤:
- 新增
v2,暂时保留v1。 - 发布全部实例并确认都能读取旧密文。
- 将
primary-key-id切换为v2。 - 在账号健康中心执行凭据轮换或重新保存账号。
- 确认数据库密文版本和凭据检测正常。
- 确认所有凭据均已按
v2重新加密后,才允许移除v1。
任何实例仍使用旧配置时都不能提前删除旧密钥。
凭据与 API 权限分离
敏感操作使用独立权限:
| 能力 | 权限 |
|---|---|
| 凭据检测 | wx:wxapp:credential:check |
| API 额度清零 | wx:wxapp:quota:reset |
| 健康检查 | wx:wxhealth:check |
| 密钥轮换 | wx:wxhealth:rotate |
| API 调用诊断 | wx:wxapilog:diagnose |
| API 额度操作 | wx:wxapilog:quota |
不要把所有按钮权限直接授予普通运营角色。额度清零、密钥轮换、平台域名和 Open Platform 解绑应只授予平台管理员。
租户隔离
后端服务必须遵循:
- 从
TenantContextHolder获取租户。 - 查询
wx_app时显式带tenant_id。 - 校验账号存在后再校验
app_type。 - 账号下拉只返回非敏感字段。
- 微信回调根据可信 AppID 定位账号,但业务查询仍按租户授权。
典型错误“微信应用类型不正确”表示页面把公众号 AppID 传给小程序接口,或反之。消息、推广、客服三个运营模块的账号选择共用 /weixin/wxapp/list,显式传入 appType=1(小程序)或 appType=2(公众号)。服务端按实际账号类型和当前用户权限再次校验;其他专用工作台保留各自的账号资格查询接口。
权限命名
| 前缀 | 范围 |
|---|---|
wx:* |
平台级微信运营、第三方平台和可观测性 |
wxmp:* |
微信公众号能力 |
wxma:* |
微信小程序能力 |
页面按钮权限和后台接口权限必须保持一致。角色授权时应同时检查父菜单和具体操作按钮。
日志脱敏
禁止记录:
- access token、component access token、authorizer access token。
- AppSecret、Token、EncodingAESKey、商户密钥。
- 完整身份证件、备案材料和支付证书。
- 用户手机号、OpenID 等不必要的批量明文。
允许记录用于排障的 AppID、微信错误码、接口类别、耗时、请求摘要和脱敏后的响应摘要。
最小权限建议
- 运营:页面查看、内容编辑、消息发送、发布流程。
- 客服:客服账号、会话、聊天记录、输入状态。
- 版本验证人员:代码模板、体验成员、预览、提交审核,不授予线上发布。
- 运维:健康、API 日志、事件重放、告警处理。
- 平台管理员:第三方平台配置、授权账号、平台域名、Open Platform 绑定和密钥轮换。