所提供的id在Node.js中不存在,是Razorpay的问题。

16

我正在使用Node.js作为后端,在React.js应用程序中实现Razorpay支付网关。

这里是frontend.jsx

razorpayHandler = () =>{
        const payment_amount  = this.props.TotalPrice;
        const backend_url = 'https://25234399bb.ngrok.io';
        const self = this;
        const options = {
        key: config.RAZOR_PAY_KEY,
        amount: payment_amount * 100,
        name: 'StanPlus',
        description: 'pay your ambulance fare',
        handler(response) {
            const paymentId = response.razorpay_payment_id;
            const url =  backend_url+'/razorpay/'+paymentId+'/'+payment_amount+'/'+self.id;
            console.log(paymentId)
            // Using my server endpoints to capture the payment
            fetch(url, {
            method: 'get',
            headers: {
                "Content-type": "application/x-www-form-urlencoded; charset=UTF-8"
            }
            })
            .then(resp =>  resp.json())
            .then(function (data) {
                    console.log(data)
            })
            .catch(function (error) {
                console.log('Request failed', error);
            });
        },
        theme: {
            color: '#40A9FF',
        },
        };
        const rzp1 = new window.Razorpay(options);

        rzp1.open();
    }

后端.js(Node.js)

var express = require('express');
var router = express.Router();
var config = require('../config');

const Razorpay = require('razorpay');
const instance = new Razorpay({
  key_id: config.razorpay_live_key,
  key_secret: config.razorpay_live_secret,
});

router.get('/:payment_id/:amount/:BID',function(req,res,next){
    const {payment_id } = req.params;
    const {BID} = req.params;
    const amount = Number(req.params.amount*100);
    instance.payments.capture(payment_id, amount).then((data) => {
        data.Bid = BID;
        res.json(data);
    }).catch((error) => {
        res.json(error);
    });
})
module.exports = router;

它向我显示错误

"statusCode":400,"error":{"code":"BAD_REQUEST_ERROR","description":"所提供的ID不存在"}

但是如果使用测试密钥进行相同的代码处理,它将成功完成,但不适用于实时API。
在这里,我向后端传递了一个额外的参数,这对我们是必需的。但是如果删除该参数,则仍无法工作。但是使用参数时,它可以在测试API上运行。
当我们发送请求到后端时,它会生成一个ID并将其发送到后端,但仍然显示所提供的ID不存在


请参考此处的index.js文件:https://github.com/razorpay/razorpay-node/blob/master/examples/index.js,其中包含所有API调用的片段。 - Harsha Marri
@HarshaMarri 我正在关注 这个 仓库。我正在按照该仓库中提到的 Razorpay API 进行操作,但是在测试模块中生成的 ID 并非实际生产环境中的。 - zulqarnain
1
只需不传递订单ID,这对我起作用了。 - Anil Kumar
8个回答

44
如果你正在使用测试模式,那么只需从JSON对象中删除order_id参数即可。

它有助于测试模式。但我认为你正在传递内部订单ID而不是Razorpay订单ID。如果您传递正确的Razorpay ID,则即使在测试模式下也无需删除订单ID。 - mohammed_ayaz
@mohammed_ayaz,你能帮忙找到正确的ID吗? order = client.order.create(......) 所以我已经将order['id']作为订单ID传递。如果这个ID不是测试模式下的ID,请告诉我。 - Pran Kumar Sarkar
@PranKumarSarkar,如果你选择razorpay支付方式时不需要输入网银凭据,那么你就处于测试模式。你会看到两个按钮,分别是“成功”和“失败”。你可以选择让这笔交易成功或失败。 - mohammed_ayaz
2
@PranKumarSarkar 移除 order_id 可以解决问题,但这并不是正确的方法。您需要从 Razorpay 获取测试订单 ID。移除 Order id 就像是一个技巧,可以让它工作,但这不是正确的方法。稍后您会遇到问题。 - mohammed_ayaz
@mohammed_ayaz 如何从Razorpay中找到测试订单ID?是否有单独的方法来获取它? - Pran Kumar Sarkar
显示剩余2条评论

11

我也在一周前遇到了这个错误。当我们将测试密钥更改为用于最终付款的生产密钥时,就会出现此错误。

因此,由于 Razorpay 密钥在前端和后端(node.js 侧)之间不匹配,我遇到了提供的id不存在的问题。

因此,请确保在后端和前端两侧都使用生产环境的相同客户端密钥和密钥。

如果问题仍然没有解决,请在评论中告诉我。


我已经验证了我的密钥,它们是相同的,但仍然出现这个错误。 - Avinash Maurya
这正是我的问题。我忘记在前端更新密钥ID了。 - saibbyweb
我遇到了这个问题... 我在前端和后端都检查了key_id和key_secret,它们完全相同... 仍然出现这个错误 :( 请帮忙。 - Rahul

2
  1. 为了测试,请从您的选项JSON数据中移除OrderId。
  2. 对于生产模式,请传递来自用户控件的自动生成的订单ID。

1

删除order_id不是我们应该遵循的良好实践,我们应该遵循文档。 要在React中获取order_id,您必须首先在后端(例如node.js)中创建订单。按照以下步骤从Razorpay获取order_id

步骤-1

var instance = new Razorpay({  key_id: 'YOUR_KEY_ID',  key_secret: 'YOUR_KEY_SECRET'})

这将初始化一个新的 Razorpay 对象。

步骤 - 2

MyOrder = instance.orders.create({amount, currency, receipt, notes})

这将为您创建一个订单,然后您就可以访问 order_id。 您可以记录 MyOrder 以查看更多可用属性,或只需使用 console.log(MyOrder.id) 来获取 order_id ,最后您必须在选项中传递您的 order_id

注意:您可以像这样访问订单 ID:MyOrder.id

有关更多信息,请参阅官方 文档

您可以在此处找到各种平台的Razorpay SDK链接


0

如果您正在使用付款功能,则从选项JSON值中删除order_id。

 var options = {
        "key": "xxxxxxxxxxxxxxx", // Enter the Key ID generated from the Dashboard
        "amount": "50000", // Amount is in currency subunits. Default currency is INR. Hence, 50000 refers to 50000 paise
        "currency": "INR",
        "name": "Acme Corp",
        "description": "Test Transaction",
        "image": "https://example.com/your_logo",
        // "order_id": "order_9A33XWu170gUtm", //This is a sample Order ID. Pass the `id` obtained in the response of Step 1
        "handler": function (response){
            alert(response.razorpay_payment_id);
            alert(response.razorpay_order_id);
            alert(response.razorpay_signature)
        },
        "prefill": {
            "name": "Gaurav Kumar",
            "email": "gaurav.kumar@example.com",
            "contact": "9999999999"
        },
        "notes": {
            "address": "Razorpay Corporate Office"
        },
        "theme": {
            "color": "#3399cc"
        }
    };

0
我在集成Razorpay进行订阅支付时也遇到了同样的问题。最初,我在选项参数中传递了order_id,结果出现了错误-
{
  "code": "BAD_REQUEST_ERROR",
  "description": "The id provided does not exist",
  "source": "business",
  "step": "payment_initiation",
  "reason": "input_validation_failed",
  "metadata": {}
}

所以用subscription_id替换了order_id。
现在可以正常工作了!

0

检查 rp_type, 对于订阅,请传递 options["subscription_id"], 对于订单,请传递 options["order_id"]


0

当您向触发付款模态框传递错误的order_id时,就会出现此错误。基本上是一个不属于您的Razorpay帐户或无效的order_id。

例如:如果您使用一组凭据生成了一个order_id,然后在之后使用另一组凭据,就可能会出现此问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接