Parcourir la Source

自动回复调整,模板消息测试

yuqian il y a 7 ans
Parent
commit
5241fce0f2

+ 2 - 0
.gitignore

@@ -17,3 +17,5 @@ ServiceWechat/ServiceWechat.Utility/obj/ServiceWechat.Utility.csproj.nuget.g.tar
17 17
 /ServiceWechat/.vs/ServiceWechat/v15
18 18
 /ServiceWechat/ServiceWechat.Utility/obj/Release/netcoreapp2.0
19 19
 /ServiceWechat/ServiceWechat.Utility/bin/Release/netcoreapp2.0
20
+/ServiceWechat/ServiceWechat.Utility/obj/Release
21
+/ServiceWechat/ServiceWechat.Utility/bin/Release

+ 276 - 0
ServiceWechat/ServiceWechat.Utility/XmlHelper.cs

@@ -0,0 +1,276 @@
1
+using System.Xml;
2
+
3
+namespace ServiceWechat.Utility
4
+{
5
+    /// <summary>
6
+    /// C#XML文件操作类 包含常用XML操作信息
7
+    /// by CrazyCoder.Cn
8
+    /// 转载请注明出处
9
+    /// </summary>
10
+    public class XmlHelper
11
+    {
12
+        protected XmlDocument xdoc = new XmlDocument();
13
+        public XmlElement root;
14
+
15
+        #region LoadXml
16
+        /// <summary>
17
+        /// 加载Xml文档
18
+        /// </summary>
19
+        /// <param name="xml"></param>
20
+        public void LoadXml(string xml)
21
+        {
22
+            xdoc.Load(xml);
23
+
24
+        }
25
+
26
+        /// <summary>
27
+        /// 获取XML文件内容
28
+        /// </summary>
29
+        /// <param name="xml"></param>
30
+        public string InnerXml(string xml)
31
+        {
32
+            xdoc.Load(xml);
33
+            return xdoc.InnerXml;
34
+        }
35
+        /// <summary>
36
+        /// 获取XML文件内容
37
+        /// </summary>
38
+        /// <param name="xml"></param>
39
+        public void LoadFromXmlString(string xml)
40
+        {
41
+            xdoc.LoadXml(xml);
42
+        }
43
+        #endregion
44
+
45
+        #region 创建一个节点,并在该节点下加入子节点
46
+
47
+        /// <summary>
48
+        /// 创建一个节点,并在该节点下加入子节点
49
+        /// </summary>
50
+        /// <param name="RootNode"></param>
51
+        /// <param name="ElementName"></param>
52
+        /// <param name="ChildName"></param>
53
+        /// <param name="ChildValue"></param>
54
+        /// <returns></returns>
55
+        public void CreateElement(string RootNode, string ElementName, string[] ChildName, string[] ChildValue)
56
+        {
57
+            XmlNode Root = xdoc.SelectSingleNode(RootNode);
58
+            XmlElement Node = xdoc.CreateElement(ElementName);
59
+            if (ChildName.Length == ChildValue.Length)
60
+            {
61
+                for (int i = 0; i < ChildName.Length; i++)
62
+                {
63
+                    XmlElement ChildNode = xdoc.CreateElement(ChildName[i]);
64
+                    ChildNode.InnerText = ChildValue[i];
65
+                    Node.AppendChild(ChildNode);
66
+                }
67
+            }
68
+            if (Root != null) Root.AppendChild(Node);
69
+        }
70
+        #endregion
71
+
72
+        #region 删除某一节点
73
+
74
+        /// <summary>
75
+        /// 创建一个节点,并在该节点下加入子节点
76
+        /// </summary>
77
+        /// <param name="RootNode"></param>
78
+        /// <param name="ChildName"></param>
79
+        /// <param name="ChildValue"></param>
80
+        /// <returns></returns>
81
+        public void DeleteElement(string RootNode, string ChildName, string ChildValue)
82
+        {
83
+            XmlNode Root = xdoc.SelectSingleNode(RootNode);
84
+            if (Root != null)
85
+            {
86
+                XmlNodeList Node = Root.ChildNodes;
87
+                foreach (XmlNode xn in Node)
88
+                {
89
+                    var selectSingleNode = xn.SelectSingleNode(ChildName);
90
+                    if (selectSingleNode != null && selectSingleNode.InnerText == ChildValue)
91
+                    {
92
+                        Root.RemoveChild(xn);
93
+                    }
94
+                }
95
+            }
96
+        }
97
+        #endregion
98
+
99
+        #region 编辑某一节点
100
+
101
+        /// <summary>
102
+        /// 创建一个节点,并在该节点下加入子节点
103
+        /// </summary>
104
+        /// <returns></returns>
105
+        public void UpdateElement(string RootNode, string ElementName, string ElementValue, string[] ChildName, string[] ChildValue)
106
+        {
107
+            XmlNode Root = xdoc.SelectSingleNode(RootNode);
108
+            if (Root != null)
109
+            {
110
+                XmlNodeList Node = Root.ChildNodes;
111
+                foreach (XmlNode xn in Node)
112
+                {
113
+                    var selectSingleNode = xn.SelectSingleNode(ElementName);
114
+                    if (selectSingleNode != null && selectSingleNode.InnerText == ElementValue)
115
+                    {
116
+                        if (ChildName.Length == ChildValue.Length)
117
+                        {
118
+                            for (int i = 0; i < ChildName.Length; i++)
119
+                            {
120
+                                var singleNode = xn.SelectSingleNode(ChildName[i]);
121
+                                if (singleNode != null)
122
+                                    singleNode.InnerText = ChildValue[i];
123
+                            }
124
+                        }
125
+                        break;
126
+                    }
127
+                }
128
+            }
129
+        }
130
+
131
+        public void UpdateElement(string RootNode, string[] ChildName, string[] ChildValue)
132
+        {
133
+            XmlNode Root = xdoc.SelectSingleNode(RootNode);
134
+            if (ChildName.Length == ChildValue.Length)
135
+            {
136
+                for (int i = 0; i < ChildName.Length; i++)
137
+                {
138
+                    if (Root != null)
139
+                    {
140
+                        var selectSingleNode = Root.SelectSingleNode(ChildName[i]);
141
+                        if (selectSingleNode != null)
142
+                            selectSingleNode.InnerText = ChildValue[i];
143
+                    }
144
+                }
145
+            }
146
+
147
+        }
148
+
149
+
150
+        public void UpdateElement(string RootNode, string NodeName, string[] ChildName, string[] ChildValue)
151
+        {
152
+            XmlNode Root = xdoc.SelectSingleNode(RootNode);
153
+            if (Root != null)
154
+            {
155
+                XmlNode Node = Root.SelectSingleNode(NodeName);
156
+                if (ChildName.Length == ChildValue.Length)
157
+                {
158
+                    for (int i = 0; i < ChildName.Length; i++)
159
+                    {
160
+                        if (Node != null)
161
+                        {
162
+                            var selectSingleNode = Node.SelectSingleNode(ChildName[i]);
163
+                            if (selectSingleNode != null)
164
+                                selectSingleNode.InnerText = ChildValue[i];
165
+                        }
166
+                    }
167
+                }
168
+            }
169
+        }
170
+
171
+        #endregion
172
+
173
+        #region 取得名称为name的结点的值
174
+        /// <summary>
175
+        /// 取得名称为name的结点的值
176
+        /// </summary>
177
+        /// <param name="name"></param>
178
+        /// <returns></returns>
179
+        public string GetValue(string name)
180
+        {
181
+            if (xdoc.DocumentElement != null)
182
+            {
183
+                XmlNode xn = FindXnByName(xdoc.DocumentElement.ChildNodes, name);
184
+                if (xn == null) return null;
185
+                return xn.InnerText;
186
+            }
187
+            return null;
188
+        }
189
+
190
+        #endregion
191
+
192
+        #region 在某节点下取名称为name的结点的值
193
+        /// <summary>
194
+        /// 在某节点下取名称为name的结点的值
195
+        /// </summary>
196
+        /// <returns></returns>
197
+        public string GetValue(string NodeName, string name)
198
+        {
199
+            string BackString = "";
200
+            if (xdoc.DocumentElement != null)
201
+            {
202
+                XmlNode xn = FindXnByName(xdoc.DocumentElement.ChildNodes, NodeName);
203
+                if (xn == null)
204
+                {
205
+                    return "";
206
+                }
207
+                XmlNode nn = FindXnByName(xn.ChildNodes, name);
208
+                if (nn == null)
209
+                {
210
+                    return "";
211
+                }
212
+                BackString = nn.InnerText;
213
+            }
214
+            return BackString;
215
+        }
216
+        #endregion
217
+
218
+        #region 通过节点名称找到指定的节点
219
+        /// <summary>
220
+        /// 通过节点名称找到指定的节点
221
+        /// </summary>
222
+        /// <param name="xnl"></param>
223
+        /// <param name="strName"></param>
224
+        /// <returns></returns>
225
+        protected XmlNode FindXnByName(XmlNodeList xnl, string strName)
226
+        {
227
+            for (int i = 0; i < xnl.Count; i++)
228
+            {
229
+                var item = xnl.Item(i);
230
+                if (item != null && item.LocalName == strName)
231
+                {
232
+                    return xnl.Item(i);
233
+                }
234
+            }
235
+            return null;
236
+        }
237
+        #endregion
238
+
239
+        #region 为一个节点指定值
240
+        /// <summary>
241
+        /// 为一个节点指定值
242
+        /// </summary>
243
+        /// <param name="strName"></param>
244
+        /// <param name="strValue"></param>
245
+        public void SetValue(string strName, string strValue)
246
+        {
247
+            if (xdoc.DocumentElement != null)
248
+            {
249
+                XmlNodeList xnl = xdoc.DocumentElement.ChildNodes;
250
+                for (int i = 0; i < xnl.Count; i++)
251
+                {
252
+                    var xmlNode = xnl.Item(i);
253
+                    if (xmlNode != null && xmlNode.LocalName == strName)
254
+                    {
255
+                        var item = xnl.Item(i);
256
+                        if (item != null) item.InnerText = strValue;
257
+                        return;
258
+                    }
259
+                }
260
+            }
261
+            return;
262
+        }
263
+        #endregion
264
+
265
+        #region 保存XML文档
266
+        /// <summary>
267
+        ///  保存XML文档
268
+        /// </summary>
269
+        public void Save(string name)
270
+        {
271
+            xdoc.Save(name);
272
+        }
273
+        #endregion
274
+    }
275
+}
276
+

+ 64 - 19
ServiceWechat/ServiceWechat/Controllers/WechatApis/HomeController.cs

@@ -5,14 +5,18 @@ using System.Threading.Tasks;
5 5
 using Microsoft.AspNetCore.Mvc;
6 6
 using Senparc.Weixin.MP;
7 7
 using Microsoft.Extensions.Configuration;
8
-using Senparc.Weixin.MP.MvcExtension;
9 8
 using Senparc.Weixin.MP.Entities.Request;
10
-using ServiceWechat.Api.MessageHandlers.CustomMessageHandler;
11 9
 using ServiceWechat.Api.Controllers.Base;
12 10
 using Microsoft.Extensions.Logging;
13 11
 using NLog;
14 12
 using System.Text;
15 13
 using System.IO;
14
+using ServiceWechat.Api.CryptCode;
15
+using ServiceWechat.Utility;
16
+using System.Xml;
17
+using System.Xml.Linq;
18
+using ServiceWechat.Api.MessageHandlers;
19
+using Senparc.Weixin.MP.MvcExtension;
16 20
 
17 21
 namespace ServiceWechat.Api.Controllers.WechatApis
18 22
 {
@@ -56,34 +60,75 @@ namespace ServiceWechat.Api.Controllers.WechatApis
56 60
         [HttpPost]
57 61
         public WeixinResult Verify(PostModel postModel)
58 62
         {
63
+            if (!CheckSignature.Check(postModel.Signature, postModel.Timestamp, postModel.Nonce, Token))
64
+            {
65
+                Logger.Info($"参数错误");
66
+                return new WeixinResult("参数错误");
67
+            }
59 68
 
60
-            CustomMessageHandler messageHandler = null;
61
-            try
69
+            postModel.Token = Token;//根据自己后台的设置保持一致
70
+            postModel.EncodingAESKey = EncodingAESKey;//根据自己后台的设置保持一致
71
+            postModel.AppId = AppId;//根据自己后台的设置保持一致
72
+
73
+            //var memoryStream = new MemoryStream();
74
+            //Request.Body.CopyTo(memoryStream);
75
+
76
+            //byte[] requestByte = new byte[memoryStream.Length];
77
+            //memoryStream.Read(requestByte, 0, (int)memoryStream.Length);
78
+            //string dataEncrypt = Encoding.UTF8.GetString(requestByte);
79
+
80
+
81
+            var maxRecordCount = 10;
82
+            var inputStream = Request.Body;
83
+            byte[] buffer = new byte[Request.ContentLength ?? 0];
84
+            inputStream.Read(buffer, 0, buffer.Length);
85
+            var requestXmlStream = new MemoryStream(buffer);
86
+            var requestXml = Encoding.UTF8.GetString(buffer);
87
+
88
+            if (inputStream.Position > 0)
89
+            {
90
+                inputStream.Position = 0;
91
+            }
92
+
93
+
94
+            //StreamReader reader = new StreamReader(inputStream, Encoding.UTF8);
95
+            string dataEncrypt = requestXml;
96
+            string dataDecrypt = "";
97
+            int ret = 0;
98
+            WXBizMsgCrypt wxcpt = new WXBizMsgCrypt(Token, EncodingAESKey, AppId);
99
+            Logger.Info($"data ={dataEncrypt}");
100
+            ret = wxcpt.DecryptMsg(postModel.Msg_Signature, postModel.Timestamp, postModel.Nonce, dataEncrypt, ref dataDecrypt);
101
+            if (ret != 0)
62 102
             {
63
-                if (!CheckSignature.Check(postModel.Signature, postModel.Timestamp, postModel.Nonce, Token))
64
-                {
65
-                    return new WeixinResult("参数错误");
66
-                }
103
+                Logger.Error($"微信消息推送解密失败,错误代码:{ret}");
104
+            }
105
+            Logger.Info($"接收用户消息调用RecieveMsg =【{  dataDecrypt }】");
106
+            //自定义MessageHandler,对微信请求的详细判断操作都在这里面。
67 107
 
68
-                postModel.Token = Token;//根据自己后台的设置保持一致
69
-                postModel.EncodingAESKey = EncodingAESKey;//根据自己后台的设置保持一致
70
-                postModel.AppId = AppId;//根据自己后台的设置保持一致
71 108
 
72
-                //StreamReader reader = new StreamReader(Request.Body, Encoding.);
73
-                //string text = reader.ReadToEnd();
74 109
 
110
+            //if (Request.Body.Position > 0)
111
+            //{
112
+            //    Request.Body.Position = 0;
113
+            //}
75 114
 
76
-                //Logger.Info($"接收用户消息调用RecieveMsg 【{  text }】");
77
-                //自定义MessageHandler,对微信请求的详细判断操作都在这里面。
78
-                messageHandler = new CustomMessageHandler(Request.Body, postModel);//接收消息
79
-                messageHandler.Execute();//执行微信处理过程
80
-                return new WeixinResult(messageHandler);//返回结果
115
+            //XDocument xml = null;
116
+            //using (XmlReader xr = XmlReader.Create(Request.Body))
117
+            //{
118
+            //    xml = XDocument.Load(xr);
119
+            //}
120
+            CustomMessageHandler messageHandler = null;
121
+            try
122
+            {
123
+                messageHandler = new CustomMessageHandler(inputStream, postModel);//接收消息
81 124
             }
82 125
             catch (Exception ex)
83 126
             {
84
-                Logger.Error(ex);
127
+                Logger.Error(ex, $"{ex.StackTrace}");
85 128
             }
129
+            messageHandler.Execute();//执行微信处理过程
86 130
             return new WeixinResult(messageHandler);//返回结果
131
+
87 132
         }
88 133
 
89 134
         public string Test()

+ 25 - 25
ServiceWechat/ServiceWechat/Controllers/WechatApis/TemplateMsgController.cs

@@ -26,33 +26,33 @@ namespace ServiceWechat.Api.Controllers.WechatApis
26 26
             EncodingAESKey = configuration["WechatStatic:EncodingAESKey"];
27 27
         }
28 28
 
29
-        ///// <summary>
30
-        ///// 发送模板消息【需要安全验证】
31
-        ///// </summary>
32
-        ///// <returns></returns>
33
-        //public JsonResult Send()
34
-        //{
35
-        //    //根据userId获取关注该公众号的微信号
29
+        /// <summary>
30
+        /// 发送模板消息【需要安全验证】
31
+        /// </summary>
32
+        /// <returns></returns>
33
+        public JsonResult Send()
34
+        {
35
+            //根据userId获取关注该公众号的微信号
36 36
 
37 37
 
38
-        //    var url = "url";
39
-        //    var first = "你好,你有一条新的任务";
40
-        //    var result = TemplateApi.SendTemplateMessage(
41
-        //    AppId,
42
-        //    "openId",
43
-        //    "TempleteMessageId",
44
-        //    url,
45
-        //       new
46
-        //       {
47
-        //           first = new { value = first, color = "#173177" },
48
-        //           keyword1 = new { value = place, color = "#173177" },
49
-        //           keyword2 = new { value = detail, color = "#173177" },
50
-        //           keyword3 = new { value = username, color = "#173177" },
51
-        //           keyword4 = new { value = phone, color = "#173177" },
52
-        //           remark = new { value = string.IsNullOrWhiteSpace(remark) ? "请尽快处理!" : remark, color = "#173177" },
53
-        //       });
54
-        //    return Success("OK");
55
-        //}
38
+            var url = "http://www.baidu.com";
39
+            var first = "你好,你有一条新的任务";
40
+            var result = TemplateApi.SendTemplateMessage(
41
+            AppId,
42
+            "oKOqcv_4HD3qeuf6aL5gaD--z4Xs",
43
+            "1xACNqCQ7t8VTpR9pz5puo2G9eMHSeZgac1SQCZWqzY",
44
+            url,
45
+               new
46
+               {
47
+                   first = new { value = first, color = "#173177" },
48
+                   keyword1 = new { value = "测试地点", color = "#173177" },
49
+                   keyword2 = new { value = "测试详细内容", color = "#173177" },
50
+                   keyword3 = new { value = "flameiris", color = "#173177" },
51
+                   keyword4 = new { value = "15537150907", color = "#173177" },
52
+                   remark = new { value = string.IsNullOrWhiteSpace("") ? "请尽快处理!" : "", color = "#173177" },
53
+               });
54
+            return Success("OK", result);
55
+        }
56 56
 
57 57
 
58 58
         /// <summary>

+ 1 - 1
ServiceWechat/ServiceWechat/MessageHandlers/CustomMessageHandler/CustomMessageContext.cs

@@ -6,7 +6,7 @@ using System.Linq;
6 6
 using System.Threading.Tasks;
7 7
 using Senparc.Weixin;
8 8
 
9
-namespace ServiceWechat.Api.MessageHandlers.CustomMessageHandler
9
+namespace ServiceWechat.Api.MessageHandlers
10 10
 {
11 11
     public class CustomMessageContext : MessageContext<IRequestMessageBase, IResponseMessageBase>
12 12
     {

+ 35 - 18
ServiceWechat/ServiceWechat/MessageHandlers/CustomMessageHandler/CustomMessageHandler.cs

@@ -9,8 +9,9 @@ using System.Collections.Generic;
9 9
 using System.IO;
10 10
 using System.Linq;
11 11
 using System.Threading.Tasks;
12
+using System.Xml.Linq;
12 13
 
13
-namespace ServiceWechat.Api.MessageHandlers.CustomMessageHandler
14
+namespace ServiceWechat.Api.MessageHandlers
14 15
 {
15 16
     public partial class CustomMessageHandler : MessageHandler<MessageContext<IRequestMessageBase, IResponseMessageBase>>
16 17
     {
@@ -22,6 +23,12 @@ namespace ServiceWechat.Api.MessageHandlers.CustomMessageHandler
22 23
             Logger.Info($"实例化CustomMessageHandler");
23 24
         }
24 25
 
26
+        public CustomMessageHandler(XDocument inputStream, PostModel postModel)
27
+          : base(inputStream, postModel)
28
+        {
29
+            Logger.Info($"实例化CustomMessageHandler");
30
+        }
31
+
25 32
         /// <summary>
26 33
         /// 默认回复
27 34
         /// </summary>
@@ -36,48 +43,58 @@ namespace ServiceWechat.Api.MessageHandlers.CustomMessageHandler
36 43
         }
37 44
 
38 45
 
46
+        public override IResponseMessageBase OnTextRequest(RequestMessageText requestMessage)
47
+        {
48
+            var responseMessage = base.CreateResponseMessage<ResponseMessageText>();
49
+            //responseMessage.Content = "您的OpenID是:" + responseMessage.FromUserName+".\r\n您发送的文字是:"+requestMessage.Content;  
50
+            if (requestMessage.Content == "ID")
51
+                responseMessage.Content = "您的OpenID是:" + responseMessage.FromUserName;
52
+            if (requestMessage.Content == "天气")
53
+                responseMessage.Content = "抱歉,还未开通此功能!";
54
+            return responseMessage;
55
+        }
56
+
39 57
 
40 58
         /// <summary>
41 59
         /// 处理用户发来的文本信息
42 60
         /// </summary>
43 61
         /// <param name="requestMessage"></param>
44 62
         /// <returns></returns>
45
-        public override IResponseMessageBase OnTextRequest(RequestMessageText requestMessage)
46
-        {
63
+        //public override IResponseMessageBase OnTextRequest(RequestMessageText requestMessage)
64
+        //{
47 65
 
48
-            ////requestMessage.FromUserName也可以直接写成base.WeixinOpenId
49
-            //var openId = base.WeixinOpenId;
50
-            ////客户发来的文本信息
51
-            //var content = requestMessage.Content;
66
+        //    //requestMessage.FromUserName也可以直接写成base.WeixinOpenId
67
+        //    var openId = base.WeixinOpenId;
68
+        //    //客户发来的文本信息
69
+        //    var content = requestMessage.Content;
52 70
 
53
-            //Logger.Info($"您的OpenID是{openId}。\r\n您发送了文字信息:{content}, requestMessage.MsgId={requestMessage.MsgId},requestMessage.MsgId={requestMessage.CreateTime}");
54
-            ////【TODO:查询已配置的文本回复信息】
71
+        //    Logger.Info($"您的OpenID是{openId}。\r\n您发送了文字信息:{content}, requestMessage.MsgId={requestMessage.MsgId},requestMessage.MsgId={requestMessage.CreateTime}");
72
+        //    //【TODO:查询已配置的文本回复信息】
55 73
 
56
-            //var responseMessage = base.CreateResponseMessage<ResponseMessageText>();
57
-            //responseMessage.Content = $"您的OpenID是{openId}。\r\n您发送了文字信息:{content}, requestMessage.MsgId={requestMessage.MsgId},requestMessage.MsgId={requestMessage.CreateTime}";
58
-            //Logger.Info($"responseMessage.FromUserName = {responseMessage.FromUserName}   responseMessage.MsgType={responseMessage.MsgType},responseMessage.ToUserName={responseMessage.ToUserName}");
59
-            //return responseMessage;
74
+        //    var responseMessage = base.CreateResponseMessage<ResponseMessageText>();
75
+        //    responseMessage.Content = $"您的OpenID是{openId}。\r\n您发送了文字信息:{content}, requestMessage.MsgId={requestMessage.MsgId},requestMessage.MsgId={requestMessage.CreateTime}";
76
+        //    Logger.Info($"responseMessage.FromUserName = {responseMessage.FromUserName}   responseMessage.MsgType={responseMessage.MsgType},responseMessage.ToUserName={responseMessage.ToUserName}");
77
+        //    return responseMessage;
60 78
 
61 79
 
62
-
63
-            var responseMessage = ResponseMessageBase.CreateFromRequestMessage<ResponseMessageText>(requestMessage);
64
-            responseMessage.Content = $"您的OpenID是{requestMessage.FromUserName}。\r\n您发送了文字信息:{requestMessage.Content}, requestMessage.MsgId={requestMessage.MsgId},requestMessage.MsgId={requestMessage.CreateTime}";
65
-            return responseMessage;
66
-        }
80
+        //}
67 81
 
68 82
 
69 83
         public override void OnExecuting()
70 84
         {
85
+            Logger.Info($"OnExecuting");
71 86
             //测试MessageContext.StorageData
72 87
             if (CurrentMessageContext.StorageData == null)
73 88
             {
74 89
                 CurrentMessageContext.StorageData = 0;
75 90
             }
91
+
76 92
             base.OnExecuting();
77 93
         }
78 94
 
79 95
         public override void OnExecuted()
80 96
         {
97
+            Logger.Info($"OnExecuted");
81 98
             base.OnExecuted();
82 99
             CurrentMessageContext.StorageData = ((int)CurrentMessageContext.StorageData) + 1;
83 100
         }

+ 1 - 1
ServiceWechat/ServiceWechat/MessageHandlers/CustomMessageHandler/CustomMessageHandler_Events.cs

@@ -9,7 +9,7 @@ using Senparc.Weixin.MP.Helpers;
9 9
 using Senparc.Weixin.MP.MessageHandlers;
10 10
 
11 11
 
12
-namespace ServiceWechat.Api.MessageHandlers.CustomMessageHandler
12
+namespace ServiceWechat.Api.MessageHandlers
13 13
 {
14 14
     /// <summary>
15 15
     /// 自定义MessageHandler

+ 3 - 3
ServiceWechat/ServiceWechat/ServiceWechat.Api.csproj

@@ -14,9 +14,9 @@
14 14
     <PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.5" />
15 15
     <PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="2.0.2" />
16 16
     <PackageReference Include="NLog.Web.AspNetCore" Version="4.4.1" />
17
-    <PackageReference Include="Senparc.Weixin" Version="4.19.0" />
18
-    <PackageReference Include="Senparc.Weixin.MP" Version="14.9.0" />
19
-    <PackageReference Include="Senparc.Weixin.MP.MVC" Version="5.0.0" />
17
+    <PackageReference Include="Senparc.Weixin" Version="4.20.0" />
18
+    <PackageReference Include="Senparc.Weixin.MP" Version="14.10.0" />
19
+    <PackageReference Include="Senparc.Weixin.MP.MVC" Version="5.2.0" />
20 20
   </ItemGroup>
21 21
 
22 22
   <ItemGroup>