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 相关文章推荐
php下实现农历日历的代码
Mar 07 PHP
php开发工具之vs2005图解
Jan 12 PHP
PHP使用数组实现队列
Feb 05 PHP
PHP CURL CURLOPT参数说明(curl_setopt)
Sep 30 PHP
php实现斐波那契数列的简单写法
Jul 19 PHP
完整删除ecshop中获取店铺信息的API
Dec 24 PHP
PHP的运行机制与原理(底层)
Nov 16 PHP
PHP+MySQL实现无极限分类栏目的方法
Dec 23 PHP
PHP使用socket发送HTTP请求的方法
Feb 14 PHP
功能强大的PHP发邮件类
Aug 29 PHP
PHP+Apache环境中如何隐藏Apache版本
Nov 24 PHP
PHP Trait功能与用法实例分析
Jun 03 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
《魔兽争霸3》重制版究竟重制了什么?玩家:这么糊弄真的好吗?
2020/05/04 魔兽争霸
PHP 第一节 php简介
2012/04/28 PHP
php实现单链表的实例代码
2013/03/22 PHP
PHP的switch判断语句的“高级”用法详解
2014/10/01 PHP
ThinkPHP实现动态包含文件的方法
2014/11/29 PHP
Yii2增加验证码步骤详解
2016/04/25 PHP
实例讲解PHP中使用命名空间
2019/01/27 PHP
Laravel5.5+ 使用API Resources快速输出自定义JSON方法详解
2020/04/06 PHP
PHP手机号码及邮箱正则表达式实例解析
2020/07/11 PHP
javascript 处理事件绑定的一些兼容写法
2009/12/24 Javascript
js限制checkbox选中个数以限制六个为例
2014/07/15 Javascript
nodejs简单实现中英文翻译
2015/05/04 NodeJs
javascript模拟评分控件实现方法
2015/05/13 Javascript
在 Express 中使用模板引擎
2015/12/10 Javascript
JavaScript中文件上传API详解
2016/04/01 Javascript
JS 动态加载js文件和css文件 同步/异步的两种简单方式
2016/09/23 Javascript
JS实现动态生成html table表格的方法分析
2018/07/11 Javascript
如何实现双向绑定mvvm的原理实现
2019/05/28 Javascript
VUE组件中的 Drawer 抽屉实现代码
2019/08/06 Javascript
javascript History对象原理解析
2020/02/17 Javascript
python 3.5实现检测路由器流量并写入txt的方法实例
2017/12/17 Python
Python中max函数用于二维列表的实例
2018/04/03 Python
python 将list转成字符串,中间用符号分隔的方法
2018/10/23 Python
opencv与numpy的图像基本操作
2019/03/08 Python
python如何实现视频转代码视频
2019/06/17 Python
Python自动化导出zabbix数据并发邮件脚本
2019/08/16 Python
用python3读取python2的pickle数据方式
2019/12/25 Python
Python实现自动打开电脑应用的示例代码
2020/04/17 Python
html5-canvas中使用clip抠出一个区域的示例代码
2018/05/25 HTML / CSS
市场营销毕业生自荐信
2013/11/23 职场文书
养殖人员的创业计划书范文
2013/12/26 职场文书
省优秀教师事迹材料
2014/01/30 职场文书
决心书范文
2014/03/11 职场文书
党员干部作风建设思想汇报范文
2014/10/25 职场文书
工作经验交流材料
2014/12/30 职场文书
餐厅保洁员岗位职责
2015/04/10 职场文书