0

我正在尝试在 Twilio 函数中发出发布请求,以使用 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 || ""
            });
        
        }
    });
        });
        
};
4

1 回答 1

0

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

我建议您阅读有关Twilio Functions 的工作原理的信息。您不只是导入 Node 应用程序而不进行更改。您需要导出一个名为handler.

handler向 Twilio 函数的 URL 发出请求时,将调用该函数。

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

一个基本的 Twilio 函数如下所示:

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

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

现在,在您的情况下,您需要向外部 API 发出请求,作为对函数的请求的一部分。首先,我建议您在环境变量中设置诸如 API Key 之类的秘密。然后可以从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软件包已被弃用一段时间,因此您可能需要考虑将其更新为仍在维护的内容。

但最重要的是通过阅读文档了解 Twilio 函数的工作原理

于 2021-11-04T04:19:51.927 回答