我已经创建了一个多步骤订单扩展,它收集了一些用户数据,然后重定向到不同的第三方解决方案,用于支付步骤。
这种第三方解决方案(如PayPal)需要返回url以找到返回到我的表单的方式。当前的工作流程如下所示:
-
我的表格:收集用户数据
-
我的表单:重定向到带有返回url的支付提供商
-
支付提供商:收集用于支付的用户数据
-
付款提供商:重定向回我的表单
-
我的表格:用收集的数据显示订单详细信息
-
付款提供商:提交订单
-
我的表单:重定向到成功页面
我希望到目前为止这是可以理解的。我坚持执行第4步,因为从支付提供商返回到我的表单的每个重定向都以404结尾,因为支付提供商添加了一些我的表单不知道的查询字符串参数。我认为这里的问题是,这些参数没有经过计算,这就是它们失败的原因。
在步骤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结尾,因为我认为这个鸿沟对于这个被操纵的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中,并且仍然再次添加这些参数,因此生成的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)
那么,如何允许由第三方应用程序为特定控制器操作生成的自定义查询字符串参数呢?