必须走canvas手动绘制+uni.uploadFile上传CDN链路,因wxml2canvas和页面截图在小程序不可用,网络图须先downloadFile再drawImage,onShareTimeline的imageUrl必须是HTTPS直链且5秒内完成。

必须走 canvas 手动绘制 + uni.uploadFile 上传 CDN 的链路,否则 onShareTimeline 的 imageUrl 字段无效,朋友圈卡片降级为纯文字。
为什么 wxml2canvas 和页面截图都不可用
微信原生的 wxml2canvas 依赖 WXML 节点树和 SelectorQuery API,而 uni-app 编译后在非微信平台无等价上下文;即使在微信小程序平台,也常因 cover-view 不支持、节点未就绪、rpx 单位错乱导致白屏或缺元素。页面截图(如 plus.nativeObj.Bitmap)仅适用于 App 端,在小程序环境根本不可调用。
常见错误现象包括:ctx.draw() 后 canvas 内容为空、uni.canvasToTempFilePath 成功回调不触发、朋友圈卡片只显示默认图标。
canvas 绘制必须先 downloadFile 再 drawImage
小程序端不允许 ctx.drawImage 直接加载网络图 URL(如头像、背景、二维码),否则静默失败——不报错、不绘制、不提示。所有网络资源必须先调用 uni.downloadFile 下载到本地临时路径,再传给 drawImage。
-
uni.getImageInfo只能用于本地路径或已配置 CORS 的 H5 图片;对小程序网络图无效,不能跳过downloadFile - 二维码建议前端用
qrcode.js生成 base64,再用uni.getFileSystemManager().writeFile写入临时文件,避免后端拼图带来的鉴权和防盗链问题 - 所有尺寸单位必须是
px,别写rpx;不同设备 DPR 差异大,推荐固定物理像素(如750×1000或朋友圈推荐的1242×1242)
onShareTimeline 的 imageUrl 必须是 HTTPS 直链
uni.canvasToTempFilePath 返回的是本地临时路径(如 wxfile://xxx),微信朋友圈完全不认;canvas.toDataURL() 返回的 base64 也不被支持,会触发 “invalid image url” 错误。
正确流程只有且仅有这一条闭环:
- canvas 绘制完成 → 调
uni.canvasToTempFilePath生成临时文件 - 用
uni.uploadFile把该文件上传到你自己的 CDN 或云存储(如腾讯云 COS、阿里云 OSS) - 后端必须返回可公网直访、无鉴权、无重定向的 HTTPS 地址(如
https://cdn.example.com/poster_abc123.jpg),建议加时间戳或 hash 防缓存 - 把该 HTTPS 地址赋值给
onShareTimeline返回对象的imageUrl字段
注意:整个流程必须在用户点击右上角分享按钮后 5 秒内完成,超时则静默回退为纯文字链接;不能在 onLoad 预生成,必须实时触发。
容易被忽略的尺寸与时机硬约束
朋友圈卡片对图片质量和执行时机极其敏感。不是“能出图”就行:
- 尺寸推荐
1242×1242px(正方形),最低不得小于300×300px;安卓微信 8.0.33+ 会检测宽高比,非正方形可能被拉伸或居中裁切 - 图片体积建议控制在
120KB以内,否则微信后台会强制压缩,导致模糊 - 动态内容(如用户昵称、实时价格)必须在
onShareTimeline内实时读取,不能依赖页面 data 缓存,否则可能过期或错乱
真正卡住人的从来不是“怎么画”,而是“哪一步没等资源就 draw”“哪一张图漏了 downloadFile”“哪一次 upload 返回的是内网地址或 302 跳转”。每一步都要稳,少一个 await,就少一张图。


















