[TOC]
# 简介
OAuth2.0鉴权
![](https://box.kancloud.cn/cfbbe40456de29136d9a421b5fc1d7df_1242x692.png)
# 设置微信授权域名
![](https://box.kancloud.cn/050ff0e8dc2da3cd07f44203d012d639_1092x211.png)
![](https://box.kancloud.cn/378121699fdf992af413650b3e2696a3_558x455.png)
# 网页授权开发工具
为了帮助开发者简单和高效地开发和调试微信公众号,推出了全新的 微信开发者工具,集成了公众号网页调试和小程序调试两种开发模式
下载地址:
https://developers.weixin.qq.com/miniprogram/dev/devtools/download.html
![](https://box.kancloud.cn/598a6874766b42a99a2bd237ca5ade22_542x255.png)
![](https://box.kancloud.cn/9fb7eab432fcee6b9b42ea90888a545c_362x448.png)
![](https://box.kancloud.cn/d7daf9bc99e459b43158aeccbf1da25b_1217x568.png)
# 微信授权代码实现
https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842
![](https://box.kancloud.cn/7e77f6917a59171a7220c780e77bf440_1061x187.png)
base此权限只能获取用户的openid而得不到用户的基本信息,授权是无感,不需要用户确认就可以完成授权,静默方式。
userinfo 可能获取openid和用户的基本信息,需要用户确认
![](https://box.kancloud.cn/93f9162624f8debb6c2b39e95cf42024_514x216.png)
# 步骤
[https://mp.weixin.qq.com/wiki?t=resource/res\_main&id=mp1421140842](https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842)
## 获取code值
![](https://box.kancloud.cn/06177807884e3c7feaeb2f227b73f5d5_915x552.png)
![](https://box.kancloud.cn/39a1f71f819740d00492ae024aeac4c0_900x436.png)
在服务器中编写生成跳转地址url程序
~~~
<?php
$appid = 'wx77c5845xx9abaf8ad6'; //我写个假的防止别人使用
$secret = '8074c29bdfa71fdbex9debc19060275dc'; //我写个假的防止别人使用
// 授权成功后回调地址 请使用 urlEncode 对链接进行处理
$redirect_uri = urlencode('http://ns9aum.natappfree.cc/auth/shop.php');
//引导关注者打开如下页面
$url = 'https://open.weixin.qq.com/connect/oauth2/authorize?appid=%s&redirect_uri=%s&response_type=code&scope=snsapi_userinfo&state=100#wechat_redirect';
$url = sprintf($url, $appid, $redirect_uri);
//我们把输出的url放到微信开发者工具中,然后把这个url放到地址栏那,他会授权,然后跳转到$redirect_uri那
//echo $url;
//跳转
header('location:' . $url);
~~~
跳转的url的代码,这是授权成功后跳转的页面
`http://ns9aum.natappfree.cc/auth/shop.php`
~~~
<!doctype html>
<html lang="zh-Hans">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<pre>
<?php
var_dump($_GET);
?>
</pre>
</body>
</html>
~~~
输出
![](https://box.kancloud.cn/f3b6676cc56ae3bd6f6b5aecafaeed36_744x220.png)
**注意: code有效期是5分钟**
## 得到openid完成授权
![](https://box.kancloud.cn/01b75ee0428ca40d1d44f511f927920d_799x568.png)
![](https://box.kancloud.cn/605f3efb6e95350071ae9af8f4df47c0_795x708.png)
openid重要
![](https://box.kancloud.cn/343fc54326f7340a20bf002f00e3f159_841x269.png)
![](https://box.kancloud.cn/1dfffe9c6fcda0db12b59502d14928e1_845x348.png)
## 拉取用户信息
![](https://box.kancloud.cn/c28320a5fdee976372d614e0b0dad61b_833x579.png)
![](https://box.kancloud.cn/0d0be59aeb7e0c9145a4b32d97cdc96d_903x390.png)
shop.php
~~~
<?php
//appid公众号
$appid = 'wx77c58459abaf8ad6';
$secret = '8074c29bdfa71fdbe9debc19060275dc';
//得到code
$code = $_GET['code'];
$url = 'https://api.weixin.qq.com/sns/oauth2/access_token?appid=%s&secret=%s&code=%s&grant_type=authorization_code';
$url = sprintf($url,$appid,$secret,$code);
// 发起get请求, http_request是封装的curl方法
$json = http_request($url);
# json 转为 array
$arr = json_decode($json,true);
$access_token = $arr['access_token'];
$openid = $arr['openid'];
// 拉取用户信息
$url = 'https://api.weixin.qq.com/sns/userinfo?access_token=%s&openid=%s&lang=zh_CN';
$url = sprintf($url,$access_token,$openid);
// 发起get请求
$json = http_request($url);
# json 转为 array
$userinfo = json_decode($json,true);
//var_dump($userinfo);
function http_request($url,$ret='',$file=''){
if (!empty($file)) { // 有文件上传
# php5.5之前 '@'.$file;就可以进地文件上传
# $ret['pic'] = '@'.$file;
# php5.6之后用此方法
$ret['media'] = new CURLFile($file);
}
// 初始化
$ch = curl_init();
// 相关设置
# 设置请求的URL地址
curl_setopt($ch,CURLOPT_URL,$url);
# 请求头关闭
curl_setopt($ch,CURLOPT_HEADER,0);
# 请求的得到的结果不直接输出,而是以字符串结果返回 必写
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
# 设置请求的超时时间 单位秒
curl_setopt($ch,CURLOPT_TIMEOUT,30);
# 设置浏览器型号
curl_setopt($ch,CURLOPT_USERAGENT,'MSIE001');
# 证书不检查
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,0);
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,0);
# 设置为post请求
if($ret){ # 如果 $ret不为假则是post提交
# 开启post请求
curl_setopt($ch,CURLOPT_POST,1);
# post请求的数据
curl_setopt($ch,CURLOPT_POSTFIELDS,$ret);
}
// 发起请求
$data = curl_exec($ch);
// 有没有发生异常
if(curl_errno($ch) > 0){
// 把错误发送给客户端
echo curl_error($ch);
$data = '';
}
// 关闭请求
curl_close($ch);
return $data;
}
?>
<!doctype html>
<html lang="zh-Hans">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<div class="user">
<p>openid:<?php echo $openid;?></p>
<p>昵称:<?php echo $userinfo['nickname'];?></p>
<p>性别:<?php echo $userinfo['sex']==1 ? '先生' : '靓妹';?></p>
<p>
头像:
<img src="<?php echo $userinfo['headimgurl'] ?>" style="width: 300px;">
</p>
<p>还有省市</p>
</div>
</body>
</html>
~~~
小结:
* 生成跳转的url地址,得到了code
* 用code换取access_token和openid,完成授权
* 非必须的,如果是userinfo授权,则可以获取用户的基本信息
- 配置
- composer安装
- composer用法
- composer版本约束表达
- phpstorm
- sftp文件同步
- php类型约束
- laradock
- 配置文件缓存详解
- git
- 自定义函数
- 核心概念
- IOC
- 服务提供者
- Facade
- 契约
- 生命周期
- 路由
- 请求
- 命名路由
- 路由分组
- 资源路由
- 控制器路由
- 响应宏
- 响应
- Command
- 创建命令
- 定时任务
- console路由
- 执行用户自定义的定时任务
- artisan命令
- 中间件
- 创建中间件
- 使用中间件
- 前置和后置
- 详细介绍
- 访问次数限制
- 为 VerifyCsrfToken 添加过滤条件
- 单点登录
- 事件
- 创建
- ORM
- 简介
- DB类
- 配置
- CURD
- queryScope和setAttribute
- 查看sql执行过程
- 关联关系
- 一对一
- 一对多
- 多对多
- 远程关联
- 多态一对多
- 多态多对多
- 关联数据库的调用
- withDefault
- 跨模型更新时间戳
- withCount,withSum ,withAvg, withMax,withMin
- SQL常见操作
- 模型事件
- 模型事件详解
- 模型事件与 Observer
- deleted 事件未被触发
- model validation
- ORM/代码片段
- Repository模式
- 多重where语句
- 中间表类型转换
- Collection集合
- 新增的一些方法
- 常见用法
- 求和例子
- 机场登机例子
- 计算github活跃度
- 转化评论格式
- 计算营业额
- 创建lookup数组
- 重新组织出表和字段关系并且字段排序
- 重构循环
- 其他例子
- 其他问题一
- 去重
- 第二个数组按第一个数组的键值排序
- 搜索ES
- 安装
- 表单
- Request
- sessiom
- Response
- Input
- 表单验证
- 简介
- Validator
- Request类
- 接口中的表单验证
- Lumen 中自定义表单验证返回消息
- redis
- 广播事件
- 发布订阅
- 队列
- 守护进程
- redis队列的坑
- beanstalkd
- rabbitmq
- redis队列
- 日志模块
- 错误
- 日志详解
- 数据填充与迁移
- 生成数据
- 数据填充seed
- migrate
- 常见错误
- Blade模板
- 流程控制
- 子视图
- URL
- 代码片段
- Carbon时间类
- 一些用法
- 邮件
- 分页
- 加密解密
- 缓存
- 文件上传
- 优化
- 随记
- 嵌套评论
- 判断字符串是否是合法的 json 字符串
- 单元测试
- 计算出两个日期的diff
- 自定义一个类文件让composer加载
- 时间加减
- 对象数组互转方法
- 用户停留过久自动退出登录
- optional 辅助方法
- 文件下载
- Api
- Dingo api
- auth.basic
- api_token
- Jwt-Auth
- passport
- Auth
- Authentication 和 Authorization
- Auth Facade
- 授权策略
- Gates
- composer包
- debug包
- idehelp包
- image处理
- 验证码
- jq插件
- 第三方登录
- 第三方支付
- log显示包
- 微信包
- xss过滤
- Excel包
- MongoDB
- php操作
- 聚合查询
- 发送带附件邮件
- 中文转拼音包
- clockwork网页调试
- emoji表情
- symfony组件
- swooletw/laravel-swoole
- 常见问题
- 跨域问题
- Laravel队列优先级的一个坑
- cache:clear清除缓存问题
- .env无法读取
- 源码相关基础知识
- __set和__get
- 依赖注入、控制反转和依赖倒置原则
- 控制反转容器(Ioc Container)
- 深入服务容器
- call_user_func
- compact
- 中间件简易实现
- array_reduce
- 中间件实现代码
- Pipeline管道操作
- composer自动加载
- redis延时队列
- 了解laravel redis队列
- cli
- 源码解读
- Facade分析
- Facade源码分析
- IOC服务容器
- 中间件原理
- 依赖注入浅析
- 微信
- 微信公众号
- 常用接收消息
- 6大接收接口
- 常用被动回复消息
- 接口调用凭证
- 自定义菜单
- 新增素材
- 客服消息
- 二维码
- 微信语音
- LBS定位
- 网页授权
- JSSDK
- easywechat
- 小程序
- 小程序配置app.json