在 .NET Core 中实现企业微信消息接收服务

在企业微信的开发中,为了实现企业应用与企业微信的双向通信, 企业可以开发一个 WebApi 供企业微信后台调用,以返回消息,事件等。

下载官方加解密库

为保证信息安全, 消息接收服务中传递的消息会被加密,因此企业应用中需要实现与企业微信后台服务相兼容的加密、解密算法。 幸运的是企业微信官方已经提供好了该加密、解密算法的、各种语言的库,只需要下载并引入企业应用项目中即可使用。

因此,首先从官方地址下载库,本文使用 C#库

下载后是一个名为: csharp.zip 文件,解压以后发现里面有三个程序文件, 分别是: Cryptography.cs, WXBizMsgCrypt.cs, Sample.cs。 我们可以在开发项目中新建一个名为 Tencent 的目录,然后把 Cryptography.cs, WXBizMsgCrypt.cs 这两个文件复制到该目录中,然后我们就可以直接在项目中使用了。

新建一个 WebApi

为了让企业微信后台能调用应用的服务,我们需要建立一个 WebApi, 在例子中,我们命名为: CallbackController, 简单的实现代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using System.IO;

using Tencent;

namespace WxServer.Controllers
{
[ApiController]
[Route("/api/v1/qy/cb")]
public class CallbackController : ControllerBase
{
private string corpId = "xxxx";

private string appToken = "xxxx";

private string encodingAESKey = "xxxx";

private WXBizMsgCrypt wxCrypt = null;

private readonly ILogger<JSSDKController> _logger;

public CallbackController(ILogger<JSSDKController> logger) {

wxCrypt = new WXBizMsgCrypt(appToken, encodingAESKey, corpId);
_logger = logger;
}
}
}

实现URL验证接口

要配置消息接收服务,首先需要开启接收消息(官方文档), 需要在 .NET Core 中实现一个 GET 方法的 WebApi,

该 api 接收由企业微信后台通过 URL 传过来的参数。然后将其中的 echostr 解密后返回给企业微信后台, 对应的 .net core 代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[HttpGet]
public string verify() {

string msgSignature = Request.Query["msg_signature"];
string sTimestamp = Request.Query["timestamp"];
string nonce = Request.Query["nonce"];
string echostr = Request.Query["echostr"];

int ret = 0;
string sEchoStr = "";

ret = wxCrypt.VerifyURL(msgSignature, sTimestamp, nonce, echostr, ref sEchoStr);
if (ret != 0) {
_logger.LogDebug("fail to verifyURL, res = {0}", ret);
}
return sEchoStr;
}

实现消息接收接口

直接上代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[HttpPost]
public async Task<string> receive() {

string msgSignature = Request.Query["msg_signature"];
string sTimestamp = Request.Query["timestamp"];
string nonce = Request.Query["nonce"];
string body = "";

using(StreamReader reader = new StreamReader(Request.Body))
{
body = await reader.ReadToEndAsync();
}

int ret = 0;
string sMsg = "";
ret = wxCrypt.DecryptMsg(msgSignature, sTimestamp, nonce, body, ref sMsg);
if (ret != 0) {
_logger.LogDebug("fail to decryptMsg, res = {0}", ret);
}
_logger.LogDebug("receive msg = {sMsg}", sMsg);

return "";

}

最后得到的 sMsg 是一个明文的字符串,xml 格式,我们需要用对应的 xml api 来获取其中的业务数据。

本文标题:在 .NET Core 中实现企业微信消息接收服务

文章作者:Morning Star

发布时间:2020年06月18日 - 17:06

最后更新:2021年04月16日 - 15:04

原始链接:https://www.mls-tech.info/dotnet/aspnet-core-wx-callback/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。