Files
coreshoppro/CoreCms.Net.RedisMQ/Subscribe/SendWxTemplateMessageSubscribe.cs
JianWeie ad1ce9044e # 2022-03-29
### 1.4.1开源社区版:
【修复】修复售后库存处理异常,未进行商品序列判断,导致迭加到其他序列累加,导致负库存的问题。#I4YYZQ
【修复】修复确认收货记录日志中productId传值错误的问题。
【修复】修复自动收货业务极端情况下,未主动retrun返回错误的问题。#I4XB3N
【调整】因微信自动获取地址功能,无法与后台区域areaId主动挂钩,故取消此功能。#I4WS4M
【修复】修复极端情况下,设置商品标题长度超过127位,导致发起支付,推送到微信获取订单数据失败的问题。#I4Z74W
### 0.3.2 专业版:
【修复】修复申请成为代理后,点击“我的店铺”后提示“店铺信息丢失”的问题。#I4Z9SV
【修复】修复售后库存处理异常,未进行商品序列判断,导致迭加到其他序列累加,导致负库存的问题。#I4YYZQ
【修复】修复确认收货记录日志中productId传值错误的问题。
【修复】修复自动收货业务极端情况下,未主动retrun返回错误的问题。#I4XB3N
【修复】修复极端情况下,设置商品标题长度超过127位,导致发起支付,推送到微信获取订单数据失败的问题。#I4Z74W
【优化】因不同小程序所申请的类目不同,会导致订阅消息模板获取的不同,小程序消息设置为支持灵活字段配置。不限制全部填写。#I4Y28U
【优化】因uview2.0.29版本斑斓图效果内组件与视频兼容性问题,暂时屏蔽视频功能。待uview作者修复bug后同步。
2022-03-29 02:15:12 +08:00

328 lines
18 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 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.Subscribe
{
/// <summary>
/// 微信模板消息【小程序,公众号都走这里】
/// </summary>
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;
}
/// <summary>
/// 微信模板消息【小程序,公众号都走这里】
/// </summary>
/// <param name="msg"></param>
/// <returns></returns>
[Subscribe(RedisMessageQueueKey.SendWxTemplateMessage)]
private async Task SendWxTemplateMessage(string msg)
{
try
{
var request = JsonConvert.DeserializeObject<SendWxTemplateMessage>(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<string, CgibinMessageSubscribeSendRequest.Types.DataItem>();
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 = parameters["createTime"].ToString() };
}
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 = parameters["paymentTime"].ToString() };
}
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 = parameters["createTime"].ToString() };
}
}
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或者
/// <summary>
/// 判断是否需要通知用户返回 null或者 模板数据
/// </summary>
/// <param name="userId"></param>
/// <param name="code"></param>
/// <returns></returns>
private async Task<CoreCmsUserWeChatMsgTemplate> 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
/// <summary>
/// 异步发送微信模板消息
/// </summary>
/// <param name="openId">openId</param>
/// <param name="templateId">模板编号</param>
/// <param name="tmpData">发送数据</param>
/// <param name="pageUrl">路径pages/index/index</param>
/// <returns></returns>
private async Task<WebApiCallBack> Send(string openId, string templateId, Dictionary<string, CgibinMessageSubscribeSendRequest.Types.DataItem> 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 = "消息已发送,请注意查收";
}
else
{
jm.status = false;
jm.msg = response.ErrorMessage;
}
return jm;
}
#endregion
}
}