首页 > 代码库 > C#微信开发之旅(八):通过授权code以及openid获取用户信息

C#微信开发之旅(八):通过授权code以及openid获取用户信息

要将我们的Web账号和微信账号绑定到一起,必须要用到微信openid的概念,每个账号对于不同公众号都会有一个openid ,可以根据openid与我们的账号关联到一起。

而openid 的获取最主要的:

  1. 微信推送给我们的各种消息
  2. 网页授权

可能用到的地方:

  1. 注册(通过网页授权获取openid,与注册的账户关联起来)
  2. 公众号菜单配置为网页授权Url,免登陆
  3. 统计分析(比如:关注用户中的注册、未注册用户数量)

直接上代码:(由于开发过程中未用到 授权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             #endregion10 11             #region (思路一致,开发过程中没用到,暂时放空。。)snsapi_userinfo (弹出授权页面,可通过openid拿到昵称、性别、所在地。并且,即使在未关注的情况下,只要用户授权,也能获取其信息)12 13             //授权获取到的code14             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             #endregion26 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_CN43         /// </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 WeiXinUserSampleInfo68     {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

 

C#微信开发之旅(八):通过授权code以及openid获取用户信息