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

Razorpay回调未获取签名验证所需参数的配置咨询

解决Razorpay回调参数不符问题

你的问题核心是混淆了Razorpay的两种回调机制:支付跳转回调(GET) 和 Webhook通知(POST)。文档里展示的是跳转回调的参数格式,而你当前收到的是Webhook的POST请求,两者的配置和参数逻辑完全不同。

1. 配置支付跳转回调(获取GET查询参数)

如果需要拿到文档中带razorpay_payment_id、razorpay_signature等查询参数的GET请求,需在创建支付链接时指定callback_url参数,而不是依赖后台配置的Webhook:

// Go代码示例:创建支付链接时指定跳转回调URL
paymentLinkParams := map[string]interface{}{
    "amount":          1000, // 金额最小单位,例如1000代表10卢比
    "currency":        "INR",
    "callback_url":    "https://your-domain.com/payment-callback", // 跳转回调URL
    "callback_method": "get", // 显式指定GET方法(建议显式设置避免默认值差异)
    // 其他必要参数(如描述、客户信息等)
}

resp, err := client.PaymentLink.Create(paymentLinkParams, nil)

用户完成支付后,浏览器会自动跳转到这个callback_url,并携带文档中所示的所有查询参数,包括签名。

2. Webhook POST请求的签名验证(若需保留异步通知)

如果需要后台异步接收支付状态通知(Webhook),则无需修改配置,但需按照Webhook的规则验证签名,步骤如下:

  • 从请求头X-Razorpay-Signature获取签名
  • 读取请求体的原始JSON字符串(注意:必须用原始字节,不能解析后再序列化,否则签名验证会失败)
  • 使用你的Razorpay Webhook密钥,以HMAC SHA256算法加密原始JSON字符串(加密前缀为razorpay_)
  • 对比加密结果与请求头中的签名是否一致

Go代码示例:

import (
    "crypto/hmac"
    "crypto/sha256"
    "encoding/hex"
    "io/ioutil"
    "net/http"
)

func RazorpayWebhookHandler(w http.ResponseWriter, r *http.Request) {
    // 读取原始请求体
    body, err := ioutil.ReadAll(r.Body)
    if err != nil {
        http.Error(w, "Failed to read request body", http.StatusBadRequest)
        return
    }
    defer r.Body.Close()

    // 获取签名头
    signature := r.Header.Get("X-Razorpay-Signature")
    if signature == "" {
        http.Error(w, "Missing signature", http.StatusUnauthorized)
        return
    }

    // Webhook密钥(从Razorpay后台获取)
    webhookSecret := "your_webhook_secret_key"

    // 生成HMAC签名
    h := hmac.New(sha256.New, []byte(webhookSecret))
    h.Write([]byte("razorpay_" + string(body))) // 必须添加razorpay_前缀
    computedSignature := hex.EncodeToString(h.Sum(nil))

    // 验证签名
    if computedSignature != signature {
        http.Error(w, "Invalid signature", http.StatusUnauthorized)
        return
    }

    // 签名验证通过,处理支付数据
    // 解析body为JSON对象,执行业务逻辑...
    w.WriteHeader(http.StatusOK)
    w.Write([]byte("Success"))
}

关键注意点

  • 跳转回调用于前端跳转展示,Webhook用于后端异步通知,两者可同时配置
  • 若只需要文档中的GET参数,确保创建支付链接时设置了callback_url,且callback_method为get
  • Webhook验证必须使用原始请求体,不能修改或解析后重新序列化,否则签名会不匹配

内容的提问来源于stack exchange,提问作者user2995358

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 06:53:00