thinkphp5实现小程序授权获取头像和昵称手机号

ThinkPHP5中实现小程序授权获取头像、昵称和手机号,你需要遵循以下步骤:

  1. 小程序端获取code

首先,在小程序端调用wx.login方法获取临时登录凭证code

wx.login({
  success: res => {
    if (res.code) {
      // 将code发送给后端服务器
      wx.request({
        url: 'https://yourserver.com/api/getUserInfo',
        data: {
          code: res.code
        },
        success: res => {
          console.log(res.data);
        }
      });
    } else {
      console.log('登录失败!' + res.errMsg);
    }
  }
});
  1. 后端服务器通过code获取openid和session_key

在后端服务器(ThinkPHP5)中,使用code调用微信接口获取openidsession_key

public function getUserInfo()
{
    $code = input('post.code');
    $appid = 'your_appid';
    $secret = 'your_secret';

    $url = "https://api.weixin.qq.com/sns/jscode2session?appid={$appid}&secret={$secret}&js_code={$code}&grant_type=authorization_code";

    $response = json_decode(file_get_contents($url), true);

    if (isset($response['openid']) && isset($response['session_key'])) {
        // 保存openid和session_key到数据库,并生成自定义登录态token
        $token = $this->generateToken($response['openid']);
        return json(['token' => $token]);
    } else {
        return json(['error' => '获取用户信息失败'], 500);
    }
}
  1. 获取用户信息

在小程序端调用wx.getUserProfile方法获取用户头像和昵称。

wx.getUserProfile({
  desc: '用于完善会员资料',
  success: res => {
    // 将用户信息发送给后端服务器
    wx.request({
      url: 'https://yourserver.com/api/saveUserInfo',
      method: 'POST',
      data: {
        avatarUrl: res.userInfo.avatarUrl,
        nickName: res.userInfo.nickName,
        token: 'your_custom_token'
      },
      success: res => {
        console.log(res.data);
      }
    });
  }
});

在后端服务器(ThinkPHP5)中,保存用户信息到数据库。

public function saveUserInfo()
{
    $avatarUrl = input('post.avatarUrl');
    $nickName = input('post.nickName');
    $token = input('post.token');

    // 根据token获取openid
    $openid = $this->getOpenIdByToken($token);

    if ($openid) {
        // 保存用户信息到数据库
        $userInfo = [
            'openid' => $openid,
            'avatar_url' => $avatarUrl,
            'nick_name' => $nickName
        ];

        // 这里假设你有一个User模型来操作数据库
        $userModel = new User();
        $userModel->save($userInfo);

        return json(['success' => true]);
    } else {
        return json(['error' => '获取用户信息失败'], 500);
    }
}
  1. 获取手机号

在小程序端调用wx.loginwx.requestPayment方法获取手机号。

wx.login({
  success: res => {
    if (res.code) {
      wx.requestPayment({
        timeStamp: '...',
        nonceStr: '...',
        package: '...',
        signType: 'MD5',
        paySign: '...',
        success: res => {
          // 将encryptedData和iv发送给后端服务器
          wx.request({
            url: 'https://yourserver.com/api/getPhoneNumber',
            method: 'POST',
            data: {
              encryptedData: res.encryptedData,
              iv: res.iv,
              session_key: 'your_session_key'
            },
            success: res => {
              console.log(res.data);
            }
          });
        }
      });
    } else {
      console.log('登录失败!' + res.errMsg);
    }
  }
});

在后端服务器(ThinkPHP5)中,解密手机号。

public function getPhoneNumber()
{
    $encryptedData = input('post.encryptedData');
    $iv = input('post.iv');
    $sessionKey = input('post.session_key');

    $pc = new WXBizDataCrypt($this->appid, $sessionKey);
    $errCode = $pc->decryptData($encryptedData, $iv, $data);

    if ($errCode == 0) {
        $phoneNumber = json_decode($data, true)['phoneNumber'];
        // 保存手机号到数据库
        $this->savePhoneNumber($phoneNumber);

        return json(['success' => true]);
    } else {
        return json(['error' => '获取手机号失败'], 500);
    }
}

注意:在实际应用中,你需要处理异常情况,例如网络错误、参数错误等。同时,为了保证安全性,你应该对敏感数据进行加密处理。

0 条评论

还没有人发表评论

发表评论 取消回复

记住我的信息,方便下次评论
有人回复时邮件通知我