NEXT.JS+Strapi项目中Ngrok代理Razorpay Webhook遭遇403 Forbidden问题求助
解决Razorpay Webhook向Ngrok暴露的Strapi接口发送请求时返回403 Forbidden的问题
根据你的描述,我推测问题主要出在Strapi的权限配置或者缺少Razorpay Webhook签名验证上,以下是分步解决的方案:
1. 开放Strapi中Webhook路由的公共权限
Strapi默认会对所有接口启用权限校验,如果你的verification接口没有设置为公开访问,Strapi会直接返回403 Forbidden。操作步骤:
- 登录Strapi后台,进入Settings → Roles & Permissions → Public角色
- 找到你的Webhook对应的控制器(也就是写
verification方法的那个控制器) - 勾选该方法的访问权限(如果是自定义路由,确保权限条目已启用)
- 保存设置后重启Strapi服务
2. 修正Webhook处理代码,添加必要的签名验证
你的现有代码没有处理Razorpay的签名验证,这不仅有安全风险,也可能导致Strapi或Razorpay侧的拦截。同时,ctx.send(200)的写法不符合Strapi的响应规范,建议调整为:
async verification(ctx) { try { // 先返回200响应,避免Razorpay因超时重复发送请求 ctx.response.status = 200; ctx.body = ''; const secret = "This is the razorpay secret"; const payload = ctx.request.body; // 获取Razorpay发送的签名头 const receivedSignature = ctx.request.headers['x-razorpay-signature']; // 验证签名(必须步骤,防止伪造请求) const crypto = require('crypto'); const hmac = crypto.createHmac('sha256', secret); // 注意:必须用原始的JSON字符串生成签名,不能用解析后的对象 hmac.update(JSON.stringify(payload)); const generatedSignature = hmac.digest('hex'); if (generatedSignature === receivedSignature) { // 签名验证通过,处理你的业务逻辑 console.log('合法的Webhook数据:', payload); // 比如更新订单状态、保存支付记录等 } else { // 签名不匹配,返回403并记录日志 console.log('无效的Webhook签名'); ctx.response.status = 403; } } catch (error) { console.error('处理Webhook时出错:', error); ctx.response.status = 500; } }
注意:Razorpay要求签名验证必须使用原始请求的JSON字符串生成,不能用解析后的JS对象,否则签名会不匹配。
3. 检查Ngrok和Razorpay的配置一致性
- 确保Razorpay后台配置的Webhook URL和Ngrok生成的地址完全一致,包括路径(比如
https://xxxxxx.ngrok.io/api/your-webhook-path) - 如果Ngrok重启生成了新的地址,一定要同步更新Razorpay后台的Webhook配置
- 确认Razorpay后台的Webhook已经启用,并且触发的事件是你需要的(比如
payment.captured)
4. 验证Strapi的CORS设置(可选)
虽然403通常不是CORS问题,但可以确保Strapi允许Razorpay的请求:
编辑config/middleware.js,调整CORS配置:
module.exports = { settings: { cors: { origin: '*', // 生产环境建议指定Razorpay的域名,开发环境可以用* headers: '*', methods: ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS'], }, }, };
修改后重启Strapi。
按照以上步骤排查后,应该能解决403 Forbidden的问题。
内容的提问来源于stack exchange,提问作者elliot
相关产品推荐
相关产品推荐

