使用Node.js,Express和Trialpay进行HMAC MD5验证
我试图使用Node.js和Express来验证从TrialPay发送的消息。 TrialPay使用HMAC-MD5哈希签名请求,并在验证时提供这些说明。
这是我的代码:
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请求,问号后面的查询字符串(在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'
}
这应该可以做到这一点:
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]"));
对于解析云码:(我测试过)关键是express.bodyParser将解析用于哈希的url编码字符串。
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) {
~~~~~~
链接地址: http://www.djcxy.com/p/10681.html
上一篇: HMAC MD5 Validation with Node.js, Express and Trialpay
下一篇: BE (Dutch Belgium) no longer supported (in iframe like button)?