微信订阅号内网页如何获得用户信息

本贴最后更新于 2017 天前,其中的信息可能已经水流花落

在生产开发过程中,经常接到 "开发挂载在微信公众号上的网页" 的需求。但是需求方往往无法分清"订阅号"、"服务号"的区别,就会导致 "在网页内获取用户信息" 这项子需求无法实现。
微信开发文档内明确说明,订阅号无法直接在网页内获取用户基本信息。

但是真的无法实现吗?实际上,开发者可以通过一些其他的手段变相的实现这类需求。

如何实现

需要了解的关键词

  1. openID: 为了识别用户,每个用户针对每个公众号会产生一个安全的 OpenID
  2. 服务器: 微信开发者绑定的服务器地址

实现思路

由于订阅号没有在网页内获取用户信息的权限,因此我们不能将这一步放在网页中。
通过查询微信的开发文档和接口权限文档可以得知,认证过的订阅号可以通过用户的 openID 获取到用户信息。

而对于每一个微信公众号来说,用户的 openID 会在用户与公众号产生消息交互后由微信推送给服务器。
在网页端,后台可以将提前获取到的用户信息进行注入。
因此,可以将这几步进行串联,得到的简易流程如下:

对于公众号来说,和用户产生消息消息的方式有很多,比如用户给公众号发送消息,用户点击公众号的 tab,用户关注/取消关注…比较符合需求描述的交互场景应该是点击公众号的自定义菜单。

用户点击 tab 后,微信会将 openID 推送到服务器,此时服务器可以通过之前提到的微信 api 获取到用户信息并存入数据库,并生成唯一标志符与用户 id 一一对应。然后将附带唯一标识符的网页链接返回给用户,让用户点击访问。
在网页内,通过 ajax 请求直接和服务器交互,获取到预先存入数据库中的用户信息。
更加详细的流程如下:

缺点

这种方式实际上不是正道,最正统的方法还是需要将网页挂载于服务号并使用微信官方的接口。
使用这种方式获取到的用户信息有几个问题:

1. 保持登录态的问题

使用这种方式获取到了用户信息,实际上相当于用户“登录”了所挂载网页,开发者应该将用户登录态写入 cookie。那么对于用户来说,他的下次访问或者下下次访问理应附带登录态。但是就我目前开发过的几个项目而言,微信内浏览器的 cookie 有几率丢失。而丢失登录态的用户则必须回到公众号页面通过点击 tab 的方式重新登录,这对用户来说成本太高,容易造成不必要的流失。

2. 用户信息盗用问题

在用户与公众号产生消息交互之后,公众号推送给用户的网址可能会附带用户的登录信息,在这种情况下任何人只要访问这个网址都可以获得该用户的数据。
实际上有一个 hack 解决方式。

  1. 将推送给用户的网页设置成“图文消息”,让用户不可见网页具体链接地址;
  2. 在用户访问网页之后使用 JS 清除网址上的登录信息(不保险,有几率无法清除);
  3. 使用微信 API 干掉点击右上角后出现的“复制网页地址”、“在其他浏览器打开”的功能
  4. 设置分享信息,将分享出去的网址上的用户信息擦除。
  • 微信

    腾讯公司 2011 年 1 月 21 日推出的一款手机通讯软件。用户可以通过摇一摇、搜索号码、扫描二维码等添加好友和关注公众平台,同时可以将自己看到的精彩内容分享到微信朋友圈。

    129 引用 • 791 回帖 • 1 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • 88250

    小程序也有类似的一个点,就是推送模板消息的时候需要一个 token,这个 token 只能由用户主动交互时才能获取,并且有有效期。所以就只能尽量在所有有交互的场景下都收集 token。微信小程序的本意估计是为了不打扰用户,不给随意推送消息,但悲剧的是 token 会过期,一旦超时就发不了消息了。

    类似的奇技淫巧估计在微信开发中有很多,反正我们的目标是:能用就行 trollface

  • someone

    哈哈,真的是,能用就行,满足需求就行

  • Take

    想问一下是哪个 API 获取的 openid 咋没找到啊

    1 回复
  • 这个有点被动了。另外,自定义菜单功能,订阅号好像要认证才能自定义菜单,认证还必须是企业类型的订阅公号。缺点,那也真的缺点。普通订阅号要做用网页授权,目前来说应该只有一个有效办法,那就是借用服务号的网页授权,通过唯一 id: unionid,关联起来。

  • Eddie

    服务号网页授权,回调地址使用 code 获取。

    微信开放文档