Я создал расширение формы многоэтапного заказа, которое собирает некоторые пользовательские данные и затем перенаправляет их на сторонние решения для этапа оплаты.
Это сторонние решения (такие как PayPal) требуют обратный 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)
Так как я могу разрешить настраиваемые параметры строки запроса, которые генерируются сторонним приложением для определенного действия контроллера?