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 mssql 分页SQL语句优化 持续影响
Apr 26 PHP
PHP mail 通过Windows的SMTP发送邮件失败的解决方案
May 27 PHP
php自定义函数call_user_func和call_user_func_array详解
Jul 14 PHP
php实现excel中rank函数功能的方法
Jan 20 PHP
php实现将wav文件转换成图像文件并在页面中显示的方法
Apr 21 PHP
php实现面包屑导航例子分享
Dec 19 PHP
Yii2中datetime类的使用
Dec 17 PHP
php中bind_param()函数用法分析
Mar 28 PHP
ThinkPHP防止重复提交表单的方法实例分析
May 10 PHP
php微信开发之关注事件
Jun 14 PHP
PDO::getAvailableDrivers讲解
Jan 28 PHP
php设计模式之备忘模式分析【星际争霸游戏案例】
Mar 24 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安装为Apache DSO
2006/10/09 PHP
使用字符串函数输出整数化的PHP版本号
2006/10/09 PHP
php将12小时制转换成24小时制的方法
2015/03/31 PHP
thinkPHP使用post方式查询时分页失效的解决方法
2015/12/09 PHP
在php中设置session用memcache来存储的方法总结
2016/01/14 PHP
php实现基于openssl的加密解密方法
2016/09/30 PHP
PHP中overload与override的区别
2017/02/13 PHP
jQuery中的.bind()、.live()和.delegate()之间区别分析
2011/06/08 Javascript
解析瀑布流布局:JS+绝对定位的实现
2013/05/08 Javascript
javascript按位非运算符的使用方法
2013/11/14 Javascript
多选列表框动态添加,移动,删除,全选等操作的简单实例
2014/01/13 Javascript
JavaScript DOM进阶方法
2015/04/13 Javascript
JavaScript实现梯形乘法表的方法
2015/04/25 Javascript
深入分析下javascript中的[]()+!
2015/07/07 Javascript
基于HTML+CSS+JS实现增加删除修改tab导航特效代码
2016/08/05 Javascript
javascript中call,apply,bind函数用法示例
2016/12/19 Javascript
微信小程序 MD5加密登录密码详解及实例代码
2017/01/12 Javascript
解析NodeJS异步I/O的实现
2017/04/13 NodeJs
js+canvas实现五子棋小游戏
2020/08/02 Javascript
在vue中获取wangeditor的html和text的操作
2020/10/23 Javascript
python单例模式实例分析
2015/04/08 Python
win与linux系统中python requests 安装
2016/12/04 Python
Python实现GUI学生信息管理系统
2020/04/05 Python
Python视频爬虫实现下载头条视频功能示例
2018/05/07 Python
利用Python读取txt文档的方法讲解
2018/06/23 Python
Python过滤txt文件内重复内容的方法
2018/10/21 Python
使用python进行广告点击率的预测的实现
2019/07/04 Python
python 使用plt画图,去除图片四周的白边方法
2019/07/09 Python
jupyter修改文件名方式(TensorFlow)
2020/04/21 Python
浅谈numpy中np.array()与np.asarray的区别以及.tolist
2020/06/03 Python
Nip + Fab官网:英国美容品牌
2019/08/26 全球购物
《再别康桥》教学反思
2014/02/12 职场文书
赡养老人协议书
2014/04/21 职场文书
2014年人民警察入党思想汇报
2014/10/12 职场文书
销售员未完成销售业绩的检讨书
2014/10/12 职场文书
Nginx四层负载均衡的配置指南
2021/06/11 Servers