diff --git a/src/main/java/com/gszc/controller/LoginController.java b/src/main/java/com/gszc/controller/LoginController.java index 1192391..32db5fb 100644 --- a/src/main/java/com/gszc/controller/LoginController.java +++ b/src/main/java/com/gszc/controller/LoginController.java @@ -166,7 +166,11 @@ public class LoginController { cookie.setPath("/"); response.addCookie(cookie); String sign = JwtUtils.sign(pcUser.getLoginName(), pcUser.getPassword(),"pcUser"); - return ResultBuilder.withPayload(sign).build(); + JSONObject result = new JSONObject(); + result.put("token",sign); + pcUser.setPassword(null); + result.put("user",pcUser); + return ResultBuilder.withPayload(result).build(); } else { return ResultBuilder.error("登录失败").build(); } diff --git a/src/main/java/com/gszc/controller/MiniInvoiceController.java b/src/main/java/com/gszc/controller/MiniInvoiceController.java index 802cc46..22d8daa 100644 --- a/src/main/java/com/gszc/controller/MiniInvoiceController.java +++ b/src/main/java/com/gszc/controller/MiniInvoiceController.java @@ -3,14 +3,12 @@ package com.gszc.controller; import com.alibaba.fastjson.JSONObject; import com.gszc.build.Result; import com.gszc.build.ResultBuilder; -import com.gszc.entity.Custom; -import com.gszc.entity.CustomSupport; import com.gszc.entity.Invoice; import com.gszc.entity.InvoiceHeader; -import com.gszc.service.impl.CustomServiceImpl; import com.gszc.service.impl.InvoiceServiceImpl; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -99,5 +97,18 @@ public class MiniInvoiceController { return ResultBuilder.withPayload(invoiceHeader).build(); } + @PostMapping("/trackingDetail") + @ApiImplicitParams({ + @ApiImplicitParam(name = "token", value = "token", required = true, dataType = "String", paramType = "header"), + @ApiImplicitParam(name = "trackingCompany", value = "快递公司简称 顺丰速运-SF 百世快递-HTKY 中通快递-ZTO 申通快递-STO 圆通速递-YTO 韵达速递-YD 邮政快递包裹-YZPY EMS-EMS 天天快递-HHTT 京东快递-JD 优速快递-UC 德邦快递-DBL", required = true, dataType = "String", paramType = "query"), + @ApiImplicitParam(name = "trackingCode", value = "快递号", required = true, dataType = "String", paramType = "query") + }) + @ApiOperation(value = "物流信息", notes = "物流信息") + public Result trackingDetail(String trackingCompany, String trackingCode) { + + JSONObject result = invoiceService.trackingDetail(trackingCompany, trackingCode); + return ResultBuilder.withPayload(result).build(); + } + } diff --git a/src/main/java/com/gszc/controller/PcInvoiceController.java b/src/main/java/com/gszc/controller/PcInvoiceController.java index 4b38513..cc30492 100644 --- a/src/main/java/com/gszc/controller/PcInvoiceController.java +++ b/src/main/java/com/gszc/controller/PcInvoiceController.java @@ -4,15 +4,16 @@ import com.alibaba.fastjson.JSONObject; import com.gszc.build.Result; import com.gszc.build.ResultBuilder; import com.gszc.entity.Invoice; -import com.gszc.entity.InvoiceHeader; import com.gszc.service.impl.InvoiceServiceImpl; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; -import javax.validation.Valid; import java.util.List; @Api(value = "工商注册 API", tags = {"后台开票api"}) @@ -51,7 +52,11 @@ public class PcInvoiceController { } @PostMapping("/invoiceConfirm") - @ApiImplicitParam(name = "token", value = "token", required = true, dataType = "String", paramType = "header") + @ApiImplicitParams({ + @ApiImplicitParam(name = "token", value = "token", required = true, dataType = "String", paramType = "header"), + @ApiImplicitParam(name = "trackingCompany", value = "快递公司简称 顺丰速运-SF 百世快递-HTKY 中通快递-ZTO 申通快递-STO 圆通速递-YTO 韵达速递-YD 邮政快递包裹-YZPY EMS-EMS 天天快递-HHTT 京东快递-JD 优速快递-UC 德邦快递-DBL", required = true, dataType = "String"), + @ApiImplicitParam(name = "trackingCode", value = "快递号", required = true, dataType = "String") + }) @ApiOperation(value = "开票确认", notes = "开票确认") public Result invoiceConfirm(String invoiceId,String trackingCompany,String trackingCode,String trackingImg) { @@ -59,4 +64,4 @@ public class PcInvoiceController { return ResultBuilder.success().build(); } -} +} \ No newline at end of file diff --git a/src/main/java/com/gszc/service/impl/InvoiceServiceImpl.java b/src/main/java/com/gszc/service/impl/InvoiceServiceImpl.java index 7ef908a..8158bd4 100644 --- a/src/main/java/com/gszc/service/impl/InvoiceServiceImpl.java +++ b/src/main/java/com/gszc/service/impl/InvoiceServiceImpl.java @@ -9,6 +9,7 @@ import com.gszc.entity.InvoiceHeader; import com.gszc.mapper.InvoiceHeaderMapper; import com.gszc.mapper.InvoiceMapper; import com.gszc.service.IInvoiceService; +import com.gszc.util.KdniaoTrackQueryAPI; import org.apache.ibatis.session.RowBounds; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -120,4 +121,18 @@ public class InvoiceServiceImpl extends ServiceImpl impl invoiceMapper.updateById(invoice); } + public JSONObject trackingDetail(String trackingCompany,String trackingCode){ + + KdniaoTrackQueryAPI api = new KdniaoTrackQueryAPI(); + JSONObject orderTracesByJson = new JSONObject(); + try { + String orderTracesByJsonString = api.getOrderTracesByJson(trackingCompany, trackingCode); + orderTracesByJson = JSONObject.parseObject(orderTracesByJsonString); + } catch (Exception e) { + e.printStackTrace(); + return orderTracesByJson; + } + return orderTracesByJson; + } + } diff --git a/src/main/java/com/gszc/util/KdniaoTrackQueryAPI.java b/src/main/java/com/gszc/util/KdniaoTrackQueryAPI.java new file mode 100644 index 0000000..0366d4a --- /dev/null +++ b/src/main/java/com/gszc/util/KdniaoTrackQueryAPI.java @@ -0,0 +1,244 @@ +package com.gszc.util; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.OutputStreamWriter; +import java.io.UnsupportedEncodingException; +import java.net.HttpURLConnection; +import java.net.URL; +import java.net.URLEncoder; +import java.security.MessageDigest; +import java.util.HashMap; +import java.util.Map; + +/** + * + * 快递鸟物流轨迹即时查询接口 + * + * @技术QQ群: 456320272 + * @see: http://www.kdniao.com/YundanChaxunAPI.aspx + * @copyright: 深圳市快金数据技术服务有限公司 + * + * DEMO中的电商ID与私钥仅限测试使用,正式环境请单独注册账号 + * 单日超过500单查询量,建议接入我方物流轨迹订阅推送接口 + * + * ID和Key请到官网申请:http://www.kdniao.com/ServiceApply.aspx + */ + +public class KdniaoTrackQueryAPI { + + //DEMO + public static void main(String[] args) { + KdniaoTrackQueryAPI api = new KdniaoTrackQueryAPI(); + try { + String result = api.getOrderTracesByJson("DNWL", "LBX0321024542074083"); + System.out.print(result); + + } catch (Exception e) { + e.printStackTrace(); + } + } + + //电商ID + private String EBusinessID="1613650"; + //电商加密私钥,快递鸟提供,注意保管,不要泄漏 + private String AppKey="a24f5b98-9d7a-4ef9-8672-8cdc3587fed1"; + //请求url + private String ReqURL="http://api.kdniao.com/Ebusiness/EbusinessOrderHandle.aspx"; +// private String ReqURL="http://sandboxapi.kdniao.com:8080/kdniaosandbox/gateway/exterfaceInvoke.json";//测试 + + /** + * Json方式 查询订单物流轨迹 + * @throws Exception + */ + public String getOrderTracesByJson(String expCode, String expNo) throws Exception{ + String requestData= "{'OrderCode':'','ShipperCode':'" + expCode + "','LogisticCode':'" + expNo + "'}"; + + Map params = new HashMap(); + params.put("RequestData", urlEncoder(requestData, "UTF-8")); + params.put("EBusinessID", EBusinessID); + params.put("RequestType", "1002"); + String dataSign=encrypt(requestData, AppKey, "UTF-8"); + params.put("DataSign", urlEncoder(dataSign, "UTF-8")); + params.put("DataType", "2"); + + String result=sendPost(ReqURL, params); + + //根据公司业务处理返回的信息...... + + return result; + } + + /** + * MD5加密 + * @param str 内容 + * @param 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编码 + * @param str 内容 + * @param charset 编码方式 + * @throws UnsupportedEncodingException + */ + private String base64(String str, String charset) throws UnsupportedEncodingException{ + String encoded = base64Encode(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签名生成 + * @param content 内容 + * @param keyValue Appkey + * @param 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方法的请求 + * @param url 发送请求的 URL + * @param 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 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(); + } + + + private static char[] base64EncodeChars = new char[] { + 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', + 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', + 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', + 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', + 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', + 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', + 'w', 'x', 'y', 'z', '0', '1', '2', '3', + '4', '5', '6', '7', '8', '9', '+', '/' }; + + public static String base64Encode(byte[] data) { + StringBuffer sb = new StringBuffer(); + int len = data.length; + int i = 0; + int b1, b2, b3; + while (i < len) { + b1 = data[i++] & 0xff; + if (i == len) + { + sb.append(base64EncodeChars[b1 >>> 2]); + sb.append(base64EncodeChars[(b1 & 0x3) << 4]); + sb.append("=="); + break; + } + b2 = data[i++] & 0xff; + if (i == len) + { + sb.append(base64EncodeChars[b1 >>> 2]); + sb.append(base64EncodeChars[((b1 & 0x03) << 4) | ((b2 & 0xf0) >>> 4)]); + sb.append(base64EncodeChars[(b2 & 0x0f) << 2]); + sb.append("="); + break; + } + b3 = data[i++] & 0xff; + sb.append(base64EncodeChars[b1 >>> 2]); + sb.append(base64EncodeChars[((b1 & 0x03) << 4) | ((b2 & 0xf0) >>> 4)]); + sb.append(base64EncodeChars[((b2 & 0x0f) << 2) | ((b3 & 0xc0) >>> 6)]); + sb.append(base64EncodeChars[b3 & 0x3f]); + } + return sb.toString(); + } +}