本教程操作环境:Windows10系统、phpcms v9版,DELL G3电脑
phpcms怎么实现微信登陆?
phpcms实现微信登陆(无需注册,直接存入)
思路:回调参数,直接register (代码不够规范,自己整理)
立即学习“PHP免费学习笔记(深入)”;
在根目录新建wechat.php
访问: http://www.xxxxxx.cn/wechat.php
注意回调地址
phpcms实现微信登陆(无需注册,直接存入)
wechat.php
1
2
3
4
5
6
7
8
9
10
11
<?php if(!empty( $_GET@['code']) && !empty( $_GET@['state'])){
$code = $_GET@['code'];
$state = $_GET@['state'];
$url = "http://www.xxxxxx.cn/index.php?m=member&c=index&a=wechat&code=$code&state=$state";
header('location:'.$url);
exit;
}
$appid = 'wx5a3878682fa32bd5';
$url = "https://open.weixin.qq.com/connect/qrconnect?appid=$appid&redirect_uri=http://www.xxxxxx.cn/wechat.php&response_type=code&scope=snsapi_login&state=1&connect_redirect=1#wechat_redirect";
header('location:'.$url);
?>
phpcmsmodulesmemberindex.php下增加
用户名称和密码做了简单区别处理,根据实际情况修改,邮箱为必须字段,随便放了一个。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
<?php public function wechat() {
$this->_session_start();
//获取用户siteid
$siteid = isset($_REQUEST[siteid]) && trim($_REQUEST[siteid]) ? intval($_REQUEST[siteid]) : 1;
//定义站点id常量
if (!defined(SITEID)) {
define(SITEID, $siteid);
}
//加载用户模块配置
//加载用户模块配置
$member_setting = getcache(member_setting);
if(!$member_setting[allowregister]) {
showmessage(L(deny_register), /login.html);
}
/*----------------------微信获取用户信息------------------------*/
//换成自己的接口信息
$code = $_GET@[code];
$state = $_GET@[state];
$appid = xxxxxxxx;
$appsecret = xxxxxxxx;
if (empty($code)) $this->error(授权失败);
$token_url = https://api.weixin.qq.com/sns/oauth2/access_token?appid=.$appid.&secret=.$appsecret.&code=.$code.&grant_type=authorization_code;
$token = json_decode(file_get_contents($token_url));
if (isset($token->errcode)) {
showmessage(L(<br><h2>错误信息:</h2>.$token->errmsg), HTTP_REFERER);
exit;
}
$access_token_url = https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=.$appid.&grant_type=refresh_token&refresh_token=.$token->refresh_token;
//转成对象
$access_token = json_decode(file_get_contents($access_token_url));
if (isset($access_token->errcode)) {
showmessage(L(<br><h2>错误信息:</h2>.$access_token->errmsg), HTTP_REFERER);
exit;
}
$user_info_url = https://api.weixin.qq.com/sns/userinfo?access_token=.$access_token->access_token.&openid=.$access_token->openid.&lang=zh_CN;
//转成对象
$user_info = json_decode(file_get_contents($user_info_url));
if (isset($user_info->errcode)) {
showmessage(L( <br><h2>错误信息:</h2>.$user_info->errmsg), HTTP_REFERER);
exit;
}
$rs = json_decode(json_encode($user_info),true);//转换成数组
/*------------------------获取用户信息代码结束-----------------------*/
header("Cache-control: private");
$checkname = trim($rs[nickname])."_".substr(md5($rs[unionid]),0,5) ;
$this->_init_phpsso();
$cstatus = $this->client->ps_checkname($checkname);
//如果存在用户 用户登陆
if($cstatus == -4 || $cstatus == -1) {
$username = $rs[nickname]."_".substr(md5($rs[unionid]),0,5) ;
$password = substr(md5($rs[unionid]),0,10);
//is_password($_POST@[password]) && is_badword($_POST@[password])==false ? trim($_POST@[password]) : showmessage(L(password_format_incorrect), HTTP_REFERER);
$cookietime = intval($_POST@[cookietime]);
$synloginstr = ; //同步登陆js代码
if(pc_base::load_config(system, phpsso)) {
$this->_init_phpsso();
$status = $this->client->ps_member_login($username, $password);
$memberinfo = unserialize($status);
if(isset($memberinfo[uid])) {
//查询帐号
$r = $this->db->get_one(array(phpssouid=>$memberinfo[uid]));
if(!$r) {
//插入会员详细信息,会员不存在 插入会员
$info = array(
phpssouid=>$memberinfo[uid],
username=>$memberinfo[username],
password=>$memberinfo[password],
encrypt=>$memberinfo[random],
email=>$memberinfo[email],
regip=>$memberinfo[regip],
regdate=>$memberinfo[regdate],
lastip=>$memberinfo[lastip],
lastdate=>$memberinfo[lastdate],
groupid=>$this->_get_usergroup_bypoint(), //会员默认组
modelid=>10, //普通会员
);
//如果是connect用户
if(!empty($_SESSION[connectid])) {
$userinfo[connectid] = $_SESSION[connectid];
}
if(!empty($_SESSION[from])) {
$userinfo[from] = $_SESSION[from];
}
unset($_SESSION[connectid], $_SESSION[from]);
$this->db->insert($info);
unset($info);
$r = $this->db->get_one(array(phpssouid=>$memberinfo[uid]));
}
$password = $r[password];
$synloginstr = $this->client->ps_member_synlogin($r[phpssouid]);
} else {
if($status == -1) { //用户不存在
showmessage(L(user_not_exist), /login.html);
} elseif($status == -2) { //密码错误
showmessage(L(password_error), /login.html);
} else {
showmessage(L(login_failure), /login.html);
}
}
} else {
//密码错误剩余重试次数
$this->times_db = pc_base::load_model(times_model);
$rtime = $this->times_db->get_one(array(username=>$username));
if($rtime[times] > 4) {
$minute = 60 - floor((SYS_TIME - $rtime[logintime]) / 60);
showmessage(L(wait_1_hour, array(minute=>$minute)));
}
//查询帐号
$r = $this->db->get_one(array(username=>$username));
if(!$r) showmessage(L(user_not_exist),/login.html);
//验证用户密码
$password = md5(md5(trim($password)).$r[encrypt]);
if($r[password] != $password) {
$ip = ip();
if($rtime && $rtime[times] times_db->update(array(ip=>$ip, times=>+=1), array(username=>$username));
} else {
$this->times_db->insert(array(username=>$username, ip=>$ip, logintime=>SYS_TIME, times=>1));
$times = 5;
}
showmessage(L(password_error, array(times=>$times)), /login.html, 3000);
}
$this->times_db->delete(array(username=>$username));
}
//如果用户被锁定
if($r[islock]) {
showmessage(L(user_is_lock));
}
$userid = $r[userid];
$groupid = $r[groupid];
$username = $r[username];
$nickname = empty($r[nickname]) ? $username : $r[nickname];
$updatearr = array(lastip=>ip(), lastdate=>SYS_TIME);
//vip过期,更新vip和会员组
if($r[overduedate] = 0 && !in_array($r[groupid], array(1, 7, 8)) && empty($r[vip])) {
$grouplist = getcache(grouplist);
if(!empty($grouplist[$r[groupid]][allowupgrade])) {
$check_groupid = $this->_get_usergroup_bypoint($r[point]);
if($check_groupid != $r[groupid]) {
$updatearr[groupid] = $groupid = $check_groupid;
}
}
}
//如果是connect用户
if(!empty($_SESSION[connectid])) {
$updatearr[connectid] = $_SESSION[connectid];
}
if(!empty($_SESSION[from])) {
$updatearr[from] = $_SESSION[from];
}
unset($_SESSION[connectid], $_SESSION[from]);
$this->db->update($updatearr, array(userid=>$userid));
if(!isset($cookietime)) {
$get_cookietime = param::get_cookie(cookietime);
}
$_cookietime = $cookietime ? intval($cookietime) : ($get_cookietime ? $get_cookietime : 0);
$cookietime = $_cookietime ? SYS_TIME + $_cookietime : 0;
$phpcms_auth = sys_auth($userid." ".$password, ENCODE, get_auth_key(login));
param::set_cookie(auth, $phpcms_auth, $cookietime);
param::set_cookie(_userid, $userid, $cookietime);
param::set_cookie(_username, $username, $cookietime);
param::set_cookie(_groupid, $groupid, $cookietime);
param::set_cookie(_nickname, $nickname, $cookietime);
//print_r($_COOKIE);
//exit;
//param::set_cookie(cookietime, $_cookietime, $cookietime);
//https 与 http 传递用户名 跨域跳转cooike
$forward = isset($_POST@[forward]) && !empty($_POST@[forward]) ? urldecode($_POST@[forward]) : index.php?m=member&c=index;
$url = "http://www.zhiliaoke.com.cn/set_cookie_www.php?nickname=".$_COOKIE[vuGYB__nickname]."&username=".$_COOKIE[vuGYB__username]."&userid=".$_COOKIE[vuGYB__userid]."&groupid=".$_COOKIE[vuGYB__groupid];
header("Location: ".$url."");
}
//如果不存在用户注册
$userinfo = array();
$userinfo[encrypt] = create_randomstr(6);
$userinfo[username] = $rs[nickname]."_".substr(md5($rs[unionid]),0,5) ;
$userinfo[nickname] = $rs[nickname]."_".substr(md5($rs[unionid]),0,5) ;
$userinfo[email] = time().@yangpeili.com;
$userinfo[password] = substr(md5($rs[unionid]),0,10);
$userinfo[modelid] = isset($_POST@[modelid]) ? intval($_POST@[modelid]) : 10;
$userinfo[regip] = ip();
$userinfo[point] = $member_setting[defualtpoint] ? $member_setting[defualtpoint] : 0;
$userinfo[amount] = $member_setting[defualtamount] ? $member_setting[defualtamount] : 0;
$userinfo[regdate] = $userinfo[lastdate] = SYS_TIME;
$userinfo[siteid] = $siteid;
$userinfo[connectid] = isset($_SESSION[connectid]) ? $_SESSION[connectid] : ;
$userinfo[from] = isset($_SESSION[from]) ? $_SESSION[from] : ;
//手机强制验证
//附表信息验证 通过模型获取会员信息
if($member_setting[choosemodel]) {
require_once CACHE_MODEL_PATH.member_input.class.php;
require_once CACHE_MODEL_PATH.member_update.class.php;
$member_input = new member_input($userinfo[modelid]);
$_POST@[info] = array_map(new_html_special_chars,$_POST@[info]);
$user_model_info = $member_input->get($_POST@[info]);
}
if(pc_base::load_config(system, phpsso)) {
$this->_init_phpsso();
$status = $this->client->ps_member_register($userinfo[username], $userinfo[password], $userinfo[email], $userinfo[regip], $userinfo[encrypt]);
echo $status;
if($status > 0) {
$userinfo[phpssouid] = $status;
//传入phpsso为明文密码,加密后存入phpcms_v9
$password = $userinfo[password];
$userinfo[password] = password($userinfo[password], $userinfo[encrypt]);
$userid = $this->db->insert($userinfo, 1);
if($member_setting[choosemodel]) { //如果开启选择模型
$user_model_info[userid] = $userid;
//插入会员模型数据
$this->db->set_model($userinfo[modelid]);
$this->db->insert($user_model_info);
}
if($userid > 0) {
//执行登陆操作
if(!$cookietime) $get_cookietime = param::get_cookie(cookietime);
$_cookietime = $cookietime ? intval($cookietime) : ($get_cookietime ? $get_cookietime : 0);
$cookietime = $_cookietime ? TIME + $_cookietime : 0;
if($userinfo[groupid] == 7) {
param::set_cookie(_username, $userinfo[username], $cookietime);
param::set_cookie(email, $userinfo[email], $cookietime);
} else {
$phpcms_auth = sys_auth($userid." ".$userinfo[password], ENCODE, get_auth_key(login));
//$this->db->update(array(groupid=> "6"), array(userid=>$userid));
$sql = "UPDATE `v9_member` SET `groupid`=6 WHERE `userid` = $userid ";//修改用户级别为注册用户
mysql_query($sql);
param::set_cookie(auth, $phpcms_auth, $cookietime);
param::set_cookie(_userid, $userid, $cookietime);
param::set_cookie(_username, $userinfo[username], $cookietime);
param::set_cookie(_nickname, $userinfo[nickname], $cookietime);
param::set_cookie(_groupid, $userinfo[groupid], $cookietime);
param::set_cookie(cookietime, $_cookietime, $cookietime);
$forward = isset($_POST@[forward]) && !empty($_POST@[forward]) ? urldecode($_POST@[forward]) : index.php?m=member&c=index;
//https 与 http 传递用户名 跨域跳转cooike
$url = "http://www.zhiliaoke.com.cn/set_cookie_www.php?nickname=".$_COOKIE[vuGYB__nickname]."&username=".$_COOKIE[vuGYB__username]."&userid=".$_COOKIE[vuGYB__userid]."&groupid=".$_COOKIE[vuGYB__groupid];
header("Location: ".$url."");
}
}
}
} else {
showmessage(L(enable_register).L(enable_phpsso), /login.html);
}
showmessage(L(operation_failure), HTTP_REFERER);
}
?>
补充最后一步
很重要,也是最简单容易忽视的 !!!
有几个人都卡在这里了!
需要 在phpcmsmodulesmemberclassesoreground.class.php 文件 21行左右 判断用户是否登陆通过wechat 函数
PHP中文网,大量的免费PHPCMS教程,欢迎在线学习!