调式返回xml格式正确却提示“该公众号提供的服务出现故障”

这里的配置已经是验证通过了
在这里插入图片描述
调试测试接口也是按照规定返回数据,但是还是提示”该公众号提供的服务出现故障,请稍后再试“的问题,各种度娘费了各种尝试。终于知道问题所在了。先看调式输出的内容 如下:
在这里插入图片描述
再看官方文档解释说明
在这里插入图片描述
对比一下终于发现 FromUserName (开发者微信号)?? ,晕死了,我这里竟然用错 开发者ID(AppID) ,大意了。更改这里再次调试终于好了。~~~
FromUserName 可以使用 **原始ID **或者 微信号
如图:
在这里插入图片描述
在这里插入图片描述
下面是 .net core 实现代码

  [ControllerName("WeChat")]
    [Route("/wechat")]
    public class WeChatController : AbpController
    {
        private readonly SignatureChecker _signatureChecker;
        private readonly IConfiguration _configuration;
        private readonly ILogger<WeChatController> _logger;
        public WeChatController(SignatureChecker signatureChecker, IConfiguration configuration, ILogger<WeChatController> logger)
        {
            _signatureChecker = signatureChecker;
            _configuration = configuration;
            _logger = logger;
        }
        //微信服务器验证
        [HttpGet]
        [Route("service")]
        public async Task<string> Service(VerifyRequestDto input)
        {
           
            string token = _configuration["App:WeChat:ToKen"];
            string str;
            if (_signatureChecker.Validate(token, input.Timestamp, input.Nonce, input.Signature))
                str = input.EchoStr;
            else
                str = "非法参数";
            return await Task.FromResult(str);
        }
       
        [HttpPost]
        [Route("service")]
        public async Task Service()
        {
            try
            {
                var query = HttpContext.Request.QueryString;
                _logger.LogInformation("接收到的参数 " + query.ToString());
                using (var streamReader = new StreamReader(HttpContext.Request.Body, Encoding.UTF8))
                {
                    //string content = sr.ReadToEnd();  //.Net Core 3.0 默认不再支持同步读取
                    string content = streamReader.ReadToEndAsync().Result;
                }
                //这里可以从 HttpContext.Request.QueryString 中获取openid
                string msg = reText("你微信号", "你需要发送用户的 openid");
                await HttpContext.Response.WriteAsync(msg);
            }
            catch (Exception ex)
            {
                _logger.LogException(ex);
                //记录异常日志
                return;
            }

        }
        private string reText(string FromUserName, string openid)
        {
            StringBuilder resxml = new StringBuilder(string.Format("<xml><ToUserName><![CDATA[{0}]]></ToUserName><FromUserName><![CDATA[{1}]]></FromUserName><CreateTime>{2}</CreateTime>", openid, FromUserName, DateTimeToUnixTimestamp(DateTime.Now)));
            resxml.AppendFormat("<MsgType><![CDATA[text]]></MsgType><Content><![CDATA[{0}]]></Content></xml>", "你好呀");
            return resxml.ToString();
        }
        public static long DateTimeToUnixTimestamp(DateTime dateTime)
        {
            var start = new DateTime(1970, 1, 1, 0, 0, 0, dateTime.Kind);
            return Convert.ToInt64((dateTime - start).TotalSeconds);
        }
    }

 public class SignatureChecker : ITransientDependency
    {
        /// <summary>
        /// 校验请求参数是否有效。
        /// </summary>
        /// <param name="token"></param>
        /// <param name="timeStamp"></param>
        /// <param name="nonce"></param>
        /// <param name="signature"></param>
        /// <returns>返回 true 说明是有效请求,返回 false 说明是无效请求。</returns>
        public bool Validate(string token, string timeStamp, string nonce, string signature)
        {
            var paraArray = new[] { token, timeStamp, nonce }.OrderBy(x => x).ToArray();
            var paraString = string.Join(string.Empty, paraArray);
            var bytes = SHA1.Create().ComputeHash(Encoding.UTF8.GetBytes(paraString));

            var signStrBuilder = new StringBuilder();

            foreach (var @byte in bytes)
            {
                signStrBuilder.Append($"{@byte:x2}");
            }

            return signStrBuilder.ToString().Equals(signature);
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值