我正在尝试在 PHP 中使用 Coinbase 的高级交易 API。他们决定使用 JWT,但没有给出 PHP 示例。
所以我尝试了我的这段代码,但它返回 NULL。我已经检查过很多次 API 密钥了。详细信息是正确的。以下是 Coinbase 文档的链接:https://docs.cloud.coinbase.com/advanced-trade-api/docs/rest-api-auth
use Firebase\JWT\JWT;
$keyName = 'organizations/b0f974e{redacted}860/apiKeys/d840f8{redacted}b6d';
$keySecret = "-----BEGIN EC PRIVATE KEY-----\nMHcC{redacted}bHEzMVwDhg==\n-----END EC PRIVATE KEY-----\n";
$requestMethod = "GET";
$requestHost = "api.coinbase.com";
$requestPath = "/api/v3/brokerage/accounts";
function buildJwt($uri, $keyName, $keySecret) {
$privateKeyResource = openssl_pkey_get_private($keySecret);
if (!$privateKeyResource) {
throw new Exception('Private key could not be parsed or is invalid.');
}
$payload = [
'sub' => $keyName,
'iss' => 'coinbase-cloud',
'iat' => time(),
'exp' => time() + 120, // Token expiration time (example: 120 seconds from now)
'uri' => $uri,
];
$jwt = JWT::encode($payload, $privateKeyResource, 'ES256');
return $jwt;
}
function main($requestMethod, $requestHost, $requestPath, $keyName, $keySecret) {
$uri = "$requestMethod $requestHost$requestPath";
$jwtToken = buildJwt($uri, $keyName, $keySecret);
return $jwtToken;
}
$myjwt = main($requestMethod, $requestHost, $requestPath, $keyName, $keySecret);
function getAccountDetails($jwt, $requestMethod, $requestHost, $requestPath) {
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://$requestHost$requestPath",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => $requestMethod,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer $jwt",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
return json_decode($response, true);
}
}
$res = getAccountDetails($myjwt, $requestMethod, $requestHost, $requestPath);
var_dump($res);
<?php
require '../../vendor/autoload.php';
use \Firebase\JWT\JWT;
function createMyJWT($request_path)
{
$key_name = 'organizations/9xxxxxxa-93ce-4f50-bee9-4xxxxxxxxxxd/apiKeys/2xxxxxxx0-5aea-47c8-9445-cxxxxxxxxxxf';
$key_secret = "-----BEGIN EC PRIVATE KEY-----\nMxxxxxxxxxxxxxxxxxxxxxxxxxl4/NxxxxxxxxxS/rtxxxxxxxxxxxxxxxxxxxxxxxxM49\nAxxxxxxxxxQgAEc2/6Bxxxxxxxl+oxxxxxxxxxxhc/SxxxxxxxxxxxxxxxxxxxxxxY\nxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9A==\n-----END EC PRIVATE KEY-----\n";
$request_method = 'GET';
$url = 'api.coinbase.com';
$algorithm = 'ES256';
$uri = $request_method . ' ' . $url . $request_path;
$token = JWT::encode(
[
'iss' => 'coinbase-cloud',
'nbf' => time(),
'exp' => time() + 120,
'sub' => $key_name,
'uri' => $uri
],
$key_secret,
$algorithm,
null,
[
'kid' => $key_name,
'nonce' => bin2hex(random_bytes(16))
]
);
return $token;
}
?>