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

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

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章