WooCommerce - woocommerce_rest_cannot_view - 状态 401
Posted
技术标签:
【中文标题】WooCommerce - woocommerce_rest_cannot_view - 状态 401【英文标题】:WooCommerce - woocommerce_rest_cannot_view - Status 401 【发布时间】:2017-06-30 10:01:09 【问题描述】:我已经生成了一个消费者密钥和消费者秘密。该网站已安装 SSL。我还安装了 JSON 和 REST 服务所需的插件。这是网址的样子:
https://<url>/wp-json/wc/v1/products
当我尝试通过使用 POSTMAN(一个 Chrome 插件)使用 Basic Auth 获取(GET)产品详细信息时,我收到如下 JSON 响应:
"code": "woocommerce_rest_cannot_view",
"message": "Sorry, you cannot list resources.",
"data":
"status": 401
我拥有与 Consumer 键对应的 READ 和 WRITE 权限。
【问题讨论】:
这个链接解决了问题 :) ***.com/questions/52102194/… 这个链接解决了问题 :) ***.com/questions/52102194/… 【参考方案1】:您收到的 401 错误是因为您使用的是基本身份验证,即使您的网站不安全(没有 https)。
postman 中的解决方案是使用 OAuth 1.0。只需添加消费者密钥和消费者密钥并发送请求。
【讨论】:
太棒了!它对我很有用。我在这方面苦苦挣扎。 我试过这种方式,但结果还是一样。我有一个 https 网站 @Rom-888 您是否选择了将身份验证数据添加到:请求正文/请求 URL? WooCommerce wiki REST 部分放置了错误的选项,导致许多开发人员在基本 AUTH 上遇到此问题【参考方案2】:我遇到了同样的问题。
我是这样解决的:
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
下强制将基本身份验证作为查询字符串为真
【讨论】:
@Aloha 我应该在哪里使用它?请详细解释你的答案。【参考方案3】:这就是我停止担心并继续前进的方式。
简而言之,woocommerce rest 控制器几乎都有一个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;
【讨论】:
这其实不太好,因为这样你就给大家开门了! 虽然我知道这样做有风险,但我现在找不到任何其他解决方案,谢谢。将用作临时修复【参考方案4】:试图帮助他人: 我在尝试 CURL 时遇到了 401 响应,并且 VBA 尝试请求内容类型为“application/json” 但是,我可以通过在浏览器地址栏中输入以下内容来获取有效响应: https://mywebsite.com/wp-json/wc/v2/products?consumer_key=ck_blahblah&consumer_secret=cs_blahblah
按照这个思路,我回到了我的 VBA 应用程序并将内容类型更改为“应用程序/文本”,并且能够提取响应代码为 200 的有效响应文本。 希望这对某人有所帮助。
【讨论】:
+1 因为这是我让邮递员发送请求的方式。谢谢!在 http 它正在使用 OAuth 1.0。使用 https 上的生产服务器,它适用于此。真的很奇怪!【参考方案5】:试试这个,我在 automattic/woocommerce 库中遇到了同样的问题,我只是通过将 customer_key 和 customer_secret 附加到查询中来让它工作。
$woocommerce->get("customers/$userId?consumer_key=$this->key&consumer_secret=$this->secret");
快速编辑
上述方法有效,但我为 automattic/woocommerce 库找到了更好的解决方案。
将 query_string_auth 设置为 true
必须深入研究代码才能找到此设置。
在文档中找不到任何内容
return new Client($this->url, $this->key, $this->secret, [
"query_string_auth" => true
]);
【讨论】:
经过很长时间,我找到了将 query_string_auth 设置为 true 的解决方案,最后我修复了它!非常感谢,伙计;) @dieter 我能知道哪个文件附加这些代码吗【参考方案6】:我刚碰到这个。显然 curl 处理 url 的方式很有趣,所以我不得不用双引号将它封装起来。
这不起作用: 卷曲https://www.my-site.com/wp-json/wc/v3/orders?consumer_key=ck_40097dbc2844ce7712e1820bcadf0149c2bedegh&consumer_secret=cs_ab57e19263af0b9ab4c596c310f1e7904bb20123
这确实有效: curl "https://www.my-site.com/wp-json/wc/v3/orders?consumer_key=ck_40097dbc2844ce7712e1820bcadf0149c2bedegh&consumer_secret=cs_ab57e19263af0b9ab4c596c310f1e7904bb20123"
【讨论】:
【参考方案7】:通过将下面这一行添加到 .htaccess 文件的末尾来解决问题
你只需要将此行添加到 .htaccess 中,这对我有用
SetEnv HTTPS 开启
并确保使用 OAuth 1.0 进行授权
【讨论】:
【参考方案8】:这是对 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 暴露给全世界。
哦,这需要将密钥和秘密作为参数传递:
https://foo.bar.com/wp-json/wc/v3/products/123&consumer_key=asdfghj&consumer_secret=qwerty
这将在没有 https 的情况下工作,但如果您在没有 https 的情况下使用它,请记住您随请求一起发送的任何凭据都将以纯文本形式发送。
【讨论】:
【参考方案9】:您可以使用邮递员尝试 Oauth 1.0:
【讨论】:
【参考方案10】:尝试使用查询参数发出请求,如下所示:
https://www.exemple.com/wp-json/wc/v3/orders?consumer_key=ck_01234567890&consumer_secret=cs_01234567890
这里:https://www.exemple.com
你需要填写你的 url 域。
这里:consumer_key and consumer_secret
是您之前在 WooCommerce > 设置 > 高级 > REST API 上生成的 ck 和 cs
【讨论】:
【参考方案11】:对于本地开发 (localhost),您还可以使用 Basic Auth(例如 Postman)而不是 Consumer Key 和 Consumer Secret。它可以无缝运行。
【讨论】:
【参考方案12】:我刚刚遇到了这个问题,我收到了与 OP 完全相同的错误消息。我使用的是 https 和 OAuth 1。问题最终出在域上。当站点的正确域是 www.example.com
时,我试图访问 example.com
。
此网址返回 401 woocommerce_rest_cannot_view 错误:
https://example.com/wp-json/wc/v3/products
此 URL 有效并返回结果:
https://www.example.com/wp-json/wc/v3/products
【讨论】:
【参考方案13】:将此代码添加到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;
【讨论】:
【参考方案14】:在节点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"
);
【讨论】:
以上是关于WooCommerce - woocommerce_rest_cannot_view - 状态 401的主要内容,如果未能解决你的问题,请参考以下文章
php [wpo woocommerce] optimizacion woocommerce #woocommerce #wordpress
woocommerce 预订状态更改 woocommerce 订单状态
WooCommerce 钩子 – woocommerce_update_order 问题
WooCommerce 'woocommerce_payment_complete' 未在 PayPal 沙盒付款上运行