我创建了一个多步骤订单扩展,它收集一些用户数据,然后重定向到支付步骤的不同第三方解决方案。
这个第三方解决方案(如 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 中并且仍然再次添加这个参数,所以生成的 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)
那么如何允许由第三方应用程序为特定控制器操作生成的自定义查询字符串参数呢?