hereと記載されているAPIを使用しようとしています。秘密鍵に基づくHMAC SHA512認可を使用します。HMACでAPIからデータを取得するSHA512 - Swift
実装の例は、PHPであり:
function bitmarket_api($method, $params = array())
{
$key = "klucz_jawny";
$secret = "klucz_tajny";
$params["method"] = $method;
$params["tonce"] = time();
$post = http_build_query($params, "", "&");
$sign = hash_hmac("sha512", $post, $secret);
$headers = array(
"API-Key: " . $key,
"API-Hash: " . $sign,
);
$curl = curl_init();
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_URL, "https://www.bitmarket.pl/api2/");
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $post);
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
$ret = curl_exec($curl);
return json_decode($ret);
}
それから私は、スウィフトにそれを実装しようとしていた。
import Alamofire
import CryptoSwift
func getRawJSON(method: String, params: [String]) -> String {
let publicKey = "publicKeyHere"
let secretKey = "secretKeyHere"
let APIURL = "https://www.bitmarket.pl/api2/"
var params = [
"method": method,
"tonce:": NSDate().timeIntervalSince1970
] as [String : Any]
let hmac: Array<UInt8> = try! HMAC(key: secretKey.utf8.map({$0}), variant: .sha512).authenticate(params)
var headers = [
"API-Key": publicKey,
"API-Hash": hmac
] as [String : Any]
}
あなたが気づいているように、データをフェッチするためのAlamofireの使用はありません私は送信するデータの準備に問題があるためです。私はCannot convert value of type '[String : Any]' to expected argument type 'Array<UInt8>'
のときに私がhmac
変数を宣言しようとしているときに、私はこのエラーが出ているので、私はCryptoSwiftで何かを混乱させたということです。
どうすれば解決できますか? params
アレイをArray<UInt8
に変換する必要があるかもしれませんが、その方法はわかりません。私はすべてが正しいことも確かではありません。
編集:マーティン・R、実際のコードに おかげである:
func getRawJSON(method: String, paramether: String) {
let publicKey = "publicKeyHere"
let secretKey = "secretKeyHere"
let APIURL = "https://www.bitmarket.pl/api2/"
let query = NSURLComponents()
query.queryItems = [NSURLQueryItem(name: "method", value: method) as URLQueryItem,
NSURLQueryItem(name: "tonce", value: String(Int(NSDate().timeIntervalSince1970))) as URLQueryItem]
let requestString = query.query!
let requestData = Array(requestString.utf8)
let params = [
"method": method,
"tonce:": String(Int(NSDate().timeIntervalSince1970))
] as [String : Any]
let hmac: Array<UInt8> = try! HMAC(key: secretKey.utf8.map({$0}), variant: .sha512).authenticate(requestData)
let hmacData = Data(bytes: hmac)
let hmacString = hmacData.base64EncodedString()
let headers = [
"API-Key": publicKey,
"API-Hash": hmacString
] as [String : String]
Alamofire.request(APIURL, withMethod: .post, parameters: params, encoding: .url, headers: headers)
.responseJSON { response in
print(response)
}
}
残念ながら、機能(getRawJSON(method: "info", paramether: "")
)を呼び出した後、私はエラーでJSONを取得しています:
{
error = 502;
errorMsg = "Invalid message hash";
time = 1472910139;
}
私のハッシュには何が問題なのですか?指定されたパラメータからクエリ文字列を作成します。
巨大なおかげで、多くのことを助けました。今、ハッシュに関する問題が発生しました。私の質問を詳細に編集しました。 – kkarol
@kkarol:PHPコードの '$ post'と' $ sign'の値をSwiftコードの 'requestString'と' hmac'と比較します。 –
'requestString'は' $ post'と同じですが、 '$ sign'は' hmac'と 'hmacString'とは異なります。 'hmacString'はbase64であり、' $ sign'は例えば。 '450043310da274122369bfc0ca621e47fb0b03857746c096a944748585fcd3280744ee4633711f98bbfe3bf0c199deec329a64b723799e597304cfd683ac40e6'。 'Array'を正しいフォーマットに変換する方法を知らない。 –
kkarol