本文转自https://www.cnblogs.com/yaoyuqian/p/8203792.html
我们一般都是先获取到微信的unionid,然后再通过unionid去登录自己的网站,就可以关联到用户在自己网站上的user_id,但是在小程序登录中,有时候可以获取到unionid,有时候获取不到,在获取不到unionid的情况下,用户无法正常登录网站。UnionID机制说明:如果开发者拥有多个移动应用、网站应用、和公众帐号(包括小程序),可通过unionid来区分用户的唯一性,因为只要是同一个微信开放平台帐号下的移动应用、网站应用和公众帐号(包括小程序),用户的unionid是唯一的。换句话说,同一用户,对同一个微信开放平台下的不同应用,unionid是相同的。同一个微信开放平台下的相同主体的App、公众号、小程序,如果用户已经关注公众号,或者曾经登录过App或公众号,则用户打开小程序时,开发者可以直接通过获取到该用户UnionID,无须用户再次授权。(解读:用户如果没有登录过app,也没有登录过公众号,也没有关注过公众号的情况下,小程序中通过wx.login是获取不到unionid的)简而言之,微信针对不同的用户在不同的应用下都有唯一的一个openId,但是要想确定用户是不是同一个用户,就需要靠unionid来区分。通常自己的后台都会有自己的一个用户表,每个用户有不同的userid。也就是说同一个用户在同一个微信开放平台下的相同主体的应用对应着相同的userid,unionid以及不同的openid。所以在用户登录进来的时候,我们只能靠微信返回给我们的unionid去判断是不是同一个用户,再去关联我们的用户表,拿到对应的user_id。一般情况下(即在登录小程序之前,已经关注过公众号或已经登录过公众号或已经使用微信登录的方式登录过app),用户通过以下两步就正常成功登录网站。1.获取code(登录凭证,用来换取openid及session_key等)wx.login({success:function(res){if(res.code){that.getNeededUserInfo(res.code);}else{console.log('获取用户登录态失败!'+res.errMsg);}}})2.获取用户信息(利用wx.login返回的code获取用户的信息)getNeededUserInfo:function(code){wx.request({url:'https://my.com/login',method:'POST',data:{code:code//后端通过这个code去调用微信的接口(https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code),传入参数code、appid、appsecret后获取到微信返回的unionid、openid及session_key等。(然后后端可以直接利用微信返回的信息去关联用户在自己网站的user_id)},success:function(res){//可以返回前端需要的用户信息(包括unionid、openid、user_id等)}})}二般情况下(即在登录小程序之前,既没有关注过公众号,也没有登录过公众号,更没有使用微信登录的方式登录过app),通过wx.login的到的code换不回unionid及openid等信息。解决思路:通过带登录态的获取到用户的加密数据encryptedData和加密算法的初始向量iv,然后将encryptdata、iv以及code传给后端,后端再去通过接收到的encryptedData、iv以、code以及之前的session_key解密出用户的openid、unionid等。以下是具体实现步骤:1.获取code(登录凭证,用来换取openid及session_key等)wx.login({success:function(res){if(res.code){that.getNeededUserInfo(res.code);}else{console.log('获取用户登录态失败!'+res.errMsg);}}})2.获取加密数据和加密算法初始向量旧版本基础库调取wx.getUserInfo()可以直接获取到微信返回的encryptdata等完整数据,基础库更新之后,需要增加withCredentials属性,并将属性值设置为true时才可以获取到除用户基本信息之外的encryptedData以及iv等数据。需要注意的是:当withCredentials值为true时,要求此前有调用过wx.login且登录态尚未过期。getEncData:function(){wx.getUserInfo({withCredentials:true,success:function(res){that.getNeededUserInfo(code,res.encryptedData,res.encryptedData);}})}3.获取用户信息(利用wx.login返回的code获取用户的信息)getNeededUserInfo:function(code,enc,iv){wx.request({url:'https://my.com/login',method:'POST',data:{code:code,encryptedData:enc,iv:iv},success:function(res){//可以返回前端需要的用户信息(包括unionid、openid、user_id等)}})}实际项目中需要将以上两种情况整合以后使用。思路有两种:第一种:(前端判断是否有unionid)在向后端上传code并且后端返回数据以后,前端判断返回值中是否有unionid或者unionid是否为null,null的情况下去调用带有用户登录态的wx.getUserInfo(),然后再将微信返回的encryptedData和iv返回给后端,后端解密出相应的信息后再返回给前端;第二种:(后端判断是否有unionid)前端在调用wx.getUserInfo()时候带着登录态,然后不管后台能不能拿到unionid,都把encryptedData和iv返回给后端,后端在拿到前端code之后去请求微信的接口拿unionid,如果返回的unionid为空,再拿前端传的encryptedData、iv以及之前的session_key解密出unionid。
最新资讯
-

小程序制作平台选型踩坑记录:2026年五大主流方案横向对比
2026 年微信小程序月活达 10.7 亿、覆盖 108 个行业,本次横向对比即速应用、乔拓云、凡科、有赞、微盟五大主流平台,分三阶段给出选型结论,核心聚焦成本、扩展性、运营能力三大维度。 -

即速应用,赋能企业玩转微信小程序智慧经营
作为国内领军的智慧商业经营服务商,即速应用始终秉承“让每个企业都拥有自己的智慧店铺”的愿景,持续赋能更多企业玩转智慧经营。即速应用旗下拥有“小程序搭建工具-即速应用”、“私域流量专家-即客云”等产品,帮助商家打通互联网全生态营销闭环。 -

即客云2.0重磅更新,让微信小程序运营更简单!
即客云作为一款基于企业微信的第三方工具,现从多维度提供超过30种功能,自上线以来,已服务多家企业,受到一致好评。近期,我们根据客户反馈和市场调研正式推出升级版 即客云2.0!更新了私域运营SOP,群日历功能,批量拓客,客户雷达,消息推送,个人欢迎语,帮助企业更好运用企业微信;同时提升了社群运营工作标准化,提升运营效率,帮助企业实现客户增长,玩转私域流量。










