wechat-development20141205

微信开发手记之·网页授权

因为微信公众号的兴起和极强的扩散能力,公司的大部分客户也已经慢慢把这方面的业务作为了合作的必要需求,作为公司在移动端的推广和信息推送的重要手段微信的开发显得尤为重要,便捷性、时效性、好的用户体验可以让用户尽可能的记住你从而对公众号或公司做到较大程度的宣传和推广。依托于腾讯的强大平台和数亿万级的用户群体把微信称作移动端所有网页的入口一点也不为过。

这篇文章的初衷是把自己写过的代码收集起来方便下次使用,桌面的文件实在太多了导致每次达到满屏的时候就需要新建一次文件夹然后把所有文件一拷贝就随手扔进其他盘里了,这样做最大的问题就是等下次需要的时候各种找然后各种找不到,不知道大家有木有这么干过,说到这里就不得不上一张截图晒晒桌面了,求勿喷!

desktop20141205142427

有点话多了,不好意思,为了凑篇幅我真是无节操到家了!

如题,这篇文章主要说微信公众账号的网页授权问题,目前网页授权只允许已认证的服务号才有权限,网页授权一般用于公众号获取用户基本信息或实现一键登录,类似于新浪微博、QQ登录等。实现微信的授权登录可以在很大程度上解决用户登录繁琐和安全性问题对用户体验尤为重要,其中最好的例子可参考招行信用卡、微社区等。

微信OAuth2.0授权登录让微信用户使用微信身份安全登录第三方应用或网站,在微信用户授权登录已接入微信OAuth2.0的第三方应用后,第三方可以获取到用户的接口调用凭证(access_token),通过access_token可以进行微信开放平台授权关系接口调用,从而可实现获取微信用户基本开放信息和帮助用户实现基础开放功能等。

注:获取用户信息的方式有两种,一种是在用户和公众号进行交互时获取,另一种就是网页授权的方式,本文只讲解网页授权的方式。

公众后台设置:在微信公众号请求用户网页授权之前,开发者需要先到公众平台网站的我的服务页中配置授权回调域名。请注意,这里填写的域名不要加http://

关于配置授权回调域名的说明:

授权回调域名配置规范为全域名,比如需要网页授权的域名为:www.qq.com,配置以后此域名下面的页面http://www.qq.com/music.htmlhttp://www.qq.com/login.html 都可以进行OAuth2.0鉴权。但http://pay.qq.comhttp://music.qq.comhttp://qq.com  无法进行OAuth2.0鉴权

网页授权基本流程:

具体而言,网页授权流程分为四步:

  1. 引导用户进入授权页面同意授权,获取code
  2. 通过code换取网页授权access_token(与基础支持中的access_token不同)
  3. 如果需要,开发者可以刷新网页授权access_token,避免过期
  4. 通过网页授权access_token和openid获取用户基本信息

在公众平台设置好回调域名之后,即可进行以下开发:

略去文档说明部分【点击了解】:http://mp.weixin.qq.com/wiki/index.php?title=%E7%BD%91%E9%A1%B5%E6%8E%88%E6%9D%83%E8%8E%B7%E5%8F%96%E7%94%A8%E6%88%B7%E5%9F%BA%E6%9C%AC%E4%BF%A1%E6%81%AF

授权入口:http://xxx.qq.com/access.php (此处access.php为授权页入口,文件名自定义)

授权页【授权弹框页面】:http://xxx.qq.com/oauth.php (用户访问入口页面进行鉴权,用户可选择“允许”或“取消”)

代码:
access.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
<?php
session_start();
header("Content-Type:text/html;charset=utf-8");
define("APPID","*************"); //appid,在公众后台开发模式查看
define("REDIRECT_URI","http://xx.qq.com/oauth.php"); //授权页
//授权首页,判断是否授权
if(isset($_SESSION['loginstatus']))
{
    //判断access_token是否可用
    $access_token = $_SESSION['loginstatus']['access_token'];
    $refresh_token = $_SESSION['loginstatus']['refresh_token'];
    $openid = $_SESSION['loginstatus']['openid'];
    //换取用户信息
    $userinfo_url = "https://api.weixin.qq.com/sns/userinfo?access_token=$access_token&openid=$openid&lang=zh_CN";
    $userinfo_json = https_request($userinfo_url);
    $userinfo_array = json_decode($userinfo_json,true);
    if(array_key_exists("errcode",$userinfo_array))
    {
        if($userinfo_array['errcode'] == '42001' || $userinfo_array['errcode'] == '40001')
        {
            /*由于access_token拥有较短的有效期,当access_token超时后,可以使用refresh_token进行刷新,refresh_token拥有较长的有效期(7天、30天、60天、90天),当refresh_token失效的后,需要用户重新授权。,此步骤用于解决该问题!*/
                        //access_token超时,刷新access_token
            $access_token_url = "https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=".APPID."&grant_type=refresh_token&refresh_token=$refresh_token";
            $access_token_json = https_request($access_token_url);
            $access_token_array = json_decode($access_token_json,true);
            if(array_key_exists("errcode",$access_token_array))
            {
                header("Location:https://open.weixin.qq.com/connect/oauth2/authorize?appid=".APPID."&redirect_uri=".REDIRECT_URI."&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect");
            }
            else
            {
                //更新SESSION
                $_SESSION['loginstatus']['access_token'] = $access_token_array['access_token'];
                $access_token = $access_token_array['access_token'];
                $userinfo_url = "https://api.weixin.qq.com/sns/userinfo?access_token=$access_token&openid=$openid&lang=zh_CN";
                $userinfo_json = https_request($userinfo_url);
                $userinfo_array = json_decode($userinfo_json,true);
            }
        }
    }
        //打印用户基本信息
        /*返回信息:openid,昵称(nickname),性别(sex,1男,2女),省份(province),城市(city),国家(country),头像(headimgurl),用户特权信息(privilege)*/
        var_dump($userinfo_array);
       
}
else
{
    //未授权,进行授权【此步骤进入授权页】
    header("Location:https://open.weixin.qq.com/connect/oauth2/authorize?appid=".APPID."&redirect_uri=".REDIRECT_URI."&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect");
}

function https_request($url)
{
    $curl = curl_init();
    curl_setopt($curl,CURLOPT_URL,$url);
    curl_setopt($curl,CURLOPT_SSL_VERIFYPEER,FALSE);
    curl_setopt($curl,CURLOPT_SSL_VERIFYHOST,FALSE);
    curl_setopt($curl,CURLOPT_RETURNTRANSFER,1);
    $data = curl_exec($curl);
    if(curl_errno($curl))
    {
        return 'ERROR '.curl_error($curl);
    }
    curl_close($curl);
    return $data;
}

oauth.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
<?php
session_start();
header("Content-Type:text/html;charset=utf-8");
//获得code
$code = $_GET['code'];
login($code);
//进行授权

function login($code)
{
    $appid = "*******************";
    $appsecret = "*****************************";
    $access_token = "";

    //根据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 = https_request($access_token_url);
    $access_token_array = json_decode($access_token_json,true);
    if(array_key_exists("errcode",$access_token_array))
    {
        //取消授权
        if($access_token_array['errcode'] == '40029')
        {
            echo '取消授权!';  //点击取消按钮后操作,可自行定义
        }
        else
        {
            echo "errorcode: ".$access_token_array['errcode']."errormsg: ".$access_token_array['errmsg'];
        }
    }
    else
    {
        //获取access_token成功,将其保存到session
        $_SESSION['loginstatus']['access_token'] = $access_token_array['access_token'];
        $_SESSION['loginstatus']['refresh_token'] = $access_token_array['refresh_token'];
        $_SESSION['loginstatus']['openid'] = $access_token_array['openid'];
        header("Location:/access.php");  //返回入口页面,授权成功获取用户信息,不成功则再次进入该页面!
    }
}

function https_request($url)
{
    $curl = curl_init();
    curl_setopt($curl,CURLOPT_URL,$url);
    curl_setopt($curl,CURLOPT_SSL_VERIFYPEER,FALSE);
    curl_setopt($curl,CURLOPT_SSL_VERIFYHOST,FALSE);
    curl_setopt($curl,CURLOPT_RETURNTRANSFER,1);
    $data = curl_exec($curl);
    if(curl_errno($curl))
    {
        return 'ERROR '.curl_error($curl);
    }
    curl_close($curl);
    return $data;
}
?>

具体操作可根据需求自行编程,例如进行账号绑定或用户信息保存等操作,详细参数和返回错误代码可查看微信官方文档,,如有不明白或上文中出现的错误请指正,谢谢?

分享到:

10 条评论

昵称
  1. 农产品价格

    很重要

  2. 萍乡论坛

    桌面太乱了,好好整理下吧。

  3. 超速打码

    信称作移动端所有网页的入口一点也不为过。

    这篇文章的初衷是把自己写过的代码收集起

  4. 互传电商网

    学习一下

  5. 苗木求购

    好教程学习了

  6. 养鹅视频

    挺好的

  7. 江南来留个脚印希望回访

  8. 英雄联盟之谁与争锋

    这个知识要好好学习了

  9. 网站开发者

    学习了,感谢分享啊。

  10. SEO培训

    这个有点意思 哈哈 我喜欢你博客啊