MVC 微信开发获取用户OpenID

 

 

第一次开发微信版网页,对最重要的获取微信OpenId,特此记录下来

1.首先得有appid和appsecret

 1 1.    public class WeiXin {
 2 
 3         public static string appid {
 4             get {
 5                 string _appid = "wx3xxxxxxxxxxxxxxx";
 6                 return _appid;
 7             }
 8         }
 9         public static string aseret {
10             get {
11                 string appsecret = "b6719276d539796d94bxxxxxxxxxxxxxxx";
12                 return appsecret;
13             }
14         }
15 
16 }
准备AppId和Appsecret

2.只获取用户的openID,,在确保微信公众账号拥有授权作用域(scope参数)的权限的前提下(服务号获得高级接口后,默认拥有scope参数中的snsapi_base和snsapi_userinfo),引导关注者打开如下页面,以snsapi_base为scope发起的网页授权,并且是静默授权并自动跳转到回调页的。用户感知的就是直接进入了回调页(下面代码中的url参数就是回调页,静态的可以写成:string url = https://wx.baidu.com/controller/GetOpenId,注意URL需要进行HttpUtility.UrlEncode(url)编码,还有回调页的域名需要和微信公众号里面设置的回调域名相同)

 1 public class ApplyVIPController : Controller
 2  2     {
 3  3 
 4  4         // GET: /ApplyVIP/     
 5  5 
 6  6         public ActionResult Index(string url)
 7  7         {
 8  8             string _url = string.Format("https://open.weixin.qq.com/connect/oauth2/authorize?appid={0}&redirect_uri={1}&response_type=code&scope=snsapi_base&state={2}#wechat_redirect",
 9  9                 WeiXin.appid,
10 10                 url,//回调页URL
11 11                 Guid.NewGuid().ToString("N"));
12 12             return Redirect(_url);//这里微信会自动取出回调页URL,并且跳转到该url所属的页面
13 13         }
静默授权并且跳转回调页

3.获取code,并且通过code获取Openid,正确时返回的JSON数据包如下:{ "access_token":"ACCESS_TOKEN",    "expires_in":7200,   "refresh_token":"REFRESH_TOKEN",     "openid":"OPENID",    "scope":"SCOPE" },这里面就包含了所需要的OPENID

 1  //controller
 2  public string GetOpenId() {
 3             string code = requset.querystring["code"];
 4             string openid = "";
 5             string json = "";
 6             string url = string.Format("https://api.weixin.qq.com/sns/oauth2/access_token?appid={0}&secret={1}&code={2}&grant_type=authorization_code "//通过appid,appaseret,code
 7     , WeiXin.appid, WeiXin.aseret, code);
 8             HttpQuery.Get(url, null, msg => {
 9                 json = msg;
10             });
11             JObject job = (JObject)JsonConvert.DeserializeObject(json);
12             openid = job["openid"].ToString();
13             return openid;
14         }
获取到openID

4.请求获取Openid的httpquery.get()方法

 1 public class HttpQuery {
 2         private static readonly string DefaultUserAgent =
 3             "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)";
 4 
 5         public static void Get(string url, object data, Action<string> callback) {
 6             IDictionary<string, string> parameters = Getparameters(data);
 7 
 8             if (!(parameters == null || parameters.Count == 0)) {
 9                 url += "?";
10                 foreach (var item in parameters) {
11                     url += item.Key + "=" + item.Value + "&";
12                 }
13             }
14             CreateGetHttpResponse(url, null, null, null, callback);
15         }
16         /// <summary>  
17         /// 创建GET方式的HTTP请求  
18         /// </summary>  
19         /// <param name="url">请求的URL</param>  
20         /// <param name="timeout">请求的超时时间</param>  
21         /// <param name="userAgent">请求的客户端浏览器信息,可以为空</param>  
22         /// <param name="cookies">随同HTTP请求发送的Cookie信息,如果不需要身份验证可以为空</param>  
23         /// <returns></returns>  
24         private static HttpWebResponse CreateGetHttpResponse(string url, int? timeout, string userAgent,
25             CookieCollection cookies, Action<string> callback, string encoding = "utf-8") {
26             if (string.IsNullOrEmpty(url)) {
27                 return null;
28                 //throw new ArgumentNullException("url");
29             }
30             try {
31                 HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
32                 request.Method = "GET";
33                 request.UserAgent = DefaultUserAgent;
34                 if (!string.IsNullOrEmpty(userAgent)) {
35                     request.UserAgent = userAgent;
36                 }
37                 if (timeout.HasValue) {
38                     request.Timeout = timeout.Value;
39                 }
40                 if (cookies != null) {
41                     request.CookieContainer = new CookieContainer();
42                     request.CookieContainer.Add(cookies);
43                 }
44 
45                 HttpWebResponse httpWebResponse = request.GetResponse() as HttpWebResponse;
46 
47                 StreamReader reader = new StreamReader(httpWebResponse.GetResponseStream(),
48                     System.Text.Encoding.GetEncoding(encoding));
49 
50                 string html = "";
51                 //获取请求到的数据
52                 html = reader.ReadToEnd();
53                 //关闭
54                 httpWebResponse.Close();
55                 reader.Close();
56       
57                     callback(html);
58                     return httpWebResponse;
59                 }
60             } catch {
61                 callback(null);
62             }
63             return null;
64         }
65 
66 }
Http GET请求

 

posted @ 2017-08-11 15:53  浅苍蓝  阅读(1516)  评论(2编辑  收藏  举报