微信小程序9 关于解密,前端解密
我们之前在学习button时,可以通过调用 getphonenumber 获取手机号,但是获取后却发现是加密了的,那么如何解密呢,微信官方提供了相应的方法。
1.首先我们可以去下载官方提供的解密的js放在本地,推荐放到这个utils文件下。
关键是这个RdWXBizDataCrypt.js文件,可以通过这个名字去百度。
2.在相应的JS文件中引入这个解密js,注意自己的相对路径。
const RdWXBizDataCrypt = require('../../utils/crypto/RdWXBizDataCrypt');
3.首先,我们要通过微信提供的登录方法去获取对应的js_Code,这个很重要。
官方推荐是在加载时获取这个code而不是在方法内部,否则可能会出现加密时的code和解密时的code不一致,因为有时效。
这里代码只截取了一部分,后面再完善,可以看到我在data部分声明了一个变量loginCode用来接收code,方便其他方法使用。
onLoad(options) { //在加载时获取登录的code,只要状态在就可以一直用 wx.login({ success: (res) => { console.log('res:' + JSON.stringify(res)); this.setData({ loginCode: res.code }); 。。。。。。
4.获取到code后,就可以用我们的appId,appsecret和code来获取一个session_key,这个也很重要。
这里是完整的代码,接口地址https://api.weixin.qq.com/sns/jscode2session是微信官方提供的,参数是固定的那几个,我都事先在data中声明了,这里就不暴露出来,appId和appSecret都可以去微信开发者后台查看的。
需要注意的是,如果直接调用接口,会报错没有配置域名,因为微信后台是需要白名单的,如果是公司用,那就配上公司的域名,如果是个人学习,可以在微信开发工具中设置跳过校验,就在右上角的详情选项里,这要就能正常调用。
onLoad(options) { //在加载时获取登录的code,只要状态在就可以一直用 wx.login({ success: (res) => { console.log('res:' + JSON.stringify(res)); this.setData({ loginCode: res.code }); wx.request({ url: 'https://api.weixin.qq.com/sns/jscode2session', data: { appid: this.data.appId, secret: this.data.appSecret, js_code: this.data.loginCode, grant_type: 'authorization_code' }, method: 'GET', header: { 'content-type': 'application/json' }, success: (re) => { console.log('re:' + JSON.stringify(re)); this.setData({ sessionKey: re.data.session_key }) } }) }, }) },
5.在原来的button事件中解密。
用appId和sessionKey去实例化解密js的对象,然后传入加密字符串和偏移量,获取明文号码。
getPhoneNumber(e) { console.log(e); let pc = new RdWXBizDataCrypt(this.data.appid, this.data.sessionKey); let data = pc.decryptData(e.detail.encryptedData, e.detail.iv); console.log('phone:' + data.phoneNumber); },
不仅仅是手机号,任何加密规则相同的官方内容都可以用这一套解密。
需要特别特别注意的是!!!
严谨的情况下其实是在后台解密比较好,包括appId和appSecret都不应该暴露在js中,这里只是示范一下前台的解密,因为有时候可能小的项目,压根没有所谓后端可调用,都放在js里做,这样的话,至少关键的appid这种放到配置文件中去。