You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

132 lines
5.0 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/*----------------------------------------------------------------
Copyright (C) 2023 Senparc
文件名CustomMessageHandler_Events.cs
文件功能描述自定义MessageHandler
创建标识Senparc - 20150312
----------------------------------------------------------------*/
//DPBMARK_FILE MP
using Senparc.CO2NET.Extensions;
using Senparc.NeuChar.Entities;
using Senparc.Weixin.Exceptions;
using Senparc.Weixin.MP.AdvancedAPIs;
using Senparc.Weixin.MP.Entities;
using Senparc.Weixin.Sample.CommonService.Download;
using System;
using System.Linq;
using System.Threading.Tasks;
#if NET462
using System.Web;
#endif
namespace Senparc.Weixin.Sample.CommonService.CustomMessageHandler
{
/// <summary>
/// 自定义MessageHandler
/// </summary>
public partial class CustomMessageHandler
{
public override Task<IResponseMessageBase> OnEvent_ClickRequestAsync(RequestMessageEvent_Click requestMessage)
{
return Task.Factory.StartNew<IResponseMessageBase>(() =>
{
var syncResponseMessage = OnEvent_ClickRequest(requestMessage);//这里为了保持Demo的连贯性结果先从同步方法获取实际使用过程中可以在 OnEvent_ClickRequestAsync 中全部直接定义异步方法
//常识获取Click事件的同步方法
if (syncResponseMessage is ResponseMessageText)
{
var textResponseMessage = syncResponseMessage as ResponseMessageText;
textResponseMessage.Content += "\r\n\r\n -- 来自【异步MessageHandler】的回复";
}
return syncResponseMessage;
});
}
/// <summary>
/// 【异步方法】事件之发送模板消息返回结果
/// </summary>
/// <param name="requestMessage"></param>
/// <returns></returns>
public override async Task<IResponseMessageBase> OnEvent_TemplateSendJobFinishRequestAsync(RequestMessageEvent_TemplateSendJobFinish requestMessage)
{
switch (requestMessage.Status)
{
case "success":
//发送成功
break;
case "failed:user block":
//送达由于用户拒收(用户设置拒绝接收公众号消息)而失败
break;
case "failed: system failed":
//送达由于其他原因失败
break;
default:
throw new WeixinException("未知模板消息状态:" + requestMessage.Status);
}
//注意:此方法内不能再发送模板消息,否则会造成无限循环!
try
{
var msg = @"已向您发送模板消息
状态:{0}
MsgId{1}
这是一条来自MessageHandler的异步客服消息".FormatWith(requestMessage.Status, requestMessage.MsgID);
await CustomApi.SendTextAsync(appId, OpenId, msg);//发送客服消息
}
catch (Exception e)
{
Senparc.Weixin.WeixinTrace.SendCustomLog("模板消息发送失败", e.ToString());
}
//无需回复文字内容
//return requestMessage
// .CreateResponseMessage<ResponseMessageNoResponse>();
return null;
}
public override async Task<IResponseMessageBase> OnEvent_SubscribeRequestAsync(RequestMessageEvent_Subscribe requestMessage)
{
var responseMessage = ResponseMessageBase.CreateFromRequestMessage<ResponseMessageText>(requestMessage);
responseMessage.Content = GetWelcomeInfo();
if (!string.IsNullOrEmpty(requestMessage.EventKey))
{
responseMessage.Content += "\r\n============\r\n场景值" + requestMessage.EventKey;
}
//推送消息
//下载文档
if (requestMessage.EventKey.StartsWith("qrscene_"))
{
var sceneId = long.Parse(requestMessage.EventKey.Replace("qrscene_", ""));
//var configHelper = new ConfigHelper(new HttpContextWrapper(HttpContext.Current));
var codeRecord =
ConfigHelper.CodeCollection.Values.FirstOrDefault(z => z.QrCodeTicket != null && z.QrCodeId == sceneId);
if (codeRecord != null)
{
if (codeRecord.AllowDownload)
{
await CustomApi.SendTextAsync(null, OpenId, "下载已经开始,如需下载其他版本,请刷新页面后重新扫一扫。");
}
else
{
//确认可以下载
codeRecord.AllowDownload = true;
await CustomApi.SendTextAsync(null, OpenId, GetDownloadInfo(codeRecord));
}
}
}
return responseMessage;
}
}
}