using Api.MessageReceive.Service; using CommonUtil; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Caching.Memory; using Operater.DTO.TopMessage; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Xml; using WeiXinKfSDK; using WeiXinKfSDK.Request; namespace Api.MessageReceive.Controllers { /// /// 微信客服 /// /// [Route("wxback/[controller]/[action]")] [Route(TopConstants.API_ROUTE)] public class KfWxController : ControllerBase { public static string _token = "u5tsOEqTNBwKcxgGoL"; public static string _aeskey = "XIkbuXu67vOwOcWWpZ1mAdOGxJn6Gs6B6YozPHgFAhE"; public static string _gzhappid = "wxc74c0ee1cf8efafd"; /// /// 微信客服消息 /// /// [AcceptVerbs("GET", "POST")] public async Task WxKfMessage() { if (HttpContext.Request.Method.ToLower() != "post") { #region 接口校验 WXBizMsgCrypt wxcpt = new WXBizMsgCrypt(_token, _aeskey, ""); string sVerifyMsgSig = HttpContext.Request.Query["msg_signature"]; string sVerifyTimeStamp = HttpContext.Request.Query["timestamp"]; string sVerifyNonce = HttpContext.Request.Query["nonce"]; string sVerifyEchoStr = HttpContext.Request.Query["echostr"].ToString(); int ret = 0; string sEchoStr = ""; ret = wxcpt.VerifyURL(sVerifyMsgSig, sVerifyTimeStamp, sVerifyNonce, sVerifyEchoStr, ref sEchoStr); if (ret != 0) { System.Console.WriteLine("ERR: VerifyURL fail, ret: " + ret); return Content(sEchoStr); } return Content(sEchoStr); #endregion } else { #region 解析官方请求参数 StreamReader reader = new StreamReader(HttpContext.Request.Body, Encoding.UTF8); var result = reader.ReadToEndAsync().Result; reader.Close(); string sReqMsgSig = HttpContext.Request.Query["msg_signature"]; string sReqTimeStamp = HttpContext.Request.Query["timestamp"]; string sReqNonce = HttpContext.Request.Query["nonce"]; WXBizMsgCrypt wxcpt = new WXBizMsgCrypt(_token, _aeskey, ""); string sMsg = ""; // 解析之后的明文 var code = wxcpt.DecryptMsg(sReqMsgSig, sReqTimeStamp, sReqNonce, result, ref sMsg); LogUtil.Info($"服务商数据回调xmlConten---{sMsg}", $"wxkf_msg_log日志"); #endregion WxKfService.WxMessageHandle(sMsg, "wxkf_msg"); } return Ok("success"); } /// /// 公众号消息 /// /// [AcceptVerbs("GET", "POST")] public async Task GZHMessage() { if (HttpContext.Request.Method.ToLower() != "post") { #region 接口校验 WXBizMsgCryptGZH wxcpt = new WXBizMsgCryptGZH(_token, _aeskey, ""); string sVerifyMsgSig = HttpContext.Request.Query["signature"]; string sVerifyTimeStamp = HttpContext.Request.Query["timestamp"]; string sVerifyNonce = HttpContext.Request.Query["nonce"]; string sVerifyEchoStr = HttpContext.Request.Query["echostr"].ToString(); // LogUtil.Info($"[sVerifyMsgSig]:{sVerifyMsgSig}--[timestamp]:{sVerifyTimeStamp}--[nonce]:{sVerifyNonce}--[echostr]:{sVerifyEchoStr}", "gzh记录"); int ret = 0; string sEchoStr = ""; ret = wxcpt.VerifyURL(sVerifyMsgSig, sVerifyTimeStamp, sVerifyNonce, sVerifyEchoStr, ref sEchoStr); //LogUtil.Info(ret.ToString(), "gzh记录"); //LogUtil.Info(sEchoStr, "gzh记录"); if (ret != 0) { System.Console.WriteLine("ERR: VerifyURL fail, ret: " + ret); return Content(sEchoStr); } return Content(sEchoStr); #endregion } else { #region 解析官方请求参数 StreamReader reader = new StreamReader(HttpContext.Request.Body, Encoding.UTF8); var result = reader.ReadToEndAsync().Result; reader.Close(); string sReqMsgSig = HttpContext.Request.Query["signature"]; string sReqTimeStamp = HttpContext.Request.Query["timestamp"]; string sReqNonce = HttpContext.Request.Query["nonce"]; // LogUtil.Info($"[signature]:{sReqMsgSig}--[timestamp]:{sReqTimeStamp}--[nonce]:{sReqNonce}", "gzh消息记录"); WXBizMsgCryptGZH wxcpt = new WXBizMsgCryptGZH(_token, _aeskey, _gzhappid); string sMsg = ""; // 解析之后的明文 var code = wxcpt.DecryptMsg(sReqMsgSig, sReqTimeStamp, sReqNonce, result, ref sMsg); LogUtil.Info($"服务商数据回调xmlConten---{sMsg}", $"gzh_msg_log日志"); #endregion //try //{ // XmlDocument doc = new XmlDocument(); // XmlNode root; // doc.LoadXml(sMsg); // root = doc.FirstChild; // LogUtil.Info($"[MsgType]:{root["MsgType"].InnerText}--[Content]:{root["Content"].InnerText}","gzh内容"); // if(root["MsgType"].InnerText=="text"&& root["Content"].InnerText == "9001") // { // string toUser = root["ToUserName"].InnerText; // string fromUser= root["FromUserName"].InnerText; // string CreateTime= root["CreateTime"].InnerText; // string resXML = $"{sReqTimeStamp}1<![CDATA[欢迎关注]]>"; // LogUtil.Info(resXML, "gzh回复"); // string sEncryptMsg = ""; // int ret = wxcpt.EncryptMsg(resXML, sReqTimeStamp, sReqNonce, ref sEncryptMsg); // LogUtil.Info(sEncryptMsg, "gzh回复"); // return Ok(sEncryptMsg); // } //} //catch(Exception e) //{ // LogUtil.Info(e.ToString(), "gzherror"); //} WxKfService.WxMessageHandle(sMsg, "gzh_msg"); } return Ok("success"); } public async void MsgHandle(string msgType) { try { if (HttpContext.Request.Method.ToLower() == "post") { #region 解析官方请求参数 StreamReader reader = new StreamReader(HttpContext.Request.Body, Encoding.UTF8); var result = reader.ReadToEndAsync().Result; reader.Close(); string sReqMsgSig = HttpContext.Request.Query["msg_signature"]; string sReqTimeStamp = HttpContext.Request.Query["timestamp"]; string sReqNonce = HttpContext.Request.Query["nonce"]; WXBizMsgCrypt wxcpt = new WXBizMsgCrypt(_token, _aeskey, ""); string sMsg = ""; // 解析之后的明文 var code = wxcpt.DecryptMsg(sReqMsgSig, sReqTimeStamp, sReqNonce, result, ref sMsg); LogUtil.Info($"服务商数据回调xmlConten---{sMsg}", $"{msgType}_log日志"); #endregion WxKfService.WxMessageHandle(sMsg, msgType); } } catch (Exception e) { LogUtil.Info(e.ToString(), "微信客服消息error"); } } /// /// 创建公众号菜单 /// /// /// [HttpPost] public IActionResult CreateGzhMenu([FromBody] CreateMenuRequest request) { //获取token var token = WxKfService.GetGzhToken(); var response = WeiXinKfClient.CreateGzhMenu(request, token); return Ok(response); } /// /// 上传微信素材 /// /// /// [HttpPost] public IActionResult UploadWxImg([FromBody] UploadWxImgRequest request) { //获取token string imgPath = System.Environment.CurrentDirectory + "/" + request.name; var token = WxKfService.GetGzhToken(); var response = WeiXinKfClient.UploadWxMedia(imgPath, request.name, token); return Ok(response); } [HttpPost] public IActionResult GetRid([FromBody] GetRidRequest request) { var token = WxKfService.GetGzhToken(); string ridRes = WeiXinKfClient.GetGzhRid(request.Rid, token); return Ok(ridRes); } /// /// 公众号消息 /// /// [HttpPost] public IActionResult GetAuthCode([FromBody] GetAuthCodeRequest request) { //通过code获取accesstoken var codeRsp = WeiXinKfClient.GetOauth2Token(request.Code); if (codeRsp.IsNull() || codeRsp.errcode > 0) { string errmsg = codeRsp.IsNull() ? "获取token失败" : codeRsp.errmsg; return Ok(errmsg); } //通过accesstoken获取用户信息 var userInfo = WeiXinKfClient.GetGzhUserInfo(codeRsp.access_token, codeRsp.openid); if (userInfo.IsNull() || userInfo.errcode > 0) { string errmsg = userInfo.IsNull() ? "获取用户信息失败" : userInfo.errmsg; return Ok(errmsg); } WxKfService.RecordeGzhInfo(userInfo); return Ok(true); } /// /// 发送公众号模板消息 /// /// /// [HttpPost] public IActionResult SendGzhTemplateMsg([FromBody] SendTemplateMsgRequest request) { var token = WxKfService.GetGzhToken(); var rsp = WeiXinKfClient.SendTemplateMsg(request, token); return Ok(rsp); } } }