OAuth2API.cs 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Net.Http;
  6. using Codeplex.Data;
  7. namespace LYFZ.Weixin.SDK
  8. {
  9. /// <summary>
  10. /// 对应微信API的 "用户管理"=> "网页授权获取用户基本信息”
  11. /// http://mp.weixin.qq.com/wiki/17/c0f37d5704f0b64713d5d2c37b468d75.html
  12. /// </summary>
  13. public class OAuth2API
  14. {
  15. /// <summary>
  16. /// 第二步:通过code换取网页授权access_token
  17. /// </summary>
  18. /// <param name="code">第一步获取的code参数</param>
  19. /// <param name="appId">公众号的唯一标识</param>
  20. /// <param name="appSecret">公众号的appsecret</param>
  21. /// 正确时返回的JSON数据包如下:
  22. ///{
  23. ///"access_token":"ACCESS_TOKEN",
  24. ///"expires_in":7200,
  25. ///"refresh_token":"REFRESH_TOKEN",
  26. ///"openid":"OPENID",
  27. ///"scope":"SCOPE"
  28. ///}
  29. ///错误时微信会返回JSON数据包如下(示例为Code无效错误):
  30. ///{"errcode":40029,"errmsg":"invalid code"}
  31. /// <returns></returns>
  32. public static dynamic GetAccessToken(string code, string appId, string appSecret)
  33. {
  34. var client = new HttpClient();
  35. var result = client.GetAsync(string.Format("https://api.weixin.qq.com/sns/oauth2/access_token?appid={0}&secret={1}&code={2}&grant_type=authorization_code", appId, appSecret, code)).Result;
  36. if (!result.IsSuccessStatusCode) return null;
  37. return DynamicJson.Parse(result.Content.ReadAsStringAsync().Result);
  38. }
  39. /// <summary>
  40. /// 第三步:刷新access_token(如果需要)
  41. /// 由于access_token拥有较短的有效期,当access_token超时后,可以使用refresh_token进行刷新,refresh_token拥有较长的有效期(7天、30天、60天、90天),当refresh_token失效的后,需要用户重新授权。
  42. /// </summary>
  43. /// <param name="refreshToken">填写通过access_token获取到的refresh_token参数</param>
  44. /// <param name="appId">公众号的唯一标识</param>
  45. /// <returns>
  46. /// 正确时返回的JSON数据包如下:
  47. /// {
  48. /// "access_token":"ACCESS_TOKEN",
  49. /// "expires_in":7200,
  50. /// "refresh_token":"REFRESH_TOKEN",
  51. /// "openid":"OPENID",
  52. /// "scope":"SCOPE"
  53. /// }
  54. ///
  55. /// 错误时微信会返回JSON数据包如下(示例为Code无效错误):
  56. ///{"errcode":40029,"errmsg":"invalid code"}
  57. /// </returns>
  58. public static dynamic RefreshAccess_token(string refreshToken, string appId)
  59. {
  60. var client = new HttpClient();
  61. var result = client.GetAsync(string.Format("https://api.weixin.qq.com/sns/oauth2/refresh_token?appid={0}&grant_type=refresh_token&refresh_token={1}", appId, refreshToken)).Result;
  62. if (!result.IsSuccessStatusCode) return null;
  63. return DynamicJson.Parse(result.Content.ReadAsStringAsync().Result);
  64. }
  65. /// <summary>
  66. /// 第四步:拉取用户信息(需scope为 snsapi_userinfo)
  67. /// </summary>
  68. /// <param name="accessToekn">网页授权接口调用凭证,注意:此access_token与基础支持的access_token不同</param>
  69. /// <param name="openId">用户的唯一标识</param>
  70. /// <param name="lang">返回国家地区语言版本,zh_CN 简体,zh_TW 繁体,en 英语</param>
  71. /// <returns>
  72. /// 正确时返回的JSON数据包如下:
  73. /// {
  74. /// "openid":" OPENID",
  75. /// "nickname": NICKNAME,
  76. /// "sex":"1",
  77. /// "province":"PROVINCE"
  78. /// "city":"CITY",
  79. /// "country":"COUNTRY",
  80. /// "headimgurl": "http://wx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/46",
  81. ///"privilege":[
  82. ///"PRIVILEGE1"
  83. ///"PRIVILEGE2"
  84. /// ]
  85. ///}
  86. ///
  87. ///错误时微信会返回JSON数据包如下(示例为openid无效):
  88. ///{"errcode":40003,"errmsg":" invalid openid "}
  89. /// </returns>
  90. public static dynamic GetUserInfo(string accessToekn, string openId, string lang = "zh_CN")
  91. {
  92. var client = new HttpClient();
  93. var result = client.GetAsync(string.Format("https://api.weixin.qq.com/sns/userinfo?access_token={0}&openid={1}&lang={2}", accessToekn, openId, lang)).Result;
  94. if (!result.IsSuccessStatusCode) return null;
  95. return DynamicJson.Parse(result.Content.ReadAsStringAsync().Result);
  96. }
  97. }
  98. }