From dc1537f8d74c75e3a3155bfdf601e251c3645bed Mon Sep 17 00:00:00 2001 From: Weasley J <1432689025@qq.com> Date: Sun, 30 Jul 2023 18:46:02 +0800 Subject: [PATCH 1/2] =?UTF-8?q?[feature]=20=E4=BF=AE=E6=AD=A3=20ds:SignedI?= =?UTF-8?q?nfo=20=E8=8A=82=E7=82=B9=E8=BF=94=E5=9B=9E=E5=80=BC=20[feature]?= =?UTF-8?q?=20=E5=A2=9E=E5=8A=A0=20CEB303Message=20=E5=87=BA=E5=8F=A3?= =?UTF-8?q?=E5=8D=95=E6=95=B0=E6=8D=AE=E6=A8=A1=E5=9E=8B=20[feature]=20?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=8E=A5=E5=85=A5=E5=85=AC=E5=8F=B8=E5=90=8D?= =?UTF-8?q?=E7=A7=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 3 +- chinaport-data-signature-app/pom.xml | 4 +- .../core/ChinaEportReportClient.java | 97 +++++++++---- .../eport/signature/core/SignHandler.java | 1 - .../core/WebSocketClientHandler.java | 5 +- .../src/main/resources/static/index.html | 6 +- .../rpc/EportSignControllerTest.java | 2 - .../report/export/Upload303XmlTests.java | 135 ++++++++++++++++++ chinaport-data-signature-data-model/pom.xml | 2 +- .../eport/sign/constants/MessageType.java | 3 + .../cebmessage/export/CEB303Message.java | 54 +++++++ .../sign/model/cebmessage/export/Order.java | 38 +++++ .../model/cebmessage/export/OrderHead.java | 96 +++++++++++++ .../model/cebmessage/export/OrderList.java | 88 ++++++++++++ 14 files changed, 497 insertions(+), 37 deletions(-) create mode 100644 chinaport-data-signature-app/src/test/java/cn/alphahub/eport/signature/report/export/Upload303XmlTests.java create mode 100644 chinaport-data-signature-data-model/src/main/java/o/github/weasleyj/china/eport/sign/model/cebmessage/export/CEB303Message.java create mode 100644 chinaport-data-signature-data-model/src/main/java/o/github/weasleyj/china/eport/sign/model/cebmessage/export/Order.java create mode 100644 chinaport-data-signature-data-model/src/main/java/o/github/weasleyj/china/eport/sign/model/cebmessage/export/OrderHead.java create mode 100644 chinaport-data-signature-data-model/src/main/java/o/github/weasleyj/china/eport/sign/model/cebmessage/export/OrderList.java diff --git a/README.md b/README.md index db34563..d3c9641 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ - 对于单体应用,您可以直接下载[release](https://github.com/Weasley-J/chinaport-data-signature/releases)中的二进制文件使用(使用较多),根据您的实际情况适当修改运行参数。 - 对于分布式微服务,建议切换到[feature_microservice](https://github.com/Weasley-J/chinaport-data-signature/tree/feature_microservice)分支进行构建(较少使用)。 - 您还可以通过[Docker镜像快速搭建报文加签推送的环境](https://hub.docker.com/repository/docker/weasleyj/chinaport-data-signature)。 -- 如果您的电商后台系统也是使用`Java`语言开发,我们在[Maven仓库中上传了项目中用到的数据模型](https://central.sonatype.com/artifact/io.github.weasley-j/chinaport-data-signature-data-model/1.0.4),可帮助您的系统与本项目快速集成。您只需要使用这些数据模型填充数据,然后使用`JSON`进行数据交互,从而降低对接成本。 +- 如果您的电商后台系统也是使用`Java`语言开发,我们在[Maven仓库中上传了项目中用到的数据模型](https://central.sonatype.com/artifact/io.github.weasley-j/chinaport-data-signature-data-model),可帮助您的系统与本项目快速集成。您只需要使用这些数据模型填充数据,然后使用`JSON`进行数据交互,从而降低对接成本。 ### 功能概述 @@ -277,6 +277,7 @@ java -Dfile.encoding=utf-8 ${JVM_ARGS} -jar ${APP}.jar \ 感谢以下公司对我们项目的赞助和支持: - 海南省荣誉进出口贸易有限公司:[官方网站](http://www.hnzrjck.com/) +- 广州市汇客物流有限公司 - ... 如果您的公司已赞助我们的项目,但在列表中没有找到,请及时与我们联系,我们将尽快添加您的公司名。 diff --git a/chinaport-data-signature-app/pom.xml b/chinaport-data-signature-app/pom.xml index 0a57238..c413392 100644 --- a/chinaport-data-signature-app/pom.xml +++ b/chinaport-data-signature-app/pom.xml @@ -36,7 +36,7 @@ 1.4.1 2.13.0 3.0.0 - 1.0.4 + 1.0.5 2.3.1 32.1.1-jre http://192.168.31.140:9001 @@ -245,7 +245,7 @@ **/xml/** **/cert/** - **/application-lwj.yml + **/application-lwj*.yml **/smart-doc.json diff --git a/chinaport-data-signature-app/src/main/java/cn/alphahub/eport/signature/core/ChinaEportReportClient.java b/chinaport-data-signature-app/src/main/java/cn/alphahub/eport/signature/core/ChinaEportReportClient.java index 8a1c3cd..b4bbc9e 100644 --- a/chinaport-data-signature-app/src/main/java/cn/alphahub/eport/signature/core/ChinaEportReportClient.java +++ b/chinaport-data-signature-app/src/main/java/cn/alphahub/eport/signature/core/ChinaEportReportClient.java @@ -25,6 +25,7 @@ import o.github.weasleyj.china.eport.sign.IMessageType; import o.github.weasleyj.china.eport.sign.model.cebmessage.BaseTransfer; import o.github.weasleyj.china.eport.sign.model.cebmessage.CEB311Message; import o.github.weasleyj.china.eport.sign.model.cebmessage.CEB621Message; +import o.github.weasleyj.china.eport.sign.model.cebmessage.export.CEB303Message; import o.github.weasleyj.china.eport.sign.model.customs179.Customs179Request; import o.github.weasleyj.china.eport.sign.model.request.Message; import o.github.weasleyj.china.eport.sign.model.request.MessageBody; @@ -84,6 +85,61 @@ public class ChinaEportReportClient { private final Customs179Properties customs179Properties; private final ChinaEportProperties chinaEportProperties; + /** + * 构建 ds:Signature 节点 + * + * @param signResult 加签结果 + * @return ds:Signature 节点 + */ + public static String buildSignatureNode(SignResult signResult) { + KeyInfo keyInfo = KeyInfo.builder() + .keyName(signResult.getCertNo()) + .x509Data(new X509Data(signResult.getX509Certificate())) + .build(); + + Reference reference = Reference.builder() + .digestMethod(new DigestMethod()) + .uri("") + .transforms(new Transforms()) + .digestValue(signResult.getDigestValue()) + .build(); + + SignedInfo signedInfo = SignedInfo.builder() + .CanonicalizationMethod(new CanonicalizationMethod()) + .SignatureMethod(new SignatureMethod().setAlgorithm(SignatureHandler.getSignatureMethodAlgorithm())) + .reference(reference) + .build(); + + Signature signature = Signature.builder() + .keyInfo(keyInfo) + .signatureValue(signResult.getSignatureValue()) + .signedInfo(signedInfo) + .build(); + + return JAXBUtil.toXml(signature); + } + + /** + * 构建 ds:SignedInfo 节点 + * + * @param signResult 加签结果 + * @return ds:SignedInfo 节点 + */ + public static String buildSignedInfoNode(SignResult signResult) { + Reference reference = Reference.builder() + .digestMethod(new DigestMethod()) + .uri("") + .transforms(new Transforms()) + .digestValue(signResult.getDigestValue()) + .build(); + SignedInfo signedInfo = SignedInfo.builder() + .CanonicalizationMethod(new CanonicalizationMethod()) + .SignatureMethod(new SignatureMethod().setAlgorithm(SignatureHandler.getSignatureMethodAlgorithm())) + .reference(reference) + .build(); + return JAXBUtil.toXml(signedInfo); + } + /** * CebXxxMessage数据上报海关 * @@ -206,6 +262,13 @@ public class ChinaEportReportClient { buildBaseTransfer(ceb621Message.getBaseTransfer()); yield ceb621Message; } + case CEB303Message -> { + CEB303Message ceb303Message = Objects.requireNonNull(JAXBUtil.toBean(cebMessage, CEB303Message.class)); + ceb303Message.setGuid(guid); + ceb303Message.getOrder().getOrderHead().setGuid(guid); + buildBaseTransfer(ceb303Message.getBaseTransfer()); + yield ceb303Message; + } }; } case JSON -> { @@ -226,6 +289,14 @@ public class ChinaEportReportClient { buildBaseTransfer(ceb621Message.getBaseTransfer()); yield ceb621Message; } + case CEB303Message -> { + CEB303Message ceb303Message = JSONUtil.toBean(cebMessage, new TypeReference<>() { + }, false); + ceb303Message.setGuid(guid); + ceb303Message.getOrder().getOrderHead().setGuid(guid); + buildBaseTransfer(ceb303Message.getBaseTransfer()); + yield ceb303Message; + } }; } default -> throw new IllegalStateException("Unexpected value: " + toJson(request)); @@ -310,31 +381,7 @@ public class ChinaEportReportClient { * @param sourceXml 原始XML */ private String buildXml(SignResult signResult, String sourceXml, IMessageType messageType) { - KeyInfo keyInfo = KeyInfo.builder() - .keyName(signResult.getCertNo()) - .x509Data(new X509Data(signResult.getX509Certificate())) - .build(); - - Reference reference = Reference.builder() - .digestMethod(new DigestMethod()) - .uri("") - .transforms(new Transforms()) - .digestValue(signResult.getDigestValue()) - .build(); - - SignedInfo signedInfo = SignedInfo.builder() - .CanonicalizationMethod(new CanonicalizationMethod()) - .SignatureMethod(new SignatureMethod().setAlgorithm(SignatureHandler.getSignatureMethodAlgorithm())) - .reference(reference) - .build(); - - Signature signature = Signature.builder() - .keyInfo(keyInfo) - .signatureValue(signResult.getSignatureValue()) - .signedInfo(signedInfo) - .build(); - - String signatureNode = JAXBUtil.toXml(signature); + String signatureNode = buildSignatureNode(signResult); String xmlStart = ""; int index = sourceXml.indexOf(xmlStart); StringBuilder builder = new StringBuilder(sourceXml); diff --git a/chinaport-data-signature-app/src/main/java/cn/alphahub/eport/signature/core/SignHandler.java b/chinaport-data-signature-app/src/main/java/cn/alphahub/eport/signature/core/SignHandler.java index 784b14b..f9f150b 100644 --- a/chinaport-data-signature-app/src/main/java/cn/alphahub/eport/signature/core/SignHandler.java +++ b/chinaport-data-signature-app/src/main/java/cn/alphahub/eport/signature/core/SignHandler.java @@ -113,7 +113,6 @@ public class SignHandler { wrapper.setThreadReference(new AtomicReference<>(Thread.currentThread())); if (SignHandler.isSignXml(request)) { wrapper.getSignResult().setDigestValue(SignatureHandler.getDigestValueOfCEBXxxMessage(request.getData())); - wrapper.getSignResult().setSignatureNode(SignatureHandler.getSignatureNodeBeforeSend(request)); } WebSocketConnectionManager manager = new WebSocketConnectionManager(standardWebSocketClient, webSocketClientHandler, ukeyProperties.getWsUrl()); diff --git a/chinaport-data-signature-app/src/main/java/cn/alphahub/eport/signature/core/WebSocketClientHandler.java b/chinaport-data-signature-app/src/main/java/cn/alphahub/eport/signature/core/WebSocketClientHandler.java index 764400e..b844fe0 100644 --- a/chinaport-data-signature-app/src/main/java/cn/alphahub/eport/signature/core/WebSocketClientHandler.java +++ b/chinaport-data-signature-app/src/main/java/cn/alphahub/eport/signature/core/WebSocketClientHandler.java @@ -56,11 +56,11 @@ public class WebSocketClientHandler extends TextWebSocketHandler { @Getter private final CertificateHandler certificateHandler; @Autowired - private UkeyHealthHelper ukeyHealthHelper; - @Autowired private EmailTemplate emailTemplate; @Autowired private EmailProperties emailProperties; + @Autowired + private UkeyHealthHelper ukeyHealthHelper; public WebSocketClientHandler(UkeyProperties ukeyProperties, WebSocketWrapper webSocketWrapper, CertificateHandler certificateHandler) { this.ukeyProperties = ukeyProperties; @@ -91,6 +91,7 @@ public class WebSocketClientHandler extends TextWebSocketHandler { webSocketWrapper.getSignResult().setCertNo(responseArgs.getData().get(1)); if (SignHandler.isSignXml(webSocketWrapper.getRequest())) { webSocketWrapper.getSignResult().setX509Certificate(certificateHandler.getX509Certificate(response.get_method())); + webSocketWrapper.getSignResult().setSignatureNode(ChinaEportReportClient.buildSignedInfoNode(webSocketWrapper.getSignResult())); } } else { sendAlertSignFailure(JacksonUtil.toPrettyJson(response)); diff --git a/chinaport-data-signature-app/src/main/resources/static/index.html b/chinaport-data-signature-app/src/main/resources/static/index.html index 46bab26..eae051d 100644 --- a/chinaport-data-signature-app/src/main/resources/static/index.html +++ b/chinaport-data-signature-app/src/main/resources/static/index.html @@ -1,4 +1,4 @@ -中国电子口岸(海口海关)报文加签API文档
VersionUpdate TimeStatusAuthorDescription

1.0.0

2022-02-16 10:30

创建

Weasley J

创建API文档

1.0.9

2023-06-11 15:36

编辑

Weasley J

更新API文档

1.1.0

2023-07-15 15:36

编辑

Weasley J

补充API文档

1. 电子口岸报文加签测试

1.1. 海关总署XML数据加签

Type: GET

Author: lwj

Content-Type: application/x-www-form-urlencoded;charset=UTF-8

Description: 非正式调用API,只为了让你看到海关总署XML加密的数据返回格式

Request-headers:

HeaderValueTypeRequiredDescription

x-auth-token-eport-sign

string

true

客户端加签时携带的请求头,token值必须和配置文件里面配置鉴权token相等

Response-fields:

FieldTypeDescriptionSince

message

string

返回消息

-

success

boolean

是否成功

-

timestamp

string

响应时间戳

-

code

int32

状态码

-

data

object

响应数据

-

└─success

boolean

本次加签是否成功

-

└─certNo

string

签名的ukey的卡序列号

-

└─x509Certificate

string

签名的ukey证书

-

└─digestValue

string

XML报文的数字摘要

-

└─signatureValue

string

调用ukey获取的签名值

-

└─signatureNode

string

XML报文的签名节点 +中国电子口岸(海口海关)报文加签API文档

VersionUpdate TimeStatusAuthorDescription

1.0.0

2022-02-16 10:30

创建

Weasley J

创建API文档

1.0.9

2023-06-11 15:36

编辑

Weasley J

更新API文档

1.1.0

2023-07-15 15:36

编辑

Weasley J

补充API文档

1. 电子口岸报文加签测试

1.1. 海关总署XML数据加签

Type: GET

Author: lwj

Content-Type: application/x-www-form-urlencoded;charset=UTF-8

Description: 非正式调用API,只为了让你看到海关总署XML加密的数据返回格式

Request-headers:

HeaderValueTypeRequiredDescription

x-auth-token-eport-sign

string

true

客户端加签时携带的请求头,token值必须和配置文件里面配置鉴权token相等

Response-fields:

FieldTypeDescriptionSince

message

string

返回消息

-

success

boolean

是否成功

-

timestamp

string

响应时间戳

-

code

int32

状态码

-

data

object

响应数据

-

└─success

boolean

本次加签是否成功

-

└─certNo

string

签名的ukey的卡序列号

-

└─x509Certificate

string

签名的ukey证书

-

└─digestValue

string

XML报文的数字摘要

-

└─signatureValue

string

调用ukey获取的签名值

-

└─signatureNode

string

XML报文的签名节点

  • 用来组装 ds:SignedInfo 节点
  • -

    Response-example:

    {
       "message": "操作成功",
       "success": true,
    @@ -36,7 +36,7 @@
           ""
         ]
       }
    -}

    Curl-example:

    curl -X POST -H 'x-auth-token-eport-sign:DefaultAuthToken' -i http://localhost:8080/rpc/eport/ukey/health/endpoint/{command}

    3. 电子口岸报文推送

    3.1. 推送CEBMessage报文

    Type: POST

    Author: weasley

    Content-Type: application/json

    Description: <ul>
    <b>支持JSON报文和XML报文</b>
    <li>JSON报文: 无需组装XML结构报文</li>
    <li>XML报文: 需组装XML结构的报文</li>
    </ul>

    Request-headers:

    HeaderValueTypeRequiredDescription

    x-auth-token-eport-sign

    string

    true

    客户端加签时携带的请求头,token值必须和配置文件里面配置鉴权token相等

    Body-parameters:

    ParameterTypeRequiredDescription

    messageType

    enum

    true

    消息类型
    [Enum values:
    CEB311Message("CEB311Message")
    CEB621Message("CEB621Message")
    ]

    dataType

    enum

    true

    报文的数据类型
    [Enum values:
    JSON()
    XML()
    ]

    cebMessage

    object

    true

    进口单、出口单的底层数据模型 +}

    Curl-example:

    curl -X POST -H 'x-auth-token-eport-sign:DefaultAuthToken' -i http://localhost:8080/rpc/eport/ukey/health/endpoint/{command}

    3. 电子口岸报文推送

    3.1. 推送CEBMessage报文

    Type: POST

    Author: weasley

    Content-Type: application/json

    Description: <ul>
    <b>支持JSON报文和XML报文</b>
    <li>JSON报文: 无需组装XML结构报文</li>
    <li>XML报文: 需组装XML结构的报文</li>
    </ul>

    Request-headers:

    HeaderValueTypeRequiredDescription

    x-auth-token-eport-sign

    string

    true

    客户端加签时携带的请求头,token值必须和配置文件里面配置鉴权token相等

    Body-parameters:

    ParameterTypeRequiredDescription

    messageType

    enum

    true

    消息类型
    [Enum values:
    CEB311Message("CEB311Message")
    CEB621Message("CEB621Message")
    CEB303Message("CEB303Message")
    ]

    dataType

    enum

    true

    报文的数据类型
    [Enum values:
    JSON()
    XML()
    ]

    cebMessage

    object

    true

    进口单、出口单的底层数据模型

      以CEB311Message数据类型为例
    • @@ -196,4 +196,4 @@ }

      Curl-example:

      curl -X POST -H 'Content-Type: application/json' -H 'x-auth-token-eport-sign:DefaultAuthToken' -i http://localhost:8080/rpc/eport/signature --data '{
         "id": 0,
         "data": ""
      -}'
      Generated by smart-doc at 2023-07-28 21:39:41Suggestions,contact,support and error reporting on Gitee or Github
      Top
      +}'
      Generated by smart-doc at 2023-07-30 18:44:50Suggestions,contact,support and error reporting on Gitee or Github
      Top
      diff --git a/chinaport-data-signature-app/src/test/java/cn/alphahub/eport/signature/controller/rpc/EportSignControllerTest.java b/chinaport-data-signature-app/src/test/java/cn/alphahub/eport/signature/controller/rpc/EportSignControllerTest.java index 9fc342f..2caecef 100644 --- a/chinaport-data-signature-app/src/test/java/cn/alphahub/eport/signature/controller/rpc/EportSignControllerTest.java +++ b/chinaport-data-signature-app/src/test/java/cn/alphahub/eport/signature/controller/rpc/EportSignControllerTest.java @@ -145,8 +145,6 @@ class EportSignControllerTest { """; SignRequest request = new SignRequest(xml); - SignResult result = controller.signature(request).getData(); - // 组装数据 CEB311Message ceb311Message = JAXBUtil.toBean(xml, CEB311Message.class); String guid = GUIDUtil.getGuid(); diff --git a/chinaport-data-signature-app/src/test/java/cn/alphahub/eport/signature/report/export/Upload303XmlTests.java b/chinaport-data-signature-app/src/test/java/cn/alphahub/eport/signature/report/export/Upload303XmlTests.java new file mode 100644 index 0000000..ae00304 --- /dev/null +++ b/chinaport-data-signature-app/src/test/java/cn/alphahub/eport/signature/report/export/Upload303XmlTests.java @@ -0,0 +1,135 @@ +package cn.alphahub.eport.signature.report.export; + +import cn.alphahub.dtt.plus.util.JacksonUtil; +import cn.alphahub.eport.signature.base.domain.Result; +import cn.alphahub.eport.signature.entity.SignResult; +import cn.hutool.http.ContentType; +import cn.hutool.http.HttpResponse; +import cn.hutool.http.HttpUtil; +import cn.hutool.json.JSONUtil; +import com.fasterxml.jackson.core.type.TypeReference; +import lombok.extern.slf4j.Slf4j; +import o.github.weasleyj.china.eport.sign.model.cebmessage.export.CEB303Message; +import o.github.weasleyj.china.eport.sign.util.JAXBUtil; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +import java.util.HashMap; + +/** + * 621 进口单 xml 上报测试 + * + * @author weasley + * @version 1.0.0 + */ +@Slf4j +@SpringBootTest +class Upload303XmlTests { + + @Test + void sign() { + final String data = """ + + + + + CEB303_ZH_GZ_20230309112945042_67622 + 1 + 20230309112945 + 2 + E + SGFGP0003129133YKKA7 + 44306650K2 + 广州市汇客物流有限公司 + 44306650K2 + 广州市汇客物流有限公司 + 13.89000 + 0.00000 + 142 + 希音 + + + 1 + se2209024331104035 + 手机支架 + + 011 + 142 + 1.00000 + 13.89000 + 13.89000 + 希音 + + + + 44306650K2 + 广州市汇客物流有限公司 + DXP + 向中国电子口岸数据中心申请数据交换平台的用户编号 + + + """; + HttpResponse response = HttpUtil.createPost("http://localhost:8080/rpc/eport/signature") + .contentType(ContentType.JSON.getValue()) + .header("x-auth-token-eport-sign", "DefaultAuthToken") + .body(JSONUtil.toJsonStr(new HashMap() {{ + put("id", 1); + put("data", data); + }})) + .execute(); + System.err.println(JacksonUtil.toPrettyJson(response.body())); + Result result = JacksonUtil.readValue(response.body(), new TypeReference>() { + }); + System.err.println("\n" + result.getData().getSignatureNode()); + } + + + @Test + void xmlToCEB303Message() { + String xml = """ + + + + + CEB303_ZH_GZ_20230309112945042_67615 + 1 + 20230309112945 + 2 + E + SGFGP0003129133YKK5 + 44306650K2 + 广州市汇客物流有限公司 + 44306650K2 + 广州市汇客物流有限公司 + 13.89000 + 0.00000 + 142 + 希音 + + + 1 + se2209024331104035 + 手机支架 + + 011 + 142 + 1.00000 + 13.89000 + 13.89000 + test + + + + 44306650K2 + 广州市汇客物流有限公司 + DXP + 向中国电子口岸数据中心申请数据交换平台的用户编号 + + + """; + CEB303Message ceb303Message = JAXBUtil.toBean(xml, CEB303Message.class); + System.err.println(JSONUtil.toJsonPrettyStr(ceb303Message) + "\n"); + String ceb303MessageXml = JAXBUtil.toXml(ceb303Message); + System.out.println(ceb303MessageXml); + } +} diff --git a/chinaport-data-signature-data-model/pom.xml b/chinaport-data-signature-data-model/pom.xml index 5713119..e84b1bb 100644 --- a/chinaport-data-signature-data-model/pom.xml +++ b/chinaport-data-signature-data-model/pom.xml @@ -5,7 +5,7 @@ io.github.weasley-j chinaport-data-signature-data-model - 1.0.4 + 1.0.5 chinaport-data-signature-data-model jar https://github.com/Weasley-J/chinaport-data-signature/tree/main/chinaport-data-signature-data-model diff --git a/chinaport-data-signature-data-model/src/main/java/o/github/weasleyj/china/eport/sign/constants/MessageType.java b/chinaport-data-signature-data-model/src/main/java/o/github/weasleyj/china/eport/sign/constants/MessageType.java index 7f8d4a4..cef66af 100644 --- a/chinaport-data-signature-data-model/src/main/java/o/github/weasleyj/china/eport/sign/constants/MessageType.java +++ b/chinaport-data-signature-data-model/src/main/java/o/github/weasleyj/china/eport/sign/constants/MessageType.java @@ -9,8 +9,11 @@ import o.github.weasleyj.china.eport.sign.IMessageType; * @version 1.0.0 */ public enum MessageType implements IMessageType { + /* 进口单 */ CEB311Message("CEB311Message"), CEB621Message("CEB621Message"), + /* 出口单 */ + CEB303Message("CEB303Message"), ; private final String messageType; diff --git a/chinaport-data-signature-data-model/src/main/java/o/github/weasleyj/china/eport/sign/model/cebmessage/export/CEB303Message.java b/chinaport-data-signature-data-model/src/main/java/o/github/weasleyj/china/eport/sign/model/cebmessage/export/CEB303Message.java new file mode 100644 index 0000000..6a381ec --- /dev/null +++ b/chinaport-data-signature-data-model/src/main/java/o/github/weasleyj/china/eport/sign/model/cebmessage/export/CEB303Message.java @@ -0,0 +1,54 @@ +package o.github.weasleyj.china.eport.sign.model.cebmessage.export; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import lombok.ToString; +import lombok.experimental.Accessors; +import o.github.weasleyj.china.eport.sign.AbstractCebMessage; +import o.github.weasleyj.china.eport.sign.constants.NameSpace; +import o.github.weasleyj.china.eport.sign.model.cebmessage.BaseSubscribe; +import o.github.weasleyj.china.eport.sign.model.cebmessage.BaseTransfer; +import o.github.weasleyj.china.eport.sign.model.cebmessage.ExtendMessage; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; +import java.io.Serializable; + +/** + * CEB303Message 出口单 + * + * @author weasley + * @version 1.0.0 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@Accessors(chain = true) +@ToString(callSuper = true) +@EqualsAndHashCode(callSuper = true) +@XmlAccessorType(XmlAccessType.FIELD) +@XmlRootElement(name = "CEB303Message", namespace = NameSpace.NAMESPACE_CEB_URI) +public class CEB303Message extends AbstractCebMessage implements Serializable { + @XmlAttribute(name = "guid") + private String guid; + + @XmlAttribute(name = "version") + private String version; + + @XmlElement(name = "Order", namespace = NameSpace.NAMESPACE_CEB_URI) + private Order order; + + @XmlElement(name = "BaseTransfer", namespace = NameSpace.NAMESPACE_CEB_URI) + private BaseTransfer baseTransfer; + + @XmlElement(name = "BaseSubscribe", namespace = NameSpace.NAMESPACE_CEB_URI) + private BaseSubscribe baseSubscribe; + + @XmlElement(name = "ExtendMessage", namespace = NameSpace.NAMESPACE_CEB_URI) + private ExtendMessage extendMessage; +} diff --git a/chinaport-data-signature-data-model/src/main/java/o/github/weasleyj/china/eport/sign/model/cebmessage/export/Order.java b/chinaport-data-signature-data-model/src/main/java/o/github/weasleyj/china/eport/sign/model/cebmessage/export/Order.java new file mode 100644 index 0000000..85be60e --- /dev/null +++ b/chinaport-data-signature-data-model/src/main/java/o/github/weasleyj/china/eport/sign/model/cebmessage/export/Order.java @@ -0,0 +1,38 @@ +package o.github.weasleyj.china.eport.sign.model.cebmessage.export; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; +import java.io.Serializable; +import java.util.List; + +import static o.github.weasleyj.china.eport.sign.constants.NameSpace.NAMESPACE_CEB_URI; + +/** + * The Order + *

      订单表头 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@Accessors(chain = true) +@XmlAccessorType(XmlAccessType.FIELD) +@XmlRootElement(name = "Order ", namespace = NAMESPACE_CEB_URI) +public class Order implements Serializable { + /** + * 订单表头 + */ + @XmlElement(name = "OrderHead", namespace = NAMESPACE_CEB_URI) + private OrderHead orderHead; + /** + * 订单商品列表 + */ + @XmlElement(name = "OrderList", namespace = NAMESPACE_CEB_URI) + private List orderList; +} diff --git a/chinaport-data-signature-data-model/src/main/java/o/github/weasleyj/china/eport/sign/model/cebmessage/export/OrderHead.java b/chinaport-data-signature-data-model/src/main/java/o/github/weasleyj/china/eport/sign/model/cebmessage/export/OrderHead.java new file mode 100644 index 0000000..58fe6b7 --- /dev/null +++ b/chinaport-data-signature-data-model/src/main/java/o/github/weasleyj/china/eport/sign/model/cebmessage/export/OrderHead.java @@ -0,0 +1,96 @@ +package o.github.weasleyj.china.eport.sign.model.cebmessage.export; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; +import java.io.Serializable; + +import static o.github.weasleyj.china.eport.sign.constants.NameSpace.NAMESPACE_CEB_URI; + +/** + * 订单表头 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@Accessors(chain = true) +@XmlAccessorType(XmlAccessType.FIELD) +@XmlRootElement(name = "OrderHead ", namespace = NAMESPACE_CEB_URI) +public class OrderHead implements Serializable { + /** + * 1-系统唯一序号-guid-C36-是-企业系统生成36位唯一序号(英文字母大写)。 + */ + @XmlElement(namespace = NAMESPACE_CEB_URI) + private String guid; + /** + * 2-报送类型-appType-C1-是-企业报送类型。1-新增 + */ + @XmlElement(namespace = NAMESPACE_CEB_URI) + private String appType; + /** + * 3-报送时间-appTime-C14-是-企业报送时间。格式:YYYYMMDDhhmmss。 + */ + @XmlElement(namespace = NAMESPACE_CEB_URI) + private String appTime; + /** + * 4-业务状态-appStatus-C..3-是-业务状态:1-暂存,2-申报,默认为2。 + */ + @XmlElement(namespace = NAMESPACE_CEB_URI) + private String appStatus; + /** + * 5-订单类型-orderType-C1-是-电子订单类型:I进口 + */ + @XmlElement(namespace = NAMESPACE_CEB_URI) + private String orderType; + /** + * 6-订单编号-orderNo-C..60-是-交易平台的订单编号,同一交易平台的订单编号应唯一。订单编号长度不能超过60位。 + */ + @XmlElement(namespace = NAMESPACE_CEB_URI) + private String orderNo; + /** + * 7-电商平台代码-ebpCode-C..18-是-电商平台的海关注册登记编号;电商平台未在海关注册登记,由电商企业发送订单的,以中国电子口岸发布的电商平台标识编号为准。 + */ + @XmlElement(namespace = NAMESPACE_CEB_URI) + private String ebpCode; + /** + * 8-电商平台名称-ebpName-C..100-是-电商平台的海关注册登记名称;电商平台未在海关注册登记,由电商企业发送订单的,以中国电子口岸发布的电商平台名称为准。 + */ + @XmlElement(namespace = NAMESPACE_CEB_URI) + private String ebpName; + /** + * 9-电商企业代码-ebcCode-C..18-是-电商企业的海关注册登记编号。 + */ + @XmlElement(namespace = NAMESPACE_CEB_URI) + private String ebcCode; + /** + * 10-电商企业名称-ebcName-C..100-是-电商企业的海关注册登记名称。 + */ + @XmlElement(namespace = NAMESPACE_CEB_URI) + private String ebcName; + /** + * 11-商品价格-goodsValue-N16,2-是-商品实际成交价,含非现金抵扣金额。 + */ + @XmlElement(namespace = NAMESPACE_CEB_URI) + private String goodsValue; + /** + * 12-运杂费-freight-N16,2-是-不包含在商品价格中的运杂费,无则填写"0"。 + */ + @XmlElement(namespace = NAMESPACE_CEB_URI) + private String freight; + /** + * 币制-海关标准的参数代码 《JGS-20 海关业务代码集》- 货币代码 + */ + @XmlElement(namespace = NAMESPACE_CEB_URI) + private String currency; + /** + * 备注-note-C..1000-否- + */ + @XmlElement(namespace = NAMESPACE_CEB_URI) + private String note; +} diff --git a/chinaport-data-signature-data-model/src/main/java/o/github/weasleyj/china/eport/sign/model/cebmessage/export/OrderList.java b/chinaport-data-signature-data-model/src/main/java/o/github/weasleyj/china/eport/sign/model/cebmessage/export/OrderList.java new file mode 100644 index 0000000..c10240a --- /dev/null +++ b/chinaport-data-signature-data-model/src/main/java/o/github/weasleyj/china/eport/sign/model/cebmessage/export/OrderList.java @@ -0,0 +1,88 @@ +package o.github.weasleyj.china.eport.sign.model.cebmessage.export; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; +import java.io.Serializable; + +import static o.github.weasleyj.china.eport.sign.constants.NameSpace.NAMESPACE_CEB_URI; + +/** + * The Order List + *

      订单商品表体 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@Accessors(chain = true) +@XmlAccessorType(XmlAccessType.FIELD) +@XmlRootElement(name = "OrderList ", namespace = NAMESPACE_CEB_URI) +public class OrderList implements Serializable { + /** + * 1-商品序号-gnum-N2-是-从1开始的递增序号。 + */ + @XmlElement(namespace = NAMESPACE_CEB_URI) + private Integer gnum; + + /** + * 2-企业商品货号-itemNo-C..30-是-电商企业自定义的商品货号(SKU)。 + */ + @XmlElement(namespace = NAMESPACE_CEB_URI) + private String itemNo; + + /** + * 3-企业商品名称-itemName-C..250-是-交易平台销售商品的中文名称。 + */ + @XmlElement(namespace = NAMESPACE_CEB_URI) + private String itemName; + /** + * 4-企业商品描述-itemDescribe-C..1000-否-交易平台销售商品的描述信息。 + */ + @XmlElement(namespace = NAMESPACE_CEB_URI) + private String itemDescribe; + + /** + * 5-条形码-barCode-C..50-否-国际通用的商品条形码,一般由前缀部分、制造厂商代码、商品代码和校验码组成。 + */ + @XmlElement(namespace = NAMESPACE_CEB_URI) + private String barCode; + /** + * 6-单位-unit-C3-是-填写海关标准的参数代码,参照《JGS-20 海关业务代码集》- 计量单位代码。 + */ + @XmlElement(namespace = NAMESPACE_CEB_URI) + private String unit; + /** + * 10-币制-currency-C3-是-限定为人民币,填写“142”。 + */ + @XmlElement(namespace = NAMESPACE_CEB_URI) + private String currency; + /** + * 7-数量-qty-N16,2-是-商品实际数量。 + */ + @XmlElement(namespace = NAMESPACE_CEB_URI) + private String qty; + + /** + * 8-单价-price-N16,2-是-商品单价。赠品单价填写为“0”。 + */ + @XmlElement(namespace = NAMESPACE_CEB_URI) + private String price; + + /** + * 9-总价-totalPrice-N16,2-是-商品总价,等于单价乘以数量。 + */ + @XmlElement(namespace = NAMESPACE_CEB_URI) + private String totalPrice; + + /** + * 12-备注-note-C..1000-否-促销活动,商品单价偏离市场价格的,可以在此说明。 + */ + @XmlElement(namespace = NAMESPACE_CEB_URI) + private String note; +} From 1dd7ef3ac9c8a5c437247ce34df601a26029c05e Mon Sep 17 00:00:00 2001 From: Weasley J <1432689025@qq.com> Date: Sun, 30 Jul 2023 18:57:20 +0800 Subject: [PATCH 2/2] =?UTF-8?q?[feature]=20=E4=BF=AE=E6=AD=A3=20ds:SignedI?= =?UTF-8?q?nfo=20=E8=8A=82=E7=82=B9=E8=BF=94=E5=9B=9E=E5=80=BC=20[feature]?= =?UTF-8?q?=20=E5=A2=9E=E5=8A=A0=20CEB303Message=20=E5=87=BA=E5=8F=A3?= =?UTF-8?q?=E5=8D=95=E6=95=B0=E6=8D=AE=E6=A8=A1=E5=9E=8B=20[feature]=20?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=8E=A5=E5=85=A5=E5=85=AC=E5=8F=B8=E5=90=8D?= =?UTF-8?q?=E7=A7=B0=20[feature]=20=E8=B7=9F=E6=96=B0API=E6=8E=A5=E5=85=A5?= =?UTF-8?q?=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/test/EportTestController.java | 15 +-------------- .../src/main/resources/static/index.html | 12 ++++++------ .../report/export/Upload303XmlTests.java | 2 +- chinaport-data-signature-data-model/README.md | 6 +++++- 中国电子口岸报文加签接口文档.md | 19 +++++++++++-------- 5 files changed, 24 insertions(+), 30 deletions(-) diff --git a/chinaport-data-signature-app/src/main/java/cn/alphahub/eport/signature/controller/test/EportTestController.java b/chinaport-data-signature-app/src/main/java/cn/alphahub/eport/signature/controller/test/EportTestController.java index afff463..32456a4 100644 --- a/chinaport-data-signature-app/src/main/java/cn/alphahub/eport/signature/controller/test/EportTestController.java +++ b/chinaport-data-signature-app/src/main/java/cn/alphahub/eport/signature/controller/test/EportTestController.java @@ -41,20 +41,7 @@ public class EportTestController { * * @return 数据加签结果 * @apiNote 非正式调用API,只为了让你看到海关总署XML加密的数据返回格式 - * @response { - * "message": "操作成功", - * "success": true, - * "timestamp": "2023-07-28 21:39:15", - * "code": 200, - * "data": { - * "success": true, - * "certNo": "03000000000cde6f", - * "x509Certificate": "MIIEoDCCBESgAwIBAgIIAwAAAAAM3m8wDAYIKoEcz1UBg3UFADCBmDELMAkGA1UEBhMCQ04xDzANBgNVBAgMBuWMl+S6rDEPMA0GA1UEBwwG5YyX5LqsMRswGQYDVQQKDBLkuK3lm73nlLXlrZDlj6PlsrgxGzAZBgNVBAsMEuivgeS5pueuoeeQhuS4reW/gzEtMCsGA1UEAwwk5Lit5Zu955S15a2Q5Lia5Yqh6K+B5Lmm566h55CG5Lit5b+DMB4XDTIzMDMyOTAwMDAwMFoXDTMzMDMyOTAwMDAwMFowVjELMAkGA1UEBhMCQ04xMzAxBgNVBAsMKua1t+WNl+ecgeiNo+iqiei/m+WHuuWPo+i0uOaYk+aciemZkOWFrOWPuDESMBAGA1UEAwwJ5p2o5aaC6YeRMFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAE0vOQmplAr9igPZrA8F1msqnFd0U++6G6NhG5rNuIUWft0BwQn7eSJkt5/fvSSoe7pUg2/awHUWPnzkeeQc7oVqOCArUwggKxMBEGCWCGSAGG+EIBAQQEAwIFoDAOBgNVHQ8BAf8EBAMCBsAwCQYDVR0TBAIwADApBgNVHSUEIjAgBggrBgEFBQcDAgYIKwYBBQUHAwQGCisGAQQBgjcUAgIwHwYDVR0jBBgwFoAURCQxt0wEvoAVXmuo4N1bjKXTh0UwHQYDVR0OBBYEFAytGob5L0WqhOCZ5l6Lf2jUdNrAMGgGA1UdIARhMF8wXQYEVR0gADBVMFMGCCsGAQUFBwIBFkdodHRwczovL3d3dy5jaGluYXBvcnQuZ292LmNuL3RjbXNmaWxlL3UvY21zL3d3dy8yMDIyMDQvMTIxMzI5NDh4dDZwLnBkZjB/BgNVHR8EeDB2MHSgcqBwhm5sZGFwOi8vbGRhcC5jaGluYXBvcnQuZ292LmNuOjM4OS9jbj1jcmwwMzAwMDAsb3U9Y3JsMDAsb3U9Y3JsLGM9Y24/Y2VydGlmaWNhdGVSZXZvY2F0aW9uTGlzdD9iYXNlP2NuPWNybDAzMDAwMDA+BggrBgEFBQcBAQQyMDAwLgYIKwYBBQUHMAGGImh0dHA6Ly9vY3NwLmNoaW5hcG9ydC5nb3YuY246ODgwMC8wOgYKKwYBBAGpQ2QFAQQsDCrmtbfljZfnnIHojaPoqonov5vlh7rlj6PotLjmmJPmnInpmZDlhazlj7gwEgYKKwYBBAGpQ2QFAwQEDAIwMTAiBgorBgEEAalDZAUIBBQMEjUxMjMyNDE5NjQxMDE3Mjk3WDAgBgorBgEEAalDZAUJBBIMEDAzLUpKMEc5MDAyMjA3NTIwGQYKKwYBBAGpQ2QFCwQLDAlNQTVUTkZHWTkwEgYKKwYBBAGpQ2QFDAQEDAIwMDASBgorBgEEAalDZAIBBAQMAjEyMBIGCisGAQQBqUNkAgQEBAwCMTQwDAYIKoEcz1UBg3UFAANIADBFAiBM4OVAc8aaCZU4XFfcVMkC7bWIIenRnPLxrnwVeYO3CQIhANQ767YIurkJCoLtwyqQPbUZe/+3BjGZcIWqB1mAl9T+", - * "digestValue": "EW5//PlrSsuQ8pw+hRRtSsSDaN4=", - * "signatureValue": "MeEiFDT6H6Sn/foR5zxKrl3g/i+fsCe2humDK6LA2E9ORvFxijpAILxXLezvUBIyqXmydu4BjFwAQk62+V1QtQ==", - * "signatureNode": "EW5//PlrSsuQ8pw+hRRtSsSDaN4=" - * } - * } + * @response {"message":"操作成功","success":true,"timestamp":"2023-07-30 18:49:15","code":200,"data":{"success":true,"certNo":"03000000000cde6f","x509Certificate":"MIIEoDCCBESgAwIBAgIIAwAAAAAM3m8wDAYIKoEcz1UBg3UFADCBmDELMAkGA1UEBhMCQ04xDzANBgNVBAgMBuWMl+S6rDEPMA0GA1UEBwwG5YyX5LqsMRswGQYDVQQKDBLkuK3lm73nlLXlrZDlj6PlsrgxGzAZBgNVBAsMEuivgeS5pueuoeeQhuS4reW/gzEtMCsGA1UEAwwk5Lit5Zu955S15a2Q5Lia5Yqh6K+B5Lmm566h55CG5Lit5b+DMB4XDTIzMDMyOTAwMDAwMFoXDTMzMDMyOTAwMDAwMFowVjELMAkGA1UEBhMCQ04xMzAxBgNVBAsMKua1t+WNl+ecgeiNo+iqiei/m+WHuuWPo+i0uOaYk+aciemZkOWFrOWPuDESMBAGA1UEAwwJ5p2o5aaC6YeRMFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAE0vOQmplAr9igPZrA8F1msqnFd0U++6G6NhG5rNuIUWft0BwQn7eSJkt5/fvSSoe7pUg2/awHUWPnzkeeQc7oVqOCArUwggKxMBEGCWCGSAGG+EIBAQQEAwIFoDAOBgNVHQ8BAf8EBAMCBsAwCQYDVR0TBAIwADApBgNVHSUEIjAgBggrBgEFBQcDAgYIKwYBBQUHAwQGCisGAQQBgjcUAgIwHwYDVR0jBBgwFoAURCQxt0wEvoAVXmuo4N1bjKXTh0UwHQYDVR0OBBYEFAytGob5L0WqhOCZ5l6Lf2jUdNrAMGgGA1UdIARhMF8wXQYEVR0gADBVMFMGCCsGAQUFBwIBFkdodHRwczovL3d3dy5jaGluYXBvcnQuZ292LmNuL3RjbXNmaWxlL3UvY21zL3d3dy8yMDIyMDQvMTIxMzI5NDh4dDZwLnBkZjB/BgNVHR8EeDB2MHSgcqBwhm5sZGFwOi8vbGRhcC5jaGluYXBvcnQuZ292LmNuOjM4OS9jbj1jcmwwMzAwMDAsb3U9Y3JsMDAsb3U9Y3JsLGM9Y24/Y2VydGlmaWNhdGVSZXZvY2F0aW9uTGlzdD9iYXNlP2NuPWNybDAzMDAwMDA+BggrBgEFBQcBAQQyMDAwLgYIKwYBBQUHMAGGImh0dHA6Ly9vY3NwLmNoaW5hcG9ydC5nb3YuY246ODgwMC8wOgYKKwYBBAGpQ2QFAQQsDCrmtbfljZfnnIHojaPoqonov5vlh7rlj6PotLjmmJPmnInpmZDlhazlj7gwEgYKKwYBBAGpQ2QFAwQEDAIwMTAiBgorBgEEAalDZAUIBBQMEjUxMjMyNDE5NjQxMDE3Mjk3WDAgBgorBgEEAalDZAUJBBIMEDAzLUpKMEc5MDAyMjA3NTIwGQYKKwYBBAGpQ2QFCwQLDAlNQTVUTkZHWTkwEgYKKwYBBAGpQ2QFDAQEDAIwMDASBgorBgEEAalDZAIBBAQMAjEyMBIGCisGAQQBqUNkAgQEBAwCMTQwDAYIKoEcz1UBg3UFAANIADBFAiBM4OVAc8aaCZU4XFfcVMkC7bWIIenRnPLxrnwVeYO3CQIhANQ767YIurkJCoLtwyqQPbUZe/+3BjGZcIWqB1mAl9T+","digestValue":"/uy5whbEnIhnrSkF7hSAJNm8ISI=","signatureValue":"uEG8qUT4NMS7g+QVJK6WdVQXlSK5n94PQJ+iGWec2cCyXfKh6Il2U+jmEq6nxWpoxCn3M0zNH7bICaoKrMpc6w==","signatureNode":"\n\n \n \n \n \n \n \n \n /uy5whbEnIhnrSkF7hSAJNm8ISI=\n \n"}} */ @GetMapping("/cebmessage/signature") public Result signCebMessage() { diff --git a/chinaport-data-signature-app/src/main/resources/static/index.html b/chinaport-data-signature-app/src/main/resources/static/index.html index eae051d..5540a02 100644 --- a/chinaport-data-signature-app/src/main/resources/static/index.html +++ b/chinaport-data-signature-app/src/main/resources/static/index.html @@ -1,16 +1,16 @@ -中国电子口岸(海口海关)报文加签API文档

      VersionUpdate TimeStatusAuthorDescription

      1.0.0

      2022-02-16 10:30

      创建

      Weasley J

      创建API文档

      1.0.9

      2023-06-11 15:36

      编辑

      Weasley J

      更新API文档

      1.1.0

      2023-07-15 15:36

      编辑

      Weasley J

      补充API文档

      1. 电子口岸报文加签测试

      1.1. 海关总署XML数据加签

      Type: GET

      Author: lwj

      Content-Type: application/x-www-form-urlencoded;charset=UTF-8

      Description: 非正式调用API,只为了让你看到海关总署XML加密的数据返回格式

      Request-headers:

      HeaderValueTypeRequiredDescription

      x-auth-token-eport-sign

      string

      true

      客户端加签时携带的请求头,token值必须和配置文件里面配置鉴权token相等

      Response-fields:

      FieldTypeDescriptionSince

      message

      string

      返回消息

      -

      success

      boolean

      是否成功

      -

      timestamp

      string

      响应时间戳

      -

      code

      int32

      状态码

      -

      data

      object

      响应数据

      -

      └─success

      boolean

      本次加签是否成功

      -

      └─certNo

      string

      签名的ukey的卡序列号

      -

      └─x509Certificate

      string

      签名的ukey证书

      -

      └─digestValue

      string

      XML报文的数字摘要

      -

      └─signatureValue

      string

      调用ukey获取的签名值

      -

      └─signatureNode

      string

      XML报文的签名节点 +中国电子口岸(海口海关)报文加签API文档

      VersionUpdate TimeStatusAuthorDescription

      1.0.0

      2022-02-16 10:30

      创建

      Weasley J

      创建API文档

      1.0.9

      2023-06-11 15:36

      编辑

      Weasley J

      更新API文档

      1.1.0

      2023-07-15 15:36

      编辑

      Weasley J

      补充API文档

      1. 电子口岸报文加签测试

      1.1. 海关总署XML数据加签

      Type: GET

      Author: lwj

      Content-Type: application/x-www-form-urlencoded;charset=UTF-8

      Description: 非正式调用API,只为了让你看到海关总署XML加密的数据返回格式

      Request-headers:

      HeaderValueTypeRequiredDescription

      x-auth-token-eport-sign

      string

      true

      客户端加签时携带的请求头,token值必须和配置文件里面配置鉴权token相等

      Response-fields:

      FieldTypeDescriptionSince

      message

      string

      返回消息

      -

      success

      boolean

      是否成功

      -

      timestamp

      string

      响应时间戳

      -

      code

      int32

      状态码

      -

      data

      object

      响应数据

      -

      └─success

      boolean

      本次加签是否成功

      -

      └─certNo

      string

      签名的ukey的卡序列号

      -

      └─x509Certificate

      string

      签名的ukey证书

      -

      └─digestValue

      string

      XML报文的数字摘要

      -

      └─signatureValue

      string

      调用ukey获取的签名值

      -

      └─signatureNode

      string

      XML报文的签名节点

    • 用来组装 ds:SignedInfo 节点
    • -

      Response-example:

      {
         "message": "操作成功",
         "success": true,
      -  "timestamp": "2023-07-28 21:39:15",
      +  "timestamp": "2023-07-30 18:49:15",
         "code": 200,
         "data": {
           "success": true,
           "certNo": "03000000000cde6f",
           "x509Certificate": "MIIEoDCCBESgAwIBAgIIAwAAAAAM3m8wDAYIKoEcz1UBg3UFADCBmDELMAkGA1UEBhMCQ04xDzANBgNVBAgMBuWMl+S6rDEPMA0GA1UEBwwG5YyX5LqsMRswGQYDVQQKDBLkuK3lm73nlLXlrZDlj6PlsrgxGzAZBgNVBAsMEuivgeS5pueuoeeQhuS4reW/gzEtMCsGA1UEAwwk5Lit5Zu955S15a2Q5Lia5Yqh6K+B5Lmm566h55CG5Lit5b+DMB4XDTIzMDMyOTAwMDAwMFoXDTMzMDMyOTAwMDAwMFowVjELMAkGA1UEBhMCQ04xMzAxBgNVBAsMKua1t+WNl+ecgeiNo+iqiei/m+WHuuWPo+i0uOaYk+aciemZkOWFrOWPuDESMBAGA1UEAwwJ5p2o5aaC6YeRMFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAE0vOQmplAr9igPZrA8F1msqnFd0U++6G6NhG5rNuIUWft0BwQn7eSJkt5/fvSSoe7pUg2/awHUWPnzkeeQc7oVqOCArUwggKxMBEGCWCGSAGG+EIBAQQEAwIFoDAOBgNVHQ8BAf8EBAMCBsAwCQYDVR0TBAIwADApBgNVHSUEIjAgBggrBgEFBQcDAgYIKwYBBQUHAwQGCisGAQQBgjcUAgIwHwYDVR0jBBgwFoAURCQxt0wEvoAVXmuo4N1bjKXTh0UwHQYDVR0OBBYEFAytGob5L0WqhOCZ5l6Lf2jUdNrAMGgGA1UdIARhMF8wXQYEVR0gADBVMFMGCCsGAQUFBwIBFkdodHRwczovL3d3dy5jaGluYXBvcnQuZ292LmNuL3RjbXNmaWxlL3UvY21zL3d3dy8yMDIyMDQvMTIxMzI5NDh4dDZwLnBkZjB/BgNVHR8EeDB2MHSgcqBwhm5sZGFwOi8vbGRhcC5jaGluYXBvcnQuZ292LmNuOjM4OS9jbj1jcmwwMzAwMDAsb3U9Y3JsMDAsb3U9Y3JsLGM9Y24/Y2VydGlmaWNhdGVSZXZvY2F0aW9uTGlzdD9iYXNlP2NuPWNybDAzMDAwMDA+BggrBgEFBQcBAQQyMDAwLgYIKwYBBQUHMAGGImh0dHA6Ly9vY3NwLmNoaW5hcG9ydC5nb3YuY246ODgwMC8wOgYKKwYBBAGpQ2QFAQQsDCrmtbfljZfnnIHojaPoqonov5vlh7rlj6PotLjmmJPmnInpmZDlhazlj7gwEgYKKwYBBAGpQ2QFAwQEDAIwMTAiBgorBgEEAalDZAUIBBQMEjUxMjMyNDE5NjQxMDE3Mjk3WDAgBgorBgEEAalDZAUJBBIMEDAzLUpKMEc5MDAyMjA3NTIwGQYKKwYBBAGpQ2QFCwQLDAlNQTVUTkZHWTkwEgYKKwYBBAGpQ2QFDAQEDAIwMDASBgorBgEEAalDZAIBBAQMAjEyMBIGCisGAQQBqUNkAgQEBAwCMTQwDAYIKoEcz1UBg3UFAANIADBFAiBM4OVAc8aaCZU4XFfcVMkC7bWIIenRnPLxrnwVeYO3CQIhANQ767YIurkJCoLtwyqQPbUZe/+3BjGZcIWqB1mAl9T+",
      -    "digestValue": "EW5//PlrSsuQ8pw+hRRtSsSDaN4=",
      -    "signatureValue": "MeEiFDT6H6Sn/foR5zxKrl3g/i+fsCe2humDK6LA2E9ORvFxijpAILxXLezvUBIyqXmydu4BjFwAQk62+V1QtQ==",
      -    "signatureNode": "EW5//PlrSsuQ8pw+hRRtSsSDaN4="
      +    "digestValue": "/uy5whbEnIhnrSkF7hSAJNm8ISI=",
      +    "signatureValue": "uEG8qUT4NMS7g+QVJK6WdVQXlSK5n94PQJ+iGWec2cCyXfKh6Il2U+jmEq6nxWpoxCn3M0zNH7bICaoKrMpc6w==",
      +    "signatureNode": "\n\n    \n    \n    \n        \n            \n        \n        \n        /uy5whbEnIhnrSkF7hSAJNm8ISI=\n    \n"
         }
       }

      Curl-example:

      curl -X GET -H 'x-auth-token-eport-sign:DefaultAuthToken' -i http://localhost:8080/rpc/eport/test/cebmessage/signature

      1.2. 海关179数据抓取加签

      Type: GET

      Author: lwj

      Content-Type: application/x-www-form-urlencoded;charset=UTF-8

      Description: 非正式调用API,只为了让你看到179加密的数据返回格式

      Request-headers:

      HeaderValueTypeRequiredDescription

      x-auth-token-eport-sign

      string

      true

      客户端加签时携带的请求头,token值必须和配置文件里面配置鉴权token相等

      Response-fields:

      FieldTypeDescriptionSince

      message

      string

      返回消息

      -

      success

      boolean

      是否成功

      -

      timestamp

      string

      响应时间戳

      -

      code

      int32

      状态码

      -

      data

      object

      响应数据

      -

      └─success

      boolean

      本次加签是否成功

      -

      └─certNo

      string

      签名的ukey的卡序列号

      -

      └─x509Certificate

      string

      签名的ukey证书

      -

      └─digestValue

      string

      XML报文的数字摘要

      -

      └─signatureValue

      string

      调用ukey获取的签名值

      -

      └─signatureNode

      string

      XML报文的签名节点

    • 用来组装 ds:SignedInfo 节点
    • -

      Response-example:

      {
      @@ -196,4 +196,4 @@
       }

      Curl-example:

      curl -X POST -H 'Content-Type: application/json' -H 'x-auth-token-eport-sign:DefaultAuthToken' -i http://localhost:8080/rpc/eport/signature --data '{
         "id": 0,
         "data": ""
      -}'
      Generated by smart-doc at 2023-07-30 18:44:50Suggestions,contact,support and error reporting on Gitee or Github
      Top
      +}'
      Generated by smart-doc at 2023-07-30 18:54:59Suggestions,contact,support and error reporting on Gitee or Github
      Top
      \ No newline at end of file diff --git a/chinaport-data-signature-app/src/test/java/cn/alphahub/eport/signature/report/export/Upload303XmlTests.java b/chinaport-data-signature-app/src/test/java/cn/alphahub/eport/signature/report/export/Upload303XmlTests.java index ae00304..7c187ab 100644 --- a/chinaport-data-signature-app/src/test/java/cn/alphahub/eport/signature/report/export/Upload303XmlTests.java +++ b/chinaport-data-signature-app/src/test/java/cn/alphahub/eport/signature/report/export/Upload303XmlTests.java @@ -77,7 +77,7 @@ class Upload303XmlTests { put("data", data); }})) .execute(); - System.err.println(JacksonUtil.toPrettyJson(response.body())); + System.err.println(response.body()); Result result = JacksonUtil.readValue(response.body(), new TypeReference>() { }); System.err.println("\n" + result.getData().getSignatureNode()); diff --git a/chinaport-data-signature-data-model/README.md b/chinaport-data-signature-data-model/README.md index 8d585fb..b446927 100644 --- a/chinaport-data-signature-data-model/README.md +++ b/chinaport-data-signature-data-model/README.md @@ -8,7 +8,11 @@ ### 1.1 海关 179 数据抓取报文 -### 1.2 海关总署`xml`报文, 进口单:CEB311Message, CEB621Message +### 1.2 海关总署`xml`报文 + +进口单:CEB311Message, CEB621Message, + +出口单: CEB303Message diff --git a/中国电子口岸报文加签接口文档.md b/中国电子口岸报文加签接口文档.md index 7538f6c..68358af 100644 --- a/中国电子口岸报文加签接口文档.md +++ b/中国电子口岸报文加签接口文档.md @@ -48,19 +48,19 @@ curl -X GET -H 'x-auth-token-eport-sign:DefaultAuthToken' -i http://localhost:80 |└─signatureNode|string|XML报文的签名节点
    • 用来组装 ds:SignedInfo 节点
    • |-| **Response-example:** -```json +``` { "message": "操作成功", "success": true, - "timestamp": "2023-07-28 21:39:15", + "timestamp": "2023-07-30 18:49:15", "code": 200, "data": { "success": true, "certNo": "03000000000cde6f", "x509Certificate": "MIIEoDCCBESgAwIBAgIIAwAAAAAM3m8wDAYIKoEcz1UBg3UFADCBmDELMAkGA1UEBhMCQ04xDzANBgNVBAgMBuWMl+S6rDEPMA0GA1UEBwwG5YyX5LqsMRswGQYDVQQKDBLkuK3lm73nlLXlrZDlj6PlsrgxGzAZBgNVBAsMEuivgeS5pueuoeeQhuS4reW/gzEtMCsGA1UEAwwk5Lit5Zu955S15a2Q5Lia5Yqh6K+B5Lmm566h55CG5Lit5b+DMB4XDTIzMDMyOTAwMDAwMFoXDTMzMDMyOTAwMDAwMFowVjELMAkGA1UEBhMCQ04xMzAxBgNVBAsMKua1t+WNl+ecgeiNo+iqiei/m+WHuuWPo+i0uOaYk+aciemZkOWFrOWPuDESMBAGA1UEAwwJ5p2o5aaC6YeRMFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAE0vOQmplAr9igPZrA8F1msqnFd0U++6G6NhG5rNuIUWft0BwQn7eSJkt5/fvSSoe7pUg2/awHUWPnzkeeQc7oVqOCArUwggKxMBEGCWCGSAGG+EIBAQQEAwIFoDAOBgNVHQ8BAf8EBAMCBsAwCQYDVR0TBAIwADApBgNVHSUEIjAgBggrBgEFBQcDAgYIKwYBBQUHAwQGCisGAQQBgjcUAgIwHwYDVR0jBBgwFoAURCQxt0wEvoAVXmuo4N1bjKXTh0UwHQYDVR0OBBYEFAytGob5L0WqhOCZ5l6Lf2jUdNrAMGgGA1UdIARhMF8wXQYEVR0gADBVMFMGCCsGAQUFBwIBFkdodHRwczovL3d3dy5jaGluYXBvcnQuZ292LmNuL3RjbXNmaWxlL3UvY21zL3d3dy8yMDIyMDQvMTIxMzI5NDh4dDZwLnBkZjB/BgNVHR8EeDB2MHSgcqBwhm5sZGFwOi8vbGRhcC5jaGluYXBvcnQuZ292LmNuOjM4OS9jbj1jcmwwMzAwMDAsb3U9Y3JsMDAsb3U9Y3JsLGM9Y24/Y2VydGlmaWNhdGVSZXZvY2F0aW9uTGlzdD9iYXNlP2NuPWNybDAzMDAwMDA+BggrBgEFBQcBAQQyMDAwLgYIKwYBBQUHMAGGImh0dHA6Ly9vY3NwLmNoaW5hcG9ydC5nb3YuY246ODgwMC8wOgYKKwYBBAGpQ2QFAQQsDCrmtbfljZfnnIHojaPoqonov5vlh7rlj6PotLjmmJPmnInpmZDlhazlj7gwEgYKKwYBBAGpQ2QFAwQEDAIwMTAiBgorBgEEAalDZAUIBBQMEjUxMjMyNDE5NjQxMDE3Mjk3WDAgBgorBgEEAalDZAUJBBIMEDAzLUpKMEc5MDAyMjA3NTIwGQYKKwYBBAGpQ2QFCwQLDAlNQTVUTkZHWTkwEgYKKwYBBAGpQ2QFDAQEDAIwMDASBgorBgEEAalDZAIBBAQMAjEyMBIGCisGAQQBqUNkAgQEBAwCMTQwDAYIKoEcz1UBg3UFAANIADBFAiBM4OVAc8aaCZU4XFfcVMkC7bWIIenRnPLxrnwVeYO3CQIhANQ767YIurkJCoLtwyqQPbUZe/+3BjGZcIWqB1mAl9T+", - "digestValue": "EW5//PlrSsuQ8pw+hRRtSsSDaN4=", - "signatureValue": "MeEiFDT6H6Sn/foR5zxKrl3g/i+fsCe2humDK6LA2E9ORvFxijpAILxXLezvUBIyqXmydu4BjFwAQk62+V1QtQ==", - "signatureNode": "EW5//PlrSsuQ8pw+hRRtSsSDaN4=" + "digestValue": "/uy5whbEnIhnrSkF7hSAJNm8ISI=", + "signatureValue": "uEG8qUT4NMS7g+QVJK6WdVQXlSK5n94PQJ+iGWec2cCyXfKh6Il2U+jmEq6nxWpoxCn3M0zNH7bICaoKrMpc6w==", + "signatureNode": "\n\n \n \n \n \n \n \n \n /uy5whbEnIhnrSkF7hSAJNm8ISI=\n \n" } } ``` @@ -104,7 +104,7 @@ curl -X GET -H 'x-auth-token-eport-sign:DefaultAuthToken' -i http://localhost:80 |└─signatureNode|string|XML报文的签名节点
    • 用来组装 ds:SignedInfo 节点
    • |-| **Response-example:** -```json +``` { "message": "操作成功", "success": true, @@ -163,6 +163,7 @@ Return void. **Content-Type:** application/x-www-form-urlencoded;charset=UTF-8 **Description:** +
        支持command类型
      • RESTART: 重启控件(较多使用)
      • @@ -223,6 +224,7 @@ curl -X POST -H 'x-auth-token-eport-sign:DefaultAuthToken' -i http://localhost:8 **Content-Type:** application/json **Description:** +
          支持JSON报文和XML报文
        • JSON报文: 无需组装XML结构报文
        • @@ -240,7 +242,7 @@ curl -X POST -H 'x-auth-token-eport-sign:DefaultAuthToken' -i http://localhost:8 | Parameter | Type | Required | Description | Since | |-----------|------|----------|-------------|-------| -|messageType|enum|true|消息类型
          [Enum values:
          CEB311Message("CEB311Message")
          CEB621Message("CEB621Message")
          ]|-| +|messageType|enum|true|消息类型
          [Enum values:
          CEB311Message("CEB311Message")
          CEB621Message("CEB621Message")
          CEB303Message("CEB303Message")
          ]|-| |dataType|enum|true|报文的数据类型
          [Enum values:
          JSON()
          XML()
          ]|-| |cebMessage|object|true|进口单、出口单的底层数据模型

            以CEB311Message数据类型为例

          • JSON示例



            {"order":{"orderHead":{"guid":"AFNC7T-WEASLEY-20230713095517-N04JEE","appType":"1","appTime":"20230704181028","appStatus":"2","orderType":"I","orderNo":"T_C5051511332138160010","ebpCode":"4601630004","ebpName":"海南省荣誉进出口贸易有限公司","ebcCode":"4601630004","ebcName":"海南省荣誉进出口贸易有限公司","goodsValue":"0.01","freight":"0","discount":"0","taxTotal":"0","acturalPaid":"0.01","currency":"142","buyerRegNo":"4","buyerName":"袁晓雨","buyerTelephone":"13701727375","buyerIdType":"1","buyerIdNumber":"130435200009241538","consignee":"袁晓雨","consigneeTelephone":"13701727375","consigneeAddress":"北京北京市东城区","note":"test"},"orderList":[{"gnum":1,"itemNo":"1","itemName":"LANNA兰纳","gmodel":"10片/包","itemDescribe":"","barCode":"1","unit":"011","qty":"1","price":"1","totalPrice":"1","currency":"142","country":"136","note":"test"}]},"guid":"AFNC7T-WEASLEY-20230713095517-N04JEE","version":"1.0","baseTransfer":{"copCode":"4601630004","copName":"海南省荣誉进出口贸易有限公司","dxpMode":"DXP","dxpId":"DXPENT0000530815","note":"test"}}



          • XML示例: 不带ds:Signature节点的CEBXxxMessage.xml原文;待加签xml报文样例



          |-| @@ -316,8 +318,10 @@ curl -X POST -H 'Content-Type: application/json' -H 'x-auth-token-eport-sign:Def **Content-Type:** application/json **Description:** +
            JSON示例: +
             {
               "sessionID": "032C3F56-0EE6-4558-B548-6C7A3451F07D",
            @@ -564,4 +568,3 @@ curl -X POST -H 'Content-Type: application/json' -H 'x-auth-token-eport-sign:Def
             }
             ```
             
            -