微信用户的OpenID是唯一的吗?

先弄明白以下概念:

  • 微信开发者账号 —— 用来登录微信开发者平台的账号
  • 微信应用 —— 同一账号可以在微信开发者平台申请多个应用,假设我们在开发知乎,我们会在微信开发者后台申请两个应用,分别是『知乎网站』和『知乎App』
  • 微信用户 —— 一般理解下的微信用户,假设我们有微信用户 summer 作为测试。

场景说明:

  • Summer 在『知乎网站』使用微信登录后,会获取到 OpenID 值为 o6_bmjrPTlm6_2sgVt7hMZOPfL2M 和 UnionID o6_bmasdasdsad6_2sgVt7hMZOPfL
  • Summer 在『知乎App』使用微信登录后,会获取到 OpenID 值为 o6_bmjrPTlm6_2sgVt7hMZOPfXXX 和 UnionID o6_bmasdasdsad6_2sgVt7hMZOPfL
  • 两个应用中,退出登录后重新使用微信登录,获取的 OpenID 和 UnionID 值都与第一次的值一致。

解释:

  • OpenID 是最对『微信应用』的用户唯一值,同一个『微信开发者账号』下的不同应用中,使用同一个『微信用户』登录,此值会不一样;
  • UnionID 是针对『微信开发者账号』的用户唯一值,同一个『微信开发者账号』下的不同应用中,使用同一个『微信用户』登录,此值是一致的。

结论:

如果你在开发网站的微信登录,请数据库里记录 UnionID ,并使用 UnionID 来区分微信用户。如果你不这么做,假如后面网站新增了一个允许微信登录的 App 时,你将无法辨别用户。

在关注者与公众号产生消息交互后,公众号可获得关注者的OpenID(加密后的微信号,每个用户对每个公众号的OpenID是唯一的。对于不同公众号,同一用户的openid不同)。

摘自《微信公众平台开发者文档》

用户关注了 微信 公众号后

对应的拿到的用户ID open id

是否是固定的

-》取消关注公众号,再次关注公众号,后,两次得到的id是否一样

微信 open id

用户关注微信公众平台后产生的openID是唯一的么? – 知乎

“在关注者与公众号产生消息交互后,公众号可获得关注者的OpenID(加密后的微信号,每个用户对每个公众号的OpenID是唯一的。对于不同公众号,同一用户的openid不同)。

摘自《微信公众平台开发者文档》

看了微信的文档,要先获取用户的open_id,然后调用 微信的接口查到用户的唯一ID。

这个唯一ID是 snsapi_userinfo 里的。

而调用 snsapi_userinfo 需要用户的许可,才能执行。

网页授权获取用户基本信息

获取用户基本信息(UnionID机制)

如果我的系统 用微信公众号接入了微信支付, 用app接入微信支付,我发现两个应用获得同一个用的openid 是不一样的, 但是app的这个应用又没有办法获取用的unionid

如何去鉴别这两个体系的用户是同一个用户

微信openid由用户id和公众号id加密而来,同一用户相对同一公众账号的openid是不变的,说变了的童鞋,第一,请核实官方文档,第二,请确定自己拿的是openid,而不是别的accesstoken之类的参数在瞎搞

第三方绑定微信,从数据库中记录openid对应的user,这个user就对应一个微信号

请问,那微信的唯一ID有吗? 是哪个呢? OPEN ID变了可真麻烦呢。我系统现在就出问题了,之前记录的OPEN ID和现在传的不同,导致查不到之前的数据了。

如果OpenID在特定用户重复关注时不唯一,那么公众号在发起投票时,用户就可以通过取消关注、重复关注实现刷票操作。想来腾讯应该不会允许这种事情发生

微信开发之获取openid – 码农小兵

微信公众平台开发(76) 获取用户基本信息 – 方倍工作室 – 博客园

微信公众平台开发(99) 自定义菜单获取OpenID – 方倍工作室 – 博客园

微信公众平台 – 微信js怎么获取openID的 – SegmentFault

微信公众平台 – 关于微信openid没人提及过的几个问题 – SegmentFault

微信公众号开发系列-获取微信OpenID – 软件研发实战应用技术分享 – 博客频道 – CSDN.NET

微信内置浏览器如何获得 openid? · Ruby China

网页授权获取用户基本信息 – 微信公众平台开发者文档

-》好像有个:

UnionID

好像是唯一的

获取用户基本信息(UnionID机制) – 微信公众平台开发者文档

微信开发 如何绑定公众号 

微信开发 如何绑定公众号 unionID

微信公众平台开发者文档

微信web开发者工具 – 微信公众平台开发者文档

微信JSSDK说明文档 – 微信公众平台开发者文档

微信开放平台绑定微信公众号是否能获取同一 openid? – 知乎

php – 微信公众账号中的一键绑定该怎么设计 – SegmentFault

微信公众号用户与网站用户的绑定方案 – Hello

微信公众平台开发者文档

微信开放平台

资源中心 – 微信开放平台

资源中心 – 微信开放平台

资源中心 – 微信开放平台

资源中心 – 微信开放平台

微信开放平台

【总结】

  • 同一个微信用户,对于同一个微信公众号来说,始终是不变的同一个openid;
  • 同一个微信用户,对于不同微信公众号来说,获得得到的openid是不同的。
  • 同一个用户想要确保始终获得到的id是不变的话,可以通过UnionID

转载请注明:在路上 » [研究]微信 用户的open ID 是否唯一

Post Views: 895

微信开发过程中,经常会遇到,一个企业有多个小程序和公众号,在不同的小程序和公众号中,会有不同的openid。如果想要确定是同一个人,就需要用到unionid机制。

1

官方关于unionid的说明是这样的

公众号文档的描述

开发者可通过OpenID来获取用户基本信息。特别需要注意的是,如果开发者拥有多个移动应用、网站应用和公众帐号,可通过获取用户基本信息中的unionid来区分用户的唯一性,因为只要是同一个微信开放平台帐号下的移动应用、网站应用和公众帐号,用户的unionid是唯一的。换句话说,同一用户,对同一个微信开放平台下的不同应用,unionid是相同的。

小程序文档的描述

如果开发者拥有多个移动应用、网站应用、和公众帐号(包括小程序),可通过 UnionID 来区分用户的唯一性,因为只要是同一个微信开放平台帐号下的移动应用、网站应用和公众帐号(包括小程序),用户的 UnionID 是唯一的。换句话说,同一用户,对同一个微信开放平台下的不同应用,UnionID是相同的。

2

微信开放平台

提到unionid就不得不提微信开放平台了

open.weixin.qq.com 微信开放平台,刚开始是为了让开发商,可以支持很多的公众号,而产生的。原因是使用appid和appsecret的方式对于。小程序或公众号的所有者来说太危险,相当于暴露了用户名和秘密。为了安全,出现了开放平台,授权时可以灵活的控制授予哪些权限。开放平台相比appid和appsecret方式还有很多特权。对于开发者是很好的。

注意事项

官方的说明比较简单,开发过程中会遇到不少的坑。下面说一下注意事项

  • 公众号开发时只有用户关注了公众号,才可以获取到unionid。如果用户不关注或取消关注公众号,是无法获取unionid的。
  • 必须将公众号或小程序绑定到开放平台才可以获取unionid

进入开放平台,点管理中心。可以看到移动应用、网站应用、公众账号、小程序、第三方平台这些菜单。

如果要绑定公众号就,点击公众账号菜单,然后点击绑定公众号,填写公众账号、密码、验证码,点下一步,然后需要管理员扫码。之后就绑定了。

小程序的流程也差不多。

  • 一个公众号或小程序只能绑定一个开放平台

这与unionid的生成机制有关,unionid是用户与开放平台之间的对应关系,如果绑定多个会造成混乱。

3

unionid的值不同

第三方开放平台,开发过程中会遇到,同一个用户,在两个公众号下,获取到的unionid不同的情况。这种情况发送的原因是,两个公众号绑定到了不同的开放平台账号造成的。

不管是小程序还是公众号,一个开放平台的是有绑定限制的。比如小程序相同主体:上限50个,绑定次数不限。不同主体:上限5个,本月还可以绑定5次。公众号相同主体:上限50个,绑定次数不限。不同主体:上限5个,本月还可以绑定5次。

所以一般情况下,会让客户自己注册一个开放平台,然后把客户的公众号和小程序绑定上去。

比如客户A注册开放平台是平台A,注册小程序是小程序A,注册公众号是公众号A客户B注册开放平台是平台B,注册小程序是小程序B,注册公众号是公众号B

他们各自绑定各自的开放平台。小程序A公众号A绑定平台A小程序B公众号B绑定平台B

开发过程中会出现同一个微信用户,在公众号A小程序A获取到的unionid是一样的比如都是;公众号B小程序B中获取的unionid也是一样的。但是公众号A公众号B获取的unionid不一样。

造成这样的原因是因为绑定的开放平台不用,每个unionid的产生,其实是用户跟开放平台的唯一对应关系。小程序A公众号A绑定平台A因此他们的unionid一样,公众号A公众号B绑定在不同的开放平台所以取到的unionid不一样。

还有一点要注意,开发公司A的开放平台公司A平台,同一个平台下创建多个第三方平台用于开发,这些第三方平台也会取到相同的unionid。

重要的事情说三遍unionid与绑定的平台有关,unionid与绑定的平台有关,unionid与绑定的平台有关,unionid其实是用户和开放平台账户的对应关系。

有一点值得注意:如果有个开发公司B,在开放平台公司B平台,有公众号A授权的情况下,取到的unionid与公司A平台获取的公众号A的unionid也会一样。这其实也是为了便于微信做大数据 分析,知道一个用户所有行为。

4

为什么需要openid

在微信小程序的开发过程中,往往需要将用户信息录入自己的数据库中,就得有一个唯一标记区分用户,这个标记就是openid。当一个用户使用了某个微信小程序,微信后台会产生一个openid,并且是唯一的,所以可以通过这个来区分用户。

另一方面,我们通过微信小程序API并不能获取到更多用户私密信息,只能获取到昵称,性别,居住地等公开的信息,微信号这种私密信息是获取到的,而通过这些昵称或者居住地,是没办法保证用户表里的用户数据是唯一的。

所以综合而言,如果不需要建立自己的用户数据库,就没必要使用openid;如果需要,就得获取openid。

顺便说一下,还有一个unionid的东西存在。现在同一家开发公司甲,既有微信小程序A,又有微信公众号B,都是用同一个开发平台账号开发的。

同时微信小程序A有个用户的openid是X,微信公众号B有个用户的openid是Y,那么我们怎么判断这两个用户是不是同一个人呢?所以引入了unionid的概念。

同一用户,对同一个微信开放平台下的不同应用,unionid是相同的 。什么意思呢?假如用户乙关注了这两个程序,那么乙在小程序A的应用中opendi是X,unionid是Z;同时乙在公众号B应用中的openid是Y,unionid是Z。

5

如何获取openid

获取openid主要是两个步骤

  1. wx.login()得到code
  2. 通过code以及appid,secret 得到openid

6

获取用户信息

既然要获取openid,那肯定就是要将用户录入数据库,那肯定也要获取用户信息。目前能通过wx.getUserInfo获取到的用户信息是例如昵称、性别这一类的公开信息。

1、用户授权

获取用户信息需要用户授权,那怎么授权呢?以前可以一进入页面就弹出授权框,现在不提倡了,文档建议使用button,设置open-type来授权。

如下代码,点击button,如果没有授权会弹出授权框,如果拒绝了,那个e.detail.userInfo就是false,会执行else里代码块,如果接受,则执行if为true的操作;如果之前就已经有授权了,就不会弹出授权框,直接执行if为true的操作。

在开发时候,可以在开发者工具上方,点击“清缓存”按钮,这样就可以清除以前的授权信息,得重新授权。

2、获取用户信息

获取用户信息比较简单,调用wx.getUserInfo即可,这一块应该没什么好说的。

文章分享自微信公众号:

本文参与 腾讯云自媒体分享计划 ,欢迎热爱写作的你一起参与!

作者:小程序社区

原始发表时间:2020-09-27

如有侵权,请联系 删除。

微信openid是唯一的吗?

openid的变化 根据openid的定义,openid是用户在同一个小程序下的唯一表示,即同一个用户在不同的小程序下的openid是不同的,所以当你的appid变化之后,用户的openid发生变化,但当你的aapid不AppSecret时openid是不会变的。

微信小程序如何获取用户的openid?

小程序获取openID.
需要在微信小程序调用登录开放接口wx.login() 获取用户登陆凭证code。 ... .
向服务器发送请求,并将code一起发送过去。.

微信Open ID有什么用?

OpenId 是一个用户对于一个小程序/公众号的标识,开发者可以通过这个标识识别出用户。 类似 wxopenid,同一个人,使用不同的小程序,会留下不同的小程序 OpenId 。 获取小程序 OpenId 无需用户操作和授权。

Union ID是什么?

Union ID(union_id) 围绕应用开发商来设计的,其解决的核心问题让应用开发商可以把同个用户(以User ID 为标识)在多个应用中的身份关联起来。 Union ID 以 on_ 为前缀,如 on_cad4860e7af114fb4ff6c5d496d1dd76 。