thinkphp项目解析登录模块

小程序登录官方流程

php(ThinkPHP)实现微信小程序的登录过程

微信小程序登录态验证流程

wulongtao/think-wxminihelper

   public function login()
    {
        $code = input("code", '', 'htmlspecialchars_decode');
        $rawData = input("rawData", '', 'htmlspecialchars_decode');
        $signature = input("signature", '', 'htmlspecialchars_decode');
        $encryptedData = input("encryptedData", '', 'htmlspecialchars_decode');
        $iv = input("iv", '', 'htmlspecialchars_decode');
        $superior_id = input("superior_id",0);

        $return = LoginLogic::getInstance()->wxLogin($code, $rawData, $signature, $encryptedData, $iv,$superior_id);
        return $this->result($return);
    }
public function wxLogin($code, $rawData, $signature, $encryptedData, $iv, $superior_id)
    {
        //微信认证服务
        $wxLogin = WXLoginHelper::getInstance()->checkLogin($code, $encryptedData, $iv);
        Log::info(json_encode($wxLogin));
        Log::info(urldecode($rawData));
        //判断数据是否正常返回
        if (isset($wxLogin['message'])) {
            return $wxLogin;
        }
        //获取openid对应用户信息
        $userinfo = UserService::getInstance()->getUserInfoByOpenid($wxLogin['openid']);
        //入库
        if (empty($userinfo)) {
            //解析数据
            $wxHelper = WXLoginHelper::getInstance()->checkdecrypt(
                $code,
                $rawData,
                $signature,
                $encryptedData,
                $iv,
                $wxLogin['openid'],
                $wxLogin['session_key']
            );
            if (isset($wxHelper['message'])) {
                Log::info('解析失败');
                //解析data
                $raw = json_decode(urldecode($rawData), true);
                $wxHelper = array_merge($raw, $wxHelper);
            }
            //添加用户信息
            $userinfo = UserService::getInstance()->setUserinfo(
                $wxHelper['nickName'],
                $wxHelper['openId'] ?? $wxLogin['openid'],
                ($wxHelper['unionId'] ?? $wxLogin['openid'] ?? ''),
                $wxHelper['avatarUrl'],
                UserConst::TYPE_USER
            );

            //添加用户amount信息表
            if ($userinfo['is_insert']) {
                UserAmountModel::getInstance()->setUserAmount($userinfo['id']);
            }

            //上级关系
            UserFrinedModel::getInstance()->setFriend($superior_id, $userinfo['id']);
        }

        $return['token'] = Jwt::getToken($userinfo);

        return $return;
    }

WXLoginHelper

think-wxminihelper

基于ThinkPHP5.0的微信小程序composer包。
安装方法:

composer require xxh/think-wxminihelper

WXLoginHelper原理

微信小程序前端部分

/**
 * 登录
 */
function wxLogin(func) {
    //调用登录接口
    //1.小程序调用wx.login得到code.
    wx.login({
      success: function (res) {
        var code = res['code'];
        //2.小程序调用wx.getUserInfo得到rawData, signatrue, encryptData.
        wx.getUserInfo({
          success: function (info) {
            console.log(info);
            var rawData = info['rawData'];
            var signature = info['signature'];
            var encryptData = info['encryptData'];
            var encryptedData = info['encryptedData']; //注意是encryptedData不是encryptData...坑啊
            var iv = info['iv'];

            //3.小程序调用server获取token接口, 传入code, rawData, signature, encryptData.
            wx.request({
              url: constants.LOGIN_URL,
              data: {
                "code" : code,
                "rawData" : rawData,
                "signature" : signature,
                "encryptData" : encryptData,
                'iv' : iv,
                'encryptedData': encryptedData
              },
              success: function(res) {
                if(res.statusCode != 200) {
                    wx.showModal({
                        title: '登录失败'
                    });
                }
                typeof func == "function" && func(res.data);
              }
            });
          }
        });
      }
    });
}

php部分

你可能感兴趣的:(thinkphp项目解析登录模块)