微信公众平台开发—利用OAuth2.0获取微信用户基本信息
在借鉴前两篇获取微信用户基本信息的基础下,本人也总结整理了一些个人笔记:如何通过OAuth2.0获取微信用户信息
1、首先在某微信平台下配置OAuth2.0授权回调页面:

2、通过appid构造url获取微信回传code值(appid可在微信平台下找到)
1)、微信不弹出授权页面url:
A、code回传到页面wxProcess2.aspx,不带参数
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的值,具体如下:
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及后面需要获取的用户信息
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:
https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + appid + "&secret=" + appsecret + "&code=" + Code + "&grant_type=authorization_code
4、通过openid、access token获取用户信息,具体访问url:
https://api.weixin.qq.com/sns/userinfo?access_token=" + REFRESH_TOKEN + "&openid=" + OPENID
说明:主要通过访问微信的3个url地址并回传数据,获取微信用户基本信息
====================================================================
具体代码:
1、获取微信code处理页面:wxProcess.aspx
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
string reurl = "";
//传递参数,获取用户信息后,可跳转到自己定义的页面,想怎么处理就怎么处理
if (Request.QueryString["reurl"] != null && Request.QueryString["reurl"] != "")
{
reurl = Request.QueryString["reurl"].ToString();
}
else
{
reurl = "http://www.csdn.net";
}
string code = "";
//弹出授权页面(如在不弹出授权页面基础下未获得openid,则弹出授权页面,提示用户授权)
if (Request.QueryString["auth"] != null && Request.QueryString["auth"] != "" && Request.QueryString["auth"] == "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");
}
else
{
//不弹出授权页面
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、获取微信code值回传到自己的页面wxProcess2.aspx:
public string reurl = "";
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
//获取从wxProcess.aspx传递过来的跳转地址reurl
if (Request.QueryString["reurl"] != null && Request.QueryString["reurl"] != "")
{
reurl = Request.QueryString["reurl"].ToString();
}
string code = "";
if (Request.QueryString["code"] != null && Request.QueryString["code"] != "")
{
//获取微信回传的code
code = Request.QueryString["code"].ToString();
OAuth_Token Model = Get_token(code); //获取token
OAuthUser OAuthUser_Model = Get_UserInfo(Model.access_token, Model.openid );
if(OAuthUser_Model.openid!=null && OAuthUser_Model.openid !="") //已获取得openid及其他信息
{
//在页面上输出用户信息
Response.Write("用户OPENID:" + OAuthUser_Model.openid + "
用户昵称:" + OAuthUser_Model.nickname + "
性别:" + OAuthUser_Model.sex + "
所在省:" + OAuthUser_Model.province + "
所在市:" + OAuthUser_Model.city + "
所在国家:" + OAuthUser_Model.country + "
头像地址:" + OAuthUser_Model.headimgurl + "
用户特权信息:" + OAuthUser_Model.privilege);
//或跳转到自己的页面,想怎么处理就怎么处理
Response.Redirect(reurl);
}
else //未获得openid,回到wxProcess.aspx,访问弹出微信授权页面
{
Response.Redirect("wxProcess.aspx?auth=1");
}
}
}
}
#region 属性
public string appid = "wx6669e231bffa123f"; //公众微信平台下可以找到
public string appsecret = "9d693f7a81236c123464281115p78445"; //公众微信平台下可以找到
#endregion
//根据appid,secret,code获取微信openid、access token信息
protected OAuth_Token Get_token(string Code)
{
//获取微信回传的openid、access token
string Str = GetJson("https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + appid + "&secret=" + appsecret + "&code=" + Code + "&grant_type=authorization_code");
//微信回传的数据为Json格式,将Json格式转化成对象
OAuth_Token Oauth_Token_Model = JsonHelper.ParseFromJson(Str);
return Oauth_Token_Model;
}
//刷新Token(好像这个刷新Token没有实际作用)
protected OAuth_Token refresh_token(string REFRESH_TOKEN)
{
string Str = GetJson("https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=" + appid + "&grant_type=refresh_token&refresh_token=" + REFRESH_TOKEN);
OAuth_Token Oauth_Token_Model = JsonHelper.ParseFromJson(Str);
return Oauth_Token_Model;
}
//根据openid,access token获得用户信息
protected OAuthUser Get_UserInfo(string REFRESH_TOKEN, string OPENID)
{
string Str = GetJson("https://api.weixin.qq.com/sns/userinfo?access_token=" + REFRESH_TOKEN + "&openid=" + OPENID);
OAuthUser OAuthUser_Model = JsonHelper.ParseFromJson(Str);
return OAuthUser_Model;
}
//访问微信url并返回微信信息
protected string GetJson(string url)
{
WebClient wc = new WebClient();
wc.Credentials = CredentialCache.DefaultCredentials;
wc.Encoding = Encoding.UTF8;
string returnText = wc.DownloadString(url);
if (returnText.Contains("errcode"))
{
//可能发生错误
}
return returnText;
}
///
/// token类
///
public class OAuth_Token
{
public OAuth_Token()
{
//
//TODO: 在此处添加构造函数逻辑
//
}
//access_token 网页授权接口调用凭证,注意:此access_token与基础支持的access_token不同
//expires_in access_token接口调用凭证超时时间,单位(秒)
//refresh_token 用户刷新access_token
//openid 用户唯一标识,请注意,在未关注公众号时,用户访问公众号的网页,也会产生一个用户和公众号唯一的OpenID
//scope 用户授权的作用域,使用逗号(,)分隔
public string _access_token;
public string _expires_in;
public string _refresh_token;
public string _openid;
public string _scope;
public string access_token
{
set { _access_token = value; }
get { return _access_token; }
}
public string expires_in
{
set { _expires_in = value; }
get { return _expires_in; }
}
public string refresh_token
{
set { _refresh_token = value; }
get { return _refresh_token; }
}
public string openid
{
set { _openid = value; }
get { return _openid; }
}
public string scope
{
set { _scope = value; }
get { return _scope; }
}
}
///
/// 用户信息类
///
public class OAuthUser
{
public OAuthUser()
{ }
#region 数据库字段
private string _openID;
private string _searchText;
private string _nickname;
private string _sex;
private string _province;
private string _city;
private string _country;
private string _headimgUrl;
private string _privilege;
#endregion
#region 字段属性
///
/// 用户的唯一标识
///
public string openid
{
set { _openID = value; }
get { return _openID; }
}
///
///
///
public string SearchText
{
set { _searchText = value; }
get { return _searchText; }
}
///
/// 用户昵称
///
public string nickname
{
set { _nickname = value; }
get { return _nickname; }
}
///
/// 用户的性别,值为1时是男性,值为2时是女性,值为0时是未知
///
public string sex
{
set { _sex = value; }
get { return _sex; }
}
///
/// 用户个人资料填写的省份
///
public string province
{
set { _province = value; }
get { return _province; }
}
///
/// 普通用户个人资料填写的城市
///
public string city
{
set { _city = value; }
get { return _city; }
}
///
/// 国家,如中国为CN
///
public string country
{
set { _country = value; }
get { return _country; }
}
///
/// 用户头像,最后一个数值代表正方形头像大小(有0、46、64、96、132数值可选,0代表640*640正方形头像),用户没有头像时该项为空
///
public string headimgurl
{
set { _headimgUrl = value; }
get { return _headimgUrl; }
}
///
/// 用户特权信息,json 数组,如微信沃卡用户为(chinaunicom)其实这个格式称不上JSON,只是个单纯数组
///
public string privilege
{
set { _privilege = value; }
get { return _privilege; }
}
#endregion
}
///
/// 将Json格式数据转化成对象
///
public class JsonHelper
{
///
/// 生成Json格式
///
///
///
///
public static string GetJson(T obj)
{
DataContractJsonSerializer json = new DataContractJsonSerializer(obj.GetType());
using (MemoryStream stream = new MemoryStream())
{
json.WriteObject(stream, obj);
string szJson = Encoding.UTF8.GetString(stream.ToArray()); return szJson;
}
}
///
/// 获取Json的Model
///
///
///
///
public static T ParseFromJson(string szJson)
{
T obj = Activator.CreateInstance();
using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(szJson)))
{
DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());
return (T)serializer.ReadObject(ms);
}
}
}
输出微信用户信息:
微信公众平台开发—利用OAuth2.0获取微信用户基本信息的更多相关文章
- 微信公众平台开发(99) 自定义菜单获取OpenID
关键字 微信公众平台 自定义菜单 OpenID作者:方倍工作室原文:http://www.cnblogs.com/txw1958/p/weixin-menu-get-openid.html 在这篇微信 ...
- Java微信公众平台开发之OAuth2.0网页授权
根据官方文档点击查看在微信公众号请求用户网页授权之前,开发者需要先到公众平台官网中的"开发 - 接口权限 - 网页服务 - 网页帐号 - 网页授权获取用户基本信息"的配置选项中,修 ...
- 微信公众平台开发教程(十一)微信"企业号“上线
什么是企业号? 企业号是微信为企业客户提供的移动应用入口 关注更安全 只有企业通讯录的成员才能关注企业号,分级管理员.保密消息等各种特性确保企业内部信息的安全. 应用可配置 企业可自行在企业号中可配置 ...
- 微信公众平台开发教程--方培工作室,PHP语言版本
准备工作 微信公众平台的注册 介绍如何注册一个微信公众账号. 入门教程 微信公众平台开发入门教程 内容:1.申请SAE作为服务器; 2.启用开发模式; 3.微信公众平台PHP SDK; 4.接收发送消 ...
- 微信公众平台开发-OAuth2.0网页授权(含源码)
微信公众平台开发-OAuth2.0网页授权接口.网页授权接口详解(含源码)作者: 孟祥磊-<微信公众平台开发实例教程> 在微信开发的高级应用中,几乎都会使用到该接口,因为通过该接口,可以获 ...
- 第八篇 :微信公众平台开发实战Java版之如何网页授权获取用户基本信息
第一部分:微信授权获取基本信息的介绍 我们首先来看看官方的文档怎么说: 如果用户在微信客户端中访问第三方网页,公众号可以通过微信网页授权机制,来获取用户基本信息,进而实现业务逻辑. 关于网页授权回调域 ...
- 第七篇 :微信公众平台开发实战Java版之如何获取微信用户基本信息
在关注者与公众号产生消息交互后,公众号可获得关注者的OpenID(加密后的微信号,每个用户对每个公众号的OpenID是唯一的.对于不同公众号,同一用户的openid不同). 公众号可通过本接口来根据O ...
- 第五篇 :微信公众平台开发实战Java版之如何获取公众号的access_token以及缓存access_token
一.access_token简介 为了使第三方开发者能够为用户提供更多更有价值的个性化服务,微信公众平台 开放了许多接口,包括自定义菜单接口.客服接口.获取用户信息接口.用户分组接口.群发接口等, 开 ...
- 第九篇 :微信公众平台开发实战Java版之如何实现自定义分享内容
第一部分:微信JS-SDK介绍 微信JS-SDK是微信公众平台面向网页开发者提供的基于微信内的网页开发工具包. 通过使用微信JS-SDK,网页开发者可借助微信高效地使用拍照.选图.语音.位置等手机系统 ...
随机推荐
- 【go】脑补框架 Express beego tornado Flux reFlux React jsx jpg-ios出品
http://goexpresstravel.com/ 今天 Express 的作者 TJ Holowaychuk 发了一篇文章,正式宣告和 Node.js 拜拜了,转向 Go 语言. Go vers ...
- 2016 系统设计第一期 (档案一)MVC form数据提交
前几天我发现 MVC 虽然解决了webform的问题但是用起来真的很麻烦,不知道是我刚接触的原因还是为什么,感觉有很多的局限性,对于form的提交一个form只能绑定一个action,代码如下: @u ...
- Spring的配置文件
Web.xml将会配置Spring的配置文件位置: <servlet> <servlet-name>x</servlet-name> & ...
- 语音合成,语音播报功能(系统)-b
第一次接触语音合成,只实现了很简单的功能,记录一下,以后免得去网上四处找资料 最近在做高德地图导航的时候有个语音播报的功能,高德sdk已经提供了要语音的字符串.我要做的就是把这些字符串读出声音来即可. ...
- @Entity设置OneToMany
Hibernate设置bean映射数据库的方式有配置模式与注解模式,下面通过注解模式配置OneToMany @Entity @Table(name="csdnbbs_sys_catalog& ...
- JS中遍历普通数组和字典数组的区别
// 普通数组 var intArray = new Array(); intArray[0] = "第一个"; intArray[1] = "第二个"; fo ...
- 【概率】BZOJ 3450:Tyvj1952 Easy
Description 某一天WJMZBMR在打osu~~~但是他太弱逼了,有些地方完全靠运气:( 我们来简化一下这个游戏的规则 有n次点击要做,成功了就是o,失败了就是x,分数是按comb计算的,连 ...
- php获取类的实例变量
<?php class Page {private $title; //构造函数固定名称为__construct,这样能将php的类构造函数独立于类名,以后修改类名就无需修改构造函数名称 fun ...
- nginx负载均衡和反向代理有什么区别
近在研究nginx的负载均衡和反向代理,先看下这两个简单的配置吧! 负载均衡 worker_processes 1; events { worker_connections 1024; } http{ ...
- 172. Factorial Trailing Zeroes
题目: Given an integer n, return the number of trailing zeroes in n!. Note: Your solution should be in ...