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 utf-8编码问题,utf8编码,数据库乱码,页面显示输出乱码
Apr 08 PHP
PHP 处理TXT文件(打开/关闭/检查/读取)
May 13 PHP
php保存二进制原始数据为图片的程序代码
Oct 14 PHP
PHP分页类集锦
Nov 18 PHP
PHP调用wsdl文件类型的接口代码分享
Nov 19 PHP
PHP递归调用数组值并用其执行指定函数的方法
Apr 01 PHP
yii2高级应用之自定义组件实现全局使用图片上传功能的方法
Oct 08 PHP
PHP实现图的邻接矩阵表示及几种简单遍历算法分析
Nov 24 PHP
PHP实现数组转JSon和JSon转数组的方法示例
Jun 14 PHP
原生PHP实现导出csv格式Excel文件的方法示例【附源码下载】
Mar 07 PHP
Thinkphp框架+Layui实现图片/文件上传功能分析
Feb 07 PHP
PHP面试题 wakeup魔法 Ezpop pop序列化与反序列化
Apr 11 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中用date函数获取当前时间有误的解决办法
2013/08/02 PHP
php获取服务器端mac和客户端mac的地址支持WIN/LINUX
2014/05/15 PHP
CodeIgniter CLI模式简介
2014/06/17 PHP
php tpl模板引擎定义与使用示例
2019/08/09 PHP
javascript处理table表格的代码
2010/12/06 Javascript
jquery向.ashx文件post中文乱码问题的解决方法
2011/03/28 Javascript
禁用键盘上的(全局)指定键兼容iE、Chrome、火狐
2013/05/14 Javascript
node.js中的fs.fsync方法使用说明
2014/12/15 Javascript
node.js [superAgent] 请求使用示例
2015/03/13 Javascript
javascript去掉代码里面的注释
2015/07/24 Javascript
JS 清除字符串数组中,重复元素的实现方法
2016/05/24 Javascript
浅谈Sublime Text 3运行JavaScript控制台
2016/06/06 Javascript
微信小程序 开发MAP(地图)实例详解
2017/06/27 Javascript
微信小程序缓存过期时间的使用详情
2019/05/12 Javascript
js+springMVC 提交数组数据到后台的实例
2019/09/21 Javascript
Vue-cli3项目引入Typescript的实现方法
2019/10/18 Javascript
详解vue beforeEach 死循环问题解决方法
2020/02/25 Javascript
python线程锁(thread)学习示例
2013/12/04 Python
Python2.X/Python3.X中urllib库区别讲解
2017/12/19 Python
Django web框架使用url path name详解
2019/04/29 Python
Flask之pipenv虚拟环境的实现
2019/11/26 Python
python如何处理程序无法打开
2020/06/16 Python
Html5 canvas画图白板踩坑
2020/06/01 HTML / CSS
Joe Fresh官网:加拿大时尚品牌和零售连锁店
2016/11/30 全球购物
Clarks鞋法国官方网站:英国其乐鞋品牌
2018/02/11 全球购物
护理专业优质毕业生自荐书
2014/01/31 职场文书
毕业设计指导教师评语
2014/12/30 职场文书
个人收入证明范本
2015/06/12 职场文书
2015年思想品德教学工作总结
2015/07/22 职场文书
2016国庆节67周年红领巾广播稿
2015/12/18 职场文书
python如何正确使用yield
2021/05/21 Python
RPM包方式安装Oracle21c的方法详解
2021/08/23 Oracle
世界无敌的ICOM IC-R9500宽频接收机
2022/03/25 无线电
Java 超详细讲解设计模式之中的抽象工厂模式
2022/03/25 Java/Android
详解MySQL的内连接和外连接
2023/05/08 MySQL