zoukankan      html  css  js  c++  java
  • 微信公众平台开发—利用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.     }  

     输出微信用户信息:

  • 相关阅读:
    实用硬件篇(一)
    iOS通讯录(纯纯的干货)
    iOS社会化分享(干货)
    静态库的打包及使用(干货)
    iOS地图集成示例:百度地图POI检索
    iOS开发之KVC全解
    网络干货
    输入一个字符串,按字典序打印出该字符串中字符的所有排列(剑指offer)
    序列化二叉树
    二叉树中和为某一值的路径
  • 原文地址:https://www.cnblogs.com/soundcode/p/7487741.html
Copyright © 2011-2022 走看看