我正在设置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在本地主机开发环境中运行良好。
答案 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的步骤:
魔咒
答案 4 :(得分:0)
对我有用的东西
'reject_unsafe_urls' => apply_filters( 'http_request_reject_unsafe_urls', false, $url ),
到
'reject_unsafe_urls' => apply_filters( 'http_request_reject_unsafe_urls', true, $url ),
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' );