Java tutorial
/* * BTC-e client for JavaFX * Copyright (C) 2014 QuarkDev Solutions <quarkdev.solutions@gmail.com> * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.QuarkLabs.BTCeClientJavaFX.networking; import org.json.JSONObject; import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec; import java.io.*; import java.net.HttpURLConnection; import java.net.URL; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import java.util.HashMap; import java.util.Iterator; import java.util.Map; /** * Class responsible for all requests with API key required */ public class AuthRequest { private static final String PATH_TO_API_KEY_CONFIG = "config/API.txt"; private static final String TRADE_API_URL = "https://btc-e.com/tapi"; static { try { BufferedReader reader = new BufferedReader(new FileReader(PATH_TO_API_KEY_CONFIG)); String temp; while ((temp = reader.readLine()) != null) { String[] values = temp.split(":"); if ("Key".equals(values[0])) { key = values[1]; } else if ("Secret".equals(values[0])) { secret = values[1]; } } reader.close(); } catch (IOException e) { e.printStackTrace(); } } private static String key; private static String secret; private long nonce; private Mac mac; private SecretKeySpec _key; public AuthRequest(long nonce) { this.nonce = nonce; } /** * Converts byte array to HEX string * * @param array Byte array * @return HEX String */ private static String byteArrayToHexString(byte[] array) { StringBuffer hexString = new StringBuffer(); for (byte b : array) { int intVal = b & 0xff; if (intVal < 0x10) hexString.append("0"); hexString.append(Integer.toHexString(intVal)); } return hexString.toString(); } public JSONObject makeRequest(String method, Map<String, String> arguments) throws UnsupportedEncodingException { if (method == null) { return null; } if (arguments == null) { arguments = new HashMap<>(); } arguments.put("method", method); arguments.put("nonce", "" + ++nonce); String postData = ""; for (Iterator it = arguments.entrySet().iterator(); it.hasNext();) { Map.Entry<String, String> ent = (Map.Entry<String, String>) it.next(); if (postData.length() > 0) { postData += "&"; } postData += ent.getKey() + "=" + ent.getValue(); } try { _key = new SecretKeySpec(secret.getBytes("UTF-8"), "HmacSHA512"); } catch (UnsupportedEncodingException uee) { System.err.println("Unsupported encoding exception: " + uee.toString()); return null; } try { mac = Mac.getInstance("HmacSHA512"); } catch (NoSuchAlgorithmException nsae) { System.err.println("No such algorithm exception: " + nsae.toString()); return null; } try { mac.init(_key); } catch (InvalidKeyException ike) { System.err.println("Invalid key exception: " + ike.toString()); return null; } StringBuilder out = new StringBuilder(); try { HttpURLConnection urlConnection = (HttpURLConnection) (new URL(TRADE_API_URL)).openConnection(); urlConnection.setRequestMethod("POST"); urlConnection.setRequestProperty("Content-type", "application/x-www-form-urlencoded"); urlConnection.setRequestProperty("Key", key); String sign = byteArrayToHexString(mac.doFinal(postData.getBytes("UTF-8"))); urlConnection.setRequestProperty("Sign", sign); urlConnection.setDoOutput(true); DataOutputStream wr = new DataOutputStream(urlConnection.getOutputStream()); wr.writeBytes(postData); wr.flush(); wr.close(); if (urlConnection.getResponseCode() == 200) { BufferedReader rd = new BufferedReader(new InputStreamReader(urlConnection.getInputStream())); String line; while ((line = rd.readLine()) != null) { out.append(line); } rd.close(); } } catch (IOException e) { e.printStackTrace(); } return new JSONObject(out.toString()); } }