微信小程序无法获取UnionId的情况及处理

本文详细解析了微信小程序中UnionId的机制与作用,阐述了在不同用户场景下(如已关注公众号或未关注)获取UnionId的具体方法,以及如何通过wx.getUserInfo和后端解密算法解决无法获取UnionId的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  问题背景:做了微信小程序,一切都还正常,但是最后体验版放出去时,却发现很多用户无法绑定用户,后台返回:参数非法。经过多方排查,发现是微信拿到的code请求返回的数据里没有UnionId,也就是接口返回的参数中不包含UnionId参数。

1、UnionID机制说明
  简而言之,微信针对不同的用户在不同的应用下都有唯一的一个 openId,但是要想确定用户是不是同一个用户,就需要靠 unionid 来区分。通常自己的后台都会有自己的一个用户表,每个用户有不同的 userid。也就是说同一个用户在同一个微信开放平台下的相同主体的应用对应着相同的 userid, unionid 以及不同的 openid。所以在用户登录进来的时候,我们只能靠微信返回给我们的 unionid 去判断是不是同一个用户,再去关联我们的用户表,拿到对应的 user_id。

  注意: 后边这句话的描述:用户关注过公众号,或者曾经登录过App或公众号,则用户打开小程序时,开发者可以直接通过wx.login获取到该用户UnionID。即:如果用户没有关注过公众号,或者没有登陆过App,通过wx.login是无法获取到该用户UnionID,只能通过wx.getUserInfo来获取UnionId。经验证,系统不存在UnionId的小程序用户都是没有关注公众号或未在App中使用微信授权的用户

2、问题背景

  一般情况下(即在登录小程序之前,已经关注过公众号或已经登录过公众号或已经使用微信登录的方式登录过app),用户通过以下两步就正常成功登录网站:(1)wx.login获取code;(2)通过code请求后台,后台转发微信api用来换取openid及session_key等信息,此可以得到Unionid

  另一种情况(即在登录小程序之前,既没有关注过公众号,也没有登录过公众号,更没有使用微信登录的方式登录过app),通过 wx.login 的到的 code 换不回 unionid 及 openid 等信息。

3、解决方案:

  获取小程序UnionId应该以wx.getUserInfo的UnionId为主。wx.getUserInfo需要用户授权,产品方面,需要考虑用户拒绝授权的处理流程。

  wx.getUserInfo获取数据之后解密的方法,可以看官方文档。

  解决思路:通过带登录态的 wx.getUserInfo 获取到用户的加密数据 encryptedData 和加密算法的初始向量iv,然后将 encryptdata、iv 以及 code传给后端,后端再去通过接收到的encryptedData、iv以、code 以及之前的 session_key 解密出用户的 openid、unionid 等。加密数据解密算法

转载于:https://www.cnblogs.com/goloving/p/10532716.html

微信小程序获取unionid的步骤如下: 1. 开发者在小程序后台配置小程序的AppID、AppSecret以及启用相关的接口权限。 2. 用户在小程序中进行登录,获取到用户的openid和session_key。 3. 利用session_key进行解密,获取到用户的用户敏感数据,其中包括unionid。 4. 使用解密后的unionid,开发者可以将其与用户在小程序中的其他信息进行关联,方便后续业务的处理。 根据上述步骤,下面是一个示例代码片段来实现获取unionid的功能: ```javascript // 根据用户的code获取用户的openid和session_key wx.login({ success: function(res) { if (res.code) { // 发起网络请求,调用后台接口获取openid和session_key wx.request({ url: 'https://api.weixin.qq.com/sns/jscode2session', data: { appid: 'wxXXXXXXXXXXXXXXX', // 小程序的AppID secret: 'XXXXXXXXXXXXXXXXX', // 小程序的AppSecret js_code: res.code, grant_type: 'authorization_code' }, success: function(res) { var openid = res.data.openid; var sessionKey = res.data.session_key; // 解密用户敏感数据,获取unionid var encryptedData = "XXXXXXXXXXXXXXXXX"; // 用户加密的数据 var iv = "XXXXXXXXXXXXXXXXX"; // 加密算法的初始向量 var pc = new WXBizDataCrypt(appId, sessionKey); var data = pc.decryptData(encryptedData , iv); var unionId = data.unionId; // 将unionid与其他用户信息关联存储 // TODO: 进行后续业务处理 } }); } else { console.log('登录失败!' + res.errMsg); } } }); ``` 其中,需要开发者自行实现一个WXBizDataCrypt类,用于解密用户敏感数据,可以参考微信官方提供的相关文档进行实现。 这样,开发者就可以在小程序获取到用户的unionid,方便后续的用户关联及业务处理
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值