0网页授权

对于我这种写小项目的人来说,对于状态码的认识就只停留在 200 和 404。今天就写篇博客总结一下其他的状态码。

OAuth允许用户提供一个令牌,而不是用户名和密码来访问它们存放在特定服务器上的数据,每一个令牌授权一个特定的网站在特定时段内访问特定的资源。

200

成功响应了请求

授权过程如下:

301

永久重定向。一般来说就是网站已经换了个域名了。比如说阮一峰的网站被攻击了,要再开一个新的,那么原来旧的就应该返回 301 告诉浏览器要去另外一个网站。

1、引导用户进入授权页面同意授权,获取code 

302

临时重定向。一般来说网站还是用那个域名,但是可能需要维护一下,就先将用户的请求临时重定向到另一个网址上,等修完了 bug,那个网站又能正常访问了。

2、通过code换取网页授权access_token(与基础支持中的access_token不同) 

400

语义错误,一般我遇到的400都是参数写错了。比如密码写成了 pasword=123

3、如果需要,开发者可以刷新网页授权access_token,避免过期 

403

服务器已经理解请求,但是拒绝执行它。这个错一般是使用 tomcat 的时候输错密码就会报这个 code。就是说密码没对没权限访问。

4、通过网页授权access_token和openid获取用户基本信息(支持UnionID机制) 

404

不用说了吧,找不到资源。

1、配置授权回调页面域名

在测试号权限列表中找到OAuth2.0网页授权,然后点击修改,填写自己的域名,注意不能带

图片 1

图片 2

405

这个一般在使用 Servlet 时,本来是不支持 RESTful 的,如果发送 PUT, DELETE 请求是会报这个 code。解决方法就是导入包使得后台支持 RESTful。

2、用户授权获取code

接口:

scope的两种区别:

snsapi_base:不弹出授权页面,直接跳转,只能获取用户openid

snsapi_userinfo:弹出授权页面,可通过openid拿到昵称、性别、所在地。并且,即使在未关注的情况下,只要用户授权,也能获取其信息。



**redirect_uri:授权后重定向的回调链接地址,请使用urlencode对链接进行处理。




**尤其注意:由于授权操作安全等级较高,所以在发起授权请求时,微信会对授权链接做正则强匹配校验,如果链接的参数顺序不对,授权页面将无法正常访问。




在根目录下新建一个文件夹oauth,并在该文件夹下新建oauth2.php。该文件就是,接口中redirect_uri域名回调页面。

具体获取code的方法步骤是:提供用户请求授权页面的URL,也就是以上的接口,用户点击授权页面URL向服务器发起请求,服务器询问用户是否同意(scope为snsapi_base时无此步骤),用户同意(scope为snsapi_base时无此步骤),服务器将code通过回调传给公众账号开发者。

这里我们只是简单的输出以下code。

oauth2.php

<?php
if (isset($_GET['code'])){
    echo "code:".$_GET['code']."<br>";
    echo "state:".$_GET["state"];
}else {
    echo "no code";
}

然后在index.php中向用户发送授权URL,如下所示。

index.php

<?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;
    }
}

向公众号分别发送“base”和"baseInfo",则返回如图所示:

图片 3

点击base链接后,直接重定向到oauth2.php页面,可以看到返回的参数中不仅有code,还返回了url中填写的state字段。

图片 4

点击userinfo,则先返回如下页面,需要用户点击“确认”后才能重定向到oauth2.php。

图片 5

500

服务器错误,一般就是后台代码报错了,像什么空指针错误,不能连接 JDBC,一般要看后台 LOG 去排错。

3、使用code换取access_token

如果网页授权作用域是snsapi_base,则本步骤获取到网页授权access_token的同时,也获取到了openid,snsapi_base式的网页授权流程到此为止。注意这里的access_token和基础接口中的access_token不同。

接口:

get_token.php

<?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"
}

502

一般出现了这个问题是由于不良的IP之间的沟通后端计算机。一般呢也不会遇到这个错。

4、刷新access_token(可选)

由于access_token拥有较短的有效期,当access_token超时后,可以使用refresh_token进行刷新,refresh_token有效期为30天,当refresh_token失效之后,需要用户重新授权。

接口:

get_refresh_token.php

<?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获取用户信息

接口:

get_userinfo.php

<?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文件。

将index.php中重定向url改为:$redirect_uri = urlencode("");

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。

如果不是官方微信网页,会弹出以下界面:

图片 6

其实在这之前已经发送了一次请求,点击“继续访问”实际上相当于第二次访问该页面,所以code也是第二次使用,会报错。

本文由365bet体育在线官网发布于网络工程,转载请注明出处:0网页授权

TAG标签:
Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。