小程序获取unionid的坑 unionid返回为null

同一个微信开放平台下的相同主体的App、公众号、小程序的unionid是相同的,这样就可以锁定是不是同一个用户。微信针对不同的用户在不同的应用下都有唯一的一个openId, 但是要想确定用户是不是同一个用户,就需要靠unionid来区分。

这里注意了:要想获取unionid就必须要绑定微信开放平台

首先,前端调用wx.login的时候会返回一个code,这个code传到后台的时候。

后台调用微信的接口(https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code)传入 code,appid,secret去换取到openid,session_key以及unionid等信息。

这里就需要注意了:官方文档上说的是,如果用户已经关注公众号,或者曾经登录过App或公众号,则用户打开小程序时,开发者可以直接通过wx.login获取到该用户UnionID,无须用户再次授权。

这里分为两种情况

(1)用code换取的时候,返回了unionid,这样就皆大欢喜了

(2)悲剧的情况,unionid返回为null,这时候你再去看官方文档的时候,发现有针对这种情况的方法。就是需要前端再去调wx.getUserInfo()这个接口。这时候微信会返回很多数据(详情见微信官方文档:https://mp.weixin.qq.com/debug/wxadoc/dev/api/open.html),这些数据里面有一个encryptedData,这个数据中就包含你需要的unionid以及其他的很多用户信息啦。获取到以后将encryptedData、加密算法的初始向量iv返回给后端,后端根据这两个数据以及之前的session_key就可以解密出你需要的数据了。

### 如何在后端从微信小程序登录中获取 UnionID 为了实现在后端通过 Java 从微信小程序登录流程中获取用户的 `UnionID`,需要遵循特定的工作流。此过程涉及多个步骤,包括但不限于从小程序前端收集必要的认证码 (`code`) 并将其发送至服务器,在那里利用该 `code` 调用微信接口换取会话密钥 (session_key),以及最终解析得到的加密数据以提取 `UnionID`。 #### 准备工作 确保已将小程序绑定到了微信公众平台下的同一主体名下其他应用上,这是获得 `UnionID` 的前提条件之一[^2]。只有当用户在同一开放平台账号下的不同应用之间授权登录时才会生成统一的 `UnionID`。 #### 实现方法概述 1. 小程序调用 `wx.login()` 接口获取临时登录凭证 `code`; 2. 使用上述 `code` 请求开发者服务器; 3. 开发者服务器使用 `code` 发起网络请求访问微信 API 来交换 `openid` 和 `session_key`; 4. 如果希望进一步获取 `UnionID`,则需额外处理由 `wx.getUserProfile()` 或 `wx.getUserInfo()` 返回的数据包中的加密信息,并传递给后台进行解密操作; #### 示例代码展示 下面给出一段简化版的 Java 后端逻辑用于说明如何基于接收到的小程序 `code` 进行后续的操作: ```java import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; public class WeChatUtil { private static final String APP_ID = "your_app_id"; private static final String SECRET = "your_secret"; public static JSONObject getSessionKeyOrOpenId(String code) throws Exception { // 构建URL参数 StringBuilder urlBuilder = new StringBuilder(); urlBuilder.append("https://api.weixin.qq.com/sns/jscode2session?"); urlBuilder.append("appid=").append(APP_ID); urlBuilder.append("&secret=").append(SECRET); urlBuilder.append("&js_code=").append(code); urlBuilder.append("&grant_type=authorization_code"); URL url = new URL(urlBuilder.toString()); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream())); StringBuffer responseBuffer = new StringBuffer(); String line; while ((line = reader.readLine()) != null){ responseBuffer.append(line); } reader.close(); return JSON.parseObject(responseBuffer.toString()); // 假设引入了阿里巴巴fastjson库来解析JSON字符串 } } ``` 这段代码展示了如何构建 HTTP GET 请求并接收来自微信官方服务器返回的结果。注意实际项目中还需要考虑错误处理机制和服务的安全性等问题。 对于想要取得 `UnionID` 的情况,则还需继续深入研究有关于敏感资料保护的规定与实践指南,因为这涉及到个人隐私安全方面的重要考量。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值