zoukankan      html  css  js  c++  java
  • 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             #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
  • 相关阅读:
    ICL7135的C程序
    数组属性的习题、Arrays工具、二维数组
    上传文件js端处理
    Java常见的系统路径与获取方法
    java 文件流的处理 文件打包成zip
    JAVA根据URL网址获取输入流
    nginx安装教程
    jackson 实体转json json字符串转实体
    java 对象重写tostring
    java 将文件流和文件名称转换为文件
  • 原文地址:https://www.cnblogs.com/hetring/p/4054822.html
Copyright © 2011-2022 走看看