推广码不是生成一张图片就结束了。真正有价值的是:用户扫码进入小程序后,系统知道他从哪里来,并且保存图片到相册时不越过隐私授权边界。这篇把生成、绑定和保存串起来。

一、推广码的核心是来源关系
小程序码是带参数的入口,人话说就是“用户扫码时把一段来源信息带进小程序”。图片只是载体,真正要记录的是邀请人、被邀请人和首次进入时间。
如果只生成二维码,不保存扫码关系,后面无法判断邀请效果。第一版先记录一次可信绑定,不要一开始就设计复杂的多级奖励。
先记录来源,再讨论奖励。
推广关系也要符合平台规则,不要把普通分享包装成强制拉人或诱导传播。
二、云函数生成小程序码
云函数调用 `wxacode.getUnlimited` 生成小程序码,从当前用户身份得到邀请人 ID,把短参数放进 `scene`,再把图片保存到云存储。
`scene` 不要直接放手机号、微信号等敏感信息。它只保存短 ID 或随机码,真实关系留在数据库。
const scene = createInviteCode(inviterId);
const code = await wxacode.getUnlimited({
scene, page: 'pages/index/index'
});
return saveToCloud(code, scene);
接口有参数长度、页面路径和调用频率限制,生成失败时要明确提示,不能拿空白图片显示成功。
三、扫码只在第一次绑定
用户扫码进入后,服务端解析 `scene`,确认邀请人不是自己,再检查当前用户是否已有来源。已经绑定过的用户不要因为再次扫码覆盖原邀请人。
如果用户尚未登录,可以先保存临时来源,登录后再绑定。匿名状态下不要直接计算有效邀请,避免重复计数。
绑定记录至少保存邀请人、被邀请人、来源码、首次进入时间和状态。
四、扫码和奖励是两件事
扫码只能说明用户进入过,不能证明他完成注册、发布帖子或购买会员。奖励条件应拆成“已扫码、已注册、已完成首笔订单”,每一步都可追溯。
同一种奖励对同一个被邀请人只能发一次。奖励记录要做幂等,不能靠页面按钮避免重复发放。
五、保存相册要配合隐私授权
调用 `wx.saveImageToPhotosAlbum` 涉及保存图片到用户设备。页面应说明用途,用户主动点击后再请求系统授权;拒绝时不循环弹窗,也不要影响无关功能。
wx.saveImageToPhotosAlbum({
filePath,
success: () => showToast('已保存'),
fail: () => showToast('未获得相册权限')
});
如果图片来自云存储,要先下载到本地临时路径。第 4 篇已经讲过隐私协议和授权时机,这里必须保持协议、页面和审核说明一致。
保存图片的权限,不能被推广奖励绑架。
写在最后
推广码真正要解决的是来源追踪,而不是做一张漂亮图片。把扫码、绑定、奖励和保存相册拆开,既方便排错,也不会把隐私授权和增长目标混成一个按钮。
如果你接下来要做推广功能,先画一条时间线:扫码、登录、绑定、奖励和拒绝授权后分别发生什么。
你更看重推广码的分享数量,还是能被验证的有效转化?