适用版本: phpwind8.0
" V3 N7 x' w4 q) S/ e语言编码: GBK简体 UTF8简体
( p8 m) k( \2 ^ {# S8 r! O2 l发现很多朋友操作不成功基本都是因为与UCenter的通信不成功,所以请先确保UCenter与PW的 api/uc.php 通信成功,再按我的教程操作,否则无效。
6 v8 Z/ `4 l& X! K9 G9 W7 F8 |! f) F2 v. _
昨天推出巧《用PW8的接口整合UCenter》教程后,引起了很多朋友的关注与支持,有的朋友按照教程实现了PW与UCenter的整合,但还有大部分朋友不太明白。比如:
5 e0 l" R0 `: `7 A! R% [ `# X5 C
有很多朋友问我如何做到PW目录下的api/uc.php 与 UCenter保持通信成功?1 i7 I! {! d- }$ i
还有的朋友说希望能给下uc.php的完整代码。& U3 ]" c A# E2 v6 Y
5 X; C* t7 F5 s" K$ E插件在附件中,下面是教学部分
3 x0 b- D/ x4 k3 r* X; I/ d7 d! X* h5 o5 C5 O8 T6 N
下面,我们就来进行实例操作。6 o/ A9 h0 {! f, ~, l( M8 n# K
+ h- e: I7 s. |% ~( m, t6 t1 J+ s
首先上传uc_client 文件夹到PW的根目录,你可能要问PW目录下不是有一个uc_client么?我要说的是,直接删除掉,那个没用。uc_client 文件夹在UCenter安装包里可以找到,这里就不再赘述。
) I2 Y6 {* t0 ]) G; J0 S
& J) b* C/ k4 v8 Z% u复制以下代码并修改相关参数:
! Y5 ~ b: c; A! _- t- <?php% H9 r3 M# W1 s# j( l
- define('UC_DIR','../uc_client');* u1 z6 Z( I3 }- g
. C- E9 [4 L. w( {- /*
/ o9 Y7 D6 i3 v3 Q. ?" Z- S - ** BEGIN 通信相关 by phpfor.com0 s! j) E! V% n% C
- ** 以下代码直接到UCenter后台相关应用里复制过来替换掉。不明白?没关系,往下面看 UCenter与PW通信具体步骤
6 H- w ~9 G8 N% a7 E4 F3 A7 | - */, ~" r6 S2 H0 @4 z# d
- define('UC_CONNECT', '');9 V9 A0 b# ~5 v& \6 Y
- define('UC_DBHOST', '');
5 v8 ]: a0 c% S$ C# D/ | - define('UC_DBUSER', '');- D! Z" c6 {. r7 P( z
- define('UC_DBPW', '');
3 ^( `9 @1 v* I( M& e C - define('UC_DBNAME', '');
* I$ T0 w5 F2 R8 J- @ - define('UC_DBCHARSET', 'utf8');8 Z' r/ w2 A+ o1 m
- define('UC_DBTABLEPRE', '');
( G0 `1 [$ Q( @% A7 t - define('UC_DBCONNECT', '0');
; J& |- Q; j/ N0 ^/ \" V1 [) T - define('UC_KEY', ''); //这里与PW后台的保持一致! S G# y5 }0 ~3 H9 p+ V
- define('UC_API', '');0 @( n: }% A: G2 r
- define('UC_CHARSET', 'utf-8');
8 Z/ A# J/ T+ r( u+ w - define('UC_IP', '');
: `. n- _& M' d; d% W - define('UC_APPID', '');8 P* F" x4 {/ t3 ?6 t8 M# M) @
- define('UC_PPP', '');$ u! _+ D) M; E7 [& }
- /*
5 G \( _7 D, j4 X' N - ** END
+ h% f. S2 ?+ u1 f) W. x - */2 o u0 ~: z! |. x! E, y9 P
- # n! s# }( R) R5 {6 `7 q- W
- define('PW_URL', '您的PW论坛地址'); // 后缀不要带 / 如:http://bbs.phpfor.com6 S+ \& f, c7 M9 p, G' A1 U
- define('API_RETURN_SUCCEED', '1');
7 M; \' ~- M% D! i9 ]6 f - define('API_RETURN_FAILED', '-1');9 h, y# S5 ]2 o9 I; `
- 8 u! R) C) n# }
- $code = $_GET['code'];& j' r& p7 u, S
- if($code && include(UC_DIR.'/client.php')){
# B) e& I7 f# t, \, Y$ g# T0 w - $get = array();" V& l8 r2 g1 g; O( Q6 G
- parse_str(uc_authcode($code, 'DECODE', UC_KEY), $get);
% G9 i% c: r o$ u$ m6 O2 x& ] - if(empty($get)) {+ s# @% o [* D$ U y# H/ J
- exit('Invalid Request');
. m) D6 w+ h" l - }
9 d/ ^0 W! u( h2 ` - if(time() - $get['time'] > 3600) {- @# ~6 J) k5 d# s
- exit('Authracation has expiried');+ E: U! M4 ?# J9 U
- }8 a: u/ j. T# V8 ?* _ S
- $action = $get['action'];
: Q6 e i0 |3 c; e - $uc_note = new uc_note();
5 m* k6 O$ [6 ?/ x7 Q" a/ i - if(method_exists($uc_note,$action)){9 G Y/ r8 C6 q
- $uc_note->$action($get);+ Y8 `3 f3 Y, J# |( V6 M! |2 K
- }else{6 t/ u+ b1 W0 v- T
- exit(API_RETURN_FAILED);
9 q' A1 v1 n9 r' m- D ~7 p9 x2 k2 L - }
0 r; [! J g$ ]$ l7 E6 s- W - }
9 B' c9 |5 I& T: e" k
" T9 V% N0 s( {. H- Z# z1 `$ C, p( }
: O* }1 O" |3 h4 F( Y- class uc_note{$ M7 I1 y9 |3 {% A4 p1 R
2 s1 q. z' {, J' o6 g: Y- function synlogin($get) {. n7 A0 Q$ O0 M1 k, Q& w/ q. P
- $userdb = array( $ b7 \4 u' z* O8 e2 n5 _
- 'username' => $get['username'],( d- ?0 J8 q, X& Q f+ ~4 F
- 'password' => $get['password'], : Z% Y* M$ |; K/ r" J) y7 f( j
- 'email' => $get['email'],- X7 Y8 s2 P) f" v0 R
- 'time' => time(),
* V% ]: c1 t. x# i7 \/ ]) Q; @. ^- ? - );
3 v% \. C8 F* F+ v) x+ @ - $this->passport('login',$userdb);7 @. @( o8 B( N( Q% x# z
- }+ s I$ t# u' ]3 D' L; e, q
% ^2 B6 q y3 c8 j) d- function synlogout($get){
$ }& O% y- Z' F8 z# I C - $this->passport('quit','');. R: A3 ~+ Z3 W! {
- }
2 T7 A( l( z' p0 `2 c* b8 `* d
( ]8 ~9 p9 w; T( s- n }2 a% A- function passport($action,$userdb,$forward = ''){
- a7 n* Q* ]5 E0 E9 G3 V - if($action == 'login'){
* t; a6 ^' h% D# H - foreach($userdb as $key=>$val){
! s8 K' h( o* B0 W; C' J' N - $userdb_encode .= $userdb_encode ? "&$key=$val" : "$key=$val";
+ r: R% {0 d( b; e4 y2 K$ n - }& b- X0 K( P- Y) U
- }
. J7 g! V: E0 M) \- r0 A0 K: r4 d. ` - $userdb_encode = str_replace('=','',$this->strCode($userdb_encode));
, Q8 H$ o$ L( L0 ~9 }" q* y K - $verify = md5($action.$userdb_encode.$forward.UC_KEY);
8 B( R E2 L& c* j1 { - header('Location: '.PW_URL.'/passport_client.php?action='.$action.'&userdb='.rawurlencode2 m9 l8 `* Z9 q5 H; \- ], L
- ($userdb_encode).'&forward='.rawurlencode($forward).'&verify='.$verify);0 D) K1 x: s; I0 N
- exit;! J+ X6 l- t4 K
- }
8 w2 _- A G! }, b - - W- V* w# r& R* _% l6 h: Y
- function strCode($string,$action='ENCODE'){8 F& A4 ?' E) ?
- $action != 'ENCODE' && $string = base64_decode($string);
/ E" _9 v0 {0 M; y& ` - $code = '';
) G5 E" `2 P( ^- y! x8 m - $key = substr(md5($_SERVER["HTTP_USER_AGENT"].UC_KEY),8,18);
2 v* r' N! H- V/ |, p' x - $keylen = strlen($key); $strlen = strlen($string);) p I( C- _9 K) g$ r- O
- for ($i=0;$i<$strlen;$i++) {0 {3 q$ {- q8 C& J) a- C z% _
- $k = $i % $keylen;
0 D5 O# I* Q; l- {1 g - $code .= $string[$i] ^ $key[$k];3 |7 h b2 T7 y5 D2 {! Z
- }* } M. s" m2 U; g/ N! @' D1 u
- return ($action!='DECODE' ? base64_encode($code) : $code);+ q' k" ^4 u. i$ t* S& h# ^7 \
- }
/ n2 T: m$ i2 t0 Y# ^8 r* c# y - : N% H+ j+ j- i, i! ^
! Y1 q# k9 p6 j- function test($get){
1 b/ ?1 Z9 K3 x J1 _: ]7 M - exit(API_RETURN_SUCCEED);
# t+ ^" a4 }3 m) O0 Y7 J+ _ - }
& ^) i3 O9 _& U3 J2 t0 L, P* [/ Y - }
3 [7 z A7 v* v: n h
5 X; D+ B: r. ^& \) k( \
( |: e3 B O/ |9 n5 z- 7 \8 E: X" W9 T v: k% U+ ]$ L+ ^
- ?>
复制代码 UCenter与PW通信具体步骤 A, b) V8 R$ ~/ [' G( P+ T
1 F3 C- G) ~1 R" q* C! v2 q
1.UCenter配置1 G8 F5 x! J- T- h
进UCenter后台->应用管理->添加新应用->自定义安装
2 T1 L# y/ \7 Y `6 u8 F应用名称:PW论坛
& U# h, c) W) I7 b4 J c应用URL:PW论坛地址
% x* I0 x( n6 N0 _' j. g通信密钥:与PW后台 第三方整合的密钥一致4 C: E0 Q7 T; I, J4 @; `1 U. O
应用类型:其他
7 A& F6 J( j. o0 V! J/ L是否开启同步登录:是. u8 X; W* I7 |# A( W
是否接受通知:是* T/ j- z/ j* ? z) H
+ U# q$ f- R v6 R7 _3 a/ C" T
然后提交,成功后复制 应用的 UCenter 配置信息:
9 x/ F( R! q& c, `! c7 E% A里面的内容 替换以上配置信息。0 ~8 l+ A2 O7 a b: \
m: J4 ?+ n# U2 e Q
2.PW配置
$ r* \. O i* H# a; }) o进后台->应用中心->插件管理->通行证& p( f% n% @& s3 f- }# ]
- L% Q8 C6 ]7 T: x. J+ \) a, z
通行证:开启( Z0 n# V6 c k3 }9 f! @/ B
通行证私有密钥:填UC里设置的密钥) Y, q# T9 a# I2 X. I( m) h+ |
将本系统作为:客户端9 v# J! _+ A p3 W) r, Q
3 ^( |0 G' r- i0 o
//UC其他应用的地址都行,只要能同步登录退出。
5 x/ E: K) X0 i5 F* x9 ]通行证服务器地址:% x" X& E$ Y: u' C. u8 P0 `6 ?, m
通行证登录地址:
3 G2 T" h0 a J e$ i通行证退出地址:
/ y8 ?1 A+ e7 v$ R通行证注册地址:
7 }' j+ E% V/ y: a( o8 X
" V6 i4 U$ r$ ?7 ~. F此时再看应用:通信成功!
# k; _! q( a8 m! e
4 K( y) s4 C" U( L
- K' t3 T' y- h& o9 h |