通过对MessageHandler的深入学习,熟练掌握微信消息通讯的所有关键技能。
- SDK源代码:https://github.com/JeffreySu/WeiXinMPSDK
- Sample源代码:Senparc.Weixin.MP.Sample
- 课堂案例源代码:https://github.com/JeffreySu/WechatVideoCourse
微信通讯流程
温故而知新,前文有。
我们需要开发的部分,正是第3部分“处理消息”

SDK已经对XML进行了封装,并且开发过程是面向对象的,所以大家不需要接触任何和XML有关的开发技能,只需要简单调用即可,就可以完成整个开发过程。
开发过程
-
创建项目,Asp.net MVC解决方案 > “Asp.net Web应用程序”
-
添加上下文处理文件(MessageContext)
“每个用户类似Session的功能”
A. 创建一个“Senparc.Service”类库(放可以共用的逻辑),第1步Web项目引用这个类库项目。
B. 创建一个类“CustomMessageContext.cs”
必须先引用Senparc.Weixin.Mp的Nuget包。
代码从如下文件拷贝。
“WeiXinMPSDK/Samples/Senparc.Weixin.MP.Sample/Senparc.Weixin.MP.Sample.CommonService/MessageHandlers/CustomMessageHandler/CustomMessageContext.cs”1. 导航到要添加NuGet软件包的项目
$ cd LuckyMoney.Service/
2. 执行添加操作
$ dotnet add package Senparc.Weixin.MP
C. 创建一个类“CustomMessageHandler”。
实现默认构造函数,其中有一个函数是“默认返回的请求”。 -
创建Controller和Action。
- 创建“WeixinController”,继承自“Controller”,增加一个如下的Action。运行测试。
public ActionResult Index()
{
return Content("Weixin/Index");
}
2. 添加appsettings.json配置
"SenparcWeixinSetting": {
"Token": "XXX",
"EncodingAESKey": "XXX",
"WeixinAppId": "XXX",
"WeixinAppSecret": "XXX"
}
3. 控制器中添加Action
public static readonly string Token = Config.SenparcWeixinSetting.Token;//与微信公众账号后台的Token设置保持一致,区分大小写。
/// <summary>
/// 微信后台验证地址(使用Get),微信后台的“接口配置信息”的Url填写如:http://sdk.weixin.senparc.com/weixin
/// </summary>
[HttpGet]
[ActionName("Index")]
public ActionResult Get(PostModel postModel, string echostr)
{
if (CheckSignature.Check(postModel.Signature, postModel.Timestamp, postModel.Nonce, Token))
{
return Content(echostr); //返回随机字符串则表示验证通过
}
else
{
return Content("failed:" + postModel.Signature + "," + CheckSignature.GetSignature(postModel.Timestamp, postModel.Nonce, Token) + "。" +
"如果你在浏览器中看到这句话,说明此地址可以被作为微信公众账号后台的Url,请注意保持Token一致。");
}
}
发布测试
发布到服务器进行测试:
测试号地址:
dotnet publish -o path
不同请求消息处理
就是在MessageHandler中override不同的方法,
例如OnEvent_LocationRequest()菜单事件,OnLocationRequest()文字信息发送地址。
1.只需要三行,就可以返回最基础的消息
[HttpPost]
[ActionName("Index")]
public ActionResult Post(PostModel postModel)
{
// 创建MessageHandler实例
var messageHandler = new CustomMessageHandler(Request.GetRequestMemoryStream(), postModel);
// InputStream
// 执行
messageHandler.Execute();
// 返回
return Content(messageHandler.FinalResponseDocument.ToString());
}
- 完善MessageHandler
var responseMessage = this.CreateResponseMessage<ResponseMessageText>();
responseMessage.Content = $"这条消息来自DefaultResponseMessage。当前服务器时间:{DateTime.Now}";
return responseMessage;
问题处理
无法获取配置值
如下代码,无法获取配置值,原因有3。
public static readonly string Token = Config.SenparcWeixinSetting.Token;
1.版本问题导致失败
2.没有在startup.cs中进行注入
3.配置文件信息不全
不同请求消息处理
例如菜单消息的处理,需要重载如下方法。
'''
public override IResponseMessageBase OnEvent_ClickRequest(RequestMessageEvent_Click requestMessage)
'''
不同响应消息处理
同上,例如想返回图文消息。
'''
var responseMessage = CreateResponseMessage<ResponseMessageNews>(); // 返回多图文
'''
在“Demo > 菜单 > 输入appID和appSecret > 获取AccessToken > 获取当前菜单”中查看菜单
在MessageHandler中“requestMessage.EventKey”就可以获取菜单信息
不返回任何消息
在MessageHandler中如下两条语句都可行,但是空字符串是不行的。
同时,为防止出错,还得添加Senparc.Weixin.MVC Nuget包。
//return null;
return new ResponseMessageNoResponse();
网友评论