要將我們的Web賬號和微信賬號綁定到一起,必須要用到微信openid的概念,每個賬號對於不同公眾號都會有一個openid ,可以根據openid與我們的賬號關聯到一起。
而openid 的獲取最主要的:
- 微信推送給我們的各種消息
- 網頁授權
可能用到的地方:
- 注冊(通過網頁授權獲取openid,與注冊的賬戶關聯起來)
- 公眾號菜單配置為網頁授權Url,免登陸
- 統計分析(比如:關注用戶中的注冊、未注冊用戶數量)
直接上代碼:(由於開發過程中未用到 授權snsapi_userinfo的,所以代碼先空着,哪天勤勞的時候補上。。。。請勿鄙視)
1 #region 應用授權作用域,snsapi_base 2 3 //授權獲取到的code 4 string code = ""; 5 //通過code獲取用戶信息 不需要關注公眾號 6 var sampleInfo = WeiXinHelper.GetUserSampleInfo(code); 7 string openId = sampleInfo.OpenId; 8 9 #endregion 10 11 #region (思路一致,開發過程中沒用到,暫時放空。。)snsapi_userinfo (彈出授權頁面,可通過openid拿到昵稱、性別、所在地。並且,即使在未關注的情況下,只要用戶授權,也能獲取其信息) 12 13 //授權獲取到的code 14 string code2 = ""; 15 //通過code獲取用戶信息 不需要關注公眾號 16 var sampleInfo2 = WeiXinHelper.GetUserSampleInfo(code2); 17 string openId2 = sampleInfo2.OpenId; 18 string accessToken = sampleInfo2.Access_Token; 19 20 //todo:刷新accessToken 獲取 refresh_token(如果需要) 21 22 //todo:獲取用戶信息 23 24 25 #endregion 26 27 //這種方法獲取用戶信息,需要用戶關注公眾號 28 WeiXinUserInfo info = WeiXinHelper.GetUserInfo(openId);
用到的兩個類WeiXinUserInfo、WeiXinUserSampleInfo:
1 /// <summary> 2 /// 用戶詳細信息 3 /// </summary> 4 public class WeiXinUserInfo 5 { 6 /// <summary> 7 /// 用戶是否訂閱該公眾號標識,值為0時,代表此用戶沒有關注該公眾號,拉取不到其余信息。 8 /// </summary> 9 public int Subscribe { get; set; } 10 11 /// <summary> 12 /// 用戶的標識,對當前公眾號唯一 13 /// </summary> 14 public string OpenId { get; set; } 15 16 /// <summary> 17 /// 用戶的昵稱 18 /// </summary> 19 public string NickName { get; set; } 20 21 /// <summary> 22 /// 用戶的性別,值為1時是男性,值為2時是女性,值為0時是未知 23 /// </summary> 24 public string Sex { get; set; } 25 26 /// <summary> 27 /// 用戶所在城市 28 /// </summary> 29 public string City { get; set; } 30 31 /// <summary> 32 /// 用戶所在國家 33 /// </summary> 34 public string Conuntry { get; set; } 35 36 /// <summary> 37 /// 用戶所在省份 38 /// </summary> 39 public string Province { get; set; } 40 41 /// <summary> 42 /// 用戶的語言,簡體中文為zh_CN 43 /// </summary> 44 public string Language { get; set; } 45 46 /// <summary> 47 /// 用戶頭像,最后一個數值代表正方形頭像大小(有0、46、64、96、132數值可選,0代表640*640正方形頭像),用戶沒有頭像時該項為空 48 /// </summary> 49 public string HeadImgUrl { get; set; } 50 51 /// <summary> 52 /// 用戶關注時間,為時間戳。如果用戶曾多次關注,則取最后關注時間 53 /// </summary> 54 public string Subscribe_Time { get; set; } 55 56 /// <summary> 57 /// 只有在用戶將公眾號綁定到微信開放平台帳號后,才會出現該字段 58 /// </summary> 59 public string UnionId { get; set; } 60 61 62 } 63 64 /// <summary> 65 /// 只包含OpenId的用戶信息 66 /// </summary> 67 public class WeiXinUserSampleInfo 68 { 69 public string Access_Token { get; set; } 70 public string Expires_In { get; set; } 71 public string Refresh_Token { get; set; } 72 public string OpenId { get; set; } 73 74 public string Scope { get; set; } 75 }
最后,WeiXinHelper內方法:
1 #region 獲取用戶信息 2 3 /// <summary> 4 /// 根據用戶Code獲取用戶信息(包括OpenId的簡單信息) 5 /// </summary> 6 /// <param name="code"></param> 7 /// <returns></returns> 8 public static WeiXinUserSampleInfo GetUserSampleInfo(string code) 9 { 10 string url = string.Format(WeiXinConst.WeiXin_User_OpenIdUrl, code); 11 WeiXinUserSampleInfo info = HttpClientHelper.GetResponse<WeiXinUserSampleInfo>(url); 12 return info; 13 } 14 15 /// <summary> 16 /// 根據用戶Code獲取用戶信息(包括OpenId的簡單信息) 17 /// </summary> 18 /// <param name="code"></param> 19 /// <returns></returns> 20 public static string GetUserOpenId(string code) 21 { 22 return GetUserSampleInfo(code).OpenId; 23 } 24 25 /// <summary> 26 /// 根據OpenID 獲取用戶基本信息(需關注公眾號) 27 /// </summary> 28 /// <param name="openId"></param> 29 public static WeiXinUserInfo GetUserInfo(string openId) 30 { 31 var token = AccessToken.Instance; 32 string url = string.Format(WeiXinConst.WeiXin_User_GetInfoUrl, token.Access_Token, openId); 33 34 string result = HttpClientHelper.GetResponse(url); 35 36 if (string.IsNullOrEmpty(result)) 37 return null; 38 39 WeiXinUserInfo info = JsonConvert.DeserializeObject<WeiXinUserInfo>(result); 40 //解析用戶信息失敗,判斷 失敗Code ,40001 為AccessToken失效,重新創建Token並獲取用戶信息 41 if (info == null || string.IsNullOrEmpty(info.OpenId)) 42 { 43 ErrorMessage msg = JsonConvert.DeserializeObject<ErrorMessage>(result); 44 if (msg.TokenExpired) 45 { 46 return GetUserInfoByNewAccessToken(openId); 47 } 48 } 49 50 return info; 51 } 52 53 /// <summary> 54 /// 創建新的AccessToken 並獲取用戶信息 55 /// </summary> 56 /// <param name="openId"></param> 57 /// <returns></returns> 58 private static WeiXinUserInfo GetUserInfoByNewAccessToken(string openId) 59 { 60 var token = AccessToken.NewInstance; 61 string url = string.Format(WeiXinConst.WeiXin_User_GetInfoUrl, token.Access_Token, openId); 62 WeiXinUserInfo info = HttpClientHelper.GetResponse<WeiXinUserInfo>(url); 63 return info; 64 } 65 66 #endregion