php小程序登录时解密getUserInfo获取openId和unionId等敏感信息

本文详细介绍了在微信小程序开发中如何通过调用接口并解密数据获取用户的UnionId,适用于同一微信开放平台下多个应用间用户身份的统一识别。

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

在获取之前先了解一下openId和unionId

openId : 用户在当前小程序的唯一标识 

unionId : 如果开发者拥有多个移动应用、网站应用、和公众帐号(包括小程序),可通过unionid来区分用户的唯一性,因为只要是同一个微信开放平台帐号下的移动应用、网站应用和公众帐号(包括小程序),用户的unionid是唯一的。换句话说,同一用户,对同一个微信开放平台下的不同应用,unionId是相同的。详情登录微信开放平台(open.weixin.qq.com) 。
在微信小程序开发中,unionId等敏感数据则被加密在encryptedData,于是需要以下流程来解密敏感数据,从而获取unionId等信息。
 
1.客户端调用wx.login登录接口
wx.login({
    success(rs){
      var code = rs.code  //登录凭证
      if(code){
        
        // 调用授权 获取用户信息接口
        wx.getUserInfo({
          success: function (res) {
            console.log(res)  

            var encryptedData = res.encryptedData
            var iv = res.iv
            var rawData = res.rawData
            var signature = res.signature

            //请求服务器,解密获取openId和unionId
            wx.request({
              url: app.domain + 'teacherapi/Wx_Decode/WxDecode',
              method: 'POST',
              header: { 'content-type': 'application/x-www-form-urlencoded' },
              data: { encryptedData: encryptedData, iv: iv, rawData: rawData, signature: signature ,code:code},
              success: function (res) {
          var data = JSON.parse(res.data.msg)    //json转对象
                console.log(data)  //获取服务器返回的结果
              }
            })            
          }
        })
      }
    }
  })

 

2.后台解密

public function httpGet($url) {
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl, CURLOPT_TIMEOUT, 500);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
        curl_setopt($curl, CURLOPT_URL, $url);
        $res = curl_exec($curl);
        curl_close($curl);
        return $res;
    }

    /**
     * @author: zxf
     * @date: 2018-12-08
     * @description: 解密微信用户敏感数据
     * @return array
     */
    public function WxDecode()
    {
        // 接收参数
        $data = request() -> param();
        
        // 引入解密文件 在微信小程序开发文档下载
        vendor('wx.WXBizDataCrypt');
        vendor('wx.ErrorCode');

        $appid = config('APPID');
        $appsecret = config('APPSECREET');
        $grant_type = "authorization_code"; //授权(必填)

        $code = $data['code'];        //有效期5分钟 登录会话

        $encryptedData=$data['encryptedData'];
        $iv = $data['iv'];
        $signature = $data['signature'];
        $rawData = $data['rawData'];

        // 拼接url
        $url = "https://api.weixin.qq.com/sns/jscode2session?"."appid=".$appid."&secret=".$appsecret."&js_code=".$code."&grant_type=".$grant_type;
        $res = json_decode($this->httpGet($url),true);

        $sessionKey = $res['session_key']; //取出json里对应的值
        $signature2 =  sha1(htmlspecialchars_decode($rawData).$sessionKey);
        // 验证签名
        if ($signature2 !== $signature){
            return json("验签失败");
        } 

        $pc = new \WXBizDataCrypt($appid, $sessionKey);
        $errCode = $pc->decryptData($encryptedData, $iv, $data );

        if ($errCode == 0) {
            return return_succ($data);
        } else {
            return return_error($errCode);
        }
    }

说明:应该必须在线上测试,需要注意的是防止“登录凭证code”过期(有效期5分钟)

解密SDK下载地址 https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/signature.html

转载于:https://www.cnblogs.com/zxf100/p/10087473.html

### 如何在后端从微信小程序登录获取 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` 的情况,则还需继续深入研究有关于敏感资料保护的规定与实践指南,因为这涉及到个人隐私安全方面的重要考量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值