Я изменяю текущую монетную монету Coinbase Php, чтобы использовать новую аутентификацию ключа + секретного API. Я думаю, что я следую их инструкциям идеально, но я всегда получаю ответ: "error":"ACCESS_SIGNATURE does not validate"
Используя новый ключ Coinbase Key + Secret, я не могу создать действительный ADDRESS_SIGNATURE. Что случилось с этим кодом?
До сих пор у меня есть:
- подтвердил, что подпись является строчной шестигранной хэш
- Подтверждено от ЦБ обратный вызов, что мой ключ доступа принимается
- Подтверждены от CB обратного вызова, что мой нонс действует
- подтвердил, что мой API Секретного ключа является правильным
Мой тест - это POST-запрос https://coinbase.com/api/v1/buttons
с несколькими параметрами $. Он работал с использованием старого метода API. Я не уверен, что я делаю неправильно в рамках этого нового метода API.
Вот модифицированный Coinbase_Rpc :: метод запроса:
public function request($method, $url, $params)
{
if ($this->_apiKey === null) {
throw new Coinbase_ApiException("Invalid API key", 500, "An invalid API key was provided.");
}
$url = Coinbase::API_BASE . $url;
$nonce = (int)(microtime(true) * 100);
// Create query string
$queryString = http_build_query($params);
// Initialize CURL
$curl = curl_init();
$curlOpts = array();
// HTTP method
$method = strtolower($method);
if ($method == 'get') {
$curlOpts[CURLOPT_HTTPGET] = 1;
$url .= "?" . $queryString;
} else if ($method == 'post') {
$curlOpts[CURLOPT_POST] = 1;
$curlOpts[CURLOPT_POSTFIELDS] = $queryString;
} else if ($method == 'delete') {
$curlOpts[CURLOPT_CUSTOMREQUEST] = "DELETE";
$url .= "?" . $queryString;
} else if ($method == 'put') {
$curlOpts[CURLOPT_CUSTOMREQUEST] = "PUT";
$curlOpts[CURLOPT_POSTFIELDS] = $queryString;
}
// Headers
$headers = array(
'User-Agent: CoinbasePHP/v1',
'Accept: */*',
'Connection: close',
'Host: coinbase.com',
'ACCESS_KEY: ' . $this->_apiKey,
'ACCESS_NONCE: ' . $nonce,
'ACCESS_SIGNATURE: ' . hash_hmac("sha256", $nonce . $url, $this->_apiSecret)
);
// CURL options
$curlOpts[CURLOPT_URL] = $url;
$curlOpts[CURLOPT_HTTPHEADER] = $headers;
$curlOpts[CURLOPT_CAINFO] = dirname(__FILE__) . '/ca-coinbase.crt';
$curlOpts[CURLOPT_RETURNTRANSFER] = true;
// Do request
curl_setopt_array($curl, $curlOpts);
$response = $this->_requestor->doCurlRequest($curl);
// Decode response
try {
$json = json_decode($response['body']);
} catch (Exception $e) {
throw new Coinbase_ConnectionException("Invalid response body", $response['statusCode'], $response['body']);
}
if ($json === null) {
throw new Coinbase_ApiException("Invalid response body", $response['statusCode'], $response['body']);
}
if (isset($json->error)) {
throw new Coinbase_ApiException($json->error, $response['statusCode'], $response['body']);
} else if (isset($json->errors)) {
throw new Coinbase_ApiException(implode($json->errors, ', '), $response['statusCode'], $response['body']);
}
return $json;
}
Любые идеи?
EDIT: Хотя не модифицируется выше, является фиксированным, а полный PHP Gem доступен здесь: https://github.com/Luth/CoinbasePhpGem
Спасибо! Используя вашу, чтобы работать против, я нашел ту часть, что мне не хватало. CURLOPT_POSTFIELDS считается телом сообщения и должен быть включен в хэш. Duh. :) Я отправлю новый класс в github через несколько минут. –
Wooo! Да, мне потребовалось гораздо больше времени, чтобы понять, чем я хотел бы признать. – RobertAKARobin