折腾了几天终于将对接179号文件弄好了。网上各种资料还是挺多的,但是感觉又说的不够完整。
很多人疑惑我已经支付报关了,为什么还要做这个么玩意呢?其实这个179号文件是给个接口给海关来抽查需要清关的订单跟支付相关的信息。
第二步加签是需要在一个插着海关加签ukey的windows系统上(ukey的驱动只有windows的)。一般的做法就是找一个windows系统的电脑即可。并且将加签的逻辑做成一个本地执行的包通过webwocket 或者轮询亦或者是MQ的方式来监听电商系统中需要加签的数据。
参考的相关文件和源码
工具链接:
https://pan.baidu.com/s/1BWiudH00qngdB8rmlqDMrw 提取码:ln17
在windowns电脑上 插上ukey 打开 3-debug_海关证书信息获取插件.rar
可以用这个工具获取证书编号跟证书内容, 将证书内容拷贝出来,修改文件后缀名为 .cer
即可。
然后登陆 中国电子口岸官网 将刚获取的证书编号跟证书上传。 证书编号中的字母一定要小写
查询接口A 开发
@PostMapping(value = "/platDataOpen", headers = "content-type=application/x-www-form-urlencoded")
public JSONObject platDataOpen(@RequestParam String openReq) {
// 1. 解析获取数据
openReq = StringUtils.replace(openReq, """, "\"");
JSONObject json = JSONObject.parseObject(openReq);
String orderNo = json.getString("orderNo");
String sessionID = json.getString("sessionID");
String serviceTime = json.getString("serviceTime");
log.info("====orderNo: {}, sesssionId: {}, serviceTime: {}", orderNo, sessionID, serviceTime);
Customs entity = customsService.buildCustom(orderNo, sessionID);
StringBuffer sb = new StringBuffer();
sb.append("\"sessionID\":\"").append(entity.getSessionID()).append("\"").append("||");
String headerString = JSON.toJSONString(entity.getPayExchangeInfoHead(), SerializerFeature.SortField);
sb.append("\"payExchangeInfoHead\":\"").append(headerString).append("\"").append("||");
String listString = JSON.toJSONString(entity.getPayExchangeInfoLists(), SerializerFeature.SortField);
sb.append("\"payExchangeInfoLists\":\"").append(listString).append("\"").append("||");
sb.append("\"serviceTime\":\"").append(entity.getServiceTime()).append("\"");
String signValue = sb.toString();
log.info("====signValue: {}", signValue);
//组装加签数据
JSONObject exchangeData = new JSONObject();
exchangeData.put("inData", signValue);
exchangeData.put("sessionId", sessionID);
exchangeData.put("orderNo", orderNo);
// 2. 将数据放入redis
bladeRedis.hSet(DECLARE_DATA_KEY, sessionID, exchangeData.toJSONString());
bladeRedis.set(CUSTOM_DATA_PREFIX.concat(orderNo), entity);
// 3. 返回数据
JSONObject result = new JSONObject();
result.put("code", "10000");
result.put("message", "");
result.put("serviceTime", System.currentTimeMillis());
return result;
}