热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

微信开发之微信网页授权完整示例

所有微信开发的相关内容,都需要参考官方文档。[微信公众平台|开发文档]http:mp.weixin.qq.comwikihome。一、通过网页授权,可以获取用户微信的基本信息。

所有微信开发的相关内容,都需要参考官方文档。

[微信公众平台|开发文档] http://mp.weixin.qq.com/wiki/home/。

一、通过网页授权,可以获取用户微信的基本信息。

二、总共有5个步骤:

:用户同意授权,获取code

:通过code换取网页授权access_token

:刷新access_token(如果需要)

:拉取用户信息(需scope为 snsapi_userinfo)

附:检验授权凭证(access_token)是否有效

 

三、每一个步骤的实现。

1 :用户同意授权,获取code

[php] view plain copy
  1. /** 
  2.      * @explain 
  3.      * 获取code,用于获取openid和access_token 
  4.      * @remark 
  5.      * code只能使用一次,当获取到之后code失效,再次获取需要重新进入 
  6.      * 不会弹出授权页面,适用于关注公众号后自定义菜单跳转等,如果不关注,那么只能获取openid 
  7.      **/  
  8.     public function getCode()  
  9.     {  
  10.         if (isset($_GET["code"])) {  
  11.             return $_GET["code"];  
  12.         } else {  
  13.             $str = "location: https://open.weixin.qq.com/connect/oauth2/authorize?appid=" . $this->appid . "&redirect_uri=" . $this->index_url . "&response_type=code&scope=snsapi_userinfo&state=1#wechat_redirect";  
  14.             header($str);  
  15.             exit;  
  16.         }  
  17.     }  


2 :通过code换取网页授权access_token

[php] view plain copy
  1. /** 
  2.      * @explain 
  3.      * 用于获取access_token,返回的$access_token_array中也包含有用户的openid信息。 
  4.  
  5.      **/  
  6.     public function getOpenId()  
  7.     {  
  8.         $access_token_url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" . $this->appid . "&secret=" . $this->appsecret . "&code=" . $this->code . "&grant_type=authorization_code";  
  9.         $access_token_json = $this->https_request($access_token_url);  
  10.         $access_token_array = json_decode($access_token_json, TRUE);  
  11.         return $access_token_array;  
  12.     }  


3 :刷新access_token(如果需要)

这一步直接略过。

4 :拉取用户信息(需scope为 snsapi_userinfo)

[php] view plain copy
  1. /** 
  2.      * @explain 
  3.      * 获取到用户的openid之后可以判断用户是否有数据,可以直接跳过获取access_token,也可以继续获取access_token 
  4.      **/  
  5.     public function getUserInfo()  
  6.     {  
  7.           
  8.         $userinfo_url = "https://api.weixin.qq.com/sns/userinfo?access_token=".$this->access_token['access_token'] ."&openid=" . $this->access_token['openid']."&lang=zh_CN";  
  9.         $userinfo_json = $this->https_request($userinfo_url);  
  10.         $userinfo_array = json_decode($userinfo_json, TRUE);  
  11.         return $userinfo_array;  
  12.     }  

至此四个步骤全部完成。

 

四、完整代码。实际项目使用TP3.2.3。

[php] view plain copy
  1.   
  2. namespace Wechat\Controller;  
  3.   
  4. use Think\Controller;  
  5.   
  6. //微信接口基础类,其他微信类都继承这个基础类。可以自动判断用户状态,获取用户信息。  
  7. class WxbaseController extends Controller  
  8. {  
  9.   
  10.     public $appid = 'wxba09d9f0fed4b84b';                   //微信APPID,公众平台获取  
  11.     public $appsecret = '332c2b1fc1eb282c0136b73723db4237'; //微信APPSECREC,公众平台获取  
  12.     public $index_url = "http://www.你的域名.cn/项目目录/index.php?m=分组&c=控制器&a=方法";  //微信回调地址,要跟公众平台的配置域名相同  
  13.     public $code;  
  14.     public $openid;  
  15.   
  16.     /**  
  17.      *检测有无$_SESSION。"font-family: Arial, Helvetica, sans-serif;">如果有,直接忽略。  
  18.      *如果没有$"font-family:Arial, Helvetica, sans-serif;">_SESSION,就依次执行getCode、getOpenId、getUserInfo来获取用户信息。目的是解决CODE只能获取一次,刷新页面openid会丢失的问题。  
  19.      *再判断是否在数据库中,没有则写入数据库。最后将open_id写入session。  
[php] view plain copy
    1. "white-space:pre">    */  
    2.     public function _initialize()  
    3.     {  
    4.             if (!$_SESSION['openid']) {                             //如果$_SESSION中没有openid,说明用户刚刚登陆,就执行getCode、getOpenId、getUserInfo获取他的信息  
    5.                 $this->code = $this->getCode();  
    6.                 $this->access_token = $this->getOpenId();  
    7.                 $userInfo = $this->getUserInfo();  
    8.                 if ($userInfo) {  
    9.                     $ins = M('Wechat_user_info');"white-space:pre">           //其他框架请自行调整方法。  
    10.                     $map['openid'] = $userInfo['openid'];  
    11.                     $result = $ins->where($map)->find();            //根据OPENID查找数据库中是否有这个用户,如果没有就写数据库。继承该类的其他类,用户都写入了数据库中。  
    12.                     if (!$result) {  
    13.                         $ins->add($userInfo);  
    14.                     }  
    15.                     session('openid', $userInfo['openid']);         //写到$_SESSION中。微信缓存很坑爹,调试时请及时清除缓存再试。  
    16.                 }  
    17.             }  
    18.   
    19.     }  
    20.   
    21.     /** 
    22.      * @explain 
    23.      * 获取code,用于获取openid和access_token 
    24.      * @remark 
    25.      * code只能使用一次,当获取到之后code失效,再次获取需要重新进入 
    26.      * 不会弹出授权页面,适用于关注公众号后自定义菜单跳转等,如果不关注,那么只能获取openid 
    27.      **/  
    28.     public function getCode()  
    29.     {  
    30.         if (isset($_GET["code"])) {  
    31.             return $_GET["code"];  
    32.         } else {  
    33.             $str = "location: https://open.weixin.qq.com/connect/oauth2/authorize?appid=" . $this->appid . "&redirect_uri=" . $this->index_url . "&response_type=code&scope=snsapi_userinfo&state=1#wechat_redirect";  
    34.             header($str);  
    35.             exit;  
    36.         }  
    37.     }  
    38.   
    39.     /** 
    40.      * @explain 
    41.      * 用于获取用户openid 
    42.      **/  
    43.     public function getOpenId()  
    44.     {  
    45.         $access_token_url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" . $this->appid . "&secret=" . $this->appsecret . "&code=" . $this->code . "&grant_type=authorization_code";  
    46.         $access_token_json = $this->https_request($access_token_url);  
    47.         $access_token_array = json_decode($access_token_json, TRUE);  
    48.         return $access_token_array;  
    49.     }  
    50.   
    51.     /** 
    52.      * @explain 
    53.      * 通过code获取用户openid以及用户的微信号信息 
    54.      * @return 
    55.      * @remark 
    56.      * 获取到用户的openid之后可以判断用户是否有数据,可以直接跳过获取access_token,也可以继续获取access_token 
    57.      * access_token每日获取次数是有限制的,access_token有时间限制,可以存储到数据库7200s. 7200s后access_token失效 
    58.      **/  
    59.     public function getUserInfo()  
    60.     {  
    61.   
    62.         $userinfo_url = "https://api.weixin.qq.com/sns/userinfo?access_token=".$this->access_token['access_token'] ."&openid=" . $this->access_token['openid']."&lang=zh_CN";  
    63.         $userinfo_json = $this->https_request($userinfo_url);  
    64.         $userinfo_array = json_decode($userinfo_json, TRUE);  
    65.         return $userinfo_array;  
    66.     }  
    67.   
    68.   
    69.     /** 
    70.      * @explain 
    71.      * 发送http请求,并返回数据 
    72.      **/  
    73.     public function https_request($url, $data = null)  
    74.     {  
    75.         $curl = curl_init();  
    76.         curl_setopt($curl, CURLOPT_URL, $url);  
    77.         curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);  
    78.         curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);  
    79.         if (!empty($data)) {  
    80.             curl_setopt($curl, CURLOPT_POST, 1);  
    81.             curl_setopt($curl, CURLOPT_POSTFIELDS, $data);  
    82.         }  
    83.         curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);  
    84.         $output = curl_exec($curl);  
    85.         curl_close($curl);  
    86.         return $output;  
    87.     }  

推荐阅读
  • 基于Net Core 3.0与Web API的前后端分离开发:Vue.js在前端的应用
    本文介绍了如何使用Net Core 3.0和Web API进行前后端分离开发,并重点探讨了Vue.js在前端的应用。后端采用MySQL数据库和EF Core框架进行数据操作,开发环境为Windows 10和Visual Studio 2019,MySQL服务器版本为8.0.16。文章详细描述了API项目的创建过程、启动步骤以及必要的插件安装,为开发者提供了一套完整的开发指南。 ... [详细]
  • 本文介绍了如何利用Struts1框架构建一个简易的四则运算计算器。通过采用DispatchAction来处理不同类型的计算请求,并使用动态Form来优化开发流程,确保代码的简洁性和可维护性。同时,系统提供了用户友好的错误提示,以增强用户体验。 ... [详细]
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • 网站访问全流程解析
    本文详细介绍了从用户在浏览器中输入一个域名(如www.yy.com)到页面完全展示的整个过程,包括DNS解析、TCP连接、请求响应等多个步骤。 ... [详细]
  • 技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统
    技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统 ... [详细]
  • 优化后的标题:深入探讨网关安全:将微服务升级为OAuth2资源服务器的最佳实践
    本文深入探讨了如何将微服务升级为OAuth2资源服务器,以订单服务为例,详细介绍了在POM文件中添加 `spring-cloud-starter-oauth2` 依赖,并配置Spring Security以实现对微服务的保护。通过这一过程,不仅增强了系统的安全性,还提高了资源访问的可控性和灵活性。文章还讨论了最佳实践,包括如何配置OAuth2客户端和资源服务器,以及如何处理常见的安全问题和错误。 ... [详细]
  • 深入探索HTTP协议的学习与实践
    在初次访问某个网站时,由于本地没有缓存,服务器会返回一个200状态码的响应,并在响应头中设置Etag和Last-Modified等缓存控制字段。这些字段用于后续请求时验证资源是否已更新,从而提高页面加载速度和减少带宽消耗。本文将深入探讨HTTP缓存机制及其在实际应用中的优化策略,帮助读者更好地理解和运用HTTP协议。 ... [详细]
  • 在 Ubuntu 中遇到 Samba 服务器故障时,尝试卸载并重新安装 Samba 发现配置文件未重新生成。本文介绍了解决该问题的方法。 ... [详细]
  • DVWA学习笔记系列:深入理解CSRF攻击机制
    DVWA学习笔记系列:深入理解CSRF攻击机制 ... [详细]
  • 该大学网站采用PHP和MySQL技术,在校内可免费访问某些外部收费资料数据库。为了方便学生校外访问,建议通过学校账号登录实现免费访问。具体方案可包括利用学校服务器作为代理,结合身份验证机制,确保合法用户在校外也能享受免费资源。 ... [详细]
  • Spring框架中枚举参数的正确使用方法与技巧
    本文详细阐述了在Spring Boot框架中正确使用枚举参数的方法与技巧,旨在帮助开发者更高效地掌握和应用枚举类型的数据传递,适合对Spring Boot感兴趣的读者深入学习。 ... [详细]
  • 为了在Hadoop 2.7.2中实现对Snappy压缩和解压功能的原生支持,本文详细介绍了如何重新编译Hadoop源代码,并优化其Native编译过程。通过这一优化,可以显著提升数据处理的效率和性能。此外,还探讨了编译过程中可能遇到的问题及其解决方案,为用户提供了一套完整的操作指南。 ... [详细]
  • 在优化Nginx与PHP的高效配置过程中,许多教程提供的配置方法存在诸多问题或不良实践。本文将深入探讨这些常见错误,并详细介绍如何正确配置Nginx和PHP,以实现更高的性能和稳定性。我们将从Nginx配置文件的基本指令入手,逐步解析每个关键参数的最优设置,帮助读者理解其背后的原理和实际应用效果。 ... [详细]
  • Python 伦理黑客技术:深入探讨后门攻击(第三部分)
    在《Python 伦理黑客技术:深入探讨后门攻击(第三部分)》中,作者详细分析了后门攻击中的Socket问题。由于TCP协议基于流,难以确定消息批次的结束点,这给后门攻击的实现带来了挑战。为了解决这一问题,文章提出了一系列有效的技术方案,包括使用特定的分隔符和长度前缀,以确保数据包的准确传输和解析。这些方法不仅提高了攻击的隐蔽性和可靠性,还为安全研究人员提供了宝贵的参考。 ... [详细]
  • Python 程序转换为 EXE 文件:详细解析 .py 脚本打包成独立可执行文件的方法与技巧
    在开发了几个简单的爬虫 Python 程序后,我决定将其封装成独立的可执行文件以便于分发和使用。为了实现这一目标,首先需要解决的是如何将 Python 脚本转换为 EXE 文件。在这个过程中,我选择了 Qt 作为 GUI 框架,因为之前对此并不熟悉,希望通过这个项目进一步学习和掌握 Qt 的基本用法。本文将详细介绍从 .py 脚本到 EXE 文件的整个过程,包括所需工具、具体步骤以及常见问题的解决方案。 ... [详细]
author-avatar
糖糖6
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有