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

Laravel中使用Curl跳转Payumoney支付网关异常问题

解决Laravel中用Curl触发Payumoney支付网关失败的问题

问题根源

你当前的Curl代码是在服务器端向Payumoney发起POST请求,返回的支付页面内容是给服务器的,而非用户浏览器。直接输出这些内容到浏览器时,会因为缺少用户端的会话上下文(如必要的Cookie、浏览器JS执行环境),以及页面资源路径异常,导致无法加载完整的支付界面。

正确解决方案

Payumoney这类支付网关的交互必须在用户浏览器端完成,推荐用自动提交表单的方式触发支付,这是行业标准做法,无需单独编写Blade模板,可在控制器直接输出:

代码示例

public function startPayumoneyPayment()
{
    // 替换为你的实际参数
    $MERCHANT_KEY = "你的商户Key";
    $hash = "生成的验证哈希";
    $txnid = "唯一交易ID";
    $firstname = "用户姓名";
    $email = "用户邮箱";
    $phone = "用户手机号";
    $amount = "交易金额";
    $productinfo = "商品描述";
    $surl = route("payment.success"); // 支付成功回调路由
    $furl = route("payment.failure"); // 支付失败回调路由

    // 构建自动提交的表单
    $autoSubmitForm = '<form id="payu-payment-form" method="POST" action="https://test.payu.in/_payment">';
    
    $params = [
        "key" => $MERCHANT_KEY,
        "hash" => $hash,
        "txnid" => $txnid,
        "firstname" => $firstname,
        "email" => $email,
        "phone" => $phone,
        "amount" => $amount,
        "productinfo" => $productinfo,
        "surl" => $surl,
        "furl" => $furl,
    ];

    foreach ($params as $name => $value) {
        $autoSubmitForm .= sprintf('<input type="hidden" name="%s" value="%s">', 
            htmlspecialchars($name), 
            htmlspecialchars($value)
        );
    }

    $autoSubmitForm .= '<script>document.getElementById("payu-payment-form").submit();</script></form>';

    return response($autoSubmitForm);
}

备选方案(307重定向,不推荐)

如果坚持用服务器端跳转方式,可尝试HTTP 307重定向(保留POST方法和参数),但部分浏览器可能触发安全提示,且Payumoney网关不一定兼容:

public function redirectToPayumoney()
{
    $params = [
        "key" => $MERCHANT_KEY,
        "hash" => $hash,
        "txnid" => $txnid,
        "firstname" => $firstname,
        "email" => $email,
        "phone" => $phone,
        "amount" => $amount,
        "productinfo" => $productinfo,
        "surl" => $surl,
        "furl" => $furl,
    ];

    return response('', 307)
        ->header('Location', 'https://test.payu.in/_payment')
        ->header('Content-Type', 'application/x-www-form-urlencoded')
        ->setContent(http_build_query($params));
}

为什么原代码不可行

  • Curl请求是服务器与Payumoney的通信,生成的会话与用户浏览器无关,支付网关会拒绝非用户端的交互请求。
  • 直接输出网关返回的HTML,页面内的相对资源(CSS、JS)会因请求上下文错误无法加载,导致页面显示不完整。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 03:08:17