1. 程式人生 > >微信公眾平臺開發—利用OAuth2.0獲取微信用戶基本信息

微信公眾平臺開發—利用OAuth2.0獲取微信用戶基本信息

arch getjson code back acc unicom toc gets down

1、首先在某微信平臺下配置OAuth2.0授權回調頁面:

技術分享

2、通過appid構造url獲取微信回傳code值(appid可在微信平臺下找到)

1)、微信不彈出授權頁面url:

A、code回傳到頁面wxProcess2.aspx,不帶參數

[csharp] view plain copy
  1. Response.Redirect("https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + appid + "&redirect_uri=http://localhost:8888/wxProcess2.aspx&response_type=code&scope=snsapi_base&state=1#wechat_redirect");

B、code回傳到頁面wxProcess2.aspx,帶參數reurl,即wxProcess2.aspx獲得code的同時,也能獲取reurl的值,具體如下:

[csharp] view plain copy
  1. Response.Redirect("https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + appid + "&redirect_uri=http://localhost:8888/wxProcess2.aspx?reurl=" + reurl + "&response_type=code&scope=snsapi_base&state=1#wechat_redirect");



2)、微信彈出授權頁面url:需要用戶授權,才能獲取code及後面需要獲取的用戶信息

[csharp] view plain copy
  1. Response.Redirect("https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + appid + "&redirect_uri=http://localhost:8888/wxProcess2.aspx?reurl=" + reurl + "&response_type=code&scope=snsapi_userinfo&state=1#wechat_redirect");

說明:微信是否彈出授權頁面url的區別只在一個參數scope,不彈出微信授權頁面:scope=snsapi_base,彈出微信授權頁面:scope=snsapi_userinfo。

微信授權頁面如下:

技術分享

3、通過appid、secret、code構造url,獲取微信用戶的openid和access token。appid、secret可在微信平臺下找到,code已在上面方法中獲取並回傳。具體訪問url:

[csharp] view plain copy
  1. https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + appid + "&secret=" + appsecret + "&code=" + Code + "&grant_type=authorization_code

4、通過openid、access token獲取用戶信息,具體訪問url:

[csharp] view plain copy
  1. https://api.weixin.qq.com/sns/userinfo?access_token=" + REFRESH_TOKEN + "&openid=" + OPENID

說明:主要通過訪問微信的3個url地址並回傳數據,獲取微信用戶基本信息

=================================================================================================================================

具體代碼:

1、獲取微信code處理頁面:wxProcess.aspx

[csharp] view plain copy
  1. protected void Page_Load(object sender, EventArgs e)
  2. {
  3. if (!IsPostBack)
  4. {
  5. string reurl = "";
  6. //傳遞參數,獲取用戶信息後,可跳轉到自己定義的頁面,想怎麽處理就怎麽處理
  7. if (Request.QueryString["reurl"] != null && Request.QueryString["reurl"] != "")
  8. {
  9. reurl = Request.QueryString["reurl"].ToString();
  10. }
  11. else
  12. {
  13. reurl = "http://www.csdn.net";
  14. }
  15. string code = "";
  16. //彈出授權頁面(如在不彈出授權頁面基礎下未獲得openid,則彈出授權頁面,提示用戶授權)
  17. if (Request.QueryString["auth"] != null && Request.QueryString["auth"] != "" && Request.QueryString["auth"] == "1")
  18. {
  19. Response.Redirect("https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + appid + "&redirect_uri=http://localhost:8888/wxProcess2.aspx?reurl=" + reurl + "&response_type=code&scope=snsapi_userinfo&state=1#wechat_redirect");
  20. }
  21. else
  22. {
  23. //不彈出授權頁面
  24. Response.Redirect("https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + appid + "&redirect_uri=http://localhost:8888/wxProcess2.aspx?reurl=" + reurl + "&response_type=code&scope=snsapi_base&state=1#wechat_redirect"); }
  25. }
  26. }



2、獲取微信code值回傳到自己的頁面wxProcess2.aspx:

[csharp] view plain copy
  1. public string reurl = "";
  2. protected void Page_Load(object sender, EventArgs e)
  3. {
  4. if (!IsPostBack)
  5. {
  6. //獲取從wxProcess.aspx傳遞過來的跳轉地址reurl
  7. if (Request.QueryString["reurl"] != null && Request.QueryString["reurl"] != "")
  8. {
  9. reurl = Request.QueryString["reurl"].ToString();
  10. }
  11. string code = "";
  12. if (Request.QueryString["code"] != null && Request.QueryString["code"] != "")
  13. {
  14. //獲取微信回傳的code
  15. code = Request.QueryString["code"].ToString();
  16. OAuth_Token Model = Get_token(code); //獲取token
  17. OAuthUser OAuthUser_Model = Get_UserInfo(Model.access_token, Model.openid );
  18. if(OAuthUser_Model.openid!=null && OAuthUser_Model.openid !="") //已獲取得openid及其他信息
  19. {
  20. //在頁面上輸出用戶信息
  21. Response.Write("用戶OPENID:" + OAuthUser_Model.openid + "<br>用戶昵稱:" + OAuthUser_Model.nickname + "<br>性別:" + OAuthUser_Model.sex + "<br>所在省:" + OAuthUser_Model.province + "<br>所在市:" + OAuthUser_Model.city + "<br>所在國家:" + OAuthUser_Model.country + "<br>頭像地址:" + OAuthUser_Model.headimgurl + "<br>用戶特權信息:" + OAuthUser_Model.privilege);
  22. //或跳轉到自己的頁面,想怎麽處理就怎麽處理
  23. Response.Redirect(reurl);
  24. }
  25. else //未獲得openid,回到wxProcess.aspx,訪問彈出微信授權頁面
  26. {
  27. Response.Redirect("wxProcess.aspx?auth=1");
  28. }
  29. }
  30. }
  31. }
  32. #region 屬性
  33. public string appid = "wx6669e231bffa123f"; //公眾微信平臺下可以找到
  34. public string appsecret = "9d693f7a81236c123464281115p78445"; //公眾微信平臺下可以找到
  35. #endregion
  36. //根據appid,secret,code獲取微信openid、access token信息
  37. protected OAuth_Token Get_token(string Code)
  38. {
  39. //獲取微信回傳的openid、access token
  40. string Str = GetJson("https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + appid + "&secret=" + appsecret + "&code=" + Code + "&grant_type=authorization_code");
  41. //微信回傳的數據為Json格式,將Json格式轉化成對象
  42. OAuth_Token Oauth_Token_Model = JsonHelper.ParseFromJson<OAuth_Token>(Str);
  43. return Oauth_Token_Model;
  44. }
  45. //刷新Token(好像這個刷新Token沒有實際作用)
  46. protected OAuth_Token refresh_token(string REFRESH_TOKEN)
  47. {
  48. string Str = GetJson("https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=" + appid + "&grant_type=refresh_token&refresh_token=" + REFRESH_TOKEN);
  49. OAuth_Token Oauth_Token_Model = JsonHelper.ParseFromJson<OAuth_Token>(Str);
  50. return Oauth_Token_Model;
  51. }
  52. //根據openid,access token獲得用戶信息
  53. protected OAuthUser Get_UserInfo(string REFRESH_TOKEN, string OPENID)
  54. {
  55. string Str = GetJson("https://api.weixin.qq.com/sns/userinfo?access_token=" + REFRESH_TOKEN + "&openid=" + OPENID);
  56. OAuthUser OAuthUser_Model = JsonHelper.ParseFromJson<OAuthUser>(Str);
  57. return OAuthUser_Model;
  58. }
  59. //訪問微信url並返回微信信息
  60. protected string GetJson(string url)
  61. {
  62. WebClient wc = new WebClient();
  63. wc.Credentials = CredentialCache.DefaultCredentials;
  64. wc.Encoding = Encoding.UTF8;
  65. string returnText = wc.DownloadString(url);
  66. if (returnText.Contains("errcode"))
  67. {
  68. //可能發生錯誤
  69. }
  70. return returnText;
  71. }
  72. /// <summary>
  73. /// token類
  74. /// </summary>
  75. public class OAuth_Token
  76. {
  77. public OAuth_Token()
  78. {
  79. //
  80. //TODO: 在此處添加構造函數邏輯
  81. //
  82. }
  83. //access_token 網頁授權接口調用憑證,註意:此access_token與基礎支持的access_token不同
  84. //expires_in access_token接口調用憑證超時時間,單位(秒)
  85. //refresh_token 用戶刷新access_token
  86. //openid 用戶唯一標識,請註意,在未關註公眾號時,用戶訪問公眾號的網頁,也會產生一個用戶和公眾號唯一的OpenID
  87. //scope 用戶授權的作用域,使用逗號(,)分隔
  88. public string _access_token;
  89. public string _expires_in;
  90. public string _refresh_token;
  91. public string _openid;
  92. public string _scope;
  93. public string access_token
  94. {
  95. set { _access_token = value; }
  96. get { return _access_token; }
  97. }
  98. public string expires_in
  99. {
  100. set { _expires_in = value; }
  101. get { return _expires_in; }
  102. }
  103. public string refresh_token
  104. {
  105. set { _refresh_token = value; }
  106. get { return _refresh_token; }
  107. }
  108. public string openid
  109. {
  110. set { _openid = value; }
  111. get { return _openid; }
  112. }
  113. public string scope
  114. {
  115. set { _scope = value; }
  116. get { return _scope; }
  117. }
  118. }
  119. /// <summary>
  120. /// 用戶信息類
  121. /// </summary>
  122. public class OAuthUser
  123. {
  124. public OAuthUser()
  125. { }
  126. #region 數據庫字段
  127. private string _openID;
  128. private string _searchText;
  129. private string _nickname;
  130. private string _sex;
  131. private string _province;
  132. private string _city;
  133. private string _country;
  134. private string _headimgUrl;
  135. private string _privilege;
  136. #endregion
  137. #region 字段屬性
  138. /// <summary>
  139. /// 用戶的唯一標識
  140. /// </summary>
  141. public string openid
  142. {
  143. set { _openID = value; }
  144. get { return _openID; }
  145. }
  146. /// <summary>
  147. ///
  148. /// </summary>
  149. public string SearchText
  150. {
  151. set { _searchText = value; }
  152. get { return _searchText; }
  153. }
  154. /// <summary>
  155. /// 用戶昵稱
  156. /// </summary>
  157. public string nickname
  158. {
  159. set { _nickname = value; }
  160. get { return _nickname; }
  161. }
  162. /// <summary>
  163. /// 用戶的性別,值為1時是男性,值為2時是女性,值為0時是未知
  164. /// </summary>
  165. public string sex
  166. {
  167. set { _sex = value; }
  168. get { return _sex; }
  169. }
  170. /// <summary>
  171. /// 用戶個人資料填寫的省份
  172. /// </summary>
  173. public string province
  174. {
  175. set { _province = value; }
  176. get { return _province; }
  177. }
  178. /// <summary>
  179. /// 普通用戶個人資料填寫的城市
  180. /// </summary>
  181. public string city
  182. {
  183. set { _city = value; }
  184. get { return _city; }
  185. }
  186. /// <summary>
  187. /// 國家,如中國為CN
  188. /// </summary>
  189. public string country
  190. {
  191. set { _country = value; }
  192. get { return _country; }
  193. }
  194. /// <summary>
  195. /// 用戶頭像,最後一個數值代表正方形頭像大小(有0、46、64、96、132數值可選,0代表640*640正方形頭像),用戶沒有頭像時該項為空
  196. /// </summary>
  197. public string headimgurl
  198. {
  199. set { _headimgUrl = value; }
  200. get { return _headimgUrl; }
  201. }
  202. /// <summary>
  203. /// 用戶特權信息,json 數組,如微信沃卡用戶為(chinaunicom)其實這個格式稱不上JSON,只是個單純數組
  204. /// </summary>
  205. public string privilege
  206. {
  207. set { _privilege = value; }
  208. get { return _privilege; }
  209. }
  210. #endregion
  211. }
  212. /// <summary>
  213. /// 將Json格式數據轉化成對象
  214. /// </summary>
  215. public class JsonHelper
  216. {
  217. /// <summary>
  218. /// 生成Json格式
  219. /// </summary>
  220. /// <typeparam name="T"></typeparam>
  221. /// <param name="obj"></param>
  222. /// <returns></returns>
  223. public static string GetJson<T>(T obj)
  224. {
  225. DataContractJsonSerializer json = new DataContractJsonSerializer(obj.GetType());
  226. using (MemoryStream stream = new MemoryStream())
  227. {
  228. json.WriteObject(stream, obj);
  229. string szJson = Encoding.UTF8.GetString(stream.ToArray()); return szJson;
  230. }
  231. }
  232. /// <summary>
  233. /// 獲取Json的Model
  234. /// </summary>
  235. /// <typeparam name="T"></typeparam>
  236. /// <param name="szJson"></param>
  237. /// <returns></returns>
  238. public static T ParseFromJson<T>(string szJson)
  239. {
  240. T obj = Activator.CreateInstance<T>();
  241. using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(szJson)))
  242. {
  243. DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());
  244. return (T)serializer.ReadObject(ms);
  245. }
  246. }
  247. }

輸出微信用戶信息:

微信公眾平臺開發—利用OAuth2.0獲取微信用戶基本信息