123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169 |
- using System;
- using System.Collections.Generic;
- using System.Collections.Specialized;
- using System.IO;
- using System.Linq;
- using System.Net;
- using System.Net.Http;
- using System.Text;
- using System.Threading.Tasks;
- using System.Web;
- using Microsoft.AspNetCore.Http;
- using Common;
- using ZcPeng.weixin.PublicAccount;
- using Newtonsoft.Json;
- using JCSoft.WX.Framework.Models.ApiRequests;
- using JCSoft.WX.Framework.Models;
- using Microsoft.AspNetCore.Authentication.Cookies;
- using System.Security.Claims;
- using JCSoft.WX.Framework.Api;
- using Microsoft.AspNetCore.Authentication;
- using JCSoft.WX.Framework.Models.ApiResponses;
- namespace Common.Wechat
- {
- public class WechatHelper
- {
- /// <summary>
- /// 验证微信签名
- /// </summary>
- public static bool CheckSignature(string token, string signature, string timestamp, string nonce)
- {
- string[] ArrTmp = { token, timestamp, nonce };
- Array.Sort(ArrTmp);
- string tmpStr = string.Join("", ArrTmp);
- //tmpStr = FormsAuthentication.HashPasswordForStoringInConfigFile(tmpStr, "SHA1");
- //tmpStr = Membership.CreateUser(tmpStr, "SHA1");
- tmpStr = tmpStr.ToLower();
- if (tmpStr == signature)
- {
- return true;
- }
- else
- {
- return false;
- }
- }
- public static void ReGetOpenId(HttpContext reqContext,string param = "")
- {
- string Appid = Config.WeChatAppKey;
- string Secret = Config.WeChatAppSecret;
- string url = GetAbsoluteUri(reqContext.Request);//获取当前url
- Log log = new Log(AppDomain.CurrentDomain.BaseDirectory + @"/log/Log.txt");
- if (reqContext.Session.GetString("openid") == "" || reqContext.Session.GetString("openid") == null)
- {
- //先要判断是否是获取code后跳转过来的
- if (reqContext.Request.Query["code"].FirstOrDefault()== ""
- || reqContext.Request.Query["code"].FirstOrDefault() == null)
- {
- //Code为空时,先获取Code
- string GetCodeUrls = GetCodeUrl(url,Appid, "");
- log.log("获取openid 前 GetCodeUrls:" + GetCodeUrls);
- reqContext.Response.Redirect(GetCodeUrls);//先跳转到微信的服务器,取得code后会跳回来这页面的
- }
- else
- {
- //Code非空,已经获取了code后跳回来啦,现在重新获取openid
- string openid = "";
- openid = GetOauthAccessOpenId(reqContext.Request.Query["Code"].FirstOrDefault(),Appid, Secret);//重新取得用户的openid
- reqContext.Session.SetString("openid",openid);
- log.log("走完获取openid的方法之后,当前Session的值是:" + reqContext.Session.GetString("openid"));
- }
- }
- }
- #region 重新获取Code的跳转链接(没有用户授权的,只能获取基本信息)
- /// <summary>重新获取Code,以后面实现带着Code重新跳回目标页面(没有用户授权的,只能获取基本信息(openid))</summary>
- /// <param name="url">目标页面</param>
- /// <returns></returns>
- public static string GetCodeUrl(string url,string Appid,string param="")
- {
- Log log = new Log(AppDomain.CurrentDomain.BaseDirectory + @"/log/Log.txt");
- string CodeUrl = "";
- //对url进行编码
- url = System.Web.HttpUtility.UrlEncode(url+ param);
- CodeUrl = string.Format("https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + Appid + "&redirect_uri=" + url
- + "&response_type=code&scope=snsapi_base&state=1#wechat_redirect");//?action=viewtest
- log.log("拿到code的url是:" + CodeUrl);
- return CodeUrl;
- }
- #endregion
- #region 以Code换取用户的openid、access_token
- /// <summary>根据Code获取用户的openid、access_token</summary>
- public static string GetOauthAccessOpenId(string code,string Appid,string Secret)
- {
- Log log = new Log(AppDomain.CurrentDomain.BaseDirectory + @"/log/Log.txt");
- string Openid = "";
- string url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + Appid + "&secret=" + Secret + "&code=" + code + "&grant_type=authorization_code";
- string result = HttpHelper.HttpGet(url, "application/json");
- log.log("拿到的url是:" + url);
- log.log("获取到的result是" + result);
- var jsonData = JsonConvert.DeserializeAnonymousType(result, new { access_token = "", openid = "", errcode = 0 });
- if (jsonData.errcode != 0)
- {
- return "";
- }
- log.log("能否从html里拿到openid=" + jsonData.openid);
- Openid = jsonData.openid;
- return Openid;
- }
- #endregion
-
- public static string GetAbsoluteUri(HttpRequest request)
- {
- //TODO:delete test code
- return new StringBuilder()
- //.Append(request.Scheme)
- .Append("https")
- .Append("://")
- //.Append(request.Host)
- //.Append("119.27.191.247")
- .Append(Config.Host)
- .Append(request.PathBase)
- .Append(request.Path)
- .Append(request.QueryString)
- .ToString();
- }
- /// <summary>
- /// 这个方法不用了
- /// </summary>
- /// <param name="_client"></param>
- /// <returns></returns>
- public static AccountInfo getAccessToken(IApiClient _client )
- {
- var info = AccountInfoCollection.GetAccountInfo(Config.WeChatAppName);
- if (info == null || info.Token == null || info.Token == "") {
- var request = new AccessTokenRequest(new AppIdentication(Config.WeChatAppKey, Config.WeChatAppSecret));
- var response = _client.Execute(request);
- bool IsSuccess = !response.IsError;
- if (!response.IsError)
- {
- //加入测试公众号
- AccountInfo account = new AccountInfo(Config.WeChatAppName, Config.WeChatAppKey, Config.WeChatAppSecret, response.Access_Token, null,response.Expires_In);
- AccountInfoCollection.SetAccountInfo(account);
- //加入正式公众号
- //AccountInfoCollection.SetAccountInfo(new AccountInfo("YourId2", "AppId", "AppSecret", "Token", "EncodingAesKey", "非測試"));
- return account;
- }
- else
- {
- return null;
- }
- }
- return info;
- }
-
- }
- }
|