微信网页授权
微信网页授权
我知道我知道,网上这类的文章已经太多太多了,主要是自己整理一下
什么时候需要网页授权?
你自己做了一个网站,可以使用微信登陆,你需要记录一些关于该微信用户的一些信息,最简单的就是欢迎界面你得知道用户的昵称吧。微信网页授权,就是可以将微信用户的信息授权给你的网站。
准备工作
微信服务器在用户和服务商之间,充当一个转发服务器的角色。用户在微信客户端的各种请求先是到达微信的服务器,微信服务器再转发给服务商的服务器。开发的时候我们并没有公网服务器,公网服务器上也不方便调试,所以我们需要一个能够穿透内网的工具,natapp,收费也不贵,非常好用。
先下载它的客户端,是一个单独的.exe文件natapp.exe,它需要一个authtoken参数,当你注册并拥有一个隧道后,就能得到这个authtoken。
连接成功之后如下图
这样的话,外网对这个地址的请求都会映射到本地的127.0.0.1:80端口。
创建一个MVC工程
打开vs创建一个mvc工程,并修改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这个工具,开发调试都非常方便