微信小程序的`session_key`是用于在小程序和微信服务器之间进行安全通信的重要密钥。它主要用于以下两个方面:
用户信息解密 :当使用`wx.getUserInfo()`接口获取用户信息时,返回的信息是加密的,需要使用`session_key`进行解密。数据加密和解密:
在小程序开发中,可以使用`session_key`对敏感数据进行加密,或者对加密数据进行解密。例如,使用AES加密算法,根据指定的`session_key`和待加密的数据,生成加密后的数据,并在小程序中发送给后台。后台使用相同的AES解密算法,根据`session_key`和加密后的数据,解密出原始数据。
获取`session_key`的步骤
用户登录:
用户登录小程序后,调用微信提供的登录接口,获取到登录凭证`code`。
服务器请求:
小程序后台将该`code`发送给微信服务器,微信服务器会返回一个包含`session_key`的响应。
保存`session_key`:
小程序后台将`session_key`返回给前端,前端将其保存,作为后续数据加密和解密的密钥。
使用`session_key`进行数据加密和解密
加密数据
在小程序中,使用AES加密算法,根据指定的`session_key`和待加密的数据,生成加密后的数据。
将加密后的数据作为请求参数发送给后台。
解密数据
后台使用与小程序相同的AES解密算法,根据`session_key`和加密后的数据,解密出原始数据。
管理`session_key`
本地缓存:
将`session_key`保存到服务器上,并在小程序本地缓存。在需要使用`session_key`的场景时,先使用`wx.checkSession()`判定一下是否过期。如果没有过期,就把本地的`session_key`传输到服务端进行后续操作。如果本地判定已经过期,则重新调用`wx.login()`生成新的`session_key`。
登录态维护:
`session_key`还可以用于生成登录态,让前端每次请求的时候加上登录态来请求接口,从而保持用户的登录状态。
示例代码
```javascript
// 获取session_key
wx.login({
success: (res) => {
if (res.code) {
// 发起一个http请求到你的服务器,带上res.code
fetchSessionKey(res.code).then(data => {
// data 包含session_key与openid
this.globalData.session_key = data.session_key;
});
}
}
});
// 示例:使用session_key加密数据
function encryptData(data, session_key) {
const encryptedData = wx.getFileSystemManager().readFileSync(data, 'base64');
const signature = wx.getFileSystemManager().md5(encryptedData + session_key);
return {
encryptedData: encryptedData,
signature: signature
};
}
// 示例:使用session_key解密数据
function decryptData(encryptedData, session_key) {
const decryptedData = wx.getFileSystemManager().readFileSync(encryptedData, 'base64');
const signature = wx.getFileSystemManager().md5(decryptedData + session_key);
if (signature === encryptedData) {
return decryptedData;
} else {
throw new Error('数据解密失败');
}
}
```
请注意,以上代码中的`fetchSessionKey`函数需要你自己实现,用于通过`code`换取`session_key`和`openid`。
通过以上步骤和示例代码,你可以在微信小程序中有效地使用`session_key`进行数据加密和解密,并管理用户的登录态。