2012-10-16 26 views
14

मैं व्यापार API पर हस्ताक्षरित अनुरोध करने के लिए कोशिश कर रहा हूँColdfusion CFHTTP bitfloor.com पर हस्ताक्षर किए बाकी अनुरोध शरीर

Bitfloor मुझे देता है (यह एक REST API का है) कुंजी (यानी 6bd2b780-00be-11e2-bde3-2837371c3c3a)

2) गोपनीय कुंजी (यानी oaFz62YpmbWiXwseMUSod53D8pOjdyVcweNYdiab/TSQqxk6IuemDvimNaQoA ==)

निम्नलिखित अनुरोध करने के लिए Bitfloor के सटीक निर्देश है:

अनुरोध पोर्ट 443 (https) पर HTTPS POST अनुरोध होना चाहिए। प्रत्येक अनुरोध में आवश्यक शीर्षलेख (नीचे सूचीबद्ध) होना चाहिए। शीर्षलेख छेड़छाड़ रोकने के लिए आपके अनुरोध की पहचान, सत्यापन और सत्यापन करते हैं। शीर्षलेख

बिटफ्लूर-कुंजी यह आपके खाते की विशिष्ट पहचान करने के लिए बिटफ्लूर द्वारा प्रदान किया गया है। (अर्थात 6bd2b780-00be-11e2-bde3-2837371c3c3a)

bitfloor हस्ताक्षर संकेत क्षेत्र है जो अपने api कुंजी से मेल खाती है गुप्त कुंजी का उपयोग अनुरोध शरीर का एक SHA512-HMAC है।

अपने अनुरोध पर हस्ताक्षर करने के लिए: बेस 64 कच्चे बाइट्स (64 बाइट्स) में गुप्त कुंजी को डीकोड करें। Http अनुरोध निकाय के अपने sha512-hmac हस्ताक्षर के लिए उन बाइट्स का उपयोग करें। बेस 64 हस्ताक्षर परिणाम एन्कोड करें और इस हेडर फ़ील्ड में भेजें।

बिटफ्लूर-पासफ्रेज़ इस एपीआई कुंजी को बनाते समय आपके द्वारा निर्दिष्ट पासफ्रेज। भूल गए हैं तो हम आपके पासफ्रेज को पुनर्प्राप्त नहीं कर सकते हैं। आपको एक नई एपीआई कुंजी बनाने की आवश्यकता होगी।

bitfloor-संस्करण संसाधन आप में रुचि रखते हैं की API वर्शन। वैध मान अभी 1


परीक्षण और त्रुटि के एक पूर्ण आठ घंटे के बाद और इंटरनेट से किसी के लिए बार-बार खोज है अंतर्दृष्टि या जानकारी की तरह, निम्न कोड उतना करीब है जितना मैं सोच सकता हूं कि मैं सही तरीके से अनुरोध कैसे तैयार कर सकता हूं, इस दिशा में कहीं भी हो सकता है, इससे कोई फर्क नहीं पड़ता कि मुझे क्या लगा है, मुझे उनके द्वारा लौटाया गया "अमान्य हस्ताक्षर" एपीआई।

यहाँ मैं अब तक किया है ...

सबसे पहले, मैं वेब पर इस समारोह में पाया गया कि किसी SHA512 पर हस्ताक्षर करने के लिए लिखा है:

<cffunction name="HMAC_SHA512" returntype="binary" access="public" output="false"> 
    <cfargument name="signKey" type="string" required="true"> 
    <cfargument name="signMessage" type="string" required="true"> 

    <cfset var jMsg = JavaCast("string",arguments.signMessage).getBytes("iso-8859-1")> 
    <cfset var jKey = JavaCast("string",arguments.signKey).getBytes("iso-8859-1")> 
    <cfset var key = createObject("java","javax.crypto.spec.SecretKeySpec")> 
    <cfset var mac = createObject("java","javax.crypto.Mac")> 
    <cfset key = key.init(jKey,"HmacSHA512")> 
    <cfset mac = mac.getInstance(key.getAlgorithm())> 
    <cfset mac.init(key)> 
    <cfset mac.update(jMsg)> 
    <cfreturn mac.doFinal()> 
</cffunction> 

मैं पता नहीं यह क्या करता है , लेकिन ऐसा लगता है कि यह काम करता है और त्रुटि के बिना ऐसा करता है।

यहां इस समारोह का मेरा कार्यान्वयन और अनुरोध करने का मेरा प्रयास है: नोट: "nonce" मान एक आवश्यक param है जिसे अनुरोध के साथ भेजा जाना चाहिए।

<cffunction name="myorders"> 
    <cfset nonce  = dateDiff("s",createDateTime(2012,01,01,0,0,0),now())> 
    <cfset requestbody = "?nonce=#nonce#"> 
    <cfset key  = "oaFz62YpmbWiXwseMUSod53D8pOjdyVcweNYdiab/TSQqxk6IuemDvimNaQoA=="> 
    <cfset sign  = HMAC_SHA512(key,requestbody)> 
    <cfset signed  = binaryEncode(sign,"Base64")> 

    <!--- HTTP REQUEST ---> 
    <cfhttp url = "https://api.bitfloor.com/orders#requestbody#" 
     method = "post" 
     result = "bitfloor"> 

    <!--- HEADERS ---> 
    <cfhttpparam 
     type = "body" 
     value = requestbody> 
    <cfhttpparam 
     type = "header" 
     name = "bitfloor-key" 
     value = "6bd2b780-00be-11e2-bde3-2837371c3c3a"> 
    <cfhttpparam 
     type = "header" 
     name = "bitfloor-sign" 
     value = signed> 
    <cfhttpparam 
     type = "header" 
     name = "bitfloor-passphrase" 
     value = "mysecretpassphrase"> 
    <cfhttpparam 
     type = "header" 
     name = "bitfloor-version" 
     value = "1"> 
    </cfhttp> 
</cffunction> 

मुझे लगता है कि मेरा अधिकांश भ्रम वास्तव में "अनुरोध निकाय" क्या नहीं जानता है। मुझे लगता है कि मैं शायद सही चीज़ पर हस्ताक्षर नहीं कर रहा हूं।

मुझे उम्मीद है कि वहां एक कोल्डफ्यूजन प्रोग्रामर है जो हस्ताक्षरित अनुरोधों से परिचित है। मेरा विवेक खत्म हो रहा है।

कृपया मदद करें! नमस्ते

उत्तर

2

मुझे लगता है कि एपीआई का इस्तेमाल किया है, लेकिन मैं कुछ परीक्षण भाग गया और यह निम्नलिखित में तोड़ मरोड़ के साथ काम करने लगता है:

  • के बाद से secretKey मूल्य बेस 64 एन्कोड किया गया है, अपने हस्ताक्षर करने के समारोह के लिए binaryDecode का उपयोग करने की जरूरत है ठीक से बाइट निकालें। String.getBytes(...) का उपयोग करना एक पूरी तरह से अलग (और गलत) परिणाम उत्पन्न करता है।

  • उम्मीद अनुरोध शरीर मूल्य अभी है: nonce=#nonceValue# (बिना प्रमुख "?")

  • यह Content-Type=application/x-www-form-urlencoded हेडर की आवश्यकता है, अन्यथा यह सामग्री पार्स करने के लिए विफल रहता है और प्रतिक्रिया है: { "त्रुटि": "कोई अस्थायी रूप से निर्दिष्ट"}

कोड

<cfset apiKey = "6bd2b780-00be-11e2-bde3-2837371c3c3a"> 
<cfset secretKey = "oaFz62YpmbWiXwseMUSod53D8pOjdyVcweNYdiab/TSQqxk6IuemDvimNaQoA=="> 
<cfset passphrase = "your secret phrase"> 

<cfset requestBody = "nonce="& now().getTime()> 
<cfset signBytes = HMAC_SHA512(secretKey, requestbody)> 
<cfset signBase64 = binaryEncode(signBytes, "base64")> 

<cfhttp url="https://api.bitfloor.com/orders" method="post" port="443" result="bitfloor"> 
    <cfhttpparam type="header" name="Content-Type" value="application/x-www-form-urlencoded"> 
    <cfhttpparam type="header" name="bitfloor-key" value="#apiKey#"> 
    <cfhttpparam type="header" name="bitfloor-sign" value="#signBase64#"> 
    <cfhttpparam type="header" name="bitfloor-passphrase" value="#passphrase#"> 
    <cfhttpparam type="header" name="bitfloor-version" value="1"> 
    <cfhttpparam type="body" value="#requestBody#"> 
</cfhttp> 

<cfdump var="#bitfloor#" label="Response"> 

<cffunction name="HMAC_SHA512" returntype="binary" access="public" output="false"> 
    <cfargument name="base64Key" type="string" required="true"> 
    <cfargument name="signMessage" type="string" required="true"> 
    <cfargument name="encoding" type="string" default="UTF-8"> 

    <cfset var messageBytes = JavaCast("string",arguments.signMessage).getBytes(arguments.encoding)> 
    <cfset var keyBytes = binaryDecode(arguments.base64Key, "base64")> 
    <cfset var key = createObject("java","javax.crypto.spec.SecretKeySpec")> 
    <cfset var mac = createObject("java","javax.crypto.Mac")> 
    <cfset key = key.init(keyBytes,"HmacSHA512")> 
    <cfset mac = mac.getInstance(key.getAlgorithm())> 
    <cfset mac.init(key)> 
    <cfset mac.update(messageBytes)> 

    <cfreturn mac.doFinal()> 
</cffunction> 
+0

आपको बहुत धन्यवाद लेग! काश मैं आपको उस समृद्धि को समझा सकता हूं जब मैंने असफलता के सैकड़ों बार बाद में वास्तविक डेटा वापस देखा था। ऐसा लगता है कि यह कभी काम नहीं करेगा। आप एक वास्तविक जीवन बचतकर्ता हैं! धन्यवाद धन्यवाद धन्यवाद! मैं इस वेबसाइट पर घूमने जा रहा हूं और इसे आगे बढ़ाने के लिए अपनी पूरी कोशिश कर रहा हूं। नमस्ते मेरे दोस्त – Jay

+0

खुशी हुई यह मदद की! (नई एपीआई कुंजी जेनरेट करना न भूलें :) – Leigh

+0

बस आपको ऐसे कठिन प्रश्न का उत्तर देने के लिए अंक देने के लिए यहां आया था। –