要将我们的Web账号和微信账号绑定到一起,必须要用到微信openid的概念,每个账号对于不同公众号都会有一个openid ,可以根据openid与我们的账号关联到一起。
而openid 的获取最主要的:
- 微信推送给我们的各种消息
- 网页授权
可能用到的地方:
- 注册(通过网页授权获取openid,与注册的账户关联起来)
- 公众号菜单配置为网页授权Url,免登陆
- 统计分析(比如:关注用户中的注册、未注册用户数量)
直接上代码:(由于开发过程中未用到 授权snsapi_userinfo的,所以代码先空着,哪天勤劳的时候补上。。。。请勿鄙视)
#region 应用授权作用域,snsapi_base //授权获取到的code string code = ""; //通过code获取用户信息 不需要关注公众号 var sampleInfo = WeiXinHelper.GetUserSampleInfo(code); string openId = sampleInfo.OpenId; #endregion #region (思路一致,开发过程中没用到,暂时放空。。)snsapi_userinfo (弹出授权页面,可通过openid拿到昵称、性别、所在地。并且,即使在未关注的情况下,只要用户授权,也能获取其信息) //授权获取到的code string code2 = ""; //通过code获取用户信息 不需要关注公众号 var sampleInfo2 = WeiXinHelper.GetUserSampleInfo(code2); string openId2 = sampleInfo2.OpenId; string accessToken = sampleInfo2.Access_Token; //todo:刷新accessToken 获取 refresh_token(如果需要) //todo:获取用户信息 #endregion //这种方法获取用户信息,需要用户关注公众号 WeiXinUserInfo info = WeiXinHelper.GetUserInfo(openId);
用到的两个类WeiXinUserInfo、WeiXinUserSampleInfo:
///2 /// 用户详细信息 3 /// 4 public class WeiXinUserInfo 5 { 6 ///7 /// 用户是否订阅该公众号标识,值为0时,代表此用户没有关注该公众号,拉取不到其余信息。 8 /// 9 public int Subscribe { get; set; } 10 11 ///12 /// 用户的标识,对当前公众号唯一 13 /// 14 public string OpenId { get; set; } 15 16 ///17 /// 用户的昵称 18 /// 19 public string NickName { get; set; } 20 21 ///22 /// 用户的性别,值为1时是男性,值为2时是女性,值为0时是未知 23 /// 24 public string Sex { get; set; } 25 26 ///27 /// 用户所在城市 28 /// 29 public string City { get; set; } 30 31 ///32 /// 用户所在国家 33 /// 34 public string Conuntry { get; set; } 35 36 ///37 /// 用户所在省份 38 /// 39 public string Province { get; set; } 40 41 ///42 /// 用户的语言,简体中文为zh_CN 43 /// 44 public string Language { get; set; } 45 46 ///47 /// 用户头像,最后一个数值代表正方形头像大小(有0、46、64、96、132数值可选,0代表640*640正方形头像),用户没有头像时该项为空 48 /// 49 public string HeadImgUrl { get; set; } 50 51 ///52 /// 用户关注时间,为时间戳。如果用户曾多次关注,则取最后关注时间 53 /// 54 public string Subscribe_Time { get; set; } 55 56 ///57 /// 只有在用户将公众号绑定到微信开放平台帐号后,才会出现该字段 58 /// 59 public string UnionId { get; set; } 60 61 62 } 63 64 ///65 /// 只包含OpenId的用户信息 66 /// 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 ///4 /// 根据用户Code获取用户信息(包括OpenId的简单信息) 5 /// 6 /// 7 ///8 public static WeiXinUserSampleInfo GetUserSampleInfo(string code) 9 { 10 string url = string.Format(WeiXinConst.WeiXin_User_OpenIdUrl, code); 11 WeiXinUserSampleInfo info = HttpClientHelper.GetResponse (url); 12 return info; 13 } 14 15 /// 16 /// 根据用户Code获取用户信息(包括OpenId的简单信息) 17 /// 18 /// 19 ///20 public static string GetUserOpenId(string code) 21 { 22 return GetUserSampleInfo(code).OpenId; 23 } 24 25 /// 26 /// 根据OpenID 获取用户基本信息(需关注公众号) 27 /// 28 /// 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(result); 40 //解析用户信息失败,判断 失败Code ,40001 为AccessToken失效,重新创建Token并获取用户信息 41 if (info == null || string.IsNullOrEmpty(info.OpenId)) 42 { 43 ErrorMessage msg = JsonConvert.DeserializeObject (result); 44 if (msg.TokenExpired) 45 { 46 return GetUserInfoByNewAccessToken(openId); 47 } 48 } 49 50 return info; 51 } 52 53 /// 54 /// 创建新的AccessToken 并获取用户信息 55 /// 56 /// 57 ///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 (url); 63 return info; 64 } 65 66 #endregion