2. 构造请求url如下:
5. 再使用授权Access Token获取用户信息
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;
}
}
}