public async Task <string> Valid([FromQuery] WeChatValidDto validDto) { using (var reader = new StreamReader(Request.Body)) { var body = await reader.ReadToEndAsync(); return(await _weChatConfigServices.Valid(validDto, body)); } }
public async Task <string> Valid(WeChatValidDto validDto, string body) { WeChatXMLDto weChatData = null; string objReturn = null; try { _logger.LogInformation("会话开始"); if (string.IsNullOrEmpty(validDto.publicAccount)) { throw new Exception("没有微信公众号唯一标识id数据"); } var config = await QueryById(validDto.publicAccount); if (config == null) { throw new Exception($"公众号不存在=>{validDto.publicAccount}"); } _logger.LogInformation(JsonHelper.GetJSON <WeChatValidDto>(validDto)); var token = config.interactiveToken;//验证用的token 和access_token不一样 string[] arrTmp = { token, validDto.timestamp, validDto.nonce }; Array.Sort(arrTmp); string combineString = string.Join("", arrTmp); string encryption = MD5Helper.Sha1(combineString).ToLower(); _logger.LogInformation( $"来自公众号:{validDto.publicAccount}\r\n" + $"微信signature:{validDto.signature}\r\n" + $"微信timestamp:{validDto.timestamp}\r\n" + $"微信nonce:{validDto.nonce}\r\n" + $"合并字符串:{combineString}\r\n" + $"微信服务器signature:{validDto.signature}\r\n" + $"本地服务器signature:{encryption}" ); if (encryption == validDto.signature) { //判断是首次验证还是交互? if (string.IsNullOrEmpty(validDto.echoStr)) { //非首次验证 weChatData = XmlHelper.ParseFormByXml <WeChatXMLDto>(body, "xml"); weChatData.publicAccount = validDto.publicAccount; objReturn = await HandleWeChat(weChatData); } else { //首次接口地址验证 objReturn = validDto.echoStr; } } else { objReturn = "签名验证失败"; } } catch (Exception ex) { _logger.LogInformation($"会话出错(信息)=>\r\n{ex.Message}"); _logger.LogInformation($"会话出错(堆栈)=>\r\n{ex.StackTrace}"); //返回错误给用户 objReturn = string.Format(@$ "<xml><ToUserName><![CDATA[{weChatData?.FromUserName}]]></ToUserName> <FromUserName><![CDATA[{weChatData?.ToUserName}]]></FromUserName>