Beispiel #1
0
        /// <summary>
        /// 使用默认公众号
        /// </summary>
        /// <param name="httpContext"></param>
        /// <returns></returns>
        static async Task WxServerResponse(HttpContext httpContext)
        {
            if (httpContext.Request.Method.EqualsIgnoreCase("get"))
            {
                // get请求用于验证
                httpContext.Request.Query.TryGetValue("echostr", out var echoStr);
                await WriteText(httpContext, echoStr);

                return;
            }
            else
            {
                try
                {
                    httpContext.Request.Query.TryGetValue("signature", out var signature);
                    httpContext.Request.Query.TryGetValue("timestamp", out var timestamp);
                    httpContext.Request.Query.TryGetValue("nonce", out var nonce);
                    httpContext.Request.Query.TryGetValue("msg_signature", out var msgSignature);
                    var wxSettings   = httpContext.RequestServices.GetRequiredService <IOptions <WxOptions> >().Value;
                    var wxApiOptions = httpContext.RequestServices.GetRequiredService <IOptions <WxAspNetCoreOptions> >().Value;

                    var       defaultMp = wxSettings.GetDefaultMp();
                    PostModel postModel = new PostModel
                    {
                        Signature      = signature,
                        Timestamp      = timestamp,
                        Nonce          = nonce,
                        Token          = defaultMp.Token,
                        EncodingAESKey = defaultMp.EncodingAESKey,
                        AppId          = defaultMp.AppId,
                        Msg_Signature  = msgSignature
                    };

                    if (!CheckSignature.Check(postModel.Signature, postModel.Timestamp, postModel.Nonce,
                                              postModel.Token))
                    {
                        await WriteText(httpContext, "success");

                        return;
                    }

                    var messageHandler = new WxMessageHandler(httpContext, httpContext.Request.GetRequestMemoryStream(),
                                                              postModel, 10);
                    await messageHandler.ExecuteAsync(CancellationToken.None);

                    if (messageHandler.ResponseMessage == null ||
                        messageHandler.FinalResponseDocument == null ||
                        messageHandler.ResponseMessage is ResponseMessageNoResponse)
                    {
                        await WriteText(httpContext, "success");

                        return;
                    }

                    // 如果请求需要转发
                    if (messageHandler.ResponseMessage is ResponseRedirect responseRedirect)
                    {
                        var url =
                            $"{(responseRedirect).Host.TrimEnd('/')}{wxApiOptions.WxServerResponse}" +
                            httpContext.Request.QueryString.Value;
                        // 这里没有form参数
                        var body = httpContext.Request.Body.ReadToString();
                        var res  = await HttpHelper.Post(url, body, httpContext.Request.ContentType);
                        await WriteText(httpContext, res.Content);

                        return;
                    }

                    // 输出xml响应
                    await WriteText(httpContext, messageHandler.FinalResponseDocument.ToString());
                }
                catch (Exception ex)
                {
                    var logger = httpContext.RequestServices.GetService <ILoggerFactory>()
                                 .CreateLogger(nameof(WxServerResponse));
                    logger.LogError(ex, "微信服务器响应错误");
                    await WriteText(httpContext, "success");
                }
            }
        }