惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

L
LangChain Blog
Scott Helme
Scott Helme
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Stack Overflow Blog
Stack Overflow Blog
Forbes - Security
Forbes - Security
T
The Blog of Author Tim Ferriss
Y
Y Combinator Blog
S
Schneier on Security
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Cisco Talos Blog
Cisco Talos Blog
N
News | PayPal Newsroom
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Project Zero
Project Zero
Cyberwarzone
Cyberwarzone
Vercel News
Vercel News
M
MIT News - Artificial intelligence
云风的 BLOG
云风的 BLOG
Google Online Security Blog
Google Online Security Blog
Simon Willison's Weblog
Simon Willison's Weblog
MongoDB | Blog
MongoDB | Blog
Martin Fowler
Martin Fowler
T
Tenable Blog
I
InfoQ
W
WeLiveSecurity
Google DeepMind News
Google DeepMind News
G
Google Developers Blog
D
DataBreaches.Net
博客园 - Franky
Know Your Adversary
Know Your Adversary
Spread Privacy
Spread Privacy
S
Security @ Cisco Blogs
Hacker News: Ask HN
Hacker News: Ask HN
J
Java Code Geeks
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
F
Full Disclosure
C
Cisco Blogs
Google DeepMind News
Google DeepMind News
P
Proofpoint News Feed
C
CXSECURITY Database RSS Feed - CXSecurity.com
The Cloudflare Blog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
I
Intezer
The GitHub Blog
The GitHub Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
F
Fortinet All Blogs
Jina AI
Jina AI
V
Visual Studio Blog
L
LINUX DO - 热门话题
WordPress大学
WordPress大学
aimingoo的专栏
aimingoo的专栏

博客园 - ace--碳水化合物

English1 Tidio 官方帮助中心 ERP 相关系统介绍 蝉翼定理 选配法 利润最大化公式 写在失业的一段话 排列组合-组合 在线简历 概率论与数理统计学习章节 绝对值 比例五大定理 算术平均值与几何平均值 等价符号 公因数与最大公因数 容斥原理 英语2026 机器学习,深度学习,强化学习 分别是什么以及区别是什么 深度学习 监督学习 FAQ IVR TTS选择 k 近邻算法 kaldi 平稳核函数(stationary kernel) Karush-Kuhn-Tucker 条件 凸二次规划(convex quadratic programming) FunASR+FreeSwitch做坐席客服系统记录 freeswitch原理图 客服系统,第三方平台,对话转录音,这些可以不依赖第三方做么 STUN服务器 Gun.js原理 游戏升级记 10 OBB 边界问题 关于yolo26是否可以通过结合java开发 opencv和yolo是一回事情吗 pytorch TorchVision - ace--碳水化合物 PyTorch 和 FashionMNIST 的关系 java record 游戏升级记 9 VibeVoice实现90分钟、多角色播客生成,拓展语音合成新边界 同 WiFi 下用 Claude Code 控制另一台 Windows 电脑 Numpy 1 游戏升级记 8 开源claudecode前端 github star 9k+ 向量数据库skill 游戏升级记 7 游戏升级记 6 关系型数据库,向量数据库,ES,缓存,列式数据库,时序数据库,图数据库等的区别和共同点列举table 多Agent可视化 Agent设计模式 中文 Hermes+Obsidian+LLM wkii,构建AI知识库 Claude Code 前端工程泄露代码开源 游戏升级记 5 ai记忆 Rag 1 游戏升级记 4 游戏升级记 3 游戏升级记 2 AI学习路线 关于hermes agent安装 1 游戏升级记 1 代码迷踪 十三 代码迷踪 十二 ai智能体工程 Rust vs Go 微信小程序实名认证 怎样制作一个街机游戏 跟Claude code说 深入思考 它会思考更深入. googlebusiness profile设置统一白名单的操作,要弹窗模式的 该怎样利用ollama自己训练一个编程大模型 中华AI智能体编程一站式基站构想 打包网站到exe和app 识别的内容一般是试题模板的题号和手写的答题答案(数字) opencv怎么训练 在线SaaS系统做接口版本滚动更新 error: linker `link.exe` not found | = note: program not found - rust 给我一份关于stripe平台的使用开发说明 c++学习记20260219 奥数-平面几何经典定理 奥数-组合数学 奥数-几何 奥数-代数 奥数-数论
stripe相关支付流程 流程示意图
ace--碳水化合物 · 2026-03-06 · via 博客园 - ace--碳水化合物

以下是一个标准的 Stripe 支付流程示意图,涵盖了从用户点击支付到最终完成的完整数据流向:

Stripe 支付核心流程图

┌─────────────┐         ┌──────────────┐         ┌─────────────┐
│   用户端     │         │   你的服务器   │         │   Stripe    │
│  (浏览器/App)│         │  (后端API)    │         │   (支付网关) │
└──────┬──────┘         └──────┬───────┘         └──────┬──────┘
       │                        │                        │
       │  1. 请求创建支付        │                        │
       │ ──────────────────────>│                        │
       │                        │                        │
       │                        │  2. 创建 PaymentIntent │
       │                        │ ──────────────────────>│
       │                        │                        │
       │                        │  3. 返回 client_secret │
       │                        │ <──────────────────────│
       │                        │                        │
       │  4. 返回 client_secret  │                        │
       │ <──────────────────────│                        │
       │                        │                        │
       │  5. 用户填写支付信息     │                        │
       │    (Card Element)      │                        │
       │ ───────────────────────────────────────────────>│
       │                        │                        │
       │  6. Stripe.js 处理支付  │                        │
       │ <───────────────────────────────────────────────│
       │    (显示成功/失败)       │                        │
       │                        │                        │
       │                        │  7. Webhook 通知       │
       │                        │ <──────────────────────│
       │                        │   (payment_intent.succeeded)
       │                        │                        │
       │  8. 查询支付状态         │                        │
       │ ──────────────────────>│                        │
       │                        │  9. 返回订单确认        │
       │ <──────────────────────│                        │
       │                        │                        │

详细流程说明

阶段1:初始化支付 (步骤1-4)

  1. 前端请求:用户点击"立即支付",前端向后端API发送请求,包含金额、货币类型等信息
  2. 创建PaymentIntent:后端使用Secret Key调用Stripe API创建支付意图
  3. 返回client_secret:Stripe生成并返回一个临时的client_secret给后端
  4. 传递到前端:后端将client_secret返回给前端,前端将其保存在内存中

阶段2:用户支付 (步骤5-6)

  1. 收集支付信息:前端渲染Stripe Elements组件(Card Element或Payment Element),用户输入卡号、有效期、CVC等信息
  2. 确认支付:前端调用stripe.confirmCardPayment(client_secret, payment_method),将加密的支付信息直接发送到Stripe(注意:卡信息不经过你的服务器,直接发送给Stripe,这大大降低了你的PCI合规负担)

阶段3:异步通知 (步骤7)

  1. Webhook回调:支付完成后,Stripe会向你在仪表盘配置的Webhook URL发送异步通知(如payment_intent.succeeded
    • 关键点:这是最可靠的支付成功确认方式,应在此更新订单状态
    • 需要考虑网络延迟和重试机制

阶段4:结果反馈 (步骤8-9)

  1. 前端轮询/查询:支付成功后,前端可以主动查询订单状态
  2. 返回确认:后端验证Webhook已处理后,向前端返回最终订单确认信息

不同支付模式的流程对比

方案A:Stripe Checkout(托管页面)

用户 ──> 点击支付 ──> 后端创建Checkout Session ──> 302重定向到Stripe页面 ──> 
用户输入卡信息 ──> 支付完成 ──> 重定向回你的网站(success_url/cancel_url) ──>
Stripe发送Webhook ──> 后端更新订单

优点:实现最快,PCI合规完全由Stripe负责
缺点:用户会离开你的网站

方案B:Payment Element(嵌入式)

用户 ──> 在你网站填写表单 ──> 前端渲染Stripe组件 ──> 
用户直接在当前页面支付 ──> 支付结果实时返回 ──> 
Webhook异步确认

优点:用户体验最好,用户不离开你的网站
缺点:需要更多前端开发工作

方案C:订阅支付流程

用户订阅 ──> 创建订阅(含试用期) ──> 生成发票 ──> 
首次支付 ──> 后续周期自动扣款 ──> 
Webhook处理:invoice.paid(成功) / invoice.payment_failed(失败)

状态流转图

PaymentIntent状态机:
           
           ┌─────────────┐
           │ requires_   │
           │ payment_    │
           │ method      │
           └──────┬──────┘
                  │ 用户提交支付信息
                  ↓
           ┌─────────────┐
           │ requires_   │
           │ action      │ ◄──── 3D Secure验证
           │ (3DS)       │
           └──────┬──────┘
                  │ 验证通过
                  ↓
           ┌─────────────┐
           │ processing  │ ────► 异步处理中
           └──────┬──────┘
                  │ 成功    │ 失败
                  ↓         ↓
           ┌─────────────┐ ┌─────────────┐
           │ succeeded   │ │ requires_   │
           │             │ │ payment_    │
           │             │ │ method      │
           └─────────────┘ └─────────────┘

关键设计要点

  1. 幂等性:创建PaymentIntent时使用idempotency_key,防止重复扣款
  2. Webhook重试:Stripe会尝试发送Webhook最多3天,你的端点需要是幂等的
  3. 3D Secure:自动处理,返回requires_action状态时前端需调用handleCardAction
  4. 错误处理:支付失败、卡被拒、网络超时等情况都需要有优雅的降级方案

代码伪代码流程

// 前端
async function handlePayment() {
  // 1. 获取clientSecret
  const { clientSecret } = await fetch('/api/create-payment', {
    method: 'POST',
    body: JSON.stringify({ amount: 1000 })
  }).then(r => r.json());
  
  // 2. 确认支付
  const { error, paymentIntent } = await stripe.confirmPayment({
    elements,
    clientSecret,
    confirmParams: { return_url: 'https://your-site.com/success' }
  });
  
  // 3. 处理结果
  if (error) showError(error.message);
}

// 后端 - 创建PaymentIntent
app.post('/api/create-payment', async (req, res) => {
  const paymentIntent = await stripe.paymentIntents.create({
    amount: req.body.amount,
    currency: 'usd',
    automatic_payment_methods: { enabled: true }
  });
  res.json({ clientSecret: paymentIntent.client_secret });
});

// 后端 - Webhook处理器
app.post('/webhook', bodyParser.raw({type: 'application/json'}), (req, res) => {
  const sig = req.headers['stripe-signature'];
  const event = stripe.webhooks.constructEvent(req.body, sig, webhookSecret);
  
  switch(event.type) {
    case 'payment_intent.succeeded':
      // 更新订单状态为已支付
      break;
  }
});

这个流程确保了支付的安全性和可靠性,同时将敏感信息处理交由Stripe负责,最大限度地减轻了你的PCI合规负担。