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 相关文章推荐
第六节 访问属性和方法 [6]
Oct 09 PHP
php获取地址栏信息的代码
Oct 08 PHP
PHP学习笔记之一
Jan 17 PHP
深入解析PHP的引用计数机制
Jun 14 PHP
深入解析php中的foreach问题
Jun 30 PHP
php递归调用删除数组空值元素的方法
Apr 28 PHP
php判断表是否存在的方法
Jun 18 PHP
php5.5使用PHPMailer-5.2发送邮件的完整步骤
Oct 14 PHP
PHP Cli 模式设置进程名称的方法
Jun 12 PHP
laravel-admin select框默认选中的方法
Oct 03 PHP
Laravel数据库读写分离配置的方法
Oct 13 PHP
gearman中worker常驻后台,导致MySQL server has gone away的解决方法
Feb 27 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
php模拟ping命令(php exec函数的使用方法)
2013/10/25 PHP
PHP return语句另类用法不止是在函数中
2014/09/17 PHP
详细讲解JS节点知识
2010/01/31 Javascript
js获取时间(本周、本季度、本月..)
2013/11/22 Javascript
IE6下javasc#ipt:void(0) 无效的解决方法
2013/12/23 Javascript
点击显示指定元素隐藏其他同辈元素的方法
2014/02/19 Javascript
JQuery实现网页右侧随动广告特效
2016/01/17 Javascript
AngularJS入门教程之ng-class 指令用法
2016/08/01 Javascript
seajs学习之模块的依赖加载及模块API的导出
2016/10/20 Javascript
vue-resourse将json数据输出实例
2017/03/08 Javascript
AngularJS动态菜单操作指令
2017/04/25 Javascript
AngularJS学习笔记之表单验证功能实例详解
2017/07/06 Javascript
Vue在页面右上角实现可悬浮/隐藏的系统菜单
2018/05/04 Javascript
Vue 页面状态保持页面间数据传输的一种方法(推荐)
2018/11/01 Javascript
vxe-table vue table 表格组件功能
2019/05/26 Javascript
layui 对table中的数据进行转义的实例
2019/09/12 Javascript
解决antd的Form组件setFieldsValue的警告问题
2020/10/29 Javascript
详解vue3中组件的非兼容变更
2021/03/03 Vue.js
Python中使用select模块实现非阻塞的IO
2015/02/03 Python
python Flask实现restful api service
2017/12/04 Python
Python使用Django实现博客系统完整版
2020/09/29 Python
python Socket网络编程实现C/S模式和P2P
2020/06/22 Python
如何在Anaconda中打开python自带idle
2020/09/21 Python
Python全局变量与global关键字常见错误解决方案
2020/10/05 Python
丹尼尔惠灵顿手表天猫官方旗舰店:Daniel Wellington
2017/08/25 全球购物
白色公司:The White Company
2017/10/11 全球购物
英国最好的温室之家:Greenhouses Direct
2019/07/13 全球购物
图库照片、免版税图片、矢量艺术、视频片段:Depositphotos
2019/08/02 全球购物
通用C#笔试题附答案
2016/11/26 面试题
信息与计算机科学职业规划范文:成为一艘有方向的船
2014/09/11 职场文书
2014最新党员批评与自我批评材料
2014/09/24 职场文书
关爱留守儿童捐款倡议书
2015/04/27 职场文书
Vue3 Composition API的使用简介
2021/03/29 Vue.js
使用tensorflow 实现反向传播求导
2021/05/26 Python
Vue中foreach数组与js中遍历数组的写法说明
2021/06/05 Vue.js
Python帮你解决手机qq微信内存占用太多问题
2022/02/15 Python