微信小程序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这种放到配置文件中去。

posted @ 2023-08-07 14:02  luytest  阅读(368)  评论(0编辑  收藏  举报