source

WordPress WooCommerce ASP.net API WebHookHandler:WebHook 요구에는 HTML Form Data 형식의 엔티티 본문이 포함되어 있어야 합니다.

ittop 2023. 3. 23. 23:10
반응형

WordPress WooCommerce ASP.net API WebHookHandler:WebHook 요구에는 HTML Form Data 형식의 엔티티 본문이 포함되어 있어야 합니다.

ASP의 WordPress WooCommerce에서 보내는 Webhooks용 WebHookHandler를 작성하려고 합니다.NET C#.

ASP를 만드는 것부터 시작했습니다.NET C# Azure API App Web Application Project 및 관련 레퍼런스 추가(Microsoft).AspNet.WebHooks.공통, Microsoft.AspNet.WebHooks.리시버, Microsoft.AspNet.WebHooks.리시버WordPress)를 클릭합니다.WebHookConfig, WordPressWebHookHandler를 추가하여 WebHookConfig를 GlobalAsax에 등록했습니다.

그리고 Azure App Service로서 어플리케이션을 공개했습니다.

내 WordPressWebHookHandler는 여전히 이 예제의 기본이며 다음과 같습니다.

public class WordPressWebHookHandler : WebHookHandler
{
    public override Task ExecuteAsync(string receiver, WebHookHandlerContext context)
    {
        // make sure we're only processing the intended type of hook
        if("WordPress".Equals(receiver, System.StringComparison.CurrentCultureIgnoreCase))
        {
            // todo: replace this placeholder functionality with your own code
            string action = context.Actions.First();
            JObject incoming = context.GetDataOrDefault<JObject>();
        }

        return Task.FromResult(true);
    }
}

WooCommerce에서 User Creation WebHook을 테스트하면 다음과 같이 로그에서 요청을 확인할 수 있습니다.

웹 훅 요청 로그

그러나 디버깅 중에 수신되지 않아 아래 오류가 나타납니다.

Webook 요청 로그 오류

WordPress 전용 WebHook이 아닌 커스텀 WebHook이 필요할 것 같습니다.또는 라우팅에서 잘못 처리되어 다른 컨트롤러가 될 수 있습니다.

어떤 도움이라도 감사합니다.

WebHookReceiver가 잘못되었습니다.

실제로 JSON을 예상해야 하는 경우 HTML Form Data를 예상하는 것과 일치하지 않습니다.

WordPressWebHookHandler는 여전히 기본입니다.

이것이 에러의 원인입니다.예를 들어,WordPressWebHookReceiver , . . . . . . . .ReceiveAsync()의 실장, 「」에의 콜 , 「」ReadAsFormDataAsync()원하는 것이 아닌 방법으로서Content-Typejson 너는 거야, 하고 싶은 거야ReadAsJsonAsync().

솔루션:사용 안 함WordPressWebHookReceiver 하다, 바꿔서 하다, 바꿔서 쓰다, 바꿔서 쓰다, 이렇게 해요.ReadAsJsonAsync().


코드를 보다

WordPress 전용 WebHook이 아닌 커스텀 WebHook이 필요할 것 같습니다.

옳은 생각이셨군요, 그래서 왜 이런 일이 일어났는지 설명하려고 코드를 좀 찾아봤어요.

은 음음음 the the the the the the the the the the 。ReceiveAsync()WordPressWebHookReceiver에서 덮어쓰는 메서드입니다.콜하고 있는 것을 알 수 있습니다.ReadAsFormDataAsync()그건 네가 원하는 게 아니야

public override async Task<HttpResponseMessage> ReceiveAsync(
    string id, HttpRequestContext context, HttpRequestMessage request)
{
    ...
    if (request.Method == HttpMethod.Post)
    {
        // here is what you don't want to be called
        // you want ReadAsJsonAsync(), In short, USE A DIFFERENT RECEIVER.
        NameValueCollection data = await ReadAsFormDataAsync(request);
        ...
    }
    else
    {
       return CreateBadMethodResponse(request);
    }
}

내 에서퀵 - 장 the the the the the the the the the the that the the that that that that that that the를 합니다.ReadAsJsonAsync()method 다음의 하고 있는 있습니다.

  1. DynamicsCrmWebHookReceiver
  2. Zendesk Web Hook Receiver
  3. AzureAlertWebHookReceiver
  4. Kudu Web Hook Receiver
  5. MyGetWebHookReceiver
  6. Vsts Web Hook Receiver
  7. Bitbucket WebHookReceiver
  8. 커스텀 Web Hook Receiver
  9. 드롭박스 WebHookReceiver
  10. GitHub WebHookReceiver
  11. Paypal Web Hook Receiver
  12. 스트라이프 Web Hook Receiver
  13. Pusher Web Hook Receiver

Custom WebHookReceiver가 고객의 요건에 적합하다고 생각했기 때문에 여기서 NuGet을 사용할 수 있습니다.그렇지 않으면 자신의 것을 실장하거나 이 클래스에서 파생할 수 있습니다.


WebHook Receivier 설정

(Microsoft 문서에서 복사)

마이크로소프트(MS.AspNet.WebHooks.리시버Custom은 ASP에 의해 생성된 WebHook 수신을 지원합니다.NET 웹 훅

즉시 Dropbox, GitHub, MailChimp, PayPal, Pusher, Salesforce, Slack, Stripe, Traello, WordPress를 지원할 수 있지만 다른 공급업체는 얼마든지 지원할 수 있습니다.

WebHook 리시버 초기화

으로 WebHook 리시버, WebHook 리시버에 등록함으로써 됩니다.WebApiConfig를를들

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        ...

        // Load receivers
        config.InitializeReceiveGitHubWebHooks();
    }
}

요청하신 데이터 형식에 문제가 있습니다.오류 메시지에 표시된 대로 HTML Form 형식을 사용해야 합니다.

여기에서는, 적절한 POST 데이터 형식에 대해 설명합니다.파라미터는 HTTP POST 요구로 어떻게 송신됩니까?

"Content-Length" "Content-Type" "Content-Type" "Content-Length는 "Content-Type" 입니다., 컨텐츠의 은 「」입니다.application/x-www-form-urlencoded.

이제 개념 증명(Proof-of-concept)이 완료되었기 때문에 Svek의 답변에 몇 가지 추가 사항을 추가하고 수신기에 대해 좀 더 이해하고 싶습니다.

그의 대답은 나에게 올바른 방향을 제시해 주었지만, 약간의 추가가 필요하다.

Wordpress WebHook Receiver HttpPost 유형의 Wordpress Webhook을 사용할 수 있습니다.Woocommerce는 Json Webhook 메시지를 전송하고 Wordpress WebHookReceiver 클래스에 내장된HttpPost 검증에 실패하기 때문에 Woocommerce에서는 동작하지 않습니다.

Custom Web Hook Receiver 커스텀 ASP를 도입할 수 있습니다.NET 웹 훅커스텀 ASPNET 웹 훅에는 'ms-signature'를 포함하지만 이에 한정되지 않는 특정 검증 파트너가 있습니다.시그니처는 메시지를 암호화하기 위해 즉시 사용할 수 있는 Woocommerce와는 다른 방법으로 사용되므로 헤더를 추가하는 것만으로는 충분하지 않습니다.기본적으로 Woocommerce의 Webhook 클래스를 변경하지 않고는 Woocommerce를 Custom WebHookReceiver와 통합할 수 없습니다.

Generic WebHookReceiver 기본적으로 Json 데이터의 범용 세트를 받아 들여 asp.net api 애플리케이션의 web.config에서 추가할 수 있는 비밀을 확인하기 위해 "code" 쿼리 파라미터를 사용할 수 있습니다.이 리시버를 사용하여 개념 증명을 완료하고 서명 검증과 배트의 동작권 메시지 해독을 모두 받았습니다.

실제 솔루션으로 구축하기 시작할 기본 클래스는 아래에서 볼 수 있으며 클래스에서 호출하는 메서드에서 JObject를 동적 객체로 변경할 수 있습니다.보시다시피 현재 두 가지 방법이 추가되어 있습니다.하나는 고객 작성용이고 다른 하나는 주문 작성용이며, 각 메서드를 호출하여 다이내믹스 365(이전 CRM)에 삽입할 수 있습니다.

public class GenericJsonWebHookHandler : WebHookHandler
{
    public GenericJsonWebHookHandler()
    {
        this.Receiver = "genericjson";
    }

    public override Task ExecuteAsync(string generator, WebHookHandlerContext context)
    {
        var result = false;

        try
        {
            // Get JSON from WebHook
            var data = context.GetDataOrDefault<JObject>();

            if(context.Id != "crcu" && context.Id != "cror")
                return Task.FromResult(true);

            if (context.Id == "crcu")
            {
                result = WoocommerceCRMIntegrations.Entities.Contact.CreateContactInCRM(data);
            }
            else if (context.Id == "cror")
            {
                result = WoocommerceCRMIntegrations.Entities.Order.CreateOrderInCRM(data);
            }
        }
        catch (Exception ex)
        {
            result = false;
        }


        return Task.FromResult(result);
    }
}

언급URL : https://stackoverflow.com/questions/42293940/wordpress-woocommerce-asp-net-api-webhookhandler-the-webhook-request-must-conta

반응형