F8LINK · 操作手册

微信服务号信号推送:实现方案与分工

信号审核通过后,通过 F8LINK 微信服务号的“模板消息”,一对一通知有权限查看这条信号的用户。本文写清楚需求方、后端程序员、前端程序员分别要做什么,以及上线前必须确认的风险。

1先说结论

问题结论
能不能一对一推送能。这是微信官方允许的方式,不会像个人微信号那样被封。前提是用户关注了 F8LINK 服务号,并且把服务号和 F8LINK 账号绑定(系统拿到用户在服务号下的 openid)。
用什么功能服务号的“模板消息”。只有已认证的服务号能用;订阅号、未认证的服务号都不行。
消息能写什么只能从微信的模板库里选一个模板,按模板的字段填内容,每个字段有字数限制(例如文字字段最多 20 个字),不能自由写长文,也不能写营销内容。所以消息只写“哪套策略发了新信号”,用户点进来看完整信号。
最大的风险① 服务号必须用公司主体注册并完成微信认证,认证没通过,模板消息、带参数二维码、网页授权都用不了;② 黄金交易信号属于金融类内容,模板消息是否会被判定为营销、服务号类目能否通过,需要先问清楚、最好先做法务评估。这两点不确定,后面开发都白做。
工作量(估)开发约 2 周(后端 7–8 天,前端 + 后台 4–5 天,可并行),加联调测试 3–4 天。服务号注册认证、模板申请的时间由微信审核决定,建议需求方现在就开始办。

2整体流程

① 绑定(每个用户一次) F8LINK 我的→ 微信通知 带参数二维码里面带着这个用户的绑定凭证 微信扫码关注F8LINK 服务号 微信回调后端关注事件里有 openid+ 绑定凭证 后端保存绑定关系F8LINK 用户 ↔ openid ② 推送(每条信号) 后台审核通过信号发布 筛选通知对象已绑定 + 开启通知+ 有权限查看 推送队列逐个调用发送接口 用户微信收到“服务通知” 点“查看详情”微信内打开信号详情网页授权自动识别账号 微信回调发送结果 → 后台“推送记录”显示成功 / 拒收 / 失败
为什么用“带参数二维码”绑定F8LINK 是网页,用户大多不在微信里打开它,没法直接拿到 openid。带参数二维码把“这是哪个 F8LINK 用户”藏在二维码里,用户扫码关注的那一刻,微信把 openid 和这个凭证一起回调给后端,绑定就自动完成了,用户不需要输入任何东西。

3开工前必须确认的前提与风险

事项说明谁确认
① 注册主体服务号要用 F8LINK 的公司主体注册并完成微信认证。主体资料、认证所需材料和审核时间,以微信公众平台办理时的要求为准;主体一旦确定,后续认证年审、类目资质都用这个主体,建议一开始就选定长期使用的主体。需求方
② 账号类型必须注册服务号,不是订阅号。服务号和订阅号注册后不能互相转换,选错要重新注册。并且必须完成微信认证(每年需要年审,认证费用以平台为准)。需求方
③ 内容合规模板消息只能用于“重要的服务通知”,营销、广告类内容会被拦截(接口会返回“营销内容被禁止”的错误),严重的会被收回模板消息权限。黄金交易信号属于金融类内容:服务号选什么类目、需要什么资质、新信号通知会不会被判定为营销,建议先咨询法务,并在申请类目时向微信说明用途。我们的设计已经尽量规避:只通知付费或已授权的用户、消息里不写价格、不写收益承诺。需求方(法务)
④ 域名“网页授权”需要在服务号后台配置 F8LINK 的域名,并把微信给的校验文件放到域名根目录。需要 F8LINK 自己的正式域名(不要用临时的 pages.dev 地址);部分配置可能要求域名完成 ICP 备案,以平台提示为准。另外如果用户主要在中国大陆,网站本身在大陆的访问速度也要一起评估。需求方 + 后端
⑤ 用户必须关注不关注服务号就收不到。需要在产品里引导(订阅成功页、信号页、我的),并接受“一部分用户不会去关注”。三方知悉

4需求方要做什么

4.1 开发前(越早越好)

1
确认注册主体,注册“服务号”
在微信公众平台(mp.weixin.qq.com)用公司主体注册,账号类型选服务号。准备:营业执照或公司注册文件、管理员微信(需实名,建议用公司负责人或长期在职员工)、公司对公信息。名称建议就叫“F8LINK”,头像用新 logo。
2
完成微信认证
在公众平台后台“设置与开发 → 微信认证”提交材料并付认证费。没有认证就不能用模板消息、带参数二维码和网页授权,开发联调也会卡住。认证每年需要年审,记得续。
3
法务评估 + 选择类目
确认金融类内容的类目、资质要求和推送内容的边界(见第 3 节第 ③ 点)。结论要书面给到产品和开发。
4
开通模板消息,选模板
在公众平台后台“广告与服务 → 模板消息”开通,设置所属行业(行业每月只能改一次),从模板库里找一个适合“订阅内容更新 / 服务通知”的模板加入“我的模板”,把模板 ID 和字段列表发给后端。找不到合适模板时可按平台流程申请。消息内容设计见第 7 节。
5
把开发配置交给后端(安全方式传递)
在“设置与开发 → 基本配置”里:
  • 把 AppID、AppSecret 交给后端负责人(AppSecret 等同于密码,不要发群里,只给一个人,开发完成后可重置);
  • 把后端提供的服务器 IP 加进“IP 白名单”;
  • 按后端提供的地址填写“服务器配置”(URL、Token、EncodingAESKey,建议选“安全模式”)并启用;
  • 在“网页授权域名”里填 F8LINK 正式域名,按提示上传校验文件(交给后端放)。
6
服务号自身运营设置
· 关注后自动回复:例如“欢迎关注 F8LINK!如果你是在 F8LINK 网站扫码关注的,账号已自动绑定,有新信号会在这里通知你。”
· 底部菜单:“进入 F8LINK”(网站链接)、“信号通知设置”(我的 → 微信通知)、“联系客服”。
· 指定一名运营负责服务号后台(查看消息、处理用户留言)。

4.2 上线后日常

场景怎么做
每年认证到期提前 1 个月年审,过期会导致模板消息、二维码、网页授权全部失效。
后台“推送记录”失败多先看是否大量“用户拒收”(用户在微信里关掉了消息,属正常);如果是“发送失败”,通知后端排查。
收到微信平台违规提醒立刻在后台“微信服务号 → 推送设置”关闭新信号通知,通知产品和法务,按提醒整改后再开。
更换模板或模板被下线在公众平台选新模板,把新模板 ID 和字段给后端更新配置。
更换管理员 / 重置 AppSecret重置 AppSecret 后必须马上交给后端更新,否则推送中断。

5后端程序员要做什么

5.1 基础接入

1
access_token 统一管理
用 AppID + AppSecret 获取 access_token(有效期约 2 小时),由一个服务统一获取、缓存、提前刷新,其他模块都从缓存取,不要各自去取(会互相把对方的 token 刷失效)。调用服务器的出口 IP 要加进公众平台的 IP 白名单。
2
服务器回调地址
提供一个 HTTPS 地址给公众平台“服务器配置”:实现 GET 校验(签名验证)、POST 接收事件(安全模式需加解密)。要求 5 秒内应答,先应答再异步处理,并按消息 ID 去重(微信会重试)。要处理的事件:
  • subscribe(新关注,若是扫带参数二维码,EventKey 为 qrscene_凭证)
  • SCAN(已关注用户扫带参数二维码,EventKey 为凭证)
  • unsubscribe(取消关注 → 解除绑定)
  • TEMPLATESENDJOBFINISH(模板消息送达结果:success / failed:user block / failed:system failed)

5.2 账号绑定

3
数据表
user_wechat_bind
  user_id        F8LINK 用户编号(唯一)
  openid         服务号下的 openid(唯一)
  bound_at       绑定时间
  notify_on      是否接收新信号通知(默认开)
  strategy_off   用户关掉的策略,如 "C,E"
  status         bound / unbound

wx_bind_ticket   (绑定凭证,30 分钟有效,用后作废)
  token, user_id, expire_at, used_at
4
生成带参数二维码(接口给前端)
前端在“微信通知”页请求 → 后端生成一次性随机凭证 → 调用微信“生成带参数临时二维码”接口(字符串场景值,有效期 30 分钟)→ 返回二维码图片地址给前端。前端每 3 秒查询一次绑定状态(或用 WebSocket),绑定成功后页面切换为“已绑定”。
5
处理扫码事件,完成绑定
收到 subscribe / SCAN 事件 → 取出凭证 → 校验未过期、未使用 → 绑定 openid 与 user_id。规则:一个 F8LINK 账号只绑一个微信;同一个微信再绑别的账号时,先解除旧绑定。绑定成功后可回复一条客服文字消息“已绑定 F8LINK 账号 xxx@xx.com”(在用户互动后 48 小时内可用客服消息接口回复)。
6
微信内打开信号详情:网页授权自动识别账号
消息里的“查看详情”链接在微信内置浏览器打开,用户在这里通常没有登录 F8LINK。处理:检测到微信浏览器且未登录 → 跳微信网页授权(scope=snsapi_base,静默、无需用户确认)→ 拿到 openid → 查绑定表 → 已绑定就直接登录。这一步要做,否则用户点进来还要输账号密码,体验很差。

5.3 推送

7
审核通过 → 生成推送任务
在“审核通过”逻辑里,信号发布后创建推送任务(异步,失败不能影响审核本身)。筛选通知对象:
  • 已绑定、notify_on = 开;
  • 信号可查看对象 = 所有登录用户 → 以上全部;
  • 信号可查看对象 = 仅订阅本策略的会员 → 只要订阅了该策略、且没在 strategy_off 里关掉该策略的;
  • 账号被冻结的不发。
8
发送与记录
队列逐个调用模板消息发送接口(参数:openid、template_id、data、url = 信号详情链接),用 client_msg_id = 信号编号_用户编号 防重复。记录表:
wx_push_log
  signal_id, user_id, openid, msgid,
  status   sending / success / user_block / failed
  error    错误码,  created_at, finished_at
发送失败(系统错误)自动重试 1 次;收到 TEMPLATESENDJOBFINISH 回调后更新状态。遇到“营销内容被禁止”“模板被限制”这类错误,立即暂停推送并告警,不要继续批量发。
9
给前台和后台的接口
前台:获取二维码、查询绑定状态、开关通知、按策略开关、解除绑定。后台:推送设置(总开关、模板 ID 配置,AppSecret 等密钥只放服务器配置不进后台)、推送记录(按信号汇总:目标人数、成功、拒收、失败,可重发失败)、用户列表返回绑定状态。

6前端程序员要做什么

6.1 Web 前台(已在原型中)

1
“我的 → 微信通知”页面
未绑定:显示带参数二维码(30 分钟有效,可刷新)+ 三步说明;轮询绑定状态,绑定成功自动切换。手机浏览器上不能“扫自己屏幕”,要提示“截图保存后在微信扫一扫里从相册选择”。已绑定:显示绑定时间、总开关、按策略开关(只能选有权限的策略)、解除绑定。页面下方展示通知样例。
2
引导入口
支付成功页(未绑定时)、信号页顶部提示条(已登录未绑定时)、“我的”菜单、Q&A“微信通知”分组。
3
微信内打开的处理
识别微信内置浏览器(UA 含 MicroMessenger)→ 未登录时走后端的网页授权跳转 → 回来后自动登录并打开对应信号。信号详情页链接格式:正式域名/#s=信号编号。

6.2 管理后台(已在原型中)

4
“微信服务号”菜单
推送设置:服务号信息(名称、AppID 部分隐藏、认证状态、回调连接状态、已绑定人数)、新信号通知总开关、模板 ID、消息预览、推送规则说明。推送记录:按信号列出目标人数、成功、用户拒收、失败,可“重发失败”。
5
其他调整
用户信息列表增加“微信通知:已绑定 / 未绑定”;信号审核通过弹窗提示“将通知哪些用户”;角色权限增加“服务号推送设置”“服务号推送记录”。

7消息模板设计

模板消息不能自定义版式,只能选模板库里的模板,按字段填值。字段有类型和长度限制,例如:文字类(thing)1–20 个字、编号类(character_string)最多 32 位、时间类(time)。所以内容要短,只做“提醒”,详细内容让用户点进来看。

订阅内容更新提醒(模板标题以实际选到的为准)
订阅内容策略 B 单边趋势 · 新信号
品种方向XAUUSD 买入
发布时间2026-11-06 14:30
查看详情 ›
写法原则
  • 只写“哪套策略发了新信号 + 方向 + 时间”,不写入场价、止盈止损(一是字段放不下,二是付费内容不能出现在微信里被转发,三是降低被判为营销的风险);
  • 不写“稳赚”“翻倍”“限时优惠”等营销或收益承诺用语;
  • 点击跳转:信号详情页(微信内自动识别账号);
  • 字段名称、个数以选中的模板为准,需求方选好模板后,后端按模板字段做映射。

8上线流程与排期

#事项负责时间(估)
1确认主体、法务评估、注册服务号并提交认证需求方立即开始;审核时间由微信决定
2开通模板消息、选模板;交付 AppID / AppSecret、模板 ID需求方认证通过后 1–3 天
3token 管理、回调、绑定、网页授权、推送队列与记录后端7–8 个工作日
4前台微信通知页与入口、微信内自动登录;后台推送设置与记录前端4–5 个工作日(与后端并行)
5联调:用测试账号走完“扫码绑定 → 审核信号 → 收到通知 → 点开自动登录 → 取消关注自动解绑”三方3–4 个工作日
6小范围试运行(内部 + 少量会员),观察拒收率和平台提醒,再全量开启需求方3–5 天
开发不必等认证完成后端可以先按文档完成代码,用微信提供的“接口测试号”做联调(测试号可以测试模板消息、二维码和网页授权),认证通过后再切换到正式服务号。

上线验收清单

  1. 未登录点“微信通知”会先要求登录;登录后二维码正常显示,30 分钟过期可刷新
  2. 新关注扫码、已关注扫码两种情况都能绑定成功,页面自动显示“已绑定”
  3. 同一微信绑定第二个账号时,第一个账号自动解绑
  4. 审核通过“所有登录用户可见”的信号:所有已绑定且开启通知的用户都收到
  5. 审核通过“仅订阅策略 B”的信号:只有订阅了 B 且没关 B 的用户收到;免费用户、订阅 A 的用户收不到
  6. 点“查看详情”在微信内打开,自动登录并显示该信号
  7. 关闭通知 / 关闭某策略 / 取消关注服务号后不再收到
  8. 后台推送记录的成功、拒收、失败数与实际一致;关闭总开关后审核通过不再推送

9常见问题

问题回答
和之前“微信群推送”有什么不同?群推送靠程序模拟真人操作个人微信,有封号风险、只能发群。服务号推送是微信官方接口,一对一、能按权限精确推送、不会封号,代价是要认证服务号、用户要关注并绑定,且内容只能用模板。
用户没关注服务号能收到吗?不能。所以要在产品里多处引导绑定。
一天能发多少?模板消息有每日调用上限(官方文档写的是 10 万次 / 天,粉丝量大时会提高,以公众平台开发者中心显示为准)。按目前的信号量和用户规模,远远够用。
能不能顺便推“止盈 / 止损结果”“会员到期提醒”?技术上可以,用同一套绑定和队列。“会员到期提醒”属于典型的服务通知,比较安全;信号结果通知建议等新信号通知稳定运行、确认不被判营销后再加。
用户说收不到?按顺序查:是否已绑定 → 是否开启通知、是否关了该策略 → 是否有权限看这条信号 → 推送记录里是不是“用户拒收”(用户在微信里关了服务号消息)。
不用微信的用户怎么办?微信通知是附加渠道,不影响网站本身使用;不绑定的用户照常在网站查看信号。

参考资料

说明:微信平台规则会调整,主体资质、认证费用、类目要求、调用上限等以办理时微信公众平台的页面和官方文档为准。本文不构成法律意见,金融内容合规请以法务意见为准。

F8LINK · 微信服务号信号推送操作手册 · 2026-11-06