1. 在页面中引导用户进入微信授权页面:(将回调页面通过URL参数传递到微信的授权页,并跳转)
string wxAuthUrl = "https://open.weixin.qq.com/connect/oauth2/authorize" + "?appid=" + wxAppId + //微信公众号的AppId "&redirect_uri=" + wxRedirectUri + //回调页面地址 "&response_type=code" + "&scope=snsapi_userinfo" + "&state=STATE" + "&connect_redirect=1#wechat_redirect";
2. 在微信中点击确认之后,会回调我们指定的页面,回调之后的页面的url会自动加上code参数
3. 在回调页面中抓取以下地址的网页内容,页面地址要拼接上code参数
string wxGetOpenIdUrl = "https://api.weixin.qq.com/sns/oauth2/access_token" + "?appid=" + wxAppId + //微信公众号的AppId "&secret=" + wxAppSecret + //微信公众号的AppSecret "&code={0}" + //回调页面上的code参数 "&grant_type=authorization_code";
4. 抓取的结果是一串JSON字符串,JSON字符串中包含了用户的OpenId(网上有文章说JSON中也包含unionId,这里亲测之后未发现有unionId)
{ "access_token":"ACCESS_TOKEN", "expires_in":7200, "refresh_token":"REFRESH_TOKEN", "openid":"OPENID", "scope":"SCOPE" }
附件内容是可以调用的Helper类:
代码如下:
using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Text; using System.Web; using System.Web.Script.Serialization; using Whir.Framework; /// <summary> /// WeChatHelper 的摘要说明 /// </summary> public class WeChatHelper { public static string GetUserOpenId() { //判断通过微信访问 if (HttpContext.Current.Request.UserAgent.Contains("MicroMessenger")) { string wxAppId = AppSettingUtil.GetString("AppId"); string wxAppSecret = AppSettingUtil.GetString("AppSecret"); string wxRedirectUri = AppSettingUtil.GetString("WxRedirectUri"); string wxAuthUrl = "https://open.weixin.qq.com/connect/oauth2/authorize" + "?appid=" + wxAppId + "&redirect_uri=" + wxRedirectUri + "&response_type=code" + "&scope=snsapi_userinfo" + "&state=STATE" + "&connect_redirect=1#wechat_redirect"; string wxGetOpenIdUrl = "https://api.weixin.qq.com/sns/oauth2/access_token" + "?appid=" + wxAppId + "&secret=" + wxAppSecret + "&code={0}" + "&grant_type=authorization_code"; string wxCode = RequestUtil.Instance.GetQueryString("code"); if (wxCode.IsEmpty()) { //跳转到微信授权页面 HttpContext.Current.Response.Redirect(wxAuthUrl); } else { wxGetOpenIdUrl = wxGetOpenIdUrl.FormatWith(wxCode); string wxResponse = GetPageResponse(wxGetOpenIdUrl); WxResponse response = new JavaScriptSerializer().Deserialize<WxResponse>(wxResponse); if (response != null) return response.openid; } } return ""; } /// <summary> /// 获取网页响应的内容 /// </summary> /// <param name="url"></param> /// <returns></returns> public static string GetPageResponse(string url) { WebClient wc = new WebClient(); wc.Credentials = CredentialCache.DefaultCredentials; //网页编码格式 Encoding encoding = Encoding.UTF8; //抓取的网页地址 Byte[] data = wc.DownloadData(url); //最终获取网页源代码字符串 string result = encoding.GetString(data); return result; } } /// <summary> /// 微信返回openid时为JSON字符串,这里用实体反序列化,取其中的openid /// </summary> public class WxResponse { public string access_token { get; set; } public string expires_in { get; set; } public string refresh_token { get; set; } public string openid { get; set; } public string scope { get; set; } }