Razorpay 集成指南:导致支付失败的5个错误

发布: (2026年3月8日 GMT+8 10:53)
7 分钟阅读
原文: Dev.to

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 时遇到过问题吗?

支付集成中最困难的部分是什么?

在评论中分享您的经验 👇

0 浏览
Back to Blog

相关文章

阅读更多 »

准备迎接 Google I/O 2026

Google I/O 将于5月19日至20日回归。Google I/O 回来了!加入我们的线上活动,分享我们在 AI 领域的最新突破以及公司各产品的更新,涵盖 Gemini……