php专区

 首页 > php专区 > PHP应用 > 开放平台 > C#微信开发之旅(八):通过授权code以及openid获取用

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

分享到:
【字体:
导读:
          要将我们的Web账号和微信账号绑定到一起,必须要用到微信openid的概念,每个账号对于不同公众号都会有一个openid ,可以根据openid与我们的账号关联到一起。而openid 的获取最主要的:微...

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

而openid 的获取最主要的:

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

可能用到的地方:

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

直接上代码:(由于开发过程中未用到 授权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

分享到:
微信公众号开发系列教程一(调试环境部署...
微信公众号火了好一阵子了,笔者算是比较早接触微信公众号开发的了,大概做了一年半了,从最开始的到处网上找demo到现在也开发一些公众号。园子里关于微信开发的教程已经数不胜数了,我也准备来凑凑热闹。一是梳理下这段时间开发的经验,二是希望能帮到想做微信开发的小伙伴们,希望大大神们吐槽的时候悠着点,笔者只是一个...
C#微信开发之旅(七):根据经纬度获取地址...
开发过程中遇到这样的需求,根据用户的地理位置不同,显示不同区域的产品。 这里用到了微信:获取用户地理位置 的功能,(每隔5秒上报 或 进入回话时上报一次),我们根据微信推送过来的经纬度,来转换成实际地址,这里用到的是百度地图Api(要用的话先申请百度ak)。 PS:微信的这个功能很不稳定,靠它不靠谱,经常不推...
  •         php迷,一个php技术的分享社区,专属您自己的技术摘抄本、收藏夹。
  • 在这里……