微信公众号开发(十二)OAuth2.0网页授权
OAuth允许用户提供一个令牌,而不是用户名和密码来访问它们存放在特定服务器上的数据,每一个令牌授权一个特定的网站在特定时段内访问特定的资源。
授权过程如下:
1、引导用户进入授权页面同意授权,获取code
2、通过code换取网页授权access_token(与基础支持中的access_token不同)
3、如果需要,开发者可以刷新网页授权access_token,避免过期
4、通过网页授权access_token和openid获取用户基本信息(支持UnionID机制)
1、配置授权回调页面域名
2、用户授权获取code
<?php
if (isset($_GET['code'])){
echo "code:".$_GET['code']."<br>";
echo "state:".$_GET["state"];
}else {
echo "no code";
}
<?php
@header('Content-type: text/html;charset=UTF-8');
//设置时区
date_default_timezone_set("Asia/Shanghai");
//定义TOKEN常量,这里的"weixin"就是在公众号里配置的TOKEN require_once("Utils.php");
//打印请求的URL查询字符串到query.xml
Utils::traceHttp(); $wechatObj = new wechatCallBackapiTest();
$wechatObj->responseMsg(); class wechatCallBackapiTest
{
public function responseMsg()
{
//获取post过来的数据,它一个XML格式的数据
$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
//将数据打印到log.xml
Utils::logger($postStr);
if (!empty($postStr)) {
//将XML数据解析为一个对象
$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
$RX_TYPE = trim($postObj->MsgType);
//消息类型分离
switch($RX_TYPE)
{
case "text":
$result = $this->receiveText($postObj);
break;
default:
$result = "";
break;
}
Utils::logger($result, '公众号');
echo $result;
}else {
echo "";
exit;
}
} private function receiveText($object)
{
$appid = "wx07fff9c79a410b69";
$redirect_uri = urlencode("http://weiweiyi.duapp.com/oauth/oauth2.php"); $keyword = trim($object->Content);
if(strstr($keyword, "base")){
$url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=$appid&redirect_uri=".
"$redirect_uri&response_type=code&scope=snsapi_base&state=123#wechat_redirect";
$content = "用户授权snsapi_base实现:<a href='$url'>单击这里体验OAuth授权</a>";
}else if (strstr($keyword, "userinfo")){
$url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=$appid&redirect_uri=".
"$redirect_uri&response_type=code&scope=snsapi_userinfo&state=123#wechat_redirect";
$content = "用户授权snsapi_userInfo实现:<a href='$url'>单击这里体验OAuth授权</a>";
}else{
$content = "";
}
$result = $this->transmitText($object, $content);
return $result;
}
/**
* 回复文本消息
*/
private function transmitText($object, $content)
{
$xmlTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime><![CDATA[%s]]></CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[%s]]></Content>
</xml>";
$result = sprintf($xmlTpl, $object->FromUserName, $object->ToUserName, time(), $content);
return $result;
}
}
点击userinfo,则先返回如下页面,需要用户点击“确认”后才能重定向到oauth2.php。
3、使用code换取access_token
<?php
@header('Content-type: text/plain;charset=UTF-8');
require_once("../Utils.php"); $appid = "wx07fff9c79a410b69";
$appsecret = "092c0c0c5bd62f66b76ad241612915fb";
$code = "0016Q5kn0zdDFp1E3rjn0VUjkn06Q5km"; $url = "https://api.weixin.qq.com/sns/oauth2/access_token?"
."appid=$appid&secret=$appsecret&code=$code&grant_type=authorization_code";
$result = Utils::https_request($url);
echo $result;
如果是base,授权流程到此结束,返回:
{
    "access_token": "b3e1GZdT1E-sjKzeKRCr9XUE6IQglkBBxrFXdsmZ8DVW4O5t16EXbIxCoob6pGXwA5Z9JubOZnIytGcM5xC20g",
    "expires_in": 7200,
    "refresh_token": "yJkiFmmRVq5Kst6PiZpwGPvJh0bcegccx-KFIZEIwYKRmdiLC5dG8-iMRkjl1Stf8cSrHjDauzZtEGNHlnGckA",
    "openid": "o4WmZ0h-4huBUVQUczx2ezaxIL9c",
    "scope": "snsapi_base"
}
如果是userinfo,返回:
{
    "access_token": "iUIP_RnPmjVICZtmq6fFRcslRD1yJax3IkeT_fXKFlDv5W_9y5JS4Z4QgC1W33Qi2BbQ5pWLWt-6LYT7u1Egvg",
    "expires_in": 7200,
    "refresh_token": "rKwY7NF0BqfSpLVwmVO-htyvlrFWQVRmCdimoaLG2JiHz8wEJZ2H7fcQ5wtJylixBt-dCENgasbaSs8_7M-Kmw",
    "openid": "o4WmZ0h-4huBUVQUczx2ezaxIL9c",
    "scope": "snsapi_userinfo"
}
4、刷新access_token(可选)
<?php
@header('Content-type: text/plain;charset=UTF-8');
require_once("../Utils.php"); $appid = "wx07fff9c79a410b69";
$appsecret = "092c0c0c5bd62f66b76ad241612915fb";
$refresh_token = "rKwY7NF0BqfSpLVwmVO-htyvlrFWQVRmCdimoaLG2JiHz8wEJZ2H7fcQ5wtJylixBt-dCENgasbaSs8_7M-Kmw"; $url = "https://api.weixin.qq.com/sns/oauth2/refresh_token?"
."appid=$appid&grant_type=refresh_token&refresh_token=$refresh_token";
$result = Utils::https_request($url);
echo $result;
返回:
{
    "openid": "o4WmZ0h-4huBUVQUczx2ezaxIL9c",
    "access_token": "iUIP_RnPmjVICZtmq6fFRcslRD1yJax3IkeT_fXKFlDv5W_9y5JS4Z4QgC1W33Qi2BbQ5pWLWt-6LYT7u1Egvg",
    "expires_in": 7200,
    "refresh_token": "rKwY7NF0BqfSpLVwmVO-htyvlrFWQVRmCdimoaLG2JiHz8wEJZ2H7fcQ5wtJylixBt-dCENgasbaSs8_7M-Kmw",
    "scope": "snsapi_base,snsapi_userinfo,"
}
5、使用access_token获取用户信息
<?php
@header('Content-type: text/plain;charset=UTF-8');
require_once("../Utils.php"); $access_token = "iUIP_RnPmjVICZtmq6fFRcslRD1yJax3IkeT_fXKFlDv5W_9y5JS4Z4QgC1W33Qi2BbQ5pWLWt-6LYT7u1Egvg";
$openid = "o4WmZ0h-4huBUVQUczx2ezaxIL9c"; $url = "https://api.weixin.qq.com/sns/userinfo?"
."access_token=$access_token&openid=$openid&lang=zh_CN ";
$result = Utils::https_request($url);
echo $result;
返回:
{
    "openid": "o4WmZ0h-4huBUVQUczx2ezaxIL9c",
    "nickname": "Promise",
    "sex": 1,
    "language": "zh_CN",
    "city": "",
    "province": "",
    "country": "",
    "headimgurl": "http://wx.qlogo.cn/mmopen/vi_32/um6ptBDhpau47ctyJHMakZgyHJsYHzjMfouyWqP6DNxNEPLf2uk6V6TBNnsbanrUcABJiaEa74W8VB7JRk9k0kg/0",
    "privilege": []
}
授权过程到此结束。
下面来个完整版的,新建一个oauth_complete.php文件。
<?php
@header('Content-type: text/plain;charset=UTF-8');
require_once("../Utils.php");
$code = $_GET["code"];
$userinfo = getUserInfo($code);
echo $userinfo;
function getUserInfo($code)
{
    $appid = "wx07fff9c79a410b69";
    $appsecret = "092c0c0c5bd62f66b76ad241612915fb";
    //根据code获得access_token
    $access_token_url = "https://api.weixin.qq.com/sns/oauth2/access_token?"
        ."appid=$appid&secret=$appsecret&code=$code&grant_type=authorization_code";
    $access_token_json = Utils::https_request($access_token_url);
    $access_token_array = json_decode($access_token_json, true);
    //access_token
    $access_token = $access_token_array["access_token"];
    //openid
    $openid = $access_token_array["openid"];
    //根据access_token和openid获得用户信息
    $userinfo_url = "https://api.weixin.qq.com/sns/userinfo?"
        ."access_token=$access_token&openid=$openid&lang=zh_CN ";
    $userinfo_json = Utils::https_request($userinfo_url);
    return $userinfo_json;
}
注意:获取的code只能使用一次,超过一次会报40163的错误,这时会获取不到access_token。
微信公众号开发(十二)OAuth2.0网页授权的更多相关文章
- 【微信公众号开发】【8】网页授权获取用户基本信息(OAuth 2.0)
		
前言: 1,在微信公众号请求用户网页授权之前,开发者需要先到公众平台官网中的“开发 - 接口权限 - 网页服务 - 网页帐号 - 网页授权获取用户基本信息”的配置选项中,修改授权回调域名. 请注意,这 ...
 - Java微信公众平台开发(十二)--微信JSSDK的使用
		
在前面的文章中有介绍到我们在微信web开发过程中常常用到的 [微信JSSDK中Config配置],但是我们在真正的使用中我们不仅仅只是为了配置Config而已,而是要在我们的项目中真正去使用微信JS- ...
 - Java微信公众平台开发(十二)--微信用户信息的获取
		
转自:http://www.cuiyongzhi.com/post/56.html 前面的文章有讲到微信的一系列开发文章,包括token获取.菜单创建等,在这一篇将讲述在微信公众平台开发中如何获取微信 ...
 - nodejs vue 微信公众号开发(二)申请微信测试号
		
1.打开微信测试公众号开发平台http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login 扫码登陆
 - 微信公众平台开发,模板消息,网页授权,微信JS-SDK,二维码生成(4)
		
微信公众平台开发,模板消息,什么是模板消息,模板消息接口指的是向用户发送重要的服务通知,只能用于符合场景的要求中去,如信用卡刷卡通知,购物成功通知等等.不支持广告营销,打扰用户的消息,模板消息类有固定 ...
 - 微信公众号开发(二)获取access_token
		
参考:https://www.cnblogs.com/liuhongfeng/p/4848851.html 一:介绍. 接口调用请求说明 http请求方式: GET https://api.weixi ...
 - 微信公众号开发(二)获取AccessToken、jsapi_ticket
		
Access Token 在微信公众平台接口开发中,Access Token占据了一个很重要的地位,相当于进入各种接口的钥匙,拿到这个钥匙才有调用其他各种特殊接口的权限. access_token是公 ...
 - thinkphp 实现微信公众号开发(二)--实现自定义菜单
		
IndexController.class.php <?php namespace Home\Controller; use Think\Controller; class IndexContr ...
 - C#微信公众号开发 -- (二)验证成为开发者
		
接下来就是验证成为开发者了.先来看一下验证的界面及需要填写的信息 在接口配置信息中填写需要处理验证信息的页面或者一般性处理文件,这里以aspx页面为例 URl中的格式为:http://XXX.com/ ...
 - .NET微信公众号开发-5.0微信支付
		
一.前言 在开始做这个功能之前,我们要做的第一件事情就是思考,如何做这个微信支付,从哪里开始,从哪里入手,官方的sdk说明什么的,有没有什么官方的demo,还有就是老板给我的一些资料齐全不,那些要申请 ...
 
随机推荐
- Android方法数不能超过65535
			
为什么方法数不能超过65535?搬上Dalvik工程师在SF上的回答,因为在Dalvik指令集里,调用方法的invoke-kind指令中,method reference index只给了16bits ...
 - bzoj3997组合数学(求最长反链的dp)
			
组合数学 给出一个网格图,其中某些格子有财宝,每次从左上角出发,只能向下或右走.问至少走多少次才能将财宝捡完.此对此问题变形,假设每个格子中有好多财宝,而每一次经过一个格子至多只能捡走一块财宝,至少走 ...
 - http://codeforces.com/contest/612/problem/D
			
D. The Union of k-Segments time limit per test 4 seconds memory limit per test 256 megabytes input s ...
 - 支持向量机SVM(一)
			
[转载请注明出处]http://www.cnblogs.com/jerrylead 1 简介 支持向量机基本上是最好的有监督学习算法了.最开始接触SVM是去年暑假的时候,老师要求交<统计学习理论 ...
 - python---random模块使用详解
			
random与随机操作有关的模块 常用方法: random() --- 返回0-1之见得一个随机浮点数. 调用:random.random() 例如: >>> random.rand ...
 - jQuery中下拉select、复选checkbox、单选radio的操作代码
			
//select $("#Icon") //对象 $("#Icon").val() //取值 $("#Icon").val("fa ...
 - ch3-form(get/post) $.ajax(get/post)
			
1 http(get)请求 提交的数据 用req.query接收 1.1 router.get() //http(get)请求方式 1.2 接收http(get)方式提交的数据 req.query 方 ...
 - xml解析总结-常用需掌握
			
Xml文档的解析 XML解析方式分为两种:DOM方式和SAX方式 DOM:Document Object Model, 文档对象模型.这种方式是W3C推荐的处理XML的一种方式. SAX:Simple ...
 - Java面向对象 网络编程  下
			
Java面向对象 网络编程 下 知识概要: (1)Tcp 练习 (2)客户端向服务端上传一个图片. (3) 请求登陆 (4)url 需求:上传图片. 客户端: ...
 - MySQL笔记 存储过程 游标 触发器
			
第二十三章 使用存储过程 MySQL5 中添加了存储过程的支持. 大多数SQL语句都是针对一个或多个表的单条语句.并非所有的操作都怎么简单.经常会有一个完整的操作需要多条才能完成 存储过程简单来说,就 ...