package chat.sms;

import java.io.Closeable;
import java.io.IOException;
import java.security.KeyFactory;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.PKCS8EncodedKeySpec;
import java.util.Base64;
import java.util.HashMap;
import java.util.Map;

import javax.crypto.Cipher;

import org.apache.http.HttpEntity;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.util.EntityUtils;
import org.apache.log4j.Logger;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;

import cn.hutool.http.HttpRequest;

public class OneClickLogin {

	private static Logger log = Logger.getLogger(OneClickLogin.class);
	private final String prikey = "MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBALFmv2SAZcnEUPaTNRBdOIL5Eg1e02Vj448AR4DnbMpEQMugM6zIqGik6Ckp43Jo9tXTsm6gvjcwQgYWd7U7FrsMpazH3d0ubtRiVPKxQpZKqfvGu3z6GC75LAy+qToCXecHAGU8eLOke116VrDKXjMkvTi72fhdb7gBQE2pukU1AgMBAAECgYAlRhtsuHWqoS8JwABkQdH/4uliGcx8/zHu9/YOJZH8Jb8fibeR1E9ePVfyXjTF8zv5zZMuH2QYIHGe6dWZJKMvrBNqOucnbdQ8dQMNuD+1Bg2q0zZH5EBa+Q3ISA9jYwoYTLz7sJC/n3IfkNtKQAqDIS8qjMZsmzfSSPhFi0J9AQJBAOogYuY+EPUUxh9stHraMguKWelidDk5dU1GPf+Nvi4+D+LUeqtTqVj/JHKV2CpWAlwfXpwVFiUWAMCoxj2phBUCQQDB+anXyEh4DB3HxMHs1a8P0JqF/G4HLVfRliNp2sJ3jNV9Ypp8F2QMnV7dFt2Lrdpgr8dipFLQkRboWRcj7mShAkEA6Klsfs+4/EQ7qqjVJazFxNAlD5eGVgOyfStLmzTZhIyqLsjmanGGPem256PfIBs+1xtZYpRV4F7gOpS+BDL8DQJAS8wMUzZ/IvHRHUPEZ5BkVPC1wQ+Pyxwryck6U13ZSa/tqI5EQaM+RDOmYwxRTAiGYeuuJNyDQ96+LdLKWQ8JoQJBAI9IJRs440IeEpMqfNZ0jRhKD3tZYXu2rt7fuuDTZmbGqJCWuVuTSveSSt01YZm1ij0aOwRKgIBmIOR3lBn9KP8=";
	
	public String mobileLogin(String content) throws Exception {
		String host = "https://api.verification.jpush.cn/v1/web/loginTokenVerify";
		Map<String, Object> map = new HashMap<String, Object>();
		map.put("loginToken", content);
		
		Map<String, String> headers = new HashMap<String, String>();
		headers.put("Authorization","Basic ${base64_auth_string}");
		headers.put("Content-Type", "application/json");
		
		String result = HttpRequest.post(host).header("Authorization", "Basic Y2JlZWUwNWQ2MzA5OThjNjgxODQ2ZGZhOjU5ZDg4MTIzZjJlMjQzMDIxMTY5MTVhMw==").
				header("Content-Type","application/json")
				.body(JSON.toJSONString(map))
				.execute().body();
		JSONObject jsonObject = JSON.parseObject(result);
		String cryptograph_phone = (String) jsonObject.get("phone");
		String phone = decryptPhone(cryptograph_phone, prikey);
		return phone;
	}
	
	private String decryptPhone(String phone, String prikey) throws Exception {
        PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(Base64.getDecoder().decode(prikey));
        PrivateKey privateKey = KeyFactory.getInstance("RSA").generatePrivate(keySpec);

        Cipher cipher=Cipher.getInstance("RSA");
        cipher.init(Cipher.DECRYPT_MODE, privateKey);

        byte [] b = Base64.getDecoder().decode(phone);
        return new String(cipher.doFinal(b));		
	}

	public static void main(String[] args) throws Exception {
//		CloseableHttpResponse response = null;
//		CloseableHttpClient httpClient = null;
//		String responseContent = "";
//		String JSONBody = "{\"loginToken\":\"STsid0000001542695429579Ob28vB7b0cYTI9w0GGZrv8ujUu05qZvw\",\"exID\":\"1234566\"}";
//		try {
//			httpClient = HttpClientBuilder.create().build();
//			HttpPost httpPost = new HttpPost("https://api.verification.jpush.cn/v1/web/loginTokenVerify");
//			httpPost.addHeader("Content-Type", "application/json");
//			httpPost.addHeader("Authorization", "Basic N2Q0MzFlNDJkZmE2YTZkNjkzYWMyZDA0OjVlOTg3YWM2ZDJlMDRkOTVhOWQ4ZjBkMQ==");
//			httpPost.setEntity(new StringEntity(JSONBody));
//			response = httpClient.execute(httpPost);
//			HttpEntity entity = response.getEntity();
//			responseContent = EntityUtils.toString(entity, "UTF-8");
//			response.close();
//			httpClient.close();
//			System.out.println(responseContent);
//		} catch (ClientProtocolException e) {
//			log.error(e);
//		} catch (IOException e) {
//			log.error(e);
//		} finally {
//			close(response, httpClient);
//		}
//		String host = "https://api.verification.jpush.cn/v1/web/loginTokenVerify";
//		String appKey = "7d431e42dfa6a6d693ac2d04";
//		String Secret = "5e987ac6d2e04d95a9d8f0d1";
//		Map<String, Object> map = new HashMap<String, Object>();
//		map.put("loginToken", "zI2eLaqa6gcMmxwF5DL6J69ShKkzEKHFAHxIkJBwx7uH1GY3WbBfbTWZKXbn3HFAotFh90wkgZHEfTtUe9s6qKufYGB4yn3Rv3bp1rGJ5vWuzx3dAruTVoFxu6+Vozw1xbOGr+7UfLs56ghsyWuyWv2RdrnMeJHZ5/0la21UW9N8Ha1brFP2wl/0HiAITKjlIezpxZfH+g1dx1CUVRC1zRC7s6p+uH60Z2tgVRcus2AdVxgdtkQ+O2OTZMkNGBLzYcw9CQ8vhrUvvFiVoirv90v00gdVEbtfublJlH5OCCvtTFe9w0cJNDB7dHK/LHmQownHQi+Tk6Fh6kN78FmMwXvvugnDGKr977ntg27yjlcfmGd/RiZ1vH26WcI8OCnj");
//		//map.put("exID", "1234566");
//		
//		Map<String, String> headers = new HashMap<String, String>();
//		headers.put("Authorization","Basic ${base64_auth_string}");
//		headers.put("Content-Type", "application/json; charset=UTF-8");
//		
////		String result = HttpRequest.post(host).header("Authorization", "Basic " + Base64.getUrlEncoder().
////						encodeToString((appKey + ":" + Secret).getBytes())).
////						header("Content-Type","application/json")
////						.body(JSON.toJSONString(map))
////						.execute().body();
//		String result = HttpRequest.post(host).header("Authorization", "Basic Y2JlZWUwNWQ2MzA5OThjNjgxODQ2ZGZhOjU5ZDg4MTIzZjJlMjQzMDIxMTY5MTVhMw==").
//				header("Content-Type","application/json")
//				.body(JSON.toJSONString(map))
//				.execute().body();		
//		System.out.println(result);
//		JSONObject jsonObject = JSON.parseObject(result);
//		String cryptograph_phone = (String) jsonObject.get("phone");
//		String phone = decryptPhone("TQHocUoyw5QCWXq+Mw8Q1x/jNDQAw8ol2Qb4dAoX/ljHP11NBErbL3iv+hMD7D4Jo12NRdp/j2F/H1Geq9xMnFH/OcBgsrIcwqGVgmKqyNtSAsXxT2OYgDQd2oySyw4zKyteQhuOHNhuF6u8oEEs+A6HtUiGvc3gijVZeBxE8zM=", prikey);
//		System.out.println(phone);		
	}

	private static void close(Closeable... closeables) {
		if (closeables != null && closeables.length > 0) {
			try {
				for (Closeable closeable : closeables) {
					if (closeable != null) {
						closeable.close();
					}
				}
			} catch (IOException e) {
				log.error(e);
			}
		}
	}

}