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

简介: 1、首先在某微信平台下配置OAuth2.0授权回调页面: 2、通过appid构造url获取微信回传code值(appid可在微信平台下找到) 1)、微信不弹出授权页面url: A、code回传到页面wxProcess2.

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.     }  

 

 

 输出微信用户信息:

 

 

本文转自左正博客园博客,原文链接:http://www.cnblogs.com/soundcode/p/7487741.html,如需转载请自行联系原作者

相关文章
|
自然语言处理 搜索推荐 小程序
微信公众号接口:解锁公众号开发的无限可能
微信公众号接口是微信官方提供的API,支持开发者通过编程与公众号交互,实现自动回复、消息管理、用户管理和数据分析等功能。本文深入探讨接口的定义、类型、优势及应用场景,如智能客服、内容分发、电商闭环等,并介绍开发流程和工具,帮助运营者提升用户体验和效率。未来,随着微信生态的发展,公众号接口将带来更多机遇,如小程序融合、AI应用等。
|
11月前
|
消息中间件 人工智能 Java
抖音微信爆款小游戏大全:免费休闲/竞技/益智/PHP+Java全筏开源开发
本文基于2025年最新行业数据,深入解析抖音/微信爆款小游戏的开发逻辑,重点讲解PHP+Java双引擎架构实战,涵盖技术选型、架构设计、性能优化与开源生态,提供完整开源工具链,助力开发者从理论到落地打造高留存、高并发的小游戏产品。
|
JSON 小程序 JavaScript
uni-app开发微信小程序的报错[渲染层错误]排查及解决
uni-app开发微信小程序的报错[渲染层错误]排查及解决
4635 7
|
小程序 前端开发 Android开发
小程序微信分享功能如何开发?开放平台已绑定仍不能使用的问题?-优雅草卓伊凡
小程序微信分享功能如何开发?开放平台已绑定仍不能使用的问题?-优雅草卓伊凡
2662 29
小程序微信分享功能如何开发?开放平台已绑定仍不能使用的问题?-优雅草卓伊凡
|
小程序 JavaScript 前端开发
uni-app开发微信小程序:四大解决方案,轻松应对主包与vendor.js过大打包难题
uni-app开发微信小程序:四大解决方案,轻松应对主包与vendor.js过大打包难题
5177 1
|
12月前
|
小程序 JavaScript API
uni-halo + 微信小程序开发实录:我的第一个作品诞生记
这篇文章介绍了使用uni-halo框架进行微信小程序开发的过程,包括选择该框架的原因、开发目标以及项目配置和部署的步骤。
624 0
uni-halo + 微信小程序开发实录:我的第一个作品诞生记
|
人工智能 开发框架 机器人
AstrBot:轻松将大模型接入QQ、微信等消息平台,打造多功能AI聊天机器人的开发框架,附详细教程
AstrBot 是一个开源的多平台聊天机器人及开发框架,支持多种大语言模型和消息平台,具备多轮对话、语音转文字等功能。
9636 38
AstrBot:轻松将大模型接入QQ、微信等消息平台,打造多功能AI聊天机器人的开发框架,附详细教程
|
人工智能 自然语言处理 小程序
技术小白如何利用DeepSeek半小时开发微信小程序?
通过通义灵码的“AI程序员”功能,即使没有编程基础也能轻松创建小程序或网页。借助DeepSeek V3和R1满血版模型,用户只需用自然语言描述需求,就能自动生成代码并优化程序。例如,一个文科生仅通过描述需求就成功开发了一款记录日常活动的微信小程序。此外,通义灵码还提供智能问答模式,帮助用户解决开发中的各种问题,极大简化了开发流程,让普通人的开发体验更加顺畅。
4139 11
技术小白如何利用DeepSeek半小时开发微信小程序?
|
小程序 Java 关系型数据库
weixin163基于微信小程序的校园二手交易平台系统设计与开发ssm(文档+源码)_kaic
本文介绍了一款基于微信小程序的校园二手物品交易平台的开发与实现。该平台采用Java语言开发服务端,使用MySQL数据库进行数据存储,前端以微信小程序为载体,支持管理员和学生两种角色操作。管理员可管理用户、商品分类及信息、交易记录等,而学生则能注册登录、发布购买商品、参与交流论坛等。系统设计注重交互性和安全性,通过SSM框架优化开发流程,确保高效稳定运行,满足用户便捷交易的需求,推动校园资源共享与循环利用。
|
小程序 JavaScript 前端开发
微信小程序开发全流程:从注册到上线的完整指南
这篇文章详细记录了微信小程序的完整开发到最终上线的每一个步骤。适合对小程序开发感兴趣的个人开发者或希望了解完整流程的学习者,涵盖了云开发、事件绑定、生命周期管理、组件使用等关键内容。
24750 14