微信登录授权的一个记录。

与小程序的区别

先来说说与小程序的区别,在小程序里面,在管理后台配置好自身服务器域名后,只需要调用getUserInfo,即提示用户授权信息,可以获取当前用户的微信名、头像、地区等等信息,以及所需的code。自身服务器得到code后,再将code发送给微信服务器,调用换取接口,即可获得openid和token等微信登录相关信息。 整个流程还是比较简单的。

而在H5授权登录页面里,同样需要先配置自身的服务器域名,但是之后的步骤有点不一样。

H5登录授权

(以下操作都默认已经在微信授权后台配置好了域名。)

授权流程

  1. 发起授权
    获得appId以及appSecrect后,只要在微信端打开

    https://open.weixin.qq.com/connect/oauth2/authorize?appid='.$this->appId.'&redirect_uri='.$dir_url.'&response_type=code&scope=snsapi_userinfo&state='.$state.'#wechat_redirect

    即可在发起微信授权,考虑到具体的业务逻辑,这里我定义了一个小接口,用于前端的访问
    /**
     * 微信登录重定向
     */
    public function toLogin(){
        $dir_url="http://".$_SERVER['SERVER_NAME'].url("Login/login"); //绝对路径,必须以/结尾 返回地址
        $state = '';
//        echo $this->appId;die;
        header('location:https://open.weixin.qq.com/connect/oauth2/authorize?appid='.$this->appId.'&redirect_uri='.$dir_url.'&response_type=code&scope=snsapi_userinfo&state='.$state.'#wechat_redirect');
     }

/*
$dir_url 即为真正执行登录流程的接口,在授权成功后,则会回调这个接口,这时候正常登录就可以了。

补充这个接口的意义在于,能够让前端在一些需要授权登录的页面直接调用,不用考虑其他细节,因为是服务端重定向,所以会照常返回登录的一些信息。  这样业务逻辑就很像小程序的getUserInfo了。

实际上由前端去打开授权页面也是可以的,具体看业务逻辑。 总之最终都是授权成功后回调到真正的业务登录接口。
*/


2.授权成功

授权成功后,微信会以GET请求方式,发送一个code到回调服务器(也就是我们的项目服务器),得到了code,可以用这个code去访问微信服务器,换取微信登录的token,以及该用户的openid(项目内的用户唯一标示)。此后,再将token以及openid,再次发送到微信服务器上,换取我们真正需要的用户信息,头像、微信名、性别、地区等。

听起来有点绕,实际流程就是这样的:

code =====> 换取openid和token =======> 换取用户信息。

demo如下:

         //code换取token和openid
            $code = request()->get('code','');

            $url = 'https://api.weixin.qq.com/sns/oauth2/access_token?appid='.$this->appId.'&secret='.$this->appSecret.'&code='.$code.'&grant_type=authorization_code';

            $res = $this->makeRequest($url);

            $data = json_decode($res['result'],true);

            $token = $data['access_token'];
            $openid = $data['openid'];

            //token和openid 换取用户信息
            $url2 = 'https://api.weixin.qq.com/sns/userinfo?access_token='.$token.'&openid='.$openid.'&lang=zh_CN';
            $res = $this->makeRequest($url2);
            $user_info = json_decode($res['result'],true);


//这里user_info,就包含用户信息了。 之后就是正常的登录流程,存入/更新用户数据库,生成token,写入redis,以及返回秘钥给前端

以上。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值