我将我的代码下载到测试访问的基本要素,但是从服务器收到了旧的错误(403),我已经验证了双重确定我正在使用正确的API密钥/密钥对。我的代码(通过Unity 3D的C#)如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
using System.Security.Cryptography;
using System.IO;
using System.Text;
using System.Net;
public class PolonScript : MonoBehaviour
{
public TextMesh OutputText;
const string _apiKey = "---apiKey---";
const string _apiSecret = "---apiSecret---";
void Start()
{
string nonce = DateTime.Now.ToString ("HHmmss");
const string WEBSERVICE_URL = "https://poloniex.com/tradingApi";
try
{
var webRequest = System.Net.WebRequest.Create (WEBSERVICE_URL);
if (webRequest != null)
{
webRequest.Method = "POST";
//webRequest.Timeout = 12000;
webRequest.ContentType = "application/x-www-form-urlencoded";
byte[] dataStream =
Encoding.UTF8.GetBytes("command=returnBalances&nonce=" + nonce);
webRequest.Headers.Add("Key", _apiKey);
webRequest.Headers.Add("Sign", genHMAC (dataStream));
Stream newStream = webRequest.GetRequestStream();
newStream.Write(dataStream, 0, dataStream.Length);
newStream.Close();
using (System.IO.Stream s =
webRequest.GetResponse().GetResponseStream())
{
using (System.IO.StreamReader sr = new System.IO.StreamReader(s))
{
var jsonResponse = sr.ReadToEnd();
OutputText.text = jsonResponse.ToString();
}
}
}
}
catch (WebException ex)
{
OutputText.text = ex.ToString();
}
}
//end-of-start()
private string genHMAC(byte[] dataStreamInput)
{
byte [] APISecret_Bytes =
System.Text.Encoding.UTF8.GetBytes(_apiSecret);
HMACSHA512 hmac = new HMACSHA512(APISecret_Bytes);
var signBytes = hmac.ComputeHash(dataStreamInput);
string HexDecString = string.Empty;
for (int i = 0; i < signBytes.Length; i++)
{
HexDecString += signBytes[i].ToString("X2");
}
return HexDecString;
}
}
那么为什么我使用准确的凭证收到(403)Forbidden?
我试过这个看原因:
catch (WebException ex)
{
OutputText.text = ex.Response.Headers.ToString ();
}
并收到以下
//Date: Sat, 14 Apr 2018 15:34:56 GMT
//Content-Type: application/json
//Transfer-Encoding: chunked
//Connection: keep-alive
//Set-Cookie: __cfduid=dd1b32592915674669120afbf8181141b1523720096; expires=Sun, 14-Apr-19 15:34:56 GMT; path=/; domain=.poloniex.com; HttpOnly
//Cache-Control: private
//Expect-CT: max-age=604800, report-uri="https://report-//uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
//Server: cloudflare
//CF-RAY: 40b73d4b8c98552e-ORD
答案 0 :(得分:0)
我希望这是因为您的Sign
标头无效。
您可以使用伪造的nonce
和伪造的secret
仔细检查您的符号功能是否正常,并验证sign
是否正确
发布数据:nonce=123456&command=returnBalances
现时:123456
秘密:123456
sign
将是:b56174398987d15deee73885ca178ba82c414c7f27e763a9aa3cfc41c5b1373980ed83638bbf8c66dc62c20cbf35e770ad264af8571d22bc7c96fae9740dac0
如果符号不同,请共享您的genHMAC
代码功能。
您可以尝试使用此版本生成sign
标头:
private readonly string _apiKey = "123456";
private readonly string _apiSecret = "123456";
private long nonce = DateTime.Now.Ticks;
private string CreateSignature()
{
//string msg = string.Format("{0}{1}{2}", _apiKey);
return ByteArrayToString(SignHMACSHA512(_apiSecret, StringToByteArray(_apiKey))).ToUpper();
}
private static byte[] SignHMACSHA512(String key, byte[] data)
{
HMACSHA512 hashMaker = new HMACSHA512(Encoding.ASCII.GetBytes(key));
return hashMaker.ComputeHash(data);
}
private static byte[] StringToByteArray(string str)
{
return System.Text.Encoding.ASCII.GetBytes(str);
}
private static string ByteArrayToString(byte[] hash) //rimuove - e converte in bite
{
return BitConverter.ToString(hash).Replace("-", "").ToLower();
}
然后:
const string WEBSERVICE_URL = "https://poloniex.com/tradingApi";
try
{
var webRequest = System.Net.WebRequest.Create(WEBSERVICE_URL);
if (webRequest != null)
{
webRequest.Method = "POST";
webRequest.Timeout = 12000;
webRequest.ContentType = "application/x-www-form-urlencoded";
webRequest.Headers.Add("Key", _apiKey);
webRequest.Headers.Add("Sign", CreateSignature()); // keysecret
var postData = "&nonce=&command=returnBalances";
var data = Encoding.ASCII.GetBytes(postData);
using (System.IO.Stream s = webRequest.GetResponse().GetResponseStream())
{
using (System.IO.StreamReader sr = new System.IO.StreamReader(s))
{
var jsonResponse = sr.ReadToEnd();
Console.WriteLine(String.Format("Response: {0}", jsonResponse));
}
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}