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
、一个event
和callback
函数。 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。
我正在尝试在 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
、一个event
和callback
函数。 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。