programing

WooCommerce Webhook: 잘못된 URL

closeapi 2023. 4. 1. 09:19
반응형

WooCommerce Webhook: 잘못된 URL

주문 작성 시 웹 훅을 작동하도록 WooCommerce를 셋업하고 있습니다.웹 훅의 URL을 이 목적을 위해 설정한 로컬 웹 API의 URL로 설정했습니다.

http://localhost:3000/store/orders/new

WooCommerce는 올바른 데이터 payload를 사용하여 웹 훅을 트리거하지만 웹 훅 로그에는 요청이 실패한 것으로 보고됩니다.

Status: HTTP http_request_failed Es wurde keine gültige URL übermittelt.: Array

독일어로 번역하면 "유효한 URL이 전달되지 않았습니다"를 의미합니다.

그 후 URL을 당사의 API(https://xxx.azurewebsites.net/store/order/new),의 웹 방향 배치로 변경했는데, API에 의해 웹 훅이 문제없이 수신되었습니다.

WC Webhook이 커스텀 포트(내 경우는 포트 3000)를 가진 URL에서 잘 재생되지 않는지 잘 모르겠습니다.그래서 WC Webhook을 로컬호스트 개발 환경에서 잘 재생시킬 수 있는 방법이 있는지 묻고 싶었습니다.

WooCommerce 버전 3.3.5에서는 Bjorn의 솔루션이 작동하지 않는 것 같습니다.

내 경우엔 파일을 편집해야 했다.wp-content/plugins/woocommerce/includes/class-wc-webhook.php:185,방법deliver.

코멘트:wp_safe_remote_request대신 안전하지 않은http 요구 방식을 사용합니다.

// Webhook away!
$http_call = _wp_http_get_object();
$response = $http_call->request( $this->get_delivery_url(), $http_args );
//$response = wp_safe_remote_request( $this->get_delivery_url(), $http_args );

파일 끝에 wp-content/temes/MYTHEME/functions 코드를 삽입하여 해결했습니다.php

function allow_unsafe_urls ( $args ) {
       $args['reject_unsafe_urls'] = false;
       return $args;
    } ;

add_filter( 'http_request_args', 'allow_unsafe_urls' );

커스텀 포트가 아니라 localhost입니다.

wp-includes/http.php wp_http_validate_url()에는 true를 반환하는http_request_host_is_external 필터에 의해 특별히 허가되지 않는 한 모든 종류의 로컬 IP를 거부하는 체크가 있습니다.

건배, 비욘

다음 함수에서

/** * HTTP API에서 안전하게 사용하기 위한 URL을 확인합니다.* * * * @since 3.5.2 * * * @param string $url * @return false | string URL 또는 false 오류 발생 시.*/

이 행을 코멘트하다

if ( isset( $parsed_home['host'] ) ) {
        //$same_host = ( strtolower( $parsed_home['host'] ) === strtolower( $parsed_url['host'] ) || 'localhost' === strtolower( $parsed_url['host'] ) );
        $same_host = false;
    } else {
        $same_host = false;
    }

예를 들어 larabel에서 다른 포트를 사용하는 경우 여기에 포트를 추가해야 합니다.

if ( empty( $parsed_url['port'] ) )
        return $url;

    $port = $parsed_url['port'];
    if ( 80 === $port || 443 === $port || 8080 === $port || 8000 === $port )
        return $url;

    if ( $parsed_home && $same_host && isset( $parsed_home['port'] ) && $parsed_home['port'] === $port )
        return $url;

    return false;
}

이에 대한 답을 찾고 있는 사람이 있다면 WebHook을 수신하는 서버를 가리키는A DNS 레코드를 작성하고 방화벽의 내부 트래픽만 허용하는 것이 해결책이었습니다.

Digital Ocean의 VPC + 방화벽 및 Cloudflare를 사용하는 단계:

  1. CloudFlare에 로그인하여 서버의 공용 IP를 가리키는 A 레코드를 만듭니다.
  2. Digital Ocean 패널에서 방화벽으로 이동하여 원본 서버(또는 태그)로부터의 트래픽만 허용합니다.
  3. WooCommerce에서 웹 훅을 정상적으로 설정합니다.

펠리페

나에게 효과가 있었던 것:

  1. class-http.php에서 변경
'reject_unsafe_urls'  => apply_filters( 'http_request_reject_unsafe_urls', false, $url ),

로.

'reject_unsafe_urls'  => apply_filters( 'http_request_reject_unsafe_urls', true, $url ),
  1. http.php에서 이 행에 포트를 추가합니다(이 예에서는 포트 3000을 추가했습니다).
if ( 80 === $port || 443 === $port || 8080 === $port || 3000 === $port ) {

WooCommerce 4.2.2에서 동작합니다.

Word press http word word word word word 、 http word word word word word word word word 。 ", aganinst "의 쿼리는 할 수 .localhost:8080효과가 있을 거야

, 하다, 하다, 하다'를 수정할 도 있어요.http.php

언급URL : https://stackoverflow.com/questions/31875442/woocommerce-webhook-invalid-url

반응형