using BN.Data;
using Newtonsoft.Json.Linq;
using System;
using System.Configuration;
using System.IO;
using System.Net.Http;
using System.Text;
using System.Web;
using System.Web.Http;
using System.Xml;
using WebApi.Jwt.cls;
//获取消息加密解密算法,腾讯提供
//https://work.weixin.qq.com/api/doc/10514
//https://work.weixin.qq.com/api/doc/90000/90138/90307#c#库
namespace WebApi.Jwt.Controllers
{
public class QywxReceiveMessageController : BaseController
{
private WorkWeiXinReceiveMessage wx
{
get { return new WorkWeiXinReceiveMessage(base.sToken, base.sEncodingAESKey); }
}
/// <summary>
/// 接受消息的API
/// </summary>
/// <param name="contex"></param>
/// <returns></returns>
[AllowAnonymous, HttpGet, HttpPost]
public HttpResponseMessage Index()
{
var msg_signature = HttpContext.Current.Request.QueryString["msg_signature"].ToString();
var timestamp = HttpContext.Current.Request.QueryString["timestamp"].ToString();
var nonce = HttpContext.Current.Request.QueryString["nonce"].ToString();
//设置推送的URL
if (HttpContext.Current.Request.HttpMethod.ToUpper() == "GET")
{
var echostr = HttpContext.Current.Request.QueryString["echostr"].ToString();
var sEchoStr = wx.VerifyURL(msg_signature, timestamp, nonce, echostr);
return new HttpResponseMessage
{
Content = new StringContent(sEchoStr, Encoding.GetEncoding("UTF-8"), "text/plain")
};
}
//捕捉事件
var evnentXml = string.Empty;
using (StreamReader sr = new StreamReader(HttpContext.Current.Request.InputStream))
{
evnentXml = sr.ReadToEnd();
}
//LogHelper.Debug(xmlDoc.DocumentElement.SelectSingleNode("Encrypt").InnerText);
evnentXml = wx.DecryptMsg(msg_signature, timestamp, nonce, evnentXml);
LogHelper.Debug(evnentXml);
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(evnentXml);
var ToUserName = xmlDoc.DocumentElement.SelectSingleNode("ToUserName").InnerText;
var FromUserName = xmlDoc.DocumentElement.SelectSingleNode("FromUserName").InnerText;
var CreateTime = xmlDoc.DocumentElement.SelectSingleNode("CreateTime").InnerText;
var Event = xmlDoc.DocumentElement.SelectSingleNode("Event").InnerText;
var MsgType = xmlDoc.DocumentElement.SelectSingleNode("MsgType").InnerText;
var EventKey = xmlDoc.DocumentElement.SelectSingleNode("EventKey").InnerText;
var sRespData = $@"<xml>
<ToUserName><![CDATA[{ToUserName}]]></ToUserName>
<FromUserName><![CDATA[{FromUserName}]]></FromUserName>
<CreateTime>{CreateTime}</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[this is a test,中国{Event},{MsgType},{EventKey}]]></Content>
</xml>";
string sEncryptXML = wx.EncryptMsg( timestamp, nonce,sRespData);
return new HttpResponseMessage
{
Content = new StringContent(sEncryptXML, Encoding.GetEncoding("UTF-8"), "text/xml")
};
}
}
}
本机可以安装花生壳,方便调试
using BN.Data;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Web;
namespace WebApi.Jwt.cls
{
public class WorkWeiXinReceiveMessage
{
private string sToken { get; set; }
private string sEncodingAESKey { get; set; }
Tencent.WXBizMsgCrypt Wxcpt { get; set; }
public WorkWeiXinReceiveMessage(string sToken, string sEncodingAESKey)
{
this.sToken = sToken;
this.sEncodingAESKey = sEncodingAESKey;
this.Wxcpt = new Tencent.WXBizMsgCrypt(sToken, sEncodingAESKey, ConfigurationManager.AppSettings["corpid"].ToString());
}
/// <summary>
/// 验证VerifyURL
/// </summary>
/// <returns></returns>
public string VerifyURL(string msg_signature, string timestamp, string nonce, string echostr)
{
string sEchoStr = "";
int ret = Wxcpt.VerifyURL(msg_signature, timestamp, nonce, echostr, ref sEchoStr);
if (ret != 0)
{
LogHelper.Error("ERR: VerifyURL fail, ret: " + ret);
return string.Empty;
}
return sEchoStr;
}
/// <summary>
/// DecryptMsg,解密
/// </summary>
/// <returns></returns>
public string DecryptMsg(string msg_signature, string timestamp, string nonce, string ciphertext)
{
string sEchoStr = "";
int ret = Wxcpt.DecryptMsg(msg_signature, timestamp, nonce, ciphertext, ref sEchoStr);
if (ret != 0)
{
LogHelper.Error("ERR: DecryptMsg fail, ret: " + ret);
return string.Empty;
}
return sEchoStr;
}
/// <summary>
/// EncryptMsg ,加密
/// </summary>
/// <returns></returns>
public string EncryptMsg(string timestamp, string nonce, string text)
{
string sEchoStr = "";
int ret = Wxcpt.EncryptMsg(text, timestamp, nonce, ref sEchoStr);
if (ret != 0)
{
LogHelper.Error("ERR: EncryptMsg fail, ret: " + ret);
return string.Empty;
}
return sEchoStr;
}
/// <summary>
/// 获取时间戳
/// </summary>
/// <returns></returns>
public static string GetTimeStamp()
{
TimeSpan ts = DateTime.Now - new DateTime(1970, 1, 1, 0, 0, 0, 0);
return Convert.ToInt64(ts.TotalSeconds).ToString();
}
}
}```