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 中dirname(_file_)讲解
Mar 18 PHP
Fine Uploader文件上传组件应用介绍
Jan 06 PHP
关于zend studio 出现乱码问题的总结
Jun 23 PHP
PHP base64编码后解码乱码的解决办法
Jun 19 PHP
PHP中Header使用的HTTP协议及常用方法小结
Nov 04 PHP
php json转换成数组形式代码分享
Nov 10 PHP
PHP调用wsdl文件类型的接口代码分享
Nov 19 PHP
symfony2.4的twig中date用法分析
Mar 18 PHP
thinkPHP框架实现生成条形码的方法示例
Jun 06 PHP
PHP 模拟登陆功能实例详解
Sep 10 PHP
TP5框架实现自定义分页样式的方法示例
Apr 05 PHP
PHP7变量处理机制修改
Mar 09 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
下载文件的点击数回填
2006/10/09 PHP
PHP网站安装程序制作的原理、步骤、注意事项和示例代码
2010/08/01 PHP
PHP使用两个栈实现队列功能的方法
2018/01/15 PHP
清除网页历史记录,屏蔽后退按钮!
2008/12/22 Javascript
在IE6下发生Internet Explorer cannot open the Internet site错误
2010/06/21 Javascript
JavaScript中的常见问题解决方法(乱码,IE缓存,代理)
2013/11/28 Javascript
编写高效jQuery代码的4个原则和5个技巧
2014/04/24 Javascript
express的中间件bodyParser详解
2014/12/04 Javascript
以Python代码实例展示kNN算法的实际运用
2015/10/26 Javascript
Jquery实现纵向横向菜单
2016/01/24 Javascript
基于BootStrap的图片轮播效果展示实例代码
2016/05/23 Javascript
微信小程序 http请求详细介绍
2016/10/09 Javascript
认识less和webstrom的less配置方法
2017/08/02 Javascript
旺旺在线客服代码 旺旺客服代码生成器
2018/01/09 Javascript
nodejs搭建本地服务器轻松解决跨域问题
2018/03/21 NodeJs
Javascript获取某个月的天数
2018/05/30 Javascript
详解ECMAScript typeof用法
2018/07/25 Javascript
layui表格分页 记录勾选的实例
2019/09/02 Javascript
简单了解微信小程序 e.target与e.currentTarget的不同
2019/09/27 Javascript
node.js 使用 net 模块模拟 websocket 握手进行数据传递操作示例
2020/02/11 Javascript
[02:24]DOTA2亚洲邀请赛 NAVI战队出场宣传片
2015/02/07 DOTA
[01:06:59]完美世界DOTA2联赛PWL S2 Magma vs FTD 第一场 11.29
2020/12/02 DOTA
Python群发邮件实例代码
2014/01/03 Python
Python实现过滤单个Android程序日志脚本分享
2015/01/16 Python
python中的set实现不重复的排序原理
2018/01/24 Python
Python实现OpenCV的安装与使用示例
2018/03/30 Python
利用python、tensorflow、opencv、pyqt5实现人脸实时签到系统
2019/09/25 Python
BOSE德国官网:尽探索之力,享音乐之极
2016/12/11 全球购物
印尼太阳百货公司网站:Matahari
2018/02/04 全球购物
维德科技C#面试题笔试题
2015/12/09 面试题
迟到检讨书400字
2014/01/13 职场文书
高中生物教学反思
2014/02/05 职场文书
2014年组织部工作总结
2014/11/14 职场文书
2015年档案室工作总结
2015/05/23 职场文书
iPhone13再次曝光
2021/04/15 数码科技
QT与javascript交互数据的实现
2021/05/26 Javascript