2012-04-24 9 views
7

मैं नोड.जेएस और एक्सप्रेस का उपयोग कर ट्रायलपे से भेजे गए एक संदेश को प्रमाणित करने का प्रयास कर रहा हूं। ट्रायलपे एचएमएसी-एमडी 5 हैश के साथ अनुरोधों पर हस्ताक्षर करता है, और सत्यापन पर these instructions प्रदान करता है।एचडीएसी एमडी 5 प्रमाणीकरण नोड.जेएस, एक्सप्रेस और ट्रायलपे

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"); 
    } 
}); 

यह वह जगह है, जाहिर है, (हैश से मेल नहीं खाता) काम नहीं कर रहा:

यह मेरा कोड है।

अस्वीकरण: मैं नोड.जेएस के लिए बेहद नया हूं, और इसके साथ शुरू करने के लिए थोड़ा जावास्क्रिप्ट अनुभव है।

अद्यतन

मुझे नहीं पता था कि लिंक संरक्षित किया गया।

ट्रायलपे आपके सूचना-कुंजी (आपकी खाता जानकारी में सेट) एचएमएसी पर हस्ताक्षर करने के लिए गुप्त कुंजी के रूप में उपयोग करता है। GET के लिए प्रश्न स्ट्रिंग अनुरोध करता है जो प्रश्न चिह्न (यूआरएल में) का पालन करता है। POST अनुरोध के लिए पूरे पोस्ट बॉडी पर हस्ताक्षर किए गए हैं।

यहाँ कैसे TrialPay का निर्देश देता गूगल एप इंजन (अजगर) में मान्य करने के लिए का एक उदाहरण है:

{ 
    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: '[email protected]', 
    revenue: '10.00', 
    zip_code: '94041', 
    country: 'US' 
} 
:

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 प्रिंट बाहर

+1

आपका लिंक काम नहीं करता है - यह मुझे लॉग इन करने नहीं देगा। उसने कहा, आपको अपने अनुरोध हैंडलर (मूल रूप से, नोड में कहीं भी) के अंदर 'फेंकने' से स्पष्ट रहना चाहिए। तीसरे पैरामीटर को स्वीकार करें (कॉलबैक, 'अगली' एक्सप्रेस लिंगो में) और त्रुटि को इसके बजाय 'अगली' पर पास करें। या इससे भी बेहतर, यहां त्रुटि को संभालें, जहां आप कर सकते हैं, और 'res.send (403, 'अवैध परीक्षणप हैश')'। साथ ही, आप इस बात का जिक्र नहीं करते कि आप किस प्रकार का डेटा पोस्ट कर रहे हैं - यह देखना दिलचस्प होगा कि 'req.body' और विशेष रूप से' req.body.toString() 'में शामिल है, यदि आप 'console.log' कर सकते हैं । –

+0

टिप्पणी और सलाह @LinusGThiel के लिए धन्यवाद। जब मैंने 'console.log (req.body.toString()) की कोशिश की, 'यह केवल प्रिंट करता है" [ऑब्जेक्ट ऑब्जेक्ट] "। कृपया मेरी अज्ञानता को यहां क्षमा करें। –

+0

मुझे यही संदेह है! 'Console.log (req.body) 'आपको क्या देता है? –

उत्तर

4

यह चाल करना चाहिए:

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]")); 
+0

यह काम कर रहा है !! आपकी मदद के लिए बहुत बहुत धन्यवाद। सिर्फ एक मुद्दा, मैंने 'res.writeHead (200, {'सामग्री-प्रकार': 'सादा/पाठ'}) जोड़ा;' 'res.end (" सफलता! ") ऊपर' क्योंकि ट्रायलपे सर्वर बस लटक रहा है। मैंने हैश को लॉग किया और वे मेल खाते हैं, इसलिए मुझे यकीन नहीं है कि क्या हो रहा है। –

+0

बढ़िया! यह वास्तव में 'res.end' नहीं बल्कि एक' res.send' है - एक्सप्रेस से एक गुडिया। [Res.send दस्तावेज़ीकरण] देखें (http://expressjs.com/guide.html#res.send%28%29)। वाह, उस पर देखकर, मैं देखता हूं कि तार हमेशा 'सामग्री-प्रकार: टेक्स्ट/एचटीएमएल' के साथ भेजे जाएंगे। मेरी गलती। ऊपर अपडेट किया गया। –

+0

मैंने इसे केवल 'अंत' में बदल दिया क्योंकि 'प्रेषण' भी लटक रहा था। मैंने 'console.log ('सफलता!') की कोशिश की;' 'app.post()' 'res.send (" सफलता! ") में;' और कुछ भी लॉग नहीं किया गया था। –

-1

पार्स बादल कोड के लिए: (मैं परीक्षण किया है) बिंदु express.bodyParser यूआरएल इनकोडिंग स्ट्रिंग जो हैश किया जाता है पार्स जाएगा।

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) { 
    ~~~~~~ 
+0

कृपया कुछ स्पष्टीकरण जोड़ें। – Nilambar

+0

आपका स्निपेट वाकई खराब है। यह क्या करना चाहिए? इसे पोस्ट करने से पहले अपने संदेश की समीक्षा करने के लिए एक समय लें। –

संबंधित मुद्दे