사용자는 웹페이지에 제공된 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
- * [url= home.php?mod=space&uid=17823]@LINK[/url] 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);
- }
- /**
- * 캐시에 쿠키 쓰기
- * @param string $filename 캐시 파일 이름
- * @param string $content 파일 콘텐츠
- * @return bool
- */
- 공개 함수 saveCookie($filename,$content){
- return file_put_contents($filename,$content);
- }
-
- /**
- * 쿠키 캐시 콘텐츠 읽기
- * @param string $filename 캐시 파일 이름
- * @return string cookie
- */
- 공용 함수 getCookie($filename){
- if (file_exists($filename) ) {
- $mtime = filemtime($filename);
- if ($mtime
- $data = file_get_contents($filename);
- if ($data) $this->cookie = $data;
- }
- return $this->cookie;
- }
-
- /*
- * 쿠키 삭제
- */
- 공용 함수 deleteCookie($filename) {
- $this->cookie = '';
- @unlink($filename);
- return 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코드에 해당하는 인증코드 획득
- */
- 공개 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://wx.qq.com/cgi-bin/mmwebwx-bin/webwxnewloginpage&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($matches)>1) {
- $this->_logincode = $ 일치[ 1];
- $_SESSION['login_step'] = 0;
- return $this->_logincode;
- }
- }
- return $result;
- }
-
- /**
- * 인증코드를 통해 해당 QR코드 이미지 주소를 획득
- * @param string $code
- * @return string image url
- */
- 공개 함수 get_code_image($code=''){
- if ($code=='') $code = $this->_logincode;
- if (!$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;
- return $this;
- }
-
- /**
- * 二维码登陆验证
- *
- * @return 상태:
- * >=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;
- 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 = 새로운 스누피;
- $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 ("경로=/","",$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 =arrexplode (';',$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;
- $t = time().strval(mt_rand(100,999));
- $send_snoopy = 新史努比;
- $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']
- if ($result['BaseResponse'] ['Ret']
- if ($result['BaseResponse'] ['Ret']
- if ($result['BaseResponse'] ['Ret'] $this->_login_user = $result['User'];
- return $result;
- }
-
- /**
- * 取得頭像
- * @param string $url 傳入從使用者資訊介面取得到的頭像位址
- */
- public function get_avatar($url) {
- if (!$this->cookie) return false;
- if (strpos($url, 'http')===false ) {
- $url = 'http ://wx.qq.com'.$url;
- }
- $send_snoopy = 新史努比;
- $send_snoopy->rawheaders['Cookie']= $this->cookie;
- $send_snoopy->referer = "https://wx.qq.com/";
- $send_snoopy ->fetch ($url);
- $result = $send_snoopy->results;
- if ($result)
- return $result;
- else
- return false;
- }
-
- return false;
- }
-
- /**
- * 登出目前登陸用戶
- */
- public function 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( '註銷:uid='.$uid.' ;sid='.$sid);
- $send_snoopy = 新史努比;
- $submit = 'https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxlogout?redirect=1&type=1';
$send_snoopy->rawheaders['Cookie']= $ this ->cookie; $send_snoopy->referer = "https://wx.qq.com/"; $send_snoopy->submit($submit,array('uin'=>; $uid,' sid'=>$sid)); $this->deleteCookie($this->_cookiename); return true; | }
}