无法在 Google Apps 脚本上发送 Post 请求

Unable to send Post Request on Google Apps Script

我正在尝试发送 post 请求来验证交易。我用 Postman 发送了相同的 post 请求,我得到了如下所示的响应:

Apps 脚本 Code.gs:

function postRequest() {
    var url = "https://ravesandboxapi.flutterwave.com/flwv3-pug/getpaidx/api/v2/verify";
    var options = {
        "method": "post",
        "headers": {
            "Content-Type": "application/json"
        },
        "payload": {
            "SECKEY": "FLWSECK-e6db11d1f8a6208de8cb2f94e293450e-X",
            "txref": "MC-1520443531487"
        }
    };

    const response = UrlFetchApp.fetch(url, options);

    Logger.log(JSON.stringify(response));
}

Apps 脚本错误响应:

Request failed for https://ravesandboxapi.flutterwave.com/flwv3-pug/getpaidx/api/v2/verify returned code 400.

Truncated server response: SyntaxError: Unexpected token S
   at parse (/app/node_modules/body-parser/lib/types/json.js:83:15)
   at /app/node_mod... (use muteHttpExceptions option to examine full response) (line 299, file "Code")

我做错了什么或如何在 Google Apps 脚本中发送 post 请求?

这不是 Google Apps 脚本的问题,但 flutterwave 服务器返回 400 错误代码。

您可以通过将 "muteHttpExceptions": true 添加到选项对象然后在控制台中记录响应来检查这一点。

function postRequest1() {
    var url = "https://ravesandboxapi.flutterwave.com/flwv3-pug/getpaidx/api/v2/verify";
    var options = {
        "method": "post",
        "headers": {
            "Content-Type": "application/json"
        },
        "payload": {
            "SECKEY": "FLWSECK-e6db11d1f8a6208de8cb2f94e293450e-X",
            "txref": "MC-1520443531487"
        },
        "muteHttpExceptions": true
    };

    const response = UrlFetchApp.fetch(url, options);
Logger.log(response.getResponseCode())
Logger.log(response.getContentText())
}

UrlFetchApp.fetch() 函数有一个不寻常的怪癖,您必须使用 contentType 属性 来设置负载的内容类型。由于某些原因,直接设置 header 似乎不起作用。

此外,您需要JSON.stringify()您的负载。

因此重写您的 post 请求如下:

function verify() {
    var url = "https://ravesandboxapi.flutterwave.com/flwv3-pug/getpaidx/api/v2/verify";

    var options = {
        "method":"POST",
        "contentType":"application/json",
        "payload":JSON.stringify({
            "SECKEY":"[YOUR-SECRET-KEY]",
            "txref":"[YOUR-TXREF-CODE]"
        })
    };

    return JSON.parse(UrlFetchApp.fetch(url, options));
}

请注意,我省略了带有占位符文本的键和代码。你真的不应该分享那种敏感信息。如果可能,我强烈建议撤销这些密钥并让服务供应商发布新密钥。

感谢 解释 UrlFetchApp.fetch()

的怪癖

我所做的就是将 Content-Type 更改为 contentType

function postRequest() {
    var url = "https://ravesandboxapi.flutterwave.com/flwv3-pug/getpaidx/api/v2/verify";
    var options = {
        "method": "post",
        "headers": {
            "contentType": "application/json" // <--  HERE
        },
        "payload": {
            "SECKEY": "FLWSECK-e6db11d1f8a6208de8cb2f94e293450e-X",
            "txref": "MC-1520443531487"
        },
        "muteHttpExceptions": true
    };

    const response = UrlFetchApp.fetch(url, options);

    Logger.log(response.getContentText());
    Logger.log('Response Code: '+response.getResponseCode())
}

另一方面,"muteHttpExceptions": true 是为了让我自己处理 Http 异常。