- 配置 app.json
在项目根目录的 app.json 文件中,配置需要的权限:
{
"pages": [
"pages/index/index"
],
"permission": {
"scope.userInfo": {
"desc": "用于获取您的手机号"
}
}
}
- 在页面中添加获取手机号按钮
在 pages/index/index.wxml 文件中,添加获取手机号的按钮:
<view class="container">
<button open-type="getPhoneNumber" bindgetphonenumber="getPhoneNumber">获取手机号</button>
</view>
- 编写获取手机号的逻辑
在 pages/index/index.js 文件中,编写获取手机号的逻辑:
Page({
data: {},
getPhoneNumber(e) {
if (e.detail.errMsg === "getPhoneNumber:ok") {
// 用户同意获取手机号
const { encryptedData, iv } = e.detail;
wx.login({
success(res) {
if (res.code) {
// 发起网络请求,将 encryptedData, iv 和 res.code 发送给后台
wx.request({
url: '你的后台服务地址',
method: 'POST',
data: {
code: res.code,
encryptedData: encryptedData,
iv: iv
},
success(response) {
if (response.data.success) {
console.log("手机号获取成功", response.data.phoneNumber);
} else {
console.log("手机号获取失败", response.data.message);
}
},
fail(error) {
console.log("网络请求失败", error);
}
});
} else {
console.log('登录失败!' + res.errMsg);
}
}
});
} else {
console.log('用户拒绝授权获取手机号');
}
}
});
四、后端解密用户手机号
在后端,需要解密微信返回的 encryptedData 和 iv,获取用户的手机号。以下是一个使用 Node.js 和 wechat-miniprogram SDK 的示例:
const crypto = require('crypto');
const request = require('request');
const appId = 'yourAppId';
const appSecret = 'yourAppSecret';
function getSessionKey(code) {
return new Promise((resolve, reject) => {
request({
url: `https://api.weixin.qq.com/sns/jscode2session?appid=${appId}&secret=${appSecret}&js_code=${code}&grant_type=authorization_code`,
method: 'GET',
json: true
}, (error, response, body) => {
if (!error && response.statusCode === 200) {
resolve(body.session_key);
} else {
reject(error || body);
}
});
});
}
function decryptData(sessionKey, encryptedData, iv) {
let decoded;
try {
const decipher = crypto.createDecipheriv('aes-128-cbc', Buffer.from(sessionKey, 'base64'), Buffer.from(iv, 'base64'));
decipher.setAutoPadding(true);
decoded = Buffer.concat([decipher.update(Buffer.from(encryptedData, 'base64')), decipher.final()]);
decoded = JSON.parse(decoded.toString());
} catch (err) {
throw new Error('解密失败');
}
if (decoded.watermark.appid !== appId) {
throw new Error('AppID 不匹配');
}
return decoded;
}
// 假设这是你的 API 处理函数
async function handleGetPhoneNumber(req, res) {
const { code, encryptedData, iv } = req.body;
try {
const sessionKey = await getSessionKey(code);
const phoneData = decryptData(sessionKey, encryptedData, iv);
res.json({ success: true, phoneNumber: phoneData.phoneNumber });
} catch (error) {
res.json({ success: false, message: error.message });
}
}
差不多流程就是这样,可根据实际开发需求情况改变代码