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

如何移除Moyasar支付回调URL中的&amp%3B?参数匹配失败求助

解决Moyasar支付回调URL多重转义导致参数匹配失败的问题

你遇到的是典型的多重转义编码问题——&amp%3B本质是&被多次HTML转义+URL编码后的结果,导致框架无法正确解析payment_type参数。以下是几个直接可用的修复方案:

1. 针对回调请求做强制多重解码

在处理回调的代码里,先获取原始查询字符串,循环解码直到转义字符被清理干净:

// 获取原始请求的查询字符串
$queryString = request()->getQueryString();
// 循环解码,直到没有残留的转义标记
while (strpos($queryString, '&') !== false || strpos($queryString, '%3B') !== false) {
    $queryString = htmlspecialchars_decode(urldecode($queryString));
}
// 解析处理后的字符串为参数数组
parse_str($queryString, $decodedParams);

// 现在可以正常匹配payment_type
if (($decodedParams['payment_type'] ?? '') === 'moyasar') {
    // 执行支付成功后的逻辑
}

2. 单独修复目标参数

如果只需要处理payment_type这一个参数,可以直接对其进行多次解码:

$rawType = request()->input('payment_type');
// 先URL解码,再HTML转义解码
$paymentType = htmlspecialchars_decode(urldecode($rawType));

if ($paymentType === 'moyasar') {
    // 你的业务逻辑
}

3. 中间件统一处理所有Moyasar回调

如果项目中有多个Moyasar回调接口,建议写个中间件统一处理转义问题:

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;

class FixMoyasarCallbackEncoding
{
    public function handle(Request $request, Closure $next)
    {
        $queryString = $request->getQueryString();
        if ($queryString && strpos($queryString, '&amp;') !== false) {
            // 循环清理HTML转义的&符号
            while (strpos($queryString, '&amp;') !== false) {
                $queryString = htmlspecialchars_decode($queryString);
            }
            parse_str($queryString, $params);
            // 将修复后的参数合并到请求中
            $request->merge($params);
        }
        return $next($request);
    }
}

注册中间件后,给Moyasar的回调路由加上这个中间件,后续请求就能直接正常获取参数了。

额外建议

这些方案都是临时修复,建议你联系Moyasar的技术支持,反馈回调URL的编码异常问题,从服务商端解决根源问题,避免后续出现类似参数解析错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 04:35:27