团购券核销错了能撤销吗?美团10分钟、抖音1小时的撤销规则与开发要点
核销服务由无限聚核提供,美团、抖音团购核销一站式接入。

误核销在自助门店里并不少见:顾客一次扫了两张券,其实只想用一张;套餐选错了;连锁店把券核到了另一家分店;顾客刚核完就改了主意;或者核销成功了设备却没动作,顾客不想等了。做系统的开发者最常问的是:还能撤销吗?多久以内?撤销以后钱怎么退?
一句话回答: 能撤销,但有时间限制,而且撤销不等于退款。通过开放接口核销的美团团购券,按美团开放平台Go SDK中撤销验券接口的说明,只能撤销当前核销且核销未超过10分钟的券;抖音开放平台“撤销核销”接口文档写明,验券超过一个小时就不可再撤销,撤销后订单状态由“已使用”改回“待使用”。超过时限,接口就撤不了,只能按平台售后流程处理。撤销只改变券的使用状态,顾客的钱要走平台退款。系统里的撤销功能要显示剩余时间,先冻结店内权益,逐项看撤销结果,结果未知时先对账,不要反复点。通过无限聚核这类第三方接口核销的,用核销成功时保存的撤销凭证撤销。

一、两个平台的撤销时限
| 平台 | 可撤销时限 | 来源(2026年9月28日核对) | 撤销后 |
|---|---|---|---|
| 美团(开放接口核销) | 只能撤销当前核销且核销未超过10分钟的券 | 美团开放平台Go SDK中撤销验券接口的参数说明;有赞帮助中心对接美团的说明为“仅当天订单在10分钟内的团购券可以撤回”,银豹接入美团团购的说明也是核销后10分钟内可反结账退回券 | 券恢复为未使用,具体状态以平台为准 |
| 抖音 | 验券超过一个小时不可再撤销 | 抖音开放平台“撤销核销”接口文档 | 订单状态由“已使用”改回“待使用” |
有两点要注意:
- 10分钟的依据是美团开放平台Go SDK中的接口参数说明,以及有赞、银豹等收银系统的公开说明;美团开放平台接口文档正文以登录后看到的为准。本文只讨论通过开放接口核销的团购券,使用其他收银系统的,以该系统的说明为准;
- 撤销前最好确认顾客还在店内,撤销后当面告诉顾客券的状态和退款方式,避免顾客以为撤销就是退款。
二、超过时限怎么办
超过时限,撤销接口会直接拒绝。以抖音为例,接口文档的错误码说明里既有超过可撤销时间一类,也有按规则不支持撤销一类,具体错误码以文档为准。
这时候只能按平台的售后流程处理,例如由顾客在平台发起退款申请,或者商家联系平台客服,具体以平台规则为准。店内这边要同步处理:
- 权益还没用的,先冻结,等平台售后结果出来再回收或恢复;
- 权益已经用了的,按门店的售后规则处理;
- 所有超时未撤销的记录单独标记,每天对账时统一跟进。
三、撤销不等于退款
撤销只做一件事:把券从“已使用”改回“未使用”。顾客的钱不会因为撤销自动退回,能不能退、退多少,按套餐的退款规则和平台售后流程处理。
所以面对“要退款”的顾客,处理顺序是:先看店内权益有没有用掉;没用掉的,冻结权益再撤销核销;撤销成功后告诉顾客在平台申请退款;权益已经用掉的,不再撤销核销,按平台售后规则处理。
四、系统里的“撤销”功能怎么做

- 只给有权限的店员。 顾客端不要开放“一键撤销”:顾客用完服务再撤销,券就回到了未使用状态。顾客点错的,可以提交“申请撤销”,由店员确认;
- 显示剩余时间。 按“核销时间 + 平台时限 − 当前时间”显示倒计时,并提前一两分钟关闭按钮,给网络和时钟误差留余量;
- 先检查权益,再冻结。 设备已经上电、顾客已经入场的,不走撤销,转人工售后。没用掉的,先冻结权益,再调撤销接口;
- 逐项看结果。 撤销成功就回收权益;被拒绝就恢复权益,并显示平台给出的原因;结果未知就进入“待确认”,先查券状态或对账,再决定是否重新撤销;
- 不要自动重试。 网络超时也要当作“结果未知”处理,请求可能已经到达平台;
- 留好记录。 操作人、原因、时间、撤销凭证和逐项结果都要存下来。
// 撤销前检查时限和权益状态,先冻结权益,再按逐项结果处理
func RevokeRedemption(ctx context.Context, r Redemption, operator, reason string) error {
limit := map[int]time.Duration{1: 10 * time.Minute, 2: time.Hour}[r.Platform] // 1美团 2抖音
if time.Since(r.ConsumedAt) > limit-time.Minute { // 留1分钟余量
return ErrRevokeWindowClosed // 引导走平台售后
}
if r.BenefitUsed {
return ErrBenefitUsed // 已上电或已入场,转人工售后
}
if err := benefits.Freeze(ctx, r.BenefitID, operator, reason); err != nil {
return err
}
resp, err := hexiao.Cancel(ctx, CancelRequest{ // 调用无限聚核“撤销核销”接口
ShopID: r.ShopID,
Platform: r.Platform,
ConsumeCredential: []string{r.ConsumeCredential}, // 核销成功时按下标保存的凭证
})
if err != nil {
return markPending(ctx, r, operator) // 超时或网络错误:结果未知,待对账
}
if len(resp.Data) == 0 { // 整笔请求被拒(如 CREDENTIAL_INVALID),没有逐项结果
return benefits.Unfreeze(ctx, r.BenefitID, resp.ErrorCode)
}
switch item := resp.Data[0]; item.Status {
case "succeeded":
return benefits.Revoke(ctx, r.BenefitID, operator)
case "rejected":
return benefits.Unfreeze(ctx, r.BenefitID, item.Message) // message 只用于展示
default:
return markPending(ctx, r, operator) // unknown:先查券状态或对账
}
}
五、以无限聚核撤销接口为例
通过无限聚核V2聚合接口核销的券,用“撤销核销”接口撤销。当前公开API文档写明:
- 请求传原核销记录所属的具体门店
shopId、platform,以及consumeCredential数组,长度1到10; consumeCredential取自核销成功响应顶层的consumeCredential[],与响应data[i]按下标一一对应,核销成功时就要按下标存好;- 只有全部凭证都撤销成功时,顶层
success才为true,code为10000;部分成功、被拒绝或结果未知时code为10001; data[].status为succeeded、rejected或unknown。平台拒绝时data[].message为“平台拒绝撤销:平台原因”,只用于展示和排查,程序以status为准;- 接口不做幂等,相同凭证重复请求仍会再次请求平台。结果是
unknown时,先查券状态或对账,再决定是否重新撤销; - 只支持新版V2聚合核销返回的凭证,凭证必须属于当前账号、
shopId和platform;V1、平台原生接口和历史无凭证的记录不能通过它撤销; - 撤销免费,重复撤销不会重复增加本地撤销计数。
POST /api/hexiao/v2/ddzh-tuangou-receipt-cancel
Authorization: Bearer <key>
Content-Type: application/json
{
"shopId": 123,
"platform": 2,
"consumeCredential": ["<核销成功时保存的凭证>"]
}
平台的撤销时限不会因为走第三方接口而变长:美团超过10分钟、抖音超过1小时,撤销请求一样会被平台拒绝。
六、少核错,比会撤销更重要
撤销有时限、有风险,最好的办法是一开始就别核错:
- 验券后让顾客确认。 页面显示套餐名称、售卖价和适用门店,顾客点“确认使用”才核销;
- 一次只核一张。 顾客有多张券时,逐张确认,页面显示“本次核销1张”;
- 门店不要选错。 连锁店的每家门店在无限聚核里是不同的具体门店
shopId,扫码入口要和门店绑定,不让顾客手动选门店; - 确认按钮防连点。 核销请求在途时按钮置灰;
- 核销前检查设备。 设备离线就提示换工位或换台,别让顾客先核销再发现用不了。
七、常见问题
美团团购券核销后多久内可以撤销?
通过开放接口核销的,按美团开放平台Go SDK中撤销验券接口的说明,只能撤销当前核销且核销未超过10分钟的券;有赞帮助中心对接美团的说明也是当天订单10分钟内可撤回。使用其他收银系统的,以该系统的说明为准。
抖音团购券核销后多久内可以撤销?
抖音开放平台“撤销核销”接口文档写明,验券超过一个小时就不可再撤销;撤销成功后,订单状态由“已使用”改回“待使用”。
超过撤销时间了怎么办?
接口撤不了,只能按平台售后流程处理,例如顾客在平台申请退款或商家联系平台客服。店内权益没用的先冻结,等售后结果再回收或恢复。
撤销核销以后,顾客的钱会自动退回吗?
不会。撤销只把券改回未使用状态,退款要按套餐的退款规则走平台售后流程。
撤销接口返回结果未知,可以再点一次吗?
不要直接再点。先查券状态或对账,确认没有撤销成功再重新发起。以无限聚核接口为例,撤销接口不做幂等,相同凭证重复请求会再次请求平台。
可以让顾客在小程序里自己撤销核销吗?
不建议开放一键撤销。顾客用完服务再撤销,券就回到了未使用状态。可以让顾客提交撤销申请,由店员检查权益没用过后再撤销。
无限聚核撤销核销接口失败时会返回哪些 errorCode?
整笔请求被拒绝时看顶层 errorCode:CREDENTIAL_INVALID 表示撤销凭证无效,或不属于当前门店、平台;CANCEL_UNSUPPORTED 表示这条核销记录不支持撤销;另外还有 INVALID_PARAM、STORE_NOT_FOUND、PLATFORM_UNAUTHORIZED 等通用错误。请求到达平台后,结果看逐项的 data[].status:succeeded、rejected 或 unknown,平台拒绝的原因在 data[].message 里,只用于展示和排查。撤销核销不收费。



