Skip to content

ERP API(Shop Response)文档汇总

1. 接口概述

ERP API(Shop Response)是 OMS 系统提供的接收方接口,用于接收第三方平台(如淘宝、天猫、京东等)推送的业务数据。本文档汇总了所有接收方接口的详细信息,包括订单、售后、换货、商品、发票、支付等业务接口。

接口方向:第三方平台 → OMS 系统(接收方)

与 OpenAPI 的区别:

  • OpenAPI:OMS 系统对外提供接口,供外部系统调用 OMS 功能(查询、操作等)
  • ERP API(Shop Response):第三方平台推送数据到 OMS,OMS 作为接收端处理数据

2. API 调用基础

2.1 请求方式

所有接口均支持 POST 方式请求。

2.2 请求URL

http(s)://[域名]/index.php/api

2.3 系统级参数

所有接口请求必须包含以下系统级参数:

参数名类型必选描述
flagstring接入标识,固定值:erpapi
app_idstring应用ID,如:ecos.ome
certi_idstring证书ID,系统证书编号
from_node_idstring来源节点ID,推送方节点ID
node_idstring目标节点ID,店铺节点ID(OMS节点)
node_typestring节点类型,如:ecos.ome
timestampint时间戳,10位时间戳(单位:秒)
methodstring接口方法名,格式:{app_id}.{resource}.{action},如:ome.order.add
signstring签名,用于验证请求合法性,详见签名算法章节
formatstring响应格式,可选值:json(默认)
vstringAPI版本号,如:1.0

3. 签名算法

3.1 签名生成步骤

  1. 收集所有请求参数(不包括 sign 本身)
  2. 按照参数名的 ASCII 码顺序进行排序(ksort
  3. 递归拼接参数名和参数值(对于嵌套数组,递归处理)
  4. 对拼接后的字符串进行 MD5 加密,再转大写
  5. 将上一步的结果与 token(接口密钥)拼接
  6. 再次进行 MD5 加密并转大写,得到最终签名

3.2 签名生成公式

sign = strtoupper(md5(strtoupper(md5(assemble($params))). $token))

3.3 签名算法要点

  • 参与签名的参数集合不包含 sign 本身
  • 参数按键名排序后按约定拼装
  • 首次 MD5 后转大写,与 token 拼接后再 MD5,最终再转大写
  • 保持编码一致(UTF-8)、去除多余空白
  • 对于布尔值,转换为 1 或 0
  • 对于嵌套数组,递归处理

3.4 签名算法代码示例(PHP)

php
/**
 * 生成签名算法函数
 *
 * @param $params
 * @param $token
 * @return string
 */
function gen_sign($params, $token)
{
    return strtoupper(md5(strtoupper(md5(assemble($params))). $token));
}

/**
 * 组装签名参数
 *
 * @param $params
 * @return string|null
 */
function assemble($params)
{
    if (!is_array($params)) {
        return null;
    }
    
    // ksort
    ksort($params);
    
    // sign
    $sign = '';
    foreach ($params as $key => $val)
    {
        if (is_null($val)) {
            continue;
        }
        
        if (is_bool($val)) {
            $val = ($val) ? 1 : 0;
        }
        
        $sign .= $key . (is_array($val) ? assemble($val) : $val);
    }
    
    return $sign;
}

/**
 * 系统参数
 *
 * @param $flag
 * @return array
 */
function system_params($flag)
{
    $params['flag'] = $flag;
    $params['type'] = 'json';
    $params['charset'] = 'utf-8';
    $params['ver'] = '1';
    $params['timestamp'] = time();
    
    return $params;
}

// erpapi标识
$flag = 'erpapi';

// token:config目录下certi.php中获取(没有则为空)
$token = 'your_interface_key';

//set params
$setParams = array(
    'app_id' => 'ecos.b2c', //ecos.ome
    'node_type' => 'ecos.ome',
    'callback_url' => '', //回调url
    'certi_id' => '20215858518', //证书ID
    'from_node_id' => '20218888', //节点ID
    'node_id' => '1311861837', //店铺节点node_id
);

// 系统级参数
$systemParams = system_params($flag);
$systemParams = array_merge($systemParams, $setParams);

// 请求参数
$requestParams = array();

// 组装请求参数
$params = array_merge($systemParams, $requestParams);

// 生成签名
$params['sign'] = gen_sign($params, $token);

4. 接口响应格式

4.1 响应格式说明

所有接口响应格式统一为 JSON,包含以下字段:

字段名类型必填说明
rspstring响应状态:succ(成功)或 fail(失败)
msgstring是/否响应消息(成功时包含操作描述,失败时包含错误信息)
dataobject响应数据(成功时可能包含订单号、售后单号等信息,失败时可能包含错误详情)

4.2 成功响应示例

json
{
    "rsp": "succ",
    "msg": "订单创建成功!订单ID:12345",
    "data": {
        "tid": "2526959714656153498"
    }
}

4.3 失败响应示例

json
{
    "rsp": "fail",
    "msg": "创建失败:格式化数据为空"
}

5. 系统级错误码

错误码描述可能原因
E_PARAM参数缺失或格式不正确必填参数缺失、参数类型错误
E_STATE业务状态不允许订单状态不允许当前操作、未发货订单不接收换货等
E_DUPLICATE重复提交/版本未变化订单已存在、版本号未变化等
E_AMOUNT金额校验不通过退款金额超过订单金额、金额不一致等
E_VERSION版本未变化/时间戳未更新售后版本号未变化、时间戳无效等
E_INTERNAL内部处理异常数据库错误、系统异常等
E_EMPTY数据为空换货明细不可为空、订单明细不可为空等
E_SIGN签名错误签名算法错误、token 不正确等

6. 支持的接口模块列表

6.1 order(订单)

  • 接口名:订单接口
  • 请求方法:POST
  • 功能描述:订单新增、状态/支付/发货更新、备注与标记维护
  • 主要方法
接口方法功能描述
ome.order.add新增/更新订单(依据 lastmodify 与是否存在决定 create/update)
ome.order.status_update更新订单状态(仅接收作废 dead,版本>1 其他状态不接收)
ome.order.pay_status_update更新订单支付状态(版本2不走此接口)
ome.order.ship_status_update更新订单发货状态(版本2不走此接口)
ome.order.custom_mark_add新增订单买家备注
ome.order.custom_mark_update更新订单买家备注
ome.order.memo_add新增订单商家备注与旗标
ome.order.memo_update更新订单商家备注与旗标
ome.order.payment_update更新订单支付方式与金额调整

6.2 aftersalev2(售后)

  • 接口名:售后接口(v2)
  • 请求方法:POST
  • 功能描述:售后单创建、物流更新,覆盖退款/退货/换货流程
  • 主要方法
接口方法功能描述
ome.aftersalev2.add新增/更新售后单(退款/退货/换货)
ome.aftersalev2.logisticsUpdate更新售后物流信息

6.3 exchange(换货)

  • 接口名:换货接口
  • 请求方法:POST
  • 功能描述:换货单创建与明细处理
  • 主要方法
接口方法功能描述
ome.exchange.add新增换货单

6.4 goods(商品)

  • 接口名:商品接口
  • 请求方法:POST
  • 功能描述:商品/SPU 与 SKU 同步,奥翔渠道扩展操作
  • 主要方法
接口方法功能描述
ome.goods.add新增商品/SPU 与 SKU
ome.goods.delete删除商品
ome.goods.sku_delete删除 SKU
ome.goods.aoxiang_update奥翔渠道商品更新
ome.goods.aoxiang_combine_update奥翔组合商品更新
ome.goods.aoxiang_delete奥翔渠道商品删除
ome.goods.aoxiang_mapping奥翔商品映射维护

6.5 invoice(发票)

  • 接口名:发票接口
  • 请求方法:POST
  • 功能描述:发票信息创建与消息推送
  • 主要方法
接口方法功能描述
ome.invoice.add新增发票信息(与订单关联)
ome.invoice.message_push发票消息推送

6.6 payment(支付)

  • 接口名:支付接口
  • 请求方法:POST
  • 功能描述:支付单创建、支付状态更新
  • 主要方法
接口方法功能描述
ome.payment.add新增支付记录(带金额/订单状态校验)
ome.payment.statusUpdate支付状态更新(仅允许 succ)

6.7 qianniu(千牛)

  • 接口名:千牛接口
  • 请求方法:POST
  • 功能描述:订单地址修改、SKU 修改等
  • 主要方法
接口方法功能描述
ome.qianniu.address_modify订单地址修改
ome.qianniu.modifysku明细 SKU 修改(换码/改规格)
ome.qianniu.order_addr_modify订单收货地址修改(别名/兼容接口)

6.8 branch(分单)

  • 接口名:分单接口
  • 请求方法:POST
  • 功能描述:分单等待/占用控制
  • 主要方法
接口方法功能描述
ome.branch.wait分单等待/占用控制

6.9 delivergoods(发货)

  • 接口名:发货接口
  • 请求方法:POST
  • 功能描述:发货加急、发货承诺处理
  • 主要方法
接口方法功能描述
ome.delivergoods.urgent发货加急/催发
ome.delivergoods.promise发货承诺/时效处理

7. 接口调用示例

7.1 PHP 示例(创建订单接口)

php
<?php
/**
 * 模拟 erpapi 接口创建订单
 */

// API 参数
$erp_api_url = 'http://www.example.com/index.php/api';
$flag = 'erpapi'; // erpapi 标识
$token = '899ffcd610e80f117c77d86de578ac430742f5abd5815736b7b29abd0ed5e88fd'; // config目录下certi.php中获取(没有则为空)

// 系统级参数设置
$set_params = array();
$set_params['app_id'] = 'ecos.ome';
$set_params['certi_id'] = '20215858518'; // 证书ID
$set_params['from_node_id'] = '20218888'; // 来源节点ID
$set_params['node_type'] = 'ecos.ome';
$set_params['node_id'] = '1311861837'; // 店铺节点ID(查询 sdb_ome_shop 表找到 node_id)

// 业务参数
$str = '{
    "order_bn": 2526959714656153498,
    "status": "active",
    "total_amount": 177,
    "cost_item": 414,
    "pmt_goods": 207,
    "pmt_order": 30,
    "cur_amount": 177,
    "payed": 177,
    "pay_status": 1,
    "ship_status": 0,
    "order_source": "taobao",
    "date": "2025-10-11 17:48:22",
    "createtime": 1744339314,
    "modified": 1744364899,
    "lastmodify": 1744364899,
    "consignee": {
        "name": "陈**",
        "area_state": "浙江省",
        "area_city": "嘉兴市",
        "area_district": "海盐县",
        "addr": "通*镇**村西三**号",
        "zip": 314300,
        "mobile": "***********",
        "telephone": "",
        "email": ""
    },
    "member_info": {
        "name": "c**",
        "uname": "c**",
        "tel": "",
        "mobile": "",
        "email": "",
        "area_state": "",
        "area_city": "",
        "area_district": "",
        "addr": "",
        "zip": ""
    },
    "order_objects": [
        {
            "bn": "887350098396",
            "oid": 2526959714656153600,
            "name": "电动工具12V锂电池1.5Ah/2.0Ah适配12V机器5120",
            "quantity": 3,
            "price": 138,
            "amount": 414,
            "divide_order_fee": 177,
            "status": "active",
            "order_items": [
                {
                    "bn": "887350098396",
                    "quantity": 3,
                    "price": 138,
                    "amount": 414,
                    "divide_order_fee": 177,
                    "pmt_price": 207
                }
            ]
        }
    ],
    "payments": [
        {
            "paymethod": "支付宝",
            "money": 177,
            "pay_time": "2025-10-11 17:48:19",
            "trade_no": 2024002526959714656153498
        }
    ],
    "shipping": {
        "shipping_name": "快递",
        "cost_shipping": 0,
        "is_cod": "false"
    }
}';

// 解析 JSON 字符串为数组
$postdata = json_decode($str, true);

// 将数组类型的参数转换为 JSON 字符串(组件会自动解码)
foreach ($postdata as $key => $postVal) {
    if (is_array($postdata[$key])) {
        $postdata[$key] = json_encode($postdata[$key]);
    }
}

// 设置接口方法
$postdata['method'] = 'ome.order.add';
$postdata['ship_status'] = '0';

// 删除已经配置的参数(避免重复)
unset($postdata['sign'], $postdata['app_id'], $postdata['from_node_id'], $postdata['node_id']);

// 删除不需要的字段
unset($postdata['task_id'], $postdata['_FROM_MQ_QUEUE'], $postdata['task_type'], 
      $postdata['taskmgr_sign'], $postdata['auto_combine']);
unset($postdata['o2o_info'], $postdata['is_service_order'], $postdata['is_pt'], 
      $postdata['cost_tax'], $postdata['tax_title']);

// 生成系统基础参数
function system_params($flag) {
    $params['flag'] = $flag;
    $params['type'] = 'json';
    $params['charset'] = 'utf-8';
    $params['ver'] = '1';
    $params['timestamp'] = time();
    return $params;
}

// 合并所有参数
$params = system_params($flag);
$params = array_merge($params, $set_params);
$params = array_merge($params, $postdata);

// 递归拼接参数(用于签名)
function assemble($params)
{
    if (!is_array($params)) {
        return null;
    }
    
    ksort($params);
    $sign = '';
    foreach ($params as $key => $val) {
        if (is_null($val)) {
            continue;
        }
        
        if (is_bool($val)) {
            $val = ($val) ? 1 : 0;
        }
        
        $sign .= $key . (is_array($val) ? assemble($val) : $val);
    }
    
    return $sign;
}

// 生成签名算法函数
//@todo:签名不对一般是:$token 填写的与 config/certi.php 不一致
function gen_sign($params, $token) {
    return strtoupper(md5(strtoupper(md5(assemble($params))). $token));
}

// 生成签名
$params['sign'] = gen_sign($params, $token);

// 发送请求
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $erp_api_url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
$return = curl_exec($ch);
curl_close($ch);

// 处理响应
$result = json_decode($return, true);

echo('<pre>');
print_r($result);
exit;
?>

示例说明

  1. 系统参数设置certi_idfrom_node_idnode_id 等需要从 OMS 系统配置中获取
  2. 业务参数处理:数组类型参数需要 JSON 编码,组件会自动解码
  3. 参数清理:删除签名、重复的系统参数和不需要的业务字段
  4. 签名生成:使用 assemble()gen_sign() 函数生成签名,注意 token 必须与 config/certi.php 中的配置一致
  5. 错误排查:如果签名错误,请检查 token 是否与服务器配置一致

7.2 接口调用流程

  1. 准备参数:组装系统级参数和业务参数
  2. 生成签名:使用签名算法生成 sign 参数
  3. 发送请求:通过 POST 方式发送到 /index.php/api
  4. 处理响应:解析返回的 JSON 数据,判断 rsp 字段

8. 注意事项

  1. 签名安全:请妥善保管接口密钥(token),避免泄露。签名不对时,请检查 token 是否与 config/certi.php 中的配置一致。

  2. 时间戳timestamp 必须为 10 位时间戳(Unix 时间戳,单位:秒),建议与服务器时间保持同步。

  3. 参数格式:数组类型参数可以 JSON 字符串形式传递,组件会自动解码为数组格式。

  4. 幂等性:建议使用 method + node_id + order_bn(订单)或 method + node_id + refund_bn(售后)等组合作为幂等键,避免重复提交。

  5. 数据校验:系统会进行多重校验(版本校验、金额校验、状态校验等),如不符合条件将返回失败。

  6. 组件处理:部分接口(如订单)的数据会经过组件层进行格式化处理,详见各接口文档说明。

  7. 版本差异:不同 API 版本(如版本1、版本2)对某些接口的支持可能不同,请参考具体接口文档。

  8. 编码要求:所有参数和响应均使用 UTF-8 编码。

9. 快速导航

按业务类型分类:

业务类型接口模块文档链接
订单管理orderorder.md
售后管理aftersalev2aftersalev2.md
换货管理exchangeexchange.md
商品管理goodsgoods.md
发票管理invoiceinvoice.md
支付管理paymentpayment.md
订单维护qianniuqianniu.md
分单控制branchbranch.md
发货管理delivergoodsdelivergoods.md

10. 附录

10.1 数据脱敏说明

部分敏感数据(如客户姓名、手机号、地址等)在接收时可能已进行脱敏处理,系统会根据 index_field 中的 oaid 等索引进行解密或关联处理。

10.2 调用频率限制

为保证系统稳定性,接口调用可能存在频率限制,具体限制规则请联系系统管理员获取。

10.3 接口版本说明

  • 版本1(v1):传统接口版本,支持完整的支付单、状态更新等接口
  • 版本2(v2):新版本接口,部分状态更新接口不再使用(如支付状态、发货状态更新)

10.4 组件化处理说明

部分接口(如订单接口)的数据会经过组件层进行格式化处理,组件包括:

  • master - 订单主表信息
  • items - 订单明细
  • shipping - 配送信息
  • consignee - 收货人信息
  • member - 会员信息
  • tax - 税务信息

详细组件处理逻辑请参考各接口文档。