首页 > 代码库 > OYMLCN.WeChat.Core微信公众平台SDK核心库(被动回复模块)现已基本完成

OYMLCN.WeChat.Core微信公众平台SDK核心库(被动回复模块)现已基本完成

NuGet包地址:

https://www.nuget.org/packages/OYMLCN.WeChat.Core

    由于来的OYMLCN.WeChat存在深度封装,并没有做完整的测试,对于使用不友好,现已重新构建SDK的接收消息被动回复模块。

    现已做到最大程度的简易化及模块化,每个模块都已完成单元测试(根据微信说明文档的示例内容)。

    接下来将会重新构建微信接口的调用模块,将会在基本完成后发布。

    类JQuery操作的方式将会在所有功能完善并完成测试以后再整合到OYMLCN.WeChat当中。

主要使用方式:

var postModel = this.Request.GetQuery().IsValidRequest(Config);
if (postModel == null)
    return Content("");
return Content(new DemoHandler(WeChatRequest.Build(Config, postModel, this.Request.GetBody().ReadToEnd())).Result);

Config是基础接口配置OYMLCN.WeChat.Config的实例,参数依次为【公众平台微信号】、【AppId】、【AppSecret】、【Token】以及可选的【AESKey】。
配置的参数顺序相对于以往版本有变更,若报错无法验证签名有效性则需要检查参数的赋值顺序。
Request.GetQuery()是对Request的扩展方法,封装在依赖包OYMLCN.Web当中,主要获取请求附带的参数。若在ASP.Net Web Api当中使用,需要安装兼容扩展包OYMLCN.Web.Api。
Request.GetBody()主要是获取请求的正文,相当于Request.Body,为了使代码兼容WebApi而设置的一个方法。
ReadToEnd()是Stream的扩展方法,主要是读取Stream中的文本内容。
IsValidRequest(Config)是Dictionary<string, string>的扩展方法,用于验证请求的有效性并获取PostModel参数。验证失败则返回null。
当前示例是使用Handler处理的。

public class DemoHandler : OYMLCN.WeChat.MessageHandler
{
    public DemoHandler(OYMLCN.WeChat.WeChatRequest request) : base(request) { }

    public override OYMLCN.WeChat.WeChatResponse DefaultResponseMessage(OYMLCN.WeChat.WeChatRequest request)
    {
        return OYMLCN.WeChat.WeChatResponse.ResponseText(request, "Success");
    }
}

 

若需求简单,可不使用Handler来处理,使用方式如下:

OYMLCN.WeChat.Config config = new OYMLCN.WeChat.Config("微信账号名", "AppId", "AppSecret", "Token", "AESKey");
OYMLCN.WeChat.PostModel postModel = this.Request.GetQuery().IsValidRequest(config);
string body = this.Request.GetBody().ReadToEnd();
OYMLCN.WeChat.WeChatRequest request = OYMLCN.WeChat.WeChatRequest.Build(config, postModel, body);
OYMLCN.WeChat.WeChatResponse response = null;
if (request.MessageType == OYMLCN.WeChat.WeChatRequestMessageType.Text)
    response = OYMLCN.WeChat.WeChatResponse.ResponseText(request, "我是测试");
else if (request.MessageType == OYMLCN.WeChat.WeChatRequestMessageType.Event)
    if (request.EventType == OYMLCN.WeChat.WeChatRequestEventType.Event关注)
        response = OYMLCN.WeChat.WeChatResponse.ResponseText(request, "你来晚了");
if (response != null)
    return Content(response.Result);
return Content("");

 

附上单元测试代码,基本用法均已展现。

技术分享
   1 using System;
   2 using System.Collections.Generic;
   3 using Microsoft.VisualStudio.TestTools.UnitTesting;
   4 using System.Linq;
   5 
   6 namespace OYMLCN.WeChat.Core.Test
   7 {
   8     [TestClass]
   9     public class UnitTest
  10     {
  11         Config Config = new Config("wxName", "appId", "appSecret", "token", "aes");
  12         PostModel PostModel = PostModel.Build(new Dictionary<string, string>()
  13         {
  14             {"nonce","1362870167" },
  15             {"openid","oOk2XjhrbcHP3tGgzDGAVHppo3Bs" },
  16             {"signature","7940891098b505c22f99b0e3708627ec715aa832" },
  17             {"timestamp","1496218735" }
  18         });
  19 
  20         [TestMethod]
  21         public void WeChatRequestTest()
  22         {
  23             string textMsg = @"<xml>
  24  <ToUserName><![CDATA[toUser]]></ToUserName>
  25  <FromUserName><![CDATA[fromUser]]></FromUserName>
  26  <CreateTime>1348831860</CreateTime>
  27  <MsgType><![CDATA[text]]></MsgType>
  28  <Content><![CDATA[this is a test]]></Content>
  29  <MsgId>1234567890123456</MsgId>
  30  </xml>";
  31 
  32             var request = WeChatRequest.Build(Config, PostModel, textMsg);
  33             Assert.AreEqual(request.MessageType, WeChatRequestMessageType.Text);
  34             Assert.AreEqual(request.ToUserName, "toUser");
  35             Assert.AreEqual(request.FromUserName, "fromUser");
  36             Assert.AreEqual(request.CreateTime, 1348831860);
  37             Assert.AreEqual(request.MsgId, 1234567890123456);
  38             Assert.AreEqual(request.MessageText.Content, "this is a test");
  39 
  40             string imgMsg = @"<xml>
  41 <ToUserName><![CDATA[toUser]]></ToUserName>
  42 <FromUserName><![CDATA[fromUser]]></FromUserName>
  43 <CreateTime>1348831860</CreateTime>
  44 <MsgType><![CDATA[image]]></MsgType>
  45 <PicUrl><![CDATA[this is a url]]></PicUrl>
  46 <MediaId><![CDATA[media_id]]></MediaId>
  47 <MsgId>1234567890123456</MsgId>
  48 </xml>";
  49             request = WeChatRequest.Build(Config, PostModel, imgMsg);
  50             Assert.AreEqual(request.MessageType, WeChatRequestMessageType.Image);
  51             Assert.AreEqual(request.ToUserName, "toUser");
  52             Assert.AreEqual(request.FromUserName, "fromUser");
  53             Assert.AreEqual(request.CreateTime, 1348831860);
  54             Assert.AreEqual(request.MessageImage.PicUrl, "this is a url");
  55             Assert.AreEqual(request.MessageImage.MediaId, "media_id");
  56             Assert.AreEqual(request.MsgId, 1234567890123456);
  57 
  58             string voiceMsg = @"<xml>
  59 <ToUserName><![CDATA[toUser]]></ToUserName>
  60 <FromUserName><![CDATA[fromUser]]></FromUserName>
  61 <CreateTime>1357290913</CreateTime>
  62 <MsgType><![CDATA[voice]]></MsgType>
  63 <MediaId><![CDATA[media_id]]></MediaId>
  64 <Format><![CDATA[Format]]></Format>
  65 <MsgId>1234567890123456</MsgId>
  66 </xml>";
  67             request = WeChatRequest.Build(Config, PostModel, voiceMsg);
  68             Assert.AreEqual(request.MessageType, WeChatRequestMessageType.Voice);
  69             Assert.AreEqual(request.ToUserName, "toUser");
  70             Assert.AreEqual(request.FromUserName, "fromUser");
  71             Assert.AreEqual(request.CreateTime, 1357290913);
  72             Assert.AreEqual(request.MessageVoice.MediaId, "media_id");
  73             Assert.AreEqual(request.MessageVoice.Format, "Format");
  74             Assert.AreEqual(request.MsgId, 1234567890123456);
  75 
  76             voiceMsg = @"<xml>
  77 <ToUserName><![CDATA[toUser]]></ToUserName>
  78 <FromUserName><![CDATA[fromUser]]></FromUserName>
  79 <CreateTime>1357290913</CreateTime>
  80 <MsgType><![CDATA[voice]]></MsgType>
  81 <MediaId><![CDATA[media_id]]></MediaId>
  82 <Format><![CDATA[Format]]></Format>
  83 <Recognition><![CDATA[腾讯微信团队]]></Recognition>
  84 <MsgId>1234567890123456</MsgId>
  85 </xml>";
  86             request = WeChatRequest.Build(Config, PostModel, voiceMsg);
  87             Assert.AreEqual(request.MessageType, WeChatRequestMessageType.Voice);
  88             Assert.AreEqual(request.ToUserName, "toUser");
  89             Assert.AreEqual(request.FromUserName, "fromUser");
  90             Assert.AreEqual(request.CreateTime, 1357290913);
  91             Assert.AreEqual(request.MessageVoice.MediaId, "media_id");
  92             Assert.AreEqual(request.MessageVoice.Format, "Format");
  93             Assert.AreEqual(request.MessageVoice.Recognition, "腾讯微信团队");
  94             Assert.AreEqual(request.MsgId, 1234567890123456);
  95 
  96             var videoMsg = @"<xml>
  97 <ToUserName><![CDATA[toUser]]></ToUserName>
  98 <FromUserName><![CDATA[fromUser]]></FromUserName>
  99 <CreateTime>1357290913</CreateTime>
 100 <MsgType><![CDATA[video]]></MsgType>
 101 <MediaId><![CDATA[media_id]]></MediaId>
 102 <ThumbMediaId><![CDATA[thumb_media_id]]></ThumbMediaId>
 103 <MsgId>1234567890123456</MsgId>
 104 </xml>";
 105             request = WeChatRequest.Build(Config, PostModel, videoMsg);
 106             Assert.AreEqual(request.MessageType, WeChatRequestMessageType.Video);
 107             Assert.AreEqual(request.ToUserName, "toUser");
 108             Assert.AreEqual(request.FromUserName, "fromUser");
 109             Assert.AreEqual(request.CreateTime, 1357290913);
 110             Assert.AreEqual(request.MessageVideo.MediaId, "media_id");
 111             Assert.AreEqual(request.MessageVideo.ThumbMediaId, "thumb_media_id");
 112             Assert.AreEqual(request.MsgId, 1234567890123456);
 113 
 114             videoMsg = @"<xml>
 115 <ToUserName><![CDATA[toUser]]></ToUserName>
 116 <FromUserName><![CDATA[fromUser]]></FromUserName>
 117 <CreateTime>1357290913</CreateTime>
 118 <MsgType><![CDATA[shortvideo]]></MsgType>
 119 <MediaId><![CDATA[media_id]]></MediaId>
 120 <ThumbMediaId><![CDATA[thumb_media_id]]></ThumbMediaId>
 121 <MsgId>1234567890123456</MsgId>
 122 </xml>";
 123             request = WeChatRequest.Build(Config, PostModel, videoMsg);
 124             Assert.AreEqual(request.MessageType, WeChatRequestMessageType.ShortVideo);
 125             Assert.AreEqual(request.ToUserName, "toUser");
 126             Assert.AreEqual(request.FromUserName, "fromUser");
 127             Assert.AreEqual(request.CreateTime, 1357290913);
 128             Assert.AreEqual(request.MessageVideo.MediaId, "media_id");
 129             Assert.AreEqual(request.MessageVideo.ThumbMediaId, "thumb_media_id");
 130             Assert.AreEqual(request.MsgId, 1234567890123456);
 131 
 132             var locationMsg = @"<xml>
 133 <ToUserName><![CDATA[toUser]]></ToUserName>
 134 <FromUserName><![CDATA[fromUser]]></FromUserName>
 135 <CreateTime>1351776360</CreateTime>
 136 <MsgType><![CDATA[location]]></MsgType>
 137 <Location_X>23.134521</Location_X>
 138 <Location_Y>113.358803</Location_Y>
 139 <Scale>20</Scale>
 140 <Label><![CDATA[位置信息]]></Label>
 141 <MsgId>1234567890123456</MsgId>
 142 </xml>";
 143             request = WeChatRequest.Build(Config, PostModel, locationMsg);
 144             Assert.AreEqual(request.MessageType, WeChatRequestMessageType.Location);
 145             Assert.AreEqual(request.ToUserName, "toUser");
 146             Assert.AreEqual(request.FromUserName, "fromUser");
 147             Assert.AreEqual(request.CreateTime, 1351776360);
 148             Assert.AreEqual(request.MessageLocation.Location_X, 23.134521);
 149             Assert.AreEqual(request.MessageLocation.Location_Y, 113.358803);
 150             Assert.AreEqual(request.MessageLocation.Scale, 20);
 151             Assert.AreEqual(request.MessageLocation.Label, "位置信息");
 152             Assert.AreEqual(request.MsgId, 1234567890123456);
 153 
 154             var linkMsg = @"<xml>
 155 <ToUserName><![CDATA[toUser]]></ToUserName>
 156 <FromUserName><![CDATA[fromUser]]></FromUserName>
 157 <CreateTime>1351776360</CreateTime>
 158 <MsgType><![CDATA[link]]></MsgType>
 159 <Title><![CDATA[公众平台官网链接]]></Title>
 160 <Description><![CDATA[公众平台官网链接]]></Description>
 161 <Url><![CDATA[url]]></Url>
 162 <MsgId>1234567890123456</MsgId>
 163 </xml>";
 164             request = WeChatRequest.Build(Config, PostModel, linkMsg);
 165             Assert.AreEqual(request.MessageType, WeChatRequestMessageType.Link);
 166             Assert.AreEqual(request.ToUserName, "toUser");
 167             Assert.AreEqual(request.FromUserName, "fromUser");
 168             Assert.AreEqual(request.CreateTime, 1351776360);
 169             Assert.AreEqual(request.MessageLink.Title, "公众平台官网链接");
 170             Assert.AreEqual(request.MessageLink.Description, "公众平台官网链接");
 171             Assert.AreEqual(request.MessageLink.Url, "url");
 172             Assert.AreEqual(request.MsgId, 1234567890123456);
 173 
 174         }
 175 
 176         [TestMethod]
 177         public void WeChatRequestEventTest()
 178         {
 179             var subscribeEvent = @"<xml>
 180 <ToUserName><![CDATA[toUser]]></ToUserName>
 181 <FromUserName><![CDATA[FromUser]]></FromUserName>
 182 <CreateTime>123456789</CreateTime>
 183 <MsgType><![CDATA[event]]></MsgType>
 184 <Event><![CDATA[subscribe]]></Event>
 185 </xml>";
 186             var request = WeChatRequest.Build(Config, PostModel, subscribeEvent);
 187             Assert.AreEqual(request.MessageType, WeChatRequestMessageType.Event);
 188             Assert.AreEqual(request.EventType, WeChatRequestEventType.Event关注);
 189             Assert.AreEqual(request.ToUserName, "toUser");
 190             Assert.AreEqual(request.FromUserName, "FromUser");
 191             Assert.AreEqual(request.CreateTime, 123456789);
 192             Assert.IsTrue(request.Event关注);
 193 
 194             subscribeEvent = @"<xml>
 195 <ToUserName><![CDATA[toUser]]></ToUserName>
 196 <FromUserName><![CDATA[FromUser]]></FromUserName>
 197 <CreateTime>123456789</CreateTime>
 198 <MsgType><![CDATA[event]]></MsgType>
 199 <Event><![CDATA[unsubscribe]]></Event>
 200 </xml>";
 201             request = WeChatRequest.Build(Config, PostModel, subscribeEvent);
 202             Assert.IsTrue(request.Event取消关注);
 203 
 204             subscribeEvent = @"<xml>
 205 <ToUserName><![CDATA[toUser]]></ToUserName>
 206 <FromUserName><![CDATA[FromUser]]></FromUserName>
 207 <CreateTime>123456789</CreateTime>
 208 <MsgType><![CDATA[event]]></MsgType>
 209 <Event><![CDATA[subscribe]]></Event>
 210 <EventKey><![CDATA[qrscene_123123]]></EventKey>
 211 <Ticket><![CDATA[TICKET]]></Ticket>
 212 </xml>";
 213             request = WeChatRequest.Build(Config, PostModel, subscribeEvent);
 214             Assert.AreEqual(request.MessageType, WeChatRequestMessageType.Event);
 215             Assert.AreEqual(request.EventType, WeChatRequestEventType.Event关注);
 216             Assert.AreEqual(request.ToUserName, "toUser");
 217             Assert.AreEqual(request.FromUserName, "FromUser");
 218             Assert.AreEqual(request.CreateTime, 123456789);
 219             Assert.AreEqual(request.Event扫描带参数二维码.EventKey, "qrscene_123123");
 220             Assert.AreEqual(request.Event扫描带参数二维码.SceneId, "123123");
 221             Assert.AreEqual(request.Event扫描带参数二维码.Ticket, "TICKET");
 222 
 223             subscribeEvent = @"<xml>
 224 <ToUserName><![CDATA[toUser]]></ToUserName>
 225 <FromUserName><![CDATA[FromUser]]></FromUserName>
 226 <CreateTime>123456789</CreateTime>
 227 <MsgType><![CDATA[event]]></MsgType>
 228 <Event><![CDATA[SCAN]]></Event>
 229 <EventKey><![CDATA[SCENE_VALUE]]></EventKey>
 230 <Ticket><![CDATA[TICKET]]></Ticket>
 231 </xml>";
 232             request = WeChatRequest.Build(Config, PostModel, subscribeEvent);
 233             Assert.AreEqual(request.MessageType, WeChatRequestMessageType.Event);
 234             Assert.AreEqual(request.EventType, WeChatRequestEventType.Event扫描带参数二维码);
 235             Assert.AreEqual(request.ToUserName, "toUser");
 236             Assert.AreEqual(request.FromUserName, "FromUser");
 237             Assert.AreEqual(request.CreateTime, 123456789);
 238             Assert.AreEqual(request.Event扫描带参数二维码.EventKey, "SCENE_VALUE");
 239             Assert.AreEqual(request.Event扫描带参数二维码.SceneId, "SCENE_VALUE");
 240             Assert.AreEqual(request.Event扫描带参数二维码.Ticket, "TICKET");
 241 
 242 
 243             var locationEvent = @"<xml>
 244 <ToUserName><![CDATA[toUser]]></ToUserName>
 245 <FromUserName><![CDATA[fromUser]]></FromUserName>
 246 <CreateTime>123456789</CreateTime>
 247 <MsgType><![CDATA[event]]></MsgType>
 248 <Event><![CDATA[LOCATION]]></Event>
 249 <Latitude>23.137466</Latitude>
 250 <Longitude>113.352425</Longitude>
 251 <Precision>119.385040</Precision>
 252 </xml>";
 253             request = WeChatRequest.Build(Config, PostModel, locationEvent);
 254             Assert.AreEqual(request.MessageType, WeChatRequestMessageType.Event);
 255             Assert.AreEqual(request.EventType, WeChatRequestEventType.Event上报地理位置);
 256             Assert.AreEqual(request.ToUserName, "toUser");
 257             Assert.AreEqual(request.FromUserName, "fromUser");
 258             Assert.AreEqual(request.CreateTime, 123456789);
 259             Assert.AreEqual(request.Event上报地理位置.Latitude, 23.137466);
 260             Assert.AreEqual(request.Event上报地理位置.Longitude, 113.352425);
 261             Assert.AreEqual(request.Event上报地理位置.Precision, 119.385040);
 262 
 263             var clickEvent = @"<xml>
 264 <ToUserName><![CDATA[toUser]]></ToUserName>
 265 <FromUserName><![CDATA[FromUser]]></FromUserName>
 266 <CreateTime>123456789</CreateTime>
 267 <MsgType><![CDATA[event]]></MsgType>
 268 <Event><![CDATA[CLICK]]></Event>
 269 <EventKey><![CDATA[EVENTKEY]]></EventKey>
 270 </xml>";
 271             request = WeChatRequest.Build(Config, PostModel, clickEvent);
 272             Assert.AreEqual(request.MessageType, WeChatRequestMessageType.Event);
 273             Assert.AreEqual(request.EventType, WeChatRequestEventType.Event点击自定义菜单);
 274             Assert.AreEqual(request.ToUserName, "toUser");
 275             Assert.AreEqual(request.FromUserName, "FromUser");
 276             Assert.AreEqual(request.CreateTime, 123456789);
 277             Assert.AreEqual(request.Event点击自定义菜单.EventKey, "EVENTKEY");
 278 
 279             var linkEvent = @"<xml>
 280 <ToUserName><![CDATA[toUser]]></ToUserName>
 281 <FromUserName><![CDATA[FromUser]]></FromUserName>
 282 <CreateTime>123456789</CreateTime>
 283 <MsgType><![CDATA[event]]></MsgType>
 284 <Event><![CDATA[VIEW]]></Event>
 285 <EventKey><![CDATA[www.qq.com]]></EventKey>
 286 <MenuId>123</MenuId>
 287 </xml>";
 288             request = WeChatRequest.Build(Config, PostModel, linkEvent);
 289             Assert.AreEqual(request.MessageType, WeChatRequestMessageType.Event);
 290             Assert.AreEqual(request.EventType, WeChatRequestEventType.Event点击菜单跳转链接);
 291             Assert.AreEqual(request.ToUserName, "toUser");
 292             Assert.AreEqual(request.FromUserName, "FromUser");
 293             Assert.AreEqual(request.CreateTime, 123456789);
 294             Assert.AreEqual(request.Event点击菜单跳转链接.Url, "www.qq.com");
 295             Assert.AreEqual(request.Event点击菜单跳转链接.MenuId, 123);
 296 
 297         }
 298 
 299         [TestMethod]
 300         public void WeChatRequestPushEventTest()
 301         {
 302             #region 模板消息发送结果
 303             var tempplatePush = @"<xml>
 304 <ToUserName><![CDATA[gh_7f083739789a]]></ToUserName>
 305 <FromUserName><![CDATA[oia2TjuEGTNoeX76QEjQNrcURxG8]]></FromUserName>
 306 <CreateTime>1395658920</CreateTime>
 307 <MsgType><![CDATA[event]]></MsgType>
 308 <Event><![CDATA[TEMPLATESENDJOBFINISH]]></Event>
 309 <MsgID>200163836</MsgID>
 310 <Status><![CDATA[success]]></Status>
 311 </xml>";
 312             var request = WeChatRequest.Build(Config, PostModel, tempplatePush);
 313             Assert.AreEqual(request.MessageType, WeChatRequestMessageType.Event);
 314             Assert.AreEqual(request.EventType, WeChatRequestEventType.Push模板消息发送结果);
 315             Assert.AreEqual(request.ToUserName, "gh_7f083739789a");
 316             Assert.AreEqual(request.FromUserName, "oia2TjuEGTNoeX76QEjQNrcURxG8");
 317             Assert.AreEqual(request.CreateTime, 1395658920);
 318             Assert.AreEqual(request.Push模板消息发送结果.Status, "success");
 319             Assert.IsTrue(request.Push模板消息发送结果.Success);
 320 
 321             tempplatePush = @"<xml>
 322 <ToUserName><![CDATA[gh_7f083739789a]]></ToUserName>
 323 <FromUserName><![CDATA[oia2TjuEGTNoeX76QEjQNrcURxG8]]></FromUserName>
 324 <CreateTime>1395658984</CreateTime>
 325 <MsgType><![CDATA[event]]></MsgType>
 326 <Event><![CDATA[TEMPLATESENDJOBFINISH]]></Event>
 327 <MsgID>200163840</MsgID>
 328 <Status><![CDATA[failed:userblock]]></Status>
 329 </xml>";
 330             request = WeChatRequest.Build(Config, PostModel, tempplatePush);
 331             Assert.AreEqual(request.MessageType, WeChatRequestMessageType.Event);
 332             Assert.AreEqual(request.EventType, WeChatRequestEventType.Push模板消息发送结果);
 333             Assert.AreEqual(request.ToUserName, "gh_7f083739789a");
 334             Assert.AreEqual(request.FromUserName, "oia2TjuEGTNoeX76QEjQNrcURxG8");
 335             Assert.AreEqual(request.CreateTime, 1395658984);
 336             Assert.AreEqual(request.Push模板消息发送结果.Status, "failed:userblock");
 337             Assert.IsFalse(request.Push模板消息发送结果.Success);
 338             tempplatePush = @"<xml>
 339 <ToUserName><![CDATA[gh_7f083739789a]]></ToUserName>
 340 <FromUserName><![CDATA[oia2TjuEGTNoeX76QEjQNrcURxG8]]></FromUserName>
 341 <CreateTime>1395658984</CreateTime>
 342 <MsgType><![CDATA[event]]></MsgType>
 343 <Event><![CDATA[TEMPLATESENDJOBFINISH]]></Event>
 344 <MsgID>200163840</MsgID>
 345 <Status><![CDATA[failed:system failed]]></Status>
 346 </xml>";
 347             request = WeChatRequest.Build(Config, PostModel, tempplatePush);
 348             Assert.AreEqual(request.MessageType, WeChatRequestMessageType.Event);
 349             Assert.AreEqual(request.EventType, WeChatRequestEventType.Push模板消息发送结果);
 350             Assert.AreEqual(request.ToUserName, "gh_7f083739789a");
 351             Assert.AreEqual(request.FromUserName, "oia2TjuEGTNoeX76QEjQNrcURxG8");
 352             Assert.AreEqual(request.CreateTime, 1395658984);
 353             Assert.AreEqual(request.Push模板消息发送结果.Status, "failed:system failed");
 354             Assert.IsFalse(request.Push模板消息发送结果.Success);
 355             #endregion
 356 
 357             #region 群发结果
 358             var massResultPush = @"<xml>
 359 <ToUserName><![CDATA[gh_4d00ed8d6399]]></ToUserName>
 360 <FromUserName><![CDATA[oV5CrjpxgaGXNHIQigzNlgLTnwic]]></FromUserName>
 361 <CreateTime>1481013459</CreateTime>
 362 <MsgType><![CDATA[event]]></MsgType>
 363 <Event><![CDATA[MASSSENDJOBFINISH]]></Event>
 364 <MsgID>1000001625</MsgID>
 365 <Status><![CDATA[err(30003)]]></Status>
 366 <TotalCount>0</TotalCount>
 367 <FilterCount>0</FilterCount>
 368 <SentCount>0</SentCount>
 369 <ErrorCount>0</ErrorCount>
 370 <CopyrightCheckResult>
 371 <Count>2</Count>
 372 <ResultList>
 373 <item>
 374 <ArticleIdx>1</ArticleIdx>
 375 <UserDeclareState>0</UserDeclareState>
 376 <AuditState>2</AuditState>
 377 <OriginalArticleUrl><![CDATA[Url_1]]></OriginalArticleUrl>
 378 <OriginalArticleType>1</OriginalArticleType>
 379 <CanReprint>1</CanReprint>
 380 <NeedReplaceContent>1</NeedReplaceContent>
 381 <NeedShowReprintSource>1</NeedShowReprintSource>
 382 </item>
 383 <item>
 384 <ArticleIdx>2</ArticleIdx>
 385 <UserDeclareState>0</UserDeclareState>
 386 <AuditState>2</AuditState>
 387 <OriginalArticleUrl><![CDATA[Url_2]]></OriginalArticleUrl>
 388 <OriginalArticleType>1</OriginalArticleType>
 389 <CanReprint>1</CanReprint>
 390 <NeedReplaceContent>1</NeedReplaceContent>
 391 <NeedShowReprintSource>1</NeedShowReprintSource>
 392 </item>
 393 </ResultList>
 394 <CheckState>2</CheckState>
 395 </CopyrightCheckResult>
 396 </xml>";
 397             request = WeChatRequest.Build(Config, PostModel, massResultPush);
 398             Assert.AreEqual(request.MessageType, WeChatRequestMessageType.Event);
 399             Assert.AreEqual(request.EventType, WeChatRequestEventType.Push群发结果);
 400             Assert.AreEqual(request.ToUserName, "gh_4d00ed8d6399");
 401             Assert.AreEqual(request.FromUserName, "oV5CrjpxgaGXNHIQigzNlgLTnwic");
 402             Assert.AreEqual(request.CreateTime, 1481013459);
 403             Assert.AreEqual(request.Push群发结果.MsgID, 1000001625);
 404             Assert.AreEqual(request.Push群发结果.Status, "err(30003)");
 405             Assert.IsFalse(request.Push群发结果.Success);
 406             Assert.AreEqual(request.Push群发结果.ErrorReason, "原创校验被判定为转载文且用户选择了被判为转载就不群发");
 407             Assert.AreEqual(request.Push群发结果.TotalCount, 0);
 408             Assert.AreEqual(request.Push群发结果.FilterCount, 0);
 409             Assert.AreEqual(request.Push群发结果.SentCount, 0);
 410             Assert.AreEqual(request.Push群发结果.ErrorCount, 0);
 411             var checkResult = request.Push群发结果.CopyrightCheckResult;
 412             var item = checkResult.First();
 413             Assert.AreEqual(item.ArticleIdx, 1);
 414             Assert.AreEqual(item.UserDeclareState, 0);
 415             Assert.AreEqual(item.AuditState, 2);
 416             Assert.AreEqual(item.OriginalArticleUrl, "Url_1");
 417             Assert.AreEqual(item.OriginalArticleType, 1);
 418             Assert.AreEqual(item.CanReprint, true);
 419             Assert.AreEqual(item.NeedReplaceContent, true);
 420             Assert.AreEqual(item.NeedShowReprintSource, true);
 421             item = checkResult.Last();
 422             Assert.AreEqual(item.ArticleIdx, 2);
 423             Assert.AreEqual(item.UserDeclareState, 0);
 424             Assert.AreEqual(item.AuditState, 2);
 425             Assert.AreEqual(item.OriginalArticleUrl, "Url_2");
 426             Assert.AreEqual(item.OriginalArticleType, 1);
 427             Assert.AreEqual(item.CanReprint, true);
 428             Assert.AreEqual(item.NeedReplaceContent, true);
 429             Assert.AreEqual(item.NeedShowReprintSource, true);
 430             Assert.AreEqual(request.Push群发结果.CheckState, 2);
 431             #endregion
 432 
 433             #region 菜单相关推送
 434             var scancodePush = @"<xml>
 435 <ToUserName><![CDATA[gh_e136c6e50636]]></ToUserName>
 436 <FromUserName><![CDATA[oMgHVjngRipVsoxg6TuX3vz6glDg]]></FromUserName>
 437 <CreateTime>1408090502</CreateTime>
 438 <MsgType><![CDATA[event]]></MsgType>
 439 <Event><![CDATA[scancode_push]]></Event>
 440 <EventKey><![CDATA[6]]></EventKey>
 441 <ScanCodeInfo><ScanType><![CDATA[qrcode]]></ScanType>
 442 <ScanResult><![CDATA[1]]></ScanResult>
 443 </ScanCodeInfo>
 444 </xml>";
 445             request = WeChatRequest.Build(Config, PostModel, scancodePush);
 446             Assert.AreEqual(request.MessageType, WeChatRequestMessageType.Event);
 447             Assert.AreEqual(request.EventType, WeChatRequestEventType.MenuPush扫码推事件);
 448             Assert.AreEqual(request.ToUserName, "gh_e136c6e50636");
 449             Assert.AreEqual(request.FromUserName, "oMgHVjngRipVsoxg6TuX3vz6glDg");
 450             Assert.AreEqual(request.CreateTime, 1408090502);
 451             Assert.AreEqual(request.MenuPush扫码推事件.EventKey, "6");
 452             Assert.AreEqual(request.MenuPush扫码推事件.ScanType, "qrcode");
 453             Assert.AreEqual(request.MenuPush扫码推事件.ScanResult, "1");
 454             scancodePush = @"<xml>
 455 <ToUserName><![CDATA[gh_e136c6e50636]]></ToUserName>
 456 <FromUserName><![CDATA[oMgHVjngRipVsoxg6TuX3vz6glDg]]></FromUserName>
 457 <CreateTime>1408090606</CreateTime>
 458 <MsgType><![CDATA[event]]></MsgType>
 459 <Event><![CDATA[scancode_waitmsg]]></Event>
 460 <EventKey><![CDATA[6]]></EventKey>
 461 <ScanCodeInfo><ScanType><![CDATA[qrcode]]></ScanType>
 462 <ScanResult><![CDATA[2]]></ScanResult>
 463 </ScanCodeInfo>
 464 </xml>";
 465             request = WeChatRequest.Build(Config, PostModel, scancodePush);
 466             Assert.AreEqual(request.MessageType, WeChatRequestMessageType.Event);
 467             Assert.AreEqual(request.EventType, WeChatRequestEventType.MenuPush扫码推等待事件);
 468             Assert.AreEqual(request.ToUserName, "gh_e136c6e50636");
 469             Assert.AreEqual(request.FromUserName, "oMgHVjngRipVsoxg6TuX3vz6glDg");
 470             Assert.AreEqual(request.CreateTime, 1408090606);
 471             Assert.AreEqual(request.MenuPush扫码推等待事件.EventKey, "6");
 472             Assert.AreEqual(request.MenuPush扫码推等待事件.ScanType, "qrcode");
 473             Assert.AreEqual(request.MenuPush扫码推等待事件.ScanResult, "2");
 474 
 475             var imagePush = @"<xml>
 476 <ToUserName><![CDATA[gh_e136c6e50636]]></ToUserName>
 477 <FromUserName><![CDATA[oMgHVjngRipVsoxg6TuX3vz6glDg]]></FromUserName>
 478 <CreateTime>1408090651</CreateTime>
 479 <MsgType><![CDATA[event]]></MsgType>
 480 <Event><![CDATA[pic_sysphoto]]></Event>
 481 <EventKey><![CDATA[6]]></EventKey>
 482 <SendPicsInfo><Count>1</Count>
 483 <PicList><item><PicMd5Sum><![CDATA[1b5f7c23b5bf75682a53e7b6d163e185]]></PicMd5Sum>
 484 </item>
 485 </PicList>
 486 </SendPicsInfo>
 487 </xml>";
 488             request = WeChatRequest.Build(Config, PostModel, imagePush);
 489             Assert.AreEqual(request.MessageType, WeChatRequestMessageType.Event);
 490             Assert.AreEqual(request.EventType, WeChatRequestEventType.MenuPush系统拍照发图);
 491             Assert.AreEqual(request.ToUserName, "gh_e136c6e50636");
 492             Assert.AreEqual(request.FromUserName, "oMgHVjngRipVsoxg6TuX3vz6glDg");
 493             Assert.AreEqual(request.CreateTime, 1408090651);
 494             Assert.AreEqual(request.MenuPush系统拍照发图.EventKey, "6");
 495             Assert.AreEqual(request.MenuPush系统拍照发图.Count, 1);
 496             CollectionAssert.AreEqual(request.MenuPush系统拍照发图.PicMd5Sum, new string[] { "1b5f7c23b5bf75682a53e7b6d163e185" });
 497             imagePush = @"<xml>
 498 <ToUserName><![CDATA[gh_e136c6e50636]]></ToUserName>
 499 <FromUserName><![CDATA[oMgHVjngRipVsoxg6TuX3vz6glDg]]></FromUserName>
 500 <CreateTime>1408090816</CreateTime>
 501 <MsgType><![CDATA[event]]></MsgType>
 502 <Event><![CDATA[pic_photo_or_album]]></Event>
 503 <EventKey><![CDATA[6]]></EventKey>
 504 <SendPicsInfo><Count>1</Count>
 505 <PicList><item><PicMd5Sum><![CDATA[5a75aaca956d97be686719218f275c6b]]></PicMd5Sum>
 506 </item>
 507 </PicList>
 508 </SendPicsInfo>
 509 </xml>";
 510             request = WeChatRequest.Build(Config, PostModel, imagePush);
 511             Assert.AreEqual(request.MessageType, WeChatRequestMessageType.Event);
 512             Assert.AreEqual(request.EventType, WeChatRequestEventType.MenuPush拍照或者相册发图);
 513             Assert.AreEqual(request.ToUserName, "gh_e136c6e50636");
 514             Assert.AreEqual(request.FromUserName, "oMgHVjngRipVsoxg6TuX3vz6glDg");
 515             Assert.AreEqual(request.CreateTime, 1408090816);
 516             Assert.AreEqual(request.MenuPush系统拍照发图.EventKey, "6");
 517             Assert.AreEqual(request.MenuPush系统拍照发图.Count, 1);
 518             CollectionAssert.AreEqual(request.MenuPush系统拍照发图.PicMd5Sum, new string[] { "5a75aaca956d97be686719218f275c6b" });
 519             imagePush = @"<xml>
 520 <ToUserName><![CDATA[gh_e136c6e50636]]></ToUserName>
 521 <FromUserName><![CDATA[oMgHVjngRipVsoxg6TuX3vz6glDg]]></FromUserName>
 522 <CreateTime>1408090816</CreateTime>
 523 <MsgType><![CDATA[event]]></MsgType>
 524 <Event><![CDATA[pic_weixin]]></Event>
 525 <EventKey><![CDATA[6]]></EventKey>
 526 <SendPicsInfo><Count>1</Count>
 527 <PicList><item><PicMd5Sum><![CDATA[5a75aaca956d97be686719218f275c6b]]></PicMd5Sum>
 528 </item>
 529 </PicList>
 530 </SendPicsInfo>
 531 </xml>";
 532             request = WeChatRequest.Build(Config, PostModel, imagePush);
 533             Assert.AreEqual(request.MessageType, WeChatRequestMessageType.Event);
 534             Assert.AreEqual(request.EventType, WeChatRequestEventType.MenuPush微信相册发图);
 535             Assert.AreEqual(request.ToUserName, "gh_e136c6e50636");
 536             Assert.AreEqual(request.FromUserName, "oMgHVjngRipVsoxg6TuX3vz6glDg");
 537             Assert.AreEqual(request.CreateTime, 1408090816);
 538             Assert.AreEqual(request.MenuPush系统拍照发图.EventKey, "6");
 539             Assert.AreEqual(request.MenuPush系统拍照发图.Count, 1);
 540             CollectionAssert.AreEqual(request.MenuPush系统拍照发图.PicMd5Sum, new string[] { "5a75aaca956d97be686719218f275c6b" });
 541 
 542             var locationPush = @"<xml>
 543 <ToUserName><![CDATA[gh_e136c6e50636]]></ToUserName>
 544 <FromUserName><![CDATA[oMgHVjngRipVsoxg6TuX3vz6glDg]]></FromUserName>
 545 <CreateTime>1408091189</CreateTime>
 546 <MsgType><![CDATA[event]]></MsgType>
 547 <Event><![CDATA[location_select]]></Event>
 548 <EventKey><![CDATA[6]]></EventKey>
 549 <SendLocationInfo><Location_X><![CDATA[23]]></Location_X>
 550 <Location_Y><![CDATA[113]]></Location_Y>
 551 <Scale><![CDATA[15]]></Scale>
 552 <Label><![CDATA[广州市海珠区客村艺苑路 106号]]></Label>
 553 <Poiname><![CDATA[]]></Poiname>
 554 </SendLocationInfo>
 555 </xml>";
 556             request = WeChatRequest.Build(Config, PostModel, locationPush);
 557             Assert.AreEqual(request.MessageType, WeChatRequestMessageType.Event);
 558             Assert.AreEqual(request.EventType, WeChatRequestEventType.MenuPush位置选择);
 559             Assert.AreEqual(request.ToUserName, "gh_e136c6e50636");
 560             Assert.AreEqual(request.FromUserName, "oMgHVjngRipVsoxg6TuX3vz6glDg");
 561             Assert.AreEqual(request.CreateTime, 1408091189);
 562             Assert.AreEqual(request.MenuPush位置选择.EventKey, "6");
 563             Assert.AreEqual(request.MenuPush位置选择.Location_X, 23);
 564             Assert.AreEqual(request.MenuPush位置选择.Location_Y, 113);
 565             Assert.AreEqual(request.MenuPush位置选择.Scale, 15);
 566             Assert.AreEqual(request.MenuPush位置选择.Label, "广州市海珠区客村艺苑路 106号");
 567             Assert.AreEqual(request.MenuPush位置选择.Poiname, "");
 568             #endregion
 569         }
 570 
 571         [TestMethod]
 572         public void WeChatResponseTest()
 573         {
 574             var demoMsg = @"<xml>
 575 <ToUserName><![CDATA[AppId]]></ToUserName>
 576 <FromUserName><![CDATA[OpenId]]></FromUserName>
 577 <CreateTime>12345678</CreateTime>
 578 </xml>";
 579             var request = WeChatRequest.Build(Config, PostModel, demoMsg);
 580             Assert.AreEqual(WeChatResponse.ResponseText(request, "你好").Source, @"<xml>
 581 <ToUserName><![CDATA[OpenId]]></ToUserName>
 582 <FromUserName><![CDATA[AppId]]></FromUserName>
 583 <CreateTime>12345678</CreateTime>
 584 <MsgType><![CDATA[text]]></MsgType>
 585 <Content><![CDATA[你好]]></Content>
 586 </xml>".RemoveBr());
 587             Assert.AreEqual(WeChatResponse.ResponseImage(request, "media_id").Source, @"<xml>
 588 <ToUserName><![CDATA[OpenId]]></ToUserName>
 589 <FromUserName><![CDATA[AppId]]></FromUserName>
 590 <CreateTime>12345678</CreateTime>
 591 <MsgType><![CDATA[image]]></MsgType>
 592 <Image>
 593 <MediaId><![CDATA[media_id]]></MediaId>
 594 </Image>
 595 </xml>".RemoveBr());
 596             Assert.AreEqual(WeChatResponse.ResponseVoice(request, "media_id").Source, @"<xml>
 597 <ToUserName><![CDATA[OpenId]]></ToUserName>
 598 <FromUserName><![CDATA[AppId]]></FromUserName>
 599 <CreateTime>12345678</CreateTime>
 600 <MsgType><![CDATA[voice]]></MsgType>
 601 <Voice>
 602 <MediaId><![CDATA[media_id]]></MediaId>
 603 </Voice>
 604 </xml>".RemoveBr());
 605             Assert.AreEqual(WeChatResponse.ResponseVideo(request, "media_id", "title", "description").Source, @"<xml>
 606 <ToUserName><![CDATA[OpenId]]></ToUserName>
 607 <FromUserName><![CDATA[AppId]]></FromUserName>
 608 <CreateTime>12345678</CreateTime>
 609 <MsgType><![CDATA[video]]></MsgType>
 610 <Video>
 611 <MediaId><![CDATA[media_id]]></MediaId>
 612 <Title><![CDATA[title]]></Title>
 613 <Description><![CDATA[description]]></Description>
 614 </Video>
 615 </xml>".RemoveBr());
 616             Assert.AreEqual(WeChatResponse.ResponseMusic(request, "media_id", "MUSIC_Url", "TITLE", "DESCRIPTION", "HQ_MUSIC_Url").Source, @"<xml>
 617 <ToUserName><![CDATA[OpenId]]></ToUserName>
 618 <FromUserName><![CDATA[AppId]]></FromUserName>
 619 <CreateTime>12345678</CreateTime>
 620 <MsgType><![CDATA[music]]></MsgType>
 621 <Music>
 622 <Title><![CDATA[TITLE]]></Title>
 623 <Description><![CDATA[DESCRIPTION]]></Description>
 624 <MusicUrl><![CDATA[MUSIC_Url]]></MusicUrl>
 625 <HQMusicUrl><![CDATA[HQ_MUSIC_Url]]></HQMusicUrl>
 626 <ThumbMediaId><![CDATA[media_id]]></ThumbMediaId>
 627 </Music>
 628 </xml>".RemoveBr());
 629 
 630             Assert.AreEqual(WeChatResponse.ResponseNews(request,
 631                 new WeChatResponse.Article("title1", "description1", "picurl", "url"),
 632                 new WeChatResponse.Article("title", "description", "picurl", "url")
 633                 ).Source, @"<xml>
 634 <ToUserName><![CDATA[OpenId]]></ToUserName>
 635 <FromUserName><![CDATA[AppId]]></FromUserName>
 636 <CreateTime>12345678</CreateTime>
 637 <MsgType><![CDATA[news]]></MsgType>
 638 <ArticleCount>2</ArticleCount>
 639 <Articles>
 640 <item>
 641 <Title><![CDATA[title1]]></Title>
 642 <Description><![CDATA[description1]]></Description>
 643 <PicUrl><![CDATA[picurl]]></PicUrl>
 644 <Url><![CDATA[url]]></Url>
 645 </item>
 646 <item>
 647 <Title><![CDATA[title]]></Title>
 648 <Description><![CDATA[description]]></Description>
 649 <PicUrl><![CDATA[picurl]]></PicUrl>
 650 <Url><![CDATA[url]]></Url>
 651 </item>
 652 </Articles>
 653 </xml>".RemoveBr());
 654             Assert.AreEqual(WeChatResponse.TransferToCustomerService(request).Source, @"<xml>
 655 <ToUserName><![CDATA[OpenId]]></ToUserName>
 656 <FromUserName><![CDATA[AppId]]></FromUserName>
 657 <CreateTime>12345678</CreateTime>
 658 <MsgType><![CDATA[transfer_customer_service]]></MsgType>
 659 </xml>".RemoveBr());
 660             Assert.AreEqual(WeChatResponse.TransferToCustomerService(request, "test1").Source, @"<xml>
 661 <ToUserName><![CDATA[OpenId]]></ToUserName>
 662 <FromUserName><![CDATA[AppId]]></FromUserName>
 663 <CreateTime>12345678</CreateTime>
 664 <MsgType><![CDATA[transfer_customer_service]]></MsgType>
 665 <TransInfo><KfAccount><![CDATA[test1@test]]></KfAccount></TransInfo>
 666 </xml>".RemoveBr());
 667         }
 668 
 669         [TestMethod]
 670         public void WeChatExtensionTest()
 671         {
 672             var demoQuery = new Dictionary<string, string>()
 673             {
 674                 {"nonce","1362870167"},
 675                 {"openid","oOk2XjhrbcHP3tGgzDGAVHppo3Bs"},
 676                 {"signature","7940891098b505c22f99b0e3708627ec715aa832"},
 677                 {"timestamp","1496218735"},
 678                 {"echostr","demoEchostr"}
 679             };
 680             Assert.IsNotNull(demoQuery.IsValidRequest(Config));
 681             Assert.AreEqual(demoQuery.ConfigVerify(Config), "demoEchostr");
 682             demoQuery = new Dictionary<string, string>();
 683             Assert.IsNull(demoQuery.IsValidRequest(Config));
 684             Assert.AreEqual(demoQuery.ConfigVerify(Config), "");
 685         }
 686 
 687         [TestMethod]
 688         public void WeChatHanddlerTest()
 689         {
 690             string demoMsg = @"<xml>
 691  <ToUserName><![CDATA[toUser]]></ToUserName>
 692  <FromUserName><![CDATA[fromUser]]></FromUserName>
 693  <CreateTime>1348831860</CreateTime>
 694  <MsgType><![CDATA[test]]></MsgType>
 695  <Content><![CDATA[this is a test]]></Content>
 696  <MsgId>1234567890123456</MsgId>
 697  </xml>";
 698             bool IsOkReponse(HandlerDemo demo, string text) => demo.Result.ToXDocument().SelectValue("Content").Equals(text);
 699 
 700             var request = WeChatRequest.Build(Config, PostModel, demoMsg);
 701             var demoHandler = new HandlerDemo(request);
 702             Assert.AreEqual(demoHandler.Result, "");//未支持消息,直接回复空字符串
 703 
 704             #region 微信消息
 705             demoMsg = @"<xml>
 706  <ToUserName><![CDATA[toUser]]></ToUserName>
 707  <FromUserName><![CDATA[fromUser]]></FromUserName>
 708  <CreateTime>1348831860</CreateTime>
 709  <MsgType><![CDATA[text]]></MsgType>
 710  <Content><![CDATA[this is a test]]></Content>
 711  <MsgId>1234567890123456</MsgId>
 712  </xml>";
 713             request = WeChatRequest.Build(Config, PostModel, demoMsg);
 714             demoHandler = new HandlerDemo(request);
 715             Assert.IsTrue(IsOkReponse(demoHandler, "OnMessageText"));
 716 
 717             demoMsg = @"<xml>
 718 <ToUserName><![CDATA[toUser]]></ToUserName>
 719 <FromUserName><![CDATA[fromUser]]></FromUserName>
 720 <CreateTime>1348831860</CreateTime>
 721 <MsgType><![CDATA[image]]></MsgType>
 722 <PicUrl><![CDATA[this is a url]]></PicUrl>
 723 <MediaId><![CDATA[media_id]]></MediaId>
 724 <MsgId>1234567890123456</MsgId>
 725 </xml>";
 726             request = WeChatRequest.Build(Config, PostModel, demoMsg);
 727             demoHandler = new HandlerDemo(request);
 728             Assert.IsTrue(IsOkReponse(demoHandler, "OnMessageImage"));
 729 
 730             demoMsg = @"<xml>
 731 <ToUserName><![CDATA[toUser]]></ToUserName>
 732 <FromUserName><![CDATA[fromUser]]></FromUserName>
 733 <CreateTime>1357290913</CreateTime>
 734 <MsgType><![CDATA[voice]]></MsgType>
 735 <MediaId><![CDATA[media_id]]></MediaId>
 736 <Format><![CDATA[Format]]></Format>
 737 <Recognition><![CDATA[腾讯微信团队]]></Recognition>
 738 <MsgId>1234567890123456</MsgId>
 739 </xml>";
 740             request = WeChatRequest.Build(Config, PostModel, demoMsg);
 741             demoHandler = new HandlerDemo(request);
 742             Assert.IsTrue(IsOkReponse(demoHandler, "OnMessageVoice"));
 743 
 744             demoMsg = @"<xml>
 745 <ToUserName><![CDATA[toUser]]></ToUserName>
 746 <FromUserName><![CDATA[fromUser]]></FromUserName>
 747 <CreateTime>1357290913</CreateTime>
 748 <MsgType><![CDATA[video]]></MsgType>
 749 <MediaId><![CDATA[media_id]]></MediaId>
 750 <ThumbMediaId><![CDATA[thumb_media_id]]></ThumbMediaId>
 751 <MsgId>1234567890123456</MsgId>
 752 </xml>";
 753             request = WeChatRequest.Build(Config, PostModel, demoMsg);
 754             demoHandler = new HandlerDemo(request);
 755             Assert.IsTrue(IsOkReponse(demoHandler, "OnMessageVideo"));
 756 
 757             demoMsg = @"<xml>
 758 <ToUserName><![CDATA[toUser]]></ToUserName>
 759 <FromUserName><![CDATA[fromUser]]></FromUserName>
 760 <CreateTime>1357290913</CreateTime>
 761 <MsgType><![CDATA[shortvideo]]></MsgType>
 762 <MediaId><![CDATA[media_id]]></MediaId>
 763 <ThumbMediaId><![CDATA[thumb_media_id]]></ThumbMediaId>
 764 <MsgId>1234567890123456</MsgId>
 765 </xml>";
 766             request = WeChatRequest.Build(Config, PostModel, demoMsg);
 767             demoHandler = new HandlerDemo(request);
 768             Assert.IsTrue(IsOkReponse(demoHandler, "OnMessageShortVideo"));
 769 
 770             demoMsg = @"<xml>
 771 <ToUserName><![CDATA[toUser]]></ToUserName>
 772 <FromUserName><![CDATA[fromUser]]></FromUserName>
 773 <CreateTime>1351776360</CreateTime>
 774 <MsgType><![CDATA[location]]></MsgType>
 775 <Location_X>23.134521</Location_X>
 776 <Location_Y>113.358803</Location_Y>
 777 <Scale>20</Scale>
 778 <Label><![CDATA[位置信息]]></Label>
 779 <MsgId>1234567890123456</MsgId>
 780 </xml>";
 781             request = WeChatRequest.Build(Config, PostModel, demoMsg);
 782             demoHandler = new HandlerDemo(request);
 783             Assert.IsTrue(IsOkReponse(demoHandler, "OnMessageLocaltion"));
 784 
 785             demoMsg = @"<xml>
 786 <ToUserName><![CDATA[toUser]]></ToUserName>
 787 <FromUserName><![CDATA[fromUser]]></FromUserName>
 788 <CreateTime>1351776360</CreateTime>
 789 <MsgType><![CDATA[link]]></MsgType>
 790 <Title><![CDATA[公众平台官网链接]]></Title>
 791 <Description><![CDATA[公众平台官网链接]]></Description>
 792 <Url><![CDATA[url]]></Url>
 793 <MsgId>1234567890123456</MsgId>
 794 </xml>";
 795             request = WeChatRequest.Build(Config, PostModel, demoMsg);
 796             demoHandler = new HandlerDemo(request);
 797             Assert.IsTrue(IsOkReponse(demoHandler, "OnMessageLink"));
 798             #endregion
 799 
 800             #region 事件消息
 801             demoMsg = @"<xml>
 802 <ToUserName><![CDATA[toUser]]></ToUserName>
 803 <FromUserName><![CDATA[FromUser]]></FromUserName>
 804 <CreateTime>123456789</CreateTime>
 805 <MsgType><![CDATA[event]]></MsgType>
 806 <Event><![CDATA[subscribe]]></Event>
 807 </xml>";
 808             request = WeChatRequest.Build(Config, PostModel, demoMsg);
 809             demoHandler = new HandlerDemo(request);
 810             Assert.IsTrue(IsOkReponse(demoHandler, "OnEvent关注"));
 811 
 812 
 813             demoMsg = @"<xml>
 814 <ToUserName><![CDATA[toUser]]></ToUserName>
 815 <FromUserName><![CDATA[FromUser]]></FromUserName>
 816 <CreateTime>123456789</CreateTime>
 817 <MsgType><![CDATA[event]]></MsgType>
 818 <Event><![CDATA[unsubscribe]]></Event>
 819 </xml>";
 820             request = WeChatRequest.Build(Config, PostModel, demoMsg);
 821             demoHandler = new HandlerDemo(request);
 822             Assert.ThrowsException<NotImplementedException>(() => { string result = demoHandler.Result; }, "OnEvent取消关注");
 823 
 824             demoMsg = @"<xml>
 825 <ToUserName><![CDATA[toUser]]></ToUserName>
 826 <FromUserName><![CDATA[FromUser]]></FromUserName>
 827 <CreateTime>123456789</CreateTime>
 828 <MsgType><![CDATA[event]]></MsgType>
 829 <Event><![CDATA[subscribe]]></Event>
 830 <EventKey><![CDATA[qrscene_123123]]></EventKey>
 831 <Ticket><![CDATA[TICKET]]></Ticket>
 832 </xml>";
 833             request = WeChatRequest.Build(Config, PostModel, demoMsg);
 834             demoHandler = new HandlerDemo(request);
 835             Assert.IsTrue(IsOkReponse(demoHandler, "OnEvent关注-扫描带参数二维码"));
 836 
 837             demoMsg = @"<xml>
 838 <ToUserName><![CDATA[toUser]]></ToUserName>
 839 <FromUserName><![CDATA[FromUser]]></FromUserName>
 840 <CreateTime>123456789</CreateTime>
 841 <MsgType><![CDATA[event]]></MsgType>
 842 <Event><![CDATA[SCAN]]></Event>
 843 <EventKey><![CDATA[SCENE_VALUE]]></EventKey>
 844 <Ticket><![CDATA[TICKET]]></Ticket>
 845 </xml>";
 846             request = WeChatRequest.Build(Config, PostModel, demoMsg);
 847             demoHandler = new HandlerDemo(request);
 848             Assert.IsTrue(IsOkReponse(demoHandler, "OnEvent扫描带参数二维码"));
 849 
 850             demoMsg = @"<xml>
 851 <ToUserName><![CDATA[toUser]]></ToUserName>
 852 <FromUserName><![CDATA[fromUser]]></FromUserName>
 853 <CreateTime>123456789</CreateTime>
 854 <MsgType><![CDATA[event]]></MsgType>
 855 <Event><![CDATA[LOCATION]]></Event>
 856 <Latitude>23.137466</Latitude>
 857 <Longitude>113.352425</Longitude>
 858 <Precision>119.385040</Precision>
 859 </xml>";
 860             request = WeChatRequest.Build(Config, PostModel, demoMsg);
 861             demoHandler = new HandlerDemo(request);
 862             Assert.IsTrue(IsOkReponse(demoHandler, "OnEvent上报地理位置"));
 863 
 864             demoMsg = @"<xml>
 865 <ToUserName><![CDATA[toUser]]></ToUserName>
 866 <FromUserName><![CDATA[FromUser]]></FromUserName>
 867 <CreateTime>123456789</CreateTime>
 868 <MsgType><![CDATA[event]]></MsgType>
 869 <Event><![CDATA[CLICK]]></Event>
 870 <EventKey><![CDATA[EVENTKEY]]></EventKey>
 871 </xml>";
 872             request = WeChatRequest.Build(Config, PostModel, demoMsg);
 873             demoHandler = new HandlerDemo(request);
 874             Assert.IsTrue(IsOkReponse(demoHandler, "OnEvent点击自定义菜单"));
 875 
 876             demoMsg = @"<xml>
 877 <ToUserName><![CDATA[toUser]]></ToUserName>
 878 <FromUserName><![CDATA[FromUser]]></FromUserName>
 879 <CreateTime>123456789</CreateTime>
 880 <MsgType><![CDATA[event]]></MsgType>
 881 <Event><![CDATA[VIEW]]></Event>
 882 <EventKey><![CDATA[www.qq.com]]></EventKey>
 883 <MenuId>123</MenuId>
 884 </xml>";
 885             request = WeChatRequest.Build(Config, PostModel, demoMsg);
 886             demoHandler = new HandlerDemo(request);
 887             Assert.ThrowsException<NotImplementedException>(() => { string result = demoHandler.Result; }, "OnEvent点击菜单跳转链接");
 888             #endregion
 889 
 890             #region 微信服务相关
 891             demoMsg = @"<xml>
 892 <ToUserName><![CDATA[gh_7f083739789a]]></ToUserName>
 893 <FromUserName><![CDATA[oia2TjuEGTNoeX76QEjQNrcURxG8]]></FromUserName>
 894 <CreateTime>1395658920</CreateTime>
 895 <MsgType><![CDATA[event]]></MsgType>
 896 <Event><![CDATA[TEMPLATESENDJOBFINISH]]></Event>
 897 <MsgID>200163836</MsgID>
 898 <Status><![CDATA[success]]></Status>
 899 </xml>";
 900             request = WeChatRequest.Build(Config, PostModel, demoMsg);
 901             demoHandler = new HandlerDemo(request);
 902             Assert.ThrowsException<NotImplementedException>(() => { string result = demoHandler.Result; }, "OnPush模板消息发送结果");
 903 
 904             demoMsg = @"<xml>
 905 <ToUserName><![CDATA[gh_4d00ed8d6399]]></ToUserName>
 906 <FromUserName><![CDATA[oV5CrjpxgaGXNHIQigzNlgLTnwic]]></FromUserName>
 907 <CreateTime>1481013459</CreateTime>
 908 <MsgType><![CDATA[event]]></MsgType>
 909 <Event><![CDATA[MASSSENDJOBFINISH]]></Event>
 910 <MsgID>1000001625</MsgID>
 911 <Status><![CDATA[err(30003)]]></Status>
 912 <TotalCount>0</TotalCount>
 913 <FilterCount>0</FilterCount>
 914 <SentCount>0</SentCount>
 915 <ErrorCount>0</ErrorCount>
 916 </xml>";
 917             request = WeChatRequest.Build(Config, PostModel, demoMsg);
 918             demoHandler = new HandlerDemo(request);
 919             Assert.ThrowsException<NotImplementedException>(() => { string result = demoHandler.Result; }, "OnPush群发结果");
 920             #endregion
 921 
 922             #region 菜单相关推送
 923             demoMsg = @"<xml>
 924 <ToUserName><![CDATA[gh_e136c6e50636]]></ToUserName>
 925 <FromUserName><![CDATA[oMgHVjngRipVsoxg6TuX3vz6glDg]]></FromUserName>
 926 <CreateTime>1408090502</CreateTime>
 927 <MsgType><![CDATA[event]]></MsgType>
 928 <Event><![CDATA[scancode_push]]></Event>
 929 <EventKey><![CDATA[6]]></EventKey>
 930 <ScanCodeInfo><ScanType><![CDATA[qrcode]]></ScanType>
 931 <ScanResult><![CDATA[1]]></ScanResult>
 932 </ScanCodeInfo>
 933 </xml>";
 934             request = WeChatRequest.Build(Config, PostModel, demoMsg);
 935             demoHandler = new HandlerDemo(request);
 936             Assert.IsTrue(IsOkReponse(demoHandler, "OnPushMenu扫码推事件"));
 937 
 938             demoMsg = @"<xml>
 939 <ToUserName><![CDATA[gh_e136c6e50636]]></ToUserName>
 940 <FromUserName><![CDATA[oMgHVjngRipVsoxg6TuX3vz6glDg]]></FromUserName>
 941 <CreateTime>1408090606</CreateTime>
 942 <MsgType><![CDATA[event]]></MsgType>
 943 <Event><![CDATA[scancode_waitmsg]]></Event>
 944 <EventKey><![CDATA[6]]></EventKey>
 945 <ScanCodeInfo><ScanType><![CDATA[qrcode]]></ScanType>
 946 <ScanResult><![CDATA[2]]></ScanResult>
 947 </ScanCodeInfo>
 948 </xml>";
 949             request = WeChatRequest.Build(Config, PostModel, demoMsg);
 950             demoHandler = new HandlerDemo(request);
 951             Assert.IsTrue(IsOkReponse(demoHandler, "OnPushMenu扫码推等待事件"));
 952 
 953             demoMsg = @"<xml>
 954 <ToUserName><![CDATA[gh_e136c6e50636]]></ToUserName>
 955 <FromUserName><![CDATA[oMgHVjngRipVsoxg6TuX3vz6glDg]]></FromUserName>
 956 <CreateTime>1408090651</CreateTime>
 957 <MsgType><![CDATA[event]]></MsgType>
 958 <Event><![CDATA[pic_sysphoto]]></Event>
 959 <EventKey><![CDATA[6]]></EventKey>
 960 <SendPicsInfo><Count>1</Count>
 961 <PicList><item><PicMd5Sum><![CDATA[1b5f7c23b5bf75682a53e7b6d163e185]]></PicMd5Sum>
 962 </item>
 963 </PicList>
 964 </SendPicsInfo>
 965 </xml>";
 966             request = WeChatRequest.Build(Config, PostModel, demoMsg);
 967             demoHandler = new HandlerDemo(request);
 968             Assert.IsTrue(IsOkReponse(demoHandler, "OnPushMenu系统拍照发图"));
 969 
 970             demoMsg = @"<xml>
 971 <ToUserName><![CDATA[gh_e136c6e50636]]></ToUserName>
 972 <FromUserName><![CDATA[oMgHVjngRipVsoxg6TuX3vz6glDg]]></FromUserName>
 973 <CreateTime>1408090816</CreateTime>
 974 <MsgType><![CDATA[event]]></MsgType>
 975 <Event><![CDATA[pic_photo_or_album]]></Event>
 976 <EventKey><![CDATA[6]]></EventKey>
 977 <SendPicsInfo><Count>1</Count>
 978 <PicList><item><PicMd5Sum><![CDATA[5a75aaca956d97be686719218f275c6b]]></PicMd5Sum>
 979 </item>
 980 </PicList>
 981 </SendPicsInfo>
 982 </xml>";
 983             request = WeChatRequest.Build(Config, PostModel, demoMsg);
 984             demoHandler = new HandlerDemo(request);
 985             Assert.IsTrue(IsOkReponse(demoHandler, "OnPushMenu拍照或者相册发图"));
 986 
 987             demoMsg = @"<xml>
 988 <ToUserName><![CDATA[gh_e136c6e50636]]></ToUserName>
 989 <FromUserName><![CDATA[oMgHVjngRipVsoxg6TuX3vz6glDg]]></FromUserName>
 990 <CreateTime>1408090816</CreateTime>
 991 <MsgType><![CDATA[event]]></MsgType>
 992 <Event><![CDATA[pic_weixin]]></Event>
 993 <EventKey><![CDATA[6]]></EventKey>
 994 <SendPicsInfo><Count>1</Count>
 995 <PicList><item><PicMd5Sum><![CDATA[5a75aaca956d97be686719218f275c6b]]></PicMd5Sum>
 996 </item>
 997 </PicList>
 998 </SendPicsInfo>
 999 </xml>";
1000             request = WeChatRequest.Build(Config, PostModel, demoMsg);
1001             demoHandler = new HandlerDemo(request);
1002             Assert.IsTrue(IsOkReponse(demoHandler, "OnPushMenu微信相册发图"));
1003 
1004             demoMsg = @"<xml>
1005 <ToUserName><![CDATA[gh_e136c6e50636]]></ToUserName>
1006 <FromUserName><![CDATA[oMgHVjngRipVsoxg6TuX3vz6glDg]]></FromUserName>
1007 <CreateTime>1408091189</CreateTime>
1008 <MsgType><![CDATA[event]]></MsgType>
1009 <Event><![CDATA[location_select]]></Event>
1010 <EventKey><![CDATA[6]]></EventKey>
1011 <SendLocationInfo><Location_X><![CDATA[23]]></Location_X>
1012 <Location_Y><![CDATA[113]]></Location_Y>
1013 <Scale><![CDATA[15]]></Scale>
1014 <Label><![CDATA[广州市海珠区客村艺苑路 106号]]></Label>
1015 <Poiname><![CDATA[]]></Poiname>
1016 </SendLocationInfo>
1017 </xml>";
1018             request = WeChatRequest.Build(Config, PostModel, demoMsg);
1019             demoHandler = new HandlerDemo(request);
1020             Assert.IsTrue(IsOkReponse(demoHandler, "OnPushMenu位置选择"));
1021             #endregion
1022 
1023 
1024             string FillDemoContent(string text) => $@"<xml>
1025  <ToUserName><![CDATA[toUser]]></ToUserName>
1026  <FromUserName><![CDATA[fromUser]]></FromUserName>
1027  <CreateTime>1348831860</CreateTime>
1028  <MsgType><![CDATA[text]]></MsgType>
1029  <Content><![CDATA[{text}]]></Content>
1030  <MsgId>1234567890123456</MsgId>
1031  </xml>";
1032             demoMsg = FillDemoContent("123");
1033             request = WeChatRequest.Build(Config, PostModel, demoMsg);
1034             demoHandler = new HandlerDemo(request);
1035             Assert.IsTrue(IsOkReponse(demoHandler, "123"));
1036 
1037             demoMsg = FillDemoContent("34567");
1038             request = WeChatRequest.Build(Config, PostModel, demoMsg);
1039             demoHandler = new HandlerDemo(request);
1040             Assert.IsTrue(IsOkReponse(demoHandler, "123456"));
1041 
1042             demoMsg = FillDemoContent("aBc");
1043             request = WeChatRequest.Build(Config, PostModel, demoMsg);
1044             demoHandler = new HandlerDemo(request);
1045             Assert.IsTrue(IsOkReponse(demoHandler, "ABc"));
1046 
1047             demoMsg = FillDemoContent("BcDeFgh");
1048             request = WeChatRequest.Build(Config, PostModel, demoMsg);
1049             demoHandler = new HandlerDemo(request);
1050             Assert.IsTrue(IsOkReponse(demoHandler, "ABcdEf"));
1051 
1052 
1053             demoMsg = @"<xml>
1054 <ToUserName><![CDATA[toUser]]></ToUserName>
1055 <FromUserName><![CDATA[FromUser]]></FromUserName>
1056 <CreateTime>123456789</CreateTime>
1057 <MsgType><![CDATA[event]]></MsgType>
1058 <Event><![CDATA[CLICK]]></Event>
1059 <EventKey><![CDATA[test_menu]]></EventKey>
1060 </xml>";
1061             request = WeChatRequest.Build(Config, PostModel, demoMsg);
1062             demoHandler = new HandlerDemo(request);
1063             Assert.IsTrue(IsOkReponse(demoHandler, "Event点击自定义菜单Test"));
1064 
1065             demoMsg = @"<xml>
1066 <ToUserName><![CDATA[toUser]]></ToUserName>
1067 <FromUserName><![CDATA[FromUser]]></FromUserName>
1068 <CreateTime>123456789</CreateTime>
1069 <MsgType><![CDATA[event]]></MsgType>
1070 <Event><![CDATA[subscribe]]></Event>
1071 <EventKey><![CDATA[qrscene_scanId]]></EventKey>
1072 <Ticket><![CDATA[TICKET]]></Ticket>
1073 </xml>";
1074             request = WeChatRequest.Build(Config, PostModel, demoMsg);
1075             demoHandler = new HandlerDemo(request);
1076             Assert.IsTrue(IsOkReponse(demoHandler, "Event扫描带参数二维码scanId"));
1077 
1078             demoMsg = @"<xml>
1079 <ToUserName><![CDATA[toUser]]></ToUserName>
1080 <FromUserName><![CDATA[FromUser]]></FromUserName>
1081 <CreateTime>123456789</CreateTime>
1082 <MsgType><![CDATA[event]]></MsgType>
1083 <Event><![CDATA[SCAN]]></Event>
1084 <EventKey><![CDATA[scanId]]></EventKey>
1085 <Ticket><![CDATA[TICKET]]></Ticket>
1086 </xml>";
1087             request = WeChatRequest.Build(Config, PostModel, demoMsg);
1088             demoHandler = new HandlerDemo(request);
1089             Assert.IsTrue(IsOkReponse(demoHandler, "Event扫描带参数二维码scanId"));
1090 
1091         }
1092         public class HandlerDemo : MessageHandler
1093         {
1094             public HandlerDemo(WeChatRequest request) : base(request)
1095             {
1096                 AddTextKeyWordHandler(new HandlerRule(HandlerContrast.Equal, "123"), (req, msg) =>
1097                  {
1098                      return WeChatResponse.ResponseText(req, "123");
1099                  });
1100                 AddTextKeyWordHandler(new HandlerRule(HandlerContrast.Contain, "456"), (req, msg) =>
1101                 {
1102                     return WeChatResponse.ResponseText(req, "123456");
1103                 });
1104                 AddTextKeyWordHandler(new HandlerRule(HandlerContrast.Superficial, "abc"), (req, msg) =>
1105                 {
1106                     return WeChatResponse.ResponseText(req, "ABc");
1107                 });
1108                 AddTextKeyWordHandler(new HandlerRule(HandlerContrast.ContainSuperficial, "def"), (req, msg) =>
1109                 {
1110                     return WeChatResponse.ResponseText(req, "ABcdEf");
1111                 });
1112 
1113                 AddEventMenuClickHandler("test_menu", (req, msg) =>
1114                 {
1115                     return WeChatResponse.ResponseText(req, "Event点击自定义菜单Test");
1116                 });
1117                 AddEventScanIdHandler("scanId", (req, msg) =>
1118                 {
1119                     return WeChatResponse.ResponseText(req, "Event扫描带参数二维码scanId");
1120                 });
1121             }
1122 
1123             public override WeChatResponse DefaultResponseMessage(WeChatRequest request)
1124             {
1125                 return null; //未定义处理的默认方法,不处理则直接返回Null以回复空字符串给微信服务器
1126             }
1127             public override WeChatResponse OnMessageText(WeChatRequest request, WeChatRequest.WeChatMessageText text)
1128             {
1129                 return WeChatResponse.ResponseText(request, "OnMessageText");
1130             }
1131             public override WeChatResponse OnMessageImage(WeChatRequest request, WeChatRequest.WeChatMessageImage image)
1132             {
1133                 return WeChatResponse.ResponseText(request, "OnMessageImage");
1134             }
1135             public override WeChatResponse OnMessageVoice(WeChatRequest request, WeChatRequest.WeChatMessageVoice voice)
1136             {
1137                 return WeChatResponse.ResponseText(request, "OnMessageVoice");
1138             }
1139             public override WeChatResponse OnMessageLocaltion(WeChatRequest request, WeChatRequest.WeChatMessageLocation location)
1140             {
1141                 return WeChatResponse.ResponseText(request, "OnMessageLocaltion");
1142             }
1143             public override WeChatResponse OnMessageVideo(WeChatRequest request, WeChatRequest.WeChatMessageVideo video)
1144             {
1145                 return WeChatResponse.ResponseText(request, "OnMessageVideo");
1146             }
1147             public override WeChatResponse OnMessageShortVideo(WeChatRequest request, WeChatRequest.WeChatMessageVideo shortVideo)
1148             {
1149                 return WeChatResponse.ResponseText(request, "OnMessageShortVideo");
1150             }
1151             public override WeChatResponse OnMessageLink(WeChatRequest request, WeChatRequest.WeChatMessageLink link)
1152             {
1153                 return WeChatResponse.ResponseText(request, "OnMessageLink");
1154             }
1155 
1156             public override WeChatResponse OnEvent关注(WeChatRequest request)
1157             {
1158                 return WeChatResponse.ResponseText(request, "OnEvent关注");
1159             }
1160             public override WeChatResponse OnEvent关注(WeChatRequest request, WeChatRequest.WeChatEvent扫描带参数二维码 msg)
1161             {
1162                 return WeChatResponse.ResponseText(request, "OnEvent关注-扫描带参数二维码");
1163             }
1164             public override void OnEvent取消关注(WeChatRequest request)
1165             {
1166                 throw new NotImplementedException("OnEvent取消关注");
1167             }
1168             public override WeChatResponse OnEvent扫描带参数二维码(WeChatRequest request, WeChatRequest.WeChatEvent扫描带参数二维码 msg)
1169             {
1170                 return WeChatResponse.ResponseText(request, "OnEvent扫描带参数二维码");
1171             }
1172             public override WeChatResponse OnEvent上报地理位置(WeChatRequest request, WeChatRequest.WeChatEvent上报地理位置 msg)
1173             {
1174                 return WeChatResponse.ResponseText(request, "OnEvent上报地理位置");
1175             }
1176             public override WeChatResponse OnEvent点击自定义菜单(WeChatRequest request, WeChatRequest.WeChatEvent点击自定义菜单 msg)
1177             {
1178                 return WeChatResponse.ResponseText(request, "OnEvent点击自定义菜单");
1179             }
1180             public override void OnEvent点击菜单跳转链接(WeChatRequest request, WeChatRequest.WeChatEvent点击菜单跳转链接 msg)
1181             {
1182                 throw new NotImplementedException("OnEvent点击菜单跳转链接");
1183             }
1184 
1185             public override WeChatResponse OnPushMenu位置选择(WeChatRequest request, WeChatRequest.WeChatMenuPush位置选择 msg)
1186             {
1187                 return WeChatResponse.ResponseText(request, "OnPushMenu位置选择");
1188             }
1189             public override WeChatResponse OnPushMenu扫码推事件(WeChatRequest request, WeChatRequest.WeChatMenuPush扫码事件 msg)
1190             {
1191                 return WeChatResponse.ResponseText(request, "OnPushMenu扫码推事件");
1192             }
1193             public override WeChatResponse OnPushMenu扫码推等待事件(WeChatRequest request, WeChatRequest.WeChatMenuPush扫码事件 msg)
1194             {
1195                 return WeChatResponse.ResponseText(request, "OnPushMenu扫码推等待事件");
1196             }
1197             public override WeChatResponse OnPushMenu系统拍照发图(WeChatRequest request, WeChatRequest.WeChatMenuPush拍照发图 msg)
1198             {
1199                 return WeChatResponse.ResponseText(request, "OnPushMenu系统拍照发图");
1200             }
1201             public override WeChatResponse OnPushMenu微信相册发图(WeChatRequest request, WeChatRequest.WeChatMenuPush拍照发图 msg)
1202             {
1203                 return WeChatResponse.ResponseText(request, "OnPushMenu微信相册发图");
1204             }
1205             public override WeChatResponse OnPushMenu拍照或者相册发图(WeChatRequest request, WeChatRequest.WeChatMenuPush拍照发图 msg)
1206             {
1207                 return WeChatResponse.ResponseText(request, "OnPushMenu拍照或者相册发图");
1208             }
1209 
1210             public override void OnPush模板消息发送结果(WeChatRequest request, WeChatRequest.WeChatPush模板消息发送结果 msg)
1211             {
1212                 throw new NotImplementedException("OnPush模板消息发送结果");
1213             }
1214             public override void OnPush群发结果(WeChatRequest request, WeChatRequest.WeChatPush群发结果 msg)
1215             {
1216                 throw new NotImplementedException("OnPush群发结果");
1217             }
1218         }
1219 
1220     }
1221 }
单元测试示例代码

 

 

 

OYMLCN.WeChat.Core微信公众平台SDK核心库(被动回复模块)现已基本完成