用户事件
本页面介绍用户相关的事件类型及处理示例。
事件列表
| 事件标识 | 说明 | payload |
|---|---|---|
| USER_REGISTER | 用户注册 | 用户ID |
| USER_LOGIN_SUCCESS | 用户登录成功 | 用户ID |
| USER_UPDATE_INFO | 用户信息修改 | 用户ID |
| USER_UPDATE_PHONE | 用户手机号修改 | 用户ID |
| USER_CHANGE_PASSWORD | 用户密码修改 | 用户ID |
| USER_BIND_WECHAT | 用户绑定微信 | 用户ID |
| USER_BIND_ALIPAY | 用户绑定支付宝 | 用户ID |
| USER_LOGOFF | 用户注销 | 用户ID |
| USER_SIGN_IN | 用户签到成功 | 用户ID |
| USER_POINTS_EXCHANGE | 用户积分兑换成功 | 兑换记录ID |
| USER_RECHARGE_SUCCESS | 用户充值成功 | 充值订单号 |
| USER_CONSUME_SUCCESS | 用户消费成功 | 消费订单号 |
| USER_LEVEL_UP | 会员等级升级 | 用户ID |
| USER_PAID_MEMBER_BUY | 购买付费会员成功 | 会员订单ID |
事件数据结构
大多数用户事件的payload是用户ID(Long类型):
json
{
"eventKey": "USER_REGISTER",
"payload": 12345,
"timestamp": 1704067200000
}USER_REGISTER - 用户注册
新用户注册成功时触发。
触发时机
- 微信小程序授权登录首次注册
- 手机号验证码注册
- H5/APP端注册
处理示例:新用户欢迎
javascript
// 接口路径: /custom/user/welcome
// 处理 USER_REGISTER 事件
var event = payload.event;
var userId = event.payload;
log.info("处理用户注册事件: userId={}", userId);
// 查询用户信息
var user = db.selectOne(`
SELECT uid, nickname, avatar, phone, create_time, spread_uid
FROM eb_user
WHERE uid = ?
`, userId);
if (!user) {
log.error("用户不存在: {}", userId);
return { success: false, message: "用户不存在" };
}
// 1. 发放新人优惠券
var newUserCoupons = db.select(`
SELECT id FROM eb_store_coupon
WHERE is_new_user = 1 AND status = 1
AND start_time <= NOW() AND end_time >= NOW()
`);
for (coupon in newUserCoupons) {
db.insert(`
INSERT INTO eb_store_coupon_user
(uid, coupon_id, status, create_time)
VALUES (?, ?, 0, NOW())
`, userId, coupon.id);
}
log.info("新人优惠券发放完成: userId={}, count={}", userId, newUserCoupons.length);
// 2. 发送欢迎短信
if (user.phone) {
http.post(env.get('SMS_API_URL') + '/send', {
headers: { 'Authorization': 'Bearer ' + env.get('SMS_API_KEY') },
body: {
phone: user.phone,
template: 'user_welcome',
params: { nickname: user.nickname || '新用户' }
}
});
}
// 3. 同步到CRM
http.post(env.get('CRM_API_URL') + '/customer/create', {
headers: { 'Authorization': 'Bearer ' + env.get('CRM_TOKEN') },
body: {
externalId: 'miseb_' + user.uid,
name: user.nickname,
phone: user.phone,
avatar: user.avatar,
source: 'MISEB商城',
registerTime: user.create_time,
referrerId: user.spread_uid > 0 ? 'miseb_' + user.spread_uid : null
}
});
log.info("用户注册处理完成: userId={}", userId);
return { success: true };USER_LOGIN_SUCCESS - 用户登录成功
用户登录时触发。
处理示例:登录日志记录
javascript
// 接口路径: /custom/user/login-log
// 处理 USER_LOGIN_SUCCESS 事件
var event = payload.event;
var userId = event.payload;
log.info("处理用户登录事件: userId={}", userId);
// 记录登录日志(可以存到ES或数据库)
db.insert(`
INSERT INTO user_login_log
(uid, login_time, login_ip, user_agent)
VALUES (?, NOW(), ?, ?)
`, userId, request.getRemoteAddr(), request.getHeader('User-Agent'));
// 检测异常登录(1小时内登录超过10次)
var loginCount = db.selectInt(`
SELECT COUNT(*) FROM user_login_log
WHERE uid = ?
AND login_time > DATE_SUB(NOW(), INTERVAL 1 HOUR)
`, userId);
if (loginCount > 10) {
// 发送告警
var user = db.selectOne(`SELECT nickname, phone FROM eb_user WHERE uid = ?`, userId);
http.post(env.get('DINGTALK_WEBHOOK'), {
body: {
msgtype: 'text',
text: {
content: '【异常登录告警】\n' +
'用户:' + user.nickname + '\n' +
'手机:' + user.phone + '\n' +
'1小时内登录次数:' + loginCount
}
}
});
log.warn("异常登录: userId={}, loginCount={}", userId, loginCount);
}
return { success: true };USER_RECHARGE_SUCCESS - 用户充值成功
用户余额充值成功时触发。
处理示例:充值通知&同步财务
javascript
// 接口路径: /custom/finance/recharge-sync
// 处理 USER_RECHARGE_SUCCESS 事件
var event = payload.event;
var rechargeOrderNo = event.payload; // 注意:这里是充值订单号
log.info("处理充值成功事件: orderNo={}", rechargeOrderNo);
// 查询充值订单
var recharge = db.selectOne(`
SELECT r.*, u.nickname, u.phone
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') + '/transaction/create', {
headers: { 'Authorization': 'Bearer ' + env.get('FINANCE_API_KEY') },
body: {
type: 'recharge',
orderId: rechargeOrderNo,
userId: recharge.uid,
amount: recharge.price / 100,
giveAmount: recharge.give_price / 100,
payType: recharge.pay_type,
time: recharge.pay_time
}
});
log.info("充值同步完成: orderNo={}", rechargeOrderNo);
return { success: true };USER_LEVEL_UP - 会员等级升级
用户会员等级提升时触发。
处理示例:升级通知&发放权益
javascript
// 接口路径: /custom/member/level-up
// 处理 USER_LEVEL_UP 事件
var event = payload.event;
var userId = event.payload;
log.info("处理会员升级事件: userId={}", userId);
// 查询用户和会员等级信息
var user = db.selectOne(`
SELECT u.uid, u.nickname, u.phone, u.level,
l.name as level_name, l.discount, l.icon
FROM eb_user u
LEFT JOIN eb_system_user_level l ON u.level = l.id
WHERE u.uid = ?
`, userId);
// 发送升级通知
if (user.phone) {
http.post(env.get('SMS_API_URL') + '/send', {
body: {
phone: user.phone,
template: 'member_level_up',
params: {
nickname: user.nickname,
levelName: user.level_name,
discount: user.discount
}
}
});
}
// 发放升级礼包优惠券
var levelCoupons = db.select(`
SELECT coupon_id FROM eb_system_user_level_coupon
WHERE level_id = ?
`, user.level);
for (coupon in levelCoupons) {
db.insert(`
INSERT INTO eb_store_coupon_user
(uid, coupon_id, status, create_time)
VALUES (?, ?, 0, NOW())
`, userId, coupon.coupon_id);
}
log.info("会员升级处理完成: userId={}, level={}", userId, user.level_name);
return { success: true };USER_SIGN_IN - 用户签到成功
用户每日签到时触发。
处理示例:签到积分记录
javascript
// 接口路径: /custom/user/sign-log
// 处理 USER_SIGN_IN 事件
var event = payload.event;
var userId = event.payload;
log.info("处理用户签到事件: userId={}", userId);
// 查询签到信息
var signInfo = db.selectOne(`
SELECT sign_num, integral
FROM eb_user_sign
WHERE uid = ?
ORDER BY id DESC
LIMIT 1
`, userId);
// 记录签到日志
db.insert(`
INSERT INTO user_sign_log
(uid, sign_date, continuous_days, points, created_at)
VALUES (?, CURDATE(), ?, ?, NOW())
`, userId, signInfo.sign_num, signInfo.integral);
// 连续签到奖励
if (signInfo.sign_num == 7) {
// 发放7天连签奖励
var bonusPoints = 100;
db.update(`
UPDATE eb_user SET integral = integral + ? WHERE uid = ?
`, bonusPoints, userId);
log.info("连续7天签到奖励: userId={}, bonusPoints={}", userId, bonusPoints);
}
return { success: true };USER_LOGOFF - 用户注销
用户申请注销账号时触发。
处理示例:数据清理通知
javascript
// 接口路径: /custom/user/logoff-notify
// 处理 USER_LOGOFF 事件
var event = payload.event;
var userId = event.payload;
log.info("处理用户注销事件: userId={}", userId);
// 查询用户信息(注销前的数据)
var user = db.selectOne(`
SELECT uid, nickname, phone, create_time
FROM eb_user
WHERE uid = ?
`, userId);
// 通知CRM删除用户
http.post(env.get('CRM_API_URL') + '/customer/delete', {
headers: { 'Authorization': 'Bearer ' + env.get('CRM_TOKEN') },
body: {
externalId: 'miseb_' + userId,
reason: '用户主动注销'
}
});
// 记录注销日志
db.insert(`
INSERT INTO user_logoff_log
(uid, nickname, phone, register_time, logoff_time)
VALUES (?, ?, ?, ?, NOW())
`, userId, user.nickname, user.phone, user.create_time);
// 发送通知给运营
http.post(env.get('DINGTALK_WEBHOOK'), {
body: {
msgtype: 'text',
text: {
content: '【用户注销通知】\n' +
'用户ID:' + userId + '\n' +
'昵称:' + user.nickname + '\n' +
'手机:' + user.phone
}
}
});
log.info("用户注销处理完成: userId={}", userId);
return { success: true };数据库表参考
eb_user 用户表
| 字段 | 说明 |
|---|---|
| uid | 用户ID |
| nickname | 昵称 |
| avatar | 头像 |
| phone | 手机号 |
| level | 会员等级 |
| integral | 积分 |
| now_money | 余额(分) |
| spread_uid | 推荐人ID |
| create_time | 注册时间 |
eb_user_sign 签到表
| 字段 | 说明 |
|---|---|
| uid | 用户ID |
| sign_num | 连续签到天数 |
| integral | 获得积分 |
eb_user_recharge 充值表
| 字段 | 说明 |
|---|---|
| order_id | 充值订单号 |
| uid | 用户ID |
| price | 充值金额(分) |
| give_price | 赠送金额(分) |
| pay_type | 支付方式 |
| pay_time | 支付时间 |
