package com.toyor.huoyuncloud.common;

    import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;
    import com.toyor.huoyuncloud.common.JsonResult;
    import com.toyor.huoyuncloud.common.MyLogUtil;
    import net.sf.json.JSONObject;
    import org.apache.commons.lang.StringUtils;
    import org.springframework.stereotype.Component;

    import java.io.;
    import java.net.HttpURLConnection;
    import java.net.URL;
    import java.net.URLEncoder;
    import java.nio.channels.FileChannel;
    import java.security.MessageDigest;
    import java.util.
    ;

    @Component
    public class KuaiDiNiaoUtil {
    //用户ID,快递鸟提供,注意保管,不要泄漏
    private String EBusinessID = “1291431”;//即用户ID,登录快递鸟官网会员中心获取 https://www.kdniao.com/UserCenter/v4/UserHome.aspx
    //API key,快递鸟提供,注意保管,不要泄漏
    private String ApiKey = “139857b5-af59-4da5-bc7f-b0a85cd5590a”;//即API key,登录快递鸟官网会员中心获取 https://www.kdniao.com/UserCenter/v4/UserHome.aspx
    //请求url, 正式环境地址
    private String ReqURL = “https://api.kdniao.com/Ebusiness/EbusinessOrderHandle.aspx”;
    /String RequestData= “{“+
    “‘OrderCode’: ‘’,”+
    “‘CustomerName’: ‘’,”+
    “‘ShipperCode’: ‘YTO’,”+
    “‘LogisticCode’: ‘YT5446528079837’”+
    “}”;
    /

    //获取物流公司列表
    public List> getShipperList() {
    List> list = new ArrayList();
    LinkedHashMap map = null;
    map = new LinkedHashMap<>();
    map.put(“shippername”, “申通快递”);
    map.put(“shippercode”, “STO”);
    list.add(map);
    map = new LinkedHashMap<>();
    map.put(“shippername”, “圆通速递”);
    map.put(“shippercode”, “YTO”);
    list.add(map);
    map = new LinkedHashMap<>();
    map.put(“shippername”, “天天快递”);
    map.put(“shippercode”, “HHTT”);
    list.add(map);
    map = new LinkedHashMap<>();
    map.put(“shippername”, “百世快递”);
    map.put(“shippercode”, “HTKY”);
    list.add(map);
    /map.put(“shippername”,”韵达速递”);map.put(“shippercode”,”YD”);list.add(map);
    map.put(“shippername”,”顺丰速运”);map.put(“shippercode”,”SF”);list.add(map);
    map.put(“shippername”,”中通快递”);map.put(“shippercode”,”ZTO”);list.add(map);
    map.put(“shippername”,”邮政快递包裹”);map.put(“shippercode”,”YZPY”);list.add(map);
    map.put(“shippername”,”EMS”);map.put(“shippercode”,”EMS “);list.add(map);
    map.put(“shippername”,”京东快递”);map.put(“shippercode”,”JD”);list.add(map);
    map.put(“shippername”,”优速快递”);map.put(“shippercode”,”UC”);list.add(map);
    map.put(“shippername”,”德邦快递”);map.put(“shippercode”,”DBL”);list.add(map);
    map.put(“shippername”,”宅急送”);map.put(“shippercode”,”ZJS”);list.add(map);
    /
    return list;
    }

    private Map setParam(String shippercode, String logisticcode, String ordercode, String customername) throws Exception {
    JSONObject jsonObject = new JSONObject();
    jsonObject.put(“OrderCode”, ordercode);
    jsonObject.put(“CustomerName”, customername);
    jsonObject.put(“ShipperCode”, shippercode);
    jsonObject.put(“LogisticCode”, logisticcode);
    // 组装系统级参数
    Map params = new HashMap();
    params.put(“RequestData”, urlEncoder(jsonObject.toString(), “UTF-8”));
    params.put(“EBusinessID”, EBusinessID);
    params.put(“RequestType”, “1002”);//快递查询接口指令8002/地图版快递查询接口指令8004
    String dataSign = encrypt(jsonObject.toString(), ApiKey, “UTF-8”);
    params.put(“DataSign”, urlEncoder(dataSign, “UTF-8”));
    params.put(“DataType”, “2”);
    return params;
    }

    public JsonResult orderOnlineByJson(String shippercode, String logisticcode) throws Exception {
    Map params = setParam(shippercode,logisticcode,””,””);
    // 以form表单形式提交post请求,post请求体中包含了应用级参数和系统级参数
    String result = sendPost(ReqURL, params);
    return doResult(result);
    }
    public JsonResult doResult(String result){
    try {
    JSONObject jsonObject = JSONObject.fromObject(result);
    if(!jsonObject.getBoolean(“Success”)){
    return JsonResult.error(jsonObject.containsKey(“Reason”)?jsonObject.getString(“Reason”):”获取快递鸟数据出错!”);
    }
    if(jsonObject.getJSONArray(“Traces”).size()<=0){
    return JsonResult.error(jsonObject.containsKey(“Reason”)?jsonObject.getString(“Reason”):”获取快递鸟数据出错!”);
    }
    return JsonResult.success(“获取成功!”,jsonObject.getJSONArray(“Traces”));
    }
    catch(Exception e){
    e.printStackTrace();
    MyLogUtil.error(“获取快递鸟数据出错1!”);
    return JsonResult.error(“获取快递鸟数据出错1!”);
    }
    }

    / //即时查询接口
    public String orderOnlineByJson() throws Exception{
    // 组装应用级参数
    String RequestData= “{“+
    “‘OrderCode’: ‘’,”+
    “‘CustomerName’: ‘’,”+
    “‘ShipperCode’: ‘YTO’,”+
    “‘LogisticCode’: ‘YT5446528079837’”+
    “}”;
    // 组装系统级参数
    Map params = new HashMap();
    params.put(“RequestData”, urlEncoder(RequestData, “UTF-8”));
    params.put(“EBusinessID”, EBusinessID);
    params.put(“RequestType”, “1002”);//快递查询接口指令8002/地图版快递查询接口指令8004
    String dataSign=encrypt(RequestData, ApiKey, “UTF-8”);
    params.put(“DataSign”, urlEncoder(dataSign, “UTF-8”));
    params.put(“DataType”, “2”);
    // 以form表单形式提交post请求,post请求体中包含了应用级参数和系统级参数
    String result=sendPost(ReqURL, params);

    //根据公司业务处理返回的信息……
    return result;
    }
    /
    /
    MD5加密
    str 内容
    charset 编码方式
    @throws Exception
    */
    @SuppressWarnings(“unused”)
    private String MD5(String str,String charset) throws Exception {
    MessageDigest md = MessageDigest.getInstance(“MD5”);
    md.update(str.getBytes(charset));
    byte[] result = md.digest();
    StringBuffer sb = new StringBuffer(32);
    for (int i = 0; i < result.length; i++) {
    int val = result[i] & 0xff;
    if (val <= 0xf) {
    sb.append(“0”);
    }
    sb.append(Integer.toHexString(val));
    }
    return sb.toString().toLowerCase();
    }

    /

    base64编码
    str 内容
    charset 编码方式
    @throws UnsupportedEncodingException
    /
    private String base64(String str, String charset) throws UnsupportedEncodingException{
    String encoded = Base64.encode(str.getBytes(charset));
    return encoded;
    }

    @SuppressWarnings(“unused”)
    private String urlEncoder(String str, String charset) throws UnsupportedEncodingException{
    String result = URLEncoder.encode(str, charset);
    return result;
    }

    /**
    电商Sign签名生成
    content 内容
    keyValue ApiKey
    charset 编码方式
    @throws UnsupportedEncodingException ,Exception
    @return DataSign签名
    /
    @SuppressWarnings(“unused”)
    private String encrypt (String content,String keyValue,String charset) throws UnsupportedEncodingException, Exception
    {
    if (keyValue != null)
    {
    return base64(MD5(content + keyValue, charset), charset);
    }
    return base64(MD5(content, charset), charset);
    }

    /*
    向指定 URL 发送POST方法的请求
    url 发送请求的 URL
    params 请求的参数集合
    @return 远程资源的响应结果
    /
    @SuppressWarnings(“unused”)
    private String sendPost(String url, Map params) {
    OutputStreamWriter out = null;
    BufferedReader in = null;
    StringBuilder result = new StringBuilder();
    try {
    URL realUrl = new URL(url);
    HttpURLConnection conn =(HttpURLConnection) realUrl.openConnection();
    // 发送POST请求必须设置如下两行
    conn.setDoOutput(true);
    conn.setDoInput(true);
    // POST方法
    conn.setRequestMethod(“POST”);
    // 设置通用的请求属性
    conn.setRequestProperty(“accept”, “/“);
    conn.setRequestProperty(“connection”, “Keep-Alive”);
    conn.setRequestProperty(“user-agent”,
    “Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)”);
    conn.setRequestProperty(“Content-Type”, “application/x-www-form-urlencoded”);
    conn.connect();
    // 获取URLConnection对象对应的输出流
    out = new OutputStreamWriter(conn.getOutputStream(), “UTF-8”);
    // 发送请求参数
    if (params != null) {
    StringBuilder param = new StringBuilder();
    for (Map.Entry< String, String> entry : params.entrySet()) {
    if(param.length()>0){
    param.append(“&”);
    }
    param.append(entry.getKey());
    param.append(“=”);
    param.append(entry.getValue());
    System.out.println(entry.getKey()+”:”+entry.getValue());
    }
    System.out.println(“param:”+param.toString());
    out.write(param.toString());
    }
    // flush输出流的缓冲
    out.flush();
    // 定义BufferedReader输入流来读取URL的响应
    in = new BufferedReader(
    new InputStreamReader(conn.getInputStream(), “UTF-8”));
    String line;
    while ((line = in.readLine()) != null) {
    result.append(line);
    }
    } catch (Exception e) {
    e.printStackTrace();
    }
    //使用finally块来关闭输出流、输入流
    finally{
    try{
    if(out!=null){
    out.close();
    }
    if(in!=null){
    in.close();
    }
    }
    catch(IOException ex){
    ex.printStackTrace();
    }
    }
    return result.toString();
    }
    }