【发布时间】:2018-05-17 13:26:23
【问题描述】:
我创建了一个多步骤订单表单扩展程序,它收集一些用户数据,然后重定向到不同的第三方解决方案以完成付款步骤。
此第三方解决方案(如 PayPal)需要返回 URL 才能找到返回我的表单的方法。所以当前的工作流程是这样的:
- 我的表单:收集用户数据
- 我的表单:使用返回 url 重定向到支付提供商
- 支付提供商:收集用于支付的用户数据
- 支付提供商:重定向回我的表单
- 我的表单:使用收集的数据显示订单详细信息
- 支付提供商:提交订单
- 我的表单:重定向到成功页面
我希望到目前为止这是可以理解的。我坚持第 4 步,因为从支付提供商返回到我的表单的每个重定向都以 404 结尾,因为支付提供商添加了一些我的表单不知道的查询字符串参数。我认为这里的问题是这个参数不是 cHash 计算的,这就是他们失败的原因。
在第 2 步中,我生成表单的返回 url,如下所示:
$returnUrl = $this->uriBuilder
->reset()
->setTargetPageUid($returnPageId)
->setCreateAbsoluteUri(true)
->setSection('form-multistep')
->uriFor('step5', null, 'CouponItem', 'bookingmanager', 'p2');
生成的输出如下所示:
https://example.com/coupon/?tx_bookingmanager_p2%5Baction%5D=step5&tx_bookingmanager_p2%5Bcontroller%5D=CouponItem&cHash=565dc2e51a8d43bf3836b43b994e98d0#form-multistep
所以这是将发送给不同支付提供商的 url,如果我将此 url 复制粘贴到我的浏览器中,则该 url 可以正常工作,但是支付提供商在重定向之前会操纵这个 url 并添加一些自定义查询字符串参数.
例如 PayPal 添加以下查询字符串参数:
paymentId, token and PayerID
所以生成的从 PayPal 到我的表单的重定向 URL 如下所示:
https://example.com/coupon/?paymentId=XXXXXX&token=XXXXXX&PayerID=XXXXXX&tx_bookingmanager_p2%5Baction%5D=step5&tx_bookingmanager_p2%5Bcontroller%5D=CouponItem&cHash=565dc2e51a8d43bf3836b43b994e98d0#form-multistep
这个 url 以 404 结尾,因为我认为 cHash 不再对这个被操纵的 url 有效,还是我错了?
此外,我已尝试预定义此参数,如下所示:
$returnUrl = $this->uriBuilder
->reset()
->setTargetPageUid($this->settings['returnPageId'])
->setCreateAbsoluteUri(true)
->setSection('form-multistep')
->setArguments(['paymentId' => '', 'token' => '', 'PayerID' => ''])
->uriFor('step5',null,'CouponItem','bookingmanager','p2');
如果我做这样的事情,那么从 PayPal 到我的表单的重定向工作正常,但不幸的是没有像预期的那样,因为 PayPal 不知道参数已经存在于给定的返回 url 中并且仍然再次添加这个参数,所以生成的网址如下所示:
https://example.com/coupon/?paymentId=&token=&PayerID=&tx_bookingmanager_p2%5Baction%5D=step5&tx_bookingmanager_p2%5Bcontroller%5D=CouponItem&cHash=bf642fb35a66033689b7d4ff772b3cf9#form-multistep&paymentId=XXXX&token=XXXX&PayerID=XXXX
此外,我无法访问 PayPal 添加到 url 的查询字符串参数 :(。所以我尝试了这样的事情:
$returnUrl = $this->uriBuilder
->reset()
->setTargetPageUid($this->settings['returnPageId'])
->setCreateAbsoluteUri(true)
->setSection('form-multistep')
->uriFor('step5',null,'CouponItem','bookingmanager','p2');
$this->uriBuilder
->reset()
->setTargetPageUid($this->settings['returnPageId'])
->setCreateAbsoluteUri(true)
->setSection('form-multistep')
->setArguments(['paymentId' => '', 'token' => '', 'PayerID' => ''])
->uriFor('step5',null,'CouponItem','bookingmanager','p2');
因此,我已将“正常”返回 url(仅包含我的扩展参数)发送到 PayPal,并使用 uri 构建器注册了第二个 url,以便从 PayPal 重定向到我的表单工作(这似乎已经很糟糕了)。
所以通过我的表单重定向到 PayPal 以及从 PayPal 重定向回我的表单正在工作,但现在我遇到了与上次尝试相同的问题。我的 URL 中的参数正确,但我无法访问它们:
DebuggerUtility::var_dump(GeneralUtility::_GET());
array(3 items)
tx_bookingmanager_p2 => array(2 items)
action => 'step5' (5 chars)
controller => 'CouponItem' (10 chars)
cHash => 'cbe7c08c1a45e85404a06877c453cb63' (32 chars)
id => '175' (3 chars)
那么如何允许第三方应用为特定控制器操作生成的自定义查询字符串参数?
【问题讨论】:
-
只是一些想法(不确定什么有效,因此不是答案):a)在生成重定向 URL 时尝试禁用
cHash生成。为此使用$this->uriBuilder->setUseCacheHash(false);。 b) 使生成的 URI 不被缓存。为此使用$this->uriBuilder->setNoCache(true);。 c) 使cHash计算忽略来自 PayPal 的附加参数。您可以在安装工具/LocalConfiguration.php中配置cHash计算忽略的参数,键[FE][cHashExcludedParameters]。 -
您好 Jost,感谢您的回复。如果我使用 a) 或 b),那么我再次收到 404 错误,可能是因为 [FE][pageNotFoundOnCHashError] 设置为 true。但是 c) 似乎有效,因此我不必使用空的 PayPal 参数注册第二个 uri 构建器。所以重定向现在正在工作,但我仍然无法从 PayPal 访问添加的参数 :(.
-
这正在工作:)。问题是由于在重定向网址中添加 setSection('form-multistep') 引起的,付款提供商似乎对此进行了转义并在其后添加了参数,因此 # 之后的所有参数都不起作用。
标签: forms typo3 query-string multi-step