我正在尝试使用 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 经验。
更新
我没有意识到该链接受到保护。
TrialPay 使用您的 Notification-Key(在您的帐户信息中设置)作为密钥来签署 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'
}