Beispiel #1
0
        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>