
一、 基础配置
Web.config
<appSettings>
<!--微信公众号 输入公众号的值 -->
<add key="WeChat_Public_Token" value="Token" />
<add key="WeChat_Public_AppId" value="AppId" />
<add key="WeChat_Public_AppSecret" value="AppSecret" />
<add key="WeChat_Public_EncodingAESKey" value="EncodingAESKey" />
</appSettings>
自定义工具类
public class GetAppSettingHelper
{
public static string Token => ConfigurationManager.AppSettings["WeChat_Public_Token"];
public static string AppId => ConfigurationManager.AppSettings["WeChat_Public_AppId"];
public static string AppSecret =>ConfigurationManager.AppSettings["WeChat_Public_AppSecret"];
public static string EncodingAESKey => ConfigurationManager.AppSettings["WeChat_Public_EncodingAESKey"];
}
Global.asax
public class WebApiApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
GlobalConfiguration.Configure(WebApiConfig.Register);
RouteConfig.RegisterRoutes(RouteTable.Routes);
var isGLobalDebug = true;
var senparcSetting = SenparcSetting.BuildFromWebConfig(isGLobalDebug);
IRegisterService register = RegisterService.Start(senparcSetting).UseSenparcGlobal();
var isWeixinDebug = true;
var senparcWeixinSetting = SenparcWeixinSetting.BuildFromWebConfig(isWeixinDebug);
register.UseSenparcWeixin(senparcWeixinSetting, senparcSetting);
log4net.Config.XmlConfigurator.Configure(new System.IO.FileInfo(Server.MapPath("~/bin/Log4Net.config")));
}
}
二、服务器配置
HomeController
public partial class HomeController : Controller
{
public static readonly string Token = GetAppSettingHelper.Token;
public static readonly string EncodingAESKey = GetAppSettingHelper.EncodingAESKey;
public static readonly string AppId = GetAppSettingHelper.AppId;
readonly Func<string> _getRandomFileName = () => SystemTime.Now.ToString("yyyyMMdd-HHmmss") + Guid.NewGuid().ToString("n").Substring(0, 6);
[HttpGet]
[ActionName("Index")]
public ActionResult Get(PostModel postModel, string echostr)
{
if (CheckSignature.Check(postModel.Signature, postModel.Timestamp, postModel.Nonce, Token))
{
return Content(echostr);
}
else
{
return Content("failed:" + postModel.Signature + "," + Senparc.Weixin.MP.CheckSignature.GetSignature(postModel.Timestamp, postModel.Nonce, Token) + "。" +
"如果你在浏览器中看到这句话,说明此地址可以被作为微信公众账号后台的Url,请注意保持Token一致。");
}
}
[HttpPost]
[ActionName("Index")]
[Obsolete]
public ActionResult Post(PostModel postModel)
{
if (!CheckSignature.Check(postModel.Signature, postModel.Timestamp, postModel.Nonce, Token))
{
return Content("参数错误!");
}
#region 打包 PostModel 信息
postModel.Token = Token;
postModel.EncodingAESKey = EncodingAESKey;
postModel.AppId = AppId;
#endregion
var maxRecordCount = 10;
var messageHandler = new CustomMessageHandler(Request.InputStream, postModel, maxRecordCount);
#region 设置消息去重
messageHandler.OmitRepeatedMessage = true;
#endregion
try
{
messageHandler.SaveRequestMessageLog();
messageHandler.Execute();
messageHandler.SaveResponseMessageLog();
return new FixWeixinBugWeixinResult(messageHandler);
}
catch (Exception ex)
{
#region 异常处理
WeixinTrace.Log("MessageHandler错误:{0}", ex.Message);
using (TextWriter tw = new StreamWriter(ServerUtility.ContentRootMapPath("~/App_Data/Error_" + _getRandomFileName() + ".txt")))
{
tw.WriteLine("ExecptionMessage:" + ex.Message);
tw.WriteLine(ex.Source);
tw.WriteLine(ex.StackTrace);
if (messageHandler.ResponseDocument != null)
{
tw.WriteLine(messageHandler.ResponseDocument.ToString());
}
if (ex.InnerException != null)
{
tw.WriteLine("========= InnerException =========");
tw.WriteLine(ex.InnerException.Message);
tw.WriteLine(ex.InnerException.Source);
tw.WriteLine(ex.InnerException.StackTrace);
}
tw.Flush();
tw.Close();
}
return Content("");
#endregion
}
}
}
CustomMessageHandler.cs
public class CustomMessageHandler : MessageHandler<CustomMessageContext>
{
public CustomMessageHandler(Stream inputStream, PostModel postModel, int maxRecordCount = 0, bool onlyAllowEncryptMessage = false)
: base(inputStream, postModel, maxRecordCount, onlyAllowEncryptMessage)
{
GlobalMessageContext.ExpireMinutes = 3;
OnlyAllowEncryptMessage = true;
if (!string.IsNullOrEmpty(postModel.AppId))
{
appId = postModel.AppId;
}
base.OmitRepeatedMessageFunc = requestMessage =>
{
var textRequestMessage = requestMessage as RequestMessageText;
if (textRequestMessage != null && textRequestMessage.Content == "容错")
{
return false;
}
return true;
};
}
public override IResponseMessageBase DefaultResponseMessage(IRequestMessageBase requestMessage)
{
var responseMessage = this.CreateResponseMessage<ResponseMessageText>();
responseMessage.Content = "这条消息来自DefaultResponseMessage。";
return responseMessage;
}
public override IResponseMessageBase OnEvent_SubscribeRequest(RequestMessageEvent_Subscribe requestMessage)
{
.....
}
}
CustomMessageContext.cs
public class CustomMessageContext : DefaultMpMessageContext
{
public CustomMessageContext()
{
base.MessageContextRemoved += CustomMessageContext_MessageContextRemoved;
}
void CustomMessageContext_MessageContextRemoved(object sender, Senparc.NeuChar.Context.WeixinContextRemovedEventArgs<IRequestMessageBase, IResponseMessageBase> e)
{
var messageContext = e.MessageContext as CustomMessageContext;
if (messageContext == null)
{
return;
}
}
}