微信扫描登录

[复制链接]
发表于 2014-2-2 21:55:19 | 显示全部楼层 |阅读模式
用户通过扫描网页提供的二维码实现登陆信息获取 0 m+ n' r. _$ ]$ F2 F4 v# e# b
  1. <?php& q' z" G7 Y, {5 q- w, l  N# {9 v
  2. /**' |% x4 z7 `% U& f1 s- F
  3. *  微信公众平台PHP-SDK
    2 t; n( V* x) _+ |4 |* W; {
  4. *  Wechatauth为非官方微信登陆API1 [4 Z5 H8 q2 G3 N( j* ]
  5. *  用户通过扫描网页提供的二维码实现登陆信息获取
    8 U0 p. Z" Y- r. ^1 g7 Y
  6. *  主要实现如下功能:$ j  G9 p$ ^5 D4 T! c
  7. *  get_login_code() 获取登陆授权码, 通过授权码才能获取二维码) I5 w6 f% O! q7 U
  8. *  get_code_image($code='') 将上面获取的授权码转换为图片二维码, e% @: N+ {2 S+ O# N/ }
  9. *  verify_code() 鉴定是否登陆成功,返回200为最终授权成功.% q1 T+ }7 K7 \
  10. *  get_login_cookie() 鉴定成功后调用此方法即可获取用户基本信息/ E% T! T! ?7 l4 a5 \- u
  11. *  sendNews($account,$title,$summary,$content,$pic,$srcurl='') 向一个微信账户发送图文信息
    7 w' X, b0 M3 A% L$ }+ ]! c
  12. *  get_avatar($url) 获取用户头像图片数据' q( R+ o# `* C5 Q/ \8 ^/ d
  13. *  @author dodge <dodgepudding@gmail.com>
    3 X% v) q3 V# X
  14. *  @link https://github.com/dodgepudding/wechat-php-sdk
    - P- N  E# R' i" t
  15. *  @version 1.1% G4 H* W3 U# f& [  Q
  16. *  + z/ C& K; A5 Z
  17. */5 ^3 r, k& {' ]4 |+ @  X
  18. include "snoopy.class.php";1 z7 U! p. P( |1 E4 Y
  19. class Wechatauth
    7 I9 q$ y, `& ]8 ~0 W. |+ h- H+ x
  20. {* y9 _+ u& @1 h, `: l: ?6 {" h' N
  21.         private $cookie;3 S# t; R6 O. r0 `# z- ^1 I( R
  22.         private $_cookiename;, c; \6 ?" O9 y$ q
  23.         private $_cookieexpired = 3600;* _. M4 W0 I2 ^+ ^, m- ~
  24.         private $_account = 'test';& y! t/ g7 c& h, J; y
  25.         private $_datapath = './data/cookie_';; b) s$ O( C. \- ]
  26.         private $debug;
    8 |" V1 R; n9 Z
  27.         private $_logcallback;
    * ~8 x! T* C9 l& A$ `0 v' z
  28.         public $login_user; //当前登陆用户, 调用get_login_info后获取
    ( _! d7 j: s) `0 I0 J
  29.         
    9 [- e* B1 X5 v
  30.         public function __construct($options)* G" K% X. c, t, H( I
  31.         {
    6 ?4 Y. O, r9 c( U6 K8 B
  32.                 $this->_account = isset($options['account'])?$options['account']:'';& I4 b% ], S2 y$ _' g1 x- q6 ^# Y4 a
  33.                 $this->_datapath = isset($options['datapath'])?$options['datapath']:$this->_datapath;. Z. \) r. t( H2 ]( |1 Q4 G% A0 ]* p
  34.                 $this->debug = isset($options['debug'])?$options['debug']:false;/ P: Y1 i4 v4 ?4 E7 F3 ?" z
  35.                 $this->_logcallback = isset($options['logcallback'])?$options['logcallback']:false;
    " U& T2 P) a) q
  36.                 $this->_cookiename = $this->_datapath.$this->_account;
    , X* v. b1 c8 q% d1 A
  37.                 $this->getCookie($this->_cookiename);: G# ?: j8 e7 g3 J, K1 |0 V8 u5 }7 U
  38.         }
    " B  f) _1 h2 `, T# o' `5 A: {
  39.         /**
    2 c, \$ v! b# o/ O: n* P  S5 z
  40.          * 把cookie写入缓存
    * k$ M: V3 S1 W9 q/ Y# V* G+ {& }/ |
  41.          * @param  string $filename 缓存文件名
    ( |% N; |* i. G" r' ?
  42.          * @param  string $content  文件内容+ p7 O0 P, S$ {! }8 q
  43.          * @return bool: b% X% o  p( I! T% U
  44.          */! a8 s" B" @, h. y; i
  45.         public function saveCookie($filename,$content){
    1 N! E7 O' R% u& n& V. [" K) o
  46.                 return file_put_contents($filename,$content);3 u( Y( {9 V$ v) K* p
  47.         }% S. P, N! R# b* `" [* J
  48. 9 P, \# _1 ~( I! [! B, G. x& z
  49.         /**% L! T# C$ Z4 `! c
  50.          * 读取cookie缓存内容( }2 d1 O2 u& }: L0 c
  51.          * @param  string $filename 缓存文件名
    ) }( J# H9 }. F! _1 g
  52.          * @return string cookie3 J" ]: i# B7 N9 [8 s' X" V% f
  53.          */
    9 q2 T# R% X4 _) M. w3 R
  54.         public function getCookie($filename){
    ! P5 O  \* v' Z) h$ p1 Y
  55.                 if (file_exists($filename)) {
    ( Q! \; v+ P9 z& T/ C
  56.                         $mtime = filemtime($filename);
    9 J& |! t) f$ E$ j5 C! _
  57.                         if ($mtime<time()-$this->_cookieexpired) return false;* C1 d" z0 U! H& Y) G
  58.                         $data = file_get_contents($filename);2 T/ r) `- R7 e: D( U
  59.                         if ($data) $this->cookie = $data;5 E! e( N3 K2 H% ^8 D+ {
  60.                 } , M& O; {# Z2 Z3 d2 W' L% f, I1 x
  61.                 return $this->cookie;
    8 c% f6 g: x$ ~7 w2 P; [
  62.         }3 k/ L) }9 H- F$ t  h/ }
  63.         8 W6 M0 I+ {' S) ?' O8 K9 m4 ~
  64.         /*/ C9 g$ }: Y' H4 `* @
  65.          * 删除cookie
    " j! |8 D2 L" W! ~( N/ i+ ^+ `% o
  66.          */
    . W) y  f2 E8 |1 I
  67.         public function deleteCookie($filename) {
    9 p% B& j1 {, }7 I/ `
  68.                 $this->cookie = '';
    & T3 n$ R  X- g- e& U, s4 d
  69.                 @unlink($filename);( P! r. ?9 B) y& W" ^
  70.                 return true;; k. T; T. d! ?" V- B4 P3 d4 m$ x) H
  71.         }
    9 s: W& v( U- l4 p, T* Z
  72.         
    $ a+ U4 e* l2 V
  73.         private function log($log){
    / V: b/ v% q2 q
  74.                 if ($this->debug && function_exists($this->_logcallback)) {+ j" }7 g/ U& b+ Q
  75.                         if (is_array($log)) $log = print_r($log,true);6 p- [2 b. s" L3 e1 P* p  J$ O
  76.                         return call_user_func($this->_logcallback,$log);
    / s4 w  L- `; Y9 z& m8 c: O& p9 w+ b6 {
  77.                 }& G3 ~2 q' A& I) ?
  78.         }
      u/ a9 K9 C& q9 Z" [; k/ H
  79.         
    # \* s, Y4 n0 ?& }! N" s/ Z& P) d5 H
  80.         /**
    6 v) ~/ L: S( t5 H4 e8 T. w" H
  81.          * 获取登陆二维码对应的授权码) N3 @9 ~3 N4 X
  82.          */
    5 ^7 q2 s* d* [5 q* {
  83.         public function get_login_code(){
    $ b: m4 s7 u' U7 w: P' ]
  84.                 if ($this->_logincode) return $this->_logincode;
    7 W' `  A. x' _/ r7 `& w& ~
  85.                 $t = time().strval(mt_rand(100,999));
    , O# ^6 Y3 l% T5 L5 x
  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;
    / e+ p, l, f# Z: e
  87.                 $send_snoopy = new Snoopy; ' Y: R- E- [. a" H; x" X
  88.                 $send_snoopy->fetch($codeurl);9 Y9 c7 W: `! T+ f6 E8 U
  89.                 $result = $send_snoopy->results;
    7 u+ D4 V8 V- {$ X
  90.                 if ($result) {
    ( w/ a. h6 c6 |6 O
  91.                         preg_match("/window.QRLogin.uuid\s+=\s+"([^"]+)"/",$result,$matches);
    , |& p) Q6 a  a' F
  92.                         if(count($matches)>1) {6 A7 H' ^3 x; _' O: K, N
  93.                                 $this->_logincode = $matches[1];7 q0 `+ Z6 |( i7 N' s3 J6 ~! Q
  94.                                 $_SESSION['login_step'] = 0;: B: k& @. Z. T2 P3 J
  95.                                 return $this->_logincode;" t2 C+ D0 ~7 o
  96.                         }& B& C4 Z2 Q3 H+ O0 D
  97.                 }- f: R2 ]4 D& m) e6 _- X7 V. C0 O
  98.                 return $result;
    " ^9 Q: ?4 B6 _( ^- a/ U% y
  99.         }0 b4 U+ s2 p- _# ~4 R" o
  100. & `  E9 S/ b4 b' @2 V  y* n7 ~
  101.         /**
    : T  |5 B* @  b
  102.          * 通过授权码获取对应的二维码图片地址) B' A& H; N* J4 y& [. v7 g
  103.          * @param string $code0 J0 S7 `2 u5 u" \1 H
  104.          * @return string image url
    ) U( O/ U7 T, d) o3 Q  j4 t) }
  105.          */
    ' c8 c* b2 u* F; ?0 c
  106.         public function get_code_image($code=''){
    * D0 ^! Q5 z7 {  r1 [+ _
  107.                 if ($code=='') $code = $this->_logincode;
    0 c& o! ]0 j& ~0 k* R8 k8 B) n
  108.                 if (!$code) return false;
    ( y6 Z  C. M* K( w/ X9 @
  109.                 return 'http://login.weixin.qq.com/qrcode/'.$this->_logincode.'?t=webwx';) N2 D9 W" \* m7 D; d* S+ g
  110.         }
    - L2 x- A  ~/ L% p
  111.         . c  j, L. y. N& o
  112.         /**
    5 Z8 w5 C/ X1 N- V1 Z
  113.          * 设置二维码对应的授权码, J% T! S* I+ A3 g. _$ T) Y
  114.          * @param string $code4 _3 A' p2 P2 B- E
  115.          * @return class $this1 @- ~; L% N1 X
  116.          */! w; \7 q6 z: x$ L" ^- Y9 \
  117.         public  function set_login_code($code) {
    7 W; g" S3 q( w
  118.                 $this->_logincode = $code;
    ; Q) @- \/ D# B) n+ r5 ]
  119.                 return $this;& R4 B  w& _& [. U2 _2 F$ X; m
  120.         }
    ' T0 I( G! E2 l. M9 k
  121.         
    * O7 k. R& S/ N
  122.         /**# X1 ^: p; P' q2 h' r
  123.          * 二维码登陆验证0 a2 b# G* W- [! _; T/ S
  124.          *$ M9 A3 m+ Q) [, d) I3 U
  125.          * @return status:8 s  U# _( L3 d. m3 n
  126.          * >=400: invaild code; 408: not auth and wait, 400,401: not valid or expired( \) [0 w4 j" w9 \
  127.          * 201: just scaned but not confirm
    9 C, T" S) e: u0 x; k3 }
  128.          * 200: confirm then you can get user info; Z, i& _0 m/ {- Z. e% h. f6 o4 ]
  129.          */
    % c- M* W+ k% u5 W" P" x1 X
  130.         public function verify_code() {1 Y# I; `! t! l7 ?" _, h" {, ?
  131.                 if (!$this->_logincode) return false;
    ' y, g# Y) A5 F, t! q( H. W; M* a
  132.                 $t = time().strval(mt_rand(100,999));' t- v  U: Q3 M4 P, L
  133. 6 d3 I$ w! A  s0 g2 O2 w! q
  134.                         $url = 'https://login.weixin.qq.com/cgi-bin/mmwebwx-bin/login?uuid='.$this->_logincode.'&tip=1&_='.$t;
    : K/ F8 ^0 |) H0 I# \. B) E
  135.                         $send_snoopy = new Snoopy; " ^7 z" g- d7 u+ {8 ?! y. v& C4 |2 R) a
  136.                         $send_snoopy->referer = "https://wx.qq.com/";: _9 a9 h% W4 u; X# k/ G
  137.                         $send_snoopy->fetch($url);6 m& R: Q% y9 m2 c
  138.                         $result = $send_snoopy->results;
      @4 B! J& P  p$ x
  139.                         $this->log('step1:'.$result);
    / X( x5 v, b! d  |4 w- s8 x6 T4 m
  140.                         if ($result) {! C0 j0 j5 ~* _' g, s' e1 I8 C
  141.                                 preg_match("/window\.code=(\d+)/",$result,$matches);$ }& U3 ?3 Q! [7 i5 E. }# I
  142.                                 if(count($matches)>1) {
    0 U0 c0 p" d. n+ h3 O
  143.                                         $status = intval($matches[1]);2 f2 G) i) l( }
  144.                                         if ($status==201) $_SESSION['login_step'] = 1;
    : k1 Z1 z3 U7 A2 }
  145.                                         if ($status==200) {
    3 {- {) L1 W- U9 a% Q4 q$ w
  146.                                                 preg_match("/ticket=([0-9a-z-_]+)&lang=zh_CN&scan=(\d+)/",$result,$matches);9 p' R/ E; V2 \2 p* K- X
  147.                                                 $this->log('step2:'.print_r($matches,true));0 _, g% u5 \# L1 Y6 ?8 u
  148.                                                 if (count($matches)>1) {" }' z1 y/ J( N& ^
  149.                                                         $ticket = $matches[1];& O9 W2 l* m' |  X. I' J: v" J& ^
  150.                                                         $scan = $matches[2];0 T) Y& [* P& X6 o" Z0 }
  151.                                                         $loginurl = 'https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxnewloginpage?ticket='.$ticket.'&lang=zh_CN&scan='.$scan.'&fun=new';
    9 D( n  ?+ I. |% N  P
  152.                                                         $send_snoopy = new Snoopy;
    8 N7 R8 i  D; ?1 V: q6 w0 P
  153.                                                         $send_snoopy->referer = "https://wx.qq.com/";5 b. [; a  ~: S8 {/ K5 K  q7 x5 E0 G% z+ v
  154.                                                         $send_snoopy->fetch($loginurl);
    3 O: m4 H: u2 r7 A. Z* l
  155.                                                         $this->log('step3:'.print_r($send_snoopy->headers,true));
    - }% L2 x8 t$ Z2 h) W( u( I
  156.                                                         foreach ($send_snoopy->headers as $key => $value) {( m. k( e6 X) B, A6 `
  157.                                                                 $value = trim($value);
    , M4 B& g% [8 o9 K2 S. V  ?$ G! p
  158.                                                                 if(strpos($value,'Set-Cookie: ') !== false){
    9 o4 l4 L; R4 f) p: W
  159.                                                                         $tmp = str_replace("Set-Cookie: ","",$value);* o' n2 r* y+ |1 s! R9 W6 p
  160.                                                                         $tmp = str_replace("Path=/","",$tmp);
    + U( v& ~9 p' C  M  @
  161.                                                                         $tmp = str_replace("Domain=.qq.com; ","",$tmp);
    1 ]3 K0 W. V/ w, \2 N- m
  162.                                                                         $cookie.=$tmp;: i+ ^+ d, X& k0 X2 U9 `
  163.                                                                 }2 N+ f1 [) [. ], q( ~, \
  164.                                                         }
    ; a  l! J1 v8 `4 F' a
  165.                                                         $cookie .="Domain=.qq.com;";8 }$ o0 m4 r$ ~# ~) R9 L
  166.                                                         $this->cookie = $cookie;% K% G: y- w6 c  ~0 y
  167.                                                         $this->saveCookie($this->_cookiename,$this->cookie);' `1 a  {  O4 l* ?/ t3 j
  168.                                                 }
    2 L0 v9 W: M# L
  169.                                         }
    : u* I# y/ ~8 b& r# b4 B8 A
  170.                                         return $status;
    5 v9 b% K- ~4 S! l' k
  171.                                 }
    4 l! s$ d" G: v+ p% t( S
  172.                         }' d3 @5 D4 J. I2 W; s: h
  173.                 return false;+ S0 N* \  ]3 s! b; ~6 l5 |
  174.         }
    - E. C0 C& _% G. Q
  175.         8 a4 V  {6 K9 p8 a
  176.         /**/ F) @( _. v; A; e( ~4 M3 p
  177.          * 获取登陆的cookie% n: [" t0 J( ^$ r
  178.          *3 ?8 S# a9 V" l3 U
  179.          * @param bool $is_array 是否以数值方式返回,默认否,返回字符串
    4 f5 b2 u4 ?7 g! s: k: X
  180.          * @return string|array4 y: V7 d' T8 M/ P
  181.          */8 [& j2 ]9 M8 C5 l. r* O+ A" w
  182.         public function get_login_cookie($is_array = false){
    # \8 l; U& [) @9 M" |. x9 ?
  183.                 if (!$is_array)        return $this->cookie;
    / `+ U+ m6 F3 g+ ~7 Z. s( D
  184.                 $c_arr = explode(';',$this->cookie);
    : B( P* ]" s! g1 X
  185.                 $cookie = array();
      a5 J. L1 ~" W7 f2 N& k
  186.                 foreach($c_arr as $item) {
    1 [, ~' M/ n% [: r, d% l5 B/ }
  187.                         $kitem = explode('=',trim($item));
    . S5 }2 \$ ~! V$ q* t5 D5 g8 i
  188.                         if (count($kitem)>1) {& f0 T. V+ {  H8 `% \3 N6 L' e
  189.                                 $key = trim($kitem[0]);
    4 B# C2 U( d/ }
  190.                                 $val = trim($kitem[1]);
    ( }$ b+ r6 Q4 T1 V
  191.                                 if (!empty($val)) $cookie[$key] = $val;
    1 U) _: f% ^' t6 Q; j/ @
  192.                         }
    5 {- \( G8 e3 q8 E* J5 c+ j# k
  193.                 }
    2 `5 W4 d4 Q& ?' z
  194.                 return $cookie;
    $ T; A; d  F2 |, N0 D! y; k
  195.         }8 b2 O/ ~8 G( S% z. }$ n
  196.         $ }) |9 F- s# }% i9 H
  197.         /**
    , |* i& }5 ~& m- C- W0 c, w
  198.          *          授权登陆后获取用户登陆信息
    " J  e% k: K! x) B$ z+ y
  199.          */+ C: k; @7 x+ w) i
  200.         public function get_login_info(){; U; P' z& C; p) ]; c5 Q
  201.                 if (!$this->cookie) return false;
    : w3 q0 L- M) S
  202.                 $t = time().strval(mt_rand(100,999));' L: G! U3 W( r  u
  203.                 $send_snoopy = new Snoopy; - C7 X$ I# s* V* T
  204.                 $submit = 'https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxinit?r='.$t;
    , h3 H- V) y; G' C
  205.                 $send_snoopy->rawheaders['Cookie']= $this->cookie;) g# Z' T" |# a/ X' L& C
  206.                 $send_snoopy->referer = "https://wx.qq.com/";
    * l' B9 F/ s9 P+ m' H" h
  207.                 $send_snoopy->submit($submit,array());+ u( R- H7 M+ a( U3 ?& c! A2 O
  208.                 $this->log('login_info:'.$send_snoopy->results);# y0 j, Y' k- C# q$ Q
  209.                 $result = json_decode($send_snoopy->results,true);
    9 U0 Z. N; r' k# j
  210.                 if ($result['BaseResponse']['Ret']<0) return false;
    7 M% o, ?: U: f: l! f* @7 B
  211.                 $this->_login_user = $result['User'];
    + J+ j% y) {( q; N5 q& F
  212.                 return $result;
    # T2 N$ J0 b$ O! X2 B) a
  213.         }
    / a( i+ k8 _; O; y
  214.         # Y7 B! T% D+ X
  215.         /**
    ) b- ]% W$ |. a6 x
  216.          *  获取头像
    3 }. q  [' u  D) U
  217.          *  @param string $url 传入从用户信息接口获取到的头像地址
    7 o8 z4 H3 O- S! Q. T! S) ~" m: g, Z  b
  218.          */
    " {, W/ V# q* M4 F
  219.         public function get_avatar($url) {
    . S/ W5 M! j/ r7 \, w0 P3 j! {
  220.                 if (!$this->cookie) return false;5 P2 ]) o3 Y+ R" H4 j+ i
  221.                 if (strpos($url, 'http')===false) {
    ; P3 _3 U! G* J3 K, L/ Y
  222.                         $url = 'http://wx.qq.com'.$url;6 l7 S- v. V& [6 t9 C" ~% d
  223.                 }+ k' V/ c5 R; b' s
  224.                 $send_snoopy = new Snoopy;
    + j: D$ C4 ^. R+ |( r% n& V
  225.                 $send_snoopy->rawheaders['Cookie']= $this->cookie;
    ( w$ v5 r' i* ^% b4 R
  226.                 $send_snoopy->referer = "https://wx.qq.com/";- z* l+ |+ U. N& p
  227.                 $send_snoopy->fetch($url);
    5 H& x) w, y" d3 ]' e
  228.                 $result = $send_snoopy->results;
    % R) m5 ?: z9 ?7 ]6 _2 k+ {
  229.                 if ($result)
    2 A; n! @7 L7 L# K5 H: {1 V) Z
  230.                         return $result;
    % f! U' }) t. l# N7 h* i* G4 S
  231.                 else
    ! r8 V3 [# g0 @4 h
  232.                         return false;% o9 a8 m" Y' Z+ r0 f. p: P
  233.         }: e0 m  Q& G) N1 H6 g3 J
  234.         , c( G  u; z1 b5 t8 b7 Y! ?" J
  235.         /**
    ( v3 V( u, d1 B
  236.          * 登出当前登陆用户' P7 v4 [- ?4 B, n0 w% L  c3 _! ^6 |8 q
  237.          */
    & J' w, K; s& k8 N7 [
  238.         public function logout(){+ n; d! P% Z+ Z, _1 m* Y- M
  239.                 if (!$this->cookie) return false;* @! }" L: c: ?  B; h+ j4 F! H; t
  240.                 preg_match("/wxuin=(\w+);/",$this->cookie,$matches);" o6 ?/ ^5 y# D0 S; t& i" ~
  241.                 if (count($matches)>1) $uid = $matches[1];2 A: i; A3 ?9 p
  242.                 preg_match("/wxsid=(\w+);/",$this->cookie,$matches);! c1 f( J. ]2 `8 c* E
  243.                 if (count($matches)>1) $sid = $matches[1];
    & V! Q7 L: \% [1 d4 _
  244.                 $this->log('logout: uid='.$uid.';sid='.$sid);9 T! r0 d+ f# N6 _
  245.                 $send_snoopy = new Snoopy;
    5 U# I9 p- R3 z8 k% `8 p
  246.                 $submit = 'https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxlogout?redirect=1&type=1';  V, U$ a8 A6 F# e
  247.                 $send_snoopy->rawheaders['Cookie']= $this->cookie;
    8 v5 ]6 \9 N: e8 x/ }9 a3 L
  248.                 $send_snoopy->referer = "https://wx.qq.com/";& e4 z4 q& m4 S/ M) E- C
  249.                 $send_snoopy->submit($submit,array('uin'=>$uid,'sid'=>$sid));
    & F7 h% O4 h2 x* n: Z1 L3 x" U" H1 ]
  250.                 $this->deleteCookie($this->_cookiename);
    5 M5 h( o( ?/ \/ o
  251.                 return true;4 [) J+ U* Y: x+ ^
  252.         }1 ]" T9 |/ n/ W$ Y2 Y; y- g
  253. }
复制代码
% X2 Y2 S9 ]! `" x0 ?$ |2 s7 b5 X




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

使用道具 举报

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

支付宝扫一扫打赏

微信扫一扫打赏

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