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 相关文章推荐
将数字格式的计算结果转为汉字格式
Oct 09 PHP
PHP的FTP学习(一)
Oct 09 PHP
PHP中for循环语句的几种变型
Nov 26 PHP
使用Limit参数优化MySQL查询的方法
Nov 12 PHP
PHP基础知识回顾
Aug 16 PHP
ThinkPHP实现跨模块调用操作方法概述
Jun 20 PHP
PHP的Socket通信之UDP通信实例
Jul 02 PHP
PHP中Http协议post请求参数
Nov 02 PHP
thinkphp5.1 文件引入路径问题及注意事项
Jun 13 PHP
PHP实现的操作数组类库定义与用法示例
May 24 PHP
Laravel5.4简单实现app接口Api Token认证方法
Aug 29 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
c#中的实现php中的preg_replace
2009/12/21 PHP
Discuz!X中SESSION机制实例详解
2015/09/23 PHP
jquery数组之存放checkbox全选值示例代码
2013/12/20 Javascript
jQuery+AJAX实现网页无刷新上传
2015/02/22 Javascript
jQuery+Ajax+PHP+Mysql实现分页显示数据实例讲解
2015/09/27 Javascript
JavaScript算法系列之快速排序(Quicksort)算法实例详解
2016/09/04 Javascript
js html css实现复选框全选与反选
2016/10/09 Javascript
vue.js 1.x与2.0中js实时监听input值的变化
2017/03/15 Javascript
Vue2递归组件实现树形菜单
2017/04/10 Javascript
Vue开发中整合axios的文件整理
2017/04/29 Javascript
bootstrapvalidator之API学习教程
2017/06/29 Javascript
vue页面使用阿里oss上传功能的实例(一)
2017/08/09 Javascript
微信小程序实现的贪吃蛇游戏【附源码下载】
2018/01/03 Javascript
js自定义input文件上传样式
2018/10/26 Javascript
详解用Webpack与Babel配置ES6开发环境
2019/03/12 Javascript
微信小程序实现首页弹出广告
2020/12/03 Javascript
vue中如何自定义右键菜单详解
2020/12/08 Vue.js
[00:52]DOTA2齐天大圣预告片
2016/08/13 DOTA
[03:01]完美盛典趣味短片 DOTA2年度最佳&拉胯英雄
2019/12/07 DOTA
Python字符编码判断方法分析
2016/07/01 Python
通过源码分析Python中的切片赋值
2017/05/08 Python
利用python实现简单的循环购物车功能示例代码
2017/07/05 Python
Python实现简单的获取图片爬虫功能示例
2017/07/12 Python
解决Python requests库编码 socks5代理的问题
2018/05/07 Python
python中property和setter装饰器用法
2019/12/19 Python
Python基础之高级变量类型实例详解
2020/01/03 Python
python中执行smtplib失败的处理方法
2020/07/01 Python
HTML5 Canvas如何实现纹理填充与描边(Fill And Stroke)
2013/07/15 HTML / CSS
全天然狗零食:Best Bully Sticks
2016/09/22 全球购物
领先的钻石和订婚戒指零售商:Diamonds-USA
2016/12/11 全球购物
FC-Moto丹麦:欧洲最大的摩托车服装和头盔商店之一
2019/08/20 全球购物
int *p=NULL和*p= NULL有什么区别
2014/10/23 面试题
中国文明网签名寄语
2014/01/18 职场文书
学生会副主席竞聘书
2014/03/31 职场文书
手写Spirit防抖函数underscore和节流函数lodash
2022/03/22 Javascript
如何让你的Nginx支持分布式追踪详解
2022/07/07 Servers