PAIBAOWORK · B2B DIGITAL GROWTHB2B 建站 · WhatsApp 客户沟通 · AI CRM

指南

微信支付接入两天,把派宝变成了 4 个项目的支付中转站

中国市场 SaaS 才有的一种架构变形——ICP 备案约束直接重塑了系统拓扑。微信/支付宝 notify_url 必须指向已 ICP 备案的域名,于是派宝成了整个家族的统一支付 webhook 入口。

先看答案

中国市场 SaaS 才有的一种架构变形——ICP 备案约束直接重塑了系统拓扑。微信/支付宝 notify_url 必须指向已 ICP 备案的域名,于是派宝成了整个家族的统一支付 webhook 入口。

关键事实

一手经验复盘(泓森互联内部实践)
中国市场 SaaS 才有的一种架构变形——ICP 备案约束直接重塑了系统拓扑
来源 数据截至

参考来源

最近复核

常见问题

为什么微信支付回调必须指向已备案域名?

在中国内地,支付宝和微信支付的商户后台要求回调地址使用已完成 ICP 备案的域名,未备案域名会被直接拒绝。

统一支付中转会不会把密钥集中到一个项目?

不会。中转站只搬运原始请求字节,不解密、不预验签;私钥留在各项目里,由下游收到转发后自己验签,信任边界没有下移。

转发失败时支付结果会丢吗?

中转站会对网关立即返回成功,转发失败由网关侧的指数退避重试覆盖;下游验签失败的补偿机制(异常队列加告警)是下一步要补的开放问题。

Day 1:补齐第三个支付渠道

项目

域名

ICP 状态

能直接收 notify_url

派宝

派宝.com

✅ 已备案

Portal

ip.digitalforce.cc

❌ digitalforce.cc 未备案

AutoGlobal

autoglobal.ai

❌ .ai 不可备案

Realnator

realnator.com

❌ 未备案

ClawOps

clawops.digitalforce.cc

❌ 同上

原则

为什么

派宝不预验签

私钥/AES-GCM key 留在每个项目里,不让派宝看见。派宝只搬运字节。

派宝透传原始 POST body

微信 APIv3 的签名是 timestamp + nonce + body 的 SHA256-RSA。改一个字符整个签名废掉。

派宝立即返回成功

支付宝 5s、微信 10s 内必须收到 success token,否则触发重试风暴。派宝即返即转。

下游自己验签

收到转发的 alipay-* / wechatpay-* 头之后,目标项目用自己的私钥重新验签。Trust 边界没下移。

fire-and-forget 转发

转发失败不影响派宝给网关回 success。网关侧的指数退避重试覆盖瞬时网络故障。

strip hop-by-hop headers

Connection/Keep-Alive/Transfer-Encoding 不应该跨 hop 透传,但 Content-Type 和签名头要保留。

单看一个 commit 是"feat: 加个微信支付"。 单看下一个 commit 是"feat: 加个 webhook relay"。 串起来看,是中国市场 SaaS 才有的一种架构变形——ICP 备案约束直接重塑了系统拓扑

派宝早就接了 Stripe + 支付宝。微信支付一直缺,直到这周才补上:

设计上的一个小决定:wechat_sign.py 用纯 stdlib 实现,139 行

不是图省事。微信官方 Python SDK 拖一长串依赖(cryptography、requests、urllib3 老版本),上线就要重打镜像。stdlib 实现意味着:

升级路径也复用了 Alipay 那套:PLANPRICEFENCN 和 PLANQUOTAS 两个常量被两个 router 共享——保证微信付费的租户和支付宝付费的租户拿到完全一致的配额

到这里都还是工程上的"add another channel"故事,没什么稀奇。

微信支付商户后台让我们填 notify_url——这是支付成功后微信回调的目标地址。

填了派宝的回调地址(派宝.com 域名下)——✅ 通过。

填到下一个项目 Portal 的回调地址(ip.digitalforce.cc 域名下)——❌ 拒绝。

理由:该域名未经 ICP 备案

中国内地的事实:支付宝 + 微信支付的 notify_url 必须指向已 ICP 备案的域名。我们 4 个 CN 业务项目里,只有"派宝.com"(punycode: xn--pbt132b.com)走完了备案:

正常解法是给每个项目单独备案——周期 20-40 工作日 × 4,加上各种公司材料反复来回。我们等不起。

所以做了另一个选择:让派宝成为整个家族的统一支付 webhook 入口

┌─────────────────────┐ ┌───────────────────────┐ │ Alipay / WeChat Pay │ ────notify_url────────► │ 派宝.com (派宝) │ │ (商户后台填的) │ (备案域名) │ 支付转发入口 │ └─────────────────────┘ └──────────┬────────────┘ │ 透明转发原始 │ POST body + headers ┌───────────────┼────────────────┐ ▼ ▼ ▼ ip.digitalforce autoglobal.ai realnator.com /webhook/... /webhook/... /webhook/... (Portal 自己验签 + 处理) 新增两个转发入口:一个转发支付宝 form-encoded 回调,一个转发微信 APIv3 加密回调。

路由表用环境变量覆盖:PAYMENTRELAY{PROJECT}{GATEWAY}——例如 PAYMENTRELAYPORTALWECHAT 指向 ip.digitalforce.cc 的 webhook 地址。

很容易把转发器写成"先解密 + 验签,再转发已验证的数据给下游"。这是错的。我们的设计:

这个设计让派宝在合规边界上只承担"备案域名"这一项责任,密钥管理和支付逻辑还是各项目自治。

意料之外的好处:现在 4 个项目的支付回调全部经过派宝同一个 access log。

[wechat-relay] target=portal forwardok=true upstreamstatus=200 60ms [alipay-relay] target=realnator forwardok=true upstreamstatus=200 42ms [wechat-relay] target=autoglobal forwardok=false upstreamstatus=503 timeout=5s 一个 grafana panel 看穿所有项目的支付健康度。以前要登 4 台服务器分别 tail -f。

下游项目验签失败时,回滚机制还没设计好。当前的"派宝立即对网关回 success + 转发失败被吞掉"模式意味着:如果 Portal 验签失败(比如配置过期的 platform cert),用户的钱已经付了,但 Portal 的订单状态不会变。

正在做的改进方向:

这块还在草案阶段,等下个迭代落实。

这个故事的全部价值不在"我们写了一个转发器"——而在:

某个看似无关的政策约束("必须 ICP 备案才能填 notify_url")会向上传导,重塑你的系统拓扑。

如果你的 SaaS 要进中国市场,提前问自己:

跨过这个坑的成本可能是两天,也可能是两个月。

  1. 创建订单:返回支付地址,前端渲染成二维码

  2. 订单查询:用户在微信里付钱时,前端轮询订单状态

  3. 支付回调:验签 + AES-256-GCM 解密 + 升级租户

  4. 容器层不变

  5. portal 那边 TypeScript 可以做镜像实现(static-ip-portal/lib/payment/wechat-sign.ts),两端签名逻辑可逐行对照审计

  6. 升级到 APIv4 时只需要改这一个文件,不用换 SDK 版本

  7. 派宝侧 AuditLog 记每次转发结果

  8. 下游验签失败必须主动 webhook 回到派宝的 /relay/dlq 异常队列

  9. dlq 触发运营告警

  10. 你的网关回调域名能不能备案?

  11. 你的多产品矩阵里有没有可以备案的"母舰域名"?

  12. 你的转发器有没有正确处理签名透传?

需要把这个方法,用到您的业务中?

带上当前网站、重点市场和客户问题,一起判断最值得先做什么。

INQUIRY

读完有想法?聊聊你的业务

留下你的情况,我们带着具体建议回复你——不推销,先给判断。

WhatsApp 咨询