获取微信用户的个人的信息的时候,要特别注意的是有两个不同的Access Token,他们产生的方式不一样,一种是使用AppID和AppSecret获取的access_token,一种是OAuth2.0授权中产生的access_token.
我们获取微信的个人信息就必须获取Oauth2.0授权产生的access_token.
1. 首先配置回调域名
在微信公众平台去设置
2. 构造请求url如下:
https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx8888888888888888&redirect_uri=http://mascot.duapp.com/oauth2.php&response_type=code&scope=snsapi_userinfo&state=1#wechat_redirect
http://mascot.duapp.com/oauth2.php?code=00b788e3b42043c8459a57a8d8ab5d9f&state=14. 再使用code换取oauth2的授权access_token
或者 http://mascot.duapp.com/oauth2.php?userid=oc7tbuPA9BgUCLADib5nB3k2KWWg&code=00b788e3b42043c8459a57a8d8ab5d9f&state=1
https://api.weixin.qq.com/sns/oauth2/access_token?appid=wx8888888888888888&secret=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa&code=00b788e3b42043c8459a57a8d8ab5d9f&grant_type=authorization_code
5. 再使用授权Access Token获取用户信息
url如下:
https://api.weixin.qq.com/sns/userinfo?access_token=OezXcEiiBSKSxW0eoylIeAsR0GmYd1awCffdHgb4fhS_KKf2CotGj2cBNUKQQvj-G0ZWEE5-uBjBz941EOPqDQy5sS_GCs2z40dnvU99Y5AI1bw2uqN--2jXoBLIM5d6L9RImvm8Vg8cBAiLpWA8Vw&openid=oLVPpjqs9BhvzwPj5A-vTYAX3GLc
protected virtual void PageBase_Load(object sender, EventArgs e) { //访问微信的类 WeiXinOAuth au = new WeiXinOAuth();
//结果
WeiXinAccessTokenResult result = null;
string AppID = "xxxxx";
string AppSecret = "xxxx";
string _code = ReqUtils.GetString("code", "");
string _state = ReqUtils.GetString("state", "");
//判断用户是否存在
if (SesssionWx.Current == null)
{
//微信第一次握手后得到的code 和state
if (_code == "" || _code == "authdeny")
{
if (_code == "")
{
//转发到微信的授权页面
string authUrl = au.GetWeiXinCode(AppID.Trim(), AppSecret.Trim(), HttpContext.Current.Server.UrlEncode(HttpContext.Current.Request.Url.ToString()), "STATE");
HttpContext.Current.Response.Redirect(authUrl, true);
}
else
{ // 用户取消授权
HttpContext.Current.Response.Redirect("~/Error.html", true);
}
}
else
{
result = au.GetWeiXinAccessToken(AppID, AppSecret, _code);
if (result != null)
{
string ms = JsonSerializeUtils.JsSerializer(result);
}
else
{
return;
}
userinfo = au.GetWeiXinUserInfo(result.SuccessResult.access_token, result.SuccessResult.openid);
// string mss = JsonSerializeUtils.JsSerializer(userinfo);
// DesignHawk.Common.LogHelper.WriteLog(null, "当前userinfo为:" + mss);
if (userinfo != null)
{
userBasic = userBasicBll.GetUserOpenID(userinfo.UserInfo.openid);
}
else
{
}
}
}
else
{
}
}
WeiXinOAuth.cs类
public class WeiXinOAuth
{
/// <summary>
/// 获取微信Code
/// </summary>
/// <param name="appId"></param>
/// <param name="appSecret"></param>
/// <param name="redirectUrl"></param>
public string GetWeiXinCode(string appId, string appSecret, string redirectUrl,string state)
{
Random r = new Random();
//微信登录授权
//string url = "https://open.weixin.qq.com/connect/qrconnect?appid=" + appId + "&redirect_uri=" + redirectUrl +"&response_type=code&scope=snsapi_login&state=STATE#wechat_redirect";
//微信OpenId授权
//string url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + appId + "&redirect_uri=" + redirectUrl +"&response_type=code&scope=snsapi_login&state=STATE#wechat_redirect";
//微信用户信息授权
string url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + appId + "&redirect_uri=" + redirectUrl + "&response_type=code&scope=snsapi_userinfo&state="+state+"#wechat_redirect";
return url;
}
/// <summary>
/// 通过code获取access_token
/// </summary>
/// <param name="appId"></param>
/// <param name="appSecret"></param>
/// <param name="code"></param>
/// <returns></returns>
public WeiXinAccessTokenResult GetWeiXinAccessToken(string appId, string appSecret, string code)
{
string url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + appId + "&secret=" + appSecret +
"&code=" + code + "&grant_type=authorization_code";
//string jsonStr = Tools.GetHttpRequest(url);
string jsonStr = GetJson(url);
//SPC.Common.DLog.Write("GetWeiXinAccessToken , jsonStr = " + jsonStr, SPC.Common.DLog.LogMessageType.Info);
WeiXinAccessTokenResult result = new WeiXinAccessTokenResult();
if (jsonStr.Contains("errcode"))
{
WeiXinErrorMsg errorResult = new WeiXinErrorMsg();
// errorResult = JsonHelper.FromJson<Model.WeiXinErrorMsg>(jsonStr);
errorResult = JsonSerializeUtils.JsDeSerializer<WeiXinErrorMsg>(jsonStr);
result.ErrorResult = errorResult;
result.Result = false;
}
else
{
WeiXinAccessTokenModel model = new WeiXinAccessTokenModel();
// model = JsonHelper.FromJson<Model.WeiXinAccessTokenModel>(jsonStr);
model = JsonSerializeUtils.JsDeSerializer<WeiXinAccessTokenModel>(jsonStr);
result.SuccessResult = model;
result.Result = true;
}
return result;
}
/// <summary>
/// 获取基础acess_token
/// </summary>
/// <param name="appId"></param>
/// <param name="appSecret"></param>
/// <returns></returns>
public Access_token GetAcess_token(string appId, string appSecret)
{
string url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="+appId+"&secret="+appSecret+"";
string json = GetJson(url);
Access_token token = new Access_token();
if (json.Contains("errcode"))
{
}
else
{
token = JsonSerializeUtils.JsDeSerializer<Access_token>(json);
}
return token;
}
/// <summary>
/// 获取jsapi_ticket
/// jsapi_ticket是公众号用于调用微信JS接口的临时票据。
/// 正常情况下,jsapi_ticket的有效期为7200秒,通过access_token来获取。
/// 由于获取jsapi_ticket的api调用次数非常有限,频繁刷新jsapi_ticket会导致api调用受限,影响自身业务,开发者必须在自己的服务全局缓存jsapi_ticket 。
/// </summary>
/// <param name="access_token">BasicAPI获取的access_token,也可以通过TokenHelper获取</param>
/// <returns></returns>
public WeiXinJsapi_ticket GetTickect(string access_token)
{
var url = string.Format("https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token={0}&type=jsapi", access_token);
string json = GetJson(url);
WeiXinJsapi_ticket result = new WeiXinJsapi_ticket();
if (json.Contains("errcode"))
{
// errorResult = JsonHelper.FromJson<Model.WeiXinErrorMsg>(jsonStr);
result = JsonSerializeUtils.JsDeSerializer<WeiXinJsapi_ticket>(json);
}
else
{
// model = JsonHelper.FromJson<Model.WeiXinAccessTokenModel>(jsonStr);
result = JsonSerializeUtils.JsDeSerializer<WeiXinJsapi_ticket>(json);
}
return result;
}
/// <summary>
/// 签名算法
/// </summary>
/// <param name="jsapi_ticket">jsapi_ticket</param>
/// <param name="noncestr">随机字符串(必须与wx.config中的nonceStr相同)</param>
/// <param name="timestamp">时间戳(必须与wx.config中的timestamp相同)</param>
/// <param name="url">当前网页的URL,不包含#及其后面部分(必须是调用JS接口页面的完整URL)</param>
/// <returns></returns>
public string GetSignature(string jsapi_ticket, string noncestr, long timestamp, string url, string string1)
{
var string1Builder = new StringBuilder();
string1Builder.Append("jsapi_ticket=").Append(jsapi_ticket).Append("&")
.Append("noncestr=").Append(noncestr).Append("&")
.Append("timestamp=").Append(timestamp).Append("&")
.Append("url=").Append(url.IndexOf("#") >= 0 ? url.Substring(0, url.IndexOf("#")) : url);
string1 = string1Builder.ToString();
DesignHawk.Common.LogHelper.WriteLog(null, "JSAPI:" + string1);
return System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(string1, "SHA1");
//Sha1(string1);
}
/// Sha1
/// </summary>
/// <param name="orgStr"></param>
/// <param name="encode"></param>
/// <returns></returns>
public static string Sha1(string orgStr, string encode = "UTF-8")
{
var sha1 = new SHA1Managed();
var sha1bytes = System.Text.Encoding.GetEncoding(encode).GetBytes(orgStr);
byte[] resultHash = sha1.ComputeHash(sha1bytes);
string sha1String = BitConverter.ToString(resultHash).ToLower();
sha1String = sha1String.Replace("-", "");
return sha1String;
}
public string GetNoncestr()
{
Random rd = new Random();
string str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXY";
string result = "";
for (int i = 0; i < 15; i++)
{
result += str[rd.Next(str.Length)];
}
return result;
}
public long GetTimeStamp()
{
return (DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000000;
}
/// <summary>
/// 拉取用户信息
/// </summary>
/// <param name="accessToken"></param>
/// <param name="openId"></param>
/// <returns></returns>
public WeiXinUserInfoResult GetWeiXinUserInfo(string accessToken, string openId)
{
string url = "https://api.weixin.qq.com/sns/userinfo?access_token=" + accessToken + "&openid=" + openId + "&lang=zh_CN";
// SPC.Common.DLog.Write("获取微信的用户信息(第三次微信握手):", SPC.Common.DLog.LogMessageType.Info);
//string jsonStr = Tools.GetHttpRequest(url);
string jsonStr = GetJson(url);
// SPC.Common.DLog.Write("jsonStr =" + jsonStr, SPC.Common.DLog.LogMessageType.Info);
WeiXinUserInfoResult result = new WeiXinUserInfoResult();
if (jsonStr.Contains("errcode"))
{
WeiXinErrorMsg errorResult = new WeiXinErrorMsg();
// errorResult = JsonHelper.FromJson<Model.WeiXinErrorMsg>(jsonStr);
errorResult = JsonSerializeUtils.JsDeSerializer<WeiXinErrorMsg>(jsonStr);
result.ErrorMsg = errorResult;
result.Result = false;
}
else
{
WeiXinUserInfo userInfo = new WeiXinUserInfo();
// userInfo = JsonHelper.FromJson<Model.WeiXinUserInfo>(jsonStr);
userInfo = JsonSerializeUtils.JsDeSerializer<WeiXinUserInfo>(jsonStr);
result.UserInfo = userInfo;
result.Result = true;
}
return result;
}
//访问微信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;
}
}
}
{
/// <summary>
/// 获取微信Code
/// </summary>
/// <param name="appId"></param>
/// <param name="appSecret"></param>
/// <param name="redirectUrl"></param>
public string GetWeiXinCode(string appId, string appSecret, string redirectUrl,string state)
{
Random r = new Random();
//微信登录授权
//string url = "https://open.weixin.qq.com/connect/qrconnect?appid=" + appId + "&redirect_uri=" + redirectUrl +"&response_type=code&scope=snsapi_login&state=STATE#wechat_redirect";
//微信OpenId授权
//string url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + appId + "&redirect_uri=" + redirectUrl +"&response_type=code&scope=snsapi_login&state=STATE#wechat_redirect";
//微信用户信息授权
string url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + appId + "&redirect_uri=" + redirectUrl + "&response_type=code&scope=snsapi_userinfo&state="+state+"#wechat_redirect";
return url;
}
/// <summary>
/// 通过code获取access_token
/// </summary>
/// <param name="appId"></param>
/// <param name="appSecret"></param>
/// <param name="code"></param>
/// <returns></returns>
public WeiXinAccessTokenResult GetWeiXinAccessToken(string appId, string appSecret, string code)
{
string url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + appId + "&secret=" + appSecret +
"&code=" + code + "&grant_type=authorization_code";
//string jsonStr = Tools.GetHttpRequest(url);
string jsonStr = GetJson(url);
//SPC.Common.DLog.Write("GetWeiXinAccessToken , jsonStr = " + jsonStr, SPC.Common.DLog.LogMessageType.Info);
WeiXinAccessTokenResult result = new WeiXinAccessTokenResult();
if (jsonStr.Contains("errcode"))
{
WeiXinErrorMsg errorResult = new WeiXinErrorMsg();
// errorResult = JsonHelper.FromJson<Model.WeiXinErrorMsg>(jsonStr);
errorResult = JsonSerializeUtils.JsDeSerializer<WeiXinErrorMsg>(jsonStr);
result.ErrorResult = errorResult;
result.Result = false;
}
else
{
WeiXinAccessTokenModel model = new WeiXinAccessTokenModel();
// model = JsonHelper.FromJson<Model.WeiXinAccessTokenModel>(jsonStr);
model = JsonSerializeUtils.JsDeSerializer<WeiXinAccessTokenModel>(jsonStr);
result.SuccessResult = model;
result.Result = true;
}
return result;
}
/// <summary>
/// 获取基础acess_token
/// </summary>
/// <param name="appId"></param>
/// <param name="appSecret"></param>
/// <returns></returns>
public Access_token GetAcess_token(string appId, string appSecret)
{
string url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="+appId+"&secret="+appSecret+"";
string json = GetJson(url);
Access_token token = new Access_token();
if (json.Contains("errcode"))
{
}
else
{
token = JsonSerializeUtils.JsDeSerializer<Access_token>(json);
}
return token;
}
/// <summary>
/// 获取jsapi_ticket
/// jsapi_ticket是公众号用于调用微信JS接口的临时票据。
/// 正常情况下,jsapi_ticket的有效期为7200秒,通过access_token来获取。
/// 由于获取jsapi_ticket的api调用次数非常有限,频繁刷新jsapi_ticket会导致api调用受限,影响自身业务,开发者必须在自己的服务全局缓存jsapi_ticket 。
/// </summary>
/// <param name="access_token">BasicAPI获取的access_token,也可以通过TokenHelper获取</param>
/// <returns></returns>
public WeiXinJsapi_ticket GetTickect(string access_token)
{
var url = string.Format("https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token={0}&type=jsapi", access_token);
string json = GetJson(url);
WeiXinJsapi_ticket result = new WeiXinJsapi_ticket();
if (json.Contains("errcode"))
{
// errorResult = JsonHelper.FromJson<Model.WeiXinErrorMsg>(jsonStr);
result = JsonSerializeUtils.JsDeSerializer<WeiXinJsapi_ticket>(json);
}
else
{
// model = JsonHelper.FromJson<Model.WeiXinAccessTokenModel>(jsonStr);
result = JsonSerializeUtils.JsDeSerializer<WeiXinJsapi_ticket>(json);
}
return result;
}
/// <summary>
/// 签名算法
/// </summary>
/// <param name="jsapi_ticket">jsapi_ticket</param>
/// <param name="noncestr">随机字符串(必须与wx.config中的nonceStr相同)</param>
/// <param name="timestamp">时间戳(必须与wx.config中的timestamp相同)</param>
/// <param name="url">当前网页的URL,不包含#及其后面部分(必须是调用JS接口页面的完整URL)</param>
/// <returns></returns>
public string GetSignature(string jsapi_ticket, string noncestr, long timestamp, string url, string string1)
{
var string1Builder = new StringBuilder();
string1Builder.Append("jsapi_ticket=").Append(jsapi_ticket).Append("&")
.Append("noncestr=").Append(noncestr).Append("&")
.Append("timestamp=").Append(timestamp).Append("&")
.Append("url=").Append(url.IndexOf("#") >= 0 ? url.Substring(0, url.IndexOf("#")) : url);
string1 = string1Builder.ToString();
DesignHawk.Common.LogHelper.WriteLog(null, "JSAPI:" + string1);
return System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(string1, "SHA1");
//Sha1(string1);
}
/// Sha1
/// </summary>
/// <param name="orgStr"></param>
/// <param name="encode"></param>
/// <returns></returns>
public static string Sha1(string orgStr, string encode = "UTF-8")
{
var sha1 = new SHA1Managed();
var sha1bytes = System.Text.Encoding.GetEncoding(encode).GetBytes(orgStr);
byte[] resultHash = sha1.ComputeHash(sha1bytes);
string sha1String = BitConverter.ToString(resultHash).ToLower();
sha1String = sha1String.Replace("-", "");
return sha1String;
}
public string GetNoncestr()
{
Random rd = new Random();
string str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXY";
string result = "";
for (int i = 0; i < 15; i++)
{
result += str[rd.Next(str.Length)];
}
return result;
}
public long GetTimeStamp()
{
return (DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000000;
}
/// <summary>
/// 拉取用户信息
/// </summary>
/// <param name="accessToken"></param>
/// <param name="openId"></param>
/// <returns></returns>
public WeiXinUserInfoResult GetWeiXinUserInfo(string accessToken, string openId)
{
string url = "https://api.weixin.qq.com/sns/userinfo?access_token=" + accessToken + "&openid=" + openId + "&lang=zh_CN";
// SPC.Common.DLog.Write("获取微信的用户信息(第三次微信握手):", SPC.Common.DLog.LogMessageType.Info);
//string jsonStr = Tools.GetHttpRequest(url);
string jsonStr = GetJson(url);
// SPC.Common.DLog.Write("jsonStr =" + jsonStr, SPC.Common.DLog.LogMessageType.Info);
WeiXinUserInfoResult result = new WeiXinUserInfoResult();
if (jsonStr.Contains("errcode"))
{
WeiXinErrorMsg errorResult = new WeiXinErrorMsg();
// errorResult = JsonHelper.FromJson<Model.WeiXinErrorMsg>(jsonStr);
errorResult = JsonSerializeUtils.JsDeSerializer<WeiXinErrorMsg>(jsonStr);
result.ErrorMsg = errorResult;
result.Result = false;
}
else
{
WeiXinUserInfo userInfo = new WeiXinUserInfo();
// userInfo = JsonHelper.FromJson<Model.WeiXinUserInfo>(jsonStr);
userInfo = JsonSerializeUtils.JsDeSerializer<WeiXinUserInfo>(jsonStr);
result.UserInfo = userInfo;
result.Result = true;
}
return result;
}
//访问微信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;
}
}
}