应直接使用 uni-sec-check 进行云端内容安全检测,避免自行实现本地词库或拼接微信接口;需图形化安装、正确传参(provider='mp-weixin'、context.requestId、openid 和 scene 缺一不可)、version 为数字 2、content 为纯字符串;检测后仅对 suggestion 为 'pass' 或 'review' 的内容做轻量正则替换,高危内容直接拒绝;小程序端文本提取须正则去标签,避免依赖不可靠的 rich-text nodes 或第三方解析器。

直接用 uni-sec-check 做云端检测,别自己写本地词库或手拼微信接口——90% 的 errcode: 40001、87014、47001 都源于初始化错、参数漏或没走公共模块路径。
uni-sec-check 必须图形化安装,不能 npm install
uniCloud 公共模块只认 HBuilder X 图形化引入路径。右键项目 →「管理公共模块依赖」→ 搜索 uni-sec-check → 点击安装。云函数里写 require('uni-sec-check') 却报 Module not found,基本就是这一步没做对。
-
provider必须显式传'mp-weixin',填'wx'、空字符串或缺省都会初始化失败 - 云函数中初始化要带
context.requestId;云对象中必须用this.getUniCloudRequestId() - 装完立刻在云函数里加一行
console.log(UniSecCheck.version),输出undefined说明根本没加载成功
textSecCheck 调用时 openid 和 scene 缺一不可
V2 接口强制校验用户身份和场景合理性,漏掉任一字段就报错。尤其 openid 不能写死、不能 mock,必须从 uni-id-common 获取:
- 确保已启用
uni-id-common云模块(用于调uniID.getCurrentUserInfo()) -
scene按实际填整型:1(用户资料)、2(评论/帖子)、3(群聊),微信审核会核对 -
version固定为数字2,传字符串"2"也会失败 -
content必须是纯字符串,含 HTML 标签、JSON 或富文本序列化结果会触发87014误判
检测通过后怎么安全替换敏感词
微信接口不返回具体命中词,只给 suggestion(pass/review/block)和风险类型。所以「自动替换」必须分两步:
- 高危内容(
suggestion === 'block')直接拒绝提交,不进替换流程 - 仅对
suggestion === 'pass'或'review'的内容做本地替换,用轻量正则匹配常见变体:str.replace(/你[妈爷]的?/g, '***') - 避免遍历敏感词数组做
indexOf或slice匹配——性能差、漏长词、易被绕过 - 若需更高精度的本地过滤(如 App/H5 端实时输入拦截),可用
nex-wordfilter插件,但注意它不支持小程序
小程序端提取纯文本再过滤容易踩坑
别用 rich-text 的 nodes 数组取文本——它不是 DOM,是 uni-app 渲染中间结构,语义失真、节点被拆分合并、嵌套超限直接丢子节点。
- H5/App 端推荐
DOMParser+textContent,但务必先删掉<script></script>、、onerror=等 XSS 风险片段 - 小程序端不支持
DOMParser,只能正则兜底:htmlString.replace(/]*>/g, '').replace(/\s+/g, ' ').trim(),但无法区分和,换行逻辑会乱 -
mp-html或u-parse的getText方法也不可靠,它们基于自身虚拟节点树,同一份 HTML 输出长度可能差 20%+
真正难的不是“怎么替换”,而是判断该不该替换——suggestion === 'review' 是微信明确提示“不确定,需人工复核”,这时候硬替换成 *** 反而掩盖真实风险。业务层得把这类内容单独路由到审核队列,而不是塞进正则流水线。











