import java.io.*;
import java.net.*;
import java.security.MessageDigest;
import java.util.*;

/**
 * 云汇宝聚合支付 SDK
 * @version 1.0
 */
public class YunhuibaoClient {
    private String merchantNo;
    private String merchantKey;
    private String baseUrl;

    public YunhuibaoClient(String merchantNo, String merchantKey) {
        this(merchantNo, merchantKey, "https://yunhuibao.com/api/");
    }

    public YunhuibaoClient(String merchantNo, String merchantKey, String baseUrl) {
        this.merchantNo = merchantNo;
        this.merchantKey = merchantKey;
        this.baseUrl = baseUrl;
    }

    private String sign(Map<String, String> params) {
        params.put("merchant_no", merchantNo);
        params.put("timestamp", String.valueOf(System.currentTimeMillis() / 1000));
        List<String> keys = new ArrayList<>(params.keySet());
        Collections.sort(keys);
        StringBuilder sb = new StringBuilder();
        for (String k : keys) {
            if (sb.length() > 0) sb.append("&");
            sb.append(k).append("=").append(params.get(k));
        }
        sb.append("&key=").append(merchantKey);
        return md5(sb.toString());
    }

    private String md5(String input) {
        try {
            MessageDigest md = MessageDigest.getInstance("MD5");
            byte[] bytes = md.digest(input.getBytes("UTF-8"));
            StringBuilder sb = new StringBuilder();
            for (byte b : bytes) sb.append(String.format("%02x", b));
            return sb.toString();
        } catch (Exception e) { return ""; }
    }

    public String createOrder(Map<String, String> params) throws Exception {
        return request("create_order.php", params);
    }

    public String queryOrder(Map<String, String> params) throws Exception {
        return request("query_order.php", params);
    }

    private String request(String path, Map<String, String> params) throws Exception {
        String sign = sign(params);
        params.put("sign", sign);
        StringBuilder json = new StringBuilder("{");
        for (Map.Entry<String, String> e : params.entrySet()) {
            if (json.length() > 1) json.append(",");
            json.append("\"").append(e.getKey()).append("\":\"").append(e.getValue()).append("\"");
        }
        json.append("}");
        URL url = new URL(baseUrl + path);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setRequestMethod("POST");
        conn.setRequestProperty("Content-Type", "application/json");
        conn.setDoOutput(true);
        conn.getOutputStream().write(json.toString().getBytes("UTF-8"));
        BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
        StringBuilder resp = new StringBuilder();
        String line;
        while ((line = reader.readLine()) != null) resp.append(line);
        reader.close();
        return resp.toString();
    }
}