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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM