179号公文对接 上海公服示例

package net.shop.controller.admin.warehouse;import cn.hutool.core.codec.Base64;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import net.shop.util.WebUtils;
import org.apache.commons.beanutils.ConvertUtils;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.apache.poi.ss.formula.functions.T;
import org.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.Assert;import javax.net.ssl.*;
import javax.transaction.Transactional;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.math.BigDecimal;
import java.net.*;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.*;public class test {// 公服加签地址 线上:private String GONGFU_SIGN_URL = "https://www.shcepp.com/cepsi/ceppSignInter";//给海关发送支付信息 线上:private String HAIGUAN_SEND_PAY_INFO = "https://customs.chinaport.gov.cn/ceb2grab/grab/realTimeDataUpload";@Transactionalpublic void operateGrapInfo(String orderNo, GrapInfo grapInfo, PayInfo payInfo) {String method = "《海关数据中心抓取数据-定时任务-扫描未发送给数据中心的抓取信息表》";JsonUtils jsonUtils = new JsonUtils();//封装edata信息HashMap<String, Object> EData = initEData(orderNo);//封装 payExchangeInfoHead信息HashMap<String, Object> payExchangeInfoHead = initPayExchangeInfoHead(payInfo);ArrayList<Map<String, Object>> payExchangeInfoList = new ArrayList<>();initPayExchangeInfoList(orderNo, payInfo, payExchangeInfoList);HashMap<String, Object> payExInfoStr = new HashMap<>();initPayExInfoStr(grapInfo, payExchangeInfoHead, payExchangeInfoList, payExInfoStr);// 转换JSONString EDataJson = jsonUtils.toJson(EData);String payExInfoStrJson = jsonUtils.toJson(payExInfoStr);// 编码EDataJson = cn.hutool.core.codec.Base64.encode(EDataJson, "UTF-8");payExInfoStrJson = Base64.encode(payExInfoStrJson, "UTF-8");// MD5( req + key).upper()String reqString = jsonUtils.toJson(EData);String md5 = DigestUtils.md5Hex(reqString + "工服的秘钥  或者电子口岸的秘钥");String SignMsg = md5.toUpperCase();// 封装参数体Map<String, Object> parameter = new HashMap<String, Object>();parameter.put("EData", EDataJson);parameter.put("payExInfoStr", payExInfoStrJson);parameter.put("SignMsg", SignMsg);synchronized (this) {//*// * 第一步:去公服加签String gongfuSignReturnData = WebUtils.post(GONGFU_SIGN_URL, parameter);@SuppressWarnings("deprecation")String gongfuSignReturnDataEncode = URLEncoder.encode(gongfuSignReturnData);String gongfuSignReturnDataDecode = null;try {gongfuSignReturnDataDecode = URLDecoder.decode(gongfuSignReturnDataEncode, "UTF-8");} catch (UnsupportedEncodingException e) {System.out.println(method + ",orderNo = " + orderNo + ",exception = " + e);}JSONObject gongfuSignReturnDataJson = new JSONObject(gongfuSignReturnDataDecode);String status = "" + gongfuSignReturnDataJson.optString("status");//加签成功if ("success".equals(status)) {String code = "" + gongfuSignReturnDataJson.optString("code");String msg = "" + gongfuSignReturnDataJson.optString("msg");String serialNumber = "" + gongfuSignReturnDataJson.optString("serialNumber");String serviceTime = "" + gongfuSignReturnDataJson.optString("serviceTime");String certNo = "" + gongfuSignReturnDataJson.optString("certNo");String signValue = "" + gongfuSignReturnDataJson.optString("signValue");// 调用公服加签成功后HashMap<String, Object> haiguanRequest = new HashMap<>();payExInfoStr.put("serviceTime", grapInfo.getServiceTime());payExInfoStr.put("certNo", grapInfo.getCertNo());payExInfoStr.put("signValue", grapInfo.getSignValue());haiguanRequest.put("payExInfoStr", jsonUtils.toJson(payExInfoStr));String haiguanRequestJson = jsonUtils.toJson(haiguanRequest);//*// * 第二步:返回通知海关    请求海关接口String haiguanResponse = SslRequest.postRequest(HAIGUAN_SEND_PAY_INFO, haiguanRequest, 3000, null);if (haiguanResponse.contains("上传成功")) {//上传179号公文成功}} else {System.out.println(method + ",orderNo = " + orderNo + ",调用公服加签失败!");}}}/** 组装 EData* */private HashMap<String, Object> initEData(String orderNo) {String ebpName = null;String ebpCode = null;String token = null;HashMap<String, Object> EData = new HashMap<>();// 版本号EData.put("version", "1.0");// 提交时间EData.put("commitTime", System.currentTimeMillis() + "");// 电商公司 海关备案名称  EBPNAMEEData.put("cusName", ebpName);// 电商公司 海关备案代码  EBPCODEEData.put("cusCode", ebpCode);//请求方唯一流水号   用订单编号EData.put("serialNumber", orderNo);//电子口岸 或者 公共服务平台 分配的 tokenEData.put("Token", token);return EData;}/** 组装 PayExchangeInfoHead* */private HashMap<String, Object> initPayExchangeInfoHead(PayInfo payInfo) {HashMap<String, Object> payExchangeInfoHead = new HashMap<>();// 支付原始 表头//系统唯一序号 随机生成的 UUID.randomUUID().toString().replaceAll("-","").toUpperCase()payExchangeInfoHead.put("guid", payInfo.getGuid());//请求支付公司的原始请求payExchangeInfoHead.put("initalRequest", payInfo.getInitalRequest());// 支付时 支付公司的 原始响应payExchangeInfoHead.put("initalResponse", payInfo.getInitalResponse());// 电商平台代码 EbpCodepayExchangeInfoHead.put("ebpCode", payInfo.getEbpCode());// 支付企业代码payExchangeInfoHead.put("payCode", payInfo.getPayCode());// 交易流水号payExchangeInfoHead.put("payTransactionId", payInfo.getPayTransactionId());// 交易金额payExchangeInfoHead.put("totalAmount", new BigDecimal(payInfo.getTotalAmount()));// 币制payExchangeInfoHead.put("currency", payInfo.getCurrenc());// 核验机构payExchangeInfoHead.put("verDept", payInfo.getVerDept());// 支付类型payExchangeInfoHead.put("payType", payInfo.getPayType());// 交易成功时间payExchangeInfoHead.put("tradingTime", payInfo.getTradingTime());// 备注payExchangeInfoHead.put("note", payInfo.getNote());return payExchangeInfoHead;}/** 组装 PayExchangeInfoList* */private void initPayExchangeInfoList(String orderNo, PayInfo payInfo,ArrayList<Map<String, Object>> payExchangeInfoList) {//T 为订单子项的对象List<T> orderItems = new ArrayList<T>();//遍历订单子项 封装子项信息for (T orderItem : orderItems) {HashMap<String, Object> item = new HashMap<>();//订单编号  支付时所使用的订单编号item.put("orderNo", orderNo);ArrayList<Map<String, Object>> goodsInfos = new ArrayList<>();HashMap<String, Object> goodsInfo = new HashMap<>();//商品名称goodsInfo.put("gname", "商品名称");//商品商城展示连接goodsInfo.put("itemLink", "商品连接");goodsInfos.add(goodsInfo);//订单中的商品item.put("goodsInfo", goodsInfos);//收矿账号 最终收款账号 也就是 电商企业的收款账号item.put("recpAccount", payInfo.getRecpAccount());//收款企业代码 同上item.put("recpCode", payInfo.getRecpCode());//收款企业名称  同上item.put("recpName", payInfo.getRecpName());payExchangeInfoList.add(item);}}/**组装 payExInfoStr 信息* */private void initPayExInfoStr(GrapInfo grapInfo, HashMap<String, Object> payExchangeInfoHead,ArrayList<Map<String, Object>> payExchangeInfoList,HashMap<String, Object> payExInfoStr) {// 海关发起请求时的会话IDpayExInfoStr.put("sessionID", grapInfo.getSessionId());// 支付原始 表头payExInfoStr.put("payExchangeInfoHead", payExchangeInfoHead);// 支付原始数据表体payExInfoStr.put("payExchangeInfoLists", payExchangeInfoList);}/** 支付信息表* */public class PayInfo {private String orderNo;// 订单号private String guid;// 系统唯一序号private String initalRequest;// 原始请求private String initalResponse;// 原始响应private String ebpCode;// 电商平台代码private String payCode;// 支付企业代码private String payTransactionId;// 支付流水号private String totalAmount;// 交易金额private String currenc;// 币制private String verDept;// 验核机构private String payType;// 支付类型private String tradingTime;// 交易成功时间private String note;// 备注private String recpAccount;// 收款账号private String recpCode;// 收款企业代码private String recpName;// 收款企业名称public String getOrderNo() {return orderNo;}public void setOrderNo(String orderNo) {this.orderNo = orderNo;}public String getGuid() {return guid;}public void setGuid(String guid) {this.guid = guid;}public String getInitalRequest() {return initalRequest;}public void setInitalRequest(String initalRequest) {this.initalRequest = initalRequest;}public String getInitalResponse() {return initalResponse;}public void setInitalResponse(String initalResponse) {this.initalResponse = initalResponse;}public String getEbpCode() {return ebpCode;}public void setEbpCode(String ebpCode) {this.ebpCode = ebpCode;}public String getPayCode() {return payCode;}public void setPayCode(String payCode) {this.payCode = payCode;}public String getPayTransactionId() {return payTransactionId;}public void setPayTransactionId(String payTransactionId) {this.payTransactionId = payTransactionId;}public String getTotalAmount() {return totalAmount;}public void setTotalAmount(String totalAmount) {this.totalAmount = totalAmount;}public String getCurrenc() {return currenc;}public void setCurrenc(String currenc) {this.currenc = currenc;}public String getVerDept() {return verDept;}public void setVerDept(String verDept) {this.verDept = verDept;}public String getPayType() {return payType;}public void setPayType(String payType) {this.payType = payType;}public String getTradingTime() {return tradingTime;}public void setTradingTime(String tradingTime) {this.tradingTime = tradingTime;}public String getNote() {return note;}public void setNote(String note) {this.note = note;}public String getRecpAccount() {return recpAccount;}public void setRecpAccount(String recpAccount) {this.recpAccount = recpAccount;}public String getRecpCode() {return recpCode;}public void setRecpCode(String recpCode) {this.recpCode = recpCode;}public String getRecpName() {return recpName;}public void setRecpName(String recpName) {this.recpName = recpName;}}/** 海关抓取信息表* */public class GrapInfo {private String orderNo;                                 // 商户订单号private String sessionId;                               // 会话idprivate String serviceTime;                             // 调用时的系统时间private String certNo;                                  // 证书号 由海关返回private String signValue;                               // 加签后的值private String isSuccess;                               // 是否回传成功!private String serialNumber;                            // 公服返回序列号private String customsResponse;                         // 海关返回信息public String getSerialNumber() {return serialNumber;}public void setSerialNumber(String serialNumber) {this.serialNumber = serialNumber;}public String getIsSuccess() {return isSuccess;}public void setIsSuccess(String isSuccess) {this.isSuccess = isSuccess;}public String getOrderNo() {return orderNo;}public void setOrderNo(String orderNo) {this.orderNo = orderNo;}public String getSessionId() {return sessionId;}public void setSessionId(String sessionId) {this.sessionId = sessionId;}public String getServiceTime() {return serviceTime;}public void setServiceTime(String serviceTime) {this.serviceTime = serviceTime;}public String getCertNo() {return certNo;}public void setCertNo(String certNo) {this.certNo = certNo;}public String getSignValue() {return signValue;}public void setSignValue(String signValue) {this.signValue = signValue;}public String getCustomsResponse() {return customsResponse;}public void setCustomsResponse(String customsResponse) {this.customsResponse = customsResponse;}}public final class JsonUtils {/*** ObjectMapper*/private final ObjectMapper OBJECT_MAPPER = new ObjectMapper();/*** 不可实例化*/private JsonUtils() {}/*** 将对象转换为JSON字符串** @param value 对象* @return JSON字符串*/@SuppressWarnings("deprecation")public String toJson(Object value) {Assert.notNull(value);try {return OBJECT_MAPPER.writeValueAsString(value);} catch (JsonProcessingException e) {throw new RuntimeException(e.getMessage(), e);}}}}

海关179号公文接入相关推荐

  1. 项目总结24:海关179号(实时获取电商平台企业支付相关原始数据)开发流程和相关资料...

    项目总结24:海关179号(实时获取跨境电子商务平台企业支付相关原始数据接入)开发流程和相关资料 欢迎大家留言探讨 1.致谢 感谢:https://blog.csdn.net/ccbox_net/ar ...

  2. JAVA版海关179号对接流程

    代码借鉴海关179对接API.(如有侵权马上删除) 步骤 拿到ukey(运营或产品哪里应该会有) 获取开发文档179号开发文档 开发接收海关请求接口(按文档要求不能有端口号) 组装数据进行加签 拼接加 ...

  3. 海关179号公告对接联调

    从2019年4月1日开始,所有跨境电商平台必须对接支付源,也就是179号公告:经过这么久的完善,终于有一位大神将这个对接联调全部完善了. 链接: 完善文档.

  4. 海关179号出口运单报文CEB505Message描述规范

    海关出口报文规范 CEB505Message运单报文描述 名称 英文名称 类型 必填 说明 报文编号 guid an36 是 报文的36位系统唯一序号(英文字母大写). 版本号 version an. ...

  5. 海关179号出口收款单报文CEB403Message描述规范

    CEB403Message 收款单报文 名称 英文名称 类型 必填 说明 报文编号 guid an36 是 报文的36位系统唯一序号(英文字母大写). 版本号 version an..10 是 报文版 ...

  6. 海关179号出口订单报文CEB303Message规范

    海关出口报文规范 CEB303Message  出口订单报文描述 名称 英文名称 类型 必填 说明 报文编号 guid an36 是 报文的36位系统唯一序号(英文字母大写). 版本号 version ...

  7. 记录海关165号、179号实时数据联调接口中需要注意的细节

    海关165号.179号要求平台开放订单原始数据接入中碰到的问题解决办法和需要注意的细节. 文中只是记录了一些重点,不一定是全部的细节,一些操作部分的内容有所省略,可以留言提问补充. 首发CSDN,总结 ...

  8. 海关跨境电商平台数据实时获取接口对接走过的坑(海关165,179号公告)

    系列文章目录 对接海关165,179号公告的内容 文章目录 系列文章目录 前言 一.问题概述 详细过程 前言 最近又有业务需要连接海关的报关业务,所以就必须对接海关165,179号公告的内容. 万万没 ...

  9. 海关179接口终极解决方案

    海关179接口终极解决方案 海关165号.179号要求电商平台开放订单原始数据.有幸参与过几次完整的对接流程,知道其中的麻烦事. 在对接微信群里,接触到的不外乎以下几种身份: 1.电商平台boss,自 ...

最新文章

  1. 天猫精灵可以当电脑音响吗_天猫精灵推出便携式投影仪,小到可以装进口袋,试试效果...
  2. Linux进阶:DNS详解
  3. 前台开发之HTML定义语义化
  4. 虚拟机 centos 6.5 扩展根目录分区大小
  5. 【模型解读】浅析RNN到LSTM
  6. 设计模式のNullObjectPattern(空对象模式)----行为模式
  7. 题解【bzoj4653 [NOI2016] 区间】
  8. xgboost相比传统gbdt有何不同?xgboost为什么快?xgboost如何支持并行?
  9. 如何快速开发一个支持高效、高并发的分布式ID生成器(一)
  10. mysql case quchong_处理mysql的查询语句去重案例一则
  11. PAT (Basic Level) Practice1019 数字黑洞
  12. 深度解析vue.js响应式原理解析与实现
  13. 软件需求说明书(GB856T—88)
  14. 机器人潘森护盾_新版潘森无伤抗塔 还能抵消死歌大招?E技能护盾机制全解析!...
  15. html隐藏图片白色部分,css去掉gif透明图片的白边
  16. 论文重复率太高怎么降重修改
  17. Java面试宝典2018版
  18. 通过具体的例子说明一维和二维的相关运算、卷积运算究竟是怎么做的。
  19. 【opencv】【python】libpng warning: iCCP: known incorrect sRGB profile 解决
  20. 光学成像系统中的像差

热门文章

  1. 网络虚拟化——SR-IOV
  2. 华为云服务器使用之搭建极简服务器
  3. Amazon EKS 使用 EFS服务
  4. 名悦集团:高速路上突遇发动机熄火该怎么办
  5. derby数据库连接操作
  6. Scratch入门教程:第二节 简单的交互
  7. 职场技巧之PPT制作
  8. 11. Python3 测试代码
  9. U8.11(8.12) access版本如何升级到用友T3及U8
  10. 支付宝自动续费申请PHP,APP是如何实现自动续费的?