导航:首页 > 编程语言 > php微信授权登陆

php微信授权登陆

发布时间:2024-12-13 00:21:35

php如何通过cookie获取微信授权登录前页面URl

PHP 的 $_COOKIE 变量用于取回 cookie 的值。
例子:

在下面的实例中,我们取回了名为 "user" 的 cookie 的值,并把它显示在了页面上:
<?php
echo$_COOKIE["user"];
print_r($_COOKIE);
?>

同时可以用setcookie() 函数设置 cookie。
语法:

setcookie(name, value, expire, path, domain);

在下面的例子中,我们将创建名为 "user" 的 cookie,并为它赋值 "Alex Porter"。我们也规定了此 cookie 在一小时后过期:

<?php
setcookie("user","AlexPorter",time()+3600);
?>

当删除 cookie 时,您应当使过期日期变更为过去的时间点。
删除的实例:

<?php
//
setcookie("user","",time()-3600);
?>
具体而言,登录授权流程分为四步:
1、引导用户进入授权页面同意授权,获取code
2、通过code换取网页授权access_token(与基础支持中的access_token不同)
3、如果需要,开发者可以刷新网页授权access_token,避免过期
4、通过网页授权access_token和openid获取用户基本信息(支持UnionID机制)

② php微站微信公众号授权登录

php微站微信公众号授权登录,即在微信客户端的浏览器里面授权登录
1.getBaseInfo.php文件获取code ?php //1.获取到code $appid = "***************"; $redirect_uri = urlencode("http://**********.com/weixin_wap_shouquan/getWxCode.php"); $url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=".$appid."redirect_uri=".$redirect_uri."response_type=codescope=snsapi_userinfostate=0#wechat_redirect"; header("Location:".$url); ?
2.getWxCode.php文件获取微信用户信息并存入数据库 ?php require_once './httpCurl.php'; require_once './MySQLiDb.class.php'; //2.获取到网页授权的access_token $appid = "******************"; $app_secret = "************************"; $code = isset($_GET["code"])? trim($_GET["code"]) : ""; $url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=".$appid."secret=".$app_secret."code=".$code."grant_type=authorization_code"; /*$res = object(stdClass)#1 (6) { ["access_token"]= string(107) "***************************" ["expires_in"]= int(7200) ["refresh_token"]= string(107) "****************************" ["openid"]= string(28) "***********************" ["scope"]= string(12) "snsapi_login" ["unionid"]= string(28) "**************************" }*/ //3.拉取用户的openid $res = json_decode(httpCurl($url)); $access_token = $res-access_token; $openid = $res-openid; //4获取用户信息 $userUrl = "https://api.weixin.qq.com/sns/userinfo?access_token=".$access_token."openid=".$openid; /*$userInfo = object(stdClass)#2 (10) { ["openid"]= string(28) "***********************" ["nickname"]= string(6) "***" ["sex"]= int(1) ["language"]= string(5) "zh_CN" ["city"]= string(7) "Baoding" ["province"]= string(5) "Hebei" ["country"]= string(2) "CN" ["headimgurl"]= string(140) "*******************************" ["privilege"]= array(0) { } ["unionid"]= string(28) "*************************" }*/ $userInfo = json_decode(httpCurl($userUrl)); //获取微信unionid $wx_unionid = $userInfo-unionid; $info = $db-getRow("SELECT * FROM user WHERE wx_unionid='$wx_unionid' LIMIT 1"); if (!!$info){ //跳转到登录页面 header("Location:/m/login_ajax.php?t=0wx_unionid=".$wx_unionid); }else{ //将微信用户信息存入数据库 $user_sn = randomString().$db-autoId("user"); $res = $db-query("INSERT INTO user (user_sn,auth_type,wx_unionid,wx_nickname,wx_avatar,wx_sex,add_time,wx_open_id) VALUES('$user_sn','0','$wx_unionid','$userInfo-nickname','$userInfo-headimgurl','$wx_sex',now(),'$openid')"); if (!!$res){ header("Location:/m/login_ajax.php?t=0wx_unionid=".$wx_unionid); }else{ header("Location:/m/login.php"); } } /* * 获取随机串 * */ function randomString($type=1,$length=4){ if ($type == 1){ $chars = join("",range(0,9)); }elseif ($type == 2){ $chars = join("",array_merge(range("a","z"),range("A","Z"))); }elseif ($type == 3){ $chars = join("",array_merge(range("a","z"),range("A","Z"),range(0,9))); } if ($length strlen($chars)){ exit("字符串长度不够"); } $chars = str_shuffle($chars); return substr($chars,0,$length); } ?
3.httpCurl.php文件 ?php function httpCurl($url, $method="", $postfields = null, $headers = array(), $debug = false) { $ci = curl_init(); /* Curl settings */ curl_setopt($ci, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); curl_setopt($ci, CURLOPT_CONNECTTIMEOUT, 30); curl_setopt($ci, CURLOPT_TIMEOUT, 30); curl_setopt($ci, CURLOPT_RETURNTRANSFER, true); switch ($method) { case 'POST': curl_setopt($ci, CURLOPT_POST, true); if (!empty($postfields)) { curl_setopt($ci, CURLOPT_POSTFIELDS, $postfields); } break; } if ( strlen( $url ) 5 strtolower( substr( $url , 0 , 5 ) ) == 'https' ){ curl_setopt( $ci , CURLOPT_SSL_VERIFYPEER , FALSE ); curl_setopt( $ci , CURLOPT_SSL_VERIFYHOST , FALSE ); } curl_setopt($ci, CURLOPT_URL, $url); curl_setopt($ci, CURLOPT_HTTPHEADER, $headers); curl_setopt($ci, CURLINFO_HEADER_OUT, true); $response = curl_exec($ci); //  $http_code = curl_getinfo($ci, CURLINFO_HTTP_CODE); $http_code = curl_getinfo($ci); if ($debug) { echo "=====post data======\r\n"; var_mp($postfields); echo '=====info=====' . "\r\n"; print_r(curl_getinfo($ci)); echo '=====$response=====' . "\r\n"; print_r($response); } curl_close($ci); return $response; } ?
4.MySQLiDb.class.php文件 ?php //连接数据库 class MySQLiDb{ private $dbhost; // 数据库主机 private $dbuser; // 数据库用户名 private $dbpass; // 数据库用户名密码 private $dbname; // 数据库名 private $link; //数据库链接本身 private $charset; // 数据库编码,GBK,UTF8,gb2312 private $sql;//最后一次执行的sql语句 //初始化类 public function __construct($dbhost, $dbuser, $dbpass, $dbname = '', $charset = 'utf8'){ $this-dbhost = $dbhost; $this-dbuser = $dbuser; $this-dbpass = $dbpass; $this-dbname = $dbname; $this-charset = strtolower(str_replace('-', '', $charset)); $this-link = new mysqli($this-dbhost,$this-dbuser,$this-dbpass,$this-dbname); if($this-error()){ $errorInfo='Error:Could not make a database link ('.$this-errno().')'.$this-error(); throw new ErrorException($errorInfo, 1); } $this-setCharset($this-charset); } /** * @param 设置字符集 */ private function setCharset($charset){ $this-link-set_charset($charset); } /** * 数据库执行语句,可执行查询添加修改删除等任何sql语句 * @access public * @param $sql string 查询sql语句 * @return $result,成功返回资源,失败则输出错误信息,并退出 */ public function query($sql){ $this-sql = $sql; $result = $this-link-query($this-sql); if (!$result) { return false; // die($this-errno().':'.$this-error().'br /出错语句为'.$this-sql.'br /'); } return $result; } /** * 拼装查询的sql语句 * @param $tablename 数据表名称 * @param $opts 查询的元素 * @param $where 条件 数组或字符串 * @param $order 排序条件 * @return 返回sql语句 */ public function selectSql($tablename,$opts=array(),$where=" 1=1 ",$order=" id DESC "){ if (empty($opts)){ $fields = "*"; }else{ $opts = $this-cleanseArray($opts); $keys = array_keys($opts); $vals = array_values($opts); $fields = ""; for ($i = 0; $i count($keys); $i++) { if ($fields == ""){ $fields = $vals[$i]; } else { $fields = $fields.",".$vals[$i].""; } } } if (is_array($where)){ $whereArr = $this-cleanseArray($where); $keysWhere = array_keys($whereArr); $valsWhere = array_values($whereArr); $whereString = ""; for ($j = 0; $j count($keysWhere); $j++) { if ($whereString == ""){ $whereString = $keysWhere[$j]." = '".$valsWhere[$j]."'"; } else { $whereString = $whereString." AND ".$keysWhere[$j]." = '".$valsWhere[$j]."'"; } } }else{ $whereString = $where; } $sql = "SELECT ".$fields." FROM ".$tablename." WHERE ".$whereString." ORDER BY ".$order; return $sql; } /** * 更新的通用语句 * @param $tablename 数据表名称 * @param $opts 更新的元素 * @param $where 条件 数组或字符串 * @return 影响的行数 */ public function genericUpdate($tablename, $opts, $where) { $opts = $this-cleanseArray($opts); $keys = array_keys($opts); $vals = array_values($opts); $setString = ""; $whereString = ""; for ($i = 0; $i count($keys); $i++) { if ($setString == ""){ $setString = $keys[$i]." = '".$vals[$i]."'"; } else { $setString = $setString.", ".$keys[$i]." = '".$vals[$i]."'"; } } if (is_array($where)){ $whereArr = $this-cleanseArray($where); $keysWhere = array_keys($whereArr); $valsWhere = array_values($whereArr); for ($j = 0; $j count($keysWhere); $j++) { if ($whereString == ""){ $whereString = $keysWhere[$j]." = '".$valsWhere[$j]."'"; } else { $whereString = $whereString." AND ".$keysWhere[$j]." = '".$valsWhere[$j]."'"; } } }else{ $whereString = $where; } $sql = "UPDATE `$tablename` SET ".$setString." WHERE ".$whereString; $result = $this-query($sql); if (!!$result){ return $this-affectedRows(); }else{ return false; } } /** * 删除的通用语句 * @param $tablename 数据表名称 * @param $where 条件 数组或字符串 * @return 影响的行数 */ function genericDelete($tablename, $where="1") { $whereString = ""; if (is_array($where)){ $whereArr = $this-cleanseArray($where); $keysWhere = array_keys($whereArr); $valsWhere = array_values($whereArr); for ($j = 0; $j count($keysWhere); $j++) { if ($whereString == ""){ $whereString = $keysWhere[$j]." = '".$valsWhere[$j]."'"; } else { $whereString = $whereString." AND ".$keysWhere[$j]." = '".$valsWhere[$j]."'"; } } }else{ $whereString = $where; } $sql = "DELETE FROM ". $tablename . " WHERE " . $whereString; $result = $this-query($sql); if (!!$result){ return $this-affectedRows(); }else{ return false; } } /** * 过滤字符串 * @param 字符串 * @param string $char * @return $cleansed */ private function cleansePureString($str, $char = '\\') { ///[^a-zA-Z0-9\s]/ NON ALPHA $cleansed = preg_replace("/[%_'\"]/", '', $str); //_, % and ' return $cleansed; } /** * 过滤数组 * @param unknown $opts * @return multitype:$cleansed */ private function cleanseArray($opts) { $cleansedArray = array(); $keys = array_keys($opts); $vals = array_values($opts); for ($i = 0; $i count($keys); $i++) { $newKey = $this-cleansePureString($keys[$i],"'"); $newVal = $this-cleansePureString($vals[$i],"'"); $cleansedArray[$newKey] = $newVal; } return $cleansedArray; } /** * return 返回一个字符串指出了客户端库的版本 */ public function clientInfo(){ return $this-link-client_info; } /** * return 作为一个整数返回MySQL服务器的版本 */ public function clientVersion(){ return $this-link-client_version; } /** * 获取结果集中行的数目 * @access private * @return 结果集中行的数目 */ function numRows($sql) { $result = $this-query($sql); if (!!$result){ $nums = $result-num_rows; return $nums; }else{ return false; } } /** * 获取第一条记录的第一个字段 * @access public * @param $sql string 查询的sql语句 * @return 返回一个该字段的值 */ public function getOne($sql){ $result = $this-query($sql); if (!!$result) { $row = $result-fetch_row(); return $row[0]; } else { return false; } } /** * 获取一条记录 * @access public * @param $sql 查询的sql语句 * @return array 关联数组 */ public function getRow($sql){ $result = $this-query($sql); if ($result) { $row = $result-fetch_assoc(); return $row; } else { return false; } } /** * 获取所有的记录 * @access public * @param $sql 执行的sql语句 * @return $list 返回所有记录组成的二维数组 */ public function getAll($sql){ $result = $this-query($sql); $list = array(); if (!!$result){ while (!!($row = $result-fetch_assoc())){ $list[] = $row; } return $list; }else{ return false; } } /** * 获取某一列的值 * @access public * @param $sql string 执行的sql语句 * @return $list array 返回由该列的值构成的一维数组 */ public function getCol($sql){ $result = $this-query($sql); $list = array(); if (!!$result){ while (!!($row = $result-fetch_row())) { $list[] = $row[0]; } return $list; }else{ return false; } } /** * 获取上一步insert操作产生的id */ public function getInsertId(){ return $this-link-insert_id; } /** * 获取下一个自增(id)值 * @param $tablename 数据表名 */ public function autoId($tablename) { return $this-getOne("SELECT auto_increment FROM information_schema.`TABLES` WHERE TABLE_SCHEMA='" . $this-dbname . "' AND TABLE_NAME = '" . trim($tablename, '`') . "'"); } /** * 获取影响的记录行数 * @access private * @return 前一次 MySQL 操作所影响的记录行数 */ public function affectedRows() { return $this-link-affected_rows; } /** * 返回结果集中字段的数 * @access public * @param $sql string 执行的sql语句 * @return 结果集中字段的数 */ public function numFields($sql) { $result = $this-query($sql); return $result-field_count; } /** * 释放结果内存 * @access public * @param $result 要释放的结果标识符 * @return 释放结果内存 */ public function freeResult($result) { return $result-free(); } /** * 关闭先前打开的数据库连接 */ public function close(){ $this-link-close(); } /** * 获取错误号 * @access private * @return 错误号 */ private function errno(){ return $this-link-connect_errno; } /** * 获取错误信息 * @access private * @return 错误private信息 */ private function error(){ return $this-link-connect_error; } //开启事务 public function startTransaction(){ $this-link-autocommit(FALSE); } //提交事务 public function commit(){ $this-link-commit(); $this-link-autocommit(TRUE); } //回滚事务 public function rollback(){ $this-link-rollback(); } } header("Content-type:text/html; charset=UTF-8"); // database host $dbhost  = "localhost"; // database name $dbname  = "***"; // database username $dbuser  = "***"; // database password $dbpass  = "****"; // 字符集 $charset = 'utf8'; $db = new MySQLiDb($dbhost, $dbuser, $dbpass, $dbname, $charset); ?
5.目录结构

③ 怎么样使用php的laravel框架快速集成微信登录

1. 安装php_weixin_provider
在项目下运行composer require thirdproviders/weixin,即可完成安装。安装成功后,在项目的vendor目录下应该能看到php_weixin_provider的库文件:
image
2. 配置微信登录的参数
一共有7个参数可以配置,分别是:
client_id:对应公众号创建的应用appid
client_secret:对应公众号创建的应用appid
redirect:对应微信授权成功后的回调地址
proxy_url:对应微信授权的代理服务地址(其作用可阅读这篇文章了解)
device:区别是PC端微信登录还是移动端微信登录,默认值为pc,如果是移动端,可设置为空
state_cookie_name:授权链接中会包含随机的state参数,这个参数在微信回调的时候会原封不动的返回来,届时可通过验证state参数是否与授权链接中传入的参数相同,来判断请求是否有效,防止CSRF攻击。这个方案,会在授权时把state参数先存到cookie里面,所以这个参数用来指定这个state参数存入的cookie名称,默认值是wx_state_cookie
state_cookie_time:指定wx_state_cookie的有效时长,默认是5分钟
这七个参数有2种设置方式。
第一种是把这些参数以大写的形式配置到.env配置文件里面:
image
注:1、每个配置项都是大写,且以WEIXIN_开头;2、前三个配置项与前面介绍的参数名称不完全一致,KEY对应client_id,SECRET对应client_secret,REDIRECT_URI对应redirect;3、其它的与前面介绍的参数名称一致。
第二种是把这些参数配置到config/services.php文件里面去:
image
这种方式的配置,每个配置项的名称与前面介绍的一致。
要注意的内容:
由于php_weixin_provider是基于laravel/socialite实现的,它要求必须配置client_id,client_secret和redirect,否则php_weixin_provider实例化过程就会出错;对于client_id和client_secret,我认为统一配置在一个地方是没有问题的,但是对于redirect,如果统一配置,不一定符合所有场景的需求,因为不是每一个用到微信登录的地方,最后的回调地址都是同一个;所以建议把redirect先配置成一个有效或无效非空的回调地址;反正在后面使用php_weixin_provider的时候还可以在调用的时候更改这个参数的值。
proxy_url如果有,也建议配置在公共的地方;
state_cookie_name和state_cookie_time由于都有默认值,基本上无需重新配置;
device可以在使用的时候再指定。
所有配置参数都可以在使用的时候重新指定。
3. 注册php_weixin_provider
在项目的config/app.php文件里面,找到providers配置节,把如下代码加到它的配置数组里面:
image
4. 注册第三方登录事件的监听
在项目的app/Providers/EventServiceProvider.php里面加入以下代码:
image
laravel框架整体上是一种IOC跟事件驱动的思想,熟悉js就会对事件驱动非常熟悉,熟悉设计模式,就会对IOC(控制反转,也称为DI:依赖注入)比较熟悉,这个是理解第3步和第4步配置作用的关键。
5. 编写微信登录的接口
举例如下:
+ View code
Socialite::with('weixin')会返回php_weixin_provider的实例,也就是它:
image
拿到这个实例之后,就可以采用链式的方式调用它提供的所有public方法,比如设置配置参数,setDevice等等。
6. 编写微信登录回调的接口
举例如下:
+ View code
通过Socialite::with('weixin')拿到php_weixin_provider实例后,调用user方法,就会自动跟微信调用相关接口,并把微信的返回值封装成对象返回。如果在此过程中,有任何错误都会以异常的形式抛出,比如state参数校验失败,比如code失效等。
返回的$user对象包含的有效属性有:
image
小结:
这个方案是基于laravel/socialite实现,并发布到composer来使用的。laravel/socialite是laravel官方提供的第三方登录的模块,基于它可以很方便的集成大部分第三方平台的认证,目前它官方已经提供很多第三方的登录实现:https://socialiteproviders.github.io/。除了国外的facebook,google,github等,国内的微信,微博,qq也都有提供。我在一开始也用的是它官方提供的默认的微信登录provider来做的,但是后来我发现了以下几个问题:
1. 不支持微信授权的代理;
2. pc端跟移动端竟然还是分两个项目来做的:
image
3. 它封装的user对象里竟然不包含unionid
4. 更改配置参数的方式,实在是让人觉得难以使用:
image
所以我就在它官方的微信登录provider基础上,按照自己的想法,重新实现了一个来解决我发现的这些问题

④ 紧急求助,微信设置“开发者中心”的 OAuth2.0网页授权设置

1.OAuth 2.0网页授权有两种模式:

‪(1)
Base(基本型),用户可直接通过链接访问,相应的微信公众账号只能获取用户的openid,无法获取到其它信息。

‪(2) Userinfo(用户信息型),访问时会弹出授权页面,同意后微信公众账号可以获取用户其它信息,比如昵称、头像、性别、省份等等。
具体的设置方法,你可以按照韩顺平的PHP微信开发课程来设置

阅读全文

与php微信授权登陆相关的资料

热点内容
离心式压缩机润滑油系统 浏览:54
文件夹清理手机内存方法 浏览:458
程序员头发冒烟是为什么 浏览:763
外卖小程序源码2021 浏览:530
espressopdf 浏览:642
尚硅谷和程序员哪个值得读 浏览:921
单片机窃取代码 浏览:211
智能排课算法 浏览:840
普林斯顿算法课视频 浏览:847
编程里的霸哥是什么意思 浏览:237
压缩空气铜管 浏览:176
帅哥程序员受欢迎么 浏览:616
rmedf调度算法 浏览:870
iso解压缩后gho消失 浏览:906
51单片机怎么设置多组闹钟 浏览:980
java显示html 浏览:439
做底图用什么app 浏览:710
吉林女程序员 浏览:580
和平精英怎么上一个服务器 浏览:230
android关闭音乐 浏览:213