微信开发之微信网页授权 完整示例
所有微信开发的相关内容,都需要参考官方文档。
[微信公众平台|开发文档] http://mp.weixin.qq.com/wiki/home/。
一、通过网页授权,可以获取用户微信的基本信息。
二、总共有5个步骤:
1 :用户同意授权,获取code
2 :通过code换取网页授权access_token
3 :刷新access_token(如果需要)
4 :拉取用户信息(需scope为 snsapi_userinfo)
5 附:检验授权凭证(access_token)是否有效
三、每一个步骤的实现。
1 :用户同意授权,获取code
/*** @explain* 获取code,用于获取openid和access_token* @remark* code只能使用一次,当获取到之后code失效,再次获取需要重新进入* 不会弹出授权页面,适用于关注公众号后自定义菜单跳转等,如果不关注,那么只能获取openid**/public function getCode(){if (isset($_GET["code"])) {return $_GET["code"];} else {$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";header($str);exit;}}
2 :通过code换取网页授权access_token
/*** @explain* 用于获取access_token,返回的<span style="font-family: Arial, Helvetica, sans-serif;">$access_token_array中也包含有用户的openid信息。</span>
**/public function getOpenId(){$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";$access_token_json = $this->https_request($access_token_url);$access_token_array = json_decode($access_token_json, TRUE);return $access_token_array;}
3 :刷新access_token(如果需要)
这一步直接略过。
4 :拉取用户信息(需scope为 snsapi_userinfo)
/*** @explain* 获取到用户的openid之后可以判断用户是否有数据,可以直接跳过获取access_token,也可以继续获取access_token**/public function getUserInfo(){$userinfo_url = "https://api.weixin.qq.com/sns/userinfo?access_token=".$this->access_token['access_token'] ."&openid=" . $this->access_token['openid']."&lang=zh_CN";$userinfo_json = $this->https_request($userinfo_url);$userinfo_array = json_decode($userinfo_json, TRUE);return $userinfo_array;}
至此四个步骤全部完成。
四、完整代码。实际项目使用TP3.2.3。
<?phpnamespace Wechat\Controller;use Think\Controller;//微信接口基础类,其他微信类都继承这个基础类。可以自动判断用户状态,获取用户信息。
class WxbaseController extends Controller
{public $appid = 'wxba09d9f0fed4b84b'; //微信APPID,公众平台获取public $appsecret = '332c2b1fc1eb282c0136b73723db4237'; //微信APPSECREC,公众平台获取public $index_url = "http://www.你的域名.cn/项目目录/index.php?m=分组&c=控制器&a=方法"; //微信回调地址,要跟公众平台的配置域名相同public $code;public $openid;/***检测有无$_SESSION。<span style="font-family: Arial, Helvetica, sans-serif;">如果有,直接忽略。</span>
*如果没有$<span style="font-family:Arial, Helvetica, sans-serif;">_SESSION</span>,就依次执行getCode、getOpenId、getUserInfo来获取用户信息。目的是解决CODE只能获取一次,刷新页面openid会丢失的问题。*再判断是否在数据库中,没有则写入数据库。最后将open_id写入session。
<span style="white-space:pre"> </span>*/public function _initialize(){if (!$_SESSION['openid']) { //如果$_SESSION中没有openid,说明用户刚刚登陆,就执行getCode、getOpenId、getUserInfo获取他的信息$this->code = $this->getCode();$this->access_token = $this->getOpenId();$userInfo = $this->getUserInfo();if ($userInfo) {$ins = M('Wechat_user_info');<span style="white-space:pre"> </span> //其他框架请自行调整方法。$map['openid'] = $userInfo['openid'];$result = $ins->where($map)->find(); //根据OPENID查找数据库中是否有这个用户,如果没有就写数据库。继承该类的其他类,用户都写入了数据库中。if (!$result) {$ins->add($userInfo);}session('openid', $userInfo['openid']); //写到$_SESSION中。微信缓存很坑爹,调试时请及时清除缓存再试。}}}/*** @explain* 获取code,用于获取openid和access_token* @remark* code只能使用一次,当获取到之后code失效,再次获取需要重新进入* 不会弹出授权页面,适用于关注公众号后自定义菜单跳转等,如果不关注,那么只能获取openid**/public function getCode(){if (isset($_GET["code"])) {return $_GET["code"];} else {$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";
header($str);exit;}}/*** @explain* 用于获取用户openid**/public function getOpenId(){$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";$access_token_json = $this->https_request($access_token_url);$access_token_array = json_decode($access_token_json, TRUE);return $access_token_array;}/*** @explain* 通过code获取用户openid以及用户的微信号信息* @return* @remark* 获取到用户的openid之后可以判断用户是否有数据,可以直接跳过获取access_token,也可以继续获取access_token* access_token每日获取次数是有限制的,access_token有时间限制,可以存储到数据库7200s. 7200s后access_token失效**/public function getUserInfo(){$userinfo_url = "https://api.weixin.qq.com/sns/userinfo?access_token=".$this->access_token['access_token'] ."&openid=" . $this->access_token['openid']."&lang=zh_CN";$userinfo_json = $this->https_request($userinfo_url);$userinfo_array = json_decode($userinfo_json, TRUE);return $userinfo_array;}/*** @explain* 发送http请求,并返回数据**/public function https_request($url, $data = null){$curl = curl_init();curl_setopt($curl, CURLOPT_URL, $url);curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);if (!empty($data)) {curl_setopt($curl, CURLOPT_POST, 1);curl_setopt($curl, CURLOPT_POSTFIELDS, $data);}curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);$output = curl_exec($curl);curl_close($curl);return $output;}
}
微信开发之微信网页授权 完整示例相关推荐
- 【wechat】微信开发——OAuth2.0网页授权
一.框架.工具 spring+springMvc+idea 二.具体实现 1.首先需要了解一下微信提供的API开发文档 2.目的:授权后可获取用户基本信息,进而实现业务逻辑 3.需要的配置(参看API ...
- 连小白都能看懂的微信开发之 微信自定义菜单 + 获取网页授权 + 获取用户信息
微信自定义菜单+获取网页授权+获取用户信息 今天项目需要一个需求,就是添加一个菜单接口,并且还可以获取用于的信息,从而根据用户的信息去做一些业务的查询.通过百度和自己查看文档大致的解决办法如下: 注意 ...
- 微信公众平台开发OAuth2.0网页授权(转)
微信公众平台开发 OAuth2.0网页授权认证 网页授权获取用户基本信息 作者:方倍工作室 微信公众平台最近新推出微信认证,认证后可以获得高级接口权限,其中一个是OAuth2.0网页授权,很多朋友在 ...
- 企业微信三方开发(三):网页授权登录
其他链接 初识微信开发 企业微信三方开发:注册企业微信服务商 企业微信三方开发(一):回调验证及重要参数获取 企业微信三方开发(二):获取access_token 企业微信三方开发(三):网页授权登录 ...
- 微信公众号的网页授权如何在本地调试?
调试微信公众号的网页授权时,要填写网页授权域名(如图1),否则授权的时候会提示redirect_uri参数错误(图2),可是我得在localhost先调试成功才能上传到实际的网站上吧,可是这里不支持l ...
- 微信鉴权服务器地址,微信开发之微信授权登录
本篇教程探讨了微信开发之微信授权登录,希望阅读本篇文章以后大家有所收获,帮助大家对相关内容的理解更加深入. < 应用场景是:用Hbuilder打包app,在app中点击微信授权登录或者某一操作, ...
- 微信公众号-测试号-网页授权
微信公众号-测试号-网页授权 自己摸索几天,总算搞清楚了 第一步 登录微信公众号平台,开发者工具菜单进入公众平台测试账号 第二步 设置网页帐号 网页授权获取用户基本信息的域名,测试号是可以用ip和域名 ...
- php 微信 语音,PHP语言微信开发:微信录音临时转永久存储
本文主要向大家介绍了PHP语言微信开发:微信录音临时转永久存储,通过具体的内容向大家展示,希望对大家学习php语言有所帮助. 最近做开发的时候碰到了这个问题,甲方希望用户在微信端的录音能够一直有效.就 ...
- 微信开发:微信js_sdk 分享,前端部分(二)
微信开发:微信js-sdk前端分享,代码如下: <script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"> ...
最新文章
- JavaScript获取DOM元素位置和尺寸大小
- Softmax 回归 vs. k 个二元分类器
- opengl 反走样 混合 多重采样 blend multisample
- nyoj 10 skiing(DAG上的最长路,备忘录方法)
- mybatis配置properties属性
- mac安全与隐私只有两个选项,少了一个任何来源
- 关于js获取radio和select的属性并控制
- php实现文件留言,PHP文件操作及实例:留言板
- linux服务器怎么防,Linux服务器防攻击的各种方案
- 深度揭秘阿里云 Serverless Kubernetes
- HTML实现点击时的阴影(:active)(已解决iOS微信上无法使用)
- 获得邮件列表失败_邮件经常失败回弹很糟心?一定要知道这几个小知识
- 看到前一篇文章的感慨
- #paragma详解
- 《无人机DIY》——导读
- 支付宝网页支付(签名)
- 【bzoj3162】独钓寒江雪
- python闲鱼监控_推荐一个可玩的爬虫开源项目-闲鱼部分我已经测试过
- 【CAD】多段线的合并与闭合的操作与测试
- 常见的请求错误HTTP状态码