【发布时间】:2015-07-20 12:44:27
【问题描述】:
我正在尝试使用 Node.js 和 Express 验证从 TrialPay 发送的消息。 TrialPay 使用 HMAC-MD5 哈希对请求进行签名,并在验证时提供these instructions。
这是我的代码:
app.post('/trialpay', function(req, res) {
var key = "[MY MERCHANT KEY]";
var hash = req.header("TrialPay-HMAC-MD5");
var data = req.body.toString();
var crypted = require("crypto").createHmac("md5", key)
.update(data)
.digest("hex");
if (hash == crypted) {
res.writeHead(200, {"Content-Type": "plain/text"});
res.end("Success!");
} else {
throw new Error("Invalid TrialPay Hash");
}
});
这显然不起作用(哈希不匹配)。
免责声明:我对 Node.js 非常陌生,并且几乎没有 Javascript 经验。
更新
我没有意识到该链接受到保护。
TrialPay 使用您的通知密钥(在您的帐户信息中设置) 作为签署 HMAC 的密钥。对于 GET 请求,查询字符串 问号后面的(在 URL 中)已签名。对于 POST 请求对整个 POST 正文进行签名。
下面是 TrialPay 如何指导您在 Google App Engine (Python) 中进行验证的示例:
class MyHandler(webapp.RequestHandler):
def post(self):
key = '[YOUR MERCHANT KEY]'
tphash = self.request.headers['TrialPay-HMAC-MD5']
if hmacmd5(key,self.request.body) != tphash:
logging.info('invalid trialpay hash')
return
更新 2
req.body 打印为:
{
oid: 'sample-order-id',
sid: 'customer-sid',
order_date: '04/24/2012',
timestamp: '04/24/2012 16:28:46',
first_name: 'customer-firstname',
last_name: 'customer-lastname',
email: 'customer@trialpay.com',
revenue: '10.00',
zip_code: '94041',
country: 'US'
}
【问题讨论】:
-
您的链接不起作用-它不会让我登录。也就是说,您应该远离请求处理程序中的
throwing(基本上是节点中的任何位置)。接受第三个参数(回调,nextin express lingo)并将错误传递给next。或者更好的是,在此处尽可能处理错误,并在res.send(403, 'Invalid TrialPay Hash')处处理。此外,您没有提及您发布的数据类型——如果您可以console.log的话,看看req.body尤其是req.body.toString()包含什么会很有趣。 -
感谢@LinusGThiel 的评论和建议。当我尝试
console.log(req.body.toString());时,它只打印出“[object Object]”。请原谅我的无知,在这里。 -
这就是我的怀疑!
console.log(req.body)带给你什么? -
您正在用正确的数据填写[MY MERCHANT KEY],对吧?
-
好的,
console.log(req.body)将 JSON 参数列表返回给我。那么,如何将其传递给crypto.update()?它需要一个字符串或缓冲区。我都尝试了(可能不正确),但都没有成功。
标签: javascript node.js cryptography express