快捷登录PHP,phpcms 微信快捷登陆

上一篇文章,给大家分享了关于微信授权登陆功能,今天给大家分享一个微信快捷登陆的实际用例。

phpcms接入微信快捷登陆

第一步,在login方法中,判定是否使用微信浏览器访问,如果是,发起授权申请

if ( strpos($_SERVER['HTTP_USER_AGENT'], 'MicroMessenger') !== false ) {

$jump_url = urlencode("http://www.phpcms.com/wechat.php");

$url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=XXXXXXXXXXXXX&redirect_uri={$jump_url}&response_type=code&scope=snsapi_userinfo&state=login#wechat_redirect";

header('location:'.$url);

}

第二步,新建一个回调文件,该文件的作用是,唤醒微信授权,当用户允许授权后,微信会请求到该地址,同时,微信会返回给我们重要的参数:code=CODE&state=STATE。

回调文件的程序:

if(!empty( $_GET['code']) && !empty( $_GET['state'])){

$code = $_GET['code'];

$state = $_GET['state'];

$username = $_GET['username'];

$url = "http://www.phpcms.com/index.php?m=member&c=index&a=wechat&code=$code&state=$state&username=$username";

header('location:'.$url);//用户同意授权后,跳转到这个地址,这个地址中,会通过code获取access_token

exit;

}

$appid = 'XXXXXXXXXXXXXXXXX';

$jump_url = urlencode("http://www.phpcms.com/wechat.php");

$url = "https://open.weixin.qq.com/connect/qrconnect?appid=$appid&redirect_uri={$jump_url}&response_type=code&scope=snsapi_userinfo&state=login#wechat_redirect";

header('location:'.$url); ?>

第二步:通过code,请求以下链接获取access_token:  https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code,获取access_token,通过 access_token 获取用户信息

public function wechat() {//该方法参照了 login 方法

$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'];

$username = $_GET['username'];

$appid = 'XXXXXXXXXXXXXXXXX';

$appsecret = 'XXXXXXXXXXXXXXXX';

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('

错误信息:

'.$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));//获取access_token

if (isset($access_token->errcode)) {

showmessage(L('

错误信息:

'.$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( '

错误信息:

'.$user_info->errmsg), HTTP_REFERER);

exit;

}

$openid = $user_info->openid;

if($state=='bangding'){

$memberinfo = $this->db->get_one(array('username'=>$username));//echo $username;print_r($memberinfo);die;

if(empty($memberinfo)){

showmessage('用户名不存在', HTTP_REFERER);//'index.php?m=member&c=index&a=login'

//header("location:/index.php?m=member&c=index&from=mobile");

}//print_r($updatearr);die;

$updatearr['openid'] = $openid;

$this->db->update($updatearr, array('userid'=>$memberinfo['userid']));

header("location:index.php?m=member&c=index&a=login");

}

$memberinfo = $this->db->get_one(array('openid'=>$openid));

if(empty($memberinfo)){//没有绑定,跳转到绑定页面

header("Location:index.php?m=member&c=index&a=bangding");

}

$memberinfo['uid'] = $memberinfo['phpssouid'];

if(pc_base::load_config('system', 'phpsso')) {

$this->_init_phpsso();

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'), HTTP_REFERER);//'index.php?m=member&c=index&a=login'

} elseif($status == -2) { //密码错误

showmessage(L('password_error'), HTTP_REFERER);//'index.php?m=member&c=index&a=login'

} else {

showmessage(L('login_failure'), HTTP_REFERER);//'index.php?m=member&c=index&a=login'

}

}

}

$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'] < SYS_TIME) {

$updatearr['vip'] = 0;

}

//检查用户积分,更新新用户组,除去邮箱认证、禁止访问、游客组用户、vip用户,如果该用户组不允许自助升级则不进行该操作

if($r['point'] >= 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."t".$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);

param::set_cookie('cookietime', $_cookietime, $cookietime);

header("location:/index.php?m=member&c=index&from=mobile");

}

function bangding(){

if(isset($_POST['dosubmit'])) {

$username = $_POST['username'];

$jump_url = urlencode("http://steam.phpzheng.com/wechat.php?username={$username}");//注意这个username参数

//再次授权

$url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx4b199c68b1f2dac1&redirect_uri={$jump_url}&response_type=code&scope=snsapi_userinfo&state=bangding#wechat_redirect";

//echo $url;die;

header('location:'.$url);

}

$this->display();

}

注意:修改 /phpcms/modules/member/classes/foreground.class.php 第20行附近

if(ROUTE_M =='member' && ROUTE_C =='index' && in_array(ROUTE_A, array('wechat','banding','login', 'register', 'mini','send_newmail')))

另外,对于新用户首次登陆,我们需要引导用户进行绑定,用户授权后,我们根据用户的 openid,查询该 openid 是否存在于数据库中:

如果存在,我们则取出用户在我们数据库中用户表的信息;

如果不存在,我们则跳转到绑定页面,用户输入用户名进行绑定,绑定提交后,如果用户名存在,则再次自动跳转到登陆页面(登陆页面会再次查询当前 openid 是否存在数据库中,因为刚才完成了绑定,所以现在可以取出绑定的用户名的用户信息)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/571843.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux 端口号查看

linux 端口号查看netstat -anp |grep 端口号最后一列是端口号转载于:https://www.cnblogs.com/ditmark/p/7669804.html

pwm波如何控制电机代码_PWM波控制720电机

详细方案四&#xff1a;pwm与720电机控制电机硬件分析什么是电机&#xff1f;电机(俗称"马达")是指依据电磁感应定律实现电能转换或传递的一种电磁装置。它的主要作用是产生驱动转矩&#xff0c;作为用电器或各种机械的动力源。其中本四轴采用的电机是直流电机。直流…

php里的stdclass,PHP中的stdClass是什么?

stdClass是另一个很好的PHP特性。您可以创建一个匿名PHP类。让我们检查一个例子。$pagenew stdClass();$page->nameHome;$page->status1;现在&#xff0c;假设您有另一个类&#xff0c;它将使用页面对象初始化并在其基础上执行。<?phpclass PageShow {public $curre…

arduino使用oled代码_【惊不?】Arduino改造古董卡西欧计算器为作弊神器

一台朴实无华的计算器&#xff0c;卡西欧牌。看起来和千万学子们所使用的计算器一样&#xff0c;没什么特别的&#xff0c;还带着一些陈旧的使用痕迹。但如果你用磁铁碰一下&#xff1a;咦&#xff0c;简直像打开了探险电影里的神秘机关&#xff0c;右上角的太阳能电池板部分居…

什么都没学到,记录一个鼠标监听事件吧

textField.addMouseListener(new MouseAdapter() { //鼠标在textField中时&#xff0c;改变btnNewButton的文本内容 貌似我的概念是混乱的&#xff0c;用控件乱用哈&#xff0c;哈哈 public void mousePressed(MouseEvent e) { btnNewButton.setText("按下鼠标&qu…

matlab实现id3,MATLAB简单实现ID3

再看《MATLAB数据分析与挖掘实战》&#xff0c;简单总结下今天看到的经典的决策树算法——ID3.ID3&#xff1a;在决策树的各级节点上&#xff0c;使用信息增益的方法作为属性的选择标准&#xff0c;来帮助确定生成每个节点时所应采取的合适属性。关于信息增益&#xff0c;知乎上…

python字符串数组_python将字符串转换成数组的方法

Python这篇文章主要介绍了Python __setattr__、 __getattr__、 __delattr__、__call__用法示例,本文分别对这几个魔法方法做了讲解,需要的朋友可以参考下 ... junjie4882019-11-22 Python这篇文章主要介绍了Python实现list反转的方法,实例总结了关于list的各种较为常见的操作技…

团队项目介绍

身为该团队的项目负责人&#xff0c;简单介绍下我们团队的项目以及分工。 我们团队共有10个人&#xff0c;团队名称&#xff1a;Eastwood。 团队项目&#xff1a;开发一个网页&#xff0c;里面包含几个小游戏&#xff0c;通过玩的游戏判断人的性格。 团队项目开始日期&#xff…

python fillna,Pandas之Fillna填充缺失数据的方法

约定&#xff1a;import pandas as pdimport numpy as npfrom numpy import nan as NaN填充缺失数据fillna()是最主要的处理方式了。df1pd.DataFrame([[1,2,3],[NaN,NaN,2],[NaN,NaN,NaN],[8,8,NaN]])df1代码结果&#xff1a;01201.02.03.01NaNNaN2.02NaNNaNNaN38.08.0NaN用常数…

vsc写vue生成基本代码快捷键_基于vue2.X的webpack基本配置,教你手动撸一个webpack4的配置...

webpack说复杂也不复杂。不复杂&#xff0c;核心概念不外乎是entry, output, loader, plugins。webpack4还新增了optimization选项&#xff0c;用于代码分割和打包优化。现在webpack官网文档已经写的挺棒了。而当你真正开始手写一个webpack.config.js的时候&#xff0c;你就会发…

几款效率神器助你走上人生巅峰

一、背景 在我的工作和生活中&#xff0c;我一直都很注重效率工具的使用&#xff0c;这么些年下来也积累好几款很不错&#xff0c;但是又不为大多数人所熟知的软件工具&#xff0c;我用起来得心应手&#xff0c;很不错。那我就像在此给大家做个分享&#xff0c;希望你们都能多多…

自动部署 php,Jenkins实现PHP的自动部署

用HTML5 CANVAS做自定义路径的动态效果图片&#xff01;最近对HTML5开始感兴趣了,实现的效果如下图,大家可以从代码里换掉图片 我用的是canvas里面的2d绘图,其中上图的路径是网上在线绘制的,我太懒了,哈哈 下面是网址: http://www.vic ...开源的EtherCAT Master简介EtherCAT的主…

macos下载的安装包在哪里_macbook任意降级,为您带来mac os完美降级教程

最近有许多用户反映升级了最新的系统出现了各种奇葩问题&#xff0c;更关键的是&#xff0c;很多常用&#xff08;专业&#xff09;软件不能使用了。因此有许多用户想要降级&#xff0c;现在macdown小编为您带来mac os完美降级教程&#xff0c;有需要的赶紧收藏啦&#xff01;第…

Java Lambda表达

Java 8 lambda表达式示例 我个人对Java 8发布非常激动&#xff0c;尤其是lambda表达式和流API。越来越多的了解它们&#xff0c;我能写出更干净的代码。虽然一开始并不是这样。第一次看到用lambda表达式写出来的Java代码时&#xff0c;我对这种神秘的语法感到非常失望&#xff…

freebsd查询php5的版本,FreeBSD下查看各软件版本命令

查看FreeBSD版本&#xff1a; uname -aroot# uname -aFreeBSD power 8.1-RELEASE FreeBSD 8.1-RELEASE #0: Mon Jul 19 02:36:49 UTC 2010 rootmason.cse.buffalo.edu:/usr/obj/usr/src/sys/GENERIC amd64查看apache版本&#xff1a; apachectl -vroot#apachectl -vServ…

日期 日历 时区 地区 格式化 API 案例 MD

Markdown版本笔记我的GitHub首页我的博客我的微信我的邮箱MyAndroidBlogsbaiqiantaobaiqiantaobqt20094baiqiantaosina.com目录 目录常用案例判断是今天还是明天计算两个日期间相差几天增加或减少一定的时间判断缓存是否过期获取一个时间&#xff0c;要求当月有31天SimpleDateF…

kodi刮削器 中文_教你PLEX插件播放4K不能使用KODI解码导致卡顿的解决办法

文章作者Hao4K用户nothero自从买了这个索尼9500g&#xff0c;三天两头的出问题&#xff0c;而且还经常重启&#xff0c;经常卡顿。大法的画质确实不错&#xff0c;但是这系统稳定性实在是不敢恭维...最近装了一个KODI-PLEX插件&#xff0c;安利安利{:4_96:}&#xff0c;画面实在…

php js分页插件怎么引用,js分页展示控件,传入简单参数就能使用的分页效果控件...

kkpager v1.3js分页展示控件&#xff0c;传入简单参数就能使用的分页效果控件准备工作,引入js、cssHTML DOM容器调用方法1、使用link模式getLink 参数需要按需要重写。2、使用click模式(自定义跳转函数)click 参数需要按需要重写,而getHref一般需要配置。必选参数pno 当前页码t…

python下载文件保存_从URL下载文件并将其保存在Python文件夹中

尝试使用stream选项&#xff1a;import os import requests def download(url: str, dest_folder: str): if not os.path.exists(dest_folder): os.makedirs(dest_folder) # create folder if it does not exist filename url.split(/)[-1].replace(" ", "_&qu…

Delphi TXLSReadWriteII导出Excel

TXLSReadWriteII导出Excle (有点复杂&#xff0c;可以自己简化一下&#xff0c;直接从项目中抓取的)procedure TformSubReport.DataToExcel(_Item: Integer; _Obj: TObject); //导出Exclevari, j, k: Integer;aVendorObj: TVendor;aEnterpriseObj: TEn…