PHP实现微信网页授权开发教程


Posted in PHP onJanuary 19, 2016

微信网页授权是服务号才有的高级功能,开发者可以通过授权后获取用户的基本信息;在此之前,想要获取消息信息只能在用户和公众号交互时根据openid获取用户信息;而微信网页授权可在不需要消息交互,也不需要关注的情况下获取用户的基本信息。

PHP实现微信网页授权开发教程

微信网页授权时通过OAuth2.0完成的,整个过程分为三步:

  • 用户授权,获取code;
  • 根据code获取access_token【可通过refresh_token刷新获取较长有效期】
  • 通过access_token和openid获取用户信息

对微信网页授权过程做了简单封装:

<?php
 
/**
 * 微信授权相关接口
 */
 
class Wechat {
  
  //高级功能-》开发者模式-》获取
  private $app_id = 'xxx';
  private $app_secret = 'xxxxxxx';
 
 
  /**
   * 获取微信授权链接
   * 
   * @param string $redirect_uri 跳转地址
   * @param mixed $state 参数
   */
  public function get_authorize_url($redirect_uri = '', $state = '')
  {
    $redirect_uri = urlencode($redirect_uri);
    return "https://open.weixin.qq.com/connect/oauth2/authorize?appid={$this->app_id}&redirect_uri={$redirect_uri}&response_type=code&scope=snsapi_userinfo&state={$state}#wechat_redirect";
  }
  
  /**
   * 获取授权token
   * 
   * @param string $code 通过get_authorize_url获取到的code
   */
  public function get_access_token($app_id = '', $app_secret = '', $code = '')
  {
    $token_url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid={$this->app_id}&secret={$this->app_secret}&code={$code}&grant_type=authorization_code";
    $token_data = $this->http($token_url);
    
    if($token_data[0] == 200)
    {
      return json_decode($token_data[1], TRUE);
    }
    
    return FALSE;
  }
  
  /**
   * 获取授权后的微信用户信息
   * 
   * @param string $access_token
   * @param string $open_id
   */
  public function get_user_info($access_token = '', $open_id = '')
  {
    if($access_token && $open_id)
    {
      $info_url = "https://api.weixin.qq.com/sns/userinfo?access_token={$access_token}&openid={$open_id}&lang=zh_CN";
      $info_data = $this->http($info_url);
      
      if($info_data[0] == 200)
      {
        return json_decode($info_data[1], TRUE);
      }
    }
    
    return FALSE;
  }
  
  public function http($url, $method, $postfields = null, $headers = array(), $debug = false)
  {
    $ci = curl_init();
    /* Curl settings */
    curl_setopt($ci, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
    curl_setopt($ci, CURLOPT_CONNECTTIMEOUT, 30);
    curl_setopt($ci, CURLOPT_TIMEOUT, 30);
    curl_setopt($ci, CURLOPT_RETURNTRANSFER, true);
 
    switch ($method) {
      case 'POST':
        curl_setopt($ci, CURLOPT_POST, true);
        if (!empty($postfields)) {
          curl_setopt($ci, CURLOPT_POSTFIELDS, $postfields);
          $this->postdata = $postfields;
        }
        break;
    }
    curl_setopt($ci, CURLOPT_URL, $url);
    curl_setopt($ci, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($ci, CURLINFO_HEADER_OUT, true);
 
    $response = curl_exec($ci);
    $http_code = curl_getinfo($ci, CURLINFO_HTTP_CODE);
 
    if ($debug) {
      echo "=====post data======\r\n";
      var_dump($postfields);
 
      echo '=====info=====' . "\r\n";
      print_r(curl_getinfo($ci));
 
      echo '=====$response=====' . "\r\n";
      print_r($response);
    }
    curl_close($ci);
    return array($http_code, $response);
  }
 
}

以上就是本文的全部内容,希望对大家的学习有所帮助。

PHP 相关文章推荐
在yii中新增一个用户验证的方法详解
Jun 20 PHP
三种php连接access数据库方法
Nov 11 PHP
php获取网页请求状态程序示例
Jun 17 PHP
PHP使用GIFEncoder类处理gif图片实例
Jul 01 PHP
php实现读取内存顺序号
Mar 29 PHP
PHP中的类型约束介绍
May 11 PHP
Twig模板引擎用法入门教程
Jan 20 PHP
ThinkPHP路由机制简介
Mar 23 PHP
分享PHP-pcntl 实现多进程代码
Sep 30 PHP
PHP 获取客户端 IP 地址的方法实例代码
Nov 11 PHP
PHP基于GD2函数库实现验证码功能示例
Jan 27 PHP
gearman管理工具GearmanManager的安装与php使用方法示例
Feb 27 PHP
CodeIgniter配置之SESSION用法实例分析
Jan 19 #PHP
CodeIgniter配置之routes.php用法实例分析
Jan 19 #PHP
CodeIgniter配置之config.php用法实例分析
Jan 19 #PHP
Codeigniter控制器controller继承问题实例分析
Jan 19 #PHP
php pthreads多线程的安装与使用
Jan 19 #PHP
PHP+swoole实现简单多人在线聊天群发
Jan 19 #PHP
PHP各种异常和错误的拦截方法及发生致命错误时进行报警
Jan 19 #PHP
You might like
PHP伪静态Rewrite设置之APACHE篇
2014/07/30 PHP
实例讲解PHP设计模式编程中的简单工厂模式
2016/02/29 PHP
Yii2中YiiBase自动加载类、引用文件方法分析(autoload)
2016/07/25 PHP
php接口技术实例详解
2016/12/07 PHP
PHP定义字符串的四种方式详解
2018/02/06 PHP
JS 自定义函数缺省值的设置方法
2010/05/05 Javascript
随鼠标上下滚动的jquery代码
2013/12/05 Javascript
JavaScript框架是什么?怎样才能叫做框架?
2015/07/01 Javascript
使用JQuery实现的分页插件分享
2015/11/05 Javascript
JS实现title标题栏文字不间断滚动显示效果
2016/09/07 Javascript
Highcharts+NodeJS搭建数据可视化平台示例
2017/01/01 NodeJs
angular实现商品筛选功能
2017/02/01 Javascript
你真的了解BOM中的history对象吗
2017/02/13 Javascript
Vue.use源码分析
2017/04/22 Javascript
Vue单页及多页应用全局配置404页面实践记录
2018/05/22 Javascript
Vue兼容ie9的问题全面解决方案
2018/06/19 Javascript
Vue数字输入框组件使用方法详解
2020/02/10 Javascript
javascript实现贪吃蛇小游戏
2020/07/28 Javascript
[39:53]完美世界DOTA2联赛PWL S2 LBZS vs Forest 第一场 11.19
2020/11/19 DOTA
python下os模块强大的重命名方法renames详解
2017/03/07 Python
python二进制文件的转译详解
2019/07/03 Python
Django {{ MEDIA_URL }}无法显示图片的解决方式
2020/04/07 Python
python按顺序重命名文件并分类转移到各个文件夹中的实现代码
2020/07/21 Python
python爬虫利用selenium实现自动翻页爬取某鱼数据的思路详解
2020/12/22 Python
python 利用openpyxl读取Excel表格中指定的行或列教程
2021/02/06 Python
浅析python连接数据库的重要事项
2021/02/22 Python
python Autopep8实现按PEP8风格自动排版Python代码
2021/03/02 Python
TIME时代杂志台湾总代理:台时亚洲
2018/10/22 全球购物
Linux面试经常问的文件系统操作命令
2016/10/04 面试题
《罗布泊,消逝的仙湖》教学反思
2014/03/01 职场文书
政治表现评语
2014/05/04 职场文书
单位委托书范本(3篇)
2014/09/18 职场文书
孔繁森观后感
2015/06/10 职场文书
小学庆六一主持词
2015/06/30 职场文书
浅谈Python列表嵌套字典转化的问题
2021/04/07 Python
html+css实现分层金字塔的实例
2021/06/02 HTML / CSS