好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

php扫码登录如何实现

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

功能只是将:https://github测试数据/huanz/wechat-mp-hack 改成PHP实现罢了。

主要流程如下:

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

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

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

相关推荐:《php入门教程》

供上代码:

class WeiSendAuto
{
  //--------------------------------------------------------LOGIN START
  private $_apis = [
    "host"=> "https://mp.weixin.qq测试数据",
    "login"=> "https://mp.weixin.qq测试数据/cgi-bin/bizlogin?action=startlogin",
    "qrcode"    => "https://mp.weixin.qq测试数据/cgi-bin/loginqrcode?action=getqrcode?m=4300",
    "loginqrcode"  => "https://mp.weixin.qq测试数据/cgi-bin/loginqrcode?action=ask&token=&lang=zh_CN&f=json&ajax=1",
    "loginask"   => "https://mp.weixin.qq测试数据/cgi-bin/loginqrcode?action=ask&token=&lang=zh_CN&f=json&ajax=1
    &random=",
    "loginauth"   => "https://mp.weixin.qq测试数据/cgi-bin/loginauth?action=ask&token=&lang=zh_CN&f=json&ajax=1",
    "bizlogin"   => "https://mp.weixin.qq测试数据/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测试数据/","","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测试数据";
    $_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测试数据".$_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扫码登录如何实现的详细内容,更多请关注Gxl网其它相关文章!

查看更多关于php扫码登录如何实现的详细内容...

  阅读:68次