Razorpay 集成指南:导致支付失败的5个错误
Source: Dev.to
许多开发者能够打开结账页面,但仍会遇到以下问题:
- ❌ 支付未验证
- ❌ 收取的金额不正确
- ❌ 成功的支付未被记录
- ❌ 订单状态未更新
在修复了多个 Razorpay 集成后,我注意到一件有趣的事:
大多数支付失败都是因为几个小错误导致的。
在本指南中,你将了解 5 大最常见的 Razorpay 集成错误——以及如何避免它们。
📚 目录
Source: …
Razorpay 支付流程(概览)
在查看错误之前,先了解 正确的支付流程 非常重要。
flowchart TD
A[User clicks Pay] --> B[Frontend sends request to Backend]
B --> C[Backend creates order using Razorpay API]
C --> D[Order ID returned to Frontend]
D --> E[Frontend opens Razorpay Checkout]
E --> F[User completes payment]
F --> G[Frontend sends payment details to Backend]
G --> H[Backend verifies payment signature]
H --> I[Payment confirmed]
关键原则
- ✔ 订单 应在 后端 创建。
- ✔ Checkout 在 前端 运行。
- ✔ 支付验证 必须在 后端 完成。
这种分离确保 安全性和可靠性。
❌ 错误 #1:在前端创建订单
一个非常常见的错误是尝试 直接在前端 创建 Razorpay 订单。
❌ 错误做法
// frontend (DO NOT DO THIS)
fetch("https://api.razorpay.com/v1/orders")
这会暴露你的 secret API key,极其危险。任何人都可以检查代码并滥用它。
✅ 正确做法
订单应始终在 后端 创建。
// backend (Node.js example)
const Razorpay = require("razorpay");
const razorpay = new Razorpay({
key_id: process.env.RAZORPAY_KEY_ID,
key_secret: process.env.RAZORPAY_KEY_SECRET,
});
const order = await razorpay.orders.create({
amount: 50000, // amount in paise
currency: "INR",
receipt: "receipt_123",
});
安全的订单创建流程
flowchart TD
A[User clicks Pay] --> B[Frontend requests backend to create order]
B --> C[Backend calls Razorpay API]
C --> D[Razorpay returns Order ID]
D --> E[Backend sends Order ID to frontend]
E --> F[Checkout opens]
❌ 错误 #2:使用错误的金额格式
Razorpay 期望 以派萨(paise)为单位的金额,而不是卢比。这一点细微的差别导致许多集成失败。
❌ 错误示例
amount: 500 // ❌ 这表示 500 INR,但 Razorpay 需要的是派萨
✅ 正确示例
amount: 500 * 100 // ✅ 500 INR → 50000 paise
如果客户需要支付 ₹500,Razorpay 期望的金额为:
50000 // 500 × 100
金额转换流程
flowchart TD
A[Customer payment: 500 INR] --> B[Convert to paise]
B --> C[500 × 100]
C --> D[Send 50000 to Razorpay]
记住的规则
Amount sent to Razorpay = Rupees × 100
❌ 错误 #3:跳过支付验证
许多开发者认为,只要 Razorpay Checkout 显示 “Payment Successful”,付款就已完成。但这 不足以证明。
必须在后端验证 支付签名。
支付验证流程
flowchart TD
A[User completes payment] --> B[Razorpay sends payment response to frontend]
B --> C[Frontend sends payment_id, order_id, signature to backend]
C --> D[Backend verifies signature using Razorpay secret key]
D --> E[Backend confirms payment]
如果不进行验证,攻击者可能 伪造支付响应。
❌ 错误 #4:未实现 Webhook
仅依赖前端响应在测试时可行,但在生产环境中,支付可能会出现:
- 延迟
- 重试
- 退款
- 部分捕获
Webhook 会在这些事件发生时通知你的后端。
Webhook 事件流程
flowchart TD
A[Payment event occurs on Razorpay] --> B[Razorpay sends webhook request]
B --> C[Your backend webhook endpoint receives event]
C --> D[Backend updates database]
D --> E[Order status updated]
常见的 webhook 事件包括:
payment.captured
payment.failed
refund.processed
如果没有 webhook,你的后端 将无法获知真实的支付状态。
❌ 错误 #5:在生产环境使用测试密钥
这个错误 比你想象的更常见。在开发阶段,Razorpay 会提供 测试 API 密钥。如果这些密钥被部署到生产环境,真实支付将会失败。
环境变量
RAZORPAY_KEY_ID=
RAZORPAY_KEY_SECRET=
部署流程
flowchart TD
A[Development] --> B[Use Razorpay Test Keys]
B --> C[Testing completed]
C --> D[Switch to Live Keys]
D --> E[Deploy to Production]
在部署前务必 再次核对密钥。
最终思考
支付集成很少因复杂代码而失败。它们之所以失败,是因为开发者忽视了细小的细节,例如:
- 在错误的层创建订单
- 发送错误的金额
- 跳过支付验证
- 忽视 webhook
- 使用测试凭证进行部署
遵循上述模式,您可以构建一个安全、可靠的 Razorpay 集成,在生产环境中完美运行。祝编码愉快!
常见的 Razorpay 集成错误
- 忽略 webhook
- 使用测试密钥部署
修复这五个错误将使您的 Razorpay 集成:
- ✅ 安全
- ✅ 可靠
- ✅ 生产就绪
💬 讨论
您在生产环境中集成 Razorpay 时遇到过问题吗?
支付集成中最困难的部分是什么?
在评论中分享您的经验 👇