微信扫描登录

[复制链接]
发表于 2014-2-2 21:55:19 | 显示全部楼层 |阅读模式
用户通过扫描网页提供的二维码实现登陆信息获取
$ ]# I3 d4 X$ V" d  c: I
  1. <?php, s  n1 V: k8 k# {* P  Z% A4 E
  2. /**
    ' @: C. J5 q$ h8 R1 |- p4 ^
  3. *  微信公众平台PHP-SDK2 V  P# }0 X1 W/ p
  4. *  Wechatauth为非官方微信登陆API
    " s: n1 s- e$ }
  5. *  用户通过扫描网页提供的二维码实现登陆信息获取& u* w1 Q8 w4 u' |; f; w$ V
  6. *  主要实现如下功能:
    ! Q! P, A6 z6 u9 }# T1 e& N
  7. *  get_login_code() 获取登陆授权码, 通过授权码才能获取二维码5 u2 u/ v2 ]5 }6 _( @+ O' H, ]2 z
  8. *  get_code_image($code='') 将上面获取的授权码转换为图片二维码4 N" w- G. U5 R  T- q% @
  9. *  verify_code() 鉴定是否登陆成功,返回200为最终授权成功.
    2 x8 e1 z' R5 L0 y
  10. *  get_login_cookie() 鉴定成功后调用此方法即可获取用户基本信息5 x1 x! A1 H3 _/ I8 z3 a* d
  11. *  sendNews($account,$title,$summary,$content,$pic,$srcurl='') 向一个微信账户发送图文信息
    4 d- n" ~  ?+ K3 P3 T
  12. *  get_avatar($url) 获取用户头像图片数据. Q6 [8 X+ F$ b$ D5 @) A
  13. *  @author dodge <dodgepudding@gmail.com>- l6 T. ~8 [3 s, m# Y0 Q1 x" \
  14. *  @link https://github.com/dodgepudding/wechat-php-sdk
    $ V1 B+ L6 J, L
  15. *  @version 1.1
    # [$ i/ ]  D! Q6 s
  16. *  8 t7 c- ^, O4 k) h0 c! ?# d+ {
  17. */
    / y  i2 {! W4 B, A4 A6 T) ~
  18. include "snoopy.class.php";
    : D' P7 X) k$ j* D/ ^; x1 J
  19. class Wechatauth8 K, v- C4 o" `( Z% {
  20. {
    1 h( B% H6 s" W4 I2 B9 p
  21.         private $cookie;; B6 S0 A6 k& b
  22.         private $_cookiename;
    / J# U" C+ j3 O" ]
  23.         private $_cookieexpired = 3600;3 H8 K$ _) ^  Z7 h( e
  24.         private $_account = 'test';# E$ w6 S, x$ W" S
  25.         private $_datapath = './data/cookie_';1 H/ p* N; u" M7 f4 T
  26.         private $debug;/ v& w$ w# z1 D6 x2 f' d
  27.         private $_logcallback;
    9 U: @6 S/ y( K0 I% O9 D
  28.         public $login_user; //当前登陆用户, 调用get_login_info后获取  d( |& q" y6 N; m2 k$ L
  29.         
    + S' G: i- X, f8 A3 e% p( b: Y4 f
  30.         public function __construct($options)* B7 M3 |: M$ I- Y( R
  31.         {$ u' E! [$ y! `. t. N* P; j4 n- K; |+ V
  32.                 $this->_account = isset($options['account'])?$options['account']:'';
    6 `! C# f7 J' i3 x8 `8 l
  33.                 $this->_datapath = isset($options['datapath'])?$options['datapath']:$this->_datapath;
    ; W7 b  _5 ^6 F: g2 s: v* R
  34.                 $this->debug = isset($options['debug'])?$options['debug']:false;
    " C/ H: s) M& K$ p+ h* T9 v3 _
  35.                 $this->_logcallback = isset($options['logcallback'])?$options['logcallback']:false;3 z6 @: Z' h) B* u  U# x! T: [* i
  36.                 $this->_cookiename = $this->_datapath.$this->_account;
    * B6 y. e2 G( B
  37.                 $this->getCookie($this->_cookiename);
    2 y4 S0 u, i5 ~; h8 L
  38.         }6 I: N# t/ k1 h( M9 Q+ ~
  39.         /**$ t* h5 Q) {8 ]' O5 E
  40.          * 把cookie写入缓存
    2 u8 a' u0 r8 e4 |( U
  41.          * @param  string $filename 缓存文件名
    ; G! L3 ]/ E' v9 L! I3 ]
  42.          * @param  string $content  文件内容9 A. P2 a' l& _" `2 C
  43.          * @return bool, ~/ a6 [. M( S# N0 {0 W6 Q
  44.          */
    7 a! E; J% K. \+ N
  45.         public function saveCookie($filename,$content){* d+ p1 ~1 M/ h5 I& Q; n+ E
  46.                 return file_put_contents($filename,$content);
    % Y# G; D- E) ^3 H
  47.         }( Z- `) M0 _" Q( B1 z+ `

  48. 9 }$ }8 e6 K6 K
  49.         /**2 y9 n5 W. v! t5 G+ O8 p8 F
  50.          * 读取cookie缓存内容
    % u8 V9 T; r* [3 z- |" D! q
  51.          * @param  string $filename 缓存文件名
    ( m+ D/ P( a9 H" ?( C5 J+ {4 f2 f
  52.          * @return string cookie4 i1 v1 q! h2 P  V
  53.          */% i1 r2 X, P% U+ s2 h2 x. p
  54.         public function getCookie($filename){% {$ ?0 `7 `  F4 k3 u
  55.                 if (file_exists($filename)) {8 s, ?* `- q& y0 g1 B7 Z
  56.                         $mtime = filemtime($filename);! \9 S$ \  D0 d7 n4 C1 V5 p; I
  57.                         if ($mtime<time()-$this->_cookieexpired) return false;  I0 `0 c  O. X0 ]2 H
  58.                         $data = file_get_contents($filename);* G* j8 ~  w, L; e, ?
  59.                         if ($data) $this->cookie = $data;, P, W, x+ P" z$ h  B4 s4 p4 ]
  60.                 }
    4 r* r. w7 Z' p  g$ j8 b. w% n
  61.                 return $this->cookie;- u! }4 `& {/ ]: U
  62.         }
    1 M1 B) w' X, S4 K0 {
  63.         3 |6 T1 O, S0 r2 y* N! D5 B. y& G
  64.         /*' f6 q$ e! a2 E& L
  65.          * 删除cookie5 W& T/ _; M) o9 j+ E
  66.          */
    6 w' w' N' ]  ~( M5 r! S, V
  67.         public function deleteCookie($filename) {0 v) s9 G1 e7 V, d, V, Y
  68.                 $this->cookie = '';  c% [. `! _* }3 E0 D& w5 |6 h
  69.                 @unlink($filename);6 g5 j* E; H! E- C6 }
  70.                 return true;
    / H4 W* J6 J* T( R! ^# Z& \" \- z
  71.         }
    ( _* u  u9 n% r. N" P
  72.         
    5 f1 ]9 g9 A5 X
  73.         private function log($log){, l; H1 ]0 C$ w# q8 y1 x* u
  74.                 if ($this->debug && function_exists($this->_logcallback)) {
    & n0 a% z1 Z; I
  75.                         if (is_array($log)) $log = print_r($log,true);
    ( W6 N" J) r4 z3 m
  76.                         return call_user_func($this->_logcallback,$log);5 H, _9 @6 _; z
  77.                 }
    4 I" d! h1 k0 E# P
  78.         }
    ( y6 T: M# x2 {
  79.         
    : F$ e) X5 }) N4 ]! d( ]
  80.         /**
    0 L$ T4 {' E3 A; E3 z
  81.          * 获取登陆二维码对应的授权码& {  |  @, O; F$ C+ L7 Z& p
  82.          */3 B& V1 S3 w% V+ i
  83.         public function get_login_code(){
    + u& C6 K# n- z. N0 K
  84.                 if ($this->_logincode) return $this->_logincode;0 @6 g. |) y' n, T
  85.                 $t = time().strval(mt_rand(100,999));* C8 {$ Z8 j' k2 M& P  {( n- X. U
  86.                 $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;2 Y5 a3 m& J0 ?# Z" {8 ^* e
  87.                 $send_snoopy = new Snoopy; " g8 n3 x. d9 [4 U
  88.                 $send_snoopy->fetch($codeurl);$ w2 T: e2 F8 }
  89.                 $result = $send_snoopy->results;
    , n" s6 N3 s! A; W/ W3 s
  90.                 if ($result) {) L1 {) j! r3 X  R2 l+ p$ G" P
  91.                         preg_match("/window.QRLogin.uuid\s+=\s+"([^"]+)"/",$result,$matches);4 Y- p7 q5 z) E! {) R4 b% W
  92.                         if(count($matches)>1) {
    ) X1 ^' G0 i0 v1 b" T  Z% X
  93.                                 $this->_logincode = $matches[1];
    ( ?. c% ~) d( X7 \& f$ i
  94.                                 $_SESSION['login_step'] = 0;
    : X) L! K6 j0 p/ T* r2 j& ?$ _
  95.                                 return $this->_logincode;" D  |# F9 l* O  n
  96.                         }0 U2 _$ Z3 I% E  N! P5 f2 Q* q
  97.                 }
    , N* i8 w/ u1 N0 f: x+ w
  98.                 return $result;
    " L% `  N8 p6 P, o& A0 `! o! t( p9 Z
  99.         }
    7 A; k  B1 I" N7 w. ^1 C. y* G
  100. 6 I8 @! s" J0 }( [7 ~/ {4 Z: r( y
  101.         /**2 |/ m4 ], L8 W1 d( _, ]/ o, x
  102.          * 通过授权码获取对应的二维码图片地址4 @3 N) V  ]6 G7 B1 P
  103.          * @param string $code& A& C; {& M. N7 l7 Z
  104.          * @return string image url% J, L( T6 }4 z2 @
  105.          */8 r! Z* d2 \# @2 \
  106.         public function get_code_image($code=''){
    1 \+ R; F" g* |  @
  107.                 if ($code=='') $code = $this->_logincode;( t2 S% @( y9 b! M
  108.                 if (!$code) return false;8 X3 D) ^+ x7 I: \4 `
  109.                 return 'http://login.weixin.qq.com/qrcode/'.$this->_logincode.'?t=webwx';/ d( D% [1 o: Z+ N0 J9 p
  110.         }
    / F& v# Z& `1 Z0 g. N
  111.         
    ! `7 I) C/ m) q3 T" i5 s1 f
  112.         /**6 \  D% V3 H% t/ d# @* o
  113.          * 设置二维码对应的授权码
    ! x8 ]& u$ i& R. V" L# U/ x) ?; `
  114.          * @param string $code
    + D# U- `3 _9 g, ]0 T( R8 x
  115.          * @return class $this
    ! g) g4 S3 g6 C* S& i2 q
  116.          */8 R% n* d& \, y! j
  117.         public  function set_login_code($code) {+ N; |) P: {0 L& B' H. @* `3 @
  118.                 $this->_logincode = $code;
    " n8 N( _, L+ B0 P  h
  119.                 return $this;
    8 _" t  \- u/ f0 K( v5 E
  120.         }
      B# f. K% w! `! V8 w5 S
  121.         6 `( H- C4 y$ t4 ~+ p* J
  122.         /**2 [3 `  \3 K0 l1 ?
  123.          * 二维码登陆验证
    4 @+ ]* u. i  u7 g7 C" ]* j
  124.          *
    % h: a0 O2 Y& g/ M0 n1 r. s
  125.          * @return status:
    4 i) P' ]& P" @: u$ I8 E0 a
  126.          * >=400: invaild code; 408: not auth and wait, 400,401: not valid or expired
    " Y  o9 v; @) c& N4 L
  127.          * 201: just scaned but not confirm
    . A5 C$ T7 t9 K2 c
  128.          * 200: confirm then you can get user info
    5 K( f0 o' @- i" B( l5 x
  129.          */6 F2 w; a/ K. m( L: T8 b6 K  {9 N/ w+ W
  130.         public function verify_code() {$ z& N0 E, d& g- d" ?& I( n2 {
  131.                 if (!$this->_logincode) return false;- J; |$ ?5 B: U
  132.                 $t = time().strval(mt_rand(100,999));
    0 }3 c5 p; `% n4 W$ }

  133. + s$ o" e3 [! Y; A8 o, L2 @) D3 \
  134.                         $url = 'https://login.weixin.qq.com/cgi-bin/mmwebwx-bin/login?uuid='.$this->_logincode.'&tip=1&_='.$t;
    # h% j2 T  @) a7 X) M# P
  135.                         $send_snoopy = new Snoopy;
    . v. g$ g1 ?; i- N5 C5 V
  136.                         $send_snoopy->referer = "https://wx.qq.com/";% O" {/ I9 s/ h
  137.                         $send_snoopy->fetch($url);  y$ a* i6 c: U8 f
  138.                         $result = $send_snoopy->results;' u6 r5 _- N+ f4 R
  139.                         $this->log('step1:'.$result);! d: v. L$ ~' x
  140.                         if ($result) {
    - X: _  Z8 ?2 k$ p4 z- U* m: M8 z( u
  141.                                 preg_match("/window\.code=(\d+)/",$result,$matches);2 U6 `* G4 B4 {, _* F
  142.                                 if(count($matches)>1) {
    8 ]1 _, I4 j" V) c% i
  143.                                         $status = intval($matches[1]);
    7 N& x8 o, l) Z
  144.                                         if ($status==201) $_SESSION['login_step'] = 1;9 }+ |( _* y/ H5 d. j* D* ]
  145.                                         if ($status==200) {
    / J- s6 I% |* e9 v0 U2 ]! d
  146.                                                 preg_match("/ticket=([0-9a-z-_]+)&lang=zh_CN&scan=(\d+)/",$result,$matches);" [/ a" v* v$ A: L/ E# |# ~
  147.                                                 $this->log('step2:'.print_r($matches,true));$ N; ?- _  g/ P0 ~, ]
  148.                                                 if (count($matches)>1) {- U- j% F/ b& A& e6 b* [* Q
  149.                                                         $ticket = $matches[1];( X. X0 ?  \' X* m- [5 r
  150.                                                         $scan = $matches[2];
    8 A" n8 k. d! `' P5 p
  151.                                                         $loginurl = 'https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxnewloginpage?ticket='.$ticket.'&lang=zh_CN&scan='.$scan.'&fun=new';
    ! J' M& ?/ ?0 k6 [! ]# S7 b
  152.                                                         $send_snoopy = new Snoopy; % l2 }$ D) f+ P- I
  153.                                                         $send_snoopy->referer = "https://wx.qq.com/";
    & U$ @/ d# o' x! s0 }% C
  154.                                                         $send_snoopy->fetch($loginurl);
    % q5 [, k' i) b" F% j) ]! f3 D
  155.                                                         $this->log('step3:'.print_r($send_snoopy->headers,true));
    2 ^! Z: S" o- V0 v, l
  156.                                                         foreach ($send_snoopy->headers as $key => $value) {$ q4 U1 }3 ~) E& c( N: z" @# n
  157.                                                                 $value = trim($value);8 T1 o9 f. U+ l( J
  158.                                                                 if(strpos($value,'Set-Cookie: ') !== false){
    * @; W- m; p: b6 g1 c5 q" B
  159.                                                                         $tmp = str_replace("Set-Cookie: ","",$value);
    " Y7 _/ d+ d7 @' X7 Q/ J3 b  r, l1 g
  160.                                                                         $tmp = str_replace("Path=/","",$tmp);% D6 _6 d  ^% Y. L/ Q4 ~% f8 S  Z& b. O# f
  161.                                                                         $tmp = str_replace("Domain=.qq.com; ","",$tmp);2 N7 h2 X% q" ^
  162.                                                                         $cookie.=$tmp;, h7 ?/ g$ J2 |( v4 L7 W
  163.                                                                 }
    ! Z, F7 G/ `+ |# c+ r
  164.                                                         }
    5 L. M, i0 p1 `
  165.                                                         $cookie .="Domain=.qq.com;";
    3 v& _2 [' H5 ~* N
  166.                                                         $this->cookie = $cookie;+ a+ t! y. f, X
  167.                                                         $this->saveCookie($this->_cookiename,$this->cookie);
    6 W! a# s+ i. [! z
  168.                                                 }( @/ d' J7 h& i  i
  169.                                         }
    % [  {5 q6 a2 _# J3 j4 g
  170.                                         return $status;6 C! d- k; p# x+ H# Y% [+ S
  171.                                 }9 _7 L# g/ m  L! {  }
  172.                         }
    ) h$ A4 s2 @! ?- |: l4 @
  173.                 return false;
    ( [$ W$ A( {; n8 v
  174.         }' ]( j8 \3 W6 ?
  175.         ! A4 M* I; @$ s8 O
  176.         /**
    - C! U4 g$ K# n' f7 i! l8 n' B
  177.          * 获取登陆的cookie
    0 Q$ m7 n! y6 T" n
  178.          *
    ' t+ I$ c) ~, t; g. m% K( |$ d
  179.          * @param bool $is_array 是否以数值方式返回,默认否,返回字符串
    4 m/ A% @+ M0 J/ N/ k2 c
  180.          * @return string|array
    , o9 F% z- d+ k  F( u
  181.          */- N5 f3 r3 O" ?/ f
  182.         public function get_login_cookie($is_array = false){, {# i- e1 j* a2 a6 K) d8 k: e
  183.                 if (!$is_array)        return $this->cookie;
    * u$ I' E& f2 _( O! n  g2 P( k
  184.                 $c_arr = explode(';',$this->cookie);
    , n3 i( |: f1 U* m% [& l
  185.                 $cookie = array();8 J4 [! M! |5 v
  186.                 foreach($c_arr as $item) {
    8 S9 t$ o# T+ J  f+ \5 o/ i5 g- _
  187.                         $kitem = explode('=',trim($item));  t: L, n& R* r9 n3 X
  188.                         if (count($kitem)>1) {; [, N! U3 V5 a& h# A7 w7 d
  189.                                 $key = trim($kitem[0]);
    1 E" k, g8 h7 G( P
  190.                                 $val = trim($kitem[1]);
    % b# K7 C9 x. d- E8 N$ c
  191.                                 if (!empty($val)) $cookie[$key] = $val;$ f4 c$ @0 L" @( `! O; {
  192.                         }
    1 `9 t8 i0 n7 y1 G
  193.                 }
    * U% m  y4 ]! b* N) F
  194.                 return $cookie;
    ; c! Y5 h3 T' `7 L' f* Y. a2 x& u8 [  ~
  195.         }% {" l) {5 K$ U& @
  196.         , e' t" L  g1 E+ k- K
  197.         /**# N- d' z& [$ t- t0 W. F
  198.          *          授权登陆后获取用户登陆信息
    & {' C8 _9 e- C4 }) m. \2 x9 d
  199.          */
    7 l* d. Q; c- t4 a- ?
  200.         public function get_login_info(){/ t6 e& ?3 u7 h& v6 [) A0 c
  201.                 if (!$this->cookie) return false;+ ]) ^" N+ U' A* J* \
  202.                 $t = time().strval(mt_rand(100,999));
    0 V& A5 j( A, F
  203.                 $send_snoopy = new Snoopy;
    ! U: m: D0 i$ Y+ ?' r
  204.                 $submit = 'https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxinit?r='.$t;% _4 w+ U8 B  S5 }0 \! i: S1 [
  205.                 $send_snoopy->rawheaders['Cookie']= $this->cookie;
    3 u" Z4 p* ~) `9 u/ l' }# T
  206.                 $send_snoopy->referer = "https://wx.qq.com/";5 t/ s* n9 U, c3 E. e0 ]
  207.                 $send_snoopy->submit($submit,array());! Z5 S! h9 ^2 G- x
  208.                 $this->log('login_info:'.$send_snoopy->results);' q, `) L9 Z, c9 P8 b! c
  209.                 $result = json_decode($send_snoopy->results,true);
    7 c( W; F5 g, v' R+ v
  210.                 if ($result['BaseResponse']['Ret']<0) return false;: ]  d% @) @5 h( K
  211.                 $this->_login_user = $result['User'];3 K/ H+ r3 \' V# i( D- b: l
  212.                 return $result;
    ) V7 a5 {. N7 \8 s- I9 ~8 t
  213.         }
    ) X8 ^; k& ^/ h& w) f9 z
  214.         / d! ~9 Q$ r1 _/ D* u9 x& a" T
  215.         /**% N" h$ \) h1 s* D6 L) K4 Q
  216.          *  获取头像
    3 ]  R! [1 L! e- x
  217.          *  @param string $url 传入从用户信息接口获取到的头像地址
      W' U7 l! o6 r8 C
  218.          */- e8 W& ~8 {& W" Z) g# s7 ~
  219.         public function get_avatar($url) {/ Z- v/ Z5 I6 }5 [& ]- G
  220.                 if (!$this->cookie) return false;
    3 e3 }. q; s, {: w# e1 l
  221.                 if (strpos($url, 'http')===false) {
    : m7 w' o# M7 L) D
  222.                         $url = 'http://wx.qq.com'.$url;5 P$ S" v; Q! t5 j  {4 W& {  B8 Z2 k
  223.                 }& g' P& G% S8 G$ O5 q
  224.                 $send_snoopy = new Snoopy; ; M$ B) X4 T' t' h
  225.                 $send_snoopy->rawheaders['Cookie']= $this->cookie;8 T1 e4 L0 C, G+ n$ U( E7 d
  226.                 $send_snoopy->referer = "https://wx.qq.com/";# [+ F0 @7 R* q$ l  ~" ?
  227.                 $send_snoopy->fetch($url);8 I+ x1 [& {, m, M, J
  228.                 $result = $send_snoopy->results;
    4 D( M/ h9 `, V4 f1 i8 P
  229.                 if ($result)
    # R: y% y0 `) L: s
  230.                         return $result;
    & K" E: M1 l# A4 u2 D4 u9 O
  231.                 else8 [/ @" `: a3 D/ P# z- |
  232.                         return false;4 O# L& j+ ?% V  }5 j
  233.         }" S- o- b5 d# H8 T) @& U) S
  234.         
    / B3 J( K0 g( X# [
  235.         /**
    * U- a% D- E- ~% c& a2 j
  236.          * 登出当前登陆用户% ?) o  E& U4 H! D
  237.          */% g- D' ?+ j$ F% V$ {
  238.         public function logout(){3 A: z/ V' M: J2 A% ?# D+ J; u
  239.                 if (!$this->cookie) return false;
    0 H7 d4 n, A. j( m2 |
  240.                 preg_match("/wxuin=(\w+);/",$this->cookie,$matches);4 {3 V8 `5 q' q& i9 D
  241.                 if (count($matches)>1) $uid = $matches[1];
    ) m+ G1 H% d  d! T9 W
  242.                 preg_match("/wxsid=(\w+);/",$this->cookie,$matches);
    , s) L& O2 s& K( W
  243.                 if (count($matches)>1) $sid = $matches[1];+ T: h# s/ P- Q& S; w9 V& j
  244.                 $this->log('logout: uid='.$uid.';sid='.$sid);! |: H  {" [* C1 Q: |5 u/ A* x" v
  245.                 $send_snoopy = new Snoopy; % i+ f0 @2 ?1 F5 p/ ]& v
  246.                 $submit = 'https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxlogout?redirect=1&type=1';
    4 }& X+ b6 B3 l8 M8 i8 P/ c
  247.                 $send_snoopy->rawheaders['Cookie']= $this->cookie;
    2 E3 ]" E8 U! v- o! P' r7 M1 A
  248.                 $send_snoopy->referer = "https://wx.qq.com/";" ?8 ^0 b8 m9 G/ J
  249.                 $send_snoopy->submit($submit,array('uin'=>$uid,'sid'=>$sid));
    - ~+ [) _9 F5 a: s9 C
  250.                 $this->deleteCookie($this->_cookiename);
    " d/ c/ T$ x+ v! G) a' Q6 o
  251.                 return true;
    0 |  n" y+ w, X; }; }
  252.         }
    " u- ~4 U0 B7 n7 x- i! o1 X
  253. }
复制代码
; F( G" p* h; W9 f; v9 m1 b




上一篇:[Discuz插件] Discuz!微信登录插件配置前提
下一篇:Emacs逆袭:开发微信公众平台小游戏
回复

使用道具 举报

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏

快速回复 返回顶部 返回列表