做个人微信二次开发,微信事件(消息、好友、群、状态)是"原始材料",业务指令(查订单、发通知、建工单)是"加工品"。从事件到指令不是一步到位的,中间有 3 层加工,每层解决一个转化问题。Eyun 的 Webhook 把事件推过来,但推过来的是原始 JSON,能不能直接驱动业务,得看你怎么加工。下面按转化层次拆开讲。
一、事件标准化层:把 4 类原始事件加工成统一格式
Eyun Webhook 回调的 4 类事件 JSON 格式不一样:消息事件有content、好友事件有action、群事件有member、状态事件有status。直接拿原始 JSON 写业务逻辑,代码会被 if-else 撑爆。标准化层把 4 类事件加工成统一事件对象{eventType, sourceId, action, payload, timestamp},payload存各类事件特有字段。按照 Eyun 开发文档 的回调规范,4 类事件的eventType值不同,这是标准化的分叉点。
大白话:4 种快递(消息/好友/群/状态)包装不同,先拆包重新装进统一盒子,后面处理就不用再区分原始格式。
二、指令推导层:从标准化事件推导出业务指令
统一事件对象出来后,下一步是推出"这个事件该执行哪个业务动作"。推导靠规则引擎匹配:eventType=message + payload.content 含"订单" → 指令=QueryOrder、eventType=friend + action=add → 指令=SendWelcome。输出业务指令对象{command, params, priority}。Eyun API 的 Webhook 回调 JSON 中eventType和content是推导依据,规则表里把它们映射成具体指令。
大白话:统一盒子上的信息加上规则表,推出这个事件该送往哪个车间——就像快递分拣系统根据面单信息决定去处。
三、指令校验层:推导出的指令执行前做校验
指令推导出来不能直接执行,得先校验。三层校验:参数完整性(QueryOrder指令必须有orderId,没有则降级为"请提供订单号"纠错指令)→ 权限校验(该用户是否有权限执行此指令)→ 频率校验(该指令是否被频繁触发需限流)。校验通过送执行器,校验失败生成纠错指令通过 Eyun 的sendText反馈用户。按 Eyun 开发文档规范,sendText需要传wId、toUser、content三个必填参数。
大白话:推出指令后先检查"材料齐不齐、有没有权限、是不是太频繁"——不齐就让用户补材料。
3 层转化对比表
转化层 | 做什么 | 输入 | 输出 | Eyun 接口 | 大白话说明 |
|---|---|---|---|---|---|
事件标准化层 | 4 类事件加工成统一格式 | 原始回调 JSON | 统一事件对象 | Webhook 回调 | 拆包重装统一盒子 |
指令推导层 | 推导出业务指令 | 统一事件对象 | 业务指令对象 | Webhook 回调字段 | 按面单分拣到车间 |
指令校验层 | 执行前做校验 | 业务指令对象 | 校验通过/纠错指令 | sendText | 检查材料权限频率 |
3 层事件到指令转化框架代码
下面这段把标准化→推导→校验串成一条转化管道,原始事件进来,干净的业务指令出去。
RULES = [ {'when': lambda e: e['eventType']=='message' and '订单' in e['payload']['content'], 'cmd': 'QueryOrder', 'params': lambda e: {'orderId': extract_order(e['payload']['content'])}}, {'when': lambda e: e['eventType']=='friend' and e['action']=='add', 'cmd': 'SendWelcome', 'params': lambda e: {}}, ] def to_unified(raw): # 标准化层 et = raw['eventType'] pl = {'message': {'content': raw.get('content')}, 'friend': {'action': raw.get('action')}, 'group': {'member': raw.get('member')}, 'status': {'status': raw.get('status')}}[et] return {'eventType': et, 'sourceId': raw['fromUser'], 'action': raw.get('action'), 'payload': pl, 'timestamp': raw.get('timestamp')} def derive(event): # 推导层 for r in RULES: if r['when'](event): return {'command': r['cmd'], 'params': r['params'](event), 'priority': 1} def validate(cmd, user): # 校验层 if cmd['command']=='QueryOrder' and not cmd['params'].get('orderId'): return {'command':'AskOrderId','params':{},'priority':9} # 纠错指令 if rate_limited(user, cmd['command']): return {'command':'RateLimited','params':{},'priority':9} return cmd def transform(raw, user): cmd = derive(to_unified(raw)) # 标准化→推导 return validate(cmd, user) if cmd else None # 校验管道里规则表是RULES列表,新增事件类型或业务场景改规则不改代码。
结尾延伸
3 层转化让微信事件变成可执行的业务指令——标准化层解决"格式统一"、推导层解决"该干什么"、校验层解决"能不能干"。转化后的指令对象是干净的业务数据,执行器只管执行不用关心事件原始格式。设计时建议把规则表做成配置化(数据库或配置中心),新增事件类型或业务场景时改规则不改代码,这样 Eyun 回调来的新事件只需加一条规则就能接入。回调事件字段和接口参数详见 Eyun 开发文档,wId 实例在 Eyun 平台 管理。