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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 22:42:36