介绍
WARMKEY API 是一个 RESTful 服务,专为安全高效的支付网关操作而构建。身份验证通过 API 密钥进行,确保所有请求都经过验证和授权。每个用户都会收到一对凭证:一个 API 密钥和一个 RSA 私钥,类似于用户名和密码。重要的是,WARMKEY 绝不会存储用户的 RSA 私钥。
- API密钥放置在请求体的头部参数中。
- RSA 私钥用于生成签名,从而确保请求的完整性和真实性。
通过利用这些密钥,WARMKEY 确保了强大的安全机制,防止未经授权的访问,同时提供灵活且可扩展的 API 来处理与支付相关的操作。
基本 URL
基本 URL 是 WARMKEY 用于接收 API 请求的主要域名。每个 API 端点都指定其唯一的 URL 路径,完整的 API 端点 URL 由基本 URL 与相应的 URL 路径组合而成。
例如,完整的 API 请求 URL 结构如下:
{基本 URL} + {端点 URL 路径}
这种结构使 WARMKEY 能够高效地组织和处理不同的 API 请求,确保每个服务调用都能到达相应的端点。所有请求都必须以基本 URL 开头,后跟与所需功能对应的特定路径。
请求
requestBody.header
这些标头是必须包含的,并且位于请求正文中,而不是 HTTP 标头中。
| 参数 | 类型/格式 | 描述 |
|---|---|---|
| api_key | string | 从https://secure.warmkey.finance门户获取您的 API 密钥及其关联的 RSA 私钥。 |
| signature | string / hex | 由 $headers 和 $payload 连接生成的 64 字节签名。 |
| nonce | string / milliseconds | 13位数字 |
签名生成
使用 RSA 私钥 生成签名,并将包含在标头的 signature 参数中。
$signature_data = json_encode(["header"=>$headers, "payload"=>$payload]);
$to_sign = hash('sha256', $signature_data, true);
$your_private_key_pem = <<EOD
-----BEGIN PRIVATE KEY-----
MIIBVwIBADANBgkqhkiG9w0BAQEFAASCAUEwggE9AgEAAkEA1eerGN7aInrV0myN
5RYAVL58JsUQCdkIUYDLoupVLnhO8uw0DD5ooNwd8gT8KJU0UzKSpRN+sjSwutD3
ZMrvAQIDAQABAkEA1VLwmKIPa5mTSwLF1DTH6bv6tvOK1jdjC11mOLh4cRjoEw83
FzwSfuWlGyFGdir5PE5SK/1D8nZ41h8bnw9pAQIhAP/AQKUYlha+t7gGstFc+J6Z
9ZgoxT44ngyF5dE/4+FRAiEA1hz8Rpwwrm8pwp+kdho8guTwozmpvMrQYdRufjag
RrECIQCTtZrgf3m3+0CqlZvTlam2GF+jGPEKhbKqsu7P0uGvcQIhAIr1MtEMqxd6
M6sI+q5fZqg4tufoE33gTo8/VBp7j1dxAiEAsvhkqXu0AWvkJxVrCfQWiv5RMxAL
LXPLNzdej9IFEns=
-----END PRIVATE KEY-----
EOD;
$private_key = openssl_pkey_get_private($your_private_key_pem);
openssl_sign($to_sign, $signature, $private_key, OPENSSL_ALGO_SHA256);
Nonce
这是为了防止重放攻击,并设定一定的容错率。用户只需输入当前的毫秒数即可。
requestBody.payload
- 每个 API 端点都有其独特的有效负载设计。
- 所有参数值均为字符串类型,并且 API 端点中也指定了格式类型。我们这样设计有两个原因。
- 为了让双方容易生成一致的签名。
- 在加密货币领域,金额可能非常大也可能非常小,字符串更适合处理这种情况。
代码示例
<?php
// Define the API credentials
$api_key = '<YOUR API KEY>'; // Replace with your API Key
$api_url = 'https://api.warmkey.finance'; // base url
$api_path = '/paymentV1/queryLog'; // path to reach getConversionRate
// Create a nonce (e.g, current miliseconds to ensure uniqueness)
$nonce = (string)round(microtime(true) * 1000);
// Define the payload (getConversionRate has empty payload)
$payload = [
'log_id' => 1
];
// Generate the signature
$headers = [
'api_key' => $api_key,
'nonce' => $nonce
];
$signature_data = json_encode(["header"=>$headers, "payload"=>$payload]);
$to_sign = hash('sha256', $signature_data, true);
$your_private_key_pem = "<YOUR PRIVATE KEY IN PEM FORMAT>";
$private_key = openssl_pkey_get_private($your_private_key_pem);
openssl_sign($to_sign, $signature, $private_key, OPENSSL_ALGO_SHA256);
$headers["signature"] = bin2hex($signature);
$request_body = ["header"=>$headers, "payload"=>$payload];
// Prepare the cURL request
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $api_url.$api_path);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($request_body));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// Execute the cURL request and get the response
$response = curl_exec($ch);
// Handle errors
if (curl_errno($ch)) {
echo 'Error:' . curl_error($ch);
} else {
echo 'Response:' . $response;
}
// Close the cURL session
curl_close($ch);
?>
响应与错误
- 响应以 JSON 文档形式呈现。
- WARMKEY 不依赖于 HTTP 异常处理代码。
必填参数
| 参数 | 类型/格式 | 描述 |
|---|---|---|
| code | string / uint64 | 如果代码不等于 100,则出错。 |
| message | string | 如果代码不等于 100,则显示错误消息。 |
| result | generic | 每个API接口都有其自身的结果设计。 |
| nonce | string / milliseconds | 13位数字表示毫秒。 |
| signature | string / hex | 使用 hash256( json_encode['code'=>..., 'message'=>..., 'result'=> ..., 'nonce'=>...] ) 生成 64 字节签名。 |
例如,
{
"code": "100",
"message": "Success",
"result": ["... some value ..."]
}
成功响应
| 代码 | 信息 |
|---|---|
| 100 | 成功 |
错误响应
代码 > 100。
| 代码 | 信息 |
|---|---|
| 101 | 签名无效 |
| 102 | WarmKey 正在维护中 |
| 103 | API 密钥无效 |
| 104 | 随机值无效 |
| 105 | API 速率限制已超出 |
| 106 | API 方式无效 |
| 107 | 该API方式正在维护中 |
| 108 | 参数不完整 |
| 109 | 参数格式无效 |
| 110 | 网络无效 |
| 111 | 地址格式无效 |
| 112 | 重复的Unique Id |
| 113 | 代币符号无效 |
| 114 | 未完成的提现设置 |
| 115 | 无法创建提现请求 |
| 116 | 未找到提款 |
| 117 | 未找到存款 (001) |
| 118 | 未找到存款 (002) |
| 119 | 未经授权的访问 |
| 202 | 暂未付款 |
| 290 | 参数无效 |
| 291 | 未找到可用的代币 (001) |
| 292 | 未找到可用的代币 (002) |
| 293 | 地址路径无效 |