Skip to content

支付事件

本页面介绍支付相关的事件说明。

说明

MISEB系统中,支付相关的事件主要通过订单事件来处理。支付成功时会触发ORDER_PAY_SUCCESS事件,退款相关事件包括ORDER_REFUND_*系列。

相关订单事件

事件标识说明payload
ORDER_PAY_SUCCESS订单支付成功订单号
ORDER_REFUND_APPLY订单申请退款成功退款订单号
ORDER_REFUND_AGREE订单同意退款退款订单号
ORDER_REFUND_REFUSE订单拒绝退款退款订单号
ORDER_REFUND_CANCEL订单取消退款退款订单号
ORDER_RETURN_COMPLETE订单退货完成退款订单号

相关用户事件

事件标识说明payload
USER_RECHARGE_SUCCESS用户充值成功充值订单号

支付成功处理

订单支付成功后,可以进行以下处理:

javascript
// 接口路径: /custom/payment/success
// 处理 ORDER_PAY_SUCCESS 事件

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

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

// 查询订单支付信息
var order = db.selectOne(`
    SELECT o.order_id, o.uid, o.pay_price, o.pay_type, o.pay_time,
           o.transaction_id, u.phone, u.nickname
    FROM eb_store_order o
    LEFT JOIN eb_user u ON o.uid = u.uid
    WHERE o.order_id = ?
`, orderNo);

// 1. 发送支付成功短信
if (order.phone) {
    http.post(env.get('SMS_API_URL') + '/send', {
        body: {
            phone: order.phone,
            template: 'pay_success',
            params: {
                orderNo: orderNo,
                amount: (order.pay_price / 100).toFixed(2)
            }
        }
    });
}

// 2. 记录支付日志
db.insert(`
    INSERT INTO payment_log
    (order_no, uid, pay_price, pay_type, transaction_id, pay_time, created_at)
    VALUES (?, ?, ?, ?, ?, ?, NOW())
`, orderNo, order.uid, order.pay_price, order.pay_type, order.transaction_id, order.pay_time);

// 3. 同步到财务系统
http.post(env.get('FINANCE_API_URL') + '/payment/create', {
    headers: { 'Authorization': 'Bearer ' + env.get('FINANCE_API_KEY') },
    body: {
        type: 'order_payment',
        orderId: orderNo,
        userId: order.uid,
        amount: order.pay_price / 100,
        payType: order.pay_type,
        transactionId: order.transaction_id,
        payTime: order.pay_time
    }
});

log.info("支付成功处理完成: orderNo={}", orderNo);

return { success: true };

退款处理

退款申请监控

javascript
// 接口路径: /custom/payment/refund-monitor
// 处理 ORDER_REFUND_APPLY 事件

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

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

// 查询退款订单
var refund = db.selectOne(`
    SELECT r.*, o.pay_price as order_amount, m.mer_name
    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 r.mer_id = m.id
    WHERE r.refund_order_no = ?
`, refundOrderNo);

// 大额退款告警
var threshold = 100000;  // 1000元
if (refund.refund_price > threshold) {
    http.post(env.get('DINGTALK_WEBHOOK'), {
        body: {
            msgtype: 'text',
            text: {
                content: '【大额退款告警】\n' +
                    '商户:' + refund.mer_name + '\n' +
                    '订单号:' + refund.order_no + '\n' +
                    '退款金额:¥' + (refund.refund_price / 100).toFixed(2) + '\n' +
                    '退款原因:' + refund.refund_reason_wap
            }
        }
    });
}

// 统计商户退款率
var stats = db.selectOne(`
    SELECT
        COUNT(*) as total_orders,
        SUM(CASE WHEN refund_status > 0 THEN 1 ELSE 0 END) as refund_orders
    FROM eb_store_order
    WHERE mer_id = ?
    AND create_time > DATE_SUB(NOW(), INTERVAL 30 DAY)
`, refund.mer_id);

var refundRate = stats.refund_orders / stats.total_orders;
if (refundRate > 0.1) {  // 退款率超过10%
    log.warn("商户退款率过高: merId={}, rate={}", refund.mer_id, refundRate);
}

return { success: true };

退款成功同步

javascript
// 接口路径: /custom/payment/refund-complete
// 处理 ORDER_RETURN_COMPLETE 事件

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

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

// 查询退款订单
var refund = db.selectOne(`
    SELECT r.*, u.phone, u.nickname
    FROM eb_store_refund_order r
    LEFT JOIN eb_user u ON r.uid = u.uid
    WHERE r.refund_order_no = ?
`, refundOrderNo);

// 发送退款成功短信
if (refund.phone) {
    http.post(env.get('SMS_API_URL') + '/send', {
        body: {
            phone: refund.phone,
            template: 'refund_success',
            params: {
                orderNo: refund.order_no,
                refundAmount: (refund.refund_price / 100).toFixed(2)
            }
        }
    });
}

// 同步到财务系统
http.post(env.get('FINANCE_API_URL') + '/refund/create', {
    headers: { 'Authorization': 'Bearer ' + env.get('FINANCE_API_KEY') },
    body: {
        type: 'order_refund',
        refundId: refundOrderNo,
        orderId: refund.order_no,
        userId: refund.uid,
        amount: refund.refund_price / 100,
        refundTime: refund.update_time
    }
});

log.info("退款完成处理: refundOrderNo={}", refundOrderNo);

return { success: true };

充值成功处理

javascript
// 接口路径: /custom/payment/recharge
// 处理 USER_RECHARGE_SUCCESS 事件

var event = payload.event;
var rechargeOrderNo = event.payload;

log.info("处理充值成功事件: orderNo={}", rechargeOrderNo);

// 查询充值订单
var recharge = db.selectOne(`
    SELECT r.*, u.phone, u.nickname
    FROM eb_user_recharge r
    LEFT JOIN eb_user u ON r.uid = u.uid
    WHERE r.order_id = ?
`, rechargeOrderNo);

// 发送充值成功短信
if (recharge.phone) {
    http.post(env.get('SMS_API_URL') + '/send', {
        body: {
            phone: recharge.phone,
            template: 'recharge_success',
            params: {
                amount: (recharge.price / 100).toFixed(2),
                giveAmount: (recharge.give_price / 100).toFixed(2)
            }
        }
    });
}

// 同步到财务系统
http.post(env.get('FINANCE_API_URL') + '/recharge/create', {
    headers: { 'Authorization': 'Bearer ' + env.get('FINANCE_API_KEY') },
    body: {
        type: 'user_recharge',
        orderId: rechargeOrderNo,
        userId: recharge.uid,
        amount: recharge.price / 100,
        giveAmount: recharge.give_price / 100,
        payType: recharge.pay_type,
        payTime: recharge.pay_time
    }
});

log.info("充值成功处理完成: orderNo={}", rechargeOrderNo);

return { success: true };

下一步

成都艾唯特软件有限公司