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 相关文章推荐
新浪微博API开发简介之用户授权(PHP基础篇)
Sep 25 PHP
PHP的autoload机制的实现解析
Sep 15 PHP
PHP5.5在windows安装使用memcached服务端的方法
Apr 16 PHP
php异步多线程swoole用法实例
Nov 14 PHP
几个实用的PHP内置函数使用指南
Nov 27 PHP
php绘图之生成饼状图的方法
Jan 24 PHP
php版阿里大于(阿里大鱼)短信发送实例详解
Nov 30 PHP
PHP对象相关知识总结
Apr 09 PHP
Laravel 加载第三方类库的方法
Apr 20 PHP
PHP图像处理技术实例总结【绘图、水印、验证码、图像压缩】
Dec 08 PHP
PHP示例演示发送邮件给某个邮箱
Apr 03 PHP
使用swoole 定时器变更超时未支付订单状态的解决方案
Jul 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
第十节--抽象方法和抽象类
2006/11/16 PHP
php计算到指定日期还有多少天的方法
2015/04/14 PHP
javascript EXCEL 操作类代码
2009/07/30 Javascript
javascript新建标签,判断键盘输入,以及判断焦点(示例代码)
2013/11/25 Javascript
原生javascript实现拖动元素示例代码
2014/09/01 Javascript
js实现模拟银行卡账号输入显示效果
2015/11/18 Javascript
JQuery遍历元素的父辈和祖先的方法
2016/09/18 Javascript
React-Native做一个文本输入框组件的实现代码
2017/08/10 Javascript
vue与bootstrap实现时间选择器的示例代码
2017/08/26 Javascript
react-native-fs实现文件下载、文本存储的示例代码
2017/09/22 Javascript
详解如何使用babel进行es6文件的编译
2018/05/29 Javascript
js Math数学简单使用操作示例
2020/03/13 Javascript
js canvas实现五子棋小游戏
2021/01/22 Javascript
[04:53]DOTA2英雄基础教程 祈求者
2014/01/03 DOTA
Python BeautifulSoup中文乱码问题的2种解决方法
2014/04/22 Python
python自然语言编码转换模块codecs介绍
2015/04/08 Python
横向对比分析Python解析XML的四种方式
2016/03/30 Python
Python中支持向量机SVM的使用方法详解
2017/12/26 Python
Python并发编程协程(Coroutine)之Gevent详解
2017/12/27 Python
python web.py开发httpserver解决跨域问题实例解析
2018/02/12 Python
使用Python实现租车计费系统的两种方法
2018/09/29 Python
python中pika模块问题的深入探究
2018/10/13 Python
零基础使用Python读写处理Excel表格的方法
2019/05/02 Python
Python+OpenCV+图片旋转并用原底色填充新四角的例子
2019/12/12 Python
利用CSS3实现文本框的清除按钮相关的一些效果
2015/06/23 HTML / CSS
html5 拖拽上传图片实例演示
2013/04/01 HTML / CSS
C语言面试题
2015/10/30 面试题
EJB面试题
2015/07/28 面试题
J2EE包括哪些技术
2016/11/25 面试题
农民入党思想汇报
2014/01/03 职场文书
高一家长会邀请函
2014/01/12 职场文书
葬礼司仪主持词
2014/03/31 职场文书
单位考核鉴定意见
2015/06/05 职场文书
2019年员工晋升管理制度范本!
2019/07/08 职场文书
Python实现byte转integer
2021/06/03 Python
Win11 BitLocker 驱动器加密
2022/04/19 数码科技