微信小程序获取openid,unionid

本文详细介绍了小程序中如何正确识别用户身份,区分了openid与unionid的不同作用,强调unionid才是用户唯一标识。并提供了前端与后端两种获取openid及unionid的方法,包括使用wx.login()与jscode2session接口。

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

  • 注意openid并不能作为小程序用户的唯一标识,不同用户有可能相同,unionid才是唯一标识,这个参数我们需要后台去微信绑定小程序后才有。(通过 https://api.weixin.qq.com/sns/jscode2session? 接口返回的参数获得)

方法一(前端获取)

注意:虽然前端能拿到openid,但是发布上线的时候会无法过审,因为出于安全考虑,前端代码不允许暴露小程序appId和app secret(秘钥),所以此种方法不可取。

1、登录凭证校验,通过 wx.login() 接口获得临时登录凭证 code 后传到开发者服务器调用此接口完成登录流程。更多使用方法详见 小程序登录
image.png
2、接着访问 https://api.weixin.qq.com/sns/jscode2session?

wx.login({
    success: function (res) {
        console.log(res)
         if (res.code) {
            console.log('通过login接口的code换取openid');
             wx.request({
               url: 'https://api.weixin.qq.com/sns/jscode2session',
               data: {
                  //填上自己的小程序唯一标识
                 appid: '',
                  //填上自己的小程序的 app secret
                 secret: '',
                 grant_type: 'authorization_code',
                 js_code: res.code
               },
               method: 'GET',
               header: { 'content-type': 'application/json'},
               success: function(openIdRes){
                    console.info("登录成功返回的openId:" + openIdRes.data.openid);
               },
               fail: function(error) {
                   console.info("获取用户openId失败");
                   console.info(error);
               }
            })
          }
        }
    })

方法二(后端获取)

前面我们说过前端获取openid的方法,项目上线是无法过审的。现在我们把小程序id和app secret给后台,让后台去请求,然后将返回值通过接口返回给我们,就可以了。另外,我们通过后台接口返回的参数unionid作为用户唯一标识
        wx.login({
            success: function (res) {
              console.log(res)
              wx.request({
                url: '后台通过获取前端传的code返回openid的接口地址',
                data: { code: code },
                method: 'POST',
                header: { 'content-type': 'application/json'},
                success: function (res) {
                 if (res.statusCode == 200) {
                   console.log(res.data.result.openid);
                   console.log(res.data.result.unionid);
                 } else {
                   console.log(res.errMsg)
                 }
              },
            })
          }
       })  

image.png
这样,我们就大功告成!!!

### 微信小程序中通过 OpenID 获取 UnionID 在微信生态内,OpenID 是用户在一个特定的小程序中的唯一标识符,而 UnionID 则是在同一微信公众平台下的多个应用(包括公众号、小程序等)之间的通用用户标识。对于已经绑定了微信开放平台账号的应用来说,可以通过用户的授权来获取 UnionID。 #### 接口说明 当开发者希望从小程序端获得用户的UnionID时,并不是直接基于OpenID去查询得到UnionID,而是应该利用`auth.code2Session`接口完成此操作[^3]。该过程涉及前端向后端发送临时登录凭证 code ,由服务器携带 appid secret 向微信服务器发起请求交换 session_key 及可能存在的 unionid 。需要注意的是只有当用户将小程序绑定到微信开放平台上之后才会返回 unionid 字段;如果未绑定,则不会提供 unionid 信息。 具体流程如下: 1. 用户同意授权给小程序; 2. 前端调用微信提供的 `wx.login()` 方法获取临时登录凭证(code); 3. 将code传送给自己的服务端; 4. 服务端使用appid,secret以及收到的code访问`https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code` URL 来换取 openId , session_key (还有可能是unionid); 5. 如果需要进一步处理加密数据(如头像昵称),则还需要解密 encryptedData 参数内的内容才能拿到完整的用户资料,这部分涉及到AES算法的具体实现,在某些框架中有现成工具可以直接调用,比如ThinkPHP 中的做法就是如此[^4]. ```php // PHP示例代码用于解密并获取unionid public function getUionid($sessionKey,$iv,$encryptedData){ /** * 通过$sessionKey,$iv,$encryptedData解密获取unionid */ vendor('wxunionid.wxBizDataCrypt'); $pc = new \WXBizDataCrypt($this->appId, $sessionKey); $unionId = $pc->decryptData($encryptedData, $iv, $data); return json_decode($unionId,true); } ``` 值得注意的是,上述过程中提到的服务端逻辑应当妥善保管好敏感信息(appid/secret/session_key), 并确保传输的安全性以防止泄露风险。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值