在企业微信的开发中,为了实现企业应用与企业微信的双向通信, 企业可以开发一个 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 来获取其中的业务数据。