之前讲过微信的公众号自动登录的菜单配置,这次记录一下在TP5项目中获取自动登录的用户信息并存到数据库的操作
基本的流程为:微信设置自动登录的菜单—>访问的URL指定的函数里获取用户信息—>将信息存到数据库中->返回视图
也可以参考下列流程图:
接下来我们一步步编写代码。
一. 在公众号内设置菜单,可参考我的另一篇文章:公众号打开网页自动登陆配置
二. 在配置文件(config.php)中加上公众号信息
// 公众号配置
'wechat' => [
// AppId
'AppId' => "你的公众号AppId", // 微信支付APPID
// AppSecret
'AppSecret' => "你的公众号AppSecret", // 公众帐号secert (公众号支付专用)
],
三. 在指定的URL对应的函数里编写代码
3.1 引入Session类和配置文件类,实例化配置文件类
use \think\Session;
use \think\Config;
// 获取配置文件里的信息
$wx_config = Config::get('wechat');
3.2 另外编写一个函数,用于请求微信接口,获取数据
// 用于请求微信接口获取数据
function get_by_curl($url,$post = false){
$ch = curl_init();
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
if($post){
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS,$post);
}
$result = curl_exec($ch);
curl_close($ch);
return $result;
}
以下流程直接贴全部完整代码
3.3 获取页面url的code参数值,并与AppId和AppSecret组合URL,调用get_by_curl()函数获取用户openid和access_token
这里的code参数是你之前设定的那个菜单的url在微信内访问后,会根据用户信息自动生成,跳转到你的url后会自动加在url后面
扫描二维码关注公众号,回复:
4519869 查看本文章
3.4 用openid和access_token组合url,调用get_by_curl()函数获取用户详情信息
3.5 将用户信息取出,根据openid判断当前用户是否存在数据库中,不存在则新增到数据库
3.6 如果当前用户存在且信息有改变,则改变数据库中对应的用户信息
3.7 将用户openid作为标识存到session中
3.8 返回视图
// 获取页面URL的CODE参数,判断是否有值
if(isset($_GET['code'])) {
// 获取openid和access_token
$app_id = $wx_config['AppId'];
$app_secret = $wx_config['AppSecret'];
$code = $_GET['code'];
// 发送请求,获取用户openid和access_token
$data = $this->get_by_curl('https://api.weixin.qq.com/sns/oauth2/access_token?appid='.$app_id.'&secret='.$app_secret.'&code='.$code.'&grant_type=authorization_code');
$data = json_decode($data);
// 防止第二次访问动态链接报错
// 判断是否获取到当前用户的openid
if(isset($data->openid)){
$open_id = $data->openid;
$access_token = $data->access_token;
// 获取当前用户信息
$user_info = $this->get_by_curl('https://api.weixin.qq.com/sns/userinfo?access_token='.$access_token.'&openid='.$open_id.'&lang=zh_CN');
$user_info = json_decode($user_info);
// 取出用户信息
/*
*user_openid :用户openId
*user_nickname :用户昵称
*user_sex :性别
*user_province :省
*user_city :城市
*user_headimgurl :用户头像url
*/
$user_openid = $user_info->openid;
$user_nickname = $user_info->nickname;
$user_sex = $user_info->sex;
$user_province = $user_info->province;
$user_city = $user_info->city;
$user_headimgurl = $user_info->headimgurl;
// 以下操作可按照自己的需求编写,这里只做例子
// 判断用户是否存在
$data_user = model('app\admin\model\User')
->where('open_id','=',$user_openid)
->find();
if(empty($data_user)){
$new_user = model('app\admin\model\User');
$new_user->data([
'open_id' => $user_openid,
'name' => $user_nickname,
'sex' => $user_sex,
'province' => $user_province,
'city' => $user_city,
'headimgurl' => $user_headimgurl,
'join_time' => time(),
]);
// 新增用户到数据库
$new_user->save();
}
$cur_user = model('app\admin\model\User')
->where('open_id','=',$user_openid)
->find();
// 判断当前用户是否修改过信息,若有变动则更新
if(strcmp($cur_user->name,$user_nickname)!=0||strcmp($cur_user->headimgurl,$user_headimgurl)!=0){
$cur_user->name = $user_nickname;
$cur_user->headimgurl = $user_headimgurl;
// 更新当前用户信息
$cur_user->save();
}
// 将当前用户openid作为标识存到session里
Session::set('open_id', $cur_user->open_id);
}
}
return $this->view->fetch('index');
至此就完成了公众号网页获取当前用户信息,并保存到数据库的操作
注意:如果无法获得数据,请检查AppID和AppSecret是否正确,同时,还要检查是否给你访问的网页域名授权了