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

 

相关文章