已配置Basic Auth仍弹认证提示 Razorpay订单API调用返回状态码0如何解决
Razorpay订单API调用异常解决方案
核心问题原因
- 你设置了
dataType: 'jsonp':JSONP仅支持GET请求,且无法携带自定义Authorization请求头,这是你传递的Basic Auth不生效、触发身份验证弹窗的核心原因 - 状态码0是典型的跨域请求拦截表现:Razorpay服务端API默认不允许前端直接跨域调用,浏览器会拦截不符合CORS规则的请求,返回状态码0
- 存在高危安全漏洞:你在前端直接使用密钥生成Basic Auth,所有访问页面的用户都可以直接获取你的Razorpay密钥,存在被盗用产生资金损失的风险
- 传参格式不匹配:你设置了
contentType: "application/json",但实际传递的是包裹了json字段的表单格式数据,和声明的请求格式不一致。
正确实现方案
Razorpay官方要求订单创建操作必须在服务端完成,禁止前端直接调用订单生成API
- 将订单生成逻辑迁移到你的后端服务:后端携带Razorpay密钥调用
https://api.razorpay.com/v1/orders接口,生成订单ID后返回给前端 - 前端仅调用你自己的后端接口获取订单ID,再通过Razorpay前端Checkout SDK完成后续支付流程
- 若仅做本地临时测试(严禁上线使用),可修改如下代码参数,同时安装浏览器跨域插件解除CORS限制:
var jsonData = { "currency": "INR", "amount": "10000", }; $.ajax({ type: 'POST', // 删掉jsonp配置,改为json dataType: 'json', url: url, // 直接传递序列化后的JSON数据,不要包裹外层json字段 data: JSON.stringify(jsonData), xhrFields: { withCredentials: true }, beforeSend: function (xhr) { xhr.setRequestHeader("Authorization", "Basic " + btoa(username + ":" + password)); }, contentType: "application/json; charset=utf-8", success: function (response) { alert("done"); }, error: function (xhr, ajaxOptions, thrownError) { alert(xhr.status); if(xhr.responseText) { jsonValue = jQuery.parseJSON(xhr.responseText); console.log(jsonValue.Message); } }, });
测试完成后请立即删除前端代码中的密钥相关逻辑,避免密钥泄露。
内容的提问来源于stack exchange,提问作者Deepak Lohmod
相关产品推荐
相关产品推荐

