微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 C# 计算 bitbns 加密交换 API 的有效负载和签名C# 等效于 javascript 示例代码不起作用

如何解决使用 C# 计算 bitbns 加密交换 API 的有效负载和签名C# 等效于 javascript 示例代码不起作用

我正在尝试构建一个连接到 BitBns 加密交换 API(documentation here) 的 C# 应用程序。您可以轻松导入邮递员工作区。

以下是准备有效负载和签名的 pre-script 块中的 javascript 代码(您将在共享邮递员工作区中获得它):

使用 密钥 = 0B1970CC1594BFB1820EC50DBC052761 秘密 = C6E10435B7C08CC6103CB5274DF4F23A

const timeStamp_nonce = Date.Now().toString();
const body = JSON.parse(pm.request.body);
const secret = pm.environment.get("secret");
const obj = {
    timeStamp_nonce: timeStamp_nonce,body: JSON.stringify(body)
};
const payload = new Buffer(JSON.stringify(obj)).toString('base64');
const signature = CryptoJS.enc.Hex.stringify(CryptoJS.HmacSHA512(payload,secret));
pm.environment.set("body",JSON.stringify(body));
pm.environment.set("payload",payload);
pm.environment.set("signature",signature);

虽然此代码适用于邮递员发起的 API 调用,但以下等效的 C# 代码以 401 禁止响应结束。

string url = "https://api.bitbns.com/api/Trade/v1/getApiUsageStatus/USAGE";
WebRequest request = WebRequest.Create(url);
        request.Method = "POST";
        request.ContentType = "application/x-www-form-urlencoded";
        request.Headers.Add("Accept-Charset","utf-8");
        ((HttpWebRequest)request).Accept = "application/json";
        request.Headers.Add("X-BITBNS-APIKEY","0B1970CC1594BFB1820EC50DBC052761");

        long timestamp = DateTimeOffset.Now.ToUnixTimeMilliseconds();

        Body body = new Body();
        Payload payload = new Payload();
        payload.timeStamp_nonce = timestamp.ToString();
        payload.body = JsonConvert.SerializeObject(value: body);
        string payloadHeader = JsonConvert.SerializeObject(payload);
        byte[] bytePayload = Encoding.UTF8.GetBytes(payloadHeader);
        string base64Payload = Convert.ToBase64String(bytePayload);
        request.Headers.Add("X-BITBNS-PAYLOAD",base64Payload);

        byte[] secretByte = Encoding.UTF8.GetBytes("C6E10435B7C08CC6103CB5274DF4F23A");
        //byte[] messageBytes = new ASCIIEncoding().GetBytes(payloadHeader);
        byte[] messageBytes = Encoding.UTF8.GetBytes(base64Payload);
        byte[] hashmessage = new HMACSHA512(secretByte).ComputeHash(messageBytes);
        
        //// to lowercase hexits
        string signature = String.Concat(Array.ConvertAll(hashmessage,x => x.ToString("x2")));
        request.Headers.Add("X-BITBNS-SIGNATURE",base64Payload);

        HttpWebResponse response = null;
        try
        {
            response = (HttpWebResponse)request.GetResponse();
        }
        catch (Exception exception)
        {
            Console.WriteLine(exception.Message);
            Console.Read();
        }

这里是主体和有效载荷类:

public class Body
{

}

public class Payload
{
    public string timeStamp_nonce = string.Empty;
    public string body;
}

密钥和秘密被张贴在这里供您测试代码。这些都来自一个空帐户,所以一切都很好。

我无法弄清楚 C# 中的哪个加密库会提供与 bitbns 给出的示例前脚本 javascript 代码相同的输出

任何解决此问题的指针将不胜感激。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。