【问题标题】:Unable to connect VendHQ (POS) to WooCommerce (WP)无法将 VendHQ (POS) 连接到 WooCommerce (WP)
【发布时间】:2019-11-07 19:12:43
【问题描述】:

我已经花了很多天试图解决这个问题,这似乎是一个常见问题。我已经阅读了许多关于同一问题的其他帖子。我已经尝试了所有我能找到的解决方案,但我仍然得到相同的结果 - 无法成功地将我客户的 VendHQ (POS) 连接到我的 WooCommerce 商店(WordPress 5.2.4、PHP 7.2)。我已联系 VendHQ 寻求帮助,但与其他人一样,他们的解决方案不起作用。

我尝试了什么:

  1. 按照 VendHQ 的说明创建了我的 WooCommerce REST API 密钥并将它们放入 VendHQ 连接设置中。这给出了初始错误“woocommerce_rest_cannot_view,抱歉,您无法列出资源,401”

  2. 按照几次建议,我将以下代码添加到了我的 .htaccess 文件中,但遗憾的是没有解决问题:

    # BEGIN WordPress
    SetEnvIf Authorization "(.)" HTTP_AUTHORIZATION=$1
    RewriteEngine On
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
    RewriteBase /
    RewriteRule ^index.php$ - [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.php [L]
    # END WordPress
  1. 我修改了 apache httpd.conf 文件,多次建议使用 AllowOverride All 而不是默认值 None,但还是没有成功。我将以下代码添加到我的 apache 文件中: "/etc/apache2/conf.d/includes/pre_main_global.conf"
    <Directory "/var/www/">
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>

我对 Apache 和操作指令不是非常了解,因为我知道它有多么危险。然而,这个出现了几次,似乎是直截了当的。更新 .conf 文件并重新启动 Apache 服务器后,我仍然无法建立连接。

  1. 最后,我在 .htaccess 文件中添加了更多代码:
    Header always set Access-Control-Max-Age 1728000
    Header always set Access-Control-Allow-Origin: "*"
    Header always set Access-Control-Allow-Methods: "GET,POST,OPTIONS,DELETE,PUT"
    Header always set Access-Control-Allow-Headers: "DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,C$"
    Header always set Access-Control-Allow-Credentials true
    Header always set Access-Control-Allow-Origin: "https://my_client_shop.com/"

完成所有这些后,我仍然无法连接两个系统,但现在我遇到了一个新错误:

"We are unable to connect your WooCommerce store. Your website does not allow connections with Authorization Headers in the Vend API."

我认为最后的更改会解决此问题。有人看到过授权标头错误的这个问题吗?

我在 Chrome 浏览器中测试了 WC API 密钥:

https://my_client_shop.com/wp-json/wc/v2/system_status?consumer_key=ck_389f08cda9f8a802b366b1de8cb562cba95e462c&consumer_secret=cs_65fcd907905f9d8c64b38a7dd60de4f034526ff2 

它显示了 json 文件的详细信息。如果没有密钥,我会再次收到“无法列出 401”错误。所以我假设这些密钥实际上是有效的。

看来我们越来越近了,但我没有想法。

最后,我的客户的商店网站位于多站点上,如果这有影响的话。

所以我希望其他人经历了这一切并且能够真正找到一个有效的解决方案,并且可以分享它:) 或者指出我可能遗漏或错误的地方。非常感谢任何和所有的建议。

【问题讨论】:

  • 我也遇到了同样的问题,而且在这个问题上似乎并没有多少。不过,我能够使用您的 htaccess 编辑来使其正常工作(谢谢!)。我唯一更改的另一件事是删除此行: Header add Strict-Transport-Security "max-age=300".
  • 嗨布莱斯...我很高兴它对你有用。

标签: wordpress apache woocommerce woocommerce-rest-api


【解决方案1】:

这对我有用。

我将此添加到 .htaccess 文件中。该文件可以通过 FTP 访问到您的 Wordpress 服务器。

CGIPassAuth on

我从这里得到这个:allowing-authorization-header-in-apache

【讨论】:

    【解决方案2】:

    我与之合作的开发人员最终使用以下代码操作了 WooCommerce 文件:

    private function perform_basic_authentication() {
    
        $this->auth_method = 'basic_auth';
        $consumer_key = 'ck_PUT_YOUR_WC_REST_API_KEY';
        $consumer_secret = 'cs_PUT_YOUR_WC_REST_API_KEY';
    
        // If the $_GET parameters are present, use those first.
        if ( ! empty( $_GET['consumer_key'] ) && ! empty( $_GET['consumer_secret'] ) ) { // WPCS: CSRF ok.
            $consumer_key = $_GET['consumer_key']; // WPCS: CSRF ok, sanitization ok.
            $consumer_secret = $_GET['consumer_secret']; // WPCS: CSRF ok, sanitization ok.
        }
    
        // If the above is not present, we will do full basic auth.
        if ( ! $consumer_key && ! empty( $_SERVER['PHP_AUTH_USER'] ) && ! empty( $_SERVER['PHP_AUTH_PW'] ) ) {
            $consumer_key = $_SERVER['PHP_AUTH_USER']; // WPCS: CSRF ok, sanitization ok.
            $consumer_secret = $_SERVER['PHP_AUTH_PW']; // WPCS: CSRF ok, sanitization ok.
        }
    
        // Stop if don't have any key.
        if ( ! $consumer_key || ! $consumer_secret ) {
            return false;
        }
    
        // Get user data.
        $this->user = $this->get_user_data_by_consumer_key( $consumer_key );
        if ( empty( $this->user ) ) {
            return false;
        }
    
        // Validate user secret.
        if ( ! hash_equals( $this->user->consumer_secret, $consumer_secret ) ) { // @codingStandardsIgnoreLine
            $this->set_error( new WP_Error( 'woocommerce_rest_authentication_error', __( 'Consumer secret is invalid.', 'woocommerce' ), array( 'status' => 401 ) ) );
    
            return false;
        }
    
        return $this->user->user_id;
    }
    

    这确实奏效了,但它需要大量的挖掘。不幸的是,它在一个 WC Core 文件中,所以更新 WC 会把它吹走。我正在等待开发人员找到将其移至子主题的方法。

    【讨论】:

    • 虽然这可行,但我强烈建议不要这样做,因为它本质上是禁用任何访问 Rest API 的人的身份验证。
    猜你喜欢
    • 2021-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多