一、执行顺序——先做什么后做什么
通过申请后的操作有严格顺序:第一步调通过接口(好友关系建立),第二步查联系人详情(拿到完整资料),第三步改备注打标签(本地管理就绪),第四步发欢迎语(客户感知到服务)。
顺序不能乱:没通过就改不了备注(还不是好友),没通过就发不了消息(陌生人发不了)。先确保关系建立成功,再执行后续动作。每步检查返回码,前一步失败后续不执行。
二、失败处理——通过失败怎么办
通过接口可能失败:返回1004(限频)、返回其他错误码(实例异常)。失败后不能放弃,要进重试队列。重试有上限(3次),超限标记为"需人工处理"并通知管理员。
欢迎语发送也可能失败:通过成功但发消息失败。这种情况好友已经加了但没收到欢迎,需要一个补偿机制——定时扫描"已通过但未发欢迎"的好友,补发欢迎语。
三、幂等保障——重复回调不重复处理
好友申请回调可能重试(5秒超时触发3次重试),程序可能收到同一条申请多次。必须做幂等:用申请的唯一标识(申请人wxid+申请时间)做去重,已处理的申请不再重复执行。
幂等不做好会导致一个好友被通过多次(实际只会通过一次但后续动作重复执行)、发多条欢迎语。好友收到多条欢迎语体验很差。
四、执行质量检查
执行完一组操作后要检查质量:通过成功了吗?备注改了吗?欢迎语收到了吗?用定时任务扫描"通过但异常"的记录,输出异常报告。
执行环节对照
执行要点 | 做什么 | 不做的后果 |
|---|---|---|
顺序控制 | 通过→查详情→改备注→发欢迎 | 操作失败或乱序 |
失败重试 | 失败进队列重试,超限转人工 | 好友加了没服务 |
幂等去重 | 唯一标识去重,不重复处理 | 重复发多条欢迎 |
质量检查 | 定时扫描异常记录 | 问题积累无人知 |
执行环节代码
import hashlib def handle_apply(apply): # 幂等去重 key = hashlib.md5( f"{apply['fromUser']}{apply['createTime']}".encode() ).hexdigest() if db.exists("apply_log", key=key): return # 已处理,跳过 # 第一步:通过 r = api("acceptFriend", {"wId": WID, "wxid": apply["fromUser"]}) if r["code"] != "1000": retry_q.put(apply) # 进重试队列 return # 第二步:查详情 detail = api("getContactDetail", {"wId": WID, "wxid": apply["fromUser"]}) # 第三步:改备注 remark = f"{apply.get('source','未知')}-{detail['data'].get('nickname','')}" api("setRemark", {"wId": WID, "wxid": apply["fromUser"], "remark": remark}) # 第四步:发欢迎 r = api("sendText", {"wId": WID, "toUser": apply["fromUser"], "content": WELCOME_MSG}) if r["code"] != "1000": db.mark("apply_log", key, status="need_compensate") # 待补发 db.save("apply_log", {"key": key, "wxid": apply["fromUser"], "status": "done"})落地建议
执行环节是好友管理的"最后一公里",做好才算真正自动化。四个要点里幂等最容易被忽略——不做好会导致客户收到重复消息,体验极差。建议上线前用重复回调压测验证幂等逻辑。好友管理接口参数说明参考 Eyun 开发文档,实例开通见 Eyun 官网。