微信扫描登录

[复制链接]
发表于 2014-2-2 21:55:19 | 显示全部楼层 |阅读模式
用户通过扫描网页提供的二维码实现登陆信息获取 2 o' H9 N& H5 d: d+ E( F# T8 H! j
  1. <?php
    " ]4 F6 ]' x1 u* u# c( _
  2. /**$ c3 E. F/ Q7 B( }1 U9 a7 e" g0 p
  3. *  微信公众平台PHP-SDK" {3 a3 k. r1 F
  4. *  Wechatauth为非官方微信登陆API. ^; C# P$ J9 n/ l0 I  a# u
  5. *  用户通过扫描网页提供的二维码实现登陆信息获取
    / D* T0 R& }. U, z. T
  6. *  主要实现如下功能:
    ) o, u0 a6 d( q4 W1 D5 l$ i* L
  7. *  get_login_code() 获取登陆授权码, 通过授权码才能获取二维码
    , F- |" R; s7 i8 v% x
  8. *  get_code_image($code='') 将上面获取的授权码转换为图片二维码; F9 K- _" I$ r5 {7 p) l+ c
  9. *  verify_code() 鉴定是否登陆成功,返回200为最终授权成功., {( ~" e% Q% s4 L; J
  10. *  get_login_cookie() 鉴定成功后调用此方法即可获取用户基本信息
    3 U) A: V5 v( _8 q. W- _! X
  11. *  sendNews($account,$title,$summary,$content,$pic,$srcurl='') 向一个微信账户发送图文信息
    & R2 S3 i: K. X5 t
  12. *  get_avatar($url) 获取用户头像图片数据
    / @! G% L7 ~& I; I9 W
  13. *  @author dodge <dodgepudding@gmail.com>; A; t. [. L+ p
  14. *  @link https://github.com/dodgepudding/wechat-php-sdk
    ) ?$ i+ t) k" [6 S! x
  15. *  @version 1.1; F# L8 e& p3 c2 V
  16. *  9 i5 t' D( Y  }6 c! }  s
  17. */
    1 M8 f3 j# S" r3 C4 y7 s1 @
  18. include "snoopy.class.php";
    . y+ _& W# Z2 f- Z: X/ D6 ?9 y
  19. class Wechatauth' r. G4 K1 T7 u* C2 {8 g
  20. {) z' ~' f4 r9 e3 Y
  21.         private $cookie;
    ; ^. J; Y0 H7 s* T) }
  22.         private $_cookiename;$ w6 h' N# A) A& p+ u& [, L4 u
  23.         private $_cookieexpired = 3600;9 e( K8 ]8 ~! x; Y% Q& H
  24.         private $_account = 'test';
    : ?7 o% x! u/ k: v, X4 \9 ^. V3 f" d/ G
  25.         private $_datapath = './data/cookie_';
    . C# I) Y1 L8 \
  26.         private $debug;4 P3 G: O/ b0 X/ _# L  d5 y
  27.         private $_logcallback;& }- P  _& |5 _5 e5 G$ @
  28.         public $login_user; //当前登陆用户, 调用get_login_info后获取. v$ p" ~4 P5 Z7 E% l3 i$ N8 F
  29.         % T+ I( ~& L2 M% `/ {4 k- ~6 M+ D
  30.         public function __construct($options)4 y" X3 B! S; z- D0 S* O; I
  31.         {* ?: H% @- w& i  V* J3 g
  32.                 $this->_account = isset($options['account'])?$options['account']:'';7 V* y* V7 d; _" `( [, i1 Q4 Y
  33.                 $this->_datapath = isset($options['datapath'])?$options['datapath']:$this->_datapath;6 G& L" f" h9 K# }( r7 S  N# |
  34.                 $this->debug = isset($options['debug'])?$options['debug']:false;
    & [! s, `5 ~/ `+ o4 g
  35.                 $this->_logcallback = isset($options['logcallback'])?$options['logcallback']:false;
    ' P( x! n& k3 U/ }  N
  36.                 $this->_cookiename = $this->_datapath.$this->_account;' R9 p9 l9 o( s$ R
  37.                 $this->getCookie($this->_cookiename);
    9 n! W$ C3 x4 E- G4 K0 ]
  38.         }- a  _2 J( ^$ ~; x
  39.         /**
    ' D& z* t& m/ y+ V- v4 t
  40.          * 把cookie写入缓存" G( F  a8 T4 M+ @
  41.          * @param  string $filename 缓存文件名
    9 F& u0 o/ _3 q/ j2 \
  42.          * @param  string $content  文件内容
    . D  D! U/ @0 U; O* |! i" b
  43.          * @return bool
    3 W+ k. ^1 v  C' C4 i1 A% N4 T
  44.          */1 [+ B" s4 p( o$ F: `
  45.         public function saveCookie($filename,$content){
    + r9 l6 P8 G7 N4 @( R4 ]. ~
  46.                 return file_put_contents($filename,$content);
    ' j; _; U8 o8 j. a$ S6 p7 ]
  47.         }
    5 z% C) d& ~8 L; l- p
  48. $ Q) d; y5 M1 r$ R3 v- l, {7 l
  49.         /**) F! \+ n; M) {0 N1 M
  50.          * 读取cookie缓存内容
    / X+ V8 j$ g, d: o1 [1 i
  51.          * @param  string $filename 缓存文件名7 A4 f2 L2 x5 |5 h- O1 M% ]" x' ^* Z
  52.          * @return string cookie
    % e% i9 ]% L" e0 h- K/ _
  53.          */" J4 C8 T( X5 f* }- {( T+ `
  54.         public function getCookie($filename){
    1 g% V, z$ ]; J# a
  55.                 if (file_exists($filename)) {
    ; `1 Q$ i3 U9 s6 P( M" v3 b
  56.                         $mtime = filemtime($filename);
    1 h" t- ^; a, B) ^! u* X
  57.                         if ($mtime<time()-$this->_cookieexpired) return false;
    2 d9 P2 q& [  I& h! U# h  K
  58.                         $data = file_get_contents($filename);
    ; g- r7 @  c2 B/ f  x6 H, }
  59.                         if ($data) $this->cookie = $data;9 |$ k! X2 a& U) q6 A
  60.                 }
    0 M, q: }2 v9 R: M
  61.                 return $this->cookie;
    ; Q/ E$ N2 b0 i* a$ w6 P, ]
  62.         }" X3 ^  @, ^. Z5 e6 ]% s- G
  63.         
    0 ]1 V' m; ~* `, T2 Q: F
  64.         /*9 D7 y; X. h0 z' c7 R* `9 n: N( O
  65.          * 删除cookie: b4 [0 }) m  |1 z- s
  66.          */
    6 K( H3 k1 i) I: r
  67.         public function deleteCookie($filename) {- S) j0 R& v0 C; k  P8 k1 ^$ ]. z% ~3 `
  68.                 $this->cookie = '';+ Q4 G+ w% e( D5 A# Z! n
  69.                 @unlink($filename);# ~: A5 i$ f5 L
  70.                 return true;) n$ K0 t$ Q4 e! j
  71.         }6 T! F* ?% H- }- K: n  |
  72.         1 w* I  c8 m* d! `% {/ Y: N& [+ y
  73.         private function log($log){0 `3 M% F3 ?% t; ~& o, n- d
  74.                 if ($this->debug && function_exists($this->_logcallback)) {
    & y, G" h' I! a& c. w; D; W
  75.                         if (is_array($log)) $log = print_r($log,true);7 L" R$ R$ i" _) Q
  76.                         return call_user_func($this->_logcallback,$log);
    3 u% z, @) g3 I6 t4 W- N% l
  77.                 }# A( X! F4 T5 K
  78.         }
    3 ?  k! ~3 o: [* Y) y9 N
  79.         
    % M/ K( c& i3 \: J4 w8 r
  80.         /**0 S& X7 k% V% f' L; e9 |
  81.          * 获取登陆二维码对应的授权码
    ( N: i" Q7 e/ m% p6 U7 J% m9 O
  82.          */0 ~8 m1 X) r8 N4 x* S' z$ V4 k' p+ }
  83.         public function get_login_code(){
      b  V( f5 L. b
  84.                 if ($this->_logincode) return $this->_logincode;
    / L% s1 V( m5 }; F# x
  85.                 $t = time().strval(mt_rand(100,999));; D( m" G8 C# X' z+ M
  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;$ @0 @6 p" D! o+ ^8 X
  87.                 $send_snoopy = new Snoopy;
    . ~& x' `; V( [
  88.                 $send_snoopy->fetch($codeurl);$ |& X$ d8 y# b, g. U7 B
  89.                 $result = $send_snoopy->results;6 y. [$ E5 X3 k8 A
  90.                 if ($result) {
    % U) K7 d- P* ^" b
  91.                         preg_match("/window.QRLogin.uuid\s+=\s+"([^"]+)"/",$result,$matches);) Q0 X. a& g# _9 `
  92.                         if(count($matches)>1) {- }( S4 ^6 d9 }
  93.                                 $this->_logincode = $matches[1];/ T) t  x0 h8 p  `3 g! E
  94.                                 $_SESSION['login_step'] = 0;6 W! @# u6 n9 v/ ]" u  I, E' j
  95.                                 return $this->_logincode;
    - x, v% t8 T5 Q, y# M* ]
  96.                         }
    . z; D/ r3 @. a. ^
  97.                 }8 W0 u8 ?5 W( G. H
  98.                 return $result;
    " m- b, ?3 X* c* W$ J
  99.         }9 P  E) }; i- T! ~
  100. ' I3 o! C0 v/ q' R9 `4 h7 \
  101.         /**
      m/ |3 D  n( I- f  j2 S4 f& @1 \0 L
  102.          * 通过授权码获取对应的二维码图片地址
    ; X0 V. C# c7 E. f7 I1 l4 w5 y7 K
  103.          * @param string $code( h( l, _! E0 W; A6 |
  104.          * @return string image url
    2 D! R& ?1 Y5 e( W  ]
  105.          */
    % m. t% v' @+ t6 u
  106.         public function get_code_image($code=''){, D) e8 h9 r) ^& c6 C) e
  107.                 if ($code=='') $code = $this->_logincode;
    7 a3 k) t$ E7 V
  108.                 if (!$code) return false;3 a! x; ~3 E3 d: Z) ]
  109.                 return 'http://login.weixin.qq.com/qrcode/'.$this->_logincode.'?t=webwx';9 f2 F4 e/ G, C  U5 B
  110.         }% Z7 S" k8 ]+ V! X
  111.         + G( m- R8 ?% e9 u2 J. \/ j
  112.         /**5 Y7 _4 X" o" z8 S7 \
  113.          * 设置二维码对应的授权码! n1 B) @9 |6 ~4 w  l
  114.          * @param string $code: c9 O. p# R/ B& r* U! Z( E
  115.          * @return class $this
    ( _  E6 p  C$ _
  116.          */5 z4 v! F, b; V6 o  _
  117.         public  function set_login_code($code) {
    0 g, w/ x/ t$ K# V3 @2 B
  118.                 $this->_logincode = $code;+ P4 t1 w' f  E; `* {8 P% W
  119.                 return $this;
    ' U" K- j' j' B. W6 T
  120.         }
    - g: m) E1 ?3 ~2 y, I+ y7 r5 M3 o
  121.         5 l+ N5 ^; O6 n# _
  122.         /**7 x+ G; O& h2 L1 U0 f, M
  123.          * 二维码登陆验证
    * o$ X5 N/ F2 N& ~, i
  124.          *
    ; D& H- O2 _0 {: ]* W! Q0 e+ }, x  i
  125.          * @return status:
    " j' ~+ @: K; l$ w0 ^
  126.          * >=400: invaild code; 408: not auth and wait, 400,401: not valid or expired
    % v7 x; \/ {9 }2 E, B3 F
  127.          * 201: just scaned but not confirm
    % s& {- A8 N7 _1 Z& Y( l
  128.          * 200: confirm then you can get user info+ A  \, z. J, v3 S3 e6 x
  129.          */
    : [. V. ^2 H) ]. z- B
  130.         public function verify_code() {
    , o9 M: z+ s1 X+ r+ X
  131.                 if (!$this->_logincode) return false;+ h! r' O+ s/ e) ]7 H3 a- _5 f
  132.                 $t = time().strval(mt_rand(100,999));
    & X2 b3 A" P& f( ~( N: p* H4 A  F

  133. $ E1 ~; l' F: @: y3 j/ G
  134.                         $url = 'https://login.weixin.qq.com/cgi-bin/mmwebwx-bin/login?uuid='.$this->_logincode.'&tip=1&_='.$t;
    5 ~7 Y/ E2 \; P0 A- w0 A
  135.                         $send_snoopy = new Snoopy;
    ' D, \' z/ [2 m% v: n
  136.                         $send_snoopy->referer = "https://wx.qq.com/";
    7 r! G' `! Y' a' n
  137.                         $send_snoopy->fetch($url);
    3 d. @$ _1 X; ?4 A. U/ Y* F
  138.                         $result = $send_snoopy->results;# P' u4 N' v3 c' U
  139.                         $this->log('step1:'.$result);
    6 _: c. v( Y% W, x1 A
  140.                         if ($result) {
    4 \! n7 @& x9 J4 k8 N& M- I2 u, x
  141.                                 preg_match("/window\.code=(\d+)/",$result,$matches);
    4 r3 p) s  m. t0 J4 f- _! @
  142.                                 if(count($matches)>1) {
    $ S2 y! `: _" V
  143.                                         $status = intval($matches[1]);
    + g! B3 {. I' x+ R
  144.                                         if ($status==201) $_SESSION['login_step'] = 1;
    - X0 ]9 C5 g6 P' K: J& N" p+ U$ }0 h
  145.                                         if ($status==200) {
    1 b! ], s0 m8 y
  146.                                                 preg_match("/ticket=([0-9a-z-_]+)&lang=zh_CN&scan=(\d+)/",$result,$matches);2 [5 f9 j2 e/ r2 X# a
  147.                                                 $this->log('step2:'.print_r($matches,true));
    5 j8 l& }  ^, D# b: e+ s
  148.                                                 if (count($matches)>1) {
    6 Q1 Q$ h7 _& L) B! }$ {: d
  149.                                                         $ticket = $matches[1];: e6 F& E" c. z0 ]3 D, s
  150.                                                         $scan = $matches[2];) c& p& i4 x" F, p1 X. _( K
  151.                                                         $loginurl = 'https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxnewloginpage?ticket='.$ticket.'&lang=zh_CN&scan='.$scan.'&fun=new';
    * c* O) ?1 P4 o
  152.                                                         $send_snoopy = new Snoopy;
    0 g/ o2 \5 @, m9 a; r3 m, [- W+ E
  153.                                                         $send_snoopy->referer = "https://wx.qq.com/";5 ]. O  h1 \+ f4 L( F( \$ n0 E
  154.                                                         $send_snoopy->fetch($loginurl);
    / v5 {/ ^: H4 N4 F: f2 a/ V8 q
  155.                                                         $this->log('step3:'.print_r($send_snoopy->headers,true));4 _, M% Y+ i+ |: S' O. ]# e5 z. @
  156.                                                         foreach ($send_snoopy->headers as $key => $value) {9 J3 K! N) g6 `' q. u
  157.                                                                 $value = trim($value);/ E# _9 K, }$ B4 W) R
  158.                                                                 if(strpos($value,'Set-Cookie: ') !== false){
    6 B8 g$ D; F3 l
  159.                                                                         $tmp = str_replace("Set-Cookie: ","",$value);' \. a& v8 O3 v$ K4 n3 y! |
  160.                                                                         $tmp = str_replace("Path=/","",$tmp);
    3 U9 @2 n. @. k0 p
  161.                                                                         $tmp = str_replace("Domain=.qq.com; ","",$tmp);
    1 `' z8 e' C4 H# `2 r* C1 d
  162.                                                                         $cookie.=$tmp;
      ?5 h# S* s! H( F( A
  163.                                                                 }
    7 x8 |, k0 ?; B* B: h4 H
  164.                                                         }
    ) p2 q4 z/ t  a5 T
  165.                                                         $cookie .="Domain=.qq.com;";* p  S8 `+ w, f) o! T
  166.                                                         $this->cookie = $cookie;
    / a) M  O8 F7 P0 I8 Z: q4 ~
  167.                                                         $this->saveCookie($this->_cookiename,$this->cookie);! o" }6 e0 h. ^* M. I
  168.                                                 }7 `! I% C# ^+ u5 e
  169.                                         }
    8 `& ?; \2 t  w
  170.                                         return $status;
    2 ?% x$ h3 B4 m/ @' F3 [3 s
  171.                                 }
    1 f, q6 v  n9 s0 O
  172.                         }
    # t/ ]! [( q* w. U
  173.                 return false;! \. r2 _$ A3 d" i. a- }$ d
  174.         }' z6 F8 c3 M% P' ?# P
  175.         
    8 z# w( d+ n! K- J$ i: f! y8 t
  176.         /**# O& `2 m7 F. ^( ?+ z: d
  177.          * 获取登陆的cookie  [( d! M$ M+ S
  178.          *; M2 ]4 f3 F0 Z9 }0 ?( w+ s" N, [
  179.          * @param bool $is_array 是否以数值方式返回,默认否,返回字符串
    + a: v' o. ~, n( ^* U
  180.          * @return string|array
    % s/ S) F6 v3 s; T4 H; n  e6 A+ q
  181.          */
    ) v+ l6 y' P. [
  182.         public function get_login_cookie($is_array = false){
    $ K/ g/ D! y+ y/ |
  183.                 if (!$is_array)        return $this->cookie;5 m. P# Z; l; T
  184.                 $c_arr = explode(';',$this->cookie);
    6 \# q9 N6 N) B( |
  185.                 $cookie = array();
    6 ]' t6 d& x4 A7 R, Z- V1 |7 d
  186.                 foreach($c_arr as $item) {
    # k2 M) h7 O* o
  187.                         $kitem = explode('=',trim($item));; i( }% O; s2 D
  188.                         if (count($kitem)>1) {
    1 ~4 q$ _7 H% Z  l9 u9 v3 D0 B5 b
  189.                                 $key = trim($kitem[0]);
    6 s( d7 J, K6 j! ^4 \9 Y$ j
  190.                                 $val = trim($kitem[1]);1 s- \; c) J' P( j) @. }
  191.                                 if (!empty($val)) $cookie[$key] = $val;
    # K% U) I9 ~2 R6 W
  192.                         }
    / [- q, V2 j( l  |) x# i
  193.                 }
    % z9 X3 Q6 I. g+ l7 n1 C, W
  194.                 return $cookie;
    8 J# m6 h( Z# i+ r3 P, ~+ E
  195.         }
    % e7 n8 X! ?2 m; l
  196.         
    $ |0 ?2 n1 j% @9 j+ C# G" t
  197.         /**9 z( p' ?) @0 f! q- Y$ v
  198.          *          授权登陆后获取用户登陆信息) H$ [# g5 u0 a/ m
  199.          */
    6 _- _* f; h# X* r  a2 E
  200.         public function get_login_info(){
    # K9 |$ l  O2 ~* J' _
  201.                 if (!$this->cookie) return false;9 E; e; g+ @7 b
  202.                 $t = time().strval(mt_rand(100,999));  \+ T% V8 _( {& j9 @+ D
  203.                 $send_snoopy = new Snoopy; . ?5 i+ r. n2 ^8 \
  204.                 $submit = 'https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxinit?r='.$t;0 c2 o9 k* v& Y+ a+ a0 O' g& `
  205.                 $send_snoopy->rawheaders['Cookie']= $this->cookie;6 {- E; z0 v* F
  206.                 $send_snoopy->referer = "https://wx.qq.com/";3 y2 y/ ^: h# S! ~
  207.                 $send_snoopy->submit($submit,array());  U% _! r- l! [7 G4 H4 i
  208.                 $this->log('login_info:'.$send_snoopy->results);- f$ @% v( g7 T, Q: @
  209.                 $result = json_decode($send_snoopy->results,true);. M9 M+ }# c  ^/ \5 y
  210.                 if ($result['BaseResponse']['Ret']<0) return false;7 `7 i1 A$ v1 Q2 K* @
  211.                 $this->_login_user = $result['User'];: y4 `+ y1 |: w
  212.                 return $result;
    9 Z% k) F+ n8 T* c/ f/ E! w: S
  213.         }
    3 o% V$ E% i8 D, ^# _
  214.         % h! @4 r+ Q6 ~7 w
  215.         /**
    - W' z  Y" v9 l$ g9 [5 {. D
  216.          *  获取头像2 @  D5 X; ]2 |% R/ S
  217.          *  @param string $url 传入从用户信息接口获取到的头像地址! o1 u8 u8 X. }5 T/ `
  218.          */
    : p/ g/ P# S5 H& _  P! |
  219.         public function get_avatar($url) {
      C, A2 b5 _. B8 D6 A0 z1 U  K) O% ?5 A
  220.                 if (!$this->cookie) return false;
    + h6 ]! t+ k) b  N  A
  221.                 if (strpos($url, 'http')===false) {
    0 A. Q2 i* Y2 I
  222.                         $url = 'http://wx.qq.com'.$url;
    7 d9 K' Z4 a' \& K6 e' a4 u  z
  223.                 }* N$ t  G! E! n9 h
  224.                 $send_snoopy = new Snoopy;
    5 _% r2 e% S8 d. d, S( t: g# A. n
  225.                 $send_snoopy->rawheaders['Cookie']= $this->cookie;* M: R$ {. u" c5 x+ o
  226.                 $send_snoopy->referer = "https://wx.qq.com/";
    ) H1 B; \- s* d3 K2 \" q! c
  227.                 $send_snoopy->fetch($url);& _4 O: m  m, y9 }* c' b3 \
  228.                 $result = $send_snoopy->results;
    2 B2 c. Z$ W; _( s9 v! c
  229.                 if ($result) + Y* `7 s  N# G6 }3 z( S
  230.                         return $result;
    1 n+ f8 M2 ~8 b' {& u4 |
  231.                 else0 R- u6 V; q- E  y$ v
  232.                         return false;
    5 o$ W% i7 D$ w7 R
  233.         }
    5 Q1 ?1 g. q% S! _( F
  234.         # W0 s" P( o3 U" U! J$ R! r9 T
  235.         /**8 [9 W4 i0 F9 G* m6 u- K8 e9 |# h0 N
  236.          * 登出当前登陆用户
    ' P0 k1 {: F/ }8 b9 I/ A0 C. m) C
  237.          */2 y) E+ N* M% m* _; h7 s1 E0 _
  238.         public function logout(){
    5 ]! T( Y: D" s  L& J: ?
  239.                 if (!$this->cookie) return false;
    0 ^1 w+ d1 o! M* v
  240.                 preg_match("/wxuin=(\w+);/",$this->cookie,$matches);
    2 ~% |' I; u8 `
  241.                 if (count($matches)>1) $uid = $matches[1];
    ; d: S0 r' G( @3 @( g
  242.                 preg_match("/wxsid=(\w+);/",$this->cookie,$matches);2 U, v" Y3 C: P6 ]* f
  243.                 if (count($matches)>1) $sid = $matches[1];, S% ^6 t0 }/ ~8 _9 Z
  244.                 $this->log('logout: uid='.$uid.';sid='.$sid);
    5 j( i- O/ s7 [
  245.                 $send_snoopy = new Snoopy;
    & L! u  j1 q2 P/ w: l7 y
  246.                 $submit = 'https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxlogout?redirect=1&type=1';+ D% F0 p" m+ t$ {0 ]1 `/ c
  247.                 $send_snoopy->rawheaders['Cookie']= $this->cookie;
    9 u" ~/ Y9 ?1 W! n
  248.                 $send_snoopy->referer = "https://wx.qq.com/";6 Q  t/ I' }6 [( p' V% D  e2 e  a
  249.                 $send_snoopy->submit($submit,array('uin'=>$uid,'sid'=>$sid));
    5 l) p; v6 y: ~$ U0 k, [
  250.                 $this->deleteCookie($this->_cookiename);, [8 V- P& S3 [
  251.                 return true;
    1 a3 R/ C% M8 t4 x) U
  252.         }
    8 p* w9 B8 H- c/ A. _& o
  253. }
复制代码

2 k; M7 l# R' w7 u$ I3 ^




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

使用道具 举报

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

支付宝扫一扫打赏

微信扫一扫打赏

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