• 当前位置: 首页 / 建站百科 / 网站建设
  • PHP 扫描微信公众号二维码,关注并自动登录网站

    时间:2022-03-20 浏览量: 收藏

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

      逻辑:

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

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

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

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

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

    PHP 扫描微信公众号二维码,关注并自动登录网站(图1)

    PHP 扫描微信公众号二维码,关注并自动登录网站(图2)

      下面直接贴上小编写的一个类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";
    }

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

    顶一下
    (0)
    0.00%
    踩一下
    0
    0.00%

    加载中~

    相关推荐

    RELATED RECOMMEND

    Copyright © 2012-2024 世敏网络 版权所有   闽ICP备18026760号-1    闽公网安备 35020502000640号   网站地图    Sitemap   关键词聚合

    世敏网络

    您已成功复制微信号,去微信立即添加好友!

    打开微信

    Wechart

    点击下方复制按钮,复制微信号!

    jzm866081

    https://www.xmsmwl.cn
    厦门世敏网络科技有限公司

    点击这里给我发消息
    嘿!有什么能帮到您的吗?