微信网页授权(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常量的详解
Jun 09 PHP
Php无限级栏目分类读取的实现代码
Feb 19 PHP
zf框架的数据库追踪器使用示例
Mar 13 PHP
Javascript与PHP验证用户输入URL地址是否正确
Oct 09 PHP
Laravel实现用户注册和登录
Jan 23 PHP
php微信公众平台配置接口开发程序
Sep 22 PHP
PHP实现RTX发送消息提醒的实例代码
Jan 03 PHP
PHP安装memcache扩展的步骤讲解
Feb 14 PHP
PHP 代码简洁之道(小结)
Oct 16 PHP
Laravel框架处理用户的请求操作详解
Dec 20 PHP
PHP与Web页面交互操作实例分析
Jun 02 PHP
PhpStorm2020.1 安装 debug - Postman 调用的详细教程
Aug 17 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
PHP 字符串 小常识
2009/06/05 PHP
深入PHP数据缓存的使用说明
2013/05/10 PHP
PHP判断远程图片是否存在的几种方法
2014/05/04 PHP
smarty内置函数section的用法
2015/01/22 PHP
php利用事务处理转账问题
2015/04/22 PHP
PHP十六进制颜色随机生成器功能示例
2017/07/24 PHP
jquery tablesorter.js 支持中文表格排序改进
2009/12/09 Javascript
关于javascript DOM事件模型的两件事
2010/07/22 Javascript
Jquery + Ajax调用webService实例代码(asp.net)
2010/08/27 Javascript
深入理解JavaScript定时机制
2010/10/29 Javascript
浅析js中取绝对值的2种方法
2013/07/09 Javascript
详解AngularJS 模态对话框
2016/04/07 Javascript
Vue.js 父子组件通讯开发实例
2016/09/06 Javascript
JS实现的随机排序功能算法示例
2017/06/09 Javascript
利用Javascript获取选择文本所在的句子详解
2017/12/03 Javascript
Mint-UI时间组件起始时间问题及时间插件使用
2018/08/20 Javascript
使用react context 实现vue插槽slot功能
2019/07/18 Javascript
Vue.js标签页组件使用方法详解
2019/10/19 Javascript
vue父组件给子组件的组件传值provide inject的方法
2019/10/23 Javascript
JS模拟实现京东快递单号查询
2020/11/30 Javascript
python实现简单遗传算法
2018/03/19 Python
详解Django-auth-ldap 配置方法
2018/12/10 Python
对Python 获取类的成员变量及临时变量的方法详解
2019/01/22 Python
PYTHON实现SIGN签名的过程解析
2019/10/28 Python
Python爬虫之Selenium鼠标事件的实现
2020/12/04 Python
你应该知道的30个css选择器
2014/03/19 HTML / CSS
详解canvas drawImage()方法绘制图片不显示的问题
2018/10/08 HTML / CSS
String是最基本的数据类型吗?
2013/06/13 面试题
金山毒霸系列的笔试题
2013/04/13 面试题
环境科学专业优秀毕业生自荐书
2014/02/03 职场文书
学生周末回家住宿长期请假条
2014/02/15 职场文书
统计岗位职责
2014/02/21 职场文书
农村葬礼主持词
2014/03/31 职场文书
出纳担保书范文
2014/04/02 职场文书
语文教研活动总结
2014/07/02 职场文书
借款协议书
2014/09/16 职场文书