小程序获取手机号

本文详细介绍了微信小程序获取用户手机号的步骤,包括WXML页面设置按钮,JS逻辑处理,以及后端Laravel框架下的解密过程。通过解密encryptedData和iv,获取并更新用户手机号。同时,文章提及了授权登录和数据验证的相关操作。
摘要由CSDN通过智能技术生成

注意:(个人号不可获取手机号,可以通过测试号获取手机号)

1.小程序页面(wxml)

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

浏览页面如下:

         

 2.小程序逻辑代码(js)

 //获取手机号
  getPhone(e){
    let errMsg = e.detail.errMsg;
    //加密格式
    let iv =e.detail.iv;
    let encry = e.detail.encryptedData;
    let token = wx.getStorageSync('token');
    let phone = wx.getStorageSync('phone');
      
     //手机号和验证码验证略

      if(errMsg=='getPhoneNumber:ok'){
        //发送请求
        wx.request({
          url: '请求地址',
          data:{
            iv,encry //数据
          },
          header:{
            token
          },
          success:ret=>{
           if(ret.data.code==200){
              wx.setStorageSync('phone',true);
              //跳转到其他页面
            }else{
              //弹出错误信息
              wx.showToast({
                title: ret.data.msg,
                icon:'error'
              })
            }
            }
          })
      }else{
        //跳转到通过短信验证码获取手机号页面
        wx.navigateTo({
          url: '/pages/messageCode/messageCode',
        })
      }
    
  
  },

 3.后台框架(laravel + php)

     /**
     * 微信授权手机号
     */
    public function wxGetPhone(Request $request)
    {
        //接值
        $param = $request->all();
        //非空验证
        $validate = Validator::make($param,[
            'uid' => 'required',
            'iv' => 'required',
            'encry' => 'required'
        ]);

        if($validate->fails()){
           $error = $validate->errors();
           return ['code'=>400,'msg'=>$error->first(),'data'=>''];
        }

        //查询用户信息
        //token在中间件验证后,获取用户id
        $userInfo = User::find($param['uid']);
        //本人的登录为进入小程序自动登录(app.js),并在后台把openid和session_key存储到库中
        //也可在授权登录的同时获取手机号,通过code码,appid,密钥获取session_key和openid
        $aesKey=base64_decode($userInfo->session_key);
        //解密iv
        $aesIV=base64_decode($param['iv']);    
        //解密encryptedData
        $aesCipher=base64_decode($param['encry']);
        //获取手机号
        $result=openssl_decrypt( $aesCipher, "AES-128-CBC", $aesKey, 1, $aesIV);
        $dataObj=json_decode( $result );
        if( $dataObj  == NULL )
        {
            return ['code'=>'404','msg'=>'获取失败','data'=>''];
        }

        //修改用户的手机号
        $userInfo->phone = $dataObj->purePhoneNumber;
        $userInfo->save();

        return ['code'=>200,'msg'=>'获取成功','data'=>''];
    }

 解密成功得到以下代码

 

 其上的iv,encryptedData如何解密,如下:

 

     压缩文件中,关键类在

         

 解密关键

 代码仅供参考,写的不对的地方请指出

微信小程序获取用户手机号需要前端进行授权,后端需要进行解密。以下是完整代码: 前端代码: ``` wx.login({ success: function (res) { if (res.code) { wx.request({ url: 'https://yourdomain.com/onLogin', data: { code: res.code }, success: function (res) { if (res.data.code === 0) { wx.setStorageSync('token', res.data.data.token); wx.getUserInfo({ success: function (res) { wx.request({ url: 'https://yourdomain.com/onGetUserInfo', data: { encryptedData: res.encryptedData, iv: res.iv }, header: { 'Authorization': 'Bearer ' + res.data.data.token }, success: function (res) { console.log(res.data); } }) } }) } else { console.log('登录失败!' + res.errMsg) } } }) } else { console.log('获取用户登录态失败!' + res.errMsg) } } }) ``` 后端代码: ``` <?php namespace app\api\controller; use think\Controller; use think\Request; use app\api\model\User as UserModel; use app\api\service\Token as TokenService; use app\api\service\WxUser as WxUserService; class User extends Controller { public function login() { $code = input('post.code'); $wxUser = new WxUserService($code); $openid = $wxUser->getOpenId(); $user = UserModel::getByOpenId($openid); if (!user) { $user = UserModel::create([ 'openid' => $openid ]); } $token = TokenService::generateToken(); TokenService::saveToCache($token, $user->id); return [ 'code' => 0, 'data' => [ 'token' => $token ] ]; } public function getUserInfo() { $encryptedData = input('post.encryptedData'); $iv = input('post.iv'); $token = TokenService::getCurrentToken(); $uid = TokenService::getUidByToken($token); $user = UserModel::get($uid); $wxUser = new WxUserService(); $wxUser->setSessionKey($user->session_key); $wxUserInfo = $wxUser->getUserInfo($encryptedData, $iv); $user->saveUserInfo($wxUserInfo); return [ 'code' => 0, 'data' => $wxUserInfo ]; } public function getPhoneNumber() { $encryptedData = input('post.encryptedData'); $iv = input('post.iv'); $token = TokenService::getCurrentToken(); $uid = TokenService::getUidByToken($token); $user = UserModel::get($uid); $wxUser = new WxUserService(); $wxUser->setSessionKey($user->session_key); $phoneNumber = $wxUser->getPhoneNumber($encryptedData, $iv); $user->savePhoneNumber($phoneNumber); return [ 'code' => 0, 'data' => $phoneNumber ]; } } ``` 其中,WxUserService是一个封装了微信小程序登录和解密的服务类,UserModel是一个用户模型类,TokenService是一个封装了Token生成和验证的服务类。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值