future-public: add set leverage request

This commit is contained in:
mahdi msr committed 2025-09-28 15:22:55 +03:30
1 parent bea493935b
commit 0996c5fc27
9 files changed
+377 -25

No files matched your search

@@ -0,0 +1,19 @@
<?php
namespace Msr\LaravelBitunixApi\Requests;
use Psr\Http\Message\ResponseInterface;
interface ChangeLeverageRequestContract
{
/**
* Change leverage for a trading pair
*
* @param string $symbol Trading pair (e.g., 'BTCUSDT')
* @param string $marginCoin Margin coin (e.g., 'USDT')
* @param int $leverage Leverage value
* @return ResponseInterface
*/
public function changeLeverage(string $symbol, string $marginCoin, int $leverage): ResponseInterface;
}
+102 -23
View File
@@ -4,47 +4,126 @@ namespace Msr\LaravelBitunixApi\Requests;
class Header
{
public static function sortQueryParameters(array $parameters): ?array
/**
* Sort query parameters in ascending ASCII order by Key
*
* @param array $parameters
* @return array
*/
public static function sortQueryParameters(array $parameters): array
{
$sortableParameters = $parameters;
if (!count($sortableParameters)) {
if (empty($parameters)) {
return [];
}
ksort($sortableParameters, SORT_LOCALE_STRING);
return $sortableParameters;
ksort($parameters, SORT_STRING);
return $parameters;
}
public static function digestQueryParameters(array $parameters): ?string
/**
* Convert sorted parameters to string format
* Example: ["id" => "1", "uid" => "200"] becomes "id1uid200"
*
* @param array $parameters
* @return string
*/
public static function digestQueryParameters(array $parameters): string
{
if (!count($parameters)) {
return null;
if (empty($parameters)) {
return '';
}
$sortedParameters = self::sortQueryParameters($parameters);
return implode('', array_map(
fn($k, $v) => $k . $v,
array_keys($sortedParameters),
array_values($sortedParameters)
));
$result = '';
foreach ($sortedParameters as $key => $value) {
$result .= $key . $value;
}
return $result;
}
public static function generateNonce(): ?string
/**
* Generate a random 32-bit nonce string
*
* @return string
*/
public static function generateNonce(): string
{
return md5(uniqid(mt_rand(), true));
return bin2hex(random_bytes(16)); // 32 characters
}
public static function generateSignValue(array $queryParams = [], string $body = '', string $randomNonce = ''): string
/**
* Generate current timestamp in milliseconds
*
* @return string
*/
public static function generateTimestamp(): string
{
return (string) round(microtime(true) * 1000);
}
/**
* Generate signature according to Bitunix API documentation
*
* Steps:
* 1. Sort all queryParams in ascending ASCII order by Key
* 2. Remove all spaces from body string
* 3. Create digest: SHA256(nonce + timestamp + api-key + queryParams + body)
* 4. Create sign: SHA256(digest + secretKey)
*
* @param array $queryParams
* @param string $body
* @param string $nonce
* @param string $timestamp
* @return string
*/
public static function generateSignValue(array $queryParams = [], string $body = '', string $nonce = '', string $timestamp = ''): string
{
$apiKey = config('bitunix-api.api_key');
$apiSecret = config('bitunix-api.api_secret');
$timeStamp = (string)round(microtime(true) * 1000);
$digestedQueryParam = self::digestQueryParameters($queryParams);
if (empty($apiKey) || empty($apiSecret)) {
throw new \InvalidArgumentException('API key and secret must be configured');
}
$digestedHeader = $randomNonce . $timeStamp . $apiKey . $digestedQueryParam . $body;
$hash = hash('sha256', $digestedHeader);
$sign = $hash . $apiSecret;
return hash('sha256', $sign);
// Step 1: Sort query parameters in ascending ASCII order
$queryParamsString = self::digestQueryParameters($queryParams);
// Step 2: Remove all spaces from body (already done if JSON encoded properly)
$bodyString = trim($body);
// Step 3: Create digest: SHA256(nonce + timestamp + api-key + queryParams + body)
$digestInput = $nonce . $timestamp . $apiKey . $queryParamsString . $bodyString;
$digest = hash('sha256', $digestInput);
// Step 4: Create sign: SHA256(digest + secretKey)
$signInput = $digest . $apiSecret;
$sign = hash('sha256', $signInput);
return $sign;
}
/**
* Generate complete headers for authenticated requests
*
* @param array $queryParams
* @param string $body
* @return array
*/
public static function generateHeaders(array $queryParams = [], string $body = ''): array
{
$nonce = self::generateNonce();
$timestamp = self::generateTimestamp();
$sign = self::generateSignValue($queryParams, $body, $nonce, $timestamp);
return [
'api-key' => config('bitunix-api.api_key'),
'sign' => $sign,
'nonce' => $nonce,
'timestamp' => $timestamp,
'language' => config('bitunix-api.language', 'en-US'),
'Content-Type' => 'application/json',
];
}
}