元数标准接口
    元数标准接口
    • 签名说明
    • 订单
      • 订单信息同步接口
        POST
      • 订单取消同步接口
        POST
      • 订单发货同步接口-单包裹
        POST
      • 订单发货同步接口-多包裹
        POST
      • 修改收货地址同步接口
        POST
    • 售后
      • 售后信息同步接口
        POST
      • 退单支付回调(非全款支付)
        POST
      • 售后入库接口【入参结构调整】
        POST
    • 库存
      • erp库存同步
        POST
    • 单据追踪系统-BTS
      • 东北虎说明
      • 查询订单物流流水信息
        GET
      • 查询订单综合流水信息(含包裹商品信息)
        GET
      • 流水上报接口
        GET
      • 追加包裹单
        GET
      • 物流单变更
        GET
      • 物流单变更V2
        GET

    签名说明

    通用cookie要求:#

    字段名称字段类型是否必填字段说明
    _platform_num租户号Long是租户号

    请求签名#

    需要使用自身的私钥对API URL、消息体等关键数据的组合进行SHA-256 with RSA签名。请求的签名信息通过HTTP头Authorization 传递,没有携带签名或者签名验证不通过的请求,并返回401非法访问,无权限!

    构造验签名串#

    1.
    构造签名串,签名串一共有五行,每一行为一个参数。行尾以 \n(换行符,ASCII编码值为0x0A)结束,包括最后一行。如果参数本身以\n结束,也需要附加一个\n。
    HTTP请求方法\n
    URL\n
    请求随机串\n
    请求时间戳\n
    请求报文主体\n
    2.
    使用私钥对待签名串进行sha256计算签名,并且对计算出来的结果进行base64编码。
    3.
    验证签名可以使用Signs.validWithSha256方法

    设置HTTP头#

    1.
    要求请求通过HTTP Authorization头来传递签名。 Authorization由认证类型和签名信息两个部分组成。
    Authorization: 认证类型 签名信息
    具体组成为:
    1.1 认证类型,目前为META-SHA256-RSA2048
    1.2 签名信息
    请求随机串nonce_str
    时间戳timestamp
    签名值signature
    注:以上4项签名信息,顺序要求不能变。
    2.
    Authorization 头的示例如下:(注意,示例因为排版可能存在换行,实际数据应在一行)
    Authorization: META-SHA256-RSA2048 nonce_str="373BEC0C930BF1AFGH40B4A08C8FB378",timestamp="1554208460",signature="uOVRnA4qG/MNnYzdQxJanN+zU+lTgIcnU9BxGw5dKjK+VdEUz2FeIoC+D5sB/LN+nGzX3hfZg6r5wT1pl2ZobmIc6p0ldN7J6yDgUzbX8Uk3sD4a4eZVPTBvqNDoUqcYMlZ9uuDdCvNv4TM3c1WzsXUrExwVkI1XO5jCNbgDJ25nkT/c1gIFvqoogl7MdSFGc4W4xZsqCItnqbypR3RuGIlR9h9vlRsy7zJR9PBI83X8alLDIfR1ukt1P7tMnmogZ0cuDY8cZsd8ZlCgLadmvej58SLsIkVxFJ8XyUgx9FmutKSYTmYtWBZ0+tNvfGmbXU7cob8H/4nLBiCwIUFluw=="

    java 生成签工具类#

    Signs工具类
    Signs demo, 基于okhttp
    package cn.demo;
    
    import okhttp3.*;
    
    import java.io.IOException;
    import java.time.Duration;
    import java.util.Objects;
    
    /**
     * @author nick.sun
     * @date 2023/10/19
     */
    public class Demo {
    
        public static void main(String[] args) throws IOException {
            String url = "http://127.0.0.1:8080/retail-data-exchange/notify/order/delivery";
            MultipartBody.Builder builder = new MultipartBody.Builder();
            String jsonStr = "{\"orderNo\":\"string1\",\"uid\":\"string1\",\"expressNo\":\"string1\",\"deliveryCompanyCode\":\"string1\",\"deliveryCompanyName\":\"string1\"}";
            RequestBody body = RequestBody.create(jsonStr, MediaType.get("application/json; charset=utf-8"));
            Request request = new Request.Builder()
                    .header("Authorization", Signs.getAuthorization("MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCqpYIlJVnhHmeQ9Po/DJCVzVdrDXQAyt9QPgkE59StCTM9Ir61N/tftsRGQax5daAUdeWVP0iHbWdpFQkoXLHExJNAv0Y14b4JWlmfaYwpW2KsLJLtqGfvUnKMtvycprq3EE9rPAHEtlkvS30UV8pN6IWOJcs9wEpGTFhVkmvAxUgQldm59vCkaYC3HDo5UZRiFm4/P7JPwyHY4RAwfTDSF7tulUttROn5Y4oSzxyGTGiGyyy/4xCyrlX3CE81CkvIH7DfKMiGYZYX/wuyMl9hsNBCr+lQKcWud4zv83VrfCAVBYKsRqK/SHWEtNHCOaNJjbFl2W5HFF79duH+3VW5AgMBAAECggEBAJtlXL625MI8DdPTQo9nwcKo25KBDcIq/HD2DQCKnQF1/1MM8N3VvPPMW7Ae3hE9LCl1szvWBRZOan0mytAWmUu2NuIfTLCEganCvRqN4zVGIvTnImWJlhw52FaLzD5bFmzeTXQ5kOKxq0WGWMDNsUyBEh4ADLSPBxQ9MbO7QqSnhbqzkMlbccNKHpfMxWwyKmB4wXXOlXOla4+o0RIBTe/cYQWPx3aXtZGT8y/tFoaHCrfdYxAMGsC7Vo9vO5V1SKTGcfF0DweCfprFY3v1Ez6mPWBd5X+6/sOgQG1YoXaHqfzMuv00mXnnTiaS4/a8Fmv0rHhsJ+Adi2HcwYrTwAECgYEA19sNfSEeQLyLnwOTJG4iUan83XTN58xWxoAZ6r91+8XNDJgirgtoMgXZGeZQlwkNk88x6gX0s7oKPXgRRV5xnN0Um2BPXzPgKWQf6Zxa+RkCQkjAwUmID/rh7aWrG/Jz1BjnJABsDHyEBaSXO6sD0RPbcE93H48Ejbz5/FjcdUECgYEAymIJEUBlIW3+IYWAuU6VbTEEax4bikN6xeleRbiaFNqx1YnIE0QUQkZog1/UjyakMjMaT9idDkNbG5tapVcBJoB16pDxSySVcGunIucz/Q3SrCV3tdTNXduIbWeMyAsuUS6I7EleII/oOo6TUJfT5PsJUCFlmcAjH1vEzz3dankCgYB0dBSh5mUo7c+xuT8AD37qafgnDeYsYTyLmP7ie+rOK1fFrKpBFZxgKHGJHI1r/pFZphW6uP3cnMj7grRmpV5MD6YXcW1A4n7UNdVVtmoKK6jhU9jSLrZ+UI7lJFTdHf/JdKn27VddoSuk07hXk5raiIkB3Y1Z9FGzmjmQH+zIQQKBgDYwgdUItQt6dC1tncYAcKpIEbLM4ProjpsnnYJ1p2wmEq/msJfYBsSoLZvfsP6TjiuS21y912/WQTLnKiJTZY91nh0sqi9AoHL1oE8MMTN03BAUCDW7wTF8cs84hs2ZkNFT8H20N2vonHnxayiNPsN1JE08ZAQDGmRvIgeLvRmhAoGAcP13KQZLxT34WJP9I080Glr7JwzDW49iwaBe5sdwoX4S3HnfZo2t1rpNErC9AynYfLa4SLzyo95TZc5qLN2Kgb64sXWPOXmSSoHguGLLvGApzyO7e+oOztssWeQmGtsJHEKFOV2x6iqE2O90RlYjnCjp4FdBOZGsmW/f8aCynRM=", "POST", "/retail-data-exchange/notify/order/delivery", jsonStr))
                    .header("cookie", "_platform_num=153658")
                    .url(url)
                    .post(body)
                    .build();
            OkHttpClient client = new OkHttpClient.Builder()
                    .readTimeout(Duration.ofMinutes(1L))
                    .connectTimeout(Duration.ofMinutes(1L))
                    .writeTimeout(Duration.ofMinutes(1L))
                    .callTimeout(Duration.ofMinutes(1L))
                    .build();
            try (Response response = client.newCall(request).execute()) {
                if (response.isSuccessful()) {
                    ResponseBody responseBody = response.body();
                    if (Objects.nonNull(responseBody)) {
                        System.out.println(new String(responseBody.bytes()));
                    }
                }
            }
        }
    }
    

    错误码#

    异常码异常信息
    401非法访问,无权限!
    402非法访问,缺少sign字段!
    403Http头Authorization中缺少必填信息!
    403Http头Authorization中的timestamp与发起请求的时间不得超过5分钟!
    下一页
    订单信息同步接口
    Built with