APOS开放平台1210统一对接方案- v1.4

深圳芥舟科技有限公司

2022-06-17

版本所有 侵权必究

修改历史

版本日期修订人员修正信息
1.02022-06-17Hamsingli创建初版接口文档
1.12022-07-20Hamsingli完善发货接口
1.22022-07-25Hamsingli完善库存查询接口
1.32022-08-01Hamsingli完善订单接口字段信息
1.42022-08-30Hamsingli字段信息调整

一、项目背景

  • 本项目是芥舟科技整合其在跨境电商多年系统集成资源,提供的保税业务综合解决方案;主要功能为对接第三方现有商城系统,获取跨境订单,推单到APSO系统,然后完成订单整个后续履约,清关,发货功能等,具体说明如下系统方案:

1.1 方案

  • 如上系统流程图业务参与方包含第三方商城,芥舟APOS开放平台,芥舟清关平台,芥舟合作的保税仓储企业及海关单一窗口。

  • 订单下单前先完成注册备案,由第三方完成电商企业备案,获取海关ukey及配置信息后交给芥舟,搭建179反查功能,跨境商品信息入保税仓进行备案操作,入库后完成海关核注,获取商品账册及料号,然后在电商平台完成商品上架开始销售。

  • 订单产生后由第三方商城下单按照仓库分单,支付单拆单,订单支付完成后,推给APOS开放平台,由芥舟申报系统完成订单上报,然后将订单物流和商品信息推送保税仓,保税仓匹配商品料号并完成物流下单申报后将结果反馈清关平台,清关平台依次生成订单和清单,并向海关系统完成申报。海关单窗根据清单信息核验三单对碰,信息正确后返回放行回执到清关平台,清关平台触发保税仓发货并将发货状态同步回传给新景界跨境商城。

  • 另外增加两个日常系统操作的接口,售后接口用来处理客户退货的情况,由跨境商城发起,清关平台判定订单状态,未完成清单申报的订单支持订单取消,已完成的则需要线下进行售后操作。库存同步接口同步保税仓库存给到电商平台系统,应对库存变化,防止超卖。

二、系统调用、部署关系图

三、芥舟开放平台接口调用

3.1 约定

  • APOS开放平台通过Https协议(支持TLS1.2版本)对外提供Web Api接口。

    API请求头信息:

    Accept: application/json

    Content-Type: application/json;charset=UTF-8

  • 所有请求内容需要包含参数appId(应用Id)version(1.0)time(UTC毫秒时间戳)sign(签名信息)signType(支持MD5)

3.2 环境信息、账号秘钥获取

  • 环境信息:

    测试环境: https://gwfat.kldidi.com,后文统一定义为变量TEST_PATH

    生产环境地址: https://gateway-cn.jieztech.com,后文统一定义为变量PRO_PATH

  • 账号密钥获取

    测试环境: 选择MD5加密方式时联系芥舟开发同事提供appIdappSecret给到外部系统。

    生产环境: 密钥生成及验证和测试环境一致、联系芥舟开发同事提供生产的相关授权资料。

3.3 签名、验签

  • 筛选

    获取所有请求参数,sign、signType参数不参与签名,需要剔除sign、signType参数。需要注意为空的参数不参与签名,空字符串需要参与签名。

  • 排序

    将筛选后的参数按照位置加字母升序排序(ASCII码递增排序),先按第一个字符键值排序,遇到相同字母按第二个字符键值排序,以此类推。对于多层级参数的情况,每个层级的参数根据各层级参数名的ASCII码从小到大排序。

  • 拼接

    将排序后的参数与其对应值,组合成“参数=参数值”的格式,并且把这些参数用&字符连接起来,此时生成的字符串为待签名字符串。

  • 存在数组的情况

    如果参数中存在子json是数组的情况,直接使用数组原始key[数组下标]=值方式组合,参考示例3,

    如果参数中存在子json是数组的情况,且数组是KEY:VALUE方式,则对key进行ASCII码从小到大排序,然后使用数组原始key[下标]_子key方式组合,如:{id:1,param1:{key1:val1},param2:{data:[{name:zs,sex=boy},{name:ls,sex=girl}]}},组合后的字符串为: id=1&param1_key1=val1&data[0]_name=zs&data[0]_sex=boy&data[1]_name=ls&data[1]_sex=girl。参考示例4

  • 示例1: 请求参数

appId=802020070300001&orderNo=102020070300001&time=1593767721515&version=1.0

拼接后参数

appId=802020070300001&orderNo=102020070300001&time=1593767721515&version=1.0
  • 示例2: 请求参数
{
    "appId": "802020070300001",
    "orderNo": "102020070300001",
    "time": "1593767721515",
    "version": "1.0",
    "signType": "MD5"
}

拼接后参数

appId=802020070300001&orderNo=102020070300001&time=1593767721515&version=1.0
  • 示例3: 请求参数
{
    "appId": "802020070300001",
    "orderNo": "102020070300001",
    "time": "1593767721515",
    "orderNoList":["819000803560518","819000803560519"],
    "version": "1.0",
    "signType": "MD5"
}

拼接后参数

appId=802021042000001&orderNoList[0]=819000803560518&orderNoList[1]=819000803560519&time=1631241232765&version=1.0
  • 示例4: 请求参数
{
    "appId":"3512618851001196672",
    "version":"1.0",
    "sessionKey":"string",
    "goodsList":[
        {
            "sku":"4548366593300",
            "barcode":"4548366593300",
            "goodsName":"SABRINA连裤袜黑色80厚度2双装JM-L",
            "qty":"40"
        }
    ]
}

拼接后参数

appId=3512618851001196672&goodsList[0]_barcode=4548366593300&goodsList[0]_goodsName=SABRINA连裤袜黑色80厚度2双装JM-L&goodsList[0]_qty=40&goodsList[0]_sku=4548366593300&sessionKey=string&version=1.0d7de99ccbd3fbaab38261f7a067c0e49

注意:

拼接签名之前的参数时需使用参数的原始值状态,不能基于原始值进行其他编码转换,否则会造成签名验证失败,无需剔除NULL等空字符串。

  • signType = MD5:

签名需要将appSecret的值拼接在字符串后面,调用MD5算法生成sign;

appId: 802020070300001
appSecret: e338aeb855c94faca1c51a822740058e

请求参数

appId=802020070300001&orderNo=102020070300001&time=1593767721515&version=1.0&signType=MD5

拼接后签名前参数

appId=802020070300001&orderNo=102020070300001&time=1593767721515&version=1.0e338aeb855c94faca1c51a822740058e

请求信息

appId=802020070300001&orderNo=102020070300001&time=1593767721515&version=1.0&signType=MD5&sign=24f22a638358e27b2a4ae729eec33081

四、统一信息

4.1 公共请求参数

参数类型说明
appIdString商户级别,应用Id由芥舟提供
versionString接口版本: 默认传1.0
timeStringUTC毫秒时间戳
signTypeString

加密方式

MD5

signString签名信息

4.2 应答信息

4.2.1 统一应答参数

参数类型说明
successBool成功: true, 失败: false
codeString应答编码(具体参考:应答信息->应答编码)
messageString应答描叙信息
data泛型各接口有具体应答参数说明
  • 示例:
{
    "success": true,
    "code": "200",
    "message": "请求成功",
    "data": null
}

4.2.2 统一分页数据应答 data参数

参数类型说明
dataSourceList<泛型>每页数据
pageIndexInteger当前页码
pagesSizeInteger每页记录条数
pagesCountInteger总页数
recordsCountInteger总记录条数

4.2.3 应答编码

编码描述
200成功
110004appId不存在
110005签名错误

五、订单模块

5.1 创建渠道订单

  • 请求说明
请求项说明信息
正式请求路径{PRO_PATH}/apos.aps/api/DropShipping/CreateChannelOrder
测试请求方式{TEST_PATH}/apos.aps/api/DropShipping/CreateChannelOrder
请求方式POST
描述信息创建渠道订单
  • 业务请求参数说明

| 请求位置 | Body| || || |----|----|---|---|----|---|--| | 参数| 说明| 类型 | 默认值 | 说明| 是否必填 | | sessionKey | APOS平台分发,与外部仓库1对1绑定 | String | 64 | 仓库唯一,一仓一码 | | | orderNo | 订单编号 | String | 64 | 商户唯一,订单号不能带横杠(-)字符 | | | orderTime | 下单时间 | Long | | 时间戳(毫秒) | | | orderPaidTime | 订单支付时间 | Long | | 时间戳(毫秒) | | | orderAmount | 订单金额 | String | 32 | 保留2位小数 | | | orderTax | 订单税额 | String | 32 | 保留2位小数 | | | discountAmount | 订单总优惠 | String | | 保留2位小数 | | | actualPayAmount | 实际支付金额 | String | | 保留2位小数| | | goodsAmount | 货品总价值 | String | | 保留2位小数| | | payNo| 支付单流水号 | String | | 支付单流水号| | | payType| 支付类型,支付宝或微信 | String | | WeChat、AliPay | | | payCompany | 支付公司名称 | String | |第三方支付公司名称| | | payCompanyNo | 支付公司十位海关编码 | String | |支付公司海关备案编码 | | | ebcCode | 电商企业代码 | String | | 电商企业代码 | | | ebcName | 电商企业名称 | String | | 电商企业名称 | | | ebpCode | 电商平台代码 | String | | 电商平台代码 | | | ebpName | 电商平台名称 | String | | 电商平台名称 | | | buyerId | 支付人购物平台ID | String | | 支付人购物平台ID |否| | buyerIdNumber | 支付人身份证号 | String | | 支付人身份证号 | | | buyerName | 支付人姓名 | String | | 支付人姓名 | | | buyerMobile | 支付人手机号 | String | | 支付人手机号 | | | postAmount | 运费 | String | | 运费,保留小数点2位 | | | receiverIdNumber | 收件人身份证号 | String | | 收件人身份证号 | | | receiverName | 收件人姓名 | String | | 收件人姓名 | | | receiverMobile | 收件人手机号 |String | | 收件人手机号 | | | receiverCountry | 收件人国家 | String | 中国 | 收件人国家 | 否| | receiverProvince | 收件人省 | String | | 收件人省 | | | receiverCity | 收件人市 | String | | 收件人市 | | | receiverDistrict | 收件人区 | String | | 收件人区 | | | receiverAddress | 收件人详细地址 | String | | 收件人详细地址 | | | receiverZip | 收件人邮编 | String | 255 | 收件人邮编 |否| | note | 订单备注 | String | | 订单备注 |否| | goodsList | 订单商品信息明细 | List<Object> |||| | └sku | 商品SKU | String | | 商品SKU || | └barCode | 商品条码 | String | | 商品条码 || | └goodsName | 商品名称 | String | | 商品名称 || | └qty | 数量 | String | | 数量 || | └salePrice | 商品原价 | String |32| 保留2位小数 || | └dealPrice | 商品实际售价 | String |32| 保留2位小数 || | └tax | 商品税费 | String |32| 保留4位小数 ||

  • data应答参数说明

通用返回,请参考3.2.1 统一应答参数

  • 参数示例

请求信息:

{
    "sessionKey":"df0023046ce5c9cfda7cc032d7403423",
    "orderNo": "8477690416163369109-1",
    "orderTime": 1658891396562,
    "orderPaidTime": 1658891396562,
    "orderAmount": "0.04",
    "orderTax": "0.00",
    "discountAmount": "0.00",
    "actualPayAmount": "0.04",
    "goodsAmount": "0.02",
    "payNo": "2022071111082305421697480",
    "payType": "AliPay",
    "payCompany": "支付宝(中国)网络技术有限公司",
    "payCompanyNo": "31222699S7",
    "ebcCode": "dt001",
    "ebcName": "代塔测试有限公司",
    "ebpCode": "dt001",
    "ebpName": "代塔测试有限公司",
    "buyerId": "334652293381621632",
    "buyerIdNumber": "362204199703057419",
    "buyerName": "汪坤",
    "buyerMobile": "13767167888",
    "postAmount": "0.02",
    "receiverIdNumber": "362204199703057419",
    "receiverName": "汪坤",
    "receiverMobile": "13767167888",
    "receiverCountry": "中国",
    "receiverProvince": "广东省",
    "receiverCity": "深圳市",
    "receiverDistrict": "宝安区",
    "receiverAddress": "宝安1村",
    "receiverZip": "330800",
    "goodsList": [
        {
            "sku": "6972997190290",
            "barCode": "6972997190290",
            "goodsName": "荣耀手机9",
            "qty": "2",
            "salePrice": "0.01",
            "dealPrice": "0.01",
            "tax": "0.0009"
        }
    ],
    "note": null,
    "shopName": "测试APOS",
    "shopId": ""
}

响应:

{
    "success": true,
    "code": "200",
    "message": "请求成功",
    "data": null
}

5.2 清关状态回传(订阅推送接口)

  • 请求说明
请求项说明信息
正式请求路径
测试请求方式
请求方式POST
描述信息清关状态回传,提供接口地址,apos后台配置订阅
  • 业务请求参数说明
请求位置Body
参数类型是否必填默认值说明
orderNoString订单编号
returnStatusString清关返回状态:申报中=450,申报成功=800,申报失败=9999
returnInfoString清关返回信息
declareTimeLong时间戳(毫秒)
expressNoString清关状态返回800,必填物流单号
expressCodeString清关状态返回800,必填物流编号
expressNameString清关状态返回800,必填物流公司名称
  • data应答参数说明

通用返回,请参考3.2.1 统一应答参数

  • 参数示例

请求信息:

{
    "orderNo":"854123658954412",
    "declareTime":"1637737175000",
    "expressNo":"SF885412569",
    "expressCode":"shunfeng",
    "expressName":"顺丰国际",
    "returnStatus":"800",
    "returnInfo":"清关成功"
}

响应:

{
    "success": true,
    "code": "200",
    "message": "请求成功",
    "data": null
}

5.3 物流发货接口(订阅推送接口)

  • 请求说明
请求项说明信息
正式请求路径
测试请求方式
请求方式POST
描述信息物流发货,提供接口地址,apos后台配置订阅
  • 业务请求参数说明
请求位置Body
参数类型是否必填默认值说明
orderNoString订单编号
sendTimeLong发货时间(时间戳毫,秒)
expressNoString物流单号
expressCodeString物流编号
expressNameString物流公司名称
  • data应答参数说明

通用返回,请参考3.2.1 统一应答参数

  • 参数示例

请求信息:

{
    "orderNo":"854123658954412",
    "declareTime":"1637737175000",
    "expressNo":"SF885412569",
    "expressCode":"shunfeng",
    "expressName":"顺丰国际",
    "returnStatus":"800",
    "returnInfo":"清关成功"
}

响应:

{
    "success": true,
    "code": "200",
    "message": "请求成功",
    "data": null  
}

5.4 订单售后

  • 请求说明
请求项说明信息
正式请求路径{PRO_PATH}/apos.aps/api/OrderPub/CancelChannelOrder
测试请求方式{TEST_PATH}/apos.aps/api/OrderPub/CancelChannelOrder
请求方式POST
描述信息订单售后
  • 业务请求参数说明
请求位置Body
参数类型是否必填默认值说明
sessionKeyStringSessionKey
orderNoString订单编号
  • data应答参数说明

通用返回,请参考3.2.1 统一应答参数

  • 参数示例

请求信息:

{
    "sessionKey":"df0023046ce5c9cfda7cc032d7403423",
    "orderNo":"854123658954412"
}

响应:

{
    "success": true,
    "code": "200",
    "message": "请求成功",
    "data": null
}

六、库存模块

6.1 库存查询

  • 请求说明
请求项说明信息
正式请求路径{PRO_PATH}/apos.aps/api/DropShipping/QueryChannelStock
测试请求方式{TEST_PATH}/apos.aps/api/DropShipping/QueryChannelStock
请求方式POST
描述信息查询库存信息
  • 业务请求参数说明
请求位置Body
参数类型是否必填默认值说明
sessionKeyStringAPOS平台分发,与外部仓库1对1绑定
pageSizeInteger15每页记录条数,最大值200
pageIndexInteger1页码,超始值为1
  • data应答参数说明

通用返回,请参考 4.2.2 统一分页数据应答 data参数

参数描述类型是否必填说明
sku货号String商户唯一
barcode条码String
goodsName商品名称String
qty库存数量String
cost成本价String
batch批次号String
  • 参数示例

请求信息:

{
    "pageIndex":"1",
    "pageSize":"15",
    "sessionKey":"hd77d0038a0e684e2b1ba6ba3127agsa",
}

响应:

{
    "data":{
        "dataSource":[
            {
                 "sku":"8856558",
                 "barcode":"5555555",
                 "goodsName":"测试品",
                 "cost":15,
                 "qty":"2.00"
            }
        ],
        "pageIndex":1,
        "pagesCount":1,
        "pageSize":15,
        "recordsCount":1
    },
    "success":true,
    "message":"操作成功",
    "code":"200"
}

七.通用信息

7.1 物流code编码

物流Code描述
shunfeng顺丰
youhzeng邮政
yundakuaiyun韵达
yuantong圆通
zhongtongkuaiyun中通快运
zhongtongguoji中通国际
zhongtong中通快递
yuantongguoji圆通国际