适用版本: phpwind8.0
9 T8 j4 x, `) @* x" {语言编码: GBK简体 UTF8简体 . C! J: P7 a8 e: |. H$ `
发现很多朋友操作不成功基本都是因为与UCenter的通信不成功,所以请先确保UCenter与PW的 api/uc.php 通信成功,再按我的教程操作,否则无效。0 ^8 C9 Z! `4 V s
2 g; Z0 [ |. d# J" F: [/ s, e/ d1 F
昨天推出巧《用PW8的接口整合UCenter》教程后,引起了很多朋友的关注与支持,有的朋友按照教程实现了PW与UCenter的整合,但还有大部分朋友不太明白。比如:
( l2 I) N1 C! i6 H1 f+ d; G- D: S/ {4 \" p. }
有很多朋友问我如何做到PW目录下的api/uc.php 与 UCenter保持通信成功?
1 G5 Y) `1 p+ A: R5 }还有的朋友说希望能给下uc.php的完整代码。
' U" r$ E( G9 W2 I- f& H5 \+ X- d( J1 r* ]' R
插件在附件中,下面是教学部分
( [3 R/ z# ]* L6 U& G5 q) _* v6 [# G4 j6 q. l( c
下面,我们就来进行实例操作。
! b! u0 G; H0 F% ]+ p5 n
$ s) b& B9 h& _6 E首先上传uc_client 文件夹到PW的根目录,你可能要问PW目录下不是有一个uc_client么?我要说的是,直接删除掉,那个没用。uc_client 文件夹在UCenter安装包里可以找到,这里就不再赘述。
/ @: F2 D K3 y8 a" L8 |0 p# z! i2 {
" o& R6 |% \* I3 s复制以下代码并修改相关参数:
0 ~/ _! u, `. N( E- N5 S) ~- <?php
7 u0 y3 K) U$ Z! x+ l, @3 e3 R - define('UC_DIR','../uc_client');
m v! u6 a p+ o: ]8 ~7 E, [
2 y& T5 D: c# s2 {) }- /*
2 d5 j4 W0 y' T& P& m - ** BEGIN 通信相关 by phpfor.com/ K V& c7 f! I% O
- ** 以下代码直接到UCenter后台相关应用里复制过来替换掉。不明白?没关系,往下面看 UCenter与PW通信具体步骤- {/ z$ p- E3 E& ^' N. y2 j
- */
' e1 k# U* Q @; r; B; e - define('UC_CONNECT', '');
' O0 K) G, M* r$ q, N: J! l$ b - define('UC_DBHOST', '');6 |0 w V0 h+ k- @! a1 c
- define('UC_DBUSER', '');
9 v( H- K: v$ @: m7 h - define('UC_DBPW', '');, c" i% k+ g M8 D8 W! q {
- define('UC_DBNAME', '');
1 a: l( l* U: j1 _7 _ A - define('UC_DBCHARSET', 'utf8');
8 h9 Q# d$ ^. T( {" K5 Q' ? - define('UC_DBTABLEPRE', '');
0 p. c2 ?9 }& U$ d, Y+ T4 e - define('UC_DBCONNECT', '0'); |* F5 v! L5 w, j" x+ c0 ^! L6 r
- define('UC_KEY', ''); //这里与PW后台的保持一致
, g, ?4 l) A8 e. v5 C, N - define('UC_API', '');
) P" x1 l9 X# ]( ^ - define('UC_CHARSET', 'utf-8');# h# g. Z' G* ?
- define('UC_IP', '');; H3 b6 W' y1 G5 k4 h. `* d3 m
- define('UC_APPID', '');
" h" |" d5 g% y - define('UC_PPP', '');
) \: X! M# j# ]0 d1 C - /*
2 ]: m7 d2 Y, e - ** END
) ` s) g$ k6 J/ _ - */% R" C( r% e) x
- ' A% x3 M- U% D0 ]; v
- define('PW_URL', '您的PW论坛地址'); // 后缀不要带 / 如:http://bbs.phpfor.com( H/ v) p$ a' r% G9 f
- define('API_RETURN_SUCCEED', '1');
9 f: }1 Q ]( t7 l6 K+ h; Z - define('API_RETURN_FAILED', '-1');
8 M {1 k6 K& F# S# F! S - & u/ f2 n" B- d- d) O
- $code = $_GET['code'];
Q4 H& R( B7 W/ ~4 j6 F% O - if($code && include(UC_DIR.'/client.php')){
5 t6 r; @6 r3 W/ R - $get = array();
' ^% K1 o7 ~) a4 Z - parse_str(uc_authcode($code, 'DECODE', UC_KEY), $get);
U: e2 ^7 ?8 T# ~4 |: V/ U0 g: ^8 u - if(empty($get)) { x2 @ n8 w7 Z0 c* o- ~
- exit('Invalid Request');8 y; {# F; y, x- j+ Z9 ^ b
- }
, u! l/ ` Z2 |# i - if(time() - $get['time'] > 3600) {
6 G- ]8 h- v( r5 P6 E- ]- q - exit('Authracation has expiried');, ?7 a* S7 L6 m
- }8 y1 U! G* u, C' [6 d, v8 f7 k2 c
- $action = $get['action']; c3 Y3 I$ O8 n, j7 u' R2 Z, d" F
- $uc_note = new uc_note();
) c7 U8 a2 c# i9 [- T - if(method_exists($uc_note,$action)){' r7 q: ~! H% O5 u1 J, K0 a& u
- $uc_note->$action($get);1 c4 P/ o( y. n( V7 P/ z
- }else{( ~8 C3 h) {5 l# r
- exit(API_RETURN_FAILED);
d+ X- T0 q/ a6 c+ X4 R* [. ` - }
& z' i b$ D: C9 T+ i) g - }) G! c( _ U+ g* Y X9 r
, W7 i0 E4 n/ ?: y3 S3 U& R- + e) Y; e+ u+ v3 }0 q
- ; J6 | I/ K( k7 a# ]
- class uc_note{
S: z C+ J( \ - ( u1 T6 w6 d2 ]6 r$ \
- function synlogin($get) {
) s! i& {2 x9 @/ c- x& u& L - $userdb = array( 1 ]1 j6 `) X3 |0 P9 s; C
- 'username' => $get['username'],8 _) k w+ S2 e
- 'password' => $get['password'], / c5 E4 t! n' q2 G: S
- 'email' => $get['email'],
/ X# w* N2 z- B& H+ H& h - 'time' => time(),/ M, V9 N. H1 b- Q& {0 j) X
- );. R6 f, Z- A2 _0 x1 L/ l0 Y
- $this->passport('login',$userdb);# Z: }3 `' [# H$ @- g
- }1 p4 z# {$ y5 c, V8 k, \5 m
6 B4 D" L+ d$ `9 H3 Y# A- function synlogout($get){, W E. m& @! M' D) f! S* b
- $this->passport('quit','');
; l1 Z N: f y - }
# K4 ^& _$ `/ E - 9 p/ G# o4 v, r( X
- function passport($action,$userdb,$forward = ''){- s) V. h) L- B
- if($action == 'login'){/ |) Q: c! ]+ L4 \" v6 Z- \
- foreach($userdb as $key=>$val){. L4 D% A$ K+ u1 J7 V
- $userdb_encode .= $userdb_encode ? "&$key=$val" : "$key=$val";! y" Q5 k: t8 [ y
- }5 s9 |5 [ {! l$ B
- }
3 F- I( e q1 V - $userdb_encode = str_replace('=','',$this->strCode($userdb_encode));; x1 d1 f' s/ l Q8 o
- $verify = md5($action.$userdb_encode.$forward.UC_KEY);' c1 d& \7 O k: N, t- a, v
- header('Location: '.PW_URL.'/passport_client.php?action='.$action.'&userdb='.rawurlencode6 m7 H7 y# @4 U' \
- ($userdb_encode).'&forward='.rawurlencode($forward).'&verify='.$verify);
. P3 |% ] N' N: ]6 l( x - exit;
0 c, J& | _2 B - }
# m/ I+ Y! ~0 B' R ~ - 5 m' `$ w! ?/ H4 ]3 T
- function strCode($string,$action='ENCODE'){
, e6 S( S& F2 U7 N# s - $action != 'ENCODE' && $string = base64_decode($string);
1 H1 H* k* Y1 g! U3 _% q - $code = '';+ D: d2 y7 t6 b* E# d0 E( j
- $key = substr(md5($_SERVER["HTTP_USER_AGENT"].UC_KEY),8,18);2 M, `) b2 Q) f2 e) k$ B3 X, Y
- $keylen = strlen($key); $strlen = strlen($string);# d/ {8 P7 \& e3 Q0 ]4 X, v+ l
- for ($i=0;$i<$strlen;$i++) {/ e) R" d: R/ I; C, G
- $k = $i % $keylen;$ \; ]# o; R* \7 D# a3 H" H, a
- $code .= $string[$i] ^ $key[$k];
' L& Q$ h5 T5 E, E% Z$ ^# i - } C, A U, j5 j& g6 ~ m
- return ($action!='DECODE' ? base64_encode($code) : $code);# p1 g: M" I& w* x
- }
, @7 `/ F5 ~0 B M: ] - ; H0 B# l% Y+ X5 V7 B# [& ]
- $ g+ E) R" T7 l; I8 B: G1 i: [+ d
- function test($get){7 t* a9 ^+ l( L, l
- exit(API_RETURN_SUCCEED);
9 j& T) u1 _$ \0 E+ m# U; d( n - }% [) \& c' v+ n, W/ ]6 y/ H P
- }
; x* t' t+ L3 q. K; y0 A! Q6 |2 |
% p u+ n; }& [
1 O6 w# y1 @7 M, e% H
6 n( k- `. {! @' E8 x- ?>
复制代码 UCenter与PW通信具体步骤
' O% \* B( Y% S' C! x
1 i7 N: N" M. K9 y) P7 i0 i, k& q2 m9 g- }+ n1.UCenter配置- v- |) R+ J5 ]! Z" E9 B4 W8 ?
进UCenter后台->应用管理->添加新应用->自定义安装
% U7 ~% }- c- z* F" n, C应用名称:PW论坛, ]+ w% \; R5 g
应用URL:PW论坛地址- V% X0 T( _8 v- W0 F% H) q
通信密钥:与PW后台 第三方整合的密钥一致
( b H: N' M" m8 E8 z: J7 m0 b应用类型:其他% A6 t9 }6 Y* o/ r) J; n5 k
是否开启同步登录:是
% ^$ B+ _# W. N+ y4 Y* h: C是否接受通知:是. U2 [ Q3 w% U0 W9 D7 v& [) C/ r
/ \4 q* j# ^' _' V* {然后提交,成功后复制 应用的 UCenter 配置信息:
% L! J" M- _) l f2 ^里面的内容 替换以上配置信息。( J; v5 z+ H6 a C
5 Y8 |: U$ g; c2.PW配置& z+ t A! H& G3 M: R
进后台->应用中心->插件管理->通行证3 h, |( W0 g9 m5 e0 Z! X/ X
1 A* T! Q4 M) _5 |9 N3 Q+ T( Y8 C
通行证:开启' {$ s5 e9 p" U0 Z5 ?
通行证私有密钥:填UC里设置的密钥
8 j* T$ j2 Q" W将本系统作为:客户端
& q& @, i# w3 j1 @3 I
* f5 O& D% L+ i//UC其他应用的地址都行,只要能同步登录退出。
) P8 P) E' k0 p' h3 Y1 ]2 W, [# @通行证服务器地址:
* v: }9 Q% Z+ ]6 A通行证登录地址:
7 K9 `1 X- u7 z, m# {; K& o通行证退出地址:
" F9 D D2 ]. S3 J4 H& l1 ]1 n$ h通行证注册地址:
3 h+ i( D$ G: z, a* V, F
! y- j# C; ] y# V- W此时再看应用:通信成功!7 p' D O9 L; Y. N
!qinai!游客!yincang_youke! - p% v* V, _0 t& R
' [$ I. O3 A! h |