支付宝小程序必须用my.setclipboard而非uni.setclipboarddata,因后者静默失效;其入参为text字符串,仅企业主体支持,且须用户手势触发。

支付宝小程序必须用 my.setClipboard,不是 uni.setClipboardData
支付宝小程序不走 uni-app 的统一 API 通道,uni.setClipboardData 在支付宝小程序里完全无效,调用后既不 success 也不 fail,静默失败。必须直接调用支付宝原生 API:my.setClipboard(写入)和 my.getClipboard(读取)。
常见错误现象:在支付宝小程序里写了 uni.setClipboardData({data: 'xxx'}),点击没反应、控制台无报错、剪贴板也没变——根本没进支付宝的执行链路。
-
my.setClipboard入参是text字段(不是data),且必须为字符串 - 必须在用户点击等手势回调中同步调用,不能放在
setTimeout或Promise.then里 - 个人主体的小程序会直接报错
fail: {error: 4, errorMessage: "permission denied"},仅企业主体支持该 API
my.setClipboard 的正确调用姿势和参数细节
支付宝文档明确要求传 text 字符串,且不接受 null、undefined、对象或数字——哪怕传 123 都会触发 error: 2(接口参数无效)。
示例写法:
my.setClipboard({
text: String(this.orderId), // 必须显式转字符串
success: () => {
uni.showToast({ title: '已复制', icon: 'none' });
},
fail: (err) => {
console.error('复制失败', err);
// err.error === 2 → 参数不对;err.error === 4 → 主体不合规
}
});
- 不要写
data字段,支付宝只认text - 若内容来自异步请求(如接口返回订单号),务必先判空再传:
if (orderId) my.setClipboard({text: String(orderId)}) - 支付宝基础库 ≥ 2.9.55 会自动弹 toast,无需自己
uni.showToast,但建议仍保留以便降级兼容
读取剪贴板要用 my.getClipboard,别混用 uni.getClipboardData
uni.getClipboardData 在支付宝小程序里同样不生效,必须用 my.getClipboard,它返回的是 { text } 结构,不是 { data }。
典型错误:用 uni.getClipboardData 拿到 res.data,结果一直是 undefined —— 因为支付宝根本没响应这个调用。
-
my.getClipboard成功回调的参数是{ text },直接取res.text - 读取前无需额外权限申请,但若用户从未授权过剪贴板,部分旧版本可能返回空字符串(非报错)
- 注意:支付宝不提供「读取前校验权限」的 API,只能靠
fail回调捕获异常
真机调试时 fail 回调里 err.error === 4 是最常被忽略的硬限制
很多开发者本地模拟器能跑通,一上真机就失败,fail 回调里打印出 {error: 4, errorMessage: "permission denied"} —— 这不是代码问题,而是支付宝平台策略:仅企业主体小程序允许调用剪贴板 API。
检查路径:支付宝开放平台 → 小程序管理后台 → 基本信息 → 查看「主体类型」是否为「企业」。
- 个人/个体工商户主体无法绕过此限制,连配置 manifest 权限都没用
- 测试阶段可用企业主体测试号临时验证逻辑,但上线必须用企业资质发布
- 别试图用 H5 fallback 方案补救——支付宝小程序 WebView 不支持
navigator.clipboard,document.execCommand也已被禁用
跨端项目里,支付宝小程序的剪贴板是唯一需要单独适配、且受主体资质强约束的一环,写条件编译时得把它单拎出来处理。











