TYPO3:如何为指定控制器动作允许第三方查询字符串参数?
你遇到的是TYPO3 cHash机制和第三方支付回调的典型冲突——TYPO3默认会验证所有GET参数是否在生成URL时被纳入cHash计算,否则直接返回404,而PayPal这类平台会在回调时额外添加顶级参数,不在你最初生成的cHash范围内。下面给你几个可行的解决方案,按推荐程度排序:
1. 排除支付参数的cHash验证(最简单安全的方式)
TYPO3允许你指定哪些GET参数不需要参与cHash计算,这样即使URL里有这些参数,也不会触发404错误。在你的扩展的ext_localconf.php里添加以下代码:
// 排除PayPal回调的参数,不参与cHash计算 $GLOBALS['TYPO3_CONF_VARS']['FE']['cacheHash']['excludedParameters'][] = 'paymentId'; $GLOBALS['TYPO3_CONF_VARS']['FE']['cacheHash']['excludedParameters'][] = 'token'; $GLOBALS['TYPO3_CONF_VARS']['FE']['cacheHash']['excludedParameters'][] = 'PayerID';
这个方法的好处是不需要修改路由,也不用调整URL生成逻辑,直接告诉TYPO3忽略这些参数的cHash校验。
2. 配置路由增强器允许回调参数(更规范的Extbase方式)
如果想让这些参数被Extbase路由正确识别,避免被过滤,可以在你的站点配置config.yaml里添加路由增强器规则:
routeEnhancers: BookingmanagerP2: type: Extbase extension: Bookingmanager plugin: P2 routes: - routePath: '/coupon/step5' _controller: 'CouponItem::step5' # 声明允许的额外参数 _arguments: paymentId: 'paymentId' token: 'token' PayerID: 'PayerID' # 设置默认控制器动作 defaultController: 'CouponItem::step5' # 允许参数为任意值(正则匹配) requirements: paymentId: '.*' token: '.*' PayerID: '.*' aspects: {}
配置后,TYPO3会把这些参数视为路由的一部分,不会因为它们存在而触发cHash错误,同时也不会过滤掉这些参数。
3. 正确获取回调参数
之前你用GeneralUtility::_GET()看不到PayPal的参数,是因为TYPO3的Extbase路由默认会过滤掉未在路由中声明的顶级参数。现在用上面两种方法之一解决cHash问题后,你可以用以下方式获取参数:
方法A:使用Request对象(推荐,符合TYPO3最新规范)
在你的CouponItemController的step5动作里:
use TYPO3\CMS\Core\Http\Request; public function step5Action(Request $request) { $queryParams = $request->getQueryParams(); $paymentId = $queryParams['paymentId'] ?? null; $token = $queryParams['token'] ?? null; $payerId = $queryParams['PayerID'] ?? null; // 后续处理逻辑... }
方法B:直接使用GeneralUtility(兼容旧版本)
use TYPO3\CMS\Core\Utility\GeneralUtility; public function step5Action() { $paymentId = GeneralUtility::_GET('paymentId') ?? null; $token = GeneralUtility::_GET('token') ?? null; $payerId = GeneralUtility::_GET('PayerID') ?? null; // 后续处理逻辑... }
为什么你之前的尝试无效?
你之前预定义空参数的方式,是把参数放到了tx_bookingmanager_p2数组里,但PayPal添加的是顶级GET参数(不在tx_*命名空间下),所以这些参数依然不在cHash计算范围内,而且会被Extbase路由过滤,导致你无法获取到它们。
内容的提问来源于stack exchange,提问作者user4149612

