美文网首页php知识积累
小程序授权获取手机号

小程序授权获取手机号

作者: hey_沙子 | 来源:发表于2019-11-26 12:00 被阅读0次

    这是小程序授权获取手机号的步骤

    第一步: wx.login---> 获取登录凭着(code)
    第二步:将code发送到后端--->后端用code换session_key和openid
    第三步:小程序调getPhoneNumber--->将encryptedData和iv传给后台
    第四步:后台进行解密得到json--->进而获取到手机号

    第一步:获取登录凭证code

    这个code码是使用小程序登录接口完成后取的,这个wx.request()请求是为了把code发送到后端,后端用code换取session_key和openid。

    //获取手机号前先获取openid和session_key
    wx.login({
        success: function (res) {
          if (res.code) { //使用小程序登录接口完成后端用户登录
            wx.request({
              url: app.d.hostUrl + 'getOpenId',//你自己api接口的路径
              data: {
                code: res.code,
                appid: "你的小程序AppID",
                secret: "你的小程序secret",
              },
              success: function (res) {
                //把openid保存到缓存里
                wx.setStorageSync("openid", res.openid);
                wx.setStorageSync("session_key", res.session_key);
              }
            })
          } else {
            console.log('获取用户登录态失败!' + res.errMsg)
          }
        }
    

    前端已经把获取openid和session_key需要的参数传给后端了,接下来就是后端的事了

    第二步:后端用code换session_key和openid
    //获取微信openId,
        public function getOpenId($dataArr){
            $retArr["ret"] = array("retCod" => "0", "retMsg" => "get openId  is success!");
            $code = $dataArr['code'];
            $appid = $dataArr['appid'];
            $secret = $dataArr['secret']; 
            $api = "https://api.weixin.qq.com/sns/jscode2session?appid=".$appid."&secret=".$secret."&js_code=".$code."&grant_type=authorization_code";
            $str = $this->doCurl($api);
            $str = json_decode($str,true);
            $retArr['data']['openid']= $str['openid'];
            $retArr['data']['session_key']= $str['session_key'] ;
            return $retArr;
        }
       //处理接口请求
        public function doCurl($url)
        {
            $curl = curl_init();
            // 使用curl_setopt()设置要获取的URL地址
            curl_setopt($curl, CURLOPT_URL, $url);
            // 设置是否输出header
            curl_setopt($curl, CURLOPT_HEADER, false);
            // 设置是否输出结果
            curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
            // 设置是否检查服务器端的证书
            curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
            // 使用curl_exec()将CURL返回的结果转换成正常数据并保存到一个变量
            $data = curl_exec($curl);
            // 使用 curl_close() 关闭CURL会话
            curl_close($curl);
            return  $data;//json_decode($data);
        }
    

    这样,前端success就能拿到openid和session_key了,现在,我们要在后端通过php,用session_key和openid来解密获取手机号码

    第三步:调用getPhoneNumber,将encryptedData和iv传给后台

    那现在(wxml)需要有一个按钮触发,点了那个按钮就能获取手机号码了

    <button class='bottom' 
                type='primary' 
                open-type="getPhoneNumber" 
                lang="zh_CN"                                                    
               bindgetphonenumber="bindGetPhoneNumber">微信登录授权
    </button>
    
    //点击获取用户手机号按钮,这样手机号就获取到了
      bindGetPhoneNumber: function (e) {
        if (e.detail.errMsg== "getPhoneNumber:ok"){
            wx.showLoading({
              title: '授权登录中...',
            })
            var that = this;
            var detail = e.detail;
            var iv = detail.iv;
            var encryptedData = detail.encryptedData;
            var appid = app.globalData.appid;
            var userInfo = app.globalData.userInfo;
            var session_key = userInfo.session_key;
            allApi.getUserMobile({
              uid: "",
              v: app.globalData.v,
              imei: app.globalData.imei,
              sid: "",
              sign: "",
              appKey: app.globalData.appKey,
              src: app.globalData.src,
              r: app.globalData.r,
              city_id: app.globalData.city_id,
              city_name: app.globalData.city_name,
              data: { "appid": appid,
                      "session_key": session_key,             
                      "encryptedData": encryptedData,
                      "iv": iv },
           })
          .then((res) => {
            if (res.data.ret.retCod == 0) {
              wx.hideLoading();
              var mobile = res.data.data.mobile;
              var userInfo = that.data.userInfo;
              userInfo.mobile = mobile;
              wx.setStorageSync("wxUserInfo", userInfo);
              app.globalData.userInfo = userInfo;
              that.setData({
                'mobile': mobile,
                'isAuth': false,//改为不需要授权
                'userInfo': userInfo,
              })
              that.addUserMobile();
            }else{
              wx.showLoading({
                title: '请求超时,请重试',
              })
              setTimeout(this.hideLoadTip, 2000);
            }
    
          }).catch(function (error) {
            wx.hideLoading()
            wx.showToast({ icon: "none", title: "授权失败", duration: 1000 })
          })
        }
    },
    
    第四步:通过传参appid、session_key、encryptedData、iv解密获取手机号

    因为涉及到解密手机号,所以先看下官方文档
    小程序开发文档流程
    https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/signature.html

    下载解密文件.png

    这个官方的demo文件很简单,大家可以根据自己的业务需求是更改


    image.png
     public function getUserMobile($dataArr) {
        $retArr["ret"] = array("retCod" => "0", "retMsg" => "get wx user mobile is success!");
        $appid = $dataArr['appid'];
        $sessionKey = $dataArr['session_key'];
        $encryptedData = $dataArr['encryptedData'];
        $iv = $dataArr['iv'];
        //WxBizDataCrypt该类是官方提供的那个
        $pc = new WxBizDataCrypt($appid, $sessionKey);
        $errCode = $pc->decryptData($encryptedData, $iv, $data);
        if ($errCode == 0) {
              $phone = json_decode($data)->phoneNumber;
            $retArr['data']['mobile']= $phone;
        } else {
            $retArr["ret"] = array("retCod" => "-1", "retMsg" => "get wx user info  is fail!");
        }
        return $retArr;
    }

    相关文章

      网友评论

        本文标题:小程序授权获取手机号

        本文链接:https://www.haomeiwen.com/subject/rqtkictx.html