快递100工具类
package com.ctrl.akuaidi100.Util;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;
/**
* 实时查询请求Demo
* @author Administrator
*
*/
public class SynQueryDemo {
/**
* 实时查询请求地址
*/
private static final String SYNQUERY_URL = "http://poll.kuaidi100.com/poll/query.do";
private String key; //受权key
private String customer; //实时查询公司编号
public SynQueryDemo(String key, String customer) {
this.key = key;
this.customer = customer;
}
/**
* 实时查询快递单号
* @param com 快递公司编码
* @param num 快递单号
* @param phone 手机号
* @param from 出发地城市
* @param to 目的地城市
* @param resultv2 开通区域解析功能:0-关闭;1-开通
* @return
*/
public String synQueryData(String com, String num, String phone, String from, String to, int resultv2) {
String order = "desc";
String show = "0";
StringBuilder param = new StringBuilder("{");
param.append("\"com\":\"").append(com).append("\"");
param.append(",\"num\":\"").append(num).append("\"");
param.append(",\"from\":\"").append(from).append("\"");
param.append(",\"phone\":\"").append(phone).append("\"");
param.append(",\"to\":\"").append(to).append("\"");
if(1 == resultv2) {
param.append(",\"resultv2\":1");
} else {
param.append(",\"resultv2\":0");
}
param.append(",\"show\":\"").append(show).append("\"");
param.append(",\"order\":\"").append(order).append("\"");
param.append("}");
Map<String, String> params = new HashMap<String, String>();
params.put("customer", this.customer);
String sign = MD5Utils.encode(param + this.key + this.customer);
//对汉字进行加密有问题 与快递100加密的匹配不上
params.put("sign", sign);
params.put("param", param.toString());
return this.post(params);
}
/**
* 发送post请求
*/
public String post(Map<String, String> params) {
StringBuffer response = new StringBuffer("");
BufferedReader reader = null;
try {
StringBuilder builder = new StringBuilder();
for (Map.Entry<String, String> param : params.entrySet()) {
if (builder.length() > 0) {
builder.append('&');
}
builder.append(URLEncoder.encode(param.getKey(), "UTF-8"));
builder.append('=');
builder.append(URLEncoder.encode(String.valueOf(param.getValue()), "UTF-8"));
}
byte[] bytes = builder.toString().getBytes("UTF-8");
URL url = new URL(SYNQUERY_URL);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(3000);
conn.setReadTimeout(3000);
conn.setRequestMethod("POST");
conn.setRequestProperty("accept", "*/*");
conn.setRequestProperty("connection", "Keep-Alive");
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
conn.setRequestProperty("Content-Length", String.valueOf(bytes.length));
conn.setDoOutput(true);
conn.getOutputStream().write(bytes);
reader = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));
String line = "";
while ((line = reader.readLine()) != null) {
response.append(line);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (null != reader) {
reader.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return response.toString();
}
}
MD5加密
package com.ctrl.akuaidi100.Util;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
/**
* md5加密
*/
public class MD5Utils {
private static MessageDigest mdigest = null;
private static char digits[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
private static MessageDigest getMdInst() {
if (null == mdigest) {
try {
mdigest = MessageDigest.getInstance("MD5");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
}
return mdigest;
}
public static String encode(String s) {
if(null == s) {
return "";
}
try {
byte[] bytes = s.getBytes();
getMdInst().update(bytes);
byte[] md = getMdInst().digest();
int j = md.length;
char str[] = new char[j * 2];
int k = 0;
for (int i = 0; i < j; i++) {
byte byte0 = md[i];
str[k++] = digits[byte0 >>> 4 & 0xf];
str[k++] = digits[byte0 & 0xf];
}
return new String(str);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
Controller层
package com.ctrl.mobile.ctrlAppController.akuaidi100;
import com.alibaba.fastjson.JSON;
import com.ctrl.akuaidi100.Util.SynQueryDemo;
import com.ctrl.ctrlexpressdeliveryinfo.entity.CtrlExpressDeliveryInfo;
import com.ctrl.ctrlexpressdeliveryinfo.service.CtrlExpressDeliveryInfoService;
import com.ctrl.ctrlorderinfo.entity.CtrlOrderInfo;
import com.ctrl.ctrlorderinfo.service.CtrlOrderInfoService;
import com.ctrl.mobile.respUtils.ApiResponseEnum;
import com.ctrl.mobile.respUtils.AppMessage;
import com.ctrl.mobile.respUtils.CtrlApiUtil;
import com.ctrl.mobile.respUtils.RespUtils;
import com.thinkgem.jeesite.common.mapper.JsonMapper;
import com.thinkgem.jeesite.common.persistence.Page;
import com.thinkgem.jeesite.common.utils.StringUtils;
import com.thinkgem.jeesite.common.web.BaseController;
import org.activiti.engine.impl.util.json.JSONArray;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.LinkedHashMap;
import java.util.Map;
@Controller
@RequestMapping(value = "/app/AKuaiDi100",method = RequestMethod.POST)
public class AKuaiDi100 extends BaseController {
@Value("${kuaiDi.key}")
private String key;
@Value("${kuaiDi.customer}")
private String customer;
@Value("${kuaiDi.requestMethod}")
private String requestMethod;
@Autowired
private CtrlOrderInfoService ctrlOrderInfoService;
@Autowired
private CtrlExpressDeliveryInfoService ctrlExpressDeliveryInfoService;
/**
* @Author Lipeimin
* @Description //TODO //获取快递信息
* @Date 2019/10/16
* @Param [request, response, lists]
* @return java.lang.String
**/
@RequestMapping("getKuaiDi100")
public String getKuaiDi100(HttpServletResponse response, HttpServletRequest request ,CtrlOrderInfo ctrlOrderInfo){
Map<String,Object> maps = new LinkedHashMap<String, Object>();
int resultv2 = 0; //开启行政规划解析
String result = "";
if(StringUtils.isNotBlank(ctrlOrderInfo.getId())){
CtrlOrderInfo ctrlOrderInfo1 = ctrlOrderInfoService.get(ctrlOrderInfo.getId());
SynQueryDemo demo = new SynQueryDemo(key, customer);
//获取手机号码的后四位
String phone=ctrlOrderInfo1.getReceiverPhone().substring(ctrlOrderInfo1.getReceiverPhone().length()-4);
String url = "http://www.kuaidi100.com/autonumber/auto?num="+ctrlOrderInfo1.getNum()+"&key="+key;
//经过运单号 自动获取快递公司的简称
JSONArray jsonArray = new JSONArray(httpRequest(url,requestMethod,null));
String com =jsonArray.getJSONObject(0).get("comCode").toString();
result = demo.synQueryData(com, ctrlOrderInfo1.getNum(), phone, null, null, resultv2);
maps = (Map) JSON.parse(result);
RespUtils.getMsgSuccess(maps);
maps.put("kuaidi",ctrlOrderInfo1.getCom());
}else{
maps.put(AppMessage.MESSAGE, CtrlApiUtil.getApiResponseErrpr(ApiResponseEnum.PARAMETER_EXCEPTION));
}
return renderString(response, JsonMapper.toJsonString(maps), "application/json");
}
//处理http请求 requestUrl为请求地址 requestMethod请求方式,值为"GET"或"POST"
public String httpRequest(String requestUrl,String requestMethod,String outputStr){
StringBuffer buffer=null;
try{
URL url=new URL(requestUrl);
HttpURLConnection conn=(HttpURLConnection)url.openConnection();
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setRequestMethod(requestMethod);
conn.connect();
//往服务器端写内容 也就是发起http请求须要带的参数
if(null!=outputStr){
OutputStream os=conn.getOutputStream();
os.write(outputStr.getBytes("utf-8"));
os.close();
}
//读取服务器端返回的内容
InputStream is=conn.getInputStream();
InputStreamReader isr=new InputStreamReader(is,"utf-8");
BufferedReader br=new BufferedReader(isr);
buffer=new StringBuffer();
String line=null;
while((line=br.readLine())!=null){
buffer.append(line);
}
}catch(Exception e){
e.printStackTrace();
}
return buffer.toString();
}
}
订单实体类
/**
* Copyright © 2012-2016 <a href="https://github.com/thinkgem/jeesite">JeeSite</a> All rights reserved.
*/
package com.ctrl.ctrlorderinfo.entity;
import com.ctrl.ctrlmemberinfo.entity.CtrlMemberInfo;
import com.ctrl.ctrlshoppingcart.entity.CtrlShoppingCart;
import com.ctrl.mobile.ctrlAppController.shoppingcart.ShoppingCart;
import org.hibernate.validator.constraints.Length;
import java.util.List;
import com.google.common.collect.Lists;
import com.thinkgem.jeesite.common.persistence.DataEntity;
/**
* 订单信息管理Entity
* @author swordmeng
* @version 2019-08-22
*/
public class CtrlOrderInfo extends DataEntity<CtrlOrderInfo> {
private static final long serialVersionUID = 1L;
private String orderCode; // 订单编号
private String memberId; // 艺术家/会员id
private String buyerId; // 购买人id
private String receiver; // 收货人
private String receiverPhone; // 收货人手机号
private String orderAddr; // 收货地址
private String leaveComments; // 留言
private String deduction; // 优惠券减免额
private String fare; // 运费
private String realPay; // 实付款
private String orderStatus; // 订单状态
private String payMethod; // 支付方式
private String totalAmount; // 商品总额
private String balancePay; // 余额支付额
private String payWechatAlipay; // 支付宝/微信支付额
private String orderType;
private CtrlMemberInfo ctrlMemberInfo; // 会员表实体类
private List<CtrlOrderInfoChild> ctrlOrderInfoChildList = Lists.newArrayList(); // 子表列表
private List<CtrlOrderInfoChild> orderInfoChildList;
private List<String> idList;
private Integer sizePage;//一页显示多少数据
private Integer noPage;//第几页
private Integer startPage;//开始位置
private List<CtrlOrderInfo> lists;
private Double befores;//优惠前
private Double afters;//优惠后
private List<CtrlShoppingCart> shoppingCartList;
private String com;//快递公司
private String num;//单号
private String froms;//发货地址
public CtrlOrderInfo() {
super();
}
public CtrlOrderInfo(String id){
super(id);
}
@Length(min=0, max=50, message="订单编号长度必须介于 0 和 50 之间")
public String getOrderCode() {
return orderCode;
}
public void setOrderCode(String orderCode) {
this.orderCode = orderCode;
}
@Length(min=0, max=64, message="艺术家/会员id长度必须介于 0 和 64 之间")
public String getMemberId() {
return memberId;
}
public void setMemberId(String memberId) {
this.memberId = memberId;
}
@Length(min=0, max=255, message="购买人id长度必须介于 0 和 255 之间")
public String getBuyerId() {
return buyerId;
}
public void setBuyerId(String buyerId) {
this.buyerId = buyerId;
}
@Length(min=0, max=255, message="收货人长度必须介于 0 和 255 之间")
public String getReceiver() {
return receiver;
}
public void setReceiver(String receiver) {
this.receiver = receiver;
}
@Length(min=0, max=11, message="收货人手机号长度必须介于 0 和 11 之间")
public String getReceiverPhone() {
return receiverPhone;
}
public void setReceiverPhone(String receiverPhone) {
this.receiverPhone = receiverPhone;
}
@Length(min=0, max=255, message="收货地址长度必须介于 0 和 255 之间")
public String getOrderAddr() {
return orderAddr;
}
public void setOrderAddr(String orderAddr) {
this.orderAddr = orderAddr;
}
@Length(min=0, max=4000, message="留言长度必须介于 0 和 4000 之间")
public String getLeaveComments() {
return leaveComments;
}
public void setLeaveComments(String leaveComments) {
this.leaveComments = leaveComments;
}
public String getDeduction() {
return deduction;
}
public void setDeduction(String deduction) {
this.deduction = deduction;
}
public String getFare() {
return fare;
}
public void setFare(String fare) {
this.fare = fare;
}
public String getRealPay() {
return realPay;
}
public void setRealPay(String realPay) {
this.realPay = realPay;
}
@Length(min=0, max=1, message="订单状态长度必须介于 0 和 1 之间")
public String getOrderStatus() {
return orderStatus;
}
public void setOrderStatus(String orderStatus) {
this.orderStatus = orderStatus;
}
@Length(min=0, max=1, message="支付方式长度必须介于 0 和 1 之间")
public String getPayMethod() {
return payMethod;
}
@Length(min=0, max=1, message="订单状类型度必须介于 0 和 1 之间")
public String getOrderType() {
return orderType;
}
public void setOrderType(String orderType) {
this.orderType = orderType;
}
public void setPayMethod(String payMethod) {
this.payMethod = payMethod;
}
public String getTotalAmount() {
return totalAmount;
}
public void setTotalAmount(String totalAmount) {
this.totalAmount = totalAmount;
}
public String getBalancePay() {
return balancePay;
}
public void setBalancePay(String balancePay) {
this.balancePay = balancePay;
}
public String getPayWechatAlipay() {
return payWechatAlipay;
}
public void setPayWechatAlipay(String payWechatAlipay) {
this.payWechatAlipay = payWechatAlipay;
}
public List<CtrlOrderInfoChild> getCtrlOrderInfoChildList() {
return ctrlOrderInfoChildList;
}
public void setCtrlOrderInfoChildList(List<CtrlOrderInfoChild> ctrlOrderInfoChildList) {
this.ctrlOrderInfoChildList = ctrlOrderInfoChildList;
}
public CtrlMemberInfo getCtrlMemberInfo() {
return ctrlMemberInfo;
}
public void setCtrlMemberInfo(CtrlMemberInfo ctrlMemberInfo) {
this.ctrlMemberInfo = ctrlMemberInfo;
}
public List<CtrlOrderInfoChild> getOrderInfoChildList() {
return orderInfoChildList;
}
public void setOrderInfoChildList(List<CtrlOrderInfoChild> orderInfoChildList) {
this.orderInfoChildList = orderInfoChildList;
}
public List<String> getIdList() {
return idList;
}
public void setIdList(List<String> idList) {
this.idList = idList;
}
public Integer getSizePage() {
return sizePage;
}
public void setSizePage(Integer sizePage) {
this.sizePage = sizePage;
}
public Integer getNoPage() {
return noPage;
}
public void setNoPage(Integer noPage) {
this.noPage = noPage;
}
public Integer getStartPage() {
return startPage;
}
public void setStartPage(Integer startPage) {
this.startPage = startPage;
}
public List<CtrlOrderInfo> getLists() {
return lists;
}
public void setLists(List<CtrlOrderInfo> lists) {
this.lists = lists;
}
public Double getBefore() {
return befores;
}
public void setBefore(Double befores) {
this.befores = befores;
}
public Double getAfter() {
return afters;
}
public void setAfter(Double afters) {
this.afters = afters;
}
public List<CtrlShoppingCart> getShoppingCartList() {
return shoppingCartList;
}
public void setShoppingCartList(List<CtrlShoppingCart> shoppingCartList) {
this.shoppingCartList = shoppingCartList;
}
public String getCom() {
return com;
}
public void setCom(String com) {
this.com = com;
}
public String getNum() {
return num;
}
public void setNum(String num) {
this.num = num;
}
public String getFroms() {
return froms;
}
public void setFroms(String froms) {
this.froms = froms;
}
}
配置文件
#============================#
#===== 快递100配置信息 ======#
#============================#
kuaiDi.key=
kuaiDi.customer=
# requestMethod请求方式,值为"GET"或"POST"
kuaiDi.requestMethod=POST