首页/新闻资讯/正文详情

erlang_pay 先验章,再拆包:支付回调的验签到底在防什么

发布时间:2026/9/26 19:18:32 来源:云帆数科 栏目:资讯中心
erlang_pay 先验章,再拆包:支付回调的验签到底在防什么
erlang_pay 系列第二篇。这篇不限于 Erlang——不管你用什么语言接支付回调验签的原理是同一套。第一篇erlang_pay为 Erlang 补上支付这块拼图想象一个场景。你的服务器收到一条 HTTP 请求内容大意是“你好我是支付宝。订单 R123用户已付款 1000 元请发货。”问题来了你怎么知道这条消息真的来自支付宝发送方可能是支付宝的通知服务器也可能是我——一台笔记本、一条curl命令就够了。如果你的服务器看到支付成功四个字就发货那你的商品等于免费送任何人只要知道你的回调地址和订单号格式就能伪造回调。防这个的机制就叫验签。用公文打个比方支付宝发来的每条通知都盖了一个防伪章你的服务器收件后第一件事不是拆包裹而是验章。章是假的包裹直接扔掉。erlang_pay 的铁律先验章再拆包这个库把先验签、后解析写成了不可绕过的规矩验签失败报文一个字节都不解析。不是解析的时候小心一点而是根本不碰。为什么顺序这么重要因为解析报文本身就有风险——恶意构造的数据可能在解析阶段触发各种意想不到的路径。章都没验凭什么拆人家的包裹三家机构的防伪章做法各不相同erlang_pay 三种都实现了机构章你验章用的钥匙支付宝RSA2 签名支付宝公钥微信 v3平台私钥签名 AES-256-GCM 加密的敏感字段微信平台公钥StripeHMAC-SHA256webhook secret开通 webhook 时给的那串前两种是非对称签名支付宝/微信用它们自己保管的私钥盖章你用公开的公钥验章。私钥不离手所以别人盖不出同样的章——这就是防伪的原理。Stripe 更轻量双方共享同一个 secret各自对报文算一遍 HMAC对得上就是真件。三个容易漏掉的防伪细节章的机制各家文档都写了但下面三个细节不做也不会立刻出事——出事的时候你甚至查不到被攻击了。erlang_pay 把它们做进了代码里。细节一防重放——门票当日有效攻击者拿到一条真实的回调报文比如从某处日志、网络截获自己不动手伪造直接原样重发 100 遍呢签名是真的验签全过——你的服务器就把同一个订单发货100 次。防法很朴素真通知里带时间戳过期不认。微信的回调带Wechatpay-Timestamp头erlang_pay 只接受与服务器时间相差±300 秒以内的通知源码里epay_wechat.erl的?NOTIFY_TOLERANCE 300。五分钟前的真件尚且拒收昨天捡来的票自然进不了场。细节二常量时间比较——对暗号不能露表情验签的最后一步是比较两个字符串算出来的签名和对方带来的签名。直觉写法是逐字符比第一个字符不同就返回假。问题出在返回得快上。逐字符比较遇到第一位不同立刻结束遇到完全相同才比到最后——耗时不一样。攻击者可以掐着秒表一位一位试以a开头的签名响应是不是快一点点这就叫计时攻击不用破解密码学靠表情猜出答案。erlang_pay 里验 HMAC 用的是自己实现的常量时间比较epay_crypto:constant_time_equal/2核心就一行循环ct_equal(A,RA/binary,B,RB/binary,Acc)-ct_equal(RA,RB,Accbor(AbxorB)).不管哪一位不同都把全部字符比完才给答案——比较过程没有表情。顺带说明两个串不等长时直接返回 false、不用逐字节比——用源码注释的原话说“长度本身非秘密”。细节三章是真的还要核对收件人假设验签通过——这确实是支付宝发的通知。还有一步是发给你的吗一个支付宝开放平台可以挂多个应用每家商户有自己的app_id。一条发给别人的支付成功通知别人的订单签名同样是真的。所以 erlang_pay 验完签还要核对通知里的app_id和你Cfg里的是否一致不一致返回app_id_mismatch。门卫验了工牌是真工牌还得对一下名单这位今天约的是不是你这间办公室。最重要的一条验签通过 ≠ 可以发货这是本篇最想纠正的误区。很多教程的代码长这样验签 → 拿到订单号 → 标记已支付 → 发货。中间缺了两步钱就漏了。erlang_pay 的 README 里写明了阶段语义值得每个做支付的人都抄下来verify_notify 通过 只证明一件事AUTHENTICATED —— 这条通知确实来自支付机构没被篡改 它不证明 ORDER_MATCHED —— 通知里的金额、订单和你数据库里的对得上 IDEMPOTENT —— 这条通知你没处理过重发的通知会来很多次 POSTABLE —— 这笔账现在该不该入订单状态可能不对验签只回答章是真的。名单要你自己对账要你自己记。回调可能来多次微信明确说通知可能重复同一单可能有多条金额不同的通知这些去重和匹配逻辑是你的业务责任库替你做不了也不该替你做。附一个宁可功能少的工程决策0.2 版本里 erlang_pay 有个模块epay_cert_mgr负责微信平台证书的自动下载、轮换和序列号管理。0.3.0 把它删了。原因写在 CHANGELOG 里证书生命周期的首次信任→轮换→serial 消费没有做成闭环留着它就有看起来生产可用的嫌疑。改成调用方自己注入平台公钥platform_public_key库只管验不管证书从哪来。做出删功能的决定比堆功能难。一个支付库里每个看起来自动化的环节都对应一份出了问题算谁的的责任——没把握闭环的宁可摆到明面上让你自己管。验签失败长什么样所有拒绝都有明确的错误码方便你排查为什么回调没生效错误码人话bad_signature章是假的或报文被改过missing_signature没带章serial_mismatch章是真的但用的钥匙版本对不上微信证书/公钥序列号不符timestamp_expired通知太旧疑似重放app_id_mismatch章真但收件人不是你每一条都对应上面讲的一个防伪环节。仓库信息GitHub: https://github.com/imboy-pub/erlang_payGitee: https://gitee.com/imboy-pub/erlang_payGitcode: https://gitcode.com/imboy/erlang_pay协议Apache-2.0版本0.3.02026-09-2321 个提交从 2026-06-14 到 2026-09-23自检命令rebar3 eunit213 用例、rebar3 dialyzer零警告、bash scripts/gate.sh清洁编译单测类型打包全门本文涉及代码均可复核src/epay_wechat.erl?NOTIFY_TOLERANCE 300、src/epay_crypto.erl:136constant_time_equal/2、src/erlang_pay.erl门面与错误合同、README「安全要点 / 错误码」。IMBoy一个开源可私有化的 IM 平台Erlang/OTP 后端要收钱就有了这个库。erlang_pay 从 IMBoy 项目里长出来然后独立成仓回馈社区——它不绑定 IMBoy任何需要接支付渠道的 Erlang/OTP 项目都可以直接拿去用。系列第三篇日元没有分退款要带流水号支付代码里两条要命的规矩

相关推荐

DeepSeek-OCR-2 DeepEncoder V2如何工作:Qwen2双注意力与CLIP视觉编码器终极对比解析
DeepSeek-OCR-2 DeepEncoder V2如何工作:Qwen2双注意力与CLIP视觉编码器终极对比解析

DeepSeek-OCR-2 DeepEncoder V2如何工作:Qwen2双注意力与CLIP视觉编码器终极对比解析 【免费下载链接】DeepSeek-OCR-2 Visual Causal Flow 项目地址: https://gitcode.com/gh_mirrors/de/DeepSeek-OCR-2 DeepSeek-OCR-2 是 DeepSeek 开源的文档 OCR 模型&am… · 2026/9/26 19:18:26

Atlas 300V 24G推理卡实战:从PyTorch到YOLO部署全流程
Atlas 300V 24G推理卡实战:从PyTorch到YOLO部署全流程

做AI应用落地的人,这两年应该没少听过“atlas”这个名字。尤其当你在跑目标检测、视频结构化这类业务,手里正好捏着几个YOLO模型,又不想把推理压力全压在GPU上时,Atlas这个系列的推理卡就会频繁出现在选择列表里。最近群里也总有人… · 2026/9/26 19:18:19

AI能替代电机瞬态动力学仿真吗?能辅助但别全信
AI能替代电机瞬态动力学仿真吗?能辅助但别全信

前两天有个做电机控制的同事问我:“AI现在这么热火朝天,电机瞬态动力学仿真这活儿,AI到底能做到什么程度?能不能直接甩给它?”我愣了一会儿,因为这问题看着简单,其实一句话回答不清楚。搞过电机… · 2026/9/26 19:18:19

室内人头检测YOLOv8数据集927张图训练实践与避坑指南
室内人头检测YOLOv8数据集927张图训练实践与避坑指南

简介:面向yolo系列目标检测算法学习者与室内监控场景开发者,该数据集包含927张室内人头检测图像及完整标注,可直接用于yolov5、yolov7、yolov8、yolov9、yolov10、yolo11等主流模型的训练与验证测试。压缩包共2000个文件,包含927个… · 2026/9/26 20:03:03

退款承诺何时算数、何时不算?2026 逐条对照兑现条件边界,平台保障一次讲清
退款承诺何时算数、何时不算?2026 逐条对照兑现条件边界,平台保障一次讲清

平台的退款承诺,是一份带条件的约定,而非一句笼统的保证。它写清了三件事:触发指标只认重复比例与 AIGC 检出比例,判断依据必须来自官方检测通道,审核周期为退款审核1-3个工作日。把这三件事看透,你才能判断… · 2026/9/26 20:02:55

Atlas 300V 24G上部署YOLO:从硬件认知到工程化落地全流程
Atlas 300V 24G上部署YOLO:从硬件认知到工程化落地全流程

我拿到这台服务器时,里面插着的正是Atlas 300V 24G。当时项目要求在这张卡上把YOLO跑起来,我在搜索引擎里也看到不少人问“atlas 300v 24g 是运算加速卡吗”。这里统一回答:它确实是运算加速卡,而且是一张专职干AI推理的加速卡&am… · 2026/9/26 20:02:55

用AI重构个人工作流:我如何把每天2小时的信息筛选压缩到10分钟
用AI重构个人工作流:我如何把每天2小时的信息筛选压缩到10分钟

每天早上9点,我的第一件事不是写代码,而是——刷信息。打开浏览器,依次访问5个招标公告网站,手动翻找与团队业务相关的政策动态和项目机会。然后打开3个行业资讯站,筛选有价值的技术趋势。最后,把认为“可能… · 2026/9/26 20:02:55

侧动式跳汰机|中粗粒重选核心装备,脉动分层提升重矿物回收效率
侧动式跳汰机|中粗粒重选核心装备,脉动分层提升重矿物回收效率

侧动式跳汰机|中粗粒重选核心装备,脉动分层提升重矿物回收效率在重力选矿体系中,跳汰选矿依托矿物间比重差异实现分选,是应用历史久、经济性突出的重选工艺。侧动式跳汰机作为跳汰设备主流机型之一,依靠独特的侧部脉动… · 2026/9/26 20:02:55

AI编程工具ZCode被曝后台静默上传代码与Git历史,实测排查全过程
AI编程工具ZCode被曝后台静默上传代码与Git历史,实测排查全过程

1. 事件背景与排查动机1.1 一个让我后背发凉的发现事情起因很简单。上周三晚上,我在给一个客户做代码审计的间隙,顺手打开网络监控面板看了一眼。结果发现一个让我瞬间清醒的现象:我的开发机上,一个AI编程工具的进程正在持续向外部… · 2026/9/26 20:02:55

数据库课后习题答案别硬背:当测试用例集刷,效率翻倍
数据库课后习题答案别硬背:当测试用例集刷,效率翻倍

简介:万常选版《数据库原理与设计》课后习题答案资源,覆盖第2至6章及第9章,适合正在学习关系模型、数据库建模、关系数据理论与模式求精的本科生、自学者作为复习与自测材料。压缩包共7个文件,含3个doc参考答案、2个sql示例脚本、… · 2026/9/26 0:00:21

OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置
OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 0:00:40

向下兼容与向上兼容:接口设计中的兼容性策略与工程实践
向下兼容与向上兼容:接口设计中的兼容性策略与工程实践

一次版本升级事故,是很多团队绕不过去的坎。线上环境里,服务端明明已经上线了新版接口,老的移动端还在照着旧文档传参数。请求一到网关,校验直接拒绝,用户操作失败,客服群炸了锅,开发群里开始互… · 2026/9/26 0:00:46

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码