金融与交易
接入 Stripe/PayPal/Square…
在实现结账流程、周期扣款、退款与争议处理时,安全集成支付网关并满足 PCI 合规。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
接入 Stripe/PayPal/Squ特定
解决思路
- 使用官方 SDK(如 Node.js 的 `require('stripe')(process.env.STRIPE_SECRET_KEY)`),不要直接处理原始卡数据。
- 创建 PaymentIntent 时把金额转换为最小货币单位(如 `Math.round(amount * 100)` 转为分),并传入 currency、customer,启用 `automatic_payment_methods: { enabled: true }`。
- 创建订阅时使用 `stripe.subscriptions.create`,传入 customer、items 中的 priceId,设置 `payment_behavior: 'default_incomplete'`,并 `expand: ['latest_invoice.payment_intent']` 以获取首期发票的支付意图。
- 退款时调用 `stripe.refunds.create`,以 `payment_intent` 指定原支付意图;如指定金额,同样用 `Math.round(amount * 100)` 转为最小单位。
- Webhook 路由使用 `express.raw({ type: 'application/json' })` 保留原始请求体,从 `req.headers['stripe-signature']` 取签名。
- 用 `stripe.webhooks.constructEvent(req.body, sig, process.env.STRIPE_WEBHOOK_SECRET)` 验证 Webhook 签名,验证失败返回 400 并附带错误信息。
- 在 Webhook 中按 `event.type` 分发处理,例如 `payment_intent.succeeded` 调用 handlePaymentSuccess,`invoice.payment_failed` 调用 handlePaymentFailed,处理完成后返回 `res.json({ received: true })`。
- PayPal 集成参考 references/paypal-integration.md,覆盖订单创建与捕获、退款处理、Webhook 处理、前端 SDK 集成、成功/取消回调。
- 安全清单:只使用官方 SDK;验证 Webhook 签名;绝不记录完整卡号;只存储最少支付数据;先在沙箱测试;所有支付路由使用 HTTPS;处理所有错误情况;使用幂等键;实现重试逻辑。
- 最佳实践(Do):使用官方 SDK 库;验证所有 Webhook 签名;记录交易 ID(而非卡数据);在沙箱环境测试;处理所有支付状态;实现清晰的错误消息。
- 最佳实践(Don't):不要直接处理原始卡数据;不要存储敏感支付信息;不要硬编码 API 密钥;不要跳过 Webhook 签名验证;不要忽略支付失败事件;不要在生产环境使用测试密钥。
适用边界 · 注意事项
- 未使用 Stripe/PayPal/Square 等特定支付网关,或无法使用其官方 SDK 时。
- 无法提供 HTTPS 支付路由或无法安全保管 API 密钥/Webhook 密钥时。
- 仅需本地模拟支付、不涉及真实资金与合规要求的场景。