微信网页授权(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
PHP怎样调用MSSQL的存储过程
Oct 09 PHP
PHP 选项及相关信息函数库
Dec 04 PHP
PHP取整数函数常用的四种方法小结
Jul 05 PHP
php 操作调试的方法
Jul 12 PHP
探讨方法的重写(覆载)详解
Jun 08 PHP
PHP strstr 函数判断字符串是否否存在的实例代码
Sep 28 PHP
使用php计算排列组合的方法
Nov 13 PHP
WebQQ最新登陆协议的用法
Dec 22 PHP
phpMyAdmin无法登陆的解决方法
Apr 27 PHP
PHP实现websocket通信的方法示例
Aug 28 PHP
为Plesk PHP7启用Oracle OCI8扩展方法总结
Mar 29 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
漂亮但不安全的CTB
2006/10/09 PHP
PHP删除目录及目录下所有文件的方法详解
2013/06/06 PHP
php与flash as3 socket通信传送文件实现代码
2014/08/16 PHP
PHP7之Mongodb API使用详解
2015/12/26 PHP
PHP使用stream_context_create()模拟POST/GET请求的方法
2016/04/02 PHP
关于PHP文件的自动运行方法分析
2016/05/13 PHP
Yii框架实现记录日志到自定义文件的方法
2017/05/23 PHP
学习YUI.Ext基础第一天
2007/03/10 Javascript
javascript 计算两个整数的百分比值
2009/12/26 Javascript
Jquery中dialog属性小记
2010/09/03 Javascript
js控制input输入字符解析
2013/12/27 Javascript
Vuejs第七篇之Vuejs过渡动画案例全面解析
2016/09/05 Javascript
JavaScript函数基础详解
2017/02/03 Javascript
Thinkjs3新手入门之如何使用静态资源目录
2017/12/06 Javascript
jQuery实现图片简单轮播功能示例
2018/08/13 jQuery
js中数组对象去重的两种方法
2019/01/18 Javascript
js常见遍历操作小结
2019/06/06 Javascript
react 不用插件实现数字滚动的效果示例
2020/04/14 Javascript
实例讲解React 组件
2020/07/07 Javascript
vue实现日历表格(element-ui)
2020/09/24 Javascript
[09:33]2015国际邀请赛第四日TOP10
2015/08/08 DOTA
[42:20]Winstrike vs VGJ.S 2018国际邀请赛淘汰赛BO3 第二场 8.23
2018/08/24 DOTA
python使用心得之获得github代码库列表
2014/06/25 Python
解决pyqt中ui编译成窗体.py中文乱码的问题
2016/12/23 Python
Python基于Flask框架配置依赖包信息的项目迁移部署
2018/03/02 Python
windows下添加Python环境变量的方法汇总
2018/05/14 Python
Django框架的使用教程路由请求响应的方法
2018/07/03 Python
python之MSE、MAE、RMSE的使用
2020/02/24 Python
Python常驻任务实现接收外界参数代码解析
2020/07/21 Python
CSS3+js实现简单的时钟特效
2015/03/18 HTML / CSS
使用CSS3配合IE滤镜实现渐变和投影的效果
2015/09/06 HTML / CSS
BIBLOO波兰:捷克的一家在线服装店
2018/03/09 全球购物
加拿大国民体育购物网站:National Sports
2018/11/04 全球购物
为什么说Ruby是一种真正的面向对象程序设计语言
2012/10/30 面试题
校长就职演讲稿
2014/01/06 职场文书
Python实现GIF动图以及视频卡通化详解
2021/12/06 Python