缘起

2017 年下半年,微信生态正处于高速发展的黄金期。公众号、小程序、企业微信,每一个方向都蕴含着巨大的商业机会。公司决定开拓微信端的业务,而我作为技术负责人之一,承担起了微信开发的技术预研工作。

那段时间,我几乎把所有的业余时间都花在了阅读微信官方文档上。微信的开发文档以详尽著称,但也因为其庞大的体系而让新手望而生畏。企业号、服务号、订阅号、小程序、开放平台、公众平台……光是理清这些概念之间的关系,就花了我整整一个周末。

这篇博客记录的,就是我在微信开发入门阶段整理的一些核心知识点。希望对于后来者,能够少走一些弯路。

微信生态全景

微信号区别

在微信生态中,有四种主要的账号类型。很多人一开始分不清它们的区别,这完全可以理解——因为微信自己在不同的时期对这些账号的定位也在不断调整。

1. 企业号(后升级为企业微信)

企业号的核心定位是企业内部通信与协作

  • 微信企业号只有企业通信录成员才能关注,外部人员无法看到。
  • 同一个微信企业号可配置多个类似服务号的应用,发送信息条数无限制。
  • 旨在通过微信连接企业应用,为企业提供移动端办公入口。

后来企业号升级为”企业微信”,成为一个独立的产品。它在保留了原有企业内部通信能力的基础上,增加了与微信互通的能力——企业微信的用户可以直接与微信用户聊天,这为私域运营提供了新的可能。

2. 服务号

微信的服务号,顾名思义,是提供服务的公众号:

  • 用于向粉丝提供服务的一种公众号,功能比订阅号更全面。
  • 服务号也分为两种:认证服务号与未认证服务号。认证方式只可以是公司认证,并且也只有公司才能申请。
  • 服务号每月可以推送 4 次群发消息,但消息会直接出现在用户的聊天列表中(而不是折叠在”订阅号消息”里),因此曝光率更高。
  • 服务号拥有更多的高级接口权限,如模板消息、微信支付、网页授权等。

3. 订阅号

订阅号的核心定位是信息推送

  • 订阅号适合媒体、政府等新闻发布平台,时下非常流行的自媒体概念一般都是使用订阅号。
  • 订阅号适合推送消息,每天可以群发一次。
  • 但订阅号的消息会被折叠在”订阅号消息”文件夹中,用户需要主动打开才能看到,曝光率相对较低。

4. 小程序

小程序是微信生态中的”革命性”产品:

  • 在没有网络连接的情况下,微信公众号的功能无法使用(公众号本质上是 H5 页面)。
  • 小程序本身并非无需联网,但它的离线缓存能力更强,体验更接近原生应用。
  • 小程序更像 H5 的应用,在微信平台体现为可扩展的 Native 应用。它无需下载安装,扫码即用,用完即走。

小程序架构示意

微信用户信息区别

在微信开发中,最核心的概念之一就是用户标识。理解 openidunionid 的区别,是做好微信开发的基础。

1. openid

  • openid 是普通用户的标识,对公众号账号唯一
  • 一个 openid 只对应一个公众号。
  • 同一个用户关注不同的公众号会有不同的 openid

这意味着:如果你的公司有多个公众号,同一个用户在每个公众号下都有一个独立的 openid。如果你只依赖 openid 来做用户识别,就无法知道这些 openid 背后其实是同一个人。

2. unionid

  • unionid微信用户统一标识
  • 针对一个微信开放平台账号下的应用,同一用户的 unionid 是唯一的。
  • 对于拥有多个账号的企业来说,unionid 可以帮助识别不同公众账号下的用户是否是同一个人。
  • 网页应用、二维码等需要记录用户的 unionid,因为它们的 openid 是立即生成的,unionid 表示唯一用户。

openid 与 unionid 的关系图解

1
2
3
4
5
6
微信开放平台(一个账号)
|
+-- 公众号 A -- 用户张三 (openid_A, unionid_X)
+-- 公众号 B -- 用户张三 (openid_B, unionid_X)
+-- 小程序 C -- 用户张三 (openid_C, unionid_X)
+-- 移动应用 D -- 用户张三 (openid_D, unionid_X)

如上所示,同一个用户(张三)在同一个开放平台下的不同应用中,openid 各不相同,但 unionid 始终相同。这就是 unionid 存在的意义——打通多应用的用户体系

如何获取用户 UnionId

获取 unionid 的前提是:你的公众号必须绑定到微信开放平台

步骤一:绑定公众号到开放平台

开发者有在多个公众号,或在公众号、移动应用之间统一用户账号的需求,需要前往微信开放平台(https://open.weixin.qq.com)绑定公众号后,才可利用 unionid 机制来满足上述需求。

注意:只有已认证的公众号才能绑定到开放平台。如果你的公众号尚未认证,需要先完成认证流程。

步骤二:获取公众号 openid 列表

1
2
3
http请求方式: GET(请使用https协议)

https://api.weixin.qq.com/cgi-bin/user/get?access_token=ACCESS_TOKEN&next_openid=NEXT_OPENID

这个接口可以获取关注公众号的用户 openid 列表。每次最多返回 10000 个,如果用户数量超过 10000,需要通过 next_openid 参数进行翻页。

步骤三:获取公众号 openid 对应的 unionid 信息

1
2
3
4
接口调用请求说明

http请求方式: GET
https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN

通过用户 openid 获取用户详细信息,返回结果中会包含 unionid 字段(前提是该公众号已绑定到开放平台)。

注意事项与踩坑记录

在微信开发的实际操作中,有几个容易被忽视的细节,值得重点关注:

1. access_token 的有效期管理

批量获取用户 openid 列表时,注意 access_token 是否已失效。一次获取的 access_token 的最长有效期是 7200 秒(2 小时)。在批量获取时,需要判断 access_token 的失效时间,并在即将过期时及时刷新。

踩坑经验:我们最初的做法是在脚本启动时获取一次 access_token,然后在整个批量过程中反复使用。结果在用户量较大的情况下,access_token 在处理中途过期了,后续的所有请求都返回了错误。后来改成了”每次请求前检查 Token 有效期,过期则自动刷新”的策略,问题才得以解决。

2. 接口调用频率限制

批量获取用户 unionid 时,一般是脚本多线程跑数据。因为微信提供的接口一次最多传入 100 个 openid,所以需要注意:

  • access_token 过期时间:如上所述,2 小时的有效期在大批量处理时可能不够用。
  • 接口调用频率:微信对接口调用频率有严格限制,调用过快会被限流甚至封禁。需要在每次调用之间加入适当的 sleep,防止被”墙”报异常。
  • 并发控制:多线程并发时,多个线程可能同时刷新 access_token,导致旧的 Token 失效。建议使用分布式锁或单线程刷新的方式来管理 Token。

3. 用户授权的场景差异

不同的场景下,获取用户信息的方式也不同:

  • 公众号内网页:通过网页授权(OAuth 2.0)获取用户信息,可以拿到 openidunionid
  • 小程序:通过 wx.login 获取 code,然后在服务端调用 code2Session 接口获取 openidunionid
  • 扫码关注:通过关注事件的推送消息获取 openid,但 unionid 需要额外调用用户信息接口。

微信开发的未来展望

回看 2017 年,那是微信生态最具爆发力的一年。小程序刚刚上线一年,就已经展现出了巨大的潜力。公众号的图文阅读虽然开始受到短视频的冲击,但依然是内容创作者的重要阵地。

如今,微信生态已经发展得更加成熟和复杂。视频号、企业微信、微信支付、微信搜索……每一个方向都形成了完整的商业闭环。但无论如何变化,理解用户标识体系(openid / unionid)和账号体系(订阅号 / 服务号 / 小程序),依然是微信开发的基石。

微信开发展望

写在最后

微信开发的入门,看似只是调用几个 API 接口,但其背后涉及的是一个庞大而精密的生态系统。理解这个系统的设计哲学——以用户为中心、以社交为纽带、以小程序为载体——才能真正做好微信端的业务。

这篇博客记录的是我微信开发之路的起点。后来的日子里,我参与了公司公众号、小程序、企业微信等多个项目的开发,每一次实践都让我对微信生态有了更深的理解。但所有这些理解,都始于最初那个对着官方文档一个字一个字啃的周末。