1.获取手机号
获取手机号的过程官方文档有详细的介绍。参考官方链接
要注意的是,此功能只对非个人且完成认证的开发者开发,个人开发者无法使用该功能。获取微信用户绑定的手机号,需先调用wx.login接口。
<button open-type="getPhoneNumber" bindgetphonenumber="getPhoneNumber"></button>
//js文件调用获取事件
Page({
getPhoneNumber (e) {
this.data = e;
console.log("1 errMsg", e.detail.errMsg)
console.log("2 iv", e.detail.iv)
console.log("3 encryptedData", e.detail.encryptedData)
var that = this;
var sessionkey = "";
var openid = "";
}
})
这里主要使用到的数据为e.detail.iv和e.detail.encryptedData。此时返回的数据为加密过的手机号码数据,若想显示或者进行验证则需进行数据解密。
2.解密(全局js文件中添加)
手机号码解密主要使用到的数据为:appId(开发者appid)、 session_key、 encryptedData(上边方法中获取的e.detail.encryptedData)、iv(上边方法中获取的e.detail.iv)。
所以在所需数据方面主要要获取的就是session_key。参考官方链接
获取session_key所需的主要参数为:appid、secret(这两个参数都可以在小程序官方-开发-开发设置中获取)、js_code
globalData: {
codeitem: '', // code
phone: '', //解密后的手机号
},
let that = this;
wx.login({
success(res) {
that.globalData.codeitem = res.code;
console.log("0 登录后返回值", that.globalData.codeitem);
}
})
3.获取session_key
var that = this;
var sessionkey = "";
var openid = "";
setTimeout(() => {
wx.request({
url: 'https://api.weixin.qq.com/sns/jscode2session?appid=' + config.appId + '&secret=' + config.sessionKey + '&js_code=' + app.globalData.codeitem + '&grant_type=authorization_code',
method: 'POST',
header: {
'content-type': 'application/json'
},
success: function (res) {
console.log("4", res);
// that.setData({
sessionkey = res.data.session_key,
openid = res.data.openid
// })
}
})
}, 500)
4.解密返回数据
手机号码解密主要使用的是 CryptoJS 包,点击下载。
cryptojs-master下载地址
WXBizDataCrypt.js文件:
/**
* Created by rd on 2017/5/4.
*/
// 引入CryptoJS 路径依个人导入情况变动
var Crypto = require('../cryptojs-master/cryptojs.js').Crypto;
var app = getApp();
function RdWXBizDataCrypt(appId, sessionKey) {
this.appId = appId
this.sessionKey = sessionKey
}
RdWXBizDataCrypt.prototype.decryptData = function (encryptedData, iv) {
// base64 decode :使用 CryptoJS 中 Crypto.util.base64ToBytes()进行 base64解码
var encryptedData = Crypto.util.base64ToBytes(encryptedData)
var key = Crypto.util.base64ToBytes(this.sessionKey);
var iv = Crypto.util.base64ToBytes(iv);
// 对称解密使用的算法为 AES-128-CBC,数据采用PKCS#7填充
var mode = new Crypto.mode.CBC(Crypto.pad.pkcs7);
try {
// 解密
var bytes = Crypto.AES.decrypt(encryptedData, key, {
asBpytes:true,
iv: iv,
mode: mode
});
var decryptResult = JSON.parse(bytes);
} catch (err) {
console.log(err)
}
return decryptResult
}
module.exports = RdWXBizDataCrypt
5.页面wxml中添加按钮
setTimeout(() => {
var WXBizDataCrypt = require('./utils/WXBizDataCrypt')
//需解密的事件中添加下边代码获取解密后的手机号码
var appId = config.appId
var sessionKey = sessionkey
var encryptedData = e.detail.encryptedData
var iv = e.detail.iv
var pc = new WXBizDataCrypt(appId, sessionKey)
var data = pc.decryptData(encryptedData, iv)
if (data == undefined || data == null || data == '') {
// this.getPhoneNumber(this.data);
}
console.log('5 解密后 data: ', data)
that.phone = data.phoneNumber;
app.globalData.phone = data.phoneNumber
console.log("that.app.globalData.phone", app.globalData.phone)
that.onShow()
}, 1000)