# c-179-parent **Repository Path**: hclabxing/c-179-parent ## Basic Information - **Project Name**: c-179-parent - **Description**: 179海关比较完整的代码,仅供参考 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 4 - **Created**: 2021-07-26 - **Last Updated**: 2021-07-26 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README #179 海关 加签服务 ``` 此为179插有海关卡(操作员卡/法人卡) 的加签服务项目 ``` ###加签接收关键报文封装代码 ####post工具用的是hutool #####缺省的内容需要自行填充完整的 ``` //插有海关卡的服务器的生成签名的链接 //即此项目中的c-eshop-web-sign项目部署的加签路径 private static final String signUrl = ""; //商品展示基础链接 //需要拼接对应商品详情的链接 private static final String goodsDisplayBaseUrl = ""; //海关卡证书编号 private static final String certNo=""; //上传海关的联调url private static final String to179TestUrl = "https://swapptest.singlewindow.cn/ceb2grab/grab/realTimeDataUpload"; //上传海关的正式url private static final String to179Url = "https://customs.chinaport.gov.cn/ceb2grab/grab/realTimeDataUpload"; @RequestMapping(value = "customs_request",method = RequestMethod.POST) @ResponseBody @ApiOperation(value = "接收海关请求", notes = "接收海关请求") public void customsRequest(HttpServletRequest request,HttpServletResponse response){ //获得请求数据 String body = request.getParameter("openReq"); //将请求的报文存起来 JSONObject requestJson =JSONObject.fromObject(body); logger.info("海关请求报文:{}",requestJson.toString()); String orderNo = requestJson.getString("orderNo"); String sessionID = requestJson.getString("sessionID"); String nowSessionID = request.getSession().getId(); //封装返回json JSONObject resultJson = new JSONObject(); //海关请求先回执成功给海关 //再推送支付原始报文给海关 resultJson.put("code", "10000");//编码10000表示成功,其他表示失败 resultJson.put("message", "海关请求成功"); resultJson.put("serviceTime", TimeUtils.getNow().getTime()); logger.info("海关请求返回报文:{}", resultJson.toString()); writeContentJson(resultJson.toString(), response); try { JSONObject resultLogJson = new JSONObject(); OrderModel orderModel = orderService.findOrderModel(orderNo, null); if (orderModel == null) { //订单不存在 resultLogJson.put("code", "10030");//编码10000表示成功,其他表示失败 resultLogJson.put("message", "没有获取到相关订单"); resultLogJson.put("serviceTime", TimeUtils.getNow().getTime()); logger.info("海关请求返回报文:{}", resultLogJson.toString()); return; } if (!PayState.Payed.equals(orderModel.getPayState())) { //订单未支付 resultLogJson.put("code", "10040");//编码10000表示成功,其他表示失败 resultLogJson.put("message", "订单未支付,没有原始支付信息"); resultLogJson.put("serviceTime", TimeUtils.getNow().getTime()); logger.info("海关请求返回报文:{}", resultLogJson.toString()); return ; } //获取订单sku List skuList = orderSkuService.listOrderSkuModelByOrderId(orderNo, null); //获取支付原始报文 CustomPayInitialInfoModel payInfo = customPayInitialInfoService.queryCustomPayInitialInfoByOrderNo(orderNo); if(payInfo == null){ //没有获取到支付原始数据 resultLogJson.put("code", "10070");//编码10000表示成功,其他表示失败 resultLogJson.put("message", "没有获取到该订单的支付原始数据"); resultLogJson.put("serviceTime", TimeUtils.getNow().getTime()); logger.info("海关请求返回报文:{}", resultLogJson.toString()); return ; } Long curTime = TimeUtils.getNow().getTime(); //开始封装推送给海关的支付原始数据 Map pushMap = new HashMap<>(); pushMap.put("sessionID", sessionID);//海关发起请求时,平台接收的会话ID //封装payExchangeInfoHead //保证字段顺序,Map无序,故换成json封装数据 JSONObject payExchangeInfoHeadMap = new JSONObject(); payExchangeInfoHeadMap.put("guid", nowSessionID);//系统唯一序号,暂时取session_id payExchangeInfoHeadMap.put("initalRequest",com.alibaba.fastjson.JSONObject.toJSONString(payInfo.getInitalRequest()));//支付原始请求 payExchangeInfoHeadMap.put("initalResponse",com.alibaba.fastjson.JSONObject.toJSONString(payInfo.getInitalResponse()));//支付原始相应 payExchangeInfoHeadMap.put("ebpCode",""); // 电商平台代码(海关备案十位) payExchangeInfoHeadMap.put("payCode",payInfo.getPayCode());//支付企业代码 payExchangeInfoHeadMap.put("payTransactionId",orderModel.getPayCode());//交易流水号 payExchangeInfoHeadMap.put("totalAmount",orderModel.getPayPrice());//支付金额 payExchangeInfoHeadMap.put("currency",payInfo.getCurrency());//支付币制 payExchangeInfoHeadMap.put("verDept",payInfo.getVerDept());//验核机构 payExchangeInfoHeadMap.put("payType",payInfo.getPayType());//支付类型 payExchangeInfoHeadMap.put("tradingTime",payInfo.getCreateTime().getTime()+"");//交易成功时间 pushMap.put("payExchangeInfoHead",payExchangeInfoHeadMap); //开始封装payExchangeInfoList //此处只封装一个订单的集合 JSONArray payExchangeInfoList = new JSONArray(); JSONObject payExchangeInfoItem = new JSONObject(); payExchangeInfoItem.put("orderNo",orderModel.getOrderId());//订单编号 //封装商品信息goodsInfo JSONArray goodsInfoList = new JSONArray(); JSONObject goodsInfoItem; for(OrderSkuModel sku : skuList){ goodsInfoItem = new JSONObject(); goodsInfoItem.put("gname",sku.getName());//商品名称 goodsInfoItem.put("itemLink",goodsDisplayBaseUrl+sku.getProductId()); goodsInfoList.add(goodsInfoItem); } payExchangeInfoItem.put("goodsInfo",goodsInfoList);//商品信息 payExchangeInfoItem.put("recpAccount", payInfo.getRecpAccount());//收款账号 payExchangeInfoItem.put("recpCode", payInfo.getRecpCode());//收款企业代码 payExchangeInfoItem.put("recpName",payInfo.getRecpName());//收款企业名称 payExchangeInfoList.add(payExchangeInfoItem); //支付原始数据表体 pushMap.put("payExchangeInfoLists",payExchangeInfoList); pushMap.put("serviceTime",curTime);//返回时的系统时间 String toSignStr = Sign179Utils.getSignStr(pushMap); logger.info("推送加签字符串:{}",toSignStr); //请求加签服务器进行数据加签 //封装加签json JSONObject signJson = new JSONObject(); signJson.put("key",sessionID); signJson.put("message",toSignStr); String signResult = HttpUtils.doPost(signUrl,signJson.toString()); logger.info("加签返回结果:{}",signResult); if(signResult==null){ //加签失败 resultLogJson.put("code", "10050");//编码10000表示成功,其他表示失败 resultLogJson.put("message", "加签异常"); resultLogJson.put("serviceTime", TimeUtils.getNow().getTime()); logger.info("海关请求返回报文:{}", resultLogJson.toString()); return ; } JSONObject signResultJson = JSONObject.fromObject(signResult); Object code = signResultJson.get("code"); if(!"1".equals(code.toString())){ //加签失败 resultLogJson.put("code", "10050");//编码10000表示成功,其他表示失败 resultLogJson.put("message", "加签返回失败"); resultLogJson.put("serviceTime", TimeUtils.getNow().getTime()); logger.info("海关请求返回报文:{}", resultLogJson.toString()); return ; } String signValue = (String)signResultJson.get("data"); //加签成功 //重新按照海关字段顺序拼装json JSONObject pushJson = new JSONObject(); pushJson.put("sessionID",sessionID); pushJson.put("payExchangeInfoHead",payExchangeInfoHeadMap); pushJson.put("payExchangeInfoLists",payExchangeInfoList); pushJson.put("serviceTime",curTime.toString());//返回时的系统时间 pushJson.put("certNo",certNo);//证书编号 pushJson.put("signValue",signValue);//签名结果值 //封装推送给海关的数据 String pushJsonStr = pushJson.toString(); logger.info("推送海关的数据:{}",pushJsonStr); Map payExInfoStrMap = new HashMap<>(); payExInfoStrMap.put("payExInfoStr",pushJsonStr); Map headerMap = new HashMap<>(); headerMap.put("Content-Type","application/x-www-form-urlencoded;charset=utf-8"); headerMap.put("Connection","close"); //模拟https表单提交 String pushResult = HttpUtil.createPost(to179Url).addHeaders(headerMap).form(payExInfoStrMap).execute().body(); logger.info("推送海关返回结果:{}",pushResult); if(pushResult == null){ //推送失败 resultLogJson.put("code", "10060");//编码10000表示成功,其他表示失败 resultLogJson.put("message", "推送海关异常"); resultLogJson.put("serviceTime", TimeUtils.getNow().getTime()); logger.info("海关请求返回报文:{}", resultLogJson.toString()); return ; } JSONObject pushResultJson = JSONObject.fromObject(pushResult); Object pushResultCode = pushResultJson.get("code"); Object pushResultMsg = pushResultJson.get("message"); if(!"10000".equals(pushResultCode.toString())){ //推送返回失败 resultLogJson.put("code", pushResultCode);//编码10000表示成功,其他表示失败 resultLogJson.put("message", "推送海关失败:"+pushResultMsg); resultLogJson.put("serviceTime", TimeUtils.getNow().getTime()); logger.info("海关请求返回报文:{}", resultLogJson.toString()); return ; } //推送成功 }catch (Exception e){ logger.error("推送海关异常:{}",e.getMessage()); e.printStackTrace(); } } private void writeContentJson(String content, HttpServletResponse response) { try { //海关要求application/json; charset=utf-8; response.setHeader("Content-Type", "application/json;charset=utf-8"); response.setCharacterEncoding("UTF-8"); response.getWriter().write(content); response.getWriter().close(); } catch (IOException e) { e.printStackTrace(); } } ``` ###Sign179Utils 工具类代码 ``` package com.e111.eshop.web.api.utils; import net.sf.json.JSONArray; import net.sf.json.JSONObject; import java.util.*; /** * 海关179加签工具类 * @author liujiacheng */ public class Sign179Utils { //封装需要生成签名的字符串 public static String getSignStr(Map pushMap){ if(pushMap==null||pushMap.size()==0){ return null; } List keys = new ArrayList<>(); keys.add("sessionID"); keys.add("payExchangeInfoHead"); keys.add("payExchangeInfoLists"); keys.add("serviceTime"); //拼装字符串,keys之间用||分隔 StringBuffer returnStr = new StringBuffer(); int count = 0;//标识遍历的进度 for (String s : keys){ if(count != 0){ //除了第一次遍历,其它都在前面拼装|| returnStr.append("||"); } returnStr.append("\""+s+"\":");//拼装key Object value = pushMap.get(s); String valueStr ; if(value instanceof String){ valueStr = (String)value; }else{ valueStr = value.toString(); } returnStr.append("\""+ valueStr + "\""); count ++ ; } return returnStr.toString(); } private static boolean isJson(String content){ try { JSONObject.fromObject(content); return true; } catch (Exception e) { return false; } } private static boolean isJsonArray(String content){ try { JSONArray.fromObject(content); return true; } catch (Exception e) { return false; } } public static void main(String[] args) { Map pushMap = new HashMap<>(); pushMap.put("keysone","hahahha"); pushMap.put("keystwo","xixixixi"); Map jsonMap = new HashMap<>(); jsonMap.put("jkeyone","lalalla"); jsonMap.put("jkeytwo","pupupu"); pushMap.put("jsonMap", com.alibaba.fastjson.JSONObject.toJSONString(com.alibaba.fastjson.JSONObject.toJSONString(jsonMap))); String resultStr = Sign179Utils.getSignStr(pushMap); System.out.print(resultStr); } } ```