网易首页 > 网易号 > 正文 申请入驻

银行Webhook重复发送难题,NestJS怎么破?

0
分享至

为什么支付服务商明明只推送了一次“转账完成”通知,你的系统却总会收到两遍,甚至三遍?这个问题几乎困扰过每一家对接过银行或支付网关的金融科技公司。带着这个困惑,我们来看看如果接手一家银行的系统优化,一个NestJS后端要怎么从源头一步步搞定它。

问题出在一种叫“至少一次投递”的业内通用设计。从Stripe到Worldpay,再到银行转账网络,没有哪家服务商会承诺“精确一次”把事件送到。他们只会保证:只要没收到你返回的成功响应,就会一直重试。所以重复推送不是供应商的bug,而是你必须在接收端预期并处理的正常行为。现实里,服务端超时、网络抖动随时可能发生,供应商那边等不到你的200 OK,自然就把同一份事件又发了一次。

但很多开发者在写webhook入口时,第一反应都是“来了就处理”。比如下面这种常见的控制器写法:

@Controller('webhooks')export class WebhooksController {constructor(private readonly transactionsService: TransactionsService) {}@Post('payment-provider')async handleWebhook(@Body() payload: PaymentWebhookDto) {await this.transactionsService.markSettled(payload.transactionId);return { received: true };}

第一次收到事件时,一切正常。可一旦同一个事件被再次推送,这个方法会再次执行,把已经结算的交易又标记一次。如果里面触发了放款操作,就可能重复支出;如果绑定了通知服务,客户会收到两封一模一样的确认邮件。更麻烦的是,这类bug平时测试很难抓到,它总在真实重试压力下才会暴露。

在处理任何业务逻辑之前,首先要保证请求来源是可信的。支付服务商通常会用HMAC方式,通过一个共享密钥对整个请求体进行签名,并把签名放进请求头。接收端需要自己重新算一遍签名,再和传过来的值做比对。这一层校验可以用NestJS的守卫来实现,把未经验证的请求直接挡在路由外面:

@Injectable()export class WebhookSignatureGuard implements CanActivate {constructor(private readonly configService: ConfigService) {}canActivate(context: ExecutionContext): boolean {const request = context.switchToHttp().getRequest();const signature = request.headers['x-provider-signature'];const secret = this.configService.get('WEBHOOK_SECRET');const expectedSignature = crypto.createHmac('sha256', secret).update(JSON.stringify(request.body)).digest('hex');if (signature !== expectedSignature) {throw new UnauthorizedException('Invalid webhook signature');return true;}

有了签名校验,未经授权的POST请求会被立刻驳回。下一步更关键:让真正的业务处理代码可以在多次重复调用时依然保持数据正确。原文给出的方向是“让处理程序安全地运行多次”,也就是通常所说的去重。一个精心设计的webhook系统,需要根据事件携带的唯一标识来判断该事件是否已经被处理过,这种机制可以有效避免重复放款、重复邮件等连带影响。原文在这个环节的讨论只开了一个头,但足以点明:只要没做好幂等控制,后续所有的可靠保障都无从谈起。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
卡萨金娜海边婚礼引舆论风波,乌克兰球员犀利质疑到场同胞

卡萨金娜海边婚礼引舆论风波,乌克兰球员犀利质疑到场同胞

网球之家
2026-07-18 13:28:53
26岁身价170万欧!16场比赛狂轰13球,国足没有归化他后悔吗?

26岁身价170万欧!16场比赛狂轰13球,国足没有归化他后悔吗?

篮球圈里的那些事
2026-07-18 17:38:58
66岁演员王侃病逝,遗照曝光,父亲是老戏骨牛犇,白发人送黑发人

66岁演员王侃病逝,遗照曝光,父亲是老戏骨牛犇,白发人送黑发人

乡野小珥
2026-07-19 06:04:16
浙江一男子果园总被偷,村里无人承认,他悄悄洒上泻药,次日全村彻底傻眼

浙江一男子果园总被偷,村里无人承认,他悄悄洒上泻药,次日全村彻底傻眼

阿莱美食汇
2026-07-18 16:38:49
出差七天我的副总职位被顶替,我从容辞职,第二天公司亏损三百万

出差七天我的副总职位被顶替,我从容辞职,第二天公司亏损三百万

千秋文化
2026-07-15 19:55:40
6国争5金!国羽或2冠收官,女单世界冠军PK,石宇奇终结者登顶?

6国争5金!国羽或2冠收官,女单世界冠军PK,石宇奇终结者登顶?

刘姚尧的文字城堡
2026-07-19 07:04:25
毛岸青退休后享受的是什么级别的待遇?

毛岸青退休后享受的是什么级别的待遇?

历史点行
2026-07-16 19:47:39
“调解人”态度变了,巴基斯坦公开警告伊朗:别逼我们使用武力

“调解人”态度变了,巴基斯坦公开警告伊朗:别逼我们使用武力

动漫里的童话
2026-07-18 12:58:54
精神小妹的生活原来是这样的!网友:终于知道她们为啥都这么瘦了

精神小妹的生活原来是这样的!网友:终于知道她们为啥都这么瘦了

深度报
2026-02-11 23:35:03
上映7天,《功夫女足》就丢了冠军?章若楠新片7小时票房破2189万

上映7天,《功夫女足》就丢了冠军?章若楠新片7小时票房破2189万

墨印斋
2026-07-17 08:45:36
印度税务闹乌龙:罚比亚迪6.3亿,查无此公司

印度税务闹乌龙:罚比亚迪6.3亿,查无此公司

趣味萌宠的日常
2026-07-18 06:22:31
一觉醒来,白宫立大功?老杜案取消、莎拉即将翻盘,马科斯破防了

一觉醒来,白宫立大功?老杜案取消、莎拉即将翻盘,马科斯破防了

错过美好
2026-07-18 06:12:05
2-0,2-0,中超大乱套:降级区2队全赢了,申花泰山拉胯,成都队太稳了

2-0,2-0,中超大乱套:降级区2队全赢了,申花泰山拉胯,成都队太稳了

生活新鲜市
2026-07-19 00:47:22
一年级的小孩能有多可爱?网友:没有被知识污染过的天真

一年级的小孩能有多可爱?网友:没有被知识污染过的天真

夜深爱杂谈
2026-07-18 20:56:21
申花不敌津门虎,一切都怪大雨?薛庆浩再失误,感叹再无于汉超

申花不敌津门虎,一切都怪大雨?薛庆浩再失误,感叹再无于汉超

足坛刘脂导
2026-07-18 22:54:13
1天4个瓜!国外生子、被抓进去、自曝怀双胎、韩红最让人意外

1天4个瓜!国外生子、被抓进去、自曝怀双胎、韩红最让人意外

三石记
2026-06-25 11:54:09
35岁女子失业后找不到工作,索性把菜市场当仓库做外卖,月入过万

35岁女子失业后找不到工作,索性把菜市场当仓库做外卖,月入过万

捣蛋窝
2026-07-18 05:55:30
世界上最穷国:一辈子没见过肉,自行车是豪车,连跑步都不允许

世界上最穷国:一辈子没见过肉,自行车是豪车,连跑步都不允许

哄动一时啊
2026-06-07 14:23:50
火箭队连续捡漏?每年仅花1300万,签约4位外线强援!阵容再无短板

火箭队连续捡漏?每年仅花1300万,签约4位外线强援!阵容再无短板

熊哥爱篮球
2026-07-19 08:02:36
比亚迪车顶光伏实测:晒8小时充4度电,你们说这8000块花得值不值

比亚迪车顶光伏实测:晒8小时充4度电,你们说这8000块花得值不值

趣味萌宠的日常
2026-07-19 04:33:39
2026-07-19 09:39:00
码上闲叙
码上闲叙
有态度网友ytd
279文章数 71关注度
往期回顾 全部

科技要闻

WAIC2026看什么?这份"不迷路"攻略请收好

头条要闻

牛弹琴:一觉醒来中东杀红眼 伊朗让美军付出重大代价

头条要闻

牛弹琴:一觉醒来中东杀红眼 伊朗让美军付出重大代价

体育要闻

英格兰集体领铜牌 德尚最后一舞落泪

娱乐要闻

大S给具俊晔留遗产是昏头?实际上她清醒得很

财经要闻

任泽平VIP会员自称爆仓巨亏千万

汽车要闻

把中国超跑卖到英国,比亚迪正在被世界看见

态度原创

旅游
房产
教育
艺术
家居

旅游要闻

内蒙古自治区第36届旅游那达慕今日启幕

房产要闻

突然出手!千亩城更+一线江景,世嘉亮出超级四代宅!

教育要闻

河南公费师范生录取出现“冰火两重天”:北师大出现缺额,安阳师院全额录满,背后的原因是什么?

艺术要闻

蒋校长和郭沫若同题“黄帝陵”,水平谁高谁低?

家居要闻

2026建博会(广州) 公装联探展交流活动

无障碍浏览 进入关怀版