WooCommerce Webhook:无效的网址

时间:2015-08-07 10:22:26

标签: wordpress woocommerce webhooks

我正在设置WooCommerce,以便在创建订单时触发webhook。我已将webhook的网址设置为我们为此目的设置的本地网络API的网址:

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

WooCommerce确实使用正确的数据有效负载触发webhook,但该请求在webhook的日志中报告为失败:

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

,从德语翻译,意味着"没有传递有效的网址"

之后我将URL更改为我们的API(https://xxx.azurewebsites.net/store/order/new)的面向Web的部署,并且API收到了webhook而没有任何问题。

我不确定WC webhook是否不能使用具有自定义端口的网址(在我的情况下,端口3000),所以我想问一下这是否属实,如果有办法让WC webhooks在本地主机开发环境中运行良好。

7 个答案:

答案 0 :(得分:4)

它不是自定义端口,而是localhost。

检查wp-includes / http.php wp_http_validate_url()会拒绝所有类型的本地IP,除非特别允许在http_request_host_is_external上使用返回true的过滤器...

干杯, 的Björn

答案 1 :(得分:2)

在以下函数中

/ **  *验证URL以便在HTTP API中安全使用。  *  * @since 3.5.2  *  * @param string $ url  * @return false |字符串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;
    }

如果您在laravel中使用其他端口,则必须在此处添加端口

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;
}

答案 2 :(得分:1)

对于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 );

答案 3 :(得分:0)

如果有人仍在寻找答案,我的解决方案是制作一条DNS记录,指向指向接收WebHook的服务器的DNS记录,然后仅允许防火墙上的内部流量。

使用DigitalOcean的VPC +防火墙和Cloudflare的步骤:

  1. 登录到CloudFlare,创建一个指向服务器公共IP的A记录
  2. 在DigitalOcean的面板上,进入防火墙,仅允许来自原始服务器(或标签)的流量
  3. 照常在WooCommerce上设置Webhook。

魔咒

答案 4 :(得分:0)

对我有用的东西

  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中工作

答案 5 :(得分:0)

Wordpress http 请求可能会阻止某些端口和主机。 但是,我可以确认查询 aganinst localhost:8080 会起作用。

另一方面,您也可以修改 http.php 以扩展有效端口的数量

答案 6 :(得分:0)

我在文件末尾插入以下代码后解决了它:wp-content/themes/MYTHEME/functions.php

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

add_filter( 'http_request_args', 'allow_unsafe_urls' );