using System; using System.Collections.Generic; using System.Threading.Tasks; using CoreCms.Net.Caching.AccressToken; using CoreCms.Net.Configuration; using CoreCms.Net.IServices; using CoreCms.Net.Loging; using CoreCms.Net.Model.Entities; using CoreCms.Net.Model.ViewModels.UI; using CoreCms.Net.WeChat.Service.Enums; using CoreCms.Net.WeChat.Service.HttpClients; using CoreCms.Net.WeChat.Service.Models; using InitQ.Abstractions; using InitQ.Attributes; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using SKIT.FlurlHttpClient.Wechat.Api; using SKIT.FlurlHttpClient.Wechat.Api.Models; namespace CoreCms.Net.RedisMQ { /// /// 微信模板消息【小程序,公众号都走这里】 /// public class SendWxTemplateMessageSubscribe : IRedisSubscribe { private readonly ICoreCmsUserWeChatInfoServices _userWeChatInfoServices; private readonly ICoreCmsUserWeChatMsgSubscriptionServices _userWeChatMsgSubscriptionServices; private readonly ICoreCmsUserWeChatMsgTemplateServices _userWeChatMsgTemplateServices; private readonly IWeChatApiHttpClientFactory _weChatApiHttpClientFactory; public SendWxTemplateMessageSubscribe(ICoreCmsUserWeChatInfoServices userWeChatInfoServices, ICoreCmsUserWeChatMsgSubscriptionServices userWeChatMsgSubscriptionServices, ICoreCmsUserWeChatMsgTemplateServices userWeChatMsgTemplateServices, IWeChatApiHttpClientFactory weChatApiHttpClientFactory) { _userWeChatInfoServices = userWeChatInfoServices; _userWeChatMsgSubscriptionServices = userWeChatMsgSubscriptionServices; _userWeChatMsgTemplateServices = userWeChatMsgTemplateServices; _weChatApiHttpClientFactory = weChatApiHttpClientFactory; } /// /// 微信模板消息【小程序,公众号都走这里】 /// /// /// [Subscribe(RedisMessageQueueKey.SendWxTemplateMessage)] private async Task SendWxTemplateMessage(string msg) { try { var request = JsonConvert.DeserializeObject(msg); if (request != null) { if (!request.parameters.ContainsKey("parameters")) { NLogUtil.WriteAll(NLog.LogLevel.Error, LogType.RedisMessageQueue, "微信模板消息", "参数获取失败"); return; } var parameters = (JObject)request.parameters["parameters"]; if (parameters == null) { NLogUtil.WriteAll(NLog.LogLevel.Error, LogType.RedisMessageQueue, "微信模板消息", "参数实例化失败"); return; } else if (string.IsNullOrEmpty(request.code)) { NLogUtil.WriteAll(NLog.LogLevel.Error, LogType.RedisMessageQueue, "微信模板消息", "消息类型获取失败"); return; } if (request.code == GlobalEnumVars.PlatformMessageTypes.SellerOrderNotice.ToString()) { NLogUtil.WriteAll(NLog.LogLevel.Error, LogType.RedisMessageQueue, "微信模板消息", "商家不通知"); return; } if (request.userId == 0 || string.IsNullOrEmpty(request.code)) { NLogUtil.WriteAll(NLog.LogLevel.Error, LogType.RedisMessageQueue, "微信模板消息", "用户编码获取失败"); return; } var templateData = await GetUserIsTip(request.userId, request.code); if (templateData == null) { NLogUtil.WriteAll(NLog.LogLevel.Error, LogType.RedisMessageQueue, "微信模板消息", "未查询到订阅编码"); return; } var weChatUserInfo = await _userWeChatInfoServices.QueryByClauseAsync(p => p.userId == request.userId); if (weChatUserInfo == null) { NLogUtil.WriteAll(NLog.LogLevel.Error, LogType.RedisMessageQueue, "微信模板消息", "微信用户数据查询失败"); return; } var templateMessageData = new Dictionary(); var pageUrl = string.Empty; if (request.code == GlobalEnumVars.PlatformMessageTypes.CreateOrder.ToString()) { if (!string.IsNullOrEmpty(parameters["orderId"]!.ToString())) { templateMessageData[templateData.data01] = new CgibinMessageSubscribeSendRequest.Types.DataItem() { Value = parameters["orderId"].ToString() }; } if (!string.IsNullOrEmpty(parameters["orderAmount"]!.ToString())) { templateMessageData[templateData.data02] = new CgibinMessageSubscribeSendRequest.Types.DataItem() { Value = parameters["orderAmount"].ToString() }; } if (!string.IsNullOrEmpty(parameters["shipName"]!.ToString())) { templateMessageData[templateData.data03] = new CgibinMessageSubscribeSendRequest.Types.DataItem() { Value = parameters["shipName"].ToString() }; } if (!string.IsNullOrEmpty(parameters["shipMobile"]!.ToString())) { templateMessageData[templateData.data04] = new CgibinMessageSubscribeSendRequest.Types.DataItem() { Value = parameters["shipMobile"].ToString() }; } if (!string.IsNullOrEmpty(parameters["orderAmount"]!.ToString())) { templateMessageData[templateData.data05] = new CgibinMessageSubscribeSendRequest.Types.DataItem() { Value = parameters["orderAmount"].ToString() }; } pageUrl = "/pages/member/order/detail/detail?orderId=" + parameters["orderId"]; } else if (request.code == GlobalEnumVars.PlatformMessageTypes.RemindOrderPay.ToString()) { if (!string.IsNullOrEmpty(parameters["orderId"]!.ToString())) { templateMessageData[templateData.data01] = new CgibinMessageSubscribeSendRequest.Types.DataItem() { Value = parameters["orderId"].ToString() }; } if (!string.IsNullOrEmpty(parameters["orderAmount"]!.ToString())) { templateMessageData[templateData.data02] = new CgibinMessageSubscribeSendRequest.Types.DataItem() { Value = parameters["orderAmount"].ToString() }; } if (!string.IsNullOrEmpty(parameters["createTime"]!.ToString())) { templateMessageData[templateData.data03] = new CgibinMessageSubscribeSendRequest.Types.DataItem() { Value = Convert.ToDateTime(parameters["createTime"].ToString()).ToString("yyyy年MM月dd日 HH:mm") }; } templateMessageData[templateData.data04] = new CgibinMessageSubscribeSendRequest.Types.DataItem() { Value = "订单即将失效,请及时付款!" }; pageUrl = "/pages/member/order/detail/detail?orderId=" + parameters["orderId"]; } else if (request.code == GlobalEnumVars.PlatformMessageTypes.OrderPayed.ToString()) { if (!string.IsNullOrEmpty(parameters["orderId"]!.ToString())) { templateMessageData[templateData.data01] = new CgibinMessageSubscribeSendRequest.Types.DataItem() { Value = parameters["orderId"].ToString() }; } if (!string.IsNullOrEmpty(parameters["orderAmount"]!.ToString())) { templateMessageData[templateData.data02] = new CgibinMessageSubscribeSendRequest.Types.DataItem() { Value = parameters["orderAmount"].ToString() }; } if (!string.IsNullOrEmpty(parameters["paymentTime"]!.ToString())) { templateMessageData[templateData.data03] = new CgibinMessageSubscribeSendRequest.Types.DataItem() { Value = Convert.ToDateTime(parameters["paymentTime"].ToString()).ToString("yyyy年MM月dd日 HH:mm") }; } pageUrl = "/pages/member/order/detail/detail?orderId=" + parameters["orderId"]; } else if (request.code == GlobalEnumVars.PlatformMessageTypes.DeliveryNotice.ToString()) { if (!string.IsNullOrEmpty(parameters["orderId"]!.ToString())) { templateMessageData[templateData.data01] = new CgibinMessageSubscribeSendRequest.Types.DataItem() { Value = parameters["orderId"].ToString() }; } if (!string.IsNullOrEmpty(parameters["logiName"]!.ToString())) { templateMessageData[templateData.data02] = new CgibinMessageSubscribeSendRequest.Types.DataItem() { Value = parameters["logiName"].ToString() }; } if (!string.IsNullOrEmpty(parameters["logiNo"]!.ToString())) { templateMessageData[templateData.data03] = new CgibinMessageSubscribeSendRequest.Types.DataItem() { Value = parameters["logiNo"].ToString() }; } pageUrl = "/pages/member/order/detail/detail?orderId=" + parameters["orderId"]; } else if (request.code == GlobalEnumVars.PlatformMessageTypes.AfterSalesPass.ToString()) { if (!string.IsNullOrEmpty(parameters["orderId"]!.ToString())) { templateMessageData[templateData.data01] = new CgibinMessageSubscribeSendRequest.Types.DataItem() { Value = parameters["orderId"].ToString() }; } if (!string.IsNullOrEmpty(parameters["orderAmount"]!.ToString())) { templateMessageData[templateData.data02] = new CgibinMessageSubscribeSendRequest.Types.DataItem() { Value = parameters["orderAmount"].ToString() }; } if (!string.IsNullOrEmpty(parameters["aftersalesId"]!.ToString())) { templateMessageData[templateData.data03] = new CgibinMessageSubscribeSendRequest.Types.DataItem() { Value = parameters["aftersalesId"].ToString() }; } if (!string.IsNullOrEmpty(parameters["aftersalesStatus"]!.ToString())) { templateMessageData[templateData.data04] = new CgibinMessageSubscribeSendRequest.Types.DataItem() { Value = parameters["aftersalesStatus"].ToString() }; } pageUrl = "/pages/member/order/detail/detail?orderId=" + parameters["orderId"]; } else if (request.code == GlobalEnumVars.PlatformMessageTypes.RefundSuccess.ToString()) { if (!string.IsNullOrEmpty(parameters["sourceId"]!.ToString())) { templateMessageData[templateData.data01] = new CgibinMessageSubscribeSendRequest.Types.DataItem() { Value = parameters["sourceId"].ToString() }; } if (!string.IsNullOrEmpty(parameters["aftersalesId"]!.ToString())) { templateMessageData[templateData.data02] = new CgibinMessageSubscribeSendRequest.Types.DataItem() { Value = parameters["aftersalesId"].ToString() }; } if (!string.IsNullOrEmpty(parameters["money"]!.ToString())) { templateMessageData[templateData.data03] = new CgibinMessageSubscribeSendRequest.Types.DataItem() { Value = parameters["money"].ToString() }; } if (!string.IsNullOrEmpty(parameters["paymentCode"]!.ToString())) { templateMessageData[templateData.data04] = new CgibinMessageSubscribeSendRequest.Types.DataItem() { Value = parameters["paymentCode"].ToString() }; } if (!string.IsNullOrEmpty(parameters["createTime"]!.ToString())) { templateMessageData[templateData.data05] = new CgibinMessageSubscribeSendRequest.Types.DataItem() { Value = Convert.ToDateTime(parameters["createTime"].ToString()).ToString("yyyy年MM月dd日 HH:mm") }; } } var result = await Send(weChatUserInfo.openid, templateData.templateId, templateMessageData, pageUrl); NLogUtil.WriteAll(NLog.LogLevel.Info, LogType.RedisMessageQueue, "微信模板消息", JsonConvert.SerializeObject(result)); } else { NLogUtil.WriteAll(NLog.LogLevel.Error, LogType.RedisMessageQueue, "微信模板消息", "模板消息推送数据为空"); } } catch (Exception ex) { NLogUtil.WriteAll(NLog.LogLevel.Error, LogType.RedisMessageQueue, "微信模板消息", msg, ex); throw; } await Task.CompletedTask; } #region 判断是否需要通知用户返回 null或者 模板数据 /// /// 判断是否需要通知用户返回 null或者 模板数据 /// /// /// /// private async Task GetUserIsTip(int userId, string code) { string newCode; if (code == GlobalEnumVars.PlatformMessageTypes.CreateOrder.ToString()) { newCode = GlobalEnumVars.WeChatMsgTemplateType.order.ToString(); } else if (code == GlobalEnumVars.PlatformMessageTypes.RemindOrderPay.ToString()) { newCode = GlobalEnumVars.WeChatMsgTemplateType.cancel.ToString(); } else if (code == GlobalEnumVars.PlatformMessageTypes.OrderPayed.ToString()) { newCode = GlobalEnumVars.WeChatMsgTemplateType.pay.ToString(); } else if (code == GlobalEnumVars.PlatformMessageTypes.DeliveryNotice.ToString()) { newCode = GlobalEnumVars.WeChatMsgTemplateType.ship.ToString(); } else if (code == GlobalEnumVars.PlatformMessageTypes.AfterSalesPass.ToString()) { newCode = GlobalEnumVars.WeChatMsgTemplateType.aftersale.ToString(); } else if (code == GlobalEnumVars.PlatformMessageTypes.RefundSuccess.ToString()) { newCode = GlobalEnumVars.WeChatMsgTemplateType.refund.ToString(); } else { return null; } var info = await _userWeChatMsgSubscriptionServices.QueryByClauseAsync(p => p.userId == userId && p.type == newCode); if (info != null) { return await _userWeChatMsgTemplateServices.QueryByClauseAsync(p => p.templateId == info.templateId); } return await _userWeChatMsgTemplateServices.QueryByClauseAsync(p => p.templateTitle == newCode); //return null; } #endregion #region 异步发送微信模板消息 /// /// 异步发送微信模板消息 /// /// openId /// 模板编号 /// 发送数据 /// 路径(如:pages/index/index) /// private async Task Send(string openId, string templateId, Dictionary tmpData, string pageUrl) { var jm = new WebApiCallBack(); var accessToken = WeChatCacheAccessTokenHelper.GetWxOpenAccessToken(); var client = _weChatApiHttpClientFactory.CreateWxOpenClient(); var request = new CgibinMessageSubscribeSendRequest(); request.AccessToken = accessToken; request.MiniProgramPagePath = pageUrl; request.TemplateId = templateId; request.ToUserOpenId = openId; request.Data = tmpData; request.MiniProgramState = "formal"; var response = await client.ExecuteCgibinMessageSubscribeSendAsync(request); if (response.IsSuccessful()) { jm.status = true; jm.msg = "消息已发送,请注意查收"; jm.otherData = new { openId, templateId, tmpData, pageUrl }; } else { jm.status = false; jm.msg = response.ErrorMessage; jm.otherData = new { openId, templateId, tmpData, pageUrl }; } return jm; } #endregion } }