使用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) { ~~~~~~
- 使用JavaScript中的PFX文件的RSA私钥创buildJWT(NodeJS)
- Node.js – 用CSPRNGencryption硬编码的密码
- 使用Node.jsencryption模块进行encryption并使用Java解密(在Android应用程序中)
- 用nodejs crypto与php的mcrypt解密blowfish-ecb
- mongodb:encryption字段上的唯一索引
- Nodejs使用encryption错误解密错误的最终块长度
- encryption通道的重新encryption会在Node.js中返回不同的encryption结果
- 节点encryptionaes256-cbc 0x0填充的例子
- 什么是bcrypt与节点一起使用的替代scheme?