微信小程序调用剪贴板api需四步:公众号后台申报「读取剪贴板」并审核通过;manifest.json中显式配置scope.writeclipboard及desc;调用必须在用户点击事件同步上下文中执行;首次拒绝后需引导用户手动开启授权。

微信小程序必须在公众号后台勾选「读取剪贴板」并提交审核
uni-app 小程序端调用 uni.setClipboardData 或 uni.getClipboardData 在真机上失败,最常见的原因是没走微信官方的隐私权限申报流程——仅在 manifest.json 里配了权限还不够,必须同步在微信公众平台完成用户授权声明。
这个环节不完成,iOS 真机会直接返回 scope is not declared in the privacy agreement,Android 和微信安卓客户端也可能静默拒绝,且控制台无明显报错。
- 登录 微信公众平台 → 左侧【设置】→【基本设置】→【服务内容声明】→【用户隐私指引】
- 点击【更新】→【增加信息类型】→ 勾选「读取剪贴板」
- 填写使用场景(如“用于复制邀请链接”或“粘贴口令”),不能留空或写“无用途”
- 生成新指引并提交审核(通常1–2个工作日)
- 审核通过后,**必须清除微信缓存**:长按小程序图标 →「清除缓存」→ 重新进入
manifest.json 中 mp-weixin 节点必须显式声明 scope.writeClipboard
即使后台已提交审核,manifest.json 里没配对应权限字段,小程序基础库仍会拦截调用。这个配置是运行时校验的第一道关卡。
在 manifest.json 的 mp-weixin 对象下添加:
"permission": {
"scope.writeClipboard": {
"desc": "用于复制链接"
}
}
注意:desc 字段必须存在且为字符串,不能省略;值不需要和后台填写的完全一致,但语义需合理。删掉这整段或拼错 key 名(比如写成 scope.writeClipBoard),都会导致真机调用直接失败。
调用必须由用户点击事件同步触发,不能异步延迟
微信强制要求剪贴板 API 必须在用户手势(tap/click)的**同步执行上下文**中调用。任何异步链路都会丢失该上下文,系统判定为“非主动行为”,直接拒绝。
- ❌ 错误写法:
onLoad里直接调、setTimeout(() => uni.getClipboardData(), 0)、Promise.then(() => uni.setClipboardData()) - ✅ 正确写法:按钮绑定
@click="handleCopy",并在handleCopy函数体第一行就调用uni.setClipboardData - 如果复制内容需要先请求接口,建议用
await链保证顺序,但整个函数仍需挂载在用户点击事件上,不能脱离该响应链
首次读取会弹系统级授权弹窗,拒绝后无法再次触发
uni.getClipboardData 在 iOS 微信环境首次调用时,一定会弹出系统原生提示:“是否允许[你的小程序]访问剪贴板?”。用户点「不允许」后,后续所有调用都返回空字符串,errMsg 为 getClipboardData:fail auth deny。
这个拒绝状态是持久化的,不会因为重新进小程序或重启微信而重置。
- 代码无法主动再次唤起该弹窗(微信禁止重复触发)
- 必须引导用户手动前往:微信 → 「我」→「设置」→「隐私」→「小程序授权管理」→ 找到你的小程序 → 开启「剪贴板」
- 可在
fail回调里检测err.errMsg.includes('auth deny'),然后弹出友好提示 + 跳转引导
uni.setClipboardData,而是让整个调用路径始终落在微信的权限模型、用户交互约束和系统安全策略之内——漏掉任意一环,它就只是个不报错也不干活的空函数。











