Я работаю над Paypal Payflow для оплаты, и сейчас у меня проблемы с получением ответа Paypal.
Ответы PayPal отправляются в формате, указанном ниже.
RESULT=0&RESPMSG=Approved&SECURETOKEN[25]=Fj+1AFUWft0+I0CUFOKh5WA== &SECURETOKENID=9a9ea8208de1413abc3d60c86cb1f4c5
Значение внутри квадратных скобок [] — это длина фактического значения. Например, SECURETOKEN — это параметр, и его значение равно «Fj+1AFUWft0+I0CUFOKh5WA==». имеет длину 25 символов.
Как я могу извлечь каждый параметр и его соответствующее значение из результата в PHP. Я не так хорошо разбираюсь в регулярных выражениях, и мне не удалось найти какое-либо решение в Интернете.
Разделение с помощью & и = в этом случае не работает.
@CodeManiac Это один из примеров, которые Paypal предоставил на своем веб-сайте RESULT=0&RESPMSG=Approved&SECURETOKEN[25]=Fj+1AFUWft0+I0CUFOKh5WA== &SECURETOKENID=9a9ea8208de1413abc3d60c86cb1f4c5
@CodeManiac Не всегда необходимо, чтобы поле длины было доступно в строке. Кроме того, как я могу получить массив значений имени с помощью этого регулярного выражения. Благодарю за ваш ответ.
Предыдущий не будет работать, если ваша строка значений содержит = внутри, так как она соответствует =, позвольте мне настроить ее и придумать лучший, не могли бы вы поделиться ссылкой, откуда вы взяли приведенный выше пример ответа.
@CodeManiac developer.paypal.com/docs/classic/payflow/integration-guide/…
@cale_b Вы правы. Я возьму лучший метод. Я не видел другого варианта, когда просил Regex.






Строка выглядит как URL-адрес, поэтому используется простой подход [parse_str()][1], который преобразует данную строку в «хорошо отформатированный» массив.
Важно, что возврат функции будет храниться во втором аргументе ($keys в этом примере).
$str = 'RESULT=0&RESPMSG=Approved&SECURETOKEN[25]=Fj+1AFUWft0+I0CUFOKh5WA== &SECURETOKENID=9a9ea8208de1413abc3d60c86cb1f4c5';
parse_str($str, $keys);
print_r($keys);
Выход:
Array
(
[RESULT] => 0
[RESPMSG] => Approved
[SECURETOKEN] => Array
(
[25] => Fj 1AFUWft0 I0CUFOKh5WA==
)
[SECURETOKENID] => 9a9ea8208de1413abc3d60c86cb1f4c5
)
Если есть собственный способ, вы должны использовать его, не нужно регулярное выражение +1
Мне нравится этот подход, за исключением того, что я просто потерял строку, которую действительно хотел, как есть. Значение «Fj+1AFUWft0+I0CUFOKh5WA==» должно быть передано как есть на сервер Paypal для обработки.
@KaleshKaladharan В PHP также есть функция для этого, urlencode() перед отправкой в PayPal.
@MonkeyZeus «Не кодируйте URL-адрес данных параметра «имя-значение», поскольку это может вызвать проблемы с аутентификацией и отчетами». Это заявление от Paypal привело меня в замешательство.
Я исправляю пробелы в + sginal. ;)
@KaleshKaladharan Ну, вы не должны применять его ко всей строке запроса, а только к одному значению. Читайте документы.
@MonkeyZeus Да, я понял. Я просто беспокоюсь о других закодированных символах. Скажите что-то вроде «%». Знак + был только из образца, который был у них на сайте. Там нет других подробностей, чтобы интерпретировать, какие символы они могут отправлять.
@KaleshKaladharan Я действительно не знаю, что тебе сказать. Если вы знаете веб-стандарты лучше, чем PHP, тогда вперед и делайте свой собственный беспорядок.
@MonkeyZeus Спасибо :)
@MonkeyZeus Я только что проверил с urlencode, и значение SECURETOKEN после кодирования равно Fj+1AFUWft0+I0CUFOKh5WA%3D%3D вместо Fj+1AFUWft0+I0CUFOKh5WA==.
@KaleshKaladharan Да, и вы утверждаете, что это проблема? Вы сделали что-то не так. Вы должны получить Fj+1AFUWft0+I0CUFOKh5WA%3D%3D+. Обратите внимание на знак плюса в конце.
@MonkeyZeus У меня нет пробела в моем вводе :) Более того, разве это не проблема, когда мы имеем дело с платежными решениями? Неважно, я решил заменить пробелы знаком +, как это было предложено rray
@KaleshKaladharan Да, вы знаете, это прямо в вашем вопросе.
Использование этот ответ для анализа ответа в массив — правильное начало. Вот как получить доступ к этим значениям из массива:
$str = 'RESULT=0&RESPMSG=Approved&SECURETOKEN[25]=Fj+1AFUWft0+I0CUFOKh5WA== &SECURETOKENID=9a9ea8208de1413abc3d60c86cb1f4c5';
parse_str( $str, $values );
Теперь, чтобы получить нужные значения:
$tokens = $values['SECURETOKEN'];
// results in an array: ['25' => 'Fj+1AFUWft0+I0CUFOKh5WA=='];
$token = reset( $tokens ); // results in 'Fj+1AFUWft0+I0CUFOKh5WA=='
$length = key( $tokens ); // results in '25'
Вы можете использовать
\[(\d+)\]=[^=]+, можете ли вы опубликовать еще несколько примеров?