开发实战

团购券核销错了能撤销吗?美团10分钟、抖音1小时的撤销规则与开发要点

核销服务由无限聚核提供,美团、抖音团购核销一站式接入。

目录(7 节)
  1. 一、两个平台的撤销时限
  2. 二、超过时限怎么办
  3. 三、撤销不等于退款
  4. 四、系统里的“撤销”功能怎么做
  5. 五、以无限聚核撤销接口为例
  6. 六、少核错,比会撤销更重要
  7. 七、常见问题

误核销在自助门店里并不少见:顾客一次扫了两张券,其实只想用一张;套餐选错了;连锁店把券核到了另一家分店;顾客刚核完就改了主意;或者核销成功了设备却没动作,顾客不想等了。做系统的开发者最常问的是:还能撤销吗?多久以内?撤销以后钱怎么退?

一句话回答: 能撤销,但有时间限制,而且撤销不等于退款。通过开放接口核销的美团团购券,按美团开放平台Go SDK中撤销验券接口的说明,只能撤销当前核销且核销未超过10分钟的券;抖音开放平台“撤销核销”接口文档写明,验券超过一个小时就不可再撤销,撤销后订单状态由“已使用”改回“待使用”。超过时限,接口就撤不了,只能按平台售后流程处理。撤销只改变券的使用状态,顾客的钱要走平台退款。系统里的撤销功能要显示剩余时间,先冻结店内权益,逐项看撤销结果,结果未知时先对账,不要反复点。通过无限聚核这类第三方接口核销的,用核销成功时保存的撤销凭证撤销。

美团核销后10分钟内、抖音核销后1小时内可以撤销,超过时限只能走平台售后的时间线示意图
时限示意:数据来自两个平台的开放接口说明,平台规则可能调整,以官方文档为准。

一、两个平台的撤销时限

平台 可撤销时限 来源(2026年9月28日核对) 撤销后
美团(开放接口核销) 只能撤销当前核销且核销未超过10分钟的券 美团开放平台Go SDK中撤销验券接口的参数说明;有赞帮助中心对接美团的说明为“仅当天订单在10分钟内的团购券可以撤回”,银豹接入美团团购的说明也是核销后10分钟内可反结账退回券 券恢复为未使用,具体状态以平台为准
抖音 验券超过一个小时不可再撤销 抖音开放平台“撤销核销”接口文档 订单状态由“已使用”改回“待使用”

有两点要注意:

  • 10分钟的依据是美团开放平台Go SDK中的接口参数说明,以及有赞、银豹等收银系统的公开说明;美团开放平台接口文档正文以登录后看到的为准。本文只讨论通过开放接口核销的团购券,使用其他收银系统的,以该系统的说明为准;
  • 撤销前最好确认顾客还在店内,撤销后当面告诉顾客券的状态和退款方式,避免顾客以为撤销就是退款。

二、超过时限怎么办

超过时限,撤销接口会直接拒绝。以抖音为例,接口文档的错误码说明里既有超过可撤销时间一类,也有按规则不支持撤销一类,具体错误码以文档为准。

这时候只能按平台的售后流程处理,例如由顾客在平台发起退款申请,或者商家联系平台客服,具体以平台规则为准。店内这边要同步处理:

  • 权益还没用的,先冻结,等平台售后结果出来再回收或恢复;
  • 权益已经用了的,按门店的售后规则处理;
  • 所有超时未撤销的记录单独标记,每天对账时统一跟进。

三、撤销不等于退款

撤销只做一件事:把券从“已使用”改回“未使用”。顾客的钱不会因为撤销自动退回,能不能退、退多少,按套餐的退款规则和平台售后流程处理。

所以面对“要退款”的顾客,处理顺序是:先看店内权益有没有用掉;没用掉的,冻结权益再撤销核销;撤销成功后告诉顾客在平台申请退款;权益已经用掉的,不再撤销核销,按平台售后规则处理。

四、系统里的“撤销”功能怎么做

撤销功能的处理流程:检查时限和权益状态,冻结权益,调用撤销接口,按逐项结果回收、恢复或进入待确认
流程示意:通用做法,不是真实后台界面。
  1. 只给有权限的店员。 顾客端不要开放“一键撤销”:顾客用完服务再撤销,券就回到了未使用状态。顾客点错的,可以提交“申请撤销”,由店员确认;
  2. 显示剩余时间。 按“核销时间 + 平台时限 − 当前时间”显示倒计时,并提前一两分钟关闭按钮,给网络和时钟误差留余量;
  3. 先检查权益,再冻结。 设备已经上电、顾客已经入场的,不走撤销,转人工售后。没用掉的,先冻结权益,再调撤销接口;
  4. 逐项看结果。 撤销成功就回收权益;被拒绝就恢复权益,并显示平台给出的原因;结果未知就进入“待确认”,先查券状态或对账,再决定是否重新撤销;
  5. 不要自动重试。 网络超时也要当作“结果未知”处理,请求可能已经到达平台;
  6. 留好记录。 操作人、原因、时间、撤销凭证和逐项结果都要存下来。
// 撤销前检查时限和权益状态,先冻结权益,再按逐项结果处理
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 里,只用于展示和排查。撤销核销不收费。

免费接入 · 按次计费

把美团、抖音团购核销接进你的业务

无限聚核提供美团、抖音、大众点评团购核销 API:不收接入费、无需保证金,核销成功才计费。

技术支持无限聚核白水客户经理联系名片及微信二维码