zoukankan      html  css  js  c++  java
  • 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     {
     3 
     4         // GET: /ApplyVIP/     
     5 
     6         public ActionResult Index(string url)
     7         {
     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                 WeiXin.appid,
    10                 url,//回调页URL
    11                 Guid.NewGuid().ToString("N"));
    12             return Redirect(_url);//这里微信会自动取出回调页URL,并且跳转到该url所属的页面
    13         }
    静默授权并且跳转回调页

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

           //controller
     public string GetOpenId() {
                string code = requset.querystring["code"];
                string openid = "";
                string json = "";
                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
        , WeiXin.appid, WeiXin.aseret, code);
                HttpQuery.Get(url, null, msg => {
                    json = msg;
                });
                JObject job = (JObject)JsonConvert.DeserializeObject(json);
                openid = job["openid"].ToString();
                return openid;
            }
            
    View Code

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

        public class HttpQuery {
            private static readonly string DefaultUserAgent =
                "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)";
    
            public static void Get(string url, object data, Action<string> callback) {
                IDictionary<string, string> parameters = Getparameters(data);
    
                if (!(parameters == null || parameters.Count == 0)) {
                    url += "?";
                    foreach (var item in parameters) {
                        url += item.Key + "=" + item.Value + "&";
                    }
                }
                CreateGetHttpResponse(url, null, null, null, callback);
            }
            /// <summary>  
            /// 创建GET方式的HTTP请求  
            /// </summary>  
            /// <param name="url">请求的URL</param>  
            /// <param name="timeout">请求的超时时间</param>  
            /// <param name="userAgent">请求的客户端浏览器信息,可以为空</param>  
            /// <param name="cookies">随同HTTP请求发送的Cookie信息,如果不需要身份验证可以为空</param>  
            /// <returns></returns>  
            private static HttpWebResponse CreateGetHttpResponse(string url, int? timeout, string userAgent,
                CookieCollection cookies, Action<string> callback, string encoding = "utf-8") {
                if (string.IsNullOrEmpty(url)) {
                    return null;
                    //throw new ArgumentNullException("url");
                }
                try {
                    HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
                    request.Method = "GET";
                    request.UserAgent = DefaultUserAgent;
                    if (!string.IsNullOrEmpty(userAgent)) {
                        request.UserAgent = userAgent;
                    }
                    if (timeout.HasValue) {
                        request.Timeout = timeout.Value;
                    }
                    if (cookies != null) {
                        request.CookieContainer = new CookieContainer();
                        request.CookieContainer.Add(cookies);
                    }
    
                    HttpWebResponse httpWebResponse = request.GetResponse() as HttpWebResponse;
    
                    StreamReader reader = new StreamReader(httpWebResponse.GetResponseStream(),
                        System.Text.Encoding.GetEncoding(encoding));
    
                    string html = "";
                    //获取请求到的数据
                    html = reader.ReadToEnd();
                    //关闭
                    httpWebResponse.Close();
                    reader.Close();
          
                        callback(html);
                        return httpWebResponse;
                    }
                } catch {
                    callback(null);
                }
                return null;
            }
    
    }
    View Code
  • 相关阅读:
    Linux内核学习笔记七——内核同步机制和实现方式
    Linux内核学习笔记五——中断推后处理机制
    Linux内核学习笔记十——虚拟文件系统概念
    Android中LocalSocket使用
    Linux下常见命令
    Linux内核学习笔记八——定时器和时间管理
    Linux内核学习笔记九——内核内存管理方式
    [Android]Android的常用adb命令
    Linux内核学习笔记六——并发和同步概念
    Linux内核学习笔记十一——I/O层和I/O调度机制
  • 原文地址:https://www.cnblogs.com/xielideboke/p/get_openid.html
Copyright © 2011-2022 走看看