• 技术文章 >后端开发 >PHP问题

    php扫码登录如何实现

    爱喝马黛茶的安东尼爱喝马黛茶的安东尼2019-09-28 16:59:03原创3198

    php入门到就业线上直播课:进入学习

    PHP微信公众号扫码模拟登录功能

    功能只是将:https://github.com/huanz/wechat-mp-hack 改成PHP实现罢了。

    主要流程如下:

    1、先访问https://mp.weixin.qq.com/,模拟登录,进入二维码页面。

    2、带着返回的cookie下载二维码,程序后台一直while循环,等待扫描消息。

    3、打开下载的二维码,微信扫码,登录成功,获取token和cookie,然后后面就可以自由发挥了。

    相关推荐:《php入门教程

    供上代码:

    class WeiSendAuto
    {
      //--------------------------------------------------------LOGIN START
      private $_apis = [
        "host"     => "https://mp.weixin.qq.com",
        "login"     => "https://mp.weixin.qq.com/cgi-bin/bizlogin?action=startlogin",
        "qrcode"    => "https://mp.weixin.qq.com/cgi-bin/loginqrcode?action=getqrcode¶m=4300",
        "loginqrcode"  => "https://mp.weixin.qq.com/cgi-bin/loginqrcode?action=ask&token=&lang=zh_CN&f=json&ajax=1",
        "loginask"   => "https://mp.weixin.qq.com/cgi-bin/loginqrcode?action=ask&token=&lang=zh_CN&f=json&ajax=1
        &random=",
        "loginauth"   => "https://mp.weixin.qq.com/cgi-bin/loginauth?action=ask&token=&lang=zh_CN&f=json&ajax=1",
        "bizlogin"   => "https://mp.weixin.qq.com/cgi-bin/bizlogin?action=login&lang=zh_CN"
      ];
      private $_redirect_url = "";
      private $_key      = "";
      private function _getCookieFile(){
        return WEI_UPLOAD_PATH."cookie_{$this->_key}.text";
      }
      private function _getSavePath(){
        return WEI_UPLOAD_PATH.$this->_qrcodeName();
      }
      private function _qrcodeName(){
        return "qrcode_{$this->_key}.png";
      }
      private function _log($msg){
        Log::record("[微信调度:".date("Y-m-d H:i:s")."] ======: {$msg}");
      }
      public function getToken(){
        return Utils::getCache("token_{$this->_key}");
      }
      public function setToken($token){
         Utils::setCache("token_{$this->_key}",$token);
      }
      public function init($options){
        if(!isset($options["key"])){
          die("Key is Null!");
        }
        $this->_key   =  $options["key"];
        if($this->getToken()){
          echo("HAS Token !");
          return;
        }else{
          //尼玛,先要获取首页!!!
          $this->fetch("https://mp.weixin.qq.com/","","text");
          $this->_log("start login!!");
          $this->start_login($options);
        }
      }
      private function start_login($options){
        $_res    = $this->_login($options["account"],$options["password"]);
        if(!$_res["status"]){
          $this->_log($_res["info"]);
          return;
        }
        //保存二维码
        $this->_saveQRcode();
        $_ask_api    =  $this->_apis["loginask"];
        $_input["refer"] =  $this->_redirect_url;
        $_index     =  1;
        while(true){
    /*      if($_index>60){
            break;
          }*/
          $_res    =  $this->fetch($_ask_api.$this->getWxRandomNum(),$_input);
          $_status   =  $_res["status"];
          if($_status==1){
            if($_res["user_category"]==1){
              $_ask_api = $this->_apis["loginauth"];
            }else{
              $this->_log("Login success");
              break;
            }
          }else if($_status==4){
            $this->_log("已经扫码");
          }else if($_status==2){
            $this->_log("管理员拒绝");
            break;
          }else if($_status==3){
            $this->_log("登录超时");
            break;
          }else{
            if($_ask_api==$this->_apis["loginask"]){
              $this->_log("请打开test.jpg,用微信扫码");
            }else{
              $this->_log("等待确认");
            }
          }
          sleep(2);
          $_index++;
        }
        /*if($_index>=60){
          $this->_log("U亲,超时了");
          return;
        }*/
        $this->_log("开始验证");
        $_input["post"]   = ["lang"=>"zh_CN","f"=>"json","ajax"=>1,"random"=>$this->getWxRandomNum(),"token"=>""];
        $_input["refer"]   = $this->_redirect_url;
        $_res        = $this->fetch($this->_apis["bizlogin"],$_input);
        $this->_log(print_r($_res,true));
        if($_res["base_resp"]["ret"]!=0){
          $this->_log("error = ".$_res["base_resp"]["err_msg"]);
          return ;
        }
        $redirect_url    =  $_res["redirect_url"];//跳转路径
        if(preg_match('/token=([\d]+)/i', $redirect_url,$match)){//获取cookie
          $this->setToken($match[1]);
        }
        $this->_log("验证成功,token: ".$this->getToken());
      }
      //下载二维码
      private function _saveQRcode(){
        $_input["refer"] = $this->_redirect_url;
        $_res    = $this->fetch($this->_apis["qrcode"],$_input,"text");
        $fp     = fopen($this->_getSavePath(), "wb+") or die("open fails");
        fwrite($fp,$_res) or die("fwrite fails");
        fclose($fp);
      }
      private function _login($_username,$_password){
        $_input["post"] = array(
          'username'  => $_username,
          'pwd'    => md5($_password),
          'f'     => 'json',
          'imgcode'  => ""
        );
        $_input["refer"] = "https://mp.weixin.qq.com";
        $_res      = $this->fetch($this->_apis["login"],$_input);
        if($_res["base_resp"]["ret"]!==0){
          return Utils::error($_res["base_resp"]["err_msg"]);
        }
        $this->_redirect_url  =  "https://mp.weixin.qq.com".$_res["redirect_url"];//跳转路径
        return Utils::success("ok");
      }
      function getWxRandomNum(){
        return "0.".mt_rand(1000000000000000,9999999999999999);
      }
      /**
       * @param $url
       * @param null $_input
       * @param string $data_type
       * @return mixed
       * $_input= ["post"=>[],"refer"=>"",cookiefile='']
       */
      function fetch( $url, $_input=null, $data_type='json') {
        $ch = curl_init();
        $useragent = isset($_input['useragent']) ? $_input['useragent'] : 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:10.0.2)
         Gecko/20100101 Firefox/10.0.2';
        //curl_setopt( $ch, CURLOPT_HTTPHEADER, $this->_headers); //设置HTTP头字段的数组
        curl_setopt( $ch, CURLOPT_URL, $url );
        curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
        curl_setopt( $ch, CURLOPT_AUTOREFERER, true );
        curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, true );
        curl_setopt( $ch, CURLOPT_POST, isset($_input['post']) );
        if( isset($_input['post']) )     curl_setopt( $ch, CURLOPT_POSTFIELDS, $_input['post'] );
        if( isset($_input['refer']) )    curl_setopt( $ch, CURLOPT_REFERER, $_input['refer'] );
        curl_setopt( $ch, CURLOPT_USERAGENT, $useragent );
        curl_setopt( $ch, CURLOPT_CONNECTTIMEOUT, ( isset($_input['timeout']) ? $_input['timeout'] : 5 ) );
        curl_setopt( $ch, CURLOPT_COOKIEJAR, ( isset($_input['cookiefile']) ? $_input['cookiefile'] : 
        $this->_getCookieFile() ));
        curl_setopt( $ch, CURLOPT_COOKIEFILE, ( isset($_input['cookiefile']) ? $_input['cookiefile'] : 
        $this->_getCookieFile() ));
        $result = curl_exec( $ch );
        curl_close( $ch );
        if ($data_type == 'json') {
          $result = json_decode($result,true);
        }
        return $result;
      }
      //--------------------------------------------------------LOGIN END
    }

    怎么调用?上码:

    $arr = array(
      'account'  => '***',
      'password' => '****',
      'key'    => "tmall",
    );
    $w       =  new WeiSendAuto();
    $w->init($arr);
    if(!$w->getToken()){
      die("NOT TOKEN!");
    }

    以上就是php扫码登录如何实现的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。

    前端(VUE)零基础到就业课程:点击学习

    清晰的学习路线+老师随时辅导答疑

    自己动手写 PHP MVC 框架:点击学习

    快速了解MVC架构、了解框架底层运行原理

    专题推荐:php 扫码登录
    上一篇:php用for循环10行10列怎么写 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • ❤️‍🔥共22门课程,总价3725元,会员免费学• ❤️‍🔥接口自动化测试不想写代码?• PHP网页生成二维码,Android客户端扫码登录
    1/1

    PHP中文网