MeiRiYiCheng_1_old/YBDevice.WX/DBServices/EventService.cs

149 lines
6.7 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using Senparc.Weixin;
using Senparc.Weixin.Entities.TemplateMessage;
using Senparc.Weixin.Exceptions;
using Senparc.Weixin.MP.AdvancedAPIs.TemplateMessage;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace YBDevice.WX.DBServices
{
/// <summary>
/// 全局微信事件有关的处理程序
/// </summary>
public class EventService
{
/// <summary>
/// 异常消息处理
/// </summary>
/// <param name="ex"></param>
/// <returns></returns>
public Task ConfigOnWeixinExceptionFunc(WeixinException ex)
{
Senparc.CO2NET.Trace.SenparcTrace.SendCustomLog("进入 ConfigOnWeixinExceptionFunc() 方法", ex.Message);
try
{
var appId = Config.SenparcWeixinSetting.WeixinAppId;
string openId = "oyXoU0r5wvkdVk0O82XdpzJ1lZcU";//收到通知的管理员OpenId
var host = "A1 / AccessTokenOrAppId" + (ex.AccessTokenOrAppId ?? "null");
string service = null;
string message = ex.Message;
var status = ex.GetType().Name;
//var remark = "\r\n这是一条通过OnWeixinExceptionFunc事件发送的异步模板消息";
//string url = "https://github.com/JeffreySu/WeiXinMPSDK/blob/master/Samples/netcore3.0-mvc/Senparc.Weixin.Sample.NetCore3/Startup.cs#L410";//需要点击打开的URL
var sendTemplateMessage = true;
if (ex is ErrorJsonResultException)
{
var jsonEx = (ErrorJsonResultException)ex;
service = $"{jsonEx.JsonResult?.errcode}:{jsonEx.JsonResult?.errmsg} - {jsonEx.Url?.Replace("https://api.weixin.qq.com/cgi-bin", "ApiUrl")}".Substring(0, 30);
message = jsonEx.Message;
//需要忽略的类型
var ignoreErrorCodes = new[]
{
ReturnCode.access_token时AppSecret错误或者access_token无效,
ReturnCode.access_token超时,
ReturnCode.template_id不正确,
ReturnCode.access_token参数,
ReturnCode.,
ReturnCode.api功能未授权,
ReturnCode.api,
ReturnCode.invalid_parameter,
ReturnCode.,
ReturnCode.,//43004
ReturnCode.,//43004 - out of response count limit一般只允许连续接收20条客服消息
//其他更多可能的情况
};
if (ignoreErrorCodes.Contains(jsonEx.JsonResult.errcode))
{
sendTemplateMessage = false;//防止无限递归,这种请求下不发送消息
}
//TODO:防止更多的接口自身错误导致的无限递归。
//记录异常
Senparc.CO2NET.Trace.SenparcTrace.SendCustomLog("发生异常", ex.Message + "\r\n" + ex.StackTrace);
}
else
{
if (ex.Message.StartsWith("openid:"))
{
openId = ex.Message.Split(':')[1];//发送给指定OpenId
}
service = "WeixinException";
message = ex.Message;
}
if (sendTemplateMessage) // DPBMARK MP
{
//int sleepSeconds = 3;
//Thread.Sleep(sleepSeconds * 1000);
//string templateid = Configs.GetString("WXErrorTemplateId");
//var data = new WeixinTemplate_ExceptionAlert(string.Format("微信发生异常(延时{0}秒)", sleepSeconds), host, service, status, message, remark, templateid);
//修改OpenId、启用以下代码后即可收到模板消息
//if (!string.IsNullOrEmpty(openId))
//{
// var result = Senparc.Weixin.MP.AdvancedAPIs.TemplateApi.SendTemplateMessageAsync(appId, openId, data.TemplateId,
// url, data);
// Task.WaitAll(new[] { result });
// if (result.IsFaulted)
// {
// Senparc.Weixin.WeixinTrace.SendCustomLog("OnWeixinExceptionFunc过程模板消息发送异常", result.Exception?.Message + "\r\n" + result.Exception?.StackTrace);
// }
//}
} // DPBMARK_END
}
catch (Exception e)
{
Senparc.CO2NET.Trace.SenparcTrace.SendCustomLog("OnWeixinExceptionFunc过程错误", e.Message);
}
return Task.CompletedTask;
}
public class WeixinTemplate_ExceptionAlert : TemplateMessageBase
{
public TemplateDataItem first { get; set; }
/// <summary>
/// Time
/// </summary>
public TemplateDataItem keyword1 { get; set; }
/// <summary>
/// Host
/// </summary>
public TemplateDataItem keyword2 { get; set; }
/// <summary>
/// Service
/// </summary>
public TemplateDataItem keyword3 { get; set; }
/// <summary>
/// Status
/// </summary>
public TemplateDataItem keyword4 { get; set; }
/// <summary>
/// Message
/// </summary>
public TemplateDataItem keyword5 { get; set; }
public TemplateDataItem remark { get; set; }
public WeixinTemplate_ExceptionAlert(string _first, string host, string service, string status, string message,
string _remark, string url = null, string templateId = "uMPpGnkDq9DcV4FYISg-MSAkcFIUxtrGo9zLu5w3pcM")
: base(templateId, url, "系统异常告警通知")
{
first = new TemplateDataItem(_first);
keyword1 = new TemplateDataItem(host);
keyword2 = new TemplateDataItem(service);
keyword3 = new TemplateDataItem(message);
keyword4 = new TemplateDataItem(SystemTime.Now.LocalDateTime.ToString());
keyword5 = new TemplateDataItem(status);
remark = new TemplateDataItem(_remark);
}
}
}
}