ホームページ  >  記事  >  バックエンド開発  >  WeChatスキャンログイン

WeChatスキャンログイン

WBOY
WBOYオリジナル
2016-07-25 08:49:061252ブラウズ
ユーザーは、Web ページに記載されている QR コードをスキャンすることでログイン情報を取得できます。
  1. /**
  2. * WeChatパブリックプラットフォームPHP-SDK
  3. * Wechatauthは非公式のWeChatログインAPIです
  4. * ユーザーはウェブページに提供されているQRコードをスキャンすることでログイン情報を取得できます
  5. * 主に以下の機能を実装します:
  6. * get_login_code()はログイン認証を取得しますcode, through 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. * @バージョン 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. * Cookie をキャッシュに書き込みます
  39. * @param string $filename キャッシュ ファイル名
  40. * @param string $content ファイルの内容
  41. * @return bool
  42. */
  43. public function saveCookie($filename,$content){
  44. return file_put_contents($filename,$content) ) ;
  45. }
  46. /**
  47. * Cookie キャッシュの内容を読み取る
  48. * @param string $filename キャッシュ ファイル名
  49. * @return string Cookie
  50. */
  51. public function getCookie($filename){
  52. if (file_exists($filename)) {
  53. $mtime = filemtime($filename);
  54. if ($mtime
  55. $data = file_get_contents($filename);
  56. if ($data) $this->cookie = $data;
  57. }
  58. return $this->cookie;
  59. }
  60. /*
  61. * cookie を削除
  62. */
  63. public function deleteCookie($filename) {
  64. $this->cookie = '';
  65. @unlink($filename);
  66. return true;
  67. }
  68. private function log($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. public 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%3A%2F%2Fwx.qq .com%2Fcgi-bin%2Fmmwebwx-bin%2Fwebwxnewloginpage&fun=new&lang=zh_CN&_='.$t;
  81. $send_snoopy = 新しいスヌーピー
  82. $send_snoopy->fetch($codeurl);
  83. $result = $send_snoopy->結果 ;
  84. if ($result) {
  85. preg_match("/window.QRLogin.uuids+=s+"([^"]+)"/",$result,$matches);
  86. if(count($matches)> 1 ) {
  87. $this->_logincode = $matches[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. public function get_code_image($code=''){
  100. if ($code=='') $code = $this->_logincode;
  101. if (!$code) return 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 status:
  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 = トリム($value);
  148. if(strpos($value,'Set-Cookie : ') !== false){
  149. $tmp = str_replace("Set-Cookie: ","",$value);
  150. $tmp = str_replace("Path=/","",$tmp);
  151. $ tmp = str_replace("ドメイン=.qq.com; ","",$tmp);
  152. $cookie.=$tmp;
  153. }
  154. }
  155. $cookie .="ドメイン=.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 数値形式で返すかどうか、デフォルトは no、文字列を返します
  169. * @return string|array
  170. */
  171. public function get_login_cookie($is_array = false){
  172. if (!$is_array) return $this->cookie;
  173. $c_arr =explode(';',$this-> ;cookie);
  174. $cookie = array();
  175. foreach($c_arr as $item) {
  176. $kitem =explode('=',trim($item));
  177. if (count($kitem)>1 ) {
  178. $key = トリム($kitem[0]);
  179. $val = トリム($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']<0) return false;
  199. $ this->_login_user = $result['User'];
  200. return $result;
  201. }
  202. /**
  203. * アバターの取得
  204. * @param string $url ユーザー情報インターフェースから取得したアバターのアドレスを渡します
  205. */
  206. public function get_avatar($url) {
  207. if (!$this->cookie ) return false;
  208. if (strpos($url, 'http')===false) {
  209. $url = 'http://wx.qq.com'.$url;
  210. }
  211. $send_snoopy = 新しいスヌーピー;
  212. $send_snoopy->rawheaders['Cookie']= $this->cookie;
  213. $send_snoopy->gt;referer = "https://wx.qq.com/";
  214. $send_snoopy->fetch($ url);
  215. $result = $send_snoopy->results;
  216. if ($result)
  217. return $result;
  218. else
  219. return false;
  220. }
  221. /**
  222. * 現在ログインしているユーザーをログアウトします
  223. */
  224. public function logout(){
  225. if (!$this->cookie) return false;
  226. preg_match("/wxuin=(w+);/",$this->cookie,$matches);
  227. if (count($matches)>1 ) $uid = $matches[1];
  228. preg_match("/wxsid=(w+);/",$this->cookie,$matches);
  229. if (count($matches)>1) $sid = $matches[1];
  230. $this->log('logout: uid='.$uid.';sid='.$sid);
  231. $send_snoopy = 新しいスヌーピー;
  232. $submit = 'https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxlogout?redirect=1&type=1';
  233. $send_snoopy->rawheaders['Cookie']= $this-> cookie;
  234. $send_snoopy->referer = "https://wx.qq.com/";
  235. $send_snoopy->submit($submit,array('uin'=>$uid,'sid'=>) ;$sid));
  236. $this->deleteCookie($this->_cookiename);
  237. return true;
  238. }
  239. }
复制代码


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。