>백엔드 개발 >PHP 튜토리얼 >WeChat 스캔 로그인

WeChat 스캔 로그인

WBOY
WBOY원래의
2016-07-25 08:49:061278검색
}}
사용자는 웹페이지에 제공된 QR 코드를 스캔하여 로그인 정보를 얻을 수 있습니다.
  1. /**
  2. * WeChat 공개 플랫폼 PHP-SDK
  3. * Wechatauth는 비공식 WeChat 로그인 API입니다
  4. * 사용자는 웹페이지에 제공된 QR 코드를 스캔하여 로그인 정보를 얻을 수 있습니다.
  5. * 주로 다음 기능을 구현합니다.
  6. * get_login_code() 로그인 인증코드 받기, 인증코드를 통해 QR코드 획득 가능
  7. * get_code_image($code='') 위에서 획득한 인증코드를 이미지 QR코드로 변환
  8. * verify_code () 로그인에 성공하면 최종 인증 성공으로 200이 반환되는지 확인합니다.
  9. * get_login_cookie() 사용자의 기본 정보를 얻기 위해 인증 성공 후 이 메소드를 호출합니다.
  10. * sendNews($account, $title,$summary,$content,$pic, $srcurl='') WeChat 계정으로 그래픽 정보 보내기
  11. * get_avatar($url) 사용자 아바타 이미지 데이터 가져오기
  12. * @author dodge
  13. * [url= home.php?mod=space&uid=17823]@LINK[/url] https://github.com/dodgepudding/wechat-php-sdk
  14. * @version 1.1
  15. *
  16. */
  17. include "snoopy.class.php";
  18. class Wechatauth
  19. {
  20. private $cookie;
  21. private $_cookiename;
  22. private $_cookieexpired = 3600;
  23. private $_account = 'test';
  24. private $_datapath = './data/cookie_';
  25. private $debug;
  26. private $_logcallback;
  27. public $login_user; //현재 로그인된 사용자, get_login_info 호출 후 가져오기
  28. public function __construct($options)
  29. {
  30. $this ->_account = isset($options['account'])?$options['account']:'';
  31. $this->_datapath = isset($options['datapath'])? $options ['datapath']:$this->_datapath;
  32. $this->debug = isset($options['debug'])?$options['debug']:false;
  33. $ this- >_logcallback = isset($options['logcallback'])?$options['logcallback']:false;
  34. $this->_cookiename = $this->_datapath.$this->_account ;
  35. $this->getCookie($this->_cookiename);
  36. }
  37. /**
  38. * 캐시에 쿠키 쓰기
  39. * @param string $filename 캐시 파일 이름
  40. * @param string $content 파일 콘텐츠
  41. * @return bool
  42. */
  43. 공개 함수 saveCookie($filename,$content){
  44. return file_put_contents($filename,$content);
  45. }
  46. /**
  47. * 쿠키 캐시 콘텐츠 읽기
  48. * @param string $filename 캐시 파일 이름
  49. * @return string cookie
  50. */
  51. 공용 함수 getCookie($filename){
  52. if (file_exists($filename) ) {
  53. $mtime = filemtime($filename);
  54. if ($mtime_cookieexpired) return false;
  55. $data = file_get_contents($filename);
  56. if ($data) $this->cookie = $data;
  57. }
  58. return $this->cookie;
  59. }
  60. /*
  61. * 쿠키 삭제
  62. */
  63. 공용 함수 deleteCookie($filename) {
  64. $this->cookie = '';
  65. @unlink($filename);
  66. return true;
  67. }
  68. 비공개 함수 로그($log){
  69. if ($this->debug && function_exists($this->_logcallback)) {
  70. if (is_array($log)) $log = print_r ($ log,true);
  71. return call_user_func($this->_logcallback,$log);
  72. }
  73. }
  74. /**
  75. * 로그인 QR코드에 해당하는 인증코드 획득
  76. */
  77. 공개 function get_login_code (){
  78. if ($this->_logincode) return $this->_logincode;
  79. $t = time().strval(mt_rand(100,999));
  80. $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;
  81. $send_snoopy = 새 스누피;
  82. $send_snoopy->fetch($codeurl);
  83. $result = $send_snoopy->results;
  84. if ($result) {
  85. preg_match("/window .QRLogin .uuids =s "([^"] )"/",$result,$matches);
  86. if(count($matches)>1) {
  87. $this->_logincode = $ 일치[ 1];
  88. $_SESSION['login_step'] = 0;
  89. return $this->_logincode;
  90. }
  91. }
  92. return $result;
  93. }
  94. /**
  95. * 인증코드를 통해 해당 QR코드 이미지 주소를 획득
  96. * @param string $code
  97. * @return string image url
  98. */
  99. 공개 함수 get_code_image($code=''){
  100. if ($code=='') $code = $this->_logincode;
  101. if (!$code)는 false를 반환합니다;
  102. return 'http://login.weixin.qq.com/qrcode/'.$this->_logincode.'?t=webwx';
  103. }
  104. /**
  105. * QR코드에 해당하는 인증코드 설정
  106. * @param string $code
  107. * @return class $this
  108. */
  109. 공개 함수 set_login_code($code) {
  110. $this->_logincode = $code;
  111. return $this;
  112. }
  113. /**
  114. * 二维码登陆验证
  115. *
  116. * @return 상태:
  117. * >=400: 잘못된 코드; 408: 인증 및 대기 없음, 400,401: 유효하지 않거나 만료됨
  118. * 201: 스캔만 했지만 확인하지 않음
  119. * 200: 확인하면 사용자 정보를 얻을 수 있습니다
  120. */
  121. public function verify_code() {
  122. if (!$this->_logincode) return false;
  123. $t = time().strval (mt_rand(100,999));
  124. $url = 'https://login.weixin.qq.com/cgi-bin/mmwebwx-bin/login?uuid='.$this->_logincode. '&tip=1&_='.$t;
  125. $send_snoopy = 새로운 스누피;
  126. $send_snoopy->referer = "https://wx.qq.com/";
  127. $send_snoopy->fetch($url);
  128. $result = $send_snoopy->results;
  129. $this->log('step1:'.$result);
  130. if ($result) {
  131. preg_match("/window.code=(d )/",$result,$matches );
  132. if(count($matches)>1) {
  133. $status = intval($matches[1]);
  134. if ($status==201) $_SESSION['login_step'] = 1;
  135. if ($status==200) {
  136. preg_match("/ticket=([0-9a-z-_] )&lang=zh_CN&scan=(d )/",$result,$matches );
  137. $this->log('step2:'.print_r($matches,true));
  138. if (count($matches)>1) {
  139. $ticket = $matches[ 1];
  140. $scan = $matches[2];
  141. $loginurl = 'https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxnewloginpage?ticket='.$ticket.' &lang=zh_CN&scan='.$scan.'&fun=new';
  142. $send_snoopy = 새로운 스누피;
  143. $send_snoopy->referer = "https://wx.qq.com/";
  144. $send_snoopy->fetch($loginurl);
  145. $this->log('step3: '.print_r($send_snoopy->headers,true));
  146. foreach ($send_snoopy->headers as $key => $value) {
  147. $value = Trim($value);
  148. if(strpos($value,'Set-Cookie: ') !== false){
  149. $tmp = str_replace("Set-Cookie: ","",$value);
  150. $tmp = str_replace ("경로=/","",$tmp);
  151. $tmp = str_replace("Domain=.qq.com; ","",$tmp);
  152. $cookie.=$tmp;
  153. }
  154. }
  155. $cookie .="Domain=.qq.com;";
  156. $this->cookie = $cookie;
  157. $this->saveCookie($this- >_cookiename,$this->cookie);
  158. }
  159. }
  160. return $status;
  161. }
  162. }
  163. return false;
  164. }
  165. /**
  166. * 取得登陸的cookie
  167. *
  168. * @param bool $is_array 是否以數值方式返回,預設否,返回字串
  169. * @return string|array
  170. */
  171. public function get_login_cookie($is_array = false){
  172. if (!$is_array) return $this->cookie
  173. $c_arr =arrexplode (';',$this->cookie);
  174. $cookie = array();
  175. foreach($c_arr as $item) {
  176. $kitem =explode('=',trim( $item ) ));
  177. if (count($kitem)>1) {
  178. $key = trim($kitem[0]);
  179. $val = trim($kitem[1]);
  180. if (!empty($val)) $cookie[$key] = $val;
  181. }
  182. }
  183. return $cookie;
  184. }
  185. /**
  186. * 授權登陸後取得使用者登陸資訊
  187. */
  188. public function get_login_info(){
  189. if (!$this->cookie) return false;
  190. $t = time().strval(mt_rand(100,999));
  191. $send_snoopy = 新史努比;
  192. $submit = 'https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxinit?r='.$t;
  193. $send_snoopy->rawheaders['Cookie']= $ this ->cookie;
  194. $send_snoopy->referer = "https://wx.qq.com/";
  195. $send_snoopy->submit($submit,array());
  196. $this-> log('login_info:'.$send_snoopy->results);
  197. $result = json_decode($send_snoopy->results,true);
  198. if ($result['BaseResponse'] ['Ret']
  199. if ($result['BaseResponse'] ['Ret']
  200. if ($result['BaseResponse'] ['Ret']
  201. if ($result['BaseResponse'] ['Ret'] $this->_login_user = $result['User'];
  202. return $result;
  203. }
  204. /**
  205. * 取得頭像
  206. * @param string $url 傳入從使用者資訊介面取得到的頭像位址
  207. */
  208. public function get_avatar($url) {
  209. if (!$this->cookie) return false;
  210. if (strpos($url, 'http')===false ) {
  211. $url = 'http ://wx.qq.com'.$url;
  212. }
  213. $send_snoopy = 新史努比;
  214. $send_snoopy->rawheaders['Cookie']= $this->cookie;
  215. $send_snoopy->referer = "https://wx.qq.com/";
  216. $send_snoopy ->fetch ($url);
  217. $result = $send_snoopy->results;
  218. if ($result)
  219. return $result;
  220. else
  221. return false;
  222. }
  223. return false;
  224. }
  225. /**
  226. * 登出目前登陸用戶
  227. */
  228. public function logout(){
  229. if (!$this->cookie) return false;
  230. preg_match("/wxuin=( w );/", $this->cookie,$matches);
  231. if (count($matches)>1) $uid = $matches[1];
  232. preg_match("/wxsid=( w );/",$this ->cookie,$matches);
  233. if (count($matches)>1) $sid = $matches[1];
  234. $this->log( '註銷:uid='.$uid.' ;sid='.$sid);
  235. $send_snoopy = 新史努比;
  236. $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;
複製程式碼


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