微信公众平台开发—利用OAuth2.0获取微信用户基本信息

Posted 左正

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了微信公众平台开发—利用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.     }  

 

 

 输出微信用户信息:

以上是关于微信公众平台开发—利用OAuth2.0获取微信用户基本信息的主要内容,如果未能解决你的问题,请参考以下文章

Java微信公众平台开发(十六)--微信网页授权(OAuth2.0授权)获取用户基本信息

微信公众平台开发教程_OAuth2.0认证

微信公众平台消息接口里,如何用php获取用户头像

Java微信公众平台开发之OAuth2.0网页授权

微信公众号用户与网站用户的绑定-自定义菜单获取Openid

微信公众平台开发——微信授权登录(OAuth2.0)