You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在React中查询Razorpay的支付详情(如支付方式、实付金额等)

问题原因

你尝试的两种方案都存在核心错误,根本无法生效:

  • Razorpay 私钥绝对不允许放在前端代码中,暴露私钥会导致所有支付数据泄露、恶意篡改支付状态等严重资损风险
  • Razorpay 官方API禁止前端直接跨域调用,你直接在前端发请求会被浏览器CORS策略拦截,且Razorpay Node SDK只能在服务端环境初始化,前端环境无法调用相关接口
  • 你当前的前端配置还存在基础参数错误:Razorpay要求amount字段传对应货币的最小单位值,印度卢比的最小单位是派士,1 INR=100派士,所以13.14 INR应该传1314而不是13.14

正确实现方案

1. 前端修改(移除所有私钥相关代码)

修改后的前端代码如下:

const REACT_APP_RAZORPAY_PUBLIC_KEY = "rzp_test_QadmhmrFi5r6szP"
// 私钥完全从前端删除,不要出现在任何前端代码里

export default function Payment() {
  const options = {
    key: REACT_APP_RAZORPAY_PUBLIC_KEY,
    amount: 1314, // 修正单位,对应13.14 INR
    description: 'Transaction Amount',
    handler: async function(response) {
      // 支付成功后拿到三个核心参数
      const { razorpay_payment_id, razorpay_order_id, razorpay_signature } = response
      // 把这三个参数传给你自己的后端接口,由后端去拉取完整支付详情
      const res = await fetch("/你自己的后端接口地址", {
        method: "POST",
        headers: {
          "Content-Type": "application/json"
        },
        body: JSON.stringify({
          payment_id: razorpay_payment_id,
          order_id: razorpay_order_id,
          signature: razorpay_signature
        })
      })
      const paymentDetail = await res.json()
      // 这里拿到后端返回的完整支付详情做后续逻辑
      console.log(paymentDetail)
    },
    prefill: {
        name: "Hello",
        contact: 8453423498,
        email: "hello@gmail.com"
    },
  };
  useEffect(() => {
    const script = document.createElement('script');
    script.src = 'https://checkout.razorpay.com/v1/checkout.js';
    script.async = true;
    document.body.appendChild(script);
  }, [])

  const openPay = () => {
    if(window.Razorpay) {
      const paywindow = new window.Razorpay(options);
      paywindow.open();
    }
  }
  return (
    <>
      <button style={{background:"green",color:"white"}} onClick={openPay}>Pay with Razorpay</button>
    </>
  );
}

2. 后端实现(以Node.js为例)

首先安装Razorpay官方SDK:
npm install razorpay

后端接口逻辑:

const Razorpay = require('razorpay');
// 私钥只存在于服务端环境变量中,不要硬编码
const RAZORPAY_PUBLIC_KEY = "rzp_test_QadmhmrFi5r6szP"
const RAZORPAY_PRIVATE_KEY = "4IqirUMK8hjKvhq3XhHxpHT7"

// 初始化Razorpay实例
const razorpayInstance = new Razorpay({
  key_id: RAZORPAY_PUBLIC_KEY,
  key_secret: RAZORPAY_PRIVATE_KEY,
});

// 接收前端传参的接口逻辑
app.post('/你自己的后端接口地址', async (req, res) => {
  const { payment_id, order_id, signature } = req.body
  try {
    // 第一步:先验证签名,确认支付是Razorpay官方发起的,防止伪造请求,可选但强烈建议加上
    // 第二步:拉取完整支付详情
    const paymentDetail = await razorpayInstance.payments.fetch(payment_id)
    // 返回给前端
    res.json(paymentDetail)
  } catch (error) {
    res.status(500).json({ error: '获取支付详情失败' })
  }
})

补充说明

你也可以直接在后端用HTTP请求调用Razorpay接口,不需要用SDK,注意要在请求头里加Basic Auth认证,用户名是公钥,密码是私钥即可,服务端请求不存在跨域问题可以正常拿到返回。建议额外配置Razorpay Webhook回调,避免前端请求丢失导致支付状态不同步。

内容的提问来源于stack exchange,提问作者Depal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 16:45:04