微信网页授权(OAuth2.0) PHP 源码简单实现


Posted in PHP onAugust 29, 2016

提要: 

1. 建议对OAuth2.0协议做一个学习。 

2. 微信官方文档和微信官网工具要得到充分利用。 
比较简单,直接帖源代码了。其中“xxxxxxxxxx”部分,是需要依据自己环境做替换的

/**
  * OAuth2.0微信授权登录实现
  *
  * @author zzy
  * @文件名:GetWxUserInfo.php
  */

 // 回调地址
 $url = urlencode("http://www.xxxxxxxxx.com/GetWxUserInfo.php");
 // 公众号的id和secret
 $appid = 'xxxxxxxxx';
 $appsecret = 'xxxxxxxxx';
 session_start();

 
 // 获取code码,用于和微信服务器申请token。 注:依据OAuth2.0要求,此处授权登录需要用户端操作
 if(!isset($_GET['code']) && !isset($_SESSION['code'])){
  echo 
  '<a href="https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx6c11a252ff1d00c4
  &redirect_uri='.$url.'&response_type=code&scope=snsapi_userinfo&state=1#wechat_redirect">
  <font style="font-size:30">授权</font></a>';
  
  exit;
 }
 
 // 依据code码去获取openid和access_token,自己的后台服务器直接向微信服务器申请即可
 if (isset($_GET['code']) && !isset($_SESSION['token'])){
  $_SESSION['code'] = $_GET['code'];
  
  $url="https://api.weixin.qq.com/sns/oauth2/access_token?appid=".$appid.
   "&secret=".$appsecret."&code=".$_GET['code']."&grant_type=authorization_code";
  $res = https_request($url);
  $res=(json_decode($res, true));
  $_SESSION['token'] = $res;
 }
 
 print_r($_SESSION);
 
 // 依据申请到的access_token和openid,申请Userinfo信息。
 if (isset($_SESSION['token']['access_token'])){
  $url = "https://api.weixin.qq.com/sns/userinfo?access_token=".$_SESSION['token']['access_token']."&openid=".$_SESSION['token']['openid']."&lang=zh_CN";
  echo $url;
  $res = https_request($url);
  $res = json_decode($res, true);
  
  $_SESSION['userinfo'] = $res;

 }
 
 print_r($_SESSION);

 // cURL函数简单封装
 function https_request($url, $data = null)
 {
  $curl = curl_init();
  curl_setopt($curl, CURLOPT_URL, $url);
  curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
  curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
  if (!empty($data)){
   curl_setopt($curl, CURLOPT_POST, 1);
   curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
  }
  curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
  $output = curl_exec($curl);
  curl_close($curl);
  return $output;
 }

得到正确结果如下:

Array
(
 [code] => 041GZI4l0tvGHg10N75l05FQ4l0GZI42
 [token] => Array
  (
   [access_token] => TWo6w5QMpzTZibu3FPh2k4EdC5bllp4sGeQkC4NbZtj-zti-ctZj1SrrNL1qGCf2lB1-6o3N7kh2bcxl5bxtQqJEGk1cq12l8CzF40R9XvA
   [expires_in] => 7200
   [refresh_token] => Iz3olCrkqPBOJvSSH2bOKvA09Sjvsp1c8Ltm7MvxxPfQXSbvI_WoVmzhjqASzwlMa7TAGgsg3mIJmaHjL7jrJHDqUF1jKbhd6GNDnLtXq0U
   [openid] => ota_XwQ4r_5nioVmshQ
   [scope] => snsapi_userinfo
  )

 [userinfo] => Array
  (
   [openid] => ota_XwQ4r_5nioVmshQq
   [nickname] => 野狐
   [sex] => 1
   [language] => zh_CN
   [city] => 杭州
   [province] => 浙江
   [country] => 中国
   [headimgurl] => http://wx.qlogo.cn/mmopen/PiajxSqBRaELwee7rhrt2ibnkC1MEnu04WiaWrw9FkuPBbGOgnrMbynNoEuxicgXOetW5VqQbTrS4fZDXNvAWsz6GQ/0
   [privilege] => Array
    (
    )

  )

)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
php park、unpark、ord 函数使用方法(二进制流接口应用实例)
Oct 19 PHP
PHP删除数组中特定元素的两种方法
Jul 02 PHP
从零开始学YII2框架(五)快速生成代码工具 Gii 的使用
Aug 20 PHP
PHP中使用数组指针函数操作数组示例
Nov 19 PHP
thinkPHP2.1自定义标签库的导入方法详解
Jul 20 PHP
Yii框架表单提交验证功能分析
Jan 07 PHP
IIS 7.5 asp Session超时时间设置方法
Apr 17 PHP
php使用ftp实现文件上传与下载功能
Jul 21 PHP
PHP实践教程之过滤、验证、转义与密码详解
Jul 24 PHP
ThinkPHP like模糊查询,like多匹配查询,between查询,in查询,一般查询书写方法
Sep 26 PHP
PHP程序员必须知道的两种日志实例分析
May 14 PHP
PHP number_format函数原理及实例解析
Jul 14 PHP
Laravel 5.3 学习笔记之 错误&amp;日志
Aug 28 #PHP
Laravel 5.3 学习笔记之 配置
Aug 28 #PHP
Laravel 5.3 学习笔记之 安装
Aug 28 #PHP
PHP实现导出带样式的Excel
Aug 28 #PHP
Linux系统中为php添加pcntl扩展
Aug 28 #PHP
mac系统下为 php 添加 pcntl 扩展
Aug 28 #PHP
PHP编写简单的App接口
Aug 28 #PHP
You might like
快速配置PHPMyAdmin方法
2008/06/05 PHP
Thinkphp多文件上传实现方法
2014/10/31 PHP
PHP实现的折半查询算法示例
2017/10/09 PHP
In Javascript Class, how to call the prototype method.(three method)
2007/01/09 Javascript
基于jquery的jqDnR拖拽溢出的修改
2011/02/12 Javascript
零基础搭建Node.js、Express、Ejs、Mongodb服务器及应用开发入门
2014/12/20 Javascript
JS 对象属性相关(检查属性、枚举属性等)
2015/04/05 Javascript
实例详解angularjs和ajax的结合使用
2015/10/22 Javascript
基于html5和nodejs相结合实现websocket即使通讯
2015/11/19 NodeJs
基于jQuery实现选取月份插件附源码下载
2015/12/28 Javascript
Bootstrap基本样式学习笔记之标签(5)
2016/12/07 Javascript
JavaScript+Html5实现按钮复制文字到剪切板功能(手机网页兼容)
2017/03/30 Javascript
nodejs服务搭建教程 nodejs访问本地站点文件
2017/04/07 NodeJs
vue基于mint-ui的城市选择3级联动的示例
2017/10/25 Javascript
vue项目中用cdn优化的方法
2018/01/03 Javascript
javascript代码优化的8点总结
2018/01/29 Javascript
pace.js和NProgress.js两个加载进度插件的一点小总结
2018/01/31 Javascript
小程序scroll-view安卓机隐藏横向滚动条的实现详解
2019/05/16 Javascript
Node.js 实现简单的无侵入式缓存框架的方法
2019/07/21 Javascript
JavaScript获取当前url路径过程解析
2019/12/27 Javascript
Python安装使用命令行交互模块pexpect的基础教程
2016/05/12 Python
python3实现ftp服务功能(客户端)
2017/03/24 Python
OPENCV去除小连通区域,去除孔洞的实例讲解
2018/06/21 Python
Python Pandas分组聚合的实现方法
2019/07/02 Python
python查看数据类型的方法
2019/10/12 Python
Pycharm 2020最新永久激活码(附最新激活码和插件)
2020/09/17 Python
Python3+selenium配置常见报错解决方案
2020/08/28 Python
美国最大的存储市场:SpareFoot
2018/07/23 全球购物
销售人员自我评价怎么写
2013/09/19 职场文书
项目开发计划书
2014/01/09 职场文书
硕士研究生求职自荐信范文
2014/03/11 职场文书
高中学生评语大全
2014/04/25 职场文书
双拥工作宣传标语
2014/06/26 职场文书
2015年万圣节活动总结
2015/03/24 职场文书
小学见习报告
2015/06/23 职场文书
Python requests库参数提交的注意事项总结
2021/03/29 Python