深入理解小程序作用机制(openid unionid sessionkey)

在挖小程序漏洞的时候会遇到openid等用户标识,因此了解openid和unionid等是什么必不可少。

开放平台

开放平台是指提供第三方开放API接口的平台,比如微信和QQ。我们在使用其他应用时肯定遇到过QQ登录,微信登录,类似于微信和QQ提供了一个开放API接口的平台。

unionid

应用中用户需要一个标识,unionid就是一个唯一用户标识。但是需要注意的是不同开放平台的unionid是不同的。即:

同一个用户在每一个开放平台对应唯一的unionid

我们在登录时就是获取unionid的过程,由于unionid的不同,所以不会出现登录到别人账号的情况

openid

openid的推出

在刚开始时小程序是可以直接获取unionid的,但是由于每个用户在开放平台的unionid都是唯一的,考虑到数据的安全性。于是在2021年,微信官方规定小程序不再直接获取用户的unionid。并且推荐了一种新的标识openid。

openid的构成

在小程序中openid是由三部分构成:appid,secret,code。

如下图
1.在前台第一步需要用户登录,会调用wx.login去获取一个code。
2.然后后端将code和appid和secret传入微信服务器(与小程序服务器区别)
appid和secret是在开发程序时得到的,与用户无关。
3.微信服务器返回openid等信息。

同一个用户在每一个小程序的openid都是一样的。

用户在小程序a和小程序b得到的openid是一样的。
在这里插入图片描述

openid和unionid的区别

定义和作用:
OpenID:OpenID是微信对用户的唯一标识,用于在同一个小程序或公众号中唯一标识一个用户。
UnionID:UnionID是在微信开放平台上创建的一个开发者账号下所有应用的唯一标识,用于实现多个应用之间的用户关联。

生成方式:
OpenID:微信服务器会为每个用户在每个小程序或公众号中生成一个独立的OpenID。
UnionID:UnionID是由微信用户在微信开放平台上的多个应用之间关联生成的。

sessionkey

sessionkey作用

小程序在使用时,需要向微信服务器获取用户的信息,因此需要开启一个会话,而sessionkey作为一个密钥来解密信息。

session的作用过程

看到上图应该就可以知道,在向微信服务器传入appid,secret和code时得到sessionkey,然后小程序服务器可以拿着sessionkey和用户的登录信息去向微信服务器换取用户在微信服务器的信息。

### 微信小程序中通过 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), 并确保传输的安全性以防止泄露风险。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

&阿权&

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值