微信网页授权(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 相关文章推荐
模拟OICQ的实现思路和核心程序(一)
Oct 09 PHP
用PHP和ACCESS写聊天室(八)
Oct 09 PHP
一个简单的php实现的MySQL数据浏览器
Mar 11 PHP
PHP中for循环语句的几种变型
Mar 16 PHP
用PHP实现维护文件代码
Jun 14 PHP
Zend Guard一些常见问题解答
Sep 11 PHP
php管理nginx虚拟主机shell脚本实例
Nov 19 PHP
php简单判断文本编码的方法
Jul 30 PHP
PHP+Ajax无刷新带进度条图片上传示例
Feb 08 PHP
ThinkPHP整合datatables实现服务端分页的示例代码
Feb 10 PHP
bindParam和bindValue的区别以及在Yii2中的使用详解
Mar 12 PHP
PHP7中I/O模型内核剖析详解
Apr 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
PHP二维数组的去重问题解析
2011/07/17 PHP
Laravel 解决composer相关操作提示php相关异常的问题
2019/10/23 PHP
PHP获取真实IP及IP模拟方法解析
2020/11/24 PHP
关于实现代码语法标亮 dp.SyntaxHighlighter
2007/02/02 Javascript
用JavaScrpt实现文件夹简单轻松加密的实现方法图文
2008/09/08 Javascript
Firebug入门指南(Firefox浏览器)
2010/08/21 Javascript
整理的比较全的event对像在ie与firefox浏览器中的区别
2013/11/25 Javascript
处理文本部分内容的TextRange对象应用实例
2014/07/29 Javascript
浅析javascript的return语句
2015/12/15 Javascript
浅谈window.onbeforeunload() 事件调用ajax
2016/06/29 Javascript
深入理解Angular2 模板语法
2016/08/07 Javascript
jquery select2的使用心得(推荐)
2016/12/04 Javascript
判断颜色是否合法的正则表达式(详解)
2017/05/03 Javascript
JavaScript无操作后屏保功能的实现方法
2017/07/04 Javascript
JS实现的tab页切换效果完整示例
2018/12/18 Javascript
结合axios对项目中的api请求进行封装操作
2020/09/21 Javascript
如何构建一个Vue插件并生成npm包
2020/10/26 Javascript
[01:00:17]DOTA2-DPC中国联赛 正赛 SAG vs Dynasty BO3 第二场 1月25日
2021/03/11 DOTA
Python实现批量把SVG格式转成png、pdf格式的代码分享
2014/08/21 Python
详解Python如何获取列表(List)的中位数
2016/08/12 Python
Python之re操作方法(详解)
2017/06/14 Python
python爬虫使用cookie登录详解
2017/12/27 Python
Python实现嵌套列表去重方法示例
2017/12/28 Python
python3实现带多张图片、附件的邮件发送
2019/08/10 Python
python线性插值解析
2020/07/05 Python
Collection和Collections的区别
2016/05/02 面试题
工程班组长岗位职责
2013/12/30 职场文书
宠物店的创业计划书范文
2014/01/11 职场文书
幼儿教师自我剖析材料
2014/09/29 职场文书
购房委托书
2014/10/15 职场文书
秦始皇兵马俑导游词
2015/02/02 职场文书
任命通知范文
2015/04/21 职场文书
2016教师暑期培训学习心得体会
2016/01/09 职场文书
2019大学生暑期实习心得总结
2019/08/21 职场文书
JVM钩子函数的使用场景详解
2021/08/23 Java/Android
Win2008系统搭建DHCP服务器
2022/06/25 Servers