using Microsoft.Extensions.DependencyInjection;
using Senparc.NeuChar.App.AppStore;
using Senparc.NeuChar.Entities;
using Senparc.NeuChar.Helpers;
using Senparc.Weixin;
using Senparc.Weixin.MP.Entities;
using Senparc.Weixin.MP.Entities.Request;
using Senparc.Weixin.MP.MessageHandlers;
using System;
using System.Collections.Generic;
using System.IO;
using System.Threading.Tasks;
using YBDevice.Core;
using YBDevice.WXApplication.DeviceInfo;
namespace YBDevice.WX.MessageHandlers.CustomMessageHandler
{
///
/// 自定义MessageHandler,把MessageHandler作为基类,重写对应请求的处理方法
///
public partial class CustomMessageHandler : MessageHandler
{
private string appId =Senparc.Weixin.Config.SenparcWeixinSetting.WeixinAppId;
///
/// 为中间件提供生成当前类的委托
///
public static Func GenerateMessageHandler = (stream, postModel, maxRecordCount, serviceProvider)
=> new CustomMessageHandler(stream, postModel, maxRecordCount, false /* 是否只允许处理加密消息,以提高安全性 */,
serviceProvider:serviceProvider
);
public CustomMessageHandler(Stream inputStream, PostModel postModel, int maxRecordCount = 0, bool onlyAllowEncryptMessage = false, IServiceProvider serviceProvider = null)
: base(inputStream, postModel, maxRecordCount, onlyAllowEncryptMessage, serviceProvider: serviceProvider)
{
//这里设置仅用于测试,实际开发可以在外部更全局的地方设置,
//比如MessageHandler.GlobalGlobalMessageContext.ExpireMinutes = 3。
GlobalMessageContext.ExpireMinutes = 3;
OnlyAllowEncryptMessage = true;//是否只允许接收加密消息,默认为 false
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 async Task OnTextRequestAsync(RequestMessageText requestMessage)
{
if(requestMessage.Content.Length == 4)
{
var deviceService = base.ServiceProvider.GetService();
var returndata =await deviceService.HandlerTextAsync(requestMessage.ToUserName, requestMessage.FromUserName, requestMessage.Content);
if (!string.IsNullOrEmpty(returndata.wxfansid))
{
List arts = new List();
//固定贴纸
if(returndata.type == 2)
{
Guid rid = Guid.Parse(returndata.resultid);
arts = deviceService.GetStickyWXMessageNews(RequestMessage.ToUserName, requestMessage.FromUserName, returndata.wxfansid, 4, rid);
}
else
{
arts = deviceService.GetWXMessageNews(RequestMessage.ToUserName, requestMessage.FromUserName, returndata.wxfansid, 4, returndata.resultid);
}
var requestMessagenews = base.CreateResponseMessage();
requestMessagenews.Articles.AddRange(arts);
return requestMessagenews;
}
}
if (requestMessage.Content == "内部测试api")
{
var responseMessage = CreateResponseMessage();
responseMessage.Content = requestMessage.Content;
return await Task.FromResult(responseMessage);
}
return await base.OnTextRequestAsync(requestMessage);
}
///
/// 默认消息处理
///
///
///
public override IResponseMessageBase DefaultResponseMessage(IRequestMessageBase requestMessage)
{
return new SuccessResponseMessage();
}
///
/// 未知消息处理
///
///
///
public override async Task OnUnknownTypeRequestAsync(RequestMessageUnknownType requestMessage)
{
/*
* 此方法用于应急处理SDK没有提供的消息类型,
* 原始XML可以通过requestMessage.RequestDocument(或this.RequestDocument)获取到。
* 如果不重写此方法,遇到未知的请求类型将会抛出异常(v14.8.3 之前的版本就是这么做的)
*/
var loggerService = base.ServiceProvider.GetService ();
return await Task.Factory.StartNew(() =>
{
var msgType = MsgTypeHelper.GetRequestMsgTypeString(requestMessage.RequestDocument);
var responseMessage = this.CreateResponseMessage();
responseMessage.Content = "未知消息类型:" + msgType;
loggerService.AddLogger($"未知请求消息类型:{requestMessage.RequestDocument.ToString()}",3);
return responseMessage;
});
}
}
}