微信网页授权(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编码规范-php coding standard
Mar 16 PHP
PHP实现搜索相似图片
Sep 22 PHP
解析WordPress中控制用户登陆和判断用户登陆的PHP函数
Mar 01 PHP
thinkPHP实现递归循环栏目并按照树形结构无限极输出的方法
May 19 PHP
PHP编写文件多服务器同步程序
Jul 02 PHP
微信利用PHP创建自定义菜单的方法
Aug 01 PHP
遍历echsop的region表形成缓存的程序实例代码
Nov 01 PHP
php封装的mongodb操作类代码
Aug 06 PHP
PHP学习记录之数组函数
Jun 01 PHP
PHP设计模式之观察者模式定义与用法示例
Aug 04 PHP
Centos7 Yum安装PHP7.2流程教程详解
Jul 02 PHP
Yii框架小部件(Widgets)用法实例详解
May 15 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 Cookie的一个使用注意点
2008/11/08 PHP
php去除重复字的实现代码
2011/09/16 PHP
PHP+MYSQL会员系统的登陆即权限判断实现代码
2011/09/23 PHP
input file获得文件根目录简单实现
2013/04/26 PHP
php中convert_uuencode()与convert_uuencode函数用法实例
2014/11/22 PHP
Symfony2安装第三方Bundles实例详解
2016/02/04 PHP
ThinkPHP3.2.3框架实现执行原生SQL语句的方法示例
2019/04/03 PHP
关于jquery css的使用介绍
2013/04/18 Javascript
js验证电话号码与手机支持+86的正则表达式
2014/01/23 Javascript
js图片处理示例代码
2014/05/12 Javascript
Javascript验证用户输入URL地址是否为空及格式是否正确
2014/10/09 Javascript
使用JavaScript 实现的人脸检测
2015/03/24 Javascript
JS实现的文字与图片定时切换效果代码
2015/10/06 Javascript
jquery实现自适应banner焦点图
2017/02/16 Javascript
JavaScript 自定义事件之我见
2017/09/25 Javascript
解决vue移动端适配问题
2018/12/12 Javascript
深入理解令牌认证机制(token)
2019/08/22 Javascript
vue-cli单页面预渲染seo-prerender-spa-plugin操作
2020/08/10 Javascript
AJAX XMLHttpRequest对象创建使用详解
2020/08/20 Javascript
用Python编写一个简单的俄罗斯方块游戏的教程
2015/04/03 Python
探索Python3.4中新引入的asyncio模块
2015/04/08 Python
python3实现暴力穷举博客园密码
2016/06/19 Python
django2.0扩展用户字段示例
2019/02/13 Python
如何使用Flask-Migrate拓展数据库表结构
2019/07/24 Python
Python秒算24点实现及原理详解
2019/07/29 Python
python 实现多维数组转向量
2019/11/30 Python
pycharm如何实现跨目录调用文件
2020/02/28 Python
python实现发送QQ邮件(可加附件)
2020/12/23 Python
HTML5实现页面切换激活的PageVisibility API使用初探
2016/05/13 HTML / CSS
Schecker荷兰:狗狗用品和配件
2019/06/06 全球购物
个人党性剖析材料
2014/02/03 职场文书
副董事长岗位职责
2014/04/02 职场文书
婚假请假条怎么写
2014/04/10 职场文书
父亲节寄语大全
2015/02/27 职场文书
网吧管理制度范本
2015/08/05 职场文书
Python实现批量自动整理文件
2022/03/16 Python