天天看點

微信掃描二維碼登入網站代碼示例

使用者通過掃描網頁提供的二維碼實作登陸資訊擷取,大家參考使用吧

請先下載下傳  snoopy 類

代碼如下:

unity3d官網 http://www.unitymanual.com/

<?php

/**

*  微信公衆平台PHP-SDK

*  Wechatauth為非官方微信登陸API

*  使用者通過掃描網頁提供的二維碼實作登陸資訊擷取

*  主要實作如下功能:

*  get_login_code() 擷取登陸授權碼, 通過授權碼才能擷取二維碼

*  get_code_p_w_picpath($code='') 将上面擷取的授權碼轉換為圖檔二維碼

*  verify_code() 鑒定是否登陸成功,傳回200為最終授權成功.

*  get_login_cookie() 鑒定成功後調用此方法即可擷取使用者基本資訊

*  sendNews($account,$title,$summary,$content,$pic,$srcurl='') 向一個微信賬戶發送圖文資訊

*  get_avatar($url) 擷取使用者頭像圖檔資料

*  @author dodge <[email protected]>

*  @link https://github.com/dodgepudding/wechat-php-sdk

*  @version 1.1

*

*/

include "snoopy.class.php";

class Wechatauth

{

       private $cookie;

       private $_cookiename;

       private $_cookieexpired = 3600;

       private $_account = 'test';

       private $_datapath = './data/cookie_';

       private $debug;

       private $_logcallback;

       public $login_user; //目前登陸使用者, 調用get_login_info後擷取

       public function __construct($options)

       {

               $this->_account = isset($options['account'])?$options['account']:'';

               $this->_datapath = isset($options['datapath'])?$options['datapath']:$this->_datapath;

               $this->debug = isset($options['debug'])?$options['debug']:false;

               $this->_logcallback = isset($options['logcallback'])?$options['logcallback']:false;

               $this->_cookiename = $this->_datapath.$this->_account;

               $this->getCookie($this->_cookiename);

       }

       /**

        * 把cookie寫入緩存

        * @param  string $filename 緩存檔案名

        * @param  string $content  檔案内容

        * @return bool

        */

       public function saveCookie($filename,$content){

               return file_put_contents($filename,$content);

        * 讀取cookie緩存内容

        * @return string cookie

       public function getCookie($filename){

               if (file_exists($filename)) {

                       $mtime = filemtime($filename);

                       if ($mtime<time()-$this->_cookieexpired) return false;

                       $data = file_get_contents($filename);

                       if ($data) $this->cookie = $data;

               }

               return $this->cookie;

       /*

        * 删除cookie

       public function deleteCookie($filename) {

               $this->cookie = '';

               @unlink($filename);

               return true;

       private function log($log){

               if ($this->debug && function_exists($this->_logcallback)) {

                       if (is_array($log)) $log = print_r($log,true);

                       return call_user_func($this->_logcallback,$log);

        * 擷取登陸二維碼對應的授權碼

       public function get_login_code(){

               if ($this->_logincode) return $this->_logincode;

               $t = time().strval(mt_rand(100,999));

               $codeurl = 'https://login.weixin.qq.com/jslogin?appid=wx782c26e4c19acffb&redirect_uri=https%3A%2F%2Fwx.qq.com%2Fcgi-bin%2Fmmwebwx-bin%2Fwebwxnewloginpage&fun=new&lang=zh_CN&_='.$t;

               $send_snoopy = new Snoopy;

               $send_snoopy->fetch($codeurl);

               $result = $send_snoopy->results;

               if ($result) {

                       preg_match("/window.QRLogin.uuid\s+=\s+\"([^\"]+)\"/",$result,$matches);

                       if(count($matches)>1) {

                               $this->_logincode = $matches[1];

                               $_SESSION['login_step'] = 0;

                               return $this->_logincode;

                       }

               return $result;

        * 通過授權碼擷取對應的二維碼圖檔位址

        * @param string $code

        * @return string p_w_picpath url

       public function get_code_p_w_picpath($code=''){

               if ($code=='') $code = $this->_logincode;

               if (!$code) return false;

               return 'http://login.weixin.qq.com/qrcode/'.$this->_logincode.'?t=webwx';

        * 設定二維碼對應的授權碼

        * @return class $this

       public  function set_login_code($code) {

               $this->_logincode = $code;

               return $this;

        * 二維碼登陸驗證

        *

        * @return status:

        * >=400: invaild code; 408: not auth and wait, 400,401: not valid or expired

        * 201: just scaned but not confirm

        * 200: confirm then you can get user info

       public function verify_code() {

               if (!$this->_logincode) return false;

                       $url = 'https://login.weixin.qq.com/cgi-bin/mmwebwx-bin/login?uuid='.$this->_logincode.'&tip=1&_='.$t;

                       $send_snoopy = new Snoopy;

                       $send_snoopy->referer = "https://wx.qq.com/";

                       $send_snoopy->fetch($url);

                       $result = $send_snoopy->results;

                       $this->log('step1:'.$result);

                       if ($result) {

                               preg_match("/window\.code=(\d+)/",$result,$matches);

                               if(count($matches)>1) {

                                       $status = intval($matches[1]);

                                       if ($status==201) $_SESSION['login_step'] = 1;

                                       if ($status==200) {

                                               preg_match("/ticket=([0-9a-z-_]+)&lang=zh_CN&scan=(\d+)/",$result,$matches);

                                               $this->log('step2:'.print_r($matches,true));

                                               if (count($matches)>1) {

                                                       $ticket = $matches[1];

                                                       $scan = $matches[2];

                                                       $loginurl = 'https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxnewloginpage?ticket='.$ticket.'&lang=zh_CN&scan='.$scan.'&fun=new';

                                                       $send_snoopy = new Snoopy;

                                                       $send_snoopy->referer = "https://wx.qq.com/";

                                                       $send_snoopy->fetch($loginurl);

                                                       $this->log('step3:'.print_r($send_snoopy->headers,true));

                                                       foreach ($send_snoopy->headers as $key => $value) {

                                                               $value = trim($value);

                                                               if(strpos($value,'Set-Cookie: ') !== false){

                                                                       $tmp = str_replace("Set-Cookie: ","",$value);

                                                                       $tmp = str_replace("Path=/","",$tmp);

                                                                       $tmp = str_replace("Domain=.qq.com; ","",$tmp);

                                                                       $cookie.=$tmp;

                                                               }

                                                       }

                                                       $cookie .="Domain=.qq.com;";

                                                       $this->cookie = $cookie;

                                                       $this->saveCookie($this->_cookiename,$this->cookie);

                                               }

                                       }

                                       return $status;

                               }

               return false;

        * 擷取登陸的cookie

        * @param bool $is_array 是否以數值方式傳回,預設否,傳回字元串

        * @return string|array

       public function get_login_cookie($is_array = false){

               if (!$is_array)        return $this->cookie;

               $c_arr = explode(';',$this->cookie);

               $cookie = array();

               foreach($c_arr as $item) {

                       $kitem = explode('=',trim($item));

                       if (count($kitem)>1) {

                               $key = trim($kitem[0]);

                               $val = trim($kitem[1]);

                               if (!empty($val)) $cookie[$key] = $val;

               return $cookie;

        *          授權登陸後擷取使用者登陸資訊

       public function get_login_info(){

               if (!$this->cookie) return false;

               $submit = 'https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxinit?r='.$t;

               $send_snoopy->rawheaders['Cookie']= $this->cookie;

               $send_snoopy->referer = "https://wx.qq.com/";

               $send_snoopy->submit($submit,array());

               $this->log('login_info:'.$send_snoopy->results);

               $result = json_decode($send_snoopy->results,true);

               if ($result['BaseResponse']['Ret']<0) return false;

               $this->_login_user = $result['User'];

        *  擷取頭像

        *  @param string $url 傳入從使用者資訊接口擷取到的頭像位址

       public function get_avatar($url) {

               if (strpos($url, 'http')===false) {

                       $url = 'http://wx.qq.com'.$url;

               $send_snoopy->fetch($url);

               if ($result)

                       return $result;

               else

                       return false;

        * 登出目前登陸使用者

       public function logout(){

               preg_match("/wxuin=(\w+);/",$this->cookie,$matches);

               if (count($matches)>1) $uid = $matches[1];

               preg_match("/wxsid=(\w+);/",$this->cookie,$matches);

               if (count($matches)>1) $sid = $matches[1];

               $this->log('logout: uid='.$uid.';sid='.$sid);

               $submit = 'https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxlogout?redirect=1&type=1';

               $send_snoopy->submit($submit,array('uin'=>$uid,'sid'=>$sid));

               $this->deleteCookie($this->_cookiename);

}