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을 테스트하면 다음과 같이 로그에서 요청을 확인할 수 있습니다.
그러나 디버깅 중에 수신되지 않아 아래 오류가 나타납니다.
WordPress 전용 WebHook이 아닌 커스텀 WebHook이 필요할 것 같습니다.또는 라우팅에서 잘못 처리되어 다른 컨트롤러가 될 수 있습니다.
어떤 도움이라도 감사합니다.
WebHookReceiver가 잘못되었습니다.
실제로 JSON을 예상해야 하는 경우 HTML Form Data를 예상하는 것과 일치하지 않습니다.
WordPressWebHookHandler는 여전히 기본입니다.
이것이 에러의 원인입니다.예를 들어,WordPressWebHookReceiver
, . . . . . . . .ReceiveAsync()
의 실장, 「」에의 콜 , 「」ReadAsFormDataAsync()
원하는 것이 아닌 방법으로서Content-Type
json
너는 거야, 하고 싶은 거야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 다음의 하고 있는 있습니다.
- DynamicsCrmWebHookReceiver
- Zendesk Web Hook Receiver
- AzureAlertWebHookReceiver
- Kudu Web Hook Receiver
- MyGetWebHookReceiver
- Vsts Web Hook Receiver
- Bitbucket WebHookReceiver
- 커스텀 Web Hook Receiver
- 드롭박스 WebHookReceiver
- GitHub WebHookReceiver
- Paypal Web Hook Receiver
- 스트라이프 Web Hook Receiver
- 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
'source' 카테고리의 다른 글
JSON 개체에 null 값을 넣을 수 없습니다. (0) | 2023.03.23 |
---|---|
Wordpress 사용자 지정 게시 유형이 관리 왼쪽 사이드바 메뉴에 표시되지 않음 (0) | 2023.03.23 |
경고: 실패한 하위 컨텍스트 유형:'cellRenderer'에 제공된 'number' 유형의 하위 컨텍스트 'virtualizedCell.cellKey'가 잘못되었습니다. 'string'이 필요합니다. (0) | 2023.03.23 |
JS 해시 변경 이벤트 관련 msie 문제 (0) | 2023.03.23 |
헤더 이미지를 올바르게 응답시키려면 어떻게 해야 합니까? (0) | 2023.03.23 |