要获取用户手机号,首先需要用户同意授权其手机号给小程序。可以使用wx.login()获取用户的code,然后调用wx.request()向微信服务器发起请求,获取到session_key和encryptedData等信息,再进行解密。
获取流程如下:
-
先调用wx.login()获取用户的code。
-
在小程序后台配置开发者服务器域名,在小程序中使用wx.request()向服务器发起请求,获取session_key和encryptedData等信息。
-
在服务器端进行解密,可以使用第三方库crypto-js来解密。
-
解密后即可获取用户手机号。
示例代码:
在前端调用:
wx.login({
success: res => {
// 发送 res.code 到后台换取 openId, sessionKey, unionId
wx.request({
url: 'https://example.com/api/wechat/decodePhoneNumber',
data: {
code: res.code,
encryptedData: res.encryptedData,
iv: res.iv
},
success: function (res) {
console.log(res.data.phoneNumber);
}
})
}
})
在后端解密:
const crypto = require('crypto-js');
function decodePhoneNumber(sessionKey, encryptedData, iv) {
const sessionKeyBuffer = new Buffer(sessionKey, 'base64');
const encryptedDataBuffer = new Buffer(encryptedData, 'base64');
const ivBuffer = new Buffer(iv, 'base64');
const decipher = crypto.createDecipheriv('aes-128-cbc', sessionKeyBuffer, ivBuffer);
decipher.setAutoPadding(true);
let decoded = decipher.update(encryptedDataBuffer, 'binary', 'utf8');
decoded += decipher.final('utf8');
decoded = JSON.parse(decoded);
if (decoded.watermark.appid !== APPID) {
throw new Error('Invalid appId');
}
return decoded;
}