要将我们的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