微信小程序前端解密获取手机号

Posted 三线码工

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了微信小程序前端解密获取手机号相关的知识,希望对你有一定的参考价值。

微信小程序在获取用户手机号时安全正确的做法是把获取的iv等信息传递给后端,让后端解密,再提供接口返回给前端。

但是遇到一下比较一般的后端或者懒的后端的话,前端也可以考自己完成手机号解密。

1.使用授权手机号组件按钮

<view class="button">
      
      <button open-type="getPhoneNumber" bindgetphonenumber="getPhoneNumber">获取手机号</button>
    </view>

2.下载RdWXBizDataCrypt 解密文件

https://download.csdn.net/download/qq_35946021/87123755 免费下载

3.在需要解密的地方引用该文件

       var WXBizDataCrypt = require('../../utils/RdWXBizDataCrypt');

4.先使用登录接口,再拿到后端给的session_key

login()
    wx.login(
      success: (res) => 
       console.log(res)
        api.getOpenidAction(
          js_code:res.code
        ).then(re=>
          console.log(re)
          this.setData(
            openid:re.Data.openid,
            code:res.code,
            session_key:re.Data.session_key
          )

        )
      
    )
  ,

5.再使用手机号组件传参的encryptedData和iv

关键代码:

        new一个WXBizDataCrypt对象,传APPID和session_key

        再使用decryptData解密方法,传参encryptedData和iv

 getPhoneNumber (e) 
    console.log(e.detail.errMsg)
    console.log(e.detail.iv)
    console.log(e)
     
      var pc = new WXBizDataCrypt("wxexxxxxxxxxxxxx6", this.data.session_key)  
      var data = pc.decryptData(e.detail.encryptedData , e.detail.iv)
      console.log('解密后 data: ', data)
     
 
    
  ,

控制台打印机密后的数据就可以用了

微信小程序获取手机号并解密

开发微信小程序的时候经常会遇到要  绑定用户手机号的需求   这里我们就要首先获取用户信息中的手机号 :

 

首先是 页面上的做法 (只需一句话)   wxml:

    <button class="btn" open-type="getPhoneNumber" bindgetphonenumber="getPhoneNumber" >手机号认证</button>

  

然后就是  js(wx) :

里面有好多调试代码   这里我就不清理了 (嘻嘻嘻)

 

 /**
   * 授权手机号
   * @param {*} e 
   */
  getPhoneNumber: function(e) { 
    console.log("手机号iv");
    console.log(e.detail.iv) 
    console.log("手机号encryptedData");
    console.log(e.detail.encryptedData)
    // var session_key = wx.getStorageSync(‘session_key‘);
    // console.log(‘session_key‘);
    // console.log(session_key);

    console.log("config appid");
    console.log(site.AppID);
    var that=this;

    wx.login({
      success: res => {
        console.log("手机号rescode");
        console.log(res.code);
        console.log(res);
        /**
         * 这里重新获取session_key 的请求放到后台去因为如果放在小程序中的话  还需要端口认证
         */
        // wx.request({
        //   url: ‘https://api.weixin.qq.com/sns/jscode2session?appid=wxe1bd8e4045ad80ba&secret=9fbf669bb61ddfdd2d455eebe1d6fdf5&js_code=‘+res.code+‘&grant_type=authorization_code‘,
        //   success:function(resc){
        //   console.log(‘哈哈哈哈‘)
        //   console.log(resc)

          wx.request({
            url: decode,
            data:{
              data:e.detail.encryptedData,
              iv: e.detail.iv,
              code:res.code
            },
            success:function(res){
                console.log("解密之后");
                console.log(res);
                console.log("返回手机号");
                console.log(res.data.data.data.phoneNumber);
                
               
                var timestamp=new Date().getTime()
                var data = {
                  "timestamp":timestamp,
                  "url":(checkphone+"").replace(config.baseUrl,""),
                  "user_id":userid,
                  ‘phone‘:res.data.data.data.phoneNumber,
                }
                var sign=utils.makeSign(site.siteTokenKey,data)
                var phone = res.data.data.data.phoneNumber;
                if(res.data.data.flag==1){

                  wx.request({
                    url: checkphone,
                    method: "POST",
                    data:data,
                    header: {
                      "Content-Type": "application/x-www-form-urlencoded",
                      "sign":sign,
                      ‘timestamp‘:timestamp
                    },
                    success: function (res) {
                      console.log(res);
                      if(res.data.data.flag == 1){
                        wx.navigateBack({
                          delta: 1
                        })
                      }
                      if(res.data.data.status == 0){
                        wx.showToast({
                          title: ‘保存失败‘,
                          icon: ‘none‘,
                          duration: 2000
                         })
                      }
                    },
                  })
                }else{
                  wx.navigateBack({
                    delta: 1
                  })
                }
            }
          })

          // }
        // })

    
       
      }
    })
  
}

  

接下来就是 后端解密以及将手机号更新到数据库的主程序了(php 版本):   

  

  /**
     * 解密
     */
    public function decode(){

        //siteconfig读取类
        $siteConfigObj = new Config("site_config");
        $site_config   = $siteConfigObj->getInfo();

        $data=IFilter::act(IReq::get(‘data‘));
        $iv=IFilter::act(IReq::get(‘iv‘));
//      $sessionkey=IFilter::act(IReq::get(‘sessionkey‘));
        $code=IFilter::act(IReq::get(‘code‘));
        $decrypt = new WxServerApi();

        //siteconfig中记录的appid以及secret
        $appid=$site_config[‘wechat_AppID‘];
        $secret=$site_config[‘wechat_AppSecret‘];

        //生成一个新的session_key
        $ccc="https://api.weixin.qq.com/sns/jscode2session?appid=$appid&secret=$secret&js_code=$code&grant_type=authorization_code";

        $content=$this->curl($ccc);
        $content=json_decode($content);

        $sessionkey=$content->session_key;

        $config=new Config(‘site_config‘);
        $appid=$config->wechat_AppID;
        if (strlen($sessionkey) != 24) {
            Block::sendRseult(200,‘goods detail success‘,[
                ‘flag‘=>0,
                ‘data‘=>‘false1‘,
            ]);
        }
        $aesKey=base64_decode($sessionkey);


        if (strlen($iv) != 24) {
            Block::sendRseult(200,‘goods detail success‘,[
                ‘flag‘=>0,
                ‘data‘=>‘false2‘,
            ]);
        }
        $aesIV=base64_decode($iv);

        $aesCipher=base64_decode($data);

        $result=openssl_decrypt( $aesCipher, "AES-128-CBC", $aesKey, 1, $aesIV);
        /**
         * 这里再次判断一次的原因是因为  重新生成的session_key  第一次解密会出现返回false的情况  第二次就正常  so.....
         */
        if($result==false){
            $result=openssl_decrypt( $aesCipher, "AES-128-CBC", $aesKey, 1, $aesIV);
        }

        $dataObj=json_decode( $result );
        if( $dataObj  == NULL )
        {
            Block::sendRseult(200,‘goods detail success‘,[
                ‘flag‘=>0,
                ‘data‘=>‘false3‘,
            ]);
        }
        if( $dataObj->watermark->appid != $appid )
        {
            Block::sendRseult(200,‘goods detail success‘,[
                ‘flag‘=>0,
                ‘data‘=>‘false4‘,
            ]);
        }

        Block::sendRseult(200,‘goods detail success‘,[
            ‘flag‘=>1,
            ‘data‘=>$dataObj,
        ]);

    }

  

这里值得一提的就是重新生成了session_key  去做解密操作 

$result=openssl_decrypt( $aesCipher, "AES-128-CBC", $aesKey, 1, $aesIV);

的时候 第一次总是会会出现返回false的情况 第二次就正常了 所以需要判断false 然后在执行一遍 (虽然办法有点笨 但是很有效 如果有更好的办法 请在评论区中留言 欢迎欢迎!!!)

到这里基本上就结束了手机认证 感谢您的耐心阅读 希望可以帮到您! bingo!!

 

以上是关于微信小程序前端解密获取手机号的主要内容,如果未能解决你的问题,请参考以下文章

uniapp:微信小程序获取用户手机号

微信小程序手机号解密

uni-app 微信小程序获取手机号并解密

微信小程序中encryptedData存在的意义

微信小程序解密手机号(欢迎指点留言)

php 微信小程序获取手机号, 服务器端解密有时成功,有时-41001,这是为啥