>  기사  >  백엔드 개발  >  WeChat 공개 플랫폼 OAuth2.0 웹 페이지 인증 PHP 예제

WeChat 공개 플랫폼 OAuth2.0 웹 페이지 인증 PHP 예제

巴扎黑
巴扎黑원래의
2016-11-11 17:40:281917검색

사용자는 웹페이지에 제공되는 QR 코드를 스캔하여 얻을 수 있습니다.
스누피 클래스를 먼저 다운로드하세요.

코드는 다음과 같습니다. /* *
* WeChat 공개 플랫폼 PHP-SDK
* Wechatauth는 비공식 WeChat 로그인 API입니다.
* 사용자는 웹페이지에 제공된 QR 코드를 스캔하여 로그인 정보를 얻을 수 있습니다.
* 주로 다음 기능을 구현합니다.
* get_login_code() 로그인 인증코드 받기, 인증코드를 통해 QR코드 획득 가능
* get_code_image($code='') 위에서 획득한 인증코드를 이미지 QR코드로 변환
* verify_code() 로그인에 성공하면 최종 인증 성공으로 200이 반환되는지 확인합니다.
* get_login_cookie() 사용자의 기본 정보를 얻기 위해 인증 성공 후 이 메소드를 호출합니다.
* sendNews($account ,$title,$summary,$content,$pic, $srcurl='') WeChat 계정으로 그래픽 정보 보내기
* get_avatar($url) 사용자 아바타 이미지 데이터 가져오기
* @author dodge
* @link https://github.com/dodgepudding/wechat-php-sdk
* @version 1.1
*
*/
include "snoopy.class.php";
class Wechatauth
{
private $cookiename;
private $_cookieexpired = 3600;
private $_datapath = './data/cookie_'
private $_logcallback; 🎜> public $login_user; //현재 로그인 사용자, get_login_info를 호출하여

공개 함수 __construct($options)
{
$this->_account = isset($options['account '])?$options['account ']:'';
$this->_datapath = isset($options['datapath'])?$options['datapath']:$this->_datapath ;
$this-> 디버그 = isset($options['debug'])?$options['debug']:false ]:false; ;_datapath.$this->_account;
                                                                                ~                         ;          /* *
* 캐시에 쿠키 쓰기
* @param string $filename 캐시 파일 이름
* @param string $content 파일 내용
* @return bool
*/
공개 함수 getCookie($filename){
if (file_exists($filename)) {
$mtime = 파일타임($파일이름)
                        if ($mtime_cookieexpired) 반환 false; 
                       $data = file_get_contents($filename); 
                       if ($data) $this->cookie = $data; 
               } 
                return $this->cookie; 
        } 

        /* 
         * 删除cookie 
        */ 
        공개 함수 deleteCookie($filename)               $this->쿠키 = ''; 
                @unlink($filename); 
                true를 반환합니다. 
        } 

        비공개 함수 로그($log){ 
               if ($this->debug && function_exists($this->_logcallback)) { 
                      if (is_array($log )) $log = print_r($log,true); 
                       return call_user_func($this->_logcallback,$log); 
               } 
        } 

        /**
* 로그인 QR코드에 해당하는 인증코드 획득
*/ 
        공개 함수 get_login_code(){ 
               if ($this-> ;_logincode) $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 = 새로운 스누피; 
                $send_snoopy->fetch($codeurl); 
                $result = $send_snoopy->results; 
               if ($result) { 
                     preg_match("/window.QRLogin.uuids+=s+"([^"]+)"/",$result,$matches); 
                       if(count($ 일치)>1) { 
                             $this->_logincode = $matches[1]; 
                          $_SESSION['login_step'] = 0; 🎜>                             $this->_logincode 반환;
                        } 
                } 
                $result 반환; 
        } 

        /**
* 인증코드를 통해 해당 QR코드 이미지 주소 가져오기
* @param string $code
* @return string image url
*/ 
        공개 함수 get_code_image($code=''){ 
              if ($code=='') $code = $this- >_logincode; 
                (!$code)가 false를 반환하는 경우; 
                return 'http://login.weixin.qq.com/qrcode/'.$this->_logincode.'?t=webwx'; 
        } 

        /**
* QR코드에 해당하는 인증코드 설정
* * @param string $code
* @return class $this
*/ 
        공개  함수 set_login_code($code) { 
              $this->_logincode = $code; 
                $this를 반환합니다. 
        } 

        /** 
         * に维码登陆验证 
         * 
         * @return status: 
         * >=400: 잘못된 코드; 408: 인증하지 않고 대기함, 400,401: 유효하지 않거나 만료됨 
         * 201: 스캔만 했지만 확인하지 않음 
         * 200: 확인하면 사용자 정보를 얻을 수 있음 
        */ 
        public function verify_code() { 
               if (!$this->_logincode) return false; 
                $t = time().strval(mt_rand(100,999)); 

                       $url = 'https://login.weixin.qq.com/cgi-bin/mmwebwx-bin/login?uuid='.$this->_logincode.'&tip=1&_='. $t; 
                       $send_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; [ 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. '&재미=새'; 
                                                   $send_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("쿠키 설정: ","",$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->쿠키); 
                                           } 
                                 } 
                                      $status를 반환합니다. 
                             } 
                     } 
                false를 반환합니다. 
        } 

        /**
* 로그인 쿠키 가져오기
* * @param bool $is_array 숫자 형식으로 반환할지 여부, 기본값은 no, 반환 문자열
**/ 
        공개 함수 get_login_cookie($is_array = false){ 
               if (!$is_array)        return $this-> 쿠키; 
                $c_arr = 폭발(';',$this->cookie); 
                $cookie = array(); 
               foreach($c_arr as $item) { 
                      $kitem =explod('=',trim($item)); 
                      if (count($kitem)>1) { 
                           $key = Trim($kitem[0]); 
                               $val = Trim($kitem[1]); 
                              if (!empty($val)) $cookie[$key] = $val; 
                      } 
               } 
               $cookie를 반환합니다. 
        } 

        /**
* 인증된 로그인 후 사용자 로그인 정보 획득
*/ 
        공개 함수 get_login_info(){ 
               if (!$this->cookie) return false; 
                $t = time().strval(mt_rand(100,999)); 
                $send_snoopy = 새로운 스누피; 
                $submit = 'https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxinit?r='.$t; 
                $send_snoopy->rawheaders['쿠키']= $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']; 
                $result를 반환합니다. 
        } 

        /**
* 아바타 가져오기
* * @param string $url 사용자 정보 인터페이스에서 얻은 아바타 주소 전달
*/ 
        공개 함수 get_avatar($url) { 
               if (!$this->cookie) return false; 
               if (strpos($url, 'http')===false) { 
                      $url = 'http://wx.qq.com'.$url; 
               } 
                $send_snoopy = 새로운 스누피; 
                $send_snoopy->rawheaders['쿠키']= $this->cookie; 
                $send_snoopy->referer = "https://wx.qq.com/"; 
                $send_snoopy->fetch($url); 
                $result = $send_snoopy->results; 
               if ($result) 
                      $result를 반환합니다. 
               else 
                       false를 반환합니다. 
        } 

        /**
* 현재 로그인된 사용자를 로그아웃합니다
*/ 
        공개 함수 logout(){ 
               if (!$this->cookie) return false; 
                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); 
                $send_snoopy = 새로운 스누피; 
                $submit = 'https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxlogout?redirect=1&type=1'; 
                $send_snoopy->rawheaders['쿠키']= $this->cookie; 
                $send_snoopy->referer = "https://wx.qq.com/"; 
                $send_snoopy->submit($submit,array('uin'=>$uid,'sid'=>$sid)); 
                $this->deleteCookie($this->_cookiename); 
                true를 반환합니다. 
        } 
}

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.