您的位置:首页 > 移动开发 > 微信开发

微信公众平台开发 OAuth2.0网页授权

2016-03-25 09:39 459 查看

一、什么是OAuth2.0

官方网站:http://oauth.net/   http://oauth.net/2/ 
权威定义:OAuth is An open protocol to allow secure authorization in a simple and standard method from web, mobile and desktop applications.

OAuth是一个开放协议,允许用户让第三方应用以安全且标准的方式获取该用户在某一网站、移动或桌面应用上存储的私密的资源(如用户个人信息、照片、视频、联系人列表),而无需将用户名和密码提供给第三方应用。

OAuth 2.0是OAuth协议的下一版本,但不向后兼容OAuth 1.0。 OAuth 2.0关注客户端开发者的简易性,同时为Web应用,桌面应用和手机,和起居室设备提供专门的认证流程。

OAuth允许用户提供一个令牌,而不是用户名和密码来访问他们存放在特定服务提供者的数据。每一个令牌授权一个特定的网站(例如,视频编辑网站)在特定的时段(例如,接下来的2小时内)内访问特定的资源(例如仅仅是某一相册中的视频)。这样,OAuth允许用户授权第三方网站访问他们存储在另外的服务提供者上的信息,而不需要分享他们的访问许可或他们数据的所有内容。

新浪微博API目前也使用OAuth 2.0。


二、微信公众平台OAuth2.0授权

微信公众平台OAuth2.0授权详细步骤如下:

用户关注微信公众账号。

微信公众账号提供用户请求授权页面URL。

用户点击授权页面URL,将向服务器发起请求

服务器询问用户是否同意授权给微信公众账号(scope为snsapi_base时无此步骤)

用户同意(scope为snsapi_base时无此步骤)

服务器将CODE通过回调传给微信公众账号

微信公众账号获得CODE

微信公众账号通过CODE向服务器请求Access Token

服务器返回Access Token和OpenID给微信公众账号

微信公众账号通过Access Token向服务器请求用户信息(scope为snsapi_base时无此步骤)

服务器将用户信息回送给微信公众账号(scope为snsapi_base时无此步骤)

使用的AppId和AppSecret在开发者中心-开发者ID中,可以找到。

配置授权回调页面域名

进入微信公众平台后台后,依次进入开发者中心-权限表,找到网页授权获取用户基本信息

用户授权并获取code

在域名根目录下,新建一个文件,命名为oauth2.php,其内容为

<?php
if (isset($_GET['code'])){
echo $_GET['code'];
}else{
echo "NO CODE";
}
?>


先了解下请求授权页面的构造方式:

https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect

参数说明

参数 必须 说明

appid 是 公众号的唯一标识

redirect_uri 是 授权后重定向的回调链接地址

response_type 是 返回类型,请填写code

scope 是 应用授权作用域,snsapi_base (不弹出授权页面,直接跳转,只能获取用户openid),snsapi_userinfo (弹出授权页面,可通过openid拿到昵称、性别、所在地。并且,即使在未关注的情况下,只要用户授权,也能获取其信息)

state 否 重定向后会带上state参数,开发者可以填写任意参数值

wechat_redirect 否 直接在微信打开链接,可以不填此参数。做页面302重定向时候,必须带此参数

应用授权作用域:由于snsapi_base只能获取到openid,意义不大,所以我们使用snsapi_userinfo。

回调地址:填写为刚才上传后的oauth2.php的文件地址,

state参数:随便一个数字,这里填1

构造请求url如下:

https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx8888888888888888&redirect_uri=http://mascot.duapp.com/oauth2.php&response_type=code&scope=snsapi_userinfo&state=1#wechat_redirect

把这个链接发送到微信中,以便在微信浏览器中打开,这里使用A链接封装如下:

OAuth2.0网页授权演示

<a href="https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx8888888888888888&redirect_uri=http://mascot.duapp.com/oauth2.php&response_type=code&scope=snsapi_userinfo&state=1#wechat_redirect">点击这里体验</a>


3.使用code换取access_token 换取网页授权access_token页面的构造
https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code


参数说明是否必须 说明

appid 是 公众号的唯一标识

secret 是 公众号的appsecret

code 是 填写第一步获取的code参数

grant_type 是 填写为authorization_code

code:在这里填写为上一步获得的值

构造请求url如下:

https://api.weixin.qq.com/sns/oauth2/access_token?appid=wx8888888888888888&secret=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa&code=00b788e3b42043c8459a57a8d8ab5d9f&grant_type=authorization_code


demo

<?php

//微信获取code
public function getWXcode(){
$weixin = new class_weixin();
$redirect_url = 'http://www.xxxx.com/weixin_oauth2.php';
$weixin->oauth2_url($redirect_url,'snsapi_userinfo');
}
//  //微信openid
public function weixin_oauth2(){
// var_dump('fef');
//       $weixin = new class_weixin();
if(!isset($GLOBALS['code'])&&empty($GLOBALS['code'])){
exit('参数非法!');
}
//登录完微信,获取用户的基本信息
$token = $weixin->oauth2_access_token($GLOBALS["code"]);
if ($token) {
//把返回的code存到session里
$_SESSION['token'] = $token;
$openid=$_SESSION['token']['openid'];
echo $openid;
}

}
//生成授权url
public function oauth2_url($redirect_url,$scope,$state=1){
$url = "https://open.weixin.qq.com/connect/qrconnect?appid=".$this->appid."&redirect_uri=".urlencode($redirect_url)."&response_type=code&scope=".$scope."&state=".$state."#wechat_redirect";
$res = $this->http_request($url);
error_log(print_r($res,1),3,'d:2.php');
echo  $res;
}
//生成OAuth2的Access Token
public function oauth2_access_token($code)
{
$url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=".$this->appid."&secret=".$this->appsecret."&code=".$code."&grant_type=authorization_code";
$res = $this->http_request($url);
return json_decode($res, true);
}

//HTTP请求(支持HTTP/HTTPS,支持GET/POST)
protected function http_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, TRUE);
$output = curl_exec($curl);
curl_close($curl);
return $output;
}
?>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: