适用版本: phpwind8.0
& i# |" x9 R0 B& t5 [) [语言编码: GBK简体 UTF8简体
0 O6 C. \ p. D; U发现很多朋友操作不成功基本都是因为与UCenter的通信不成功,所以请先确保UCenter与PW的 api/uc.php 通信成功,再按我的教程操作,否则无效。
$ A. n& C: T& r& ]4 ]' v. r5 a' u2 b2 `; j0 W/ x. K" l
昨天推出巧《用PW8的接口整合UCenter》教程后,引起了很多朋友的关注与支持,有的朋友按照教程实现了PW与UCenter的整合,但还有大部分朋友不太明白。比如:3 [ ^9 }' |" ?# B4 v
) g/ Z8 t# {& N5 W4 t! A8 x* e6 X有很多朋友问我如何做到PW目录下的api/uc.php 与 UCenter保持通信成功?9 E% h& B' k" y0 U+ f
还有的朋友说希望能给下uc.php的完整代码。
" J. P5 e3 H' L" ?6 o! A- z, R3 x, ]; m& b, X
插件在附件中,下面是教学部分7 K, Y8 V: F; D F7 P2 n' i) p
6 c3 U7 T0 E/ v8 x( X3 t# T7 H下面,我们就来进行实例操作。3 g8 g6 Q6 A ?+ a! c% U
1 `9 [! W" S# e n首先上传uc_client 文件夹到PW的根目录,你可能要问PW目录下不是有一个uc_client么?我要说的是,直接删除掉,那个没用。uc_client 文件夹在UCenter安装包里可以找到,这里就不再赘述。 c$ ^" g, h! Q3 o& P7 [& c
* |; v8 x9 X& n+ v: ?0 D6 W复制以下代码并修改相关参数:
# l+ k% r: W+ L/ y/ S2 Q. v- <?php6 T1 k! f+ n. ^
- define('UC_DIR','../uc_client');
0 U9 M& d! E8 D - 8 V* B6 A% Q \4 [& C: A4 D
- /*3 A4 a% B9 T9 w+ v5 w1 L
- ** BEGIN 通信相关 by phpfor.com
% e$ J# m3 e8 Q* y - ** 以下代码直接到UCenter后台相关应用里复制过来替换掉。不明白?没关系,往下面看 UCenter与PW通信具体步骤
9 s, a; U- H: r* n& l& S# W! \- | - */" m5 q1 N9 W4 y+ @7 O/ |
- define('UC_CONNECT', '');0 c+ o2 t; R. |# M
- define('UC_DBHOST', '');
6 u8 P$ n8 c" y4 j; Z - define('UC_DBUSER', '');- U1 l7 }1 ?7 L4 _7 r
- define('UC_DBPW', '');
( ^5 B; M- O2 t( i - define('UC_DBNAME', '');+ {+ m( J' z0 }* @7 B( g
- define('UC_DBCHARSET', 'utf8');( j! R- m# W$ M
- define('UC_DBTABLEPRE', '');6 g8 y5 E5 g% A; K
- define('UC_DBCONNECT', '0');
9 L: @% y! ]2 A. R% F1 @ - define('UC_KEY', ''); //这里与PW后台的保持一致
2 H( t( g# K! z2 s7 v: A3 L' c - define('UC_API', '');
* |1 [% S, `8 ~ - define('UC_CHARSET', 'utf-8');
8 W" B& u E0 m. m - define('UC_IP', '');
$ j' ]6 x# B+ Q* ]9 x* p - define('UC_APPID', '');
. x; H+ D, Q4 F0 r( E5 i0 o% \ - define('UC_PPP', '');
$ u- C+ B7 Q. S, v$ e8 ] - /* S D* `' x& z5 P
- ** END
+ R' ?4 J2 K8 y4 C* G O$ X - */: P' h+ d$ ^6 p2 i* E
- " A# w4 e5 F7 y
- define('PW_URL', '您的PW论坛地址'); // 后缀不要带 / 如:http://bbs.phpfor.com& D9 y5 v- R' Q0 o" u a. B8 d6 |
- define('API_RETURN_SUCCEED', '1');6 O- ?4 N7 N. b5 ?4 a
- define('API_RETURN_FAILED', '-1');' Z# A4 y( K. y3 k
- 3 ?: s7 _% ~1 w9 z% g8 g
- $code = $_GET['code'];+ N- \, r) u. ^
- if($code && include(UC_DIR.'/client.php')){
) ]( A, P6 w. K; ` - $get = array();; Q/ j0 D; @6 k; Q
- parse_str(uc_authcode($code, 'DECODE', UC_KEY), $get);
2 Q1 s3 `3 k0 V8 ^8 g - if(empty($get)) {
3 r$ y1 O! k* K2 D) A5 W - exit('Invalid Request');
- g7 o" l( x" ?8 Z1 Z7 |0 D- x - }
. \- z, b @' d$ ~ - if(time() - $get['time'] > 3600) {
3 o- q3 A, S. ~6 I6 c8 I - exit('Authracation has expiried');0 x( ^% J0 o8 _" ^
- }- n' b7 y+ C. S" g1 Z) C% S* B- y
- $action = $get['action'];
1 f/ X+ c7 P3 v - $uc_note = new uc_note();0 C: o1 [2 @% b! n- S L. {& v) U
- if(method_exists($uc_note,$action)){5 N& e6 `9 H5 _9 L# J* }& B" [) H! x/ w
- $uc_note->$action($get);0 X' Q- o9 Q3 ~' j/ [# y7 D
- }else{& M2 O) q( D; Q/ t: k* }+ C. R
- exit(API_RETURN_FAILED);: Q* b# @8 v; J' z) E0 f
- }
$ w. h3 t: K1 ~) c: G - }' @# ^, P( p: }: X" ~% l
2 l$ B @9 L" T) N
4 r7 W( U% j6 L/ C8 z- ; T5 _0 L1 x( d' B/ L
- class uc_note{ ~/ {% i3 K- w: t# c
" Y1 |3 N) `% y$ k1 h- function synlogin($get) {/ C3 X M6 {! }% q$ K6 P
- $userdb = array(
+ [6 r* e6 U; t8 i" R* ?3 w J - 'username' => $get['username'],
# u& l* e. z- L0 ?8 C1 H$ T - 'password' => $get['password'],
1 }( t% [* q! t( d: T - 'email' => $get['email'],
* p: ^$ x7 L$ A6 q3 C - 'time' => time(),
: K. q/ H5 z& X - );7 F0 w. L( R$ G
- $this->passport('login',$userdb);8 O9 l1 u# L0 U* y' `
- }
6 x7 C* Z, \' d4 x9 P' c
' N( f/ H `/ |8 x$ E+ Z m- function synlogout($get){
3 F; K* ^1 r* c8 _" K" a - $this->passport('quit','');
4 F/ d3 Q b! c- m' J - }
1 B* ^! R O. t
0 F# S9 k: D" u z' O! v5 H- function passport($action,$userdb,$forward = ''){
, | ~/ C" ~9 w% g" H8 L5 y% d( ]/ u - if($action == 'login'){
" J: C. }* f( \; Z& M. ~8 p: V. \ - foreach($userdb as $key=>$val){
% b M; d$ R6 q7 q$ n - $userdb_encode .= $userdb_encode ? "&$key=$val" : "$key=$val";
- c/ ?) F& g8 x3 ]- T2 A - }
" V4 U. U1 A) Q# Z9 O. Z - }
+ L {& A. B, o/ T. x - $userdb_encode = str_replace('=','',$this->strCode($userdb_encode));! g( u* R2 A1 Y' |
- $verify = md5($action.$userdb_encode.$forward.UC_KEY);
6 ]0 H) q$ R. l8 E! Z - header('Location: '.PW_URL.'/passport_client.php?action='.$action.'&userdb='.rawurlencode
/ N6 L) [ p7 R - ($userdb_encode).'&forward='.rawurlencode($forward).'&verify='.$verify);: s8 }% b: x" _. p
- exit;
: w a, ]" O2 `2 d2 \+ k. Y3 S j - }
1 D. v, Y. h: l. f2 F$ d& x; ~
/ V4 z- h* O+ b. G4 x- function strCode($string,$action='ENCODE'){$ W4 t" I- F* A3 Y9 I/ G; ]
- $action != 'ENCODE' && $string = base64_decode($string);% V# V" P5 z+ ~2 N
- $code = '';: |$ U, y$ g6 Z; |
- $key = substr(md5($_SERVER["HTTP_USER_AGENT"].UC_KEY),8,18);7 Y a1 A4 [# \. J
- $keylen = strlen($key); $strlen = strlen($string);2 g: u* k, m" U: s/ i0 e. E$ Q
- for ($i=0;$i<$strlen;$i++) {8 E! F. o/ s% H: W- ^
- $k = $i % $keylen;" H* f- ^; d0 i6 E' k8 M$ F
- $code .= $string[$i] ^ $key[$k];7 q$ x* Q% z' J6 B9 D* m2 c$ K
- } F# T0 r) o) n/ B' K+ S
- return ($action!='DECODE' ? base64_encode($code) : $code);
) c$ e z/ L* l1 O2 { - }
* ^ e/ e. c* U' b( _, N. `- S2 b
% v1 ?+ G& m; U O9 D, z9 K
$ K4 s! p) M1 J- function test($get){
( _# n9 u: a& r: \2 s - exit(API_RETURN_SUCCEED);
3 w7 v2 Q) e. O7 v - }! {% b; K) b% u
- }1 z" v, U8 z0 W" r
- 4 t' M3 o1 f* U. q
- 5 l r8 k' f S- @
$ U5 |' I p- R& F" G/ Z4 b- ?>
复制代码 UCenter与PW通信具体步骤2 `3 q' g2 ^; V9 i/ v$ _
3 ]1 m5 P( }/ Z C
1.UCenter配置1 P }8 A; y( K( @! K
进UCenter后台->应用管理->添加新应用->自定义安装
" ^& w; {, Q$ F应用名称:PW论坛
: U- C$ K' l' T# h3 Q应用URL:PW论坛地址/ o; Q8 C0 a; P4 z
通信密钥:与PW后台 第三方整合的密钥一致- j( }8 I8 H5 `. g1 i" h2 {1 X& g
应用类型:其他) C: V) t1 Y5 q) G+ N& K
是否开启同步登录:是
' u& f2 V d4 n是否接受通知:是
% ~% x, H4 N9 u4 s9 Y( H1 T" ]# [$ H
v' e: f* L% s2 a然后提交,成功后复制 应用的 UCenter 配置信息:
, ~2 s: E/ F! L {- B里面的内容 替换以上配置信息。
, E7 C7 V! } u, u! z8 [6 i) j6 w& {. U0 M( r$ ?6 u5 i* v
2.PW配置6 O, {$ F& L# X# ]4 T
进后台->应用中心->插件管理->通行证
+ B- T0 | D/ o2 n9 ], U2 {2 }5 C9 K' Z' D7 S
通行证:开启
# t3 z: z( s( K! L) T$ p通行证私有密钥:填UC里设置的密钥
, Q" }8 X' K- [3 N3 K" X将本系统作为:客户端
7 W6 A. L% D7 W& O5 K; l& E) j# r8 a5 @& A- h! m* f
//UC其他应用的地址都行,只要能同步登录退出。
& b# i2 D7 o) u5 ^7 i/ }! X! T通行证服务器地址:- j! d2 Y+ z5 o; l$ U4 t! P2 S
通行证登录地址:
* F) l4 D1 m% W( Q3 ^通行证退出地址:5 i# h' @. x# i7 ?# j
通行证注册地址:
: H) C- E. b8 X0 o8 }
0 |" ?) w' ~2 | x6 M$ H0 V! r8 ~0 T此时再看应用:通信成功!
" k2 l1 f' ~" R% } ?& i/ z* N+ U! B!qinai!游客!yincang_youke!
: }+ \$ B; t/ P& a8 I: S+ Q% ~2 K- B( g
|