在微信小程序里做带参分享 + 转化漏斗
一句话定义:在小程序的
onShareAppMessage/onShareTimeline里把inviter等参数塞进path/query,接收方页面onLoad解析出来落到 Cloudbase 数据库,再用云函数生成带 scene 的 wxacode 海报,组成一条可统计的拉新链路。预计耗时:30 分钟 | 难度:基础
适用场景
- 适用:已经接入 add-auth-wechat-miniprogram,想做邀请奖励 / 拉新分销 / 渠道追踪
- 适用:需要给营销活动生成可大量分发的小程序码海报
- 不适用:跨 App 分享(走不同的 SDK)
- 不适用:H5 网页分享
环境要求
| 依赖 | 版本 |
|---|---|
| 微信基础库(分享到聊天) | ≥ 1.2.4 |
| 微信基础库(分享到朋友圈) | ≥ 2.11.3 |
@cloudbase/js-sdk | 2.27.3 |
wx-server-sdk | latest(用于云调用 wxacode) |
另外需要:
- 已完成 add-auth-wechat-miniprogram 和 add-database-wechat-miniprogram
- 想用
cloud.openapi.wxacode.getUnlimited时,需要小程序和当前 env 已在控制台关联(同 add-subscribe-message-cloud-function)
第一步:分享按钮带参
在要被分享出去的页面里(假设是 pages/product/product.js),实现 onShareAppMessage。
// pages/product/product.js
Page({
data: {
productId: '',
},
onLoad(options) {
this.setData({ productId: options.id });
},
onShareAppMessage(res) {
// res.from: 'menu' (右上角分享) | 'button' (业务按钮)
const inviter = getApp().globalData.user?.customUserId || '';
return {
title: '我刚下单了这个,你也来看看',
path: `/pages/product/product?id=${this.data.productId}&inviter=${inviter}&channel=share`,
imageUrl: '/assets/share-cover.png', // 5:4 PNG/JPG,选填,不传用默认截图
};
},
});
页面布局上,要让用户主动触发,需要在 wxml 里加一个 <button open-type="share"> 业务按钮。
返回值的几个易疏漏点:
path必须以/开头imageUrl不传走默认截屏(微信会截当前可视区域),线上活动页通常自己提供一张固定图,避免截图时机不一致- 想异步组装(比如要 await 一次接口)时,把整个返回值改成
{ title, path, imageUrl, promise: someAsync() }
第二步:接收方解析参数 + 落库
被分享方点开后还是同一个页面,但 onLoad 的 options 会带上分享链接里的 query。
// pages/product/product.js,继续上面那段
import { db, auth } from '../../libs/cloudbase';
import { ensureLogin } from '../../libs/login';
Page({
async onLoad(options) {
this.setData({ productId: options.id });
const inviter = options.inviter;
const channel = options.channel;
if (!inviter) return;
await ensureLogin();
const me = auth.currentUser?.customUserId;
if (!me || me === inviter) {
// 邀请人和被邀请人是同一个,跳过
return;
}
// 落库到 share_events,用 inviter+invitee 复合唯一约束防重
await db.collection('share_events').add({
inviter,
invitee: me,
productId: options.id,
channel,
enteredAt: db.serverDate(),
});
},
});
注意:
share_events集合的权限模式建议设为「仅创建者可读写」,被邀请方写自己的记录,_openid自动带上- 重复进入应避免重复落库。最简洁的做法是云函数侧拿
(inviter, invitee, productId)做唯一索引,前端只管发,后端去重 - 如果做奖励发放,落库不等于发放,发放走云函数 + 内部状态机,不要直接信前端
第三步:朋友圈分享
朋友圈分享的接口是 onShareTimeline,基础库 ≥ 2.11.3 才支持,且 query 限制比群分享严:
Page({
onShareTimeline() {
const inviter = getApp().globalData.user?.customUserId || '';
return {
title: '我刚下单了这个,你也来看看',
query: `id=${this.data.productId}&inviter=${inviter}`,
imageUrl: '/assets/share-square.png', // 1:1 PNG/JPG
};
},
});
差异点:
- 朋友圈分享不能改
path,只能用「当前页面 + query」,所以接收方拿到的还是当前页 query不要带&channel=share这种业务标识也行,但建议加,后面统计要用- 用户的微信版本如果低于 7.0.15 / 基础库低于 2.11.3,微信里直接看不到「分享到朋友圈」按钮,这时分享方的
onShareTimeline不会被调用,业务上可以不显式判断 - 朋友圈打开是一个「单页模式」,部分 wx API 不可用,不要在落库逻辑里依赖这些 API