支付事件
本页面介绍支付相关的事件说明。
说明
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 };