解决WooCommerce REST API 401 woocommerce_rest_cannot_view错误
问题描述
使用Postman通过Bearer授权访问https://website.nl/wp-json/wc/v3/orders时,收到401错误响应:
{"code": "woocommerce_rest_cannot_view", "message": "Je kunt gegevensbronnen niet weergeven.", "data": {"status": 401}}
计划用于获取订单数据的JavaScript代码如下:
function fetchOrderData(orderNumber) { return new Promise(function(resolve, reject) { var apiUrl = 'https://website.nl/wp-json/wc/v3/orders?order_number=' + orderNumber; fetch(apiUrl, { headers: { 'Authorization': 'Bearer token' } }) .then(response => { if (!response.ok) { throw new Error('Failed to fetch order details'); } return response.json(); }) .then(orderDetails => { if (orderDetails && orderDetails.length > 0) { var customerInfo = orderDetails[0].billing; resolve(customerInfo); } else { reject(new Error('Order not found')); } }) .catch(error => { console.error('Error fetching order data:', error); reject(error); }); }); }
当前环境信息:
- 账号角色:shopmanager
- 服务器:Nginx
- WooCommerce无特殊配置,已排查Bearer Token有效性、权限设置、API地址/版本、插件冲突,问题仍存在。
解决办法
1. 补全Shop Manager角色的REST API权限
WooCommerce默认的Shop Manager角色可能缺少订单读取的核心权限,需手动添加:
- 安装
User Role Editor插件(或通过代码添加权限) - 找到Shop Manager角色,添加以下权限:
read_shop_orderread_private_shop_orders
- 保存角色设置后,重新测试API请求
2. 修正Nginx对Authorization头的拦截
Nginx默认配置可能会丢弃Bearer授权头,需在站点Nginx配置中添加规则:
location /wp-json/ { if ($http_authorization ~* "^Bearer\s+(.+)$") { set $auth_bearer $1; fastcgi_param HTTP_AUTHORIZATION "Bearer $auth_bearer"; } try_files $uri $uri/ /index.php?$args; }
修改后重启Nginx服务,再测试API。
3. 重新生成并验证Bearer Token
确保Token是通过WooCommerce官方路径生成且绑定正确角色:
- 进入WooCommerce > 设置 > 高级 > REST API页面
- 确认生成Token的用户是Shop Manager角色,若不确定则重新生成新Token,替换代码中的
token字段
4. 排查主题/插件对REST权限的篡改
部分自定义主题或插件可能修改了REST API的权限回调:
- 暂时切换到WordPress默认主题(如Twenty Twenty-Four)测试API是否正常
- 搜索当前主题和插件代码中是否存在
woocommerce_rest_check_permissions或rest_authentication_errors钩子的自定义逻辑,若有则注释后测试
5. 调试请求头部的实际发送情况
修改代码添加调试日志,配合浏览器Network面板确认Authorization头是否正确发送:
fetch(apiUrl, { headers: { 'Authorization': 'Bearer YOUR_ACTUAL_TOKEN' } }) .then(response => { console.log('Response status:', response.status); console.log('Request headers:', response.headers.get('Authorization')); if (!response.ok) { throw new Error('Failed to fetch order details, status: ' + response.status); } return response.json(); })
内容的提问来源于stack exchange,提问作者Menne
相关产品推荐
相关产品推荐

