返回
小程序获取用户手机号:一文读懂授权、加密、解密全过程
前端
2022-11-05 09:46:19
小程序获取用户手机号:从授权到解密
授权用户手机号
获取用户手机号的第一步是授权用户手机号。可以通过调用 wx.login()
方法来获取用户的登录凭证(code
),该凭证用于向后端交换用户的手机号。
wx.login({
success: function (res) {
if (res.code) {
// 将code发送给后端,用于获取用户手机号
}
}
});
加密用户手机号
后端收到 code
后,需要向微信服务器发送 code
,并使用微信服务器返回的 session_key
对用户的手机号进行加密。加密后的手机号称为 encryptedData
。
// 后端代码示例
const axios = require('axios');
const APPID = 'wxXXXXXXXXXXXXXXXXXXXXXXXXX';
const APPSECRET = 'xxxxxxxxxxxxxxxxxxxxxxxxxx';
const code = '用户登录凭证';
const url = `https://api.weixin.qq.com/sns/jscode2session?appid=${APPID}&secret=${APPSECRET}&js_code=${code}&grant_type=authorization_code`;
axios.get(url).then(res => {
const { session_key } = res.data;
// 使用session_key对用户的手机号进行加密
const encryptedData = encrypt(phoneNumber, session_key);
// 将encryptedData发送给小程序前端
});
解密用户手机号
小程序前端收到 encryptedData
后,需要将其发送给后端,并使用后端返回的解密密钥(iv
)对 encryptedData
进行解密。
// 小程序前端代码示例
const wx = require('@/utils/wx');
const encryptedData = '加密后的手机号';
const iv = '解密密钥';
wx.request({
url: '/api/decrypt',
data: {
encryptedData,
iv
},
success: function (res) {
const phoneNumber = res.data.phoneNumber;
// 获取到用户的手机号,可以做进一步处理
}
});
示例代码
// 后端代码示例
const crypto = require('crypto');
function encrypt(phoneNumber, sessionKey) {
const iv = crypto.randomBytes(16);
const cipher = crypto.createCipheriv('aes-128-cbc', sessionKey, iv);
const encryptedData = cipher.update(phoneNumber, 'utf8', 'base64');
encryptedData += cipher.final('base64');
return {
encryptedData,
iv: iv.toString('base64')
};
}
// 小程序前端代码示例
const wx = require('@/utils/wx');
const encryptedData = '加密后的手机号';
const iv = '解密密钥';
wx.request({
url: '/api/decrypt',
data: {
encryptedData,
iv
},
success: function (res) {
const phoneNumber = res.data.phoneNumber;
// 获取到用户的手机号,可以做进一步处理
}
});
常见问题解答
-
为什么要授权用户手机号?
授权用户手机号是为了获取用户的身份信息,以便为其提供更好的服务,如下单、登录等。 -
如何使用加密后的手机号?
解密后的手机号可以用于多种目的,如发送短信验证码、注册账户等。 -
解密密钥
iv
是什么?
iv
是初始化向量,用于防止相同明文在加密后得到相同的密文,从而增强安全性。 -
解密密钥
iv
是否需要保存?
不需要保存iv
,因为在解密过程中会使用iv
进行解密。 -
如何确保解密密钥
iv
的安全性?
iv
由后端随机生成,并且不会存储在客户端,从而保证了安全性。