小程序获取unionid & 解密getUserInfo返回信息中没有unionid

背景说明

写这篇文章来记录一下开发微信小程序时获取unionid踩过的坑:在解密调用接口 wx.getUserInfo返回的encryptedData后,发现只有openid,并没有unionid,不明所以。由于是第一次开发小程序,也不知道啥原因,查各种文档加上公司大佬的经验,问题得以解决,特意记录一下。

UNIONID机制说明

我们现在看一下来自微信的unionid机制说明:

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

简而言之,unionid是用来说明多个应用下用户身份一致性的问题。相比较而言,由于在同一个应用下每个用户的openid是唯一的,因此openid也是也可以用来标记用户身份,但是仅限于在同一个应用中。对于不同的应用,每个用户的openid是不一样的,要想在不同应用间识别用户的唯一性只可以用unionid。下面来举一个例子来说明,例如:

李四开发者账号下有公众号A和小程序B,对于访问公众号A和小程序B的用户张三有openidA与openidB(openidA!=openidB),openidA在公众号A应用中是唯一的,可以说明张三的身份;openidB在小程序B中是唯一的,也可以说说明张三的身份。假如,我们现在要确定公众号A的用户张三与小程序B的用户张三是否为同一个用户张三,我们根据openid能确定吗?很显然,不可以。此时用户的unionid就可以解决这个问题,即unionid是用来确定不同应用下用户的唯一性。

UnionID获取

我们先看一下微信官方给出的途径:
绑定了开发者帐号的小程序,可以通过以下途径获取 UnionID。

  1. 调用接口 wx.getUserInfo,从解密数据中获取 UnionID。注意本接口需要用户授权,请开发者妥善处理用户拒绝授权后的情况。
  2. 如果开发者帐号下存在同主体的公众号,并且该用户已经关注了该公众号。开发者可以直接通过 wx.login + code2Session 获取到该用户 UnionID,无须用户再次授权。
  3. 如果开发者帐号下存在同主体的公众号或移动应用,并且该用户已经授权登录过该公众号或移动应用。开发者也可以直接通过 wx.login + code2Session 获取到该用户 UnionID ,无须用户再次授权。
  4. 用户在小程序(暂不支持小游戏)中支付完成后,开发者可以直接通过getPaidUnionId接口获取该用户的 UnionID,无需用户授权。注意:本接口仅在用户支付完成后的5分钟内有效,请开发者妥善处理。
  5. 小程序端调用云函数时,如果开发者帐号下存在同主体的公众号,并且该用户已经关注了该公众号,可在云函数中通过 cloud.getWXContext 获取 UnionID。
  6. 小程序端调用云函数时,如果开发者帐号下存在同主体的公众号或移动应用,并且该用户已经授权登录过该公众号或移动应用,也可在云函数中通过 cloud.getWXContext 获取 UnionID。

大多数情况下均可以通过前三种方法获取到。途径2和3说明只要你曾经关注过该公众号就可以获取到unionid,不论现在是否还关注公众号。在项目中采取下列方法来获取unionid:

  1. 通过 wx.login + code2Session 获取到该用户 unionid;如果获取的unionid为空则转2;
  2. 调用接口 wx.getUserInfo,从解密数据中获取 unionid。

为什么不直接调用wx.getUserInfo获取unionid呢?

在实际开发项目中,只要需要解密微信的敏感数据,比如:unionid,手机号等信息,就必须调用wx.login来获取加解密的会话密钥session_key,调用wx.getUserInfo获取unionid时,返回的是加密的数据,必须解密才可以拿到。调用wx.getUserInfo之前,如果已经拿到密钥,需要调用wx.checkSession来检查会话密钥是否有效,无效的话需要调用wx.login来获取新的session_key。切记,这步操作一定要在调用wx.getUserInfo之前进行!如果在调用wx.getUserInfo后在调用wx.login,会刷新session_key,后端解密时会报错:pad block corrupted,导致解密失败,因此顺序一定不能颠倒。

然而在解密wx.getUserInfo返回的encryptedData后,发现居然没有unionid🌚,真是惊呆我!我们来看一下解密的信息:

{
  "country": "",
  "watermark": {
    "appid": "wxappid",
    "timestamp": 1611821044
  },
  "gender": 2,
  "province": "",
  "city": "",
  "avatarUrl": "",
  "openId": "hGFiK5FzmSFR7wkElxn_jw7EDSno",
  "nickName": "hhh",
  "language": "zh_CN"
}

注:以上数据不是真实数据,只是用来说明问题
我们再来看看微信文档给出的示例:

{
  "openId": "OPENID",
  "nickName": "NICKNAME",
  "gender": GENDER,
  "city": "CITY",
  "province": "PROVINCE",
  "country": "COUNTRY",
  "avatarUrl": "AVATARURL",
  "unionId": "UNIONID",
  "watermark": {
    "appid": "APPID",
    "timestamp": TIMESTAMP
  }
}

可以发现,两者的差别:前一个未获取到unionid,官方给出的示例是有unionid的。
出现以上问题的原因是:小程序未在微信开放平台绑定,只有在微信开放平台下绑定小程序才可以获得unionid,未绑定的小程序只能获取到openid。
微信开放平台链接:https://open.weixin.qq.com/,登录后绑定即可。
在微信官方文档中也给出了的操作的方法:https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/union-id.html
按照提示操作即可。

image.png


在看微信开放文档的更新日志时,发现微信官方更新了wx.login API,默认返回unionid,微信的更新日志:


image.png

我们重新看一下unionid的获取方式:

  1. 开发者可以直接通过 wx.login + code2Session 获取到该用户 UnionID,无须用户授权。
  2. 小程序端调用云函数时,可在云函数中通过 cloud.getWXContext 获取 UnionID。

相比较原来获取unionid的方式,更新后的方式更加简单,只需要通过wx.login+code2Session就可以获取到用户的unionid。不过要想获取到unionid,必须绑定到微信开放平台,不绑定是获取不到unionid的。

2021年4月25日更新

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容