# 鉴权

ShipOut API鉴权分为 开发者鉴权 和 用户鉴权 两部分

请求ShipOut-Openapi时,需要在http请求的header部分,加入【如何获得API Key】中 第一和第二步,生成的鉴权信息,详见下图请求事例

图中appKey:是获取API Key中生成的开发者鉴权信息中的appKey。

图中Authorization: 是获取API Key中生成的商家鉴权信息。

图中version:版本,当前为1.0.0。

图中sign 和 timestamp:是获取API Key中生成的开发者鉴权信息中的securetKey,经过ShipOut提供的签名工具类生成(https://cdn.ezeeshipcn.cn/OpenAPI/openapi-sdk-1.0.0-RELEASE.jar)。

如果技术栈不支持使用jar包(如使用.Net技术等)可以参照如下步骤生成签名

以下步骤中的path为需要访问的接口路径,比如/http/order/findById

第一步:首先构造一个 Map 。

    Map<String, String> map = Maps.newHashMapWithExpectedSize(3);
    String timeStampStr = String.valueOf(SystemClock.now());
    System.out.println("time:"+timeStampStr);
    map.put("timestamp", timeStampStr);  //值应该为毫秒数的字符串形式
    map.put("path", "/http/order/findById");
    map.put("version", "1.0.0");

得到time值为:1639795057257


第二步:进行 Key 的自然排序,然后 Key,Value值拼接最后再拼接分配给你的 SK。

    String SK = "FC300595425B48C39FA3F56F3787D9CA"; //示例SK
    List<String> storedKeys = Arrays.stream(map.keySet()
      .toArray(new String[]{}))
      .sorted(Comparator.naturalOrder())
      .collect(Collectors.toList());
    final String sign = storedKeys.stream()
      .map(key -> String.join("", key, map.get(key)))
      .collect(Collectors.joining()).trim()
      .concat(SK);
    System.out.println(sign);

得到的 sign 值应该为:path/http/order/findByIdtimestamp1639795057257version1.0.0FC300595425B48C39FA3F56F3787D9CA

第三步:进行 MD5 加密后转成大写。

    DigestUtils.md5DigestAsHex(sign.getBytes()).toUpperCase()

最后得到的值为:C9A285632306F49A2C9CBF7DCFE67231
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32

# Restful

GET Request Format


METHOD = GET (generally used to obtain, query existing records from a system)
an ENDPOINT (https://{host}/{endpoint}...)


POST / PATCH / PUT Request Format


METHOD = POST / PATCH / PUT (generally used to create new, or add to/update, existing records within a system)
an ENDPOINT (https://{host}/{endpoint}...)
Content-Type: "application/json"
POST Authorization Request has uses "application/x-www-form-urlencoded" for Content-Type
There are some other requests/endpoints that utilize other Content-Type values. Request-specific formats exist on example pages throughout this site.
RequestBody: ensure JSON for the request is placed here
For Specific Languages (e.g. Python): the body must be delivered as a JSON file, rather than a pure dictionary


DELETE Request Format


METHOD = DELETE (generally used to remove a record from a system)
an ENDPOINT (https://{host}/{endpoint}...)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

# API环境说明

ShipOut OpenAPI分为两套环境,正式环境与沙盒环境

开发联调期间建议使用沙盒环境,请先使用沙盒环境进行数据对接并调试成功以后再进行正式环境的数据对接,沙盒环境的账号创建流程如下:

发送邮件至donotreply@shipout.com进行申请。申请邮件需要提供您注册开发者时的邮箱。申请通过后您提供的邮箱中会收到一封邀请邮件,请点击邀请邮件中的激活链接进行环境的激活。
1

沙盒环境API访问前缀:https://opendev.shipout.com/api/

正式环境是客户处理真实订单的环境,需严格按照文档步骤对接

正式环境API访问前缀:https://open.shipout.com/api/