wx小程序授权登录 和 授权获取手机号

小程序授权登录,所有用户包括个人用户都可以获取:

前端wxml只需给出一个按钮,

<button bindtap="login">授权登录</button>

js部分使用wx.getUserProfile和wx.login函数

login(){
  wx.getUserProfile({
    desc: 'desc',
    success:info=>{
      wx.login({
        success:code=>{
          wx.request({
            url: 'http://www.xxx.com/api/login',
            method:"POST",
            data:{
              nickName:info.userInfo.nickName,
              avatarUrl:info.userInfo.avatarUrl,
              code:code.code
            },
            success:res=>{
              if(res.data.code != 200){
                wx.showToast({
                  title: '登录失败',
                  icon:'error'
                })
                return
              }
              wx.setStorageSync('token', res.data.data)
            }
          })
        }
      })
    }
  })
},

获取用户信息和code码,将code传到后端,

使用php和curl请求登录api获取openid和session_key用作手机号授权

public function login(Request $request)
{
    // 获取code
    $code = $request->input("code");
    // 获取昵称
    $nickname = $request->input("nickName");
    // 获取头像
    $img = $request->input("avatarUrl");
    // 从微信公众平台获得appid
    $appid = "xx";
    // 从微信公众平台获得secret
    $secret = "xx";
    // 发送请求换取openid和sessionkey
    $url = "https://api.weixin.qq.com/sns/jscode2session?appid=$appid&secret=$secret&js_code=$code&grant_type=authorization_code";
    // 暂使用file_get_contents()发送请求,你可以使用CURL扩展的形式实现
    $res = json_decode(file_get_contents($url), true);
    // 组装用户数据
    $info = [
        'nickname' => $nickname,
        'img'=>$img,
        'openid' => $res['openid'],
        'session_key' => $res['session_key']
    ];
    // 查询用户是否是第一次登录
    $user = Login::where("openid", $res['openid'])->first();
    // 判断
    if ($user) {
        return ['code' => 200, 'msg' => '已经注册过', 'data' => $user];
    }
    
    $data = Login::create($info);
    return ['code' => 200, 'msg' => '注册成功', 'data' => $data];
}

授权获取手机号: 个人AppID无法获取手机号,需要先申请测试号

使用方法:将 button 组件 open-type 的值设置为 getPhoneNumber,当用户点击并同意之后,可以通过 bindgetphonenumber 事件回调获取到微信服务器返回的加密数据, 然后在第三方服务端结合 session_key 以及 app_id 进行解密获取手机号。

微信官方文档:获取手机号 | 微信开放文档

小程序端wxml代码:

<button open-type="getPhoneNumber" bindgetphonenumber="getPhoneNumber">
    手机号授权
</button>

js:

getPhoneNumber (e) {
    let iv = e.detail.iv
    let encryptedData = e.detail.encryptedData
    let token = wx.getStorageSync('token')
    wx.request({
      url: 'http://www.xxx.com/api/getPhone',
      data:{
        iv,
        encryptedData,
        token
      },
      method:'POST',
      success:res=>{
          console.log(res)
      }
    })
}

 注意:iv、 encryptedData是必要参数

解密:


//获取手机号
public function getPhoneNumber(Request $request)
{
    $params = $request->all();
    $user_id = (new Token())->chekToken($params['token']);
    try{
        //获取用户信息
        $user = User::where('id',$user_id)->first();
        $aesKey = base64_decode($user->session_key);
        $aesIV = base64_decode($params['iv']);
        $aesCipher = base64_decode($params['encryptedData']);
        $result = openssl_decrypt($aesCipher, "AES-128-CBC", $aesKey, 1, $aesIV);
        $phoneNumber = json_decode($result, true)['purePhoneNumber'];
        //更改手机号
        $user->phone = $phoneNumber;
        $user->save();
        return ['code' => 200,'msg' => 'ok'];
    }catch (\Exception $e){
        return ['code' => 400,'msg' => $e->getMessage()];
    }
 
}

这样就完成了

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值