微信公众号第三方h5页面登录
官方文档:https://developers.weixin.qq.com/doc/oplatform/Website_App/WeChat_Login/Wechat_Login.html
参考文档:https://www.cnblogs.com/jj0219/p/10436664.html
1.先注册https://open.weixin.qq.com/,获取开放平台app_id和app_secret
2.公众号自动登录和PC端扫码登陆如果要统一账号,那需要到开放平台绑定下公众号
//生成扫码登录的URL private function qrconnect($redirect_url, $scope, $state = NULL) { $WeChatLoginConfig = !empty($this->usersConfig['wechat_login_config']) ? unserialize($this->usersConfig['wechat_login_config']) : []; $url = "https://open.weixin.qq.com/connect/qrconnect?appid=" . $WeChatLoginConfig['open_appid'] . "&redirect_uri=" . urlencode($redirect_url) . "&response_type=code&scope=" . $scope . "&state=" . $state . "#wechat_redirect"; return $url; } //生成OAuth2的Access Token private function oauth2_access_token($code) { $WeChatLoginConfig = !empty($this->usersConfig['wechat_login_config']) ? unserialize($this->usersConfig['wechat_login_config']) : []; $url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" . $WeChatLoginConfig['open_appid'] . "&secret=" . $WeChatLoginConfig['open_appsecret'] . "&code=" . $code . "&grant_type=authorization_code"; $res = $this->http_request($url); return json_decode($res, true); }
//获取用户基本信息(OAuth2 授权的 Access Token 获取 未关注用户,Access Token为临时获取) private function oauth2_get_user_info($access_token, $openid) { $url = "https://api.weixin.qq.com/sns/userinfo?access_token=" . $access_token . "&openid=" . $openid . "&lang=zh_CN"; $res = $this->http_request($url); return json_decode($res, true); }
public function http_request($url){ return file_get_contents($url); }
// 登录
public function login()
{
// 若已登录则重定向
if ($this->users_id > 0) {
$this->redirect('user/Users/centre');
exit;
}
// 若为微信端则重定向
$website = input('param.website/s');
if (isWeixin() && empty($website)) {
$this->redirect('user/Users/users_select_login');
exit;
}
// 默认开启验证码
$is_vertify = 1;
$users_login_captcha = config('captcha.users_login');
if (!function_exists('imagettftext') || empty($users_login_captcha['is_on'])) {
$is_vertify = 0; // 函数不存在,不符合开启的条件
}
$this->assign('is_vertify', $is_vertify);
/*微信扫码登录 - 判断是否显示微信登录按钮*/
$usersConfig = getUsersConfigData('all');
$WeChatLoginConfig = !empty($usersConfig['wechat_login_config']) ? unserialize($usersConfig['wechat_login_config']) : [];
if(empty($WeChatLoginConfig)) $this->error('尚未配置扫码登录参数');
if(empty($WeChatLoginConfig['open_appid']) || empty($WeChatLoginConfig['open_appsecret']) ) $this->error('尚未配置扫码登录参数');
$weapp_wxlogin = 1;
$redirect_uri = tpCache('web.web_basehost');
$redirect_uri = urlencode($redirect_uri);//该回调需要url编码
$wechat_login_config = unserialize(getUsersConfigData('wechat.wechat_login_config'));
if(empty($wechat_login_config)) $weapp_wxlogin = 0;
if($weapp_wxlogin) {
$appID = $WeChatLoginConfig['open_appid'];
$scope="snsapi_login";
/*
//准备向微信发请求
$url = "https://open.weixin.qq.com/connect/qrconnect?appid=" . $appID."&redirect_uri=".$redirect_uri."&response_type=code&scope=".$scope."&state=STATE#wechat_redirect";
$res = file_get_contents($url);
$res = str_replace("/connect/qrcode/", "https://open.weixin.qq.com/connect/qrcode/", $res);
*/
$this->assign('appid', $appID);
$this->assign('wxcodeimg', $res);
}
$this->assign('weapp_wxlogin', $weapp_wxlogin);
/*end*/
if (1 == config('global.opencodetype')) {
$type = input('param.type/s');
$this->assign('type', $type);
}
// 跳转链接
$referurl = input('param.referurl/s', null, 'htmlspecialchars_decode,urldecode');
if (empty($referurl)) {
if (isset($_SERVER['HTTP_REFERER']) && stristr($_SERVER['HTTP_REFERER'], $this->request->host())) {
$referurl = $_SERVER['HTTP_REFERER'];
} else {
$referurl = url("user/Users/centre");
}
}
cookie('referurl', $referurl);
$this->assign('title', '登录');
$this->assign('referurl', $referurl);
return $this->fetch('users_login');
}
// 微信扫码登录处理
public function scale_wx_login() {
$get = input('get.');
if (!empty($get['code'])){
//获取token
$oauth2_info = $this->oauth2_access_token($get["code"]);
//获取用户信息
$userinfo = $this->oauth2_get_user_info($oauth2_info['access_token'], $oauth2_info['openid']);
// 查询这个openid是否已注册
$where = [
'open_id' => $userinfo['unionid'],
'lang' => $this->home_lang
];
$Users = $this->users_db->where($where)->find();
if (!empty($Users)) {
// 已注册
session('users_id', $Users['users_id']);
session('users', $Users);
cookie('users_id', $Users['users_id']);
$this->redirect(url('user/users/centre'));
} else {
// 未注册
$username = substr($userinfo['unionid'], 6, 8);
// 查询用户名是否已存在
$result = $this->users_db->where('username', $username)->count();
if (!empty($result)) {
$username = $username . rand('100,999');
}
// 新增会员和微信绑定
$UsersData = [
'username' => $username,
'nickname' => $userinfo['nickname'],
'open_id' => $userinfo['unionid'],
'password' => '', // 密码默认为空
'last_ip' => clientIP(),
'reg_time' => getTime(),
'last_login' => getTime(),
'is_activation' => 1, // 微信注册会员,默认开启激活
'register_place' => 2, // 前台微信注册会员
'login_count' => Db::raw('login_count+1'),
'head_pic' => $userinfo['headimgurl'],
'lang' => $this->home_lang,
];
// 查询默认会员级别,存入会员表
$level_id = $this->users_level_db->where([
'is_system' => 1,
'lang' => $this->home_lang,
])->getField('level_id');
$UsersData['level'] = $level_id;
$users_id = $this->users_db->add($UsersData);
if (!empty($users_id)) {
// 新增成功,将会员信息存入session
$GetUsers = $this->users_db->where('users_id', $users_id)->find();
session('users_id', $GetUsers['users_id']);
session('users', $GetUsers);
cookie('users_id', $GetUsers['users_id']);
$this->redirect(url('user/users/centre'));
} else {
$this->error('未知错误,无法继续!');
}
}
//处理用户登录逻辑
//登录成功后跳转
header("Location:************");
}else {
$this->error('出错啦');
}
}