按照官网要求:从基础库 2.21.2 开始,对获取手机号的接口进行了安全升级 ;因为需要用户主动触发才能发起获取手机号接口,所以该功能不由api来调用,需用 button 组件的点击来触发 。
HTML部分
需要将 button 组件 open-type 的值设置为 getPhoneNumber,当用户点击并同意之后,可以通过 bindgetphonenumber 事件回调获取iv和encryptedData
<button open-type="getPhoneNumber" @getphonenumber="getPhoneNumber">一键登录</button>
JS部分
getPhoneNumber(e) {
// 点击触发的回调
console.log(e);
// 开发者兼容用户点击了拒绝的使用场景
if (e.target.errMsg == 'getPhoneNumber:fail user deny') {
console.log('用户点击了拒绝');
uni.showToast({
title: '您取消了授权!!!',
icon: 'none'
});
} else {
console.log('点击了允许', e.target);
// 利用后台去解密
let { iv, encryptedData } = e.target;
//利用uni.login方法获取临时登录凭证code
uni.login({
success: (res) => {
console.log(res);
let code = res.code;
// 向后端发起网络请求
uni.request({
url: 'http://localhost:3000/registration/getToken', //服务器地址
method: 'GET', //请求方式
data: {
//接口参数
iv,
encryptedData,
code,
},
success: (res) => {
console.log('手机号', res);
}
});
}
});
}
},
需要在微信官方文档下载解密文件微信官方文档
解压后将node里面的 WXBizDataCrypt.js放在对应的目录里面
nodejs后端部分
const express = require('express');
const router = express.Router();
const request = require('request')
// 引入从微信官方文档中下载的请求模块
var WXBizDataCrypt = require('../utils/WXBizDataCrypt')
const ART_APP_ID = 'xxxxxxxxxxxxx'//AppID(小程序ID)
const ART_APP_SECRET = 'xxxxxxxxx'//AppSecret(小程序密钥)
// 获取手机号
router.get('/getToken', (req, res) => {
console.log('请求参数req:', req.query)
// 后台需要参数appid encryptedData code(临时登录凭证)
let { iv, encryptedData, code } = req.query
request("https://api.weixin.qq.com/sns/jscode2session?appid=" + ART_APP_ID + "&secret=" + ART_APP_SECRET + "&js_code=" + code + "&grant_type=authorization_code", (e, r, b) => {
let vals = JSON.parse(b)
var sessionKey = vals.session_key
var pc = new WXBizDataCrypt(ART_APP_ID, sessionKey)
var data = pc.decryptData(encryptedData, iv)
res.send(data)
})
})
module.exports = router;
最后当然就拿到了啊,拜拜