快遞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