微信网页授权(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 5.0对象模型深度探索之绑定
Sep 05 PHP
php中cookie的使用方法
Mar 29 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(二)
Jun 23 PHP
PHP程序员必须清楚的问题汇总
Dec 18 PHP
ThinkPHP中where()使用方法详解
Apr 19 PHP
遍历echsop的region表形成缓存的程序实例代码
Nov 01 PHP
PHP中file_put_contents追加和换行的实现方法
Apr 01 PHP
php7 安装yar 生成docker镜像
May 09 PHP
PHP手机号中间四位用星号*代替显示的实例
Jun 02 PHP
PHP+ajax实现二级联动菜单功能示例
Aug 10 PHP
PHP删除字符串中非字母数字字符方法总结
Jan 20 PHP
Laravel如何自定义command命令浅析
Mar 23 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 MemCached高级缓存配置图文教程
2010/08/05 PHP
PHP实现更新中间关联表数据的两种方法
2014/09/01 PHP
php实现的pdo公共类定义与用法示例
2017/07/19 PHP
Laravel+Intervention实现上传图片功能示例
2019/07/09 PHP
PHP实现单文件、多个单文件、多文件上传函数的封装示例
2019/09/02 PHP
Jquery ajax不能解析json对象,报Invalid JSON错误的原因和解决方法
2010/03/27 Javascript
jQueryUI写一个调整分类的拖放效果实现代码
2012/05/10 Javascript
编程语言JavaScript简介
2014/10/16 Javascript
js打造数组转json函数
2015/01/14 Javascript
在JavaScript中如何解决用execCommand(
2015/10/19 Javascript
关于网页中的无缝滚动的js代码
2016/06/09 Javascript
很棒的js选项卡切换效果
2016/07/15 Javascript
js带闹铃功能的倒计时代码
2016/09/29 Javascript
AngularJS入门教程之MVC架构实例分析
2016/11/01 Javascript
jQuery 插件实现随机自由弹跳气泡样式
2017/01/12 Javascript
Bootstrap栅格系统使用方法及页面调整变形的解决方法
2017/03/10 Javascript
jQuery中图片展示插件highslide.js的简单dom
2018/04/22 jQuery
使用nodejs分离html文件里的js和css详解
2019/04/12 NodeJs
微信小程序封装分享与分销功能过程解析
2019/08/13 Javascript
vue 的 solt 子组件过滤过程解析
2019/09/07 Javascript
微信小程序 行的删除和增加操作实现详解
2019/09/29 Javascript
NodeJs crypto加密制作token的实现代码
2019/11/15 NodeJs
简单了解JavaScript arguement原理及作用
2020/05/28 Javascript
[02:40]2014DOTA2 国际邀请赛中国区预选赛 四大豪门抵达华西村
2014/05/23 DOTA
[36:16]完美世界DOTA2联赛PWL S3 access vs Rebirth 第一场 12.19
2020/12/24 DOTA
使用Python设置tmpfs来加速项目的教程
2015/04/17 Python
Python中staticmethod和classmethod的作用与区别
2018/10/11 Python
简单了解python代码优化小技巧
2019/07/08 Python
Html5 canvas画图白板踩坑
2020/06/01 HTML / CSS
计算机系统管理员求职信
2014/06/20 职场文书
课外科技活动总结
2014/08/27 职场文书
大学生学习计划书
2014/09/15 职场文书
镇党政领导班子民主生活会思想汇报
2014/10/11 职场文书
2015年初中元旦晚会活动总结
2014/11/28 职场文书
忠诚教育学习心得体会
2016/01/23 职场文书
实现AJAX异步调用和局部刷新的基本步骤
2022/03/17 Javascript