见我 杂函 思绪 造物 耕录

微信公众号关注与用户绑定实现指南

2025 年 2 月 25 日

·

阅时约 2 分

tl;dr: 详细介绍如何在网页中实现引导用户关注公众号、完成用户绑定,以及后续进行模板消息推送的完整解决方案。

功能概述

在很多场景下,我们需要让用户关注公众号并完成账号绑定,以便后续能够通过模板消息推送重要通知。本文将详细介绍如何实现这一功能。

实现步骤

1. 准备工作

首先需要准备以下内容:

  • 一个已认证的微信公众号(订阅号无法实现模板消息推送)
  • 在微信公众平台后台配置好网页授权域名
  • 后端服务器用于处理微信接口调用

2. 引导关注公众号

2.1 生成带参数二维码

通过微信公众号的接口生成带参数的二维码,用于识别用户身份:

// 后端示例代码(Node.js)
const axios = require('axios');

async function generateQrCode(sceneStr) {
  const accessToken = await getAccessToken(); // 获取access_token的方法
  const url = `https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=${accessToken}`;
  
  const response = await axios.post(url, {
    expire_seconds: 2592000, // 30天有效期
    action_name: 'QR_STR_SCENE',
    action_info: {
      scene: {
        scene_str: sceneStr // 可以是用户ID或其他标识
      }
    }
  });
  
  return `https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=${response.data.ticket}`;
}

2.2 前端展示二维码

<template>
  <div class="qr-container">
    <img :src="qrCodeUrl" alt="关注公众号" />
    <p>请使用微信扫码关注公众号</p>
  </div>
</template>

<script setup>
import { ref, onMounted } from 'vue'

const qrCodeUrl = ref('')

onMounted(async () => {
  const response = await fetch('/api/generate-qrcode')
  const data = await response.json()
  qrCodeUrl.value = data.url
})
</script>

3. 处理用户关注事件

当用户扫码关注公众号时,微信服务器会发送事件通知到我们配置的服务器地址:

// 后端示例代码(Node.js + Express)
app.post('/wechat/callback', (req, res) => {
  const xml = req.body // 使用相关中间件解析XML
  
  if (xml.Event === 'subscribe') {
    // 处理关注事件
    const sceneStr = xml.EventKey.replace('qrscene_', '') // 获取场景值
    const openId = xml.FromUserName
    
    // 保存用户关注信息
    await saveUserSubscribe(openId, sceneStr)
  }
  
  res.send('success')
})

4. 网页授权获取用户信息

用户关注后,需要获取用户基本信息并完成账号绑定:

// 前端实现
const authUrl = `https://open.weixin.qq.com/connect/oauth2/authorize?appid=${appId}&redirect_uri=${encodeURIComponent(redirectUrl)}&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect`

// 后端处理授权回调
app.get('/wechat/oauth/callback', async (req, res) => {
  const code = req.query.code
  
  // 1. 通过code获取access_token
  const tokenRes = await getAccessToken(code)
  
  // 2. 通过access_token获取用户信息
  const userInfo = await getUserInfo(tokenRes.access_token, tokenRes.openid)
  
  // 3. 保存用户信息并绑定账号
  await bindUserAccount(userInfo)
})

5. 发送模板消息

完成绑定后,就可以向用户发送模板消息:

async function sendTemplateMessage(openId, templateId, data) {
  const accessToken = await getAccessToken()
  const url = `https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=${accessToken}`
  
  const response = await axios.post(url, {
    touser: openId,
    template_id: templateId,
    data: {
      first: {
        value: data.title,
        color: "#173177"
      },
      keyword1: {
        value: data.content
      },
      // ... 其他模板字段
      remark: {
        value: data.remark
      }
    }
  })
  
  return response.data
}

注意事项

  1. 安全性考虑

    • 所有敏感接口都需要进行签名验证
    • access_token 要安全存储并及时刷新
    • 用户信息要进行加密存储
  2. 用户体验优化

    • 提供清晰的引导提示
    • 在微信内打开时使用 JS-SDK 实现更好的体验
    • 考虑用户取消授权的情况
  3. 开发建议

    • 本地开发时可使用 ngrok 等工具进行调试
    • 建议封装统一的微信 API 调用模块
    • 做好错误处理和日志记录

总结

通过以上步骤,我们就实现了一个完整的公众号关注、用户绑定和消息推送流程。这个方案可以根据具体业务需求进行调整和扩展。

参考资料

  • 微信公众平台开发文档
  • 微信网页授权文档
  • 模板消息接口文档