微信网页授权

微信网页授权

我知道我知道,网上这类的文章已经太多太多了,主要是自己整理一下

什么时候需要网页授权?

你自己做了一个网站,可以使用微信登陆,你需要记录一些关于该微信用户的一些信息,最简单的就是欢迎界面你得知道用户的昵称吧。微信网页授权,就是可以将微信用户的信息授权给你的网站。

准备工作

微信服务器在用户和服务商之间,充当一个转发服务器的角色。用户在微信客户端的各种请求先是到达微信的服务器,微信服务器再转发给服务商的服务器。开发的时候我们并没有公网服务器,公网服务器上也不方便调试,所以我们需要一个能够穿透内网的工具,natapp,收费也不贵,非常好用。

先下载它的客户端,是一个单独的.exe文件natapp.exe,它需要一个authtoken参数,当你注册并拥有一个隧道后,就能得到这个authtoken。
natapp链接
连接成功之后如下图
natapp链接成功
这样的话,外网对这个地址的请求都会映射到本地的127.0.0.1:80端口。

创建一个MVC工程

打开vs创建一个mvc工程,并修改web属性
web配置
注意: 这里要能够成功修改必须要有管理员权限

然后配置IIS,物理路径选择工程所在的路径,ip地址填写127.0.0.1,端口为80即可。

弄好这些,我们来用外网地址访问一下站点
外网访问
成功啦!

微信网页授权

配置授权回调域名

我们用微信的测试接口来做这个
配置入口
回调域名
意思就是,通过微信授权成功后的回调页面必须在这个域名下面。

请求code

查看微信网页授权的文档,在获取用户信息之前要先获取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:测试号的appid
redirect_url:授权之后的回调地址
response_type:填写code即可
state:传递给回调页面的参数,包含业务信息,加密传递即可
scope:这里有两种级别,snsapi_base和snsapi_userinfo

snsapi_base:不需要用户确认授权,直接跳转到回调页面,这种方式仅仅能获取到openId

snsapi_userinfo:需要用户点击确认按钮授权,授权后跳转回调页面,这种方式可以获取到更多微信用户的信息,包括昵称,头像,性别等等

发起授权请求如下:

public ActionResult Do()
    {
        var reUrl = "http://你的域名/test/index";

        var scope = "snsapi_base";

        var scope2 = "snsapi_userinfo";

        var args = "1";

        var url =
            "https://open.weixin.qq.com/connect/oauth2/authorize?appid={0}&redirect_uri={1}&response_type=code&scope={2}&state={3}#wechat_redirect";

        url = string.Format(url, _appid, reUrl, scope2, args);

        return Redirect(url);
    }
获取code,换取access_token

在上一步,我们填写的回调地址是test控制器下的index方法,回调时,会将code和state参数带过来,利用这个code参数可以换取access_token,用access_token又可以获取到更多的用户信息

基本的请求连接为:

https://api.weixin.qq.com/sns/oauth2/access_token?appid={0}&secret={1}&code={2}&grant_type=authorization_code

appid和secret为测试微信号的id和密码,code即上一步回调过来的参数

 public ActionResult Index(string code, string state)
    {
        
        var url =
            "https://api.weixin.qq.com/sns/oauth2/access_token?appid={0}&secret={1}&code={2}&grant_type=authorization_code";

        url = string.Format(url, _appid, _appsecret, code);

        //获取access_token
        var data = GetRequest(url);

        var json = JsonConvert.DeserializeObject<Result>(data);
        ViewBag.OpenId = json.openid;
        ViewBag.State = state;

        //通过access_token获取用户信息
        var url2 = "https://api.weixin.qq.com/sns/userinfo?access_token={0}&openid={1}&lang=zh_CN";

        url2 = string.Format(url2, json.access_token, json.openid);

        var json2 = GetRequest(url2);

        return View();
    }

    public class Result
    {
        public string access_token
        {
            get; set;
        }

        public int expires_in
        {
            get; set;
        }

        public string refresh_token
        {
            get; set;
        }

        public string openid
        {
            get; set;
        }

        public string scope
        {
            get; set;
        }

        public string unionid
        {
            get; set;
        }
    }
    
    private string GetRequest(string url)
    {
        var request = WebRequest.CreateHttp(url);

        request.Method = "POST";

        var response = request.GetResponse();

        using (var stream = response.GetResponseStream())
        {
            var sr = new StreamReader(stream);

            var data = sr.ReadToEnd();

            return data;
        }
    }

整个过程还是比较轻松愉快的,主要是有了natapp这个工具,开发调试都非常方便

posted @ 2017-02-08 22:08  UncleNull  阅读(1997)  评论(0编辑  收藏  举报