如何移除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, '&') !== false) { // 循环清理HTML转义的&符号 while (strpos($queryString, '&') !== false) { $queryString = htmlspecialchars_decode($queryString); } parse_str($queryString, $params); // 将修复后的参数合并到请求中 $request->merge($params); } return $next($request); } }
注册中间件后,给Moyasar的回调路由加上这个中间件,后续请求就能直接正常获取参数了。
额外建议
这些方案都是临时修复,建议你联系Moyasar的技术支持,反馈回调URL的编码异常问题,从服务商端解决根源问题,避免后续出现类似参数解析错误。
内容的提问来源于stack exchange,提问作者Mo Nabil
相关产品推荐
相关产品推荐

