【问题标题】:WooCommerce REST API with Google UrlFetchApp header authorization not working带有 Google UrlFetchApp 标头授权的 WooCommerce REST API 不起作用
【发布时间】:2020-04-17 21:02:44
【问题描述】:

目前

我在我的 Google 脚本中使用 WooCommerce REST API 并使用以下工作代码:


    var ck = "ck_longstringlongstringlongstringlongstring";
    var cs = "cs_longstringlongstringlongstringlongstring";
    var website = "https://www.mywebsite.com.au";

    var url = website + "/wp-json/wc/v3/orders?consumer_key=" + ck + "&consumer_secret=" + cs; 

    var options =
        {
          "method": "GET",
          "Content-Type": "application/x-www-form-urlencoded;charset=UTF-8",
          "muteHttpExceptions": true,
        };

    var result = UrlFetchApp.fetch(url, options);

问题

为了提高安全性,我想将消费者密钥和秘密放入标头,但我无法让以下脚本工作

   var url = website + "/wp-json/wc/v3/orders; 

   let authHeader = 'Basic ' + Utilities.base64Encode(ck + ':' + cs);

    var options =
        {
          "method": "GET",
          "Content-Type": "application/x-www-form-urlencoded;charset=UTF-8",
          "muteHttpExceptions": true,
          "headers": {"Authorization": authHeader},
        };

    var result = UrlFetchApp.fetch(url, options);

当前结果 = {"code":"woocommerce_rest_cannot_view","message":"Sorry, you cannot list resources.","data":{"status":401}}

预期结果 = 订单 JSON

我的代码有问题吗?还是使用 WooCommerce API 或 Google Scripts?

【问题讨论】:

  • minimal reproducible example描述问题。 “它不起作用”的描述性不足以帮助人们理解您的问题。相反,告诉其他读者预期的行为应该是什么。告诉其他读者错误消息的确切措辞是什么,以及产生它的代码行。使用简短但描述性的问题摘要作为问题的标题。
  • @TheMaster,我已经添加了这个。
  • 尝试 curl -u 或 postman 并确认 url 和 key/secret 正常工作。
  • @TheMaster,我在邮递员中尝试了 curl 命令,结果与谷歌脚本中的结果相同,即{ "code": "woocommerce_rest_cannot_view", "message": "Sorry, you cannot list resources.", "data": { "status": 401 } } 进行更多挖掘,似乎与wordpress.org/support/topic/woocommerce-rest-api-error-401中提到的问题类似

标签: wordpress google-apps-script woocommerce http-status-code-401 woocommerce-rest-api


【解决方案1】:

您的代码存在一些问题。

对于UrlFetchApp.fetch(),您需要使用contentType 而不是Content-Type

但是,在这种情况下,您甚至不需要设置它,因为 application/x-www-form-urlencoded 是默认设置。 method 属性也是如此;默认为GET

此外,如果您想谨慎行事,请使用 Utilities.base64EncodeWebSafe(data, charset) 对您的凭据进行 base64 编码,而不是使用非网络安全版本。

let url = website + "/wp-json/wc/v3/orders"; 
let encoded = Utilities.base64EncodeWebSafe(ck + ':' + cs, Utilities.Charset.UTF_8);

let options = {
    "muteHttpExceptions":true,
    "headers": {
        "Authorization": "Basic " + encoded
    }
};

let result = UrlFetchApp.fetch(url, options);
result = JSON.parse(result);

【讨论】:

  • 这些问题是编码偏好,我是否想明确识别我的请求是什么样的,我注意到编码选择。但是,这些更改都不能解决问题。
  • 尝试删除 muteHttpExceptions 属性以查看 Apps 脚本编辑器报告了哪些错误。然后您就可以从那里开始排除故障了。
  • 另外你是如何处理result 变量的?假设您没有任何其他问题发生,您需要在其上调用 JSON.parse() 以将其转换为对象。查看更新的脚本。
  • 我使用 JSON.parse() 作为结果。但是当前结果 = {"code":"woocommerce_rest_cannot_view","message":"Sorry, you cannot list resources.","data":{"status":401}} 这将表明权限错误并且身份验证不起作用。
  • 如果 curl 和 GAS 都给你这个错误,那么 Woocommerce API 本身可能在服务器端发生了其他事情。
猜你喜欢
  • 2013-09-24
  • 2018-07-24
  • 1970-01-01
  • 2020-01-28
  • 1970-01-01
  • 2018-07-07
  • 2023-04-09
  • 2016-02-11
  • 1970-01-01
相关资源
最近更新 更多