Razorpay支付网关报Invalid amount错误,PHP技术栈下求解决方案
问题根因
你遇到的错误核心是Razorpay支付网关接收的金额不符合要求,结合你提供的代码,具体有3个直接诱因:
- 购物车页面的「立即下单」按钮是通过
<a>标签跳转,没有将购物车总金额、用户填写的账单信息提交到payscript.php,导致$_POST['cartContent']为空,计算出的派萨金额为0,远低于最低100派萨的要求 - 购物车页面存在表单嵌套问题,外层的
contactform表单内部嵌套了needs-validation表单,HTML规范不允许表单嵌套,会导致表单提交逻辑失效 payscript.php没有对接收的金额做合法性校验,空值、非数字值都会导致金额计算错误
修复方案
1. 修改购物车页面代码
- 删除嵌套的
<form class = "needs-validation" novalidate>标签(保留内部的输入框结构) - 在总金额
span同级添加隐藏域,用于提交总金额 - 将「立即下单」按钮的
<a>标签移除,改为普通submit按钮 - 购物车JS计算总金额时,同时给隐藏域赋值
修改后核心代码片段:
<!-- 外层表单保留,action改为payscript.php --> <form name="contactform" method="post" action="payscript.php"> <div class="modal-body"> <div class="container"> <div class="row"> <div class="col-md-6 order-md-4 mb-6"> <table id="cartents" class="show-cart table"></table> <div>Total price: <span class="total-cart" id="cartContent"></span></div> <!-- 新增隐藏域存储总金额 --> <input type="hidden" name="cartContent" id="cartContentInput"> <br> <div class="modal-footer"> <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button> <!-- 去掉a标签,改为submit按钮 --> <button type="submit" class="btn btn-primary">Order now</button> </div> </div> <div class="col-md-6 order-md-1"> <h4 class="mb-3">Billing address</h4> <!-- 删掉原来这里的form标签,保留下面的输入框 --> <div class="mb-3"> <label for="fullname">Full name</label> <div class="input-group"> <!-- 所有输入框加上name属性,name值和id保持一致即可 --> <input type="text" class="form-control" id="name" name="name" placeholder="Enter your full name" required> <div class="invalid-feedback" style="width: 100%;"> Your full name is required. </div> </div> </div> <!-- 剩余的手机号、邮箱、地址输入框按上述规则补充name属性即可 -->
注意:你的购物车JS逻辑中,给#cartContent赋值总金额时,同步给#cartContentInput也赋值相同的数值
2. 修改payscript.php代码
- 新增金额合法性校验,确保转换后的派萨金额为整数且不低于100
- 用户预填信息改为从POST参数获取,增加XSS转义
- 新增参数存在性校验,避免直接访问该页面时报错
修改后完整代码:
<?php $apiKey = ""; // 填写你自己的Razorpay API Key // 校验参数是否正常提交 if (!isset($_POST['cartContent'], $_POST['name'], $_POST['phonenumber'], $_POST['email'], $_POST['address'])) { die('非法访问,请从购物车页面提交订单'); } // 金额处理 $totalRupee = (float)$_POST['cartContent']; $amountInPaise = (int)round($totalRupee * 100); // 校验最低金额 if ($amountInPaise < 100) { die('订单最低金额为₹1,请添加商品后再下单'); } // XSS转义用户信息 $name = htmlspecialchars($_POST['name']); $phone = htmlspecialchars($_POST['phonenumber']); $email = htmlspecialchars($_POST['email']); $address = htmlspecialchars($_POST['address']); ?> <script src="https://code.jquery.com/jquery-3.5.0.js"></script> <form action="" method="POST"> <script src="https://checkout.razorpay.com/v1/checkout.js" data-key="<?php echo $apiKey; ?>" data-amount="<?php echo $amountInPaise; ?>" data-currency="INR" data-id="<?php echo 'OID'.rand(10,100).'END';?>" data-buttontext="Pay with Razorpay" data-name="Atharv Organics" data-description="my website name" data-image="logo.png" data-prefill.name="<?php echo $name; ?>" data-prefill.email="<?php echo $email; ?>" data-prefill.contact="<?php echo $phone; ?>" data-prefill.address="<?php echo $address; ?>" data-theme.color="#F37254" ></script> <input type="hidden" custom="Hidden Element" name="hidden"> </form>
内容的提问来源于stack exchange,提问作者Sumit Dhawan
相关产品推荐
相关产品推荐

