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は、HMACに署名するための秘密鍵としてNotification-Key(アカウント情報で設定)を使用します。GETリクエストの場合、(URL内の)疑問符に続くクエリ文字列が署名されます。POSTリクエストの場合、POST本文全体が署名されます。
TrialPayがGoogleAppEngine(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'
}