Skip to content

订单事件

本页面介绍订单相关的事件类型及处理示例。

事件列表

事件标识说明payload
ORDER_CREATE_SUCCESS订单创建成功订单号
ORDER_CANCEL订单取消订单号
ORDER_PAY_SUCCESS订单支付成功订单号
ORDER_DELIVERY_PART订单部分发货成功订单号
ORDER_DELIVERY_ALL订单全部发货成功订单号
ORDER_CONFIRM_RECEIPT订单确认收货订单号
ORDER_COMMENT订单评价订单号
ORDER_REFUND_APPLY订单申请退款成功退款订单号
ORDER_REFUND_AGREE订单同意退款退款订单号
ORDER_REFUND_REFUSE订单拒绝退款退款订单号
ORDER_REFUND_CANCEL订单取消退款退款订单号
ORDER_RETURN_COMPLETE订单退货完成退款订单号

事件数据结构

所有订单事件的payload通常是订单号(String类型):

json
{
  "eventKey": "ORDER_PAY_SUCCESS",
  "payload": "202401010001",
  "timestamp": 1704067200000
}

ORDER_CREATE_SUCCESS - 订单创建成功

用户提交订单成功时触发。

触发时机

  • 用户在前端确认下单
  • 订单数据写入数据库后

处理示例

javascript
// 接口路径: /custom/event/order-create
// 处理 ORDER_CREATE_SUCCESS 事件

var event = payload.event;
var orderNo = event.payload;

log.info("处理订单创建事件: orderNo={}", orderNo);

// 查询订单详情
var order = db.selectOne(`
    SELECT o.*, m.mer_name, u.nickname, u.phone
    FROM eb_store_order o
    LEFT JOIN eb_merchant m ON o.mer_id = m.id
    LEFT JOIN eb_user u ON o.uid = u.uid
    WHERE o.order_id = ?
`, orderNo);

// 查询订单商品
var products = db.select(`
    SELECT product_id, product_name, sku, cart_num, price
    FROM eb_store_order_info
    WHERE order_no = ?
`, orderNo);

// 发送新订单通知给商户
http.post(env.get('DINGTALK_WEBHOOK'), {
    body: {
        msgtype: 'text',
        text: {
            content: '【新订单通知】\n' +
                '订单号:' + orderNo + '\n' +
                '下单用户:' + order.nickname + '\n' +
                '订单金额:¥' + (order.total_price / 100).toFixed(2)
        }
    }
});

return { success: true };

ORDER_PAY_SUCCESS - 订单支付成功

订单支付完成时触发。

触发时机

  • 微信/支付宝支付成功回调
  • 余额支付成功

处理示例:同步ERP

javascript
// 接口路径: /custom/erp/order-sync
// 处理 ORDER_PAY_SUCCESS 事件

var event = payload.event;
var orderNo = event.payload;

log.info("处理订单支付成功事件: orderNo={}", orderNo);

// 查询订单详情
var order = db.selectOne(`
    SELECT o.*, u.phone, u.nickname
    FROM eb_store_order o
    LEFT JOIN eb_user u ON o.uid = u.uid
    WHERE o.order_id = ?
`, orderNo);

if (!order) {
    log.error("订单不存在: {}", orderNo);
    return { success: false, message: "订单不存在" };
}

// 查询订单商品
var products = db.select(`
    SELECT product_id, product_name, sku, cart_num as num, price
    FROM eb_store_order_info
    WHERE order_no = ?
`, orderNo);

// 查询收货地址
var address = db.selectOne(`
    SELECT * FROM eb_store_order_address
    WHERE order_no = ?
`, orderNo);

// 转换为ERP格式
var erpOrder = {
    sourceOrderNo: order.order_id,
    sourceSystem: "MISEB",
    customerId: "MISEB_" + order.uid,
    customerName: order.nickname,
    customerPhone: order.phone,
    payAmount: order.pay_price / 100,
    payType: order.pay_type,
    payTime: order.pay_time,
    shippingAddress: {
        name: address.real_name,
        phone: address.user_phone,
        province: address.province,
        city: address.city,
        district: address.district,
        detail: address.detail
    },
    items: products.map(p => ({
        skuCode: "MISEB_" + p.product_id,
        productName: p.product_name,
        spec: p.sku,
        quantity: p.num,
        price: p.price / 100
    }))
};

// 调用ERP接口
var result = http.post(env.get('ERP_API_URL') + '/order/create', {
    headers: {
        'Content-Type': 'application/json',
        'Authorization': 'Bearer ' + env.get('ERP_API_KEY')
    },
    body: erpOrder,
    timeout: 10000
});

if (result.code == 0 || result.code == 200) {
    // 记录ERP订单号
    db.update(`
        UPDATE eb_store_order
        SET mark = CONCAT(IFNULL(mark,''), ' ERP:', ?)
        WHERE order_id = ?
    `, result.data?.erpOrderId, orderNo);

    log.info("订单同步ERP成功: orderNo={}, erpOrderId={}", orderNo, result.data?.erpOrderId);
    return { success: true, erpOrderId: result.data?.erpOrderId };
} else {
    log.error("订单同步ERP失败: orderNo={}, error={}", orderNo, result.message);
    return { success: false, message: result.message };
}

ORDER_DELIVERY_ALL - 订单全部发货成功

商户发货且全部商品发出时触发。

处理示例:发送发货通知

javascript
// 接口路径: /custom/notify/shipping
// 处理 ORDER_DELIVERY_ALL 事件

var event = payload.event;
var orderNo = event.payload;

log.info("处理发货事件: orderNo={}", orderNo);

// 查询订单和物流信息
var order = db.selectOne(`
    SELECT o.order_id, o.uid, u.phone, u.nickname
    FROM eb_store_order o
    LEFT JOIN eb_user u ON o.uid = u.uid
    WHERE o.order_id = ?
`, orderNo);

// 查询物流信息
var logistics = db.selectOne(`
    SELECT delivery_name, delivery_id
    FROM eb_store_order
    WHERE order_id = ?
`, orderNo);

// 发送短信通知
if (order.phone) {
    http.post(env.get('SMS_API_URL') + '/send', {
        headers: {
            'Authorization': 'Bearer ' + env.get('SMS_API_KEY')
        },
        body: {
            phone: order.phone,
            template: 'order_shipped',
            params: {
                orderNo: orderNo,
                expressName: logistics.delivery_name,
                expressNo: logistics.delivery_id
            }
        }
    });
    log.info("发货短信已发送: phone={}", order.phone);
}

return { success: true };

ORDER_CONFIRM_RECEIPT - 订单确认收货

用户确认收货时触发。

处理示例:计算分销佣金

javascript
// 接口路径: /custom/distribution/calc-commission
// 处理 ORDER_CONFIRM_RECEIPT 事件

var event = payload.event;
var orderNo = event.payload;

log.info("处理确认收货事件: orderNo={}", orderNo);

// 查询订单
var order = db.selectOne(`
    SELECT * FROM eb_store_order WHERE order_id = ?
`, orderNo);

// 查询用户的推荐人
var user = db.selectOne(`
    SELECT uid, spread_uid FROM eb_user WHERE uid = ?
`, order.uid);

if (user.spread_uid > 0) {
    // 计算佣金(假设10%)
    var commission = Math.floor(order.pay_price * 0.1);

    // 记录佣金
    db.insert(`
        INSERT INTO eb_user_brokerage_record
        (uid, link_id, link_type, type, title, price, status, create_time)
        VALUES (?, ?, 'order', 1, '订单佣金', ?, 1, NOW())
    `, user.spread_uid, order.id, commission);

    // 更新用户佣金余额
    db.update(`
        UPDATE eb_user
        SET brokerage_price = brokerage_price + ?
        WHERE uid = ?
    `, commission, user.spread_uid);

    log.info("佣金计算完成: spreadUid={}, commission={}", user.spread_uid, commission);
}

return { success: true };

ORDER_CANCEL - 订单取消

订单被取消时触发(用户取消、商户取消、超时关闭)。

处理示例:恢复库存&同步ERP

javascript
// 接口路径: /custom/erp/order-cancel
// 处理 ORDER_CANCEL 事件

var event = payload.event;
var orderNo = event.payload;

log.info("处理订单取消事件: orderNo={}", orderNo);

// 查询订单状态
var order = db.selectOne(`
    SELECT order_id, status, refund_status FROM eb_store_order
    WHERE order_id = ?
`, orderNo);

// 同步取消到ERP
var result = http.post(env.get('ERP_API_URL') + '/order/cancel', {
    headers: {
        'Authorization': 'Bearer ' + env.get('ERP_API_KEY')
    },
    body: {
        sourceOrderNo: orderNo,
        sourceSystem: "MISEB",
        cancelReason: "用户取消订单"
    }
});

log.info("ERP订单取消同步: orderNo={}, result={}", orderNo, result);

return { success: true };

ORDER_REFUND_APPLY - 订单申请退款成功

用户申请退款成功时触发。

处理示例:退款审核通知

javascript
// 接口路径: /custom/notify/refund-apply
// 处理 ORDER_REFUND_APPLY 事件

var event = payload.event;
var refundOrderNo = event.payload;  // 注意:这里是退款订单号

log.info("处理退款申请事件: refundOrderNo={}", refundOrderNo);

// 查询退款订单
var refund = db.selectOne(`
    SELECT r.*, o.mer_id, m.mer_name, m.alert_phone
    FROM eb_store_refund_order r
    LEFT JOIN eb_store_order o ON r.order_no = o.order_id
    LEFT JOIN eb_merchant m ON o.mer_id = m.id
    WHERE r.refund_order_no = ?
`, refundOrderNo);

// 发送钉钉通知给商户
http.post(env.get('DINGTALK_WEBHOOK'), {
    body: {
        msgtype: 'text',
        text: {
            content: '【退款申请通知】\n' +
                '商户:' + refund.mer_name + '\n' +
                '退款单号:' + refundOrderNo + '\n' +
                '退款金额:¥' + (refund.refund_price / 100).toFixed(2) + '\n' +
                '退款原因:' + refund.refund_reason_wap + '\n' +
                '请及时处理!'
        }
    }
});

return { success: true };

ORDER_REFUND_AGREE - 订单同意退款

商户同意退款时触发。

处理示例:同步退款到ERP

javascript
// 接口路径: /custom/erp/refund-sync
// 处理 ORDER_REFUND_AGREE 事件

var event = payload.event;
var refundOrderNo = event.payload;

log.info("处理退款同意事件: refundOrderNo={}", refundOrderNo);

// 查询退款订单
var refund = db.selectOne(`
    SELECT * FROM eb_store_refund_order
    WHERE refund_order_no = ?
`, refundOrderNo);

// 同步到ERP
var result = http.post(env.get('ERP_API_URL') + '/refund/create', {
    headers: {
        'Authorization': 'Bearer ' + env.get('ERP_API_KEY')
    },
    body: {
        sourceRefundNo: refundOrderNo,
        sourceOrderNo: refund.order_no,
        refundAmount: refund.refund_price / 100,
        refundReason: refund.refund_reason_wap
    }
});

log.info("ERP退款同步: refundOrderNo={}, result={}", refundOrderNo, result);

return { success: true };

数据库表参考

eb_store_order 订单主表

字段说明
order_id订单号
uid用户ID
mer_id商户ID
total_price订单总价(分)
pay_price实付金额(分)
pay_type支付方式
pay_time支付时间
status订单状态
delivery_name快递公司
delivery_id快递单号

eb_store_order_info 订单商品表

字段说明
order_no订单号
product_id商品ID
product_name商品名称
sku规格
cart_num数量
price单价(分)

eb_store_refund_order 退款订单表

字段说明
refund_order_no退款订单号
order_no原订单号
refund_price退款金额(分)
refund_reason_wap退款原因
refund_status退款状态

下一步

成都艾唯特软件有限公司