こんにちは。さんごーです。
これでもいちおうプログラマーです。
今回は仮想通貨取引所のQUOINEXのAPIをPHPから呼び出してみます。
WebAPIって「簡単に使えるようにAPI用意しといたで^^」みたいな顔してるけど、はじめて触る時ってけっこうハードル高くないですか?
よく分からないエラー出たり、原因が謎だったり、API仕様書が間違ってたりバグがあったり…
この記事ではAPIを使えるようにするまでの手順と、実際のPHPのソースコードを紹介します。
PHPのサンプルでちゃんと動く物もなかなか見つからなかったので、参考にしてください。
流行りの仮想通貨で遊びましょう。
QUOINEXの口座開設
まずはQUOINEXのアカウントを申し込みます。
以下から登録できます。
QUOINEX
本人確認書類の画像ファイルを用意しておきましょう。
免許証の表と裏、あと自分のセルフィ―画像が必要です。
書類審査には数日かかるようです。
書類審査が完了してなくても、とりあえずAPIは呼び出せます。このまま進みます。
2段階認証の設定
セキュリティ強化のため、スマホアプリを使った2段階認証を有効にしておきます。
2段階認証が有効になっているとこんな感じ。
画面上でも案内されますが、認証用のアプリをインストールします。
いくつか種類があるようですが、私は「Google Authenticator」を選びました。
iPhone用
Android用
play.google.com
アプリを立ちあげて、QUOINEXの画面に表示されるQRコードを読み込めば初期設定完了です。
今後はログインの際にこのアプリで認証コードを取得します。
APIで使用するトークンを取得します。
APIを使うには、トークンを取得する必要があります。
QUOINEXにログインして、右上の「≡」みたいな記号のアイコンを押してメニューを表示させて、
「トークン」をクリックします。
「APIトークンを新規作成する」ボタンを押します。
トークンの権限を設定します。とりあえず全部チェック入れときましょう。
2段階認証のコードは認証用のスマホアプリに表示されるやつです。
トークンが生成できました。1度しか表示されないので、このタイミングでローカルに保存しておきましょう。
【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()」というエラーが出る場合の対処。 - さんごー日記。
今回は以上!
また何か動く物が出来たら紹介したいと思います。