最新公告
  • 欢迎访问代码工坊,购买产品可享受在线工单服务!
  • PHP扫描微信公众号二维码实现关注并自动登录网站

      场景:用户扫描微信公众号的二维码,关注后自动登录网站,若已关注则直接登录。

      逻辑:

      1.系统生成带参数(此参数自定义为唯一值)的临时二维码(微信公众平台有提供该接口,可查看一下开发文档);

      2.用户使用微信扫描该二维码,关注后微信服务器会将数据(自定义参数、openid...)返回到我们的服务器;

      3.我们服务器将接收到的openid再次向微信服务器发起请求,获取该用户的信息(昵称、头像、地域、unionid(若绑定了微信开放平台,则有此参数));

      4.我们将返回的用户信息存储到数据库,用作于登录。

      准备工作:登录微信公众平台,在基本配置下,查看appid和设置appsecret、回调URL、token,小编这里使用的是测试账号,因为正式的要审核(收费300个大洋),如下图:

    PHP扫描微信公众号二维码实现关注并自动登录网站

    PHP扫描微信公众号二维码实现关注并自动登录网站

      下面直接贴上小编写的一个类WeChat.class.php:

    Class WeChat{
         
        protected $appid;
        protected $secret;
        protected $accessToken;
         
        function __construct(){
            $this->appid       = "xxx";
            $this->secret      = "xxx";
            $this->accessToken = $this->getAccessToken();
        }
         
        /***
         * 获取access_token
         * token的有效时间为2小时,这里可以做下处理,提高效率不用每次都去获取,
         * 将token存储到缓存中,每2小时更新一下,然后从缓存取即可
         * @return
         **/
        private function getAccessToken(){
            url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$this->appid."&secret=".$this->secret;
            $res = json_decode($this->httpRequest($url),true);
            return $res['access_token'];
        }
         
        /***
         * POST或GET请求
         * @url 请求url
         * @data POST数据
         * @return
         **/
        private function httpRequest($url, $data = ""){
            $curl = curl_init();
            curl_setopt($curl, CURLOPT_URL, $url);
            curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
            curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
            if(!empty($data)){  //判断是否为POST请求
                curl_setopt($curl, CURLOPT_POST, 1);
                curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
            }
            curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
            $output = curl_exec($curl);
            curl_close($curl);
            return $output;
        }
         
        /***
         * 获取openID和unionId
         * @code 微信授权登录返回的code
         * @return
         **/
        public function getOpenIdOrUnionId($code){
            $url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=".$this->appid."&secret=".$this->secret."&code=".$code."&grant_type=authorization_code";
            $data = $this->httpRequest($url);
            return $data;
        }
         
        /***
         * 通过openId获取用户信息
         * @openId
         * @return
         **/
        public function getUserInfo($openId){
            $url  = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=".$this->accessToken."&openid=".$openId."&lang=zh_CN";
            $data = $this->httpRequest($url);
            return $data;
        }
         
        /***
         * 发送模板短信
         * @data 请求数据
         * @return
         **/
        public function sendTemplateMessage($data = ""){
            $url = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=".$this->accessToken;
            $result = $this->httpRequest($url, $data);
            return $result;
        }
         
        /***
         * 生成带参数的二维码
         * @scene_id 自定义参数(整型)
         * @return
         **/
        public function getQrcode($scene_id){
            $url = "https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=".$this->accessToken;
            $data = array(
                "expire_seconds" => 3600, //二维码的有效时间(1小时)
                "action_name" => "QR_SCENE",
                "action_info" => array("scene" => array("scene_id" => $scene_id))
            );
            $result = $this->httpRequest($url, json_encode($data));
            return $result;
        }
         
        /***
         * 生成带参数的二维码
         * @scene_str 自定义参数(字符串)
         * @return
         **/
        public function getQrcodeByStr($scene_str){
            $url = "https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=".$this->accessToken;
            $data = array(
                "expire_seconds" => 3600, //二维码的有效时间(1小时)
                "action_name" => "QR_STR_SCENE",
                "action_info" => array("scene" => array("scene_str" => $scene_str))
            );
            $result = $this->httpRequest($url, json_encode($data));
            return $result;
        }
         
        /**
         * 换取二维码
         * @ticket
         * @return
         */
        public function generateQrcode($ticket){
            return "https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=".$ticket;
        }
         
        /***
         * 回调函数
         **/
        public function callback(){
            $callbackXml = file_get_contents('php://input'); //获取返回的xml
            //下面是返回的xml
            //<xml><ToUserName><![CDATA[gh_f6b4da984c87]]></ToUserName> //微信公众号的微信号
            //<FromUserName><![CDATA[oJxRO1Y2NgWJ9gMDyE3LwAYUNdAs]]></FromUserName> //openid用于获取用户信息,做登录使用
            //<CreateTime>1531130986</CreateTime> //回调时间
            //<MsgType><![CDATA[event]]></MsgType>
            //<Event><![CDATA[SCAN]]></Event>
            //<EventKey><![CDATA[lrfun1531453236]]></EventKey> //上面自定义的参数(scene_str)
            //<Ticket><![CDATA[gQF57zwAAAAAAAAAAS5odHRwOi8vd2VpeGluLnFxLmNvbS9xLzAyY2ljbjB3RGtkZWwxbExLY3hyMVMAAgTvM0NbAwSAOgkA]]></Ticket> //换取二维码的ticket
            //</xml>
            $data = json_decode(json_encode(simplexml_load_string($callbackXml, 'SimpleXMLElement', LIBXML_NOCDATA)), true); //将返回的xml转为数组
            if(count($data)){
                $userInfo = $this->getUserInfo($data['FromUserName']); //获取用户信息
                //这里把返回的数据写入数据库(注:务必将“EventKey”也存到数据表中,后面检测登录需用到此唯一值查询记录)
                //用于前台做检测该用户扫码之后是否有关注公众号,关注了就自动登录网站
                //原理:前台通过自定义的参数(最好设成值唯一)查询数据标是否有此记录,若有则登录。
            }
        }
    }

      生成带参数的二维码index.php:

    <?php
        header("Content-type:text/html;charset=utf-8");
        require_once('WeChat.class.php');
        $WeChat = new WeChat();
        $scene_str = "lrfun1531453236"; //"lrfun" . time(); //这里建议设唯一值(如:随机字符串+时间戳)
        $result = json_decode($WeChat->getQrcodeByStr($scene_str), true);
        $qrcode = $WeChat->generateQrcode($result['ticket']); //生成二维码
         
        echo "自定义参数:".$scene_str;
        echo "<br/><img src="$qrcode">";
    ?>
    <script type="text/javascript" src="http://www.lrfun.com/statics/fun2/js/jquery.min.js"></script>
    <script type="text/javascript">
        setInterval("checkLogin()", 2000); //每2秒发送一次请求
        function checkLogin(){
            $.post("checkLogin.php", {scene_str:"<?=$scene_str?>"}, function(data){
                if(data){
                    //做逻辑判断,登录跳转
                }
            },"Json");
        }
    </script>

      回调函数 callback.php:

    // 调取回调函数
    require_once('WeChat.class.php');
    $WeChat = new WeChat();
    $result = $WeChat->callback();

      检测是否登录 checkLogin.php:

    if(isset($_POST['scene_str']) && $_POST['scene_str']){
        //根据scene_str查询数据库,是否有此记录
        echo "true";
    }else{
        echo "false";
    }

      这样就完成了!

      如果看不懂的话没关系,我将整个程序打包了,你下载替换一下你的appid和appsecret,就可以直接使用了。

    PHP扫描微信公众号二维码实现关注并自动登录网站.zip
    fc8e6b5c7cee15f83d6890fd6bb4ba08.zip (3.82 KB)

    原文地址:http://www.lrfun.com/html/technology/PHP/2018/0714/134.html

    发表评论