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 24 PHP
PHP如何利用P3P实现跨域
Aug 24 PHP
PHP 下载文件时自动添加bom头的方法实例
Jan 10 PHP
php遍历目录输出目录及其下的所有文件示例
Jan 27 PHP
ThinkPHP结合AjaxFileUploader实现无刷新文件上传的方法
Oct 29 PHP
php中ftp_chdir与ftp_cdup函数用法
Nov 18 PHP
PHP实现二叉树的深度优先与广度优先遍历方法
Sep 28 PHP
PHP中文竖排转换实现方法
Oct 23 PHP
Yii2使用dropdownlist实现地区三级联动功能的方法
Jul 18 PHP
浅谈PHP实现大流量下抢购方案
Dec 15 PHP
PHP pthreads v3在centos7平台下的安装与配置操作方法
Feb 21 PHP
如何使用php生成zip压缩包
Apr 21 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
Yii获取当前url和域名的方法
2015/06/08 PHP
Thinkphp5.0框架使用模型Model的获取器、修改器、软删除数据操作示例
2019/10/11 PHP
PPK 谈 JavaScript 的 this 关键字 [翻译]
2009/09/29 Javascript
学习javascript,实现插入排序实现代码
2011/07/31 Javascript
jquery选择器-根据多个属性选择示例代码
2013/10/21 Javascript
javascript中的throttle和debounce浅析
2014/06/06 Javascript
jQuery使用before()和after()在元素前后添加内容的方法
2015/03/26 Javascript
jQuery的框架介绍
2016/05/11 Javascript
JavaScript实现清空(重置)文件类型INPUT元素值的方法
2016/11/17 Javascript
微信小程序中用WebStorm使用LESS
2017/03/08 Javascript
layer弹窗插件操作方法详解
2017/05/19 Javascript
微信小程序webview组件交互,内联h5页面并网页实现微信支付实现解析
2019/08/16 Javascript
jQuery实现简单评论功能
2020/08/19 jQuery
[50:48]LGD vs CHAOS 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
Python对列表排序的方法实例分析
2015/05/16 Python
windows系统下Python环境搭建教程
2017/03/28 Python
安装Python和pygame及相应的环境变量配置(图文教程)
2017/06/04 Python
解决python3在anaconda下安装caffe失败的问题
2017/06/15 Python
Python实现多条件筛选目标数据功能【测试可用】
2018/06/13 Python
详解Numpy中的广播原则/机制
2018/09/20 Python
python+opencv实现摄像头调用的方法
2019/06/22 Python
Python操作多维数组输出和矩阵运算示例
2019/11/28 Python
python GUI库图形界面开发之PyQt5滚动条控件QScrollBar详细使用方法与实例
2020/03/06 Python
css3 transform过渡抖动问题解决
2020/10/23 HTML / CSS
DBA数据库管理员JAVA程序员架构师必看
2016/02/07 面试题
什么是SQL Server的确定性函数和不确定性函数
2016/08/04 面试题
职业教育毕业生求职信
2013/11/09 职场文书
个人思想理论学习的自我鉴定
2013/11/30 职场文书
高三历史教学反思
2014/01/09 职场文书
棉花姑娘教学反思
2014/02/15 职场文书
中药专业自荐信范文
2014/03/18 职场文书
小学学校评估方案
2014/06/08 职场文书
法人委托书
2014/07/31 职场文书
光棍节联谊晚会活动策划书
2014/10/10 职场文书
一封真诚的自荐信帮你赢得机会
2019/05/07 职场文书
python实现监听键盘
2021/04/26 Python