Я создал многошаговое расширение формы заказа, которое собирает некоторые пользовательские данные, а затем перенаправляет на различные сторонние решения для этапа оплаты.
Этим сторонним решениям (например, 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
Таким образом, сгенерированный URL-адрес перенаправления из PayPal в мою форму выглядит так:
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 и зарегистрировал второй URL-адрес с помощью построителя uri, чтобы перенаправление из 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)
Итак, как я могу разрешить настраиваемые параметры строки запроса, которые генерируются сторонним приложением для определенного действия контроллера?
cHash
при создании URL-адреса перенаправления. Используйте для этого$this->uriBuilder->setUseCacheHash(false);
. b) Сделать сгенерированный URI некэшируемым. Используйте для этого$this->uriBuilder->setNoCache(true);
. c) Сделайте так, чтобыcHash
расчет не учитывал дополнительные параметры от PayPal. Вы можете настроить параметры, которые будут игнорироваться для расчетаcHash
, в Инструменте установки/LocalConfiguration.php
, клавиша[FE][cHashExcludedParameters]
. - person Jost   schedule 18.05.2018