using OASystem.Domain.Dtos.CallBack.QiYeWeChat;
namespace OASystem.API.Controllers
{
///
/// 回调地址
///
[Route("/callback")]
public class CallbackController : Controller
{
private readonly IMapper _mapper;
private readonly ILogger _logger;
#region 企业微信 通讯录通知回调key And token
private readonly string _qiYeWechat_Token = "WWiCDK";
private readonly string _qiYeWechat_EncodingAESKey = "3BWKiWnvp6xJGQ5oD3TBaOKYniNgX1g6kZZEehbM3ym";
private readonly string _qiYeWechat_CorpId = "wwe978bef5495a0728";
#endregion
public CallbackController(IMapper mapper, ILogger logger)
{
_mapper = mapper;
_logger = logger;
}
#region 企业微信回调
///
/// 回调通知
///
///
[Route("memberschange")]
[HttpGet, HttpPost]
public async Task ApproveCallBack(string msg_signature, string timestamp, string nonce, string echostr)
{
_logger.LogInformation("【企业微信】【通讯录助手】【回调】进入回调");
ApproveCallBackInputDTO input = new ApproveCallBackInputDTO();
input.msg_signature = msg_signature;
input.timestamp = timestamp;
input.nonce = nonce;
input.echostr = echostr;
_logger.LogInformation("【企业微信】【通讯录助手】【回调】【参数】" + input.ToJson());
if (HttpContext.Request.Method == System.Net.Http.HttpMethod.Get.Method)
{
var model = await VerifyURLCallBack(input);
return Content(model, "text/xml");
}
if (HttpContext.Request.Method == System.Net.Http.HttpMethod.Post.Method)
{
var stream = Request.Body;
var model = await ApproveCallBack(stream, input);
return Content(model, "text/xml");
}
_logger.LogInformation("【企业微信】【通讯录助手】【回调】回调成功");
return Content("ok", "text/xml");
}
///
/// 验证URL有效性
///
///
private async Task VerifyURLCallBack(ApproveCallBackInputDTO input)
{
int ret = 0;
string sEchoStr = "";
try
{
//企业微信官方加解密校验解析类
Tencent.WXBizMsgCrypt wxcpt = new Tencent.WXBizMsgCrypt(_qiYeWechat_Token, _qiYeWechat_EncodingAESKey, _qiYeWechat_CorpId);
string sReqMsgSig = input.msg_signature;
string sReqTimeStamp = input.timestamp;
string sReqNonce = input.nonce;
string sReqEchostr = input.echostr;
//企业微信官方验证URL
ret = wxcpt.VerifyURL(sReqMsgSig, sReqTimeStamp, sReqNonce, sReqEchostr, ref sEchoStr);
if (ret != 0)
{
throw new Exception($"ERR: VerifyURL fail, ret: {ret}");
}
return sEchoStr;
}
catch (Exception ex)
{
return ex.Message;
}
}
///
/// 回调通知处理业务
///
///
private async Task ApproveCallBack(Stream context, ApproveCallBackInputDTO input)
{
var sReqData = "";
int ret = 0;
string sMsg = "";
try
{
//企业微信官方加解密校验解析类
Tencent.WXBizMsgCrypt wxcpt = new Tencent.WXBizMsgCrypt(_qiYeWechat_Token, _qiYeWechat_EncodingAESKey, _qiYeWechat_CorpId);
string sReqMsgSig = input.msg_signature;
string sReqTimeStamp = input.timestamp;
string sReqNonce = input.nonce;
string sReqEchostr = input.echostr;
// Post请求的密文数据
using (var reader = new StreamReader(context))
{
sReqData = await reader.ReadToEndAsync();
}
//回调数据
// 解析之后的明文
ret = wxcpt.DecryptMsg(sReqMsgSig, sReqTimeStamp, sReqNonce, sReqData, ref sMsg);
if (ret != 0)
{
throw new Exception($"ERR: Decrypt Fail, ret: {ret}");
}
// ret==0表示解密成功,sMsg表示解密之后的明文xml串
//下一步处理实际业务数据了
return sMsg;
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
#endregion
}
}