さんごー日記。

映画や本やゲームの感想をゆるく記録したり、プログラミングの勉強をゆるく記録するゆるい日記です。

【QUOINEX+PHP】QUOINEXのAPIにPHPからアクセス【サンプルコード有り】

f:id:thirtyfive:20180815190628p:plain

こんにちは。さんごーです。

これでもいちおうプログラマーです。

今回は仮想通貨取引所のQUOINEXのAPIをPHPから呼び出してみます。

WebAPIって「簡単に使えるようにAPI用意しといたで^^」みたいな顔してるけど、はじめて触る時ってけっこうハードル高くないですか?

よく分からないエラー出たり、原因が謎だったり、API仕様書が間違ってたりバグがあったり

この記事ではAPIを使えるようにするまでの手順と、実際のPHPのソースコードを紹介します。

PHPのサンプルでちゃんと動く物もなかなか見つからなかったので、参考にしてください。

流行りの仮想通貨で遊びましょう。

QUOINEXの口座開設

まずはQUOINEXのアカウントを申し込みます。

以下から登録できます。
QUOINEX

本人確認書類の画像ファイルを用意しておきましょう。
免許証の表と裏、あと自分のセルフィ―画像が必要です。

書類審査には数日かかるようです。
f:id:thirtyfive:20180815145557p:plain

書類審査が完了してなくても、とりあえずAPIは呼び出せます。このまま進みます。

2段階認証の設定

セキュリティ強化のため、スマホアプリを使った2段階認証を有効にしておきます。

2段階認証が有効になっているとこんな感じ。
f:id:thirtyfive:20180815185425p:plain

画面上でも案内されますが、認証用のアプリをインストールします。
いくつか種類があるようですが、私は「Google Authenticator」を選びました。

iPhone用

Google Authenticator

Google Authenticator

  • Google, Inc.
  • ユーティリティ
  • 無料

Android用
play.google.com

アプリを立ちあげて、QUOINEXの画面に表示されるQRコードを読み込めば初期設定完了です。
今後はログインの際にこのアプリで認証コードを取得します。

APIで使用するトークンを取得します。

APIを使うには、トークンを取得する必要があります。

QUOINEXにログインして、右上の「≡」みたいな記号のアイコンを押してメニューを表示させて、
「トークン」をクリックします。
f:id:thirtyfive:20180815153333p:plain

「APIトークンを新規作成する」ボタンを押します。
f:id:thirtyfive:20180815153539p:plain

トークンの権限を設定します。とりあえず全部チェック入れときましょう。
2段階認証のコードは認証用のスマホアプリに表示されるやつです。
f:id:thirtyfive:20180815153641p:plain

トークンが生成できました。1度しか表示されないので、このタイミングでローカルに保存しておきましょう。
f:id:thirtyfive:20180815153907p:plain

【PHPサンプルコード有り】APIでアカウント情報を取得してみる

AUOINEXのAPIリファレンスを見ながら、とりあえずAPIを試してみます。
↓リファレンス
Quoine Exchange API Reference

とりあえず動くPHPのサンプルコードを書いてみました。

quoinex.phpなどと名前を付けて保存してください。

<?php

$token_id = 'QUOINEXの画面で取得したトークンID';
$user_secret = 'QUOINEXの画面で取得したトークンの値';

$timestamp = time();
$method = 'GET';
$strUrl = '/fiat_accounts';

$headers = ['alg'=>'HS256','typ'=>'JWT'];
$headers_encoded = base64url_encode(json_encode($headers));

$payload = ['path'=>$strUrl, 'nonce'=>$timestamp, 'token_id'=>$token_id];
$payload_encoded = base64url_encode(json_encode($payload));

$signature = hash_hmac("sha256", $headers_encoded.".".$payload_encoded, $user_secret, true);
$signature_encoded = base64url_encode($signature);

$quoine_auth = $headers_encoded.".".$payload_encoded.".".$signature_encoded;

$ch = curl_init('https://api.quoine.com'.$strUrl);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    "X-Quoine-API-Version: 2",
    "X-Quoine-Auth: ".$quoine_auth,
    "Content-Type: ".'application/json',
]); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

$curl_res = curl_exec($ch);
curl_close($ch);
$res = json_decode($curl_res);
var_dump($res);

function base64url_encode($input) {
    return str_replace('=', '', strtr(base64_encode($input), '+/', '-_'));
}

実行と結果。

> php quoinex.php
array(1) {
  [0]=>
  object(stdClass)#1 (10) {
    ["id"]=>
    int(XXXXXX)
    ["currency"]=>
    string(3) "JPY"
    ["currency_symbol"]=>
    string(2) "¥"
    ["balance"]=>
    string(3) "0.0"
    ["send_to_btc_address"]=>
    NULL
    ["pusher_channel"]=>
    string(23) "user_XXXXXX_account_jpy"
    ["lowest_offer_interest_rate"]=>
    string(7) "0.00050"
    ["highest_offer_interest_rate"]=>
    string(7) "0.00070"
    ["exchange_rate"]=>
    string(29) "0.008985937008581569843195399"
    ["currency_type"]=>
    string(4) "fiat"
  }
}

こんな感じでうまくいきました。
JWTの署名を生成するのにちょっと手こずりました。

PHPのソースコードの解説・注意点

アクセストークンの設定

今回はサンプルなのでトークンIDとトークンの値をソースコードにベタ書きしてますが、これはあまり良くないです。

$token_id = '<span style="color: #ff0000">QUOINEXの画面で取得したトークンID</span>';
$user_secret = '<span style="color: #ff0000">QUOINEXの画面で取得したトークンの値</span>';

トークンがばれるとあなたのアカウントが悪用されたりしますので、トークンは厳重に管理してください。
Web上に公開されない場所に暗号化して保管するか、環境変数に入れるなどして、Git等のソースコード管理には入れないようにしましょうね。

PHPでJWT署名の生成

一番厄介なJWT署名生成は以下の部分です。

$headers = ['alg'=>'HS256','typ'=>'JWT'];
$headers_encoded = base64url_encode(json_encode($headers));

$payload = ['path'=>$strUrl, 'nonce'=>$timestamp, 'token_id'=>$token_id];
$payload_encoded = base64url_encode(json_encode($payload));

$signature = hash_hmac("sha256", $headers_encoded.".".$payload_encoded, $user_secret, true);
$signature_encoded = base64url_encode($signature);

$quoine_auth = $headers_encoded.".".$payload_encoded.".".$signature_encoded;

~中略~

function base64url_encode($input) {
    return str_replace('=', '', strtr(base64_encode($input), '+/', '-_'));
}

PHPのライブラリを使う方法もありますが、インストールとか面倒なのでとりあえずコピペで使える上記のコードで試してみるのが早いかと思います。
ヘッダー、ペイロード、署名をそれぞれbase64エンコードして、最後に「.(ピリオド)」で連結するのがミソですかね。

SSL証明書の検証をスキップする

curl_setopt()でSSL証明書の検証をスキップしちゃいましょう。これをやらないとcurl_exec()でエラーになります。

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

おまけ

Windows環境でPHPのcurl_ini()関数がエラーになる場合

このAPIを試そうと思ったら、Windows環境でPHPのcurl‗ini()のエラーが出てしまったので対処法をメモしました。
同じようなエラーが出ている方の参考になればと思います。
【PHP+Windows】curl_init()を呼び出すと「Call to undefined function curl_init()」というエラーが出る場合の対処。 - さんごー日記。


今回は以上!
また何か動く物が出来たら紹介したいと思います。