zoukankan      html  css  js  c++  java
  • 微信公众平台实现授权登录(不是微信开放平台)

    今天给大家补充一下微信授权登录的实现方式。如标题,是公众平台的实现方式,官方推荐的是微信开放平台,但因审核问题,我只拿到了微信开放平台的app_id和app_secret。所以做了这一版,仅供参考

    第一步:

    去微信公众平台开通一个微信服务号,地址 https://mp.weixin.qq.com/。审核通过之后,默认就会有获取的用户信息的接口权限,这不必担心,总之拿到对应的app_id和app_secret就可以。

    第二步:

    用户点击微信登录的时候,跳转到自己的一个静态页面,里面有着一张登录二维码(自己通过php生成,不懂可以百度),二维码地址是:https://open.weixin.qq.com/connect/oauth2/authorize?appid=".$app_id."&redirect_uri=".urlencode($my_url)."&response_type=code&scope=snsapi_userinfo&state=".$auth_code."#wechat_redirect。里面的参数自己的即可。

    代码如下:

        $my_url = "http://".$_SERVER['HTTP_HOST']."/Home/User/wechatLogin?ip=".$_SERVER['REMOTE_ADDR']; //成功授权后的回调地址
        //
    第一步:用户同意授权,获取code $code = $_REQUEST["code"];//存放code $auth_code = md5(uniqid(rand(), TRUE)); //随机生成字符串,防止csrf(目前并不生效) if(empty($code)){ $url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=".$app_id."&redirect_uri=".urlencode($my_url)."&response_type=code&scope=snsapi_userinfo&state=".$auth_code."#wechat_redirect"; $src = qrcode($url, time().".png", "", "./logo.png", 3); //我调用的一个自己封装的二维码生成函数 $this->assign("src", substr($src, 1))->display();  //将他输出到视图,就是上图     }

    第三步:

    这个时候用户扫码,其实是手机访问了这个页面(上一步中自己设置的$my_url),但是对于拿到数据与入库并不影响。

    $url1="https://api.weixin.qq.com/sns/oauth2/access_token?appid=".$app_id."&secret=".$app_secret."&code=".$code."&grant_type=authorization_code";
                $res = file_get_contents($url1);//调用SDK方法获取到res 从中可以得到openid
                $res = (json_decode($res, true));//转换成array 方便调用openid
    
                //第三步:拉取用户信息(需scope为 snsapi_userinfo)
                if(isset($res['access_token'])){
                    $url2 = "https://api.weixin.qq.com/sns/userinfo?access_token=".$res['access_token']."&openid=".$res['openid']."&lang=zh_CN";
                    $row = file_get_contents($url2);
                    $user_data = (json_decode($row, true));
    
                    $m = M("Member");
                    $data = array();
                    $data['sex']              = $user_data['sex'];
                    $data['province']      = $user_data['province'];
                    $data['city']             = $user_data['city'];
                    $data['person_name']   = $user_data['nickname'];
                    $data['wx_number']     = $_REQUEST['ip'];
                    $data['wx_openid']     = $user_data['openid'];
                    $data['wx_name']       = $user_data['nickname'];
                    $data['wx_img']        = $user_data['headimgurl'];
                    $data['addtime']       = date("Y-m-d H:i:s", time());
                    $data['person_img']       = $user_data['headimgurl'];
                    $data['signtime']       = date("Y-m-d H:i:s", time());
    
                    $user = $m->where(array("wx_openid"=> $user_data['openid']))->find();
                    if($user){
                        $res = $m->where(array("wx_openid"=> $user_data['openid']))->setField(array("signtime"=> date("Y-m-d H:i:s", time()), "wx_number"=> $_REQUEST['ip']));
                        if($res){
                            $this->display("wechatWap");
                        }else{
                            $this->error("操作异常,拒绝访问!", U('user/login'));
                        }
                    }else{
                        $res=$m->add($data);
    
                        if($res){
                            $this->display("wechatWap");
                        }else{
                            $this->error("操作异常,拒绝访问!", U('user/login'));
                        }
                    }
                }

    第四步:

    这个时候数据已经在手机端的访问中入库,但是网页端并不知道,这个时候需要网页端做一个轮询(如果想性能好,可以用websokect来实现,这里不做过多介绍)来判断是否有新的数据入库,如果有则取出数据,登录成功!

    静态页面代码如下:

    <script src="__JS__/jquery-1.9.1.min.js" type="text/javascript"></script>
    <body>
    <style>
    body{ background:#333;}
    .headright{ position:relative; color:#fff;}
    .headright a{ color:#fff;}
    </style>
    <include file="Public:menu_u"/>
    <div class="wx_qrcode">
    <dl>
    <dt><img src="{$src}" /></dt>
    <dd>微信扫描二维码登录<br>
    “帝格珠宝”</dd>
    </dl>
    </div>
    <!--<include file="Public:foot_u"/>-->
    </body>
    
    <script>
    ajaxSearch();
    function ajaxSearch(){
        $.post("{:U('/Home/User/wechatLogin')}", "", function(data){
    
            if(data.status==1){
                location.href='{:U("/Home/User/wxSucLogin/user_id/'+data.user_id+'")}';
    
            }else{
                setTimeout(function(){
                    ajaxSearch();
                },5000)
            }
        })
    }
    </script>

    php代码如下:

    //通过当前客户端的ip地址发送ajax轮询是否登录成功
            if(IS_AJAX){
                $user = M("Member")->where(array("wx_number"=> $_SERVER['REMOTE_ADDR']))->select();
                if($user){
                    foreach($user as $key=>$val){
                        $timer = time() - strtotime($val['signtime']);
                        if($timer < 10){
    
                            $this->ajaxReturn(array("info"=> "登录成功!", "status"=> 1, "user_id"=> $val['id']));
                        }
                    }
    
                    $this->ajaxReturn(array("info"=> "暂无登录信息!", "status"=> 0));
                }else{
                    $this->ajaxReturn(array("info"=> "暂无登录信息!", "status"=> 0));
                }
            }

    这里有一个问题,如果同时有多个用户都在使用微信登录,那怎么判断录入进去的数据是那一个用户扫码登录的呢?这里可以用客户端ip来做标识区别开来。

    在最开始第二步$my_url定义的时候加上客户端ip作为参数带过去就可以了。然后第三步获取到ip录入到数据中,这样便可以区分开。

  • 相关阅读:
    优化IIS7.5支持10万个同时请求的配置方法
    .net core2.0获取host的方法
    mvc项目远程发布到windows server服务器
    使用Visual Studio给SQL生成测试数据
    C# partial 关健字说明
    TortoiseGit保存用户名密码的方法
    Jquery插件开发
    Spring众多jar包的特点,及Spring jar包官网下载方法
    ubutu16.04修改分辨率
    +号变为空格之编码解码
  • 原文地址:https://www.cnblogs.com/tongl/p/7217872.html
Copyright © 2011-2022 走看看