USAePay 函数 API 在 TWilio 函数中 returns 504 代码

function for USAePay API in TWilio functions returns 504 code

我正在尝试在 Twilio 函数中发出 post 请求以处理 USAePay 网关的费用 API 但我的代码似乎在某处出错。任何见解表示赞赏。我想可能是 callback() 函数放错地方了。

我还收到一条警告,提示 buffer 已贬值,我该如何解决?

这是我的代码:

exports.handler = function(context, event, callback) {
//setup dependencies
const express = require('express');
const bodyParser = require('body-parser');
const request = require('request');
const sha256 = require('sha256');

const app = express();
app.use(express.static('public'));
app.use(bodyParser.json());

//setup authorization for API request
var seed = "abcdefghijklmnop";
var apikey = "xxxxxxxxxxxxxxxxxxxxxxxx";
var prehash = apikey + seed;
var apihash = 's2/'+ seed + '/' + sha256(prehash);
var authKey = new Buffer(apikey + ":" + apihash).toString('base64');
var authorization = "Basic " + authKey;

//POST endpoint for API request
app.post('/', (req, res) => {
    //setup request for API using provided info from user
    let options = {
        url: 'https://sandbox.usaepay.com/api/v2/transactions',
        method: 'POST',
        json: true,
        headers: {
            "Authorization": authorization
        },
        body: {
    "command": "cc:sale",
    "amount": "5.00",
    "amount_detail": {
        "tax": "1.00",
        "tip": "0.50"
    },
    "creditcard": {
        "cardholder": "John doe",
        "number": "4000100011112224",
        "expiration": "0919",
        "cvc": "123",
        "avs_street": "1234 Main",
        "avs_zip": "12345"
    }
        }
    };
    //make request and handle response
    request(options, (err, apiRes, body) => {
        if(err) {
            res.status(500).json({message: "internal server error"});
        }
        else{
            res.status(200).json({
                result: body.result,
                error: body.error || ""
            });
        
        }
    });
        });
        
};

这里是 Twilio 开发人员布道者。

我建议您阅读有关 how Twilio Functions works 的内容。您不只是导入没有更改的 Node 应用程序。您需要导出一个名为 handler.

的函数

当向 Twilio 函数的 URL 发出请求时调用 handler 函数。

该函数接收三个参数,一个context、一个eventcallback 函数。 context 包含环境变量等,event 包含来自 HTTP 请求的所有参数(查询字符串参数或请求正文中的参数),callback 用于返回响应。

基本的 Twilio 函数如下所示:

exports.handler = function (context, event, callback) {
    return callback(null, { hello: "World!" });
}

在这种情况下,向函数 URL 发出请求将收到 { "hello": "World!" } 的 JSON 响应。

现在,在您的情况下,您需要向外部 API 发出请求,作为对函数请求的一部分。首先,我建议您在环境变量中设置秘密,例如 API 密钥。然后可以从 context 对象访问它们。您的 API 调用将是异步的,因此重要的是仅在所有异步调用完成后才调用 callback 函数。

类似这样的方法可能有效:

const request = require("request");
const sha256 = require("sha256");

exports.handler = function (context, event, callback) {
  const seed = context.SEED;
  const apikey = context.API_KEY;
  const prehash = apikey + seed;
  const apihash = "s2/" + seed + "/" + sha256(prehash);
  const authKey = Buffer.from(apikey + ":" + apihash).toString("base64");
  const authorization = "Basic " + authKey;

  const options = {
    url: "https://sandbox.usaepay.com/api/v2/transactions",
    method: "POST",
    json: true,
    headers: {
      Authorization: authorization,
    },
    body: {
      command: "cc:sale",
      amount: "5.00",
      amount_detail: {
        tax: "1.00",
        tip: "0.50",
      },
      creditcard: {
        cardholder: "John doe",
        number: "4000100011112224",
        expiration: "0919",
        cvc: "123",
        avs_street: "1234 Main",
        avs_zip: "12345",
      },
    },
  };
  //make request and handle response
  request(options, (err, apiRes, body) => {
    if (err) {
      const response = new Twilio.Response();
      response.setStatusCode(500);
      response.appendHeader("Content-Type", "application/json");
      response.setBody({ message: "internal server error" });
      callback(null, response);
    } else {
      callback(null, {
        result: body.result,
        error: body.error || "",
      });
    }
  });
};

request 包已经弃用一段时间了,因此您可能要考虑将其更新为仍在维护的内容。

但最重要的是学习how Twilio Functions work by reading the documentation