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 array_map array_multisort 高效处理多维数组排序
Jun 11 PHP
PHP面向对象学习笔记之二 生成对象的设计模式
Oct 06 PHP
手把手教你打印出PDF(关于fpdf的简单应用)
Jun 25 PHP
ThinkPHP通过AJAX返回JSON的两种实现方法
Dec 18 PHP
php查询操作实现投票功能
May 09 PHP
Ajax和PHP正则表达式验证表单及验证码
Sep 24 PHP
PHP数组操作简单案例分析
Oct 15 PHP
php格式文件打开的四种方法
Feb 24 PHP
PHP5.0~5.6 各版本兼容性cURL文件上传功能实例分析
May 11 PHP
php 获取xml接口数据的处理方法
May 31 PHP
PHP时间函数使用详解
Mar 21 PHP
详解thinkphp的Auth类认证
May 28 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
150kHz到30Mhz完全冲浪手册
2020/03/20 无线电
详解使用php调用微信接口上传永久素材
2017/04/11 PHP
PHP创建XML接口示例
2019/07/04 PHP
Laravel手动返回错误码示例
2019/10/22 PHP
javascript Select标记中options操作方法集合
2008/10/22 Javascript
(跨浏览器基础事件/浏览器检测/判断浏览器)经验代码分享
2013/01/24 Javascript
JS格式化数字金额用逗号隔开保留两位小数
2013/10/18 Javascript
js实现点击链接后窗口缩小并居中的方法
2015/03/02 Javascript
js获取鼠标点击的对象,点击另一个按钮删除该对象的实现代码
2016/05/13 Javascript
jQuery animate easing使用方法图文详解
2016/06/17 Javascript
jQuery简单实现tab选项卡切换效果
2016/06/20 Javascript
AngularJs自定义服务之实现签名和加密
2016/08/02 Javascript
纯js实现悬浮按钮组件
2016/12/17 Javascript
js Element Traversal规范中的元素遍历方法
2018/04/19 Javascript
JS获取浏览器地址栏的多个参数值的任意值实例代码
2018/07/24 Javascript
vue中设置height:100%无效的问题及解决方法
2018/07/27 Javascript
JavaScript判断浏览器版本的方法
2019/11/03 Javascript
小程序实现上传视频功能
2020/08/18 Javascript
Python的语言类型(详解)
2017/06/24 Python
python实现数据预处理之填充缺失值的示例
2017/12/22 Python
Python爬虫框架Scrapy实例代码
2018/03/04 Python
Python 实现异步调用函数的示例讲解
2018/10/14 Python
python字符串循环左移
2019/03/08 Python
Python中的字符串切片(截取字符串)的详解
2019/05/15 Python
python实时检测键盘输入函数的示例
2019/07/17 Python
详解Python绘图Turtle库
2019/10/12 Python
Python使用正则实现计算字符串算式
2019/12/29 Python
Python识别html主要文本框过程解析
2020/02/18 Python
python MultipartEncoder传输zip文件实例
2020/04/07 Python
浅析Python模块之间的相互引用问题
2021/02/26 Python
2014党员民主评议个人总结
2014/09/10 职场文书
追悼会悼词大全
2015/06/23 职场文书
采购员工作总结范文
2015/08/12 职场文书
文明礼仪主题班会
2015/08/13 职场文书
优秀毕业生主要事迹材料
2015/11/04 职场文书
创业计划书之便利店
2019/09/05 职场文书