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
|
{
|
/// <summary>
|
/// 微信客服
|
/// </summary>
|
///
|
[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";
|
/// <summary>
|
/// 微信客服消息
|
/// </summary>
|
/// <returns></returns>
|
[AcceptVerbs("GET", "POST")]
|
public async Task<IActionResult> 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");
|
}
|
|
/// <summary>
|
/// 公众号消息
|
/// </summary>
|
/// <returns></returns>
|
[AcceptVerbs("GET", "POST")]
|
public async Task<IActionResult> 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 = $"<xml><ToUserName><![CDATA[{toUser}]]></ToUserName><FromUserName><![CDATA[{fromUser}]]></FromUserName><CreateTime>{sReqTimeStamp}</CreateTime><MsgType><![CDATA[news]]></MsgType><ArticleCount>1</ArticleCount><Articles><item><Title><![CDATA[欢迎关注]]></Title><Description><![CDATA[欢迎语]]></Description><PicUrl><![CDATA[https://yanfeiobpub.obs.cn-east-3.myhuaweicloud.com/dfg/8%E6%9C%88%E9%82%80%E8%AF%B7%E6%B4%BB%E5%8A%A8topbanner.png]]></PicUrl><Url><![CDATA[mp://QQdaIgLEddo5U6H]]></Url></item></Articles></xml>";
|
// 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");
|
}
|
}
|
|
/// <summary>
|
/// 创建公众号菜单
|
/// </summary>
|
/// <param name="request"></param>
|
/// <returns></returns>
|
|
[HttpPost]
|
public IActionResult CreateGzhMenu([FromBody] CreateMenuRequest request)
|
{
|
//获取token
|
var token = WxKfService.GetGzhToken();
|
var response = WeiXinKfClient.CreateGzhMenu(request, token);
|
return Ok(response);
|
}
|
|
|
/// <summary>
|
/// 上传微信素材
|
/// </summary>
|
/// <param name="request"></param>
|
/// <returns></returns>
|
[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);
|
}
|
|
/// <summary>
|
/// 公众号消息
|
/// </summary>
|
/// <returns></returns>
|
[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);
|
}
|
|
/// <summary>
|
/// 发送公众号模板消息
|
/// </summary>
|
/// <param name="request"></param>
|
/// <returns></returns>
|
[HttpPost]
|
public IActionResult SendGzhTemplateMsg([FromBody] SendTemplateMsgRequest request)
|
{
|
var token = WxKfService.GetGzhToken();
|
var rsp = WeiXinKfClient.SendTemplateMsg(request, token);
|
return Ok(rsp);
|
}
|
}
|
}
|