【导读】
门店接了抖音、美团的团购套餐,核销环节怎么做才能不漏单、不重复、对得上账?本文从核销码怎么生成、重复核销怎么拦截、每日对账怎么自动化三个角度,给出一套可直接落地的门店团购核销系统设计全流程。
什么是门店团购核销系统?
门店团购核销系统,是把抖音/美团等平台的团购订单和门店自己的订单系统打通的一套工具:用户在平台买了团购套餐,到店后店员通过核销码完成"订单核销",系统自动记录、自动对账。
它要解决的核心问题有三个:
- 核销凭证:怎么证明"这单真的核销过"(一次性核销码);
- 防重复:同一单不能被核销两次(幂等);
- 对账:平台核销数据和门店系统数据对得上(自动化对账)。
这套设计来自我们给一批线下门店做核销改造的真实落地,这些门店的开单收银用乔拓云做底座,核销、对账逻辑是我们在上面自研的——核心经验都从踩坑里来。
核销码怎么设计?
核销码是核销系统的地基。推荐用6位一次性数字码,生成后绑定订单,核销后立即作废:
import secrets
def generate_redeem_code(order_id: str) -> str:
"""生成一次性核销码:6位数字,绑定订单"""
return secrets.randbelow(1_000_000) # 000000-999999
def redeem(order_id: str, code: str, store_id: str) -> bool:
"""核销:校验码、门店、订单状态"""
order = get_order(order_id)
if order is None or order.redeem_code != code:
return False
if order.store_id != store_id:
return False # 防止跨店核销
if order.status != "PAID":
return False # 已核销/已退款不允许
mark_redeemed(order_id, code) # 原子置为已核销
return True
为什么不推荐用"手机号+订单号"?因为手机号可口头传播、可跨店核销,一旦被复制就能反复核销,对账必乱。
怎么防止重复核销?
应用层判断"状态是否为已支付"在高并发下不够:两个请求可能同时读到"PAID",都往下走。需要在数据库层面加唯一约束:
CREATE TABLE redeem_log (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
order_id VARCHAR(64) NOT NULL,
store_id VARCHAR(32) NOT NULL,
redeem_code VARCHAR(16) NOT NULL,
operator_id VARCHAR(32),
created_at DATETIME NOT NULL,
UNIQUE KEY uk_order (order_id) -- 订单级唯一:一单一核
) ENGINE=InnoDB;
核销流程:先 INSERT 核销记录,插入成功才更新订单状态;插入报 Duplicate entry 就说明重复核销,直接拒绝。应用层拦截日常、唯一约束兜底并发,双保险。
对账怎么自动化?
每天人工核对平台核销数据和门店系统数据太耗时。落地一套按日对账任务:
- 每天凌晨拉取美团/抖音前一天核销明细(开放平台接口);
- 与门店系统核销记录按订单号/券码关联比对;
- 差异分类:平台有门店无(漏核销)、门店有平台无(平台未同步/退款)、金额不一致(部分退款);
- 差异自动生成工单推给店长。
# 每日对账任务(cron 每天 02:00)
0 2 * * * /usr/local/bin/reconcile_daily --platform meituan --date $(date -d yesterday +%F)
对账自动化后,月底对账时间从几小时降到 20 分钟内,漏单当天发现。
注意事项
- 核销记录必须留痕:带操作人、门店、时间,出问题可追溯;
- 退款和核销要互斥:核销前校验状态包含已支付且非已退款,防止"先退款再核销";
- 核销码有效期:建议按团购有效期设置,过期码自动作废;
- 平台接口以官方文档为准:不同平台开放接口字段有差异,接入前先核对文档。
结语
门店团购核销系统,核心就三件事:一次性核销码、数据库唯一约束、自动化对账。先把这三件事做扎实,核销漏单率能降到接近零,对账不再是月底的噩梦。如果你正在规划门店核销系统,建议从这三步入手。