WooCommerce - woocommerce_rest_cannot_view - 状态401

时间:2017-02-12 10:59:42

标签: wordpress woocommerce woocommerce-rest-api wordpress-rest-api

我已经生成了消费者密钥和消费者密钥。该网站已安装SSL。我还安装了JSON和REST服务所需的插件。这就是网址的样子:

https://<url>/wp-json/wc/v1/products

当我尝试使用基本身份验证通过使用Instagram插件(Chrome插件)获取(获取)产品详细信息时,我收到了以下JSON响应:

{
  "code": "woocommerce_rest_cannot_view",
  "message": "Sorry, you cannot list resources.",
  "data": {
    "status": 401
  }
}

我同时拥有与Consumer键对应的READ和WRITE权限。

14 个答案:

答案 0 :(得分:8)

我遇到了同样的问题。

以下是我的解决方法:

require "woocommerce_api"

woocommerce = WooCommerce::API.new(
  "https://example.com",
  "consumer_key",
  "consumer_secret",
  {
    wp_json: true,
    version: "wc/v1",
    query_string_auth: true
  }
)

关键是query_string_auth: true 您需要在HTTPS

下将基本身份验证强制为查询字符串true

答案 1 :(得分:2)

试图帮助他人: 我在尝试使用CURL时遇到了401响应,并且在VBA试图请求内容类型&#34; application / json&#34; 但是,我只需在浏览器地址栏中输入一个有效的响应即可: https://mywebsite.com/wp-json/wc/v2/products?consumer_key=ck_blahblah&consumer_secret=cs_blahblah

按照这种思路,我回到了我的VBA应用程序并将内容类型更改为&#34; application / text&#34;并能够使用响应代码200提取有效的响应文本。 希望这有助于某人。

答案 2 :(得分:1)

尝试使用查询参数发出请求,如下所示:

https://www.exemple.com/wp-json/wc/v3/orders?consumer_key=ck_01234567890&consumer_secret=cs_01234567890

此处:https://www.exemple.com,您需要填写您的网址域。

此处consumer_key and consumer_secret是您先前在 WooCommerce>设置>高级>中创建的 ck cs 。 REST API

答案 3 :(得分:1)

通过在 .htaccess 文件的末尾添加以下这一行来解决问题

您只需将此行添加到 .htaccess 中即可,这对我有用

SetEnv HTTPS 开启

并确保使用OAuth 1.0进行授权

io.write() isn't writing to the console when a sleep function is called afterwards

答案 4 :(得分:0)

尝试一下,我在automattic / woocommerce库中遇到了同样的问题,我通过将customer_key和customer_secret附加到查询中来使其工作。

$woocommerce->get("customers/$userId?consumer_key={$this->key}&consumer_secret={$this->secret}");

快速编辑


上述方法有效,但我发现了针对自动/ woocommerce库的更好解决方案。

query_string_auth 设置为 true

必须深入研究代码才能找到此设置。

在文档中找不到任何内容

return new Client($this->url, $this->key, $this->secret, [
    "query_string_auth" => true
]);

答案 5 :(得分:0)

您遇到的401错误是因为您使用的是基本身份验证,即使您的网站不安全(没有https)。

邮递员中的解决方案是使用OAuth 1.0。只需添加消费者密钥和消费者秘密并发送请求即可。

答案 6 :(得分:0)

答案 7 :(得分:0)

这是Quickredfox回答的修改后的答案:

add_filter('woocommerce_rest_check_permissions', 'my_woocommerce_rest_check_permissions', 90, 4);

function my_woocommerce_rest_check_permissions($permission, $context, $object_id, $post_type) {
    if($_GET['consumer_key'] == 'asdfghj' && $_GET['consumer_secret'] == 'qwerty') {
        return true;
    }

    return $permission;
}

其缺点是失去了使用gui为用户添加和撤消访问权限的灵活性。但是,如果没有其他办法起作用,而您只是想不出原因,那么它将起作用,并且不会将API暴露给全世界。

哦,这需要将密钥和秘密作为参数la传递:

https://foo.bar.com/wp-json/wc/v3/products/123&consumer_key=asdfghj&consumer_secret=qwerty

这在不使用https的情况下也可以使用,但是如果您在不使用https的情况下使用它,请记住,随请求一起发送的所有凭据都将以纯文本发送。

答案 8 :(得分:0)

对于本地开发(本地主机),您还可以使用基本身份验证(例如,邮递员)而不是使用者密钥和使用者秘密。它可以无缝运行。

答案 9 :(得分:0)

我刚刚遇到了这个问题,我收到了与 OP 完全相同的错误消息。我使用的是 https 和 OAuth 1。问题最终出在域上。当网站的正确域为 example.com 时,我试图访问 www.example.com

此 URL 返回 401 woocommerce_rest_cannot_view 错误:

https://example.com/wp-json/wc/v3/products

此网址有效并返回结果:

https://www.example.com/wp-json/wc/v3/products

答案 10 :(得分:0)

将此代码添加到function.php以解决问题:

add_filter( 'woocommerce_rest_check_permissions', 'my_woocommerce_rest_check_permissions', 90, 4 );

function my_woocommerce_rest_check_permissions( $permission, $context, $object_id, $post_type  ){
  return true;
}

答案 11 :(得分:0)

在节点js代码中

const WooCommerceRestApi = require("@woocommerce/woocommerce-rest-api").default;
 
const api = new WooCommerceRestApi({
  url: "http://example.com",
  consumerKey: "ck_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
  consumerSecret: "cs_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
  queryStringAuth: true,
  version: "wc/v3"
});

答案 12 :(得分:-1)

这就是我不再担心和继续前进的方式。

简而言之,woocommerce休息控制器几乎都有一个SOMEWPRESTCLASS::get_item_permissions_check()方法,然后调用wc_rest_check_post_permissions()来决定它是否返回该错误;

因此,您可以加入并验证您想要的任何方式:

add_filter( 'woocommerce_rest_check_permissions', 'my_woocommerce_rest_check_permissions', 90, 4 );

function my_woocommerce_rest_check_permissions( $permission, $context, $object_id, $post_type  ){
  return true;
}

答案 13 :(得分:-1)

您可以尝试邮递员使用Oauth 1.0:

here is screenshot