正确的 Razorpay 支付流程(简明解释)
Source: Dev.to
许多支付集成问题源于开发者对 Razorpay 支付生命周期的误解。遵循正确的流程可以确保交易安全、验证到位,并减少生产环境中的 bug。
下面是推荐的 Razorpay 支付流程,逐步说明。
1. 用户点击 “Pay”
支付过程在前端开始,当用户点击 Pay 按钮时。
此时前端 不应直接尝试处理支付,而是应向后端发起 API 请求来创建支付订单。
2. 后端创建订单
后端调用 Razorpay API 创建订单。此步骤会定义支付金额并生成一个 order ID,该 ID 稍后将在 Checkout 中使用。
const order = await razorpay.orders.create({
amount: 10000, // Amount in paise (₹100)
currency: "INR",
receipt: "order_rcptid_11"
});
响应中包含重要信息,例如:
order.idorder.amountorder.currency
该订单 ID 至关重要,因为 Razorpay 通过它来跟踪交易。
3. 前端打开 Razorpay Checkout
后端返回订单详情后,前端使用订单 ID 初始化 Razorpay Checkout。
var options = {
key: "RAZORPAY_KEY_ID",
amount: order.amount,
order_id: order.id
};
这会打开 Razorpay 支付界面,用户可以通过 UPI、卡片、网银或钱包完成交易。
4. 用户完成支付
支付成功后,Razorpay 会将以下值返回给前端:
razorpay_payment_id
razorpay_order_id
razorpay_signature
这些值代表 Razorpay 生成的支付详情。但这并不意味着支付已经可以直接信任。
5. 后端验证签名(关键步骤)
前端必须将返回的支付数据发送给后端。
后端使用你的 Razorpay secret key 生成签名,以验证支付的真实性。
const crypto = require('crypto');
const generatedSignature = crypto
.createHmac('sha256', secret)
.update(`${razorpay_order_id}|${razorpay_payment_id}`)
.digest('hex');
后端将生成的签名与 Razorpay 返回的 razorpay_signature 进行比较。
- 若签名 匹配,支付有效。
- 若 不匹配,则必须拒绝该支付。
此验证步骤可防止支付被篡改或欺诈。
6. 将支付信息存入数据库
只有在验证成功后,才应将支付信息写入数据库。
常见的存储字段包括:
payment_idorder_idamountstatususer_idtimestamp
存储已验证的支付记录可确保账目准确,并在后续退款或争议处理时提供依据。
7. 完成订单
支付验证并存储后,即可安全地进行订单履行。例如:
- 授予数字产品的访问权限
- 激活订阅
- 确认订单
- 发送收据或确认邮件
此时交易即可视为完成。
结语
可靠的 Razorpay 集成依赖于 遵循正确的生命周期:
- 用户发起支付
- 后端创建订单
- 前端启动 Checkout
- 用户完成支付
- 后端验证签名
- 存储已验证的支付
- 完成订单
只要正确实现上述流程——尤其是 签名验证步骤——大多数 Razorpay 支付错误和安全问题都能得到避免。