网站实现微信扫码登录 php

微信开放平台账号一个,必须是商户,不然你也开不了

1.在开放平台创建应用,并设置回调地址(域名即可)

2.生成二维码,前端代码,用户扫码后会给你的回调地址发送code

   <span id="login_container"></span>
    <script src="http://res.wx.qq.com/connect/zh_CN/htmledition/js/wxLogin.js"></script>
    <script> var obj = new WxLogin({
        id: "login_container",
        appid: "appid",你的appid
        scope: "snsapi_login",
        redirect_uri: encodeURIComponent("你的回调地址(域名必须和你在开放平台的一致)"), state: Math.ceil(Math.random()*1000),
        style: "black",
        href: ""});
    </script>

3.根据code获取  access_token 和 openid ,再用他们获取用户信息 代码如下

 public function login(){
        $code = input('code');
        $url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid= 你的appid &secret= 你的AppSecret &code=".$code."&grant_type=authorization_code";

        $access_token = $this->curl_get($url);


        if (!$access_token || isset($access_token['errcode'])){
            return json(['code'=>0,'message'=>'登录失败']);
        }

        $url = "https://api.weixin.qq.com/sns/userinfo?access_token=".$access_token['access_token']."&openid=".$access_token['openid'];

        $user = $this->curl_get($url);

        if (!$user){
            return json(['code'=>0,'message'=>'登录失败']);
        }
        var_dump($user);

//        ["openid"]=> string(28) ""
//        ["nickname"]=> string(1) "" 普通用户昵称
//        ["sex"]=> int(1)  普通用户性别,1为男性,2为女性
//        ["language"]=> string(5) "zh_CN"
//        ["city"]=> string(0) ""  普通用户个人资料填写的城市
//        ["province"]=> string(0) ""    普通用户个人资料填写的省份
//        ["country"]=> string(2) "CN"  国家,如中国为CN
//        ["headimgurl"]=> string(128) ""  头像
//        ["privilege"]=> array(0) { }  用户特权信息,json数组,如微信沃卡用户为(chinaunicom)
//        ["unionid"]=> string(28) ""   用户统一标识。针对一个微信开放平台帐号下的应用,同一用户的unionid是唯一的。

    }        

    protected function curl_get($url){

        $header = array(
            'Accept: application/json',
        );
        $curl = curl_init();

        //设置抓取的url
        curl_setopt($curl, CURLOPT_URL, $url);

        //设置头文件的信息作为数据流输出
        curl_setopt($curl, CURLOPT_HEADER, 0);

        // 超时设置,以秒为单位
        curl_setopt($curl, CURLOPT_TIMEOUT, 1);

        // 超时设置,以毫秒为单位
        // curl_setopt($curl, CURLOPT_TIMEOUT_MS, 500);

        // 设置请求头
        curl_setopt($curl, CURLOPT_HTTPHEADER, $header);

        //设置获取的信息以文件流的形式返回,而不是直接输出。
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);

        //执行命令
        $data = curl_exec($curl);

        // 显示错误信息
        if (curl_error($curl)) {
            return false;
        } else {
            // 打印返回的内容
            return json_decode($data,true);
        }
    }

参考文章 :https://www.jianshu.com/p/070586d73eba

原文地址:https://www.cnblogs.com/junyi-bk/p/13468278.html