微信网页授权(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新手上路(六)
Oct 09 PHP
56.com视频采集接口程序(PHP)
Sep 22 PHP
php中3种方法统计字符串中每种字符的个数并排序
Aug 27 PHP
浅析PHP编程中10个最常见的错误
Aug 08 PHP
php的ddos攻击解决方法
Jan 08 PHP
php获取字符串中各个字符出现次数的方法
Feb 23 PHP
php使用wordwrap格式化文本段落的方法
Mar 17 PHP
PHP getName()函数讲解
Feb 03 PHP
php+ajax实现商品对比功能示例
Apr 13 PHP
PHP开启目录引索+fancyindex漂亮目录浏览带搜索功能
Sep 23 PHP
关于laravel模板中生成URL的几种模式总结
Oct 18 PHP
php多进程中的阻塞与非阻塞操作实例分析
Mar 04 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
动漫定律:眯眯眼都是怪物!这些角色狠话不多~
2020/03/03 日漫
PHP中extract()函数的定义和用法
2012/08/17 PHP
PHP实现手机号码中间四位用星号(*)隐藏的自定义函数分享
2014/09/27 PHP
PHP之密码加密的几种方式
2015/07/29 PHP
PHP给文字内容中的关键字进行套红处理
2016/04/12 PHP
Laravel使用消息队列需要注意的一些问题
2017/12/13 PHP
dreamweaver 安装Jquery智能提示
2011/04/02 Javascript
JQUERY的属性选择符和自定义选择符使用方法(二)
2011/04/07 Javascript
Javascript Request获取请求参数如何实现
2012/11/28 Javascript
JQuery入门—编写一个简单的JQuery应用案例
2013/01/03 Javascript
jquery动态加载select下拉框示例代码
2013/12/10 Javascript
js获取当前时间显示在页面上并每秒刷新
2014/12/24 Javascript
JQuery插件Quicksand实现超炫的动画洗牌效果
2015/05/03 Javascript
基于socket.io+express实现多房间聊天
2016/03/17 Javascript
Bootstrap fileinput文件上传预览插件使用详解
2017/05/16 Javascript
VueJs里利用CryptoJs实现加密及解密的方法示例
2019/04/29 Javascript
layui加载数据显示loading加载完成loading消失的实例代码
2019/09/23 Javascript
Python MySQLdb Linux下安装笔记
2015/05/09 Python
Linux 发邮件磁盘空间监控(python)
2016/04/23 Python
pytorch 输出中间层特征的实例
2019/08/17 Python
python实现百度OCR图片识别过程解析
2020/01/17 Python
Python爬取新型冠状病毒“谣言”新闻进行数据分析
2020/02/16 Python
Python中使用filter过滤列表的一个小技巧分享
2020/05/02 Python
Django 实现 Websocket 广播、点对点发送消息的代码
2020/06/03 Python
python操作微信自动发消息的实现(微信聊天机器人)
2020/07/14 Python
python里反向传播算法详解
2020/11/22 Python
日本食品网上商店:JaponShop.com
2017/11/28 全球购物
MySQL面试题
2014/01/12 面试题
2015年小学开学寄语
2015/02/27 职场文书
2015年财务工作总结范文
2015/03/31 职场文书
培训通知书模板
2015/04/17 职场文书
电影雨中的树观后感
2015/06/15 职场文书
羊脂球读书笔记
2015/06/30 职场文书
公司员工培训管理制度
2015/08/04 职场文书
Python趣味挑战之给幼儿园弟弟生成1000道算术题
2021/05/28 Python
mysql中between的边界,范围说明
2021/06/08 MySQL