微信网页授权(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新手谈谈我的学习心得
Feb 25 PHP
php getsiteurl()函数
Sep 05 PHP
php操作SVN版本服务器类代码
Nov 27 PHP
PHP 循环删除无限分类子节点的实现代码
Jun 21 PHP
Zend Framework教程之Zend_Registry对象用法分析
Mar 22 PHP
PHP+MySQL存储数据常见中文乱码问题小结
Jun 13 PHP
php实现批量删除挂马文件及批量替换页面内容完整实例
Jul 08 PHP
php使用SAE原生Mail类实现各种类型邮件发送的方法
Oct 10 PHP
Yii2 如何在modules中添加验证码的方法
Jun 19 PHP
简单实现php上传文件功能
Sep 21 PHP
浅谈PHP实现大流量下抢购方案
Dec 15 PHP
laravel框架创建授权策略实例分析
Nov 22 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水印技术
2007/02/14 PHP
谈谈 PHP7新增功能
2015/12/16 PHP
CI操作cookie的方法分析(基于helper类库)
2016/03/28 PHP
php 中的信号处理操作实例详解
2020/03/04 PHP
js跨域和ajax 跨域问题的实现思路
2009/09/05 Javascript
javascript强大的日期函数代码分享
2013/09/04 Javascript
浅析JavaScript中的typeof运算符
2013/11/30 Javascript
使用jQuery实现更改默认alert框体
2015/04/13 Javascript
javascript封装 Cookie 应用接口
2015/08/07 Javascript
使用JavaScript为Kindeditor自定义按钮增加Audio标签
2016/03/18 Javascript
AngularJS HTML DOM详解及示例代码
2016/08/17 Javascript
JS实现的DIV块来回滚动效果示例
2017/02/07 Javascript
JS获取并处理php数组的方法实例分析
2018/09/04 Javascript
Jquery+AJAX实现无刷新上传并重命名文件操作示例【PHP后台接收】
2020/05/29 jQuery
解决vue+router路由跳转不起作用的一项原因
2020/07/19 Javascript
Vue实现腾讯云点播视频上传功能的实现代码
2020/08/17 Javascript
[04:16]完美世界DOTA2联赛PWL S2 集锦第一期
2020/11/23 DOTA
Python的设计模式编程入门指南
2015/04/02 Python
Python 实现子类获取父类的类成员方法
2019/01/11 Python
详解python-图像处理(映射变换)
2019/03/22 Python
Python进程,多进程,获取进程id,给子进程传递参数操作示例
2019/10/11 Python
Python3.7基于hashlib和Crypto实现加签验签功能(实例代码)
2019/12/04 Python
python实现将json多行数据传入到mysql中使用
2019/12/31 Python
Python实现在Windows平台修改文件属性
2020/03/05 Python
python+Selenium自动化测试——输入,点击操作
2020/03/06 Python
pandas使用之宽表变窄表的实现
2020/04/12 Python
python下对hsv颜色空间进行量化操作
2020/06/04 Python
使用py-spy解决scrapy卡死的问题方法
2020/09/29 Python
科尔士百货公司官网:Kohl’s
2016/07/11 全球购物
英国最大的百货公司:Harrods
2016/08/18 全球购物
BONIA官方网站:国际奢侈品牌和皮革专家
2016/11/27 全球购物
澳大利亚连衣裙和女装在线:Esther
2017/11/11 全球购物
创先争优承诺书范文
2014/03/31 职场文书
2015年圣诞节寄语
2015/08/17 职场文书
Java使用httpRequest+Jsoup爬取红蓝球号码
2021/07/02 Java/Android
Java tomcat手动配置servlet详解
2021/11/27 Java/Android