使用Node.js,Express和Trialpay进行HMAC MD5validation

我试图validation使用Node.js和Express从TrialPay发送的消息。 TrialPay使用HMAC-MD5哈希签名请求,并提供有关validation的说明 。

这是我的代码:

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的经验,首先。

UPDATE

我没有意识到这个链接是受保护的。

TrialPay使用您的通知密钥(在您的账户信息中设置)作为签署HMAC的密钥。 对于GET请求,问号后面的查询string(在URL中)被签名。 对于POST请求,整个POST正文都被签名。

以下是TrialPay指导您在Google App Engine(Python)中validation的示例:

 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' } 

这应该做的伎俩:

 var crypto = require('crypto'); function calculateSignature(key) { return function(req, res, next) { var hash = req.header("TrialPay-HMAC-MD5"), hmac = crypto.createHmac("md5", key); req.on("data", function(data) { hmac.update(data); }); req.on("end", function() { var crypted = hmac.digest("hex"); if(crypted === hash) { // Valid request return res.send("Success!", { "Content-Type": "text/plain" }); } else { // Invalid request return res.send("Invalid TrialPay hash", { "Content-Type": "text/plain" }, 403); } }); req.on("error", function(err) { return next(err); }); } } app.post("/trialpay", calculateSignature("[MY MERCHANT KEY]")); 

对于parsing云代码:(我testing过)点是express.bodyParser将parsing用于散列的url编码string。

 var parseExpressRawBody = require('parse-express-raw-body'); var queryString = require('querystring'); app.post('/trialpay',parseExpressRawBody(),function(req, res) { var hmac, calculatedSignature,payloadStr=req.body.toString(); hmac = crypto.createHmac('md5', TrialPayMerchentKey); hmac.update(payloadStr); calculatedSignature = hmac.digest('hex'); if (req.headers['trialpay-hmac-md5'] === calculatedSignature) { ~~~~~~