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 相关文章推荐
Cakephp 执行主要流程
Mar 24 PHP
简单PHP上传图片、删除图片实现代码
May 12 PHP
深入PHP变量存储的详解
Jun 13 PHP
PHP date()函数警告: It is not safe to rely on the system解决方法
Aug 20 PHP
使用PHPCMS搭建wap手机网站
Sep 20 PHP
PHP处理二进制数据的实现方法
Jun 13 PHP
详解配置 Apache 服务器支持 PHP 文件的解析
Feb 15 PHP
Mac系统完美安装PHP7详细教程
Jun 06 PHP
Laravel核心解读之异常处理的实践过程
Feb 24 PHP
php创建多级目录与级联删除文件的方法示例
Sep 12 PHP
浅谈laravel中的关联查询with的问题
Oct 10 PHP
php实现根据身份证获取精准年龄
Feb 26 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加速 eAccelerator配置和使用指南
2009/06/05 PHP
php session实现多级目录存放实现代码
2016/02/03 PHP
关于PHP中协程和阻塞的一些理解与思考
2017/08/11 PHP
php设计模式之适配器模式原理、用法及注意事项详解
2019/09/24 PHP
javascript Object与Function使用
2010/01/11 Javascript
JQueryEasyUI datagrid框架的基本使用
2013/04/08 Javascript
设置checkbox为只读(readOnly)的两种方式
2013/10/11 Javascript
jQuery toggleClass应用实例(附效果图)
2014/04/06 Javascript
js实现简单的购物车有图有代码
2014/05/26 Javascript
关于cookie的初识和运用(js和jq)
2016/04/07 Javascript
Javascript删除指定元素节点的方法
2016/06/21 Javascript
JavaScript实现经纬度转换成地址功能
2017/03/28 Javascript
详解angular element()方法使用
2017/04/08 Javascript
完美实现js拖拽效果 return false用法详解
2017/07/28 Javascript
详解vuex 渐进式教程实例代码
2018/11/27 Javascript
前端性能优化建议
2020/09/17 Javascript
Python-基础-入门 简介
2014/08/09 Python
举例讲解如何在Python编程中进行迭代和遍历
2016/01/19 Python
Fiddler如何抓取手机APP数据包
2016/01/22 Python
python3之模块psutil系统性能信息使用
2018/05/30 Python
Python使用LDAP做用户认证的方法
2019/06/20 Python
libreoffice python 操作word及excel文档的方法
2019/07/04 Python
Django 通过JS实现ajax过程详解
2019/07/30 Python
python 实现list或string按指定分段
2019/12/25 Python
NumPy统计函数的实现方法
2020/01/21 Python
python+selenium+chrome批量文件下载并自动创建文件夹实例
2020/04/27 Python
对python中arange()和linspace()的区别说明
2020/05/03 Python
Python tkinter实现简单加法计算器代码实例
2020/05/13 Python
香港通票:Hong Kong Pass
2019/02/26 全球购物
波兰家居和花园家具专家:4Home
2019/05/26 全球购物
北京华建集团SQL面试题
2014/06/03 面试题
财务经理岗位职责
2013/11/09 职场文书
2015年语言文字工作总结
2015/07/23 职场文书
幼儿园教师暑期培训心得体会
2016/01/09 职场文书
详解Python牛顿插值法
2021/05/11 Python
浅谈@Value和@Bean的执行顺序问题
2021/06/16 Java/Android