我正在尝试在bitfloor.com的交易API上进行签名请求(它是一个REST API)。
Bitfloor给了我:
1)API密钥(如6bd2b780-00be-11e2-bde3-2837371c3c3a)
2)Secret Key(即oaFz62YpmbWiXwseMUSod53D8pOjdyVcweNYdiab/TSQqxk6IuemDvimNaQoA==)
以下是Bitfloor制作请求的确切说明:
请求必须是端口443(https)上的HTTPS POST请求。每个请求必须包含所需的标题(如下所示)。标题标识,验证和验证您的请求以防止篡改。 headers
bitfloor-key这是由bitfloor提供的用于唯一标识您的帐户的键。 (i.e. 6bd2b780-00be-11e2-bde3-2837371c3c3a)
bitfloor-sign签名字段是请求体使用与您的API密钥相对应的密钥sha512-hmac的结果。
要签署您的请求:将密钥解码为原始字节(64字节)。使用这些字节对HTTP请求正文进行sha512-hmac签名。对签名结果进行base64编码并发送到此标题字段中。
bitfloor-passphrase您在创建此API密钥时指定的密码。如果忘记了密码,我们无法恢复它。您需要创建一个新的API密钥。
bitfloor-version您感兴趣的资源的API版本。当前唯一有效的值为1
经过整整八个小时的反复尝试和搜索互联网以获取任何见解或信息后,以下代码是我能够构建请求的方向的最接近之处。不幸的是,无论我尝试什么,他们的API都返回“Invalid Signature”。
这是我目前的代码...
首先,我在网上找到了这个函数,用于进行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”值是必需的参数,必须与请求一起发送。
<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>
我认为我的困惑大部分来自于不确切地了解"请求正文(request body)"是什么。我觉得可能没有正确签署。
希望有一位熟悉签名请求的Coldfusion程序员能够帮助。我已经快要崩溃了。
请帮帮我!谢谢!