PHP Regex для ответа Paypal Payflow

Я работаю над Paypal Payflow для оплаты, и сейчас у меня проблемы с получением ответа Paypal.

Ответы PayPal отправляются в формате, указанном ниже.

RESULT=0&RESPMSG=Approved&SECURETOKEN[25]=Fj+1AFUWft0+I0CUFOKh5WA== &SECURETOKENID=9a9ea8208de1413abc3d60c86cb1f4c5  

Значение внутри квадратных скобок [] — это длина фактического значения. Например, SECURETOKEN — это параметр, и его значение равно «Fj+1AFUWft0+I0CUFOKh5WA==». имеет длину 25 символов.

Как я могу извлечь каждый параметр и его соответствующее значение из результата в PHP. Я не так хорошо разбираюсь в регулярных выражениях, и мне не удалось найти какое-либо решение в Интернете.

Разделение с помощью & и = в этом случае не работает.

Вы можете использовать \[(\d+)\]=[^=]+, можете ли вы опубликовать еще несколько примеров?

Code Maniac 18.07.2019 19:23

@CodeManiac Это один из примеров, которые Paypal предоставил на своем веб-сайте RESULT=0&RESPMSG=Approved&SECURETOKEN[25]=Fj+1AFUWft0+I0CUFO‌​Kh5WA== &SECURETOKENID=9a9ea8208de1413abc3d60c86cb1f4c5

Kalesh Kaladharan 18.07.2019 19:29

@CodeManiac Не всегда необходимо, чтобы поле длины было доступно в строке. Кроме того, как я могу получить массив значений имени с помощью этого регулярного выражения. Благодарю за ваш ответ.

Kalesh Kaladharan 18.07.2019 19:31

Предыдущий не будет работать, если ваша строка значений содержит = внутри, так как она соответствует =, позвольте мне настроить ее и придумать лучший, не могли бы вы поделиться ссылкой, откуда вы взяли приведенный выше пример ответа.

Code Maniac 18.07.2019 19:33

@CodeManiac developer.paypal.com/docs/classic/payflow/integration-guide/‌​…

Kalesh Kaladharan 18.07.2019 19:38

@cale_b Вы правы. Я возьму лучший метод. Я не видел другого варианта, когда просил Regex.

Kalesh Kaladharan 18.07.2019 19:56
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
6
127
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Строка выглядит как 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

Code Maniac 18.07.2019 19:54

Мне нравится этот подход, за исключением того, что я просто потерял строку, которую действительно хотел, как есть. Значение «Fj+1AFUWft0+I0CUFOKh5WA==» должно быть передано как есть на сервер Paypal для обработки.

Kalesh Kaladharan 18.07.2019 19:59

@KaleshKaladharan В PHP также есть функция для этого, urlencode() перед отправкой в ​​​​PayPal.

MonkeyZeus 18.07.2019 20:02

@MonkeyZeus «Не кодируйте URL-адрес данных параметра «имя-значение», поскольку это может вызвать проблемы с аутентификацией и отчетами». Это заявление от Paypal привело меня в замешательство.

Kalesh Kaladharan 18.07.2019 20:04

Я исправляю пробелы в + sginal. ;)

rray 18.07.2019 20:06

@KaleshKaladharan Ну, вы не должны применять его ко всей строке запроса, а только к одному значению. Читайте документы.

MonkeyZeus 18.07.2019 20:08

@MonkeyZeus Да, я понял. Я просто беспокоюсь о других закодированных символах. Скажите что-то вроде «%». Знак + был только из образца, который был у них на сайте. Там нет других подробностей, чтобы интерпретировать, какие символы они могут отправлять.

Kalesh Kaladharan 18.07.2019 20:14

@KaleshKaladharan Я действительно не знаю, что тебе сказать. Если вы знаете веб-стандарты лучше, чем PHP, тогда вперед и делайте свой собственный беспорядок.

MonkeyZeus 18.07.2019 20:17

@MonkeyZeus Спасибо :)

Kalesh Kaladharan 18.07.2019 20:20

@MonkeyZeus Я только что проверил с urlencode, и значение SECURETOKEN после кодирования равно Fj+1AFUWft0+I0CUFOKh5WA%3D%3D вместо Fj+1AFUWft0+I0CUFOKh5WA==.

Kalesh Kaladharan 19.07.2019 08:46

@KaleshKaladharan Да, и вы утверждаете, что это проблема? Вы сделали что-то не так. Вы должны получить Fj+1AFUWft0+I0CUFOKh5WA%3D%3D+. Обратите внимание на знак плюса в конце.

MonkeyZeus 19.07.2019 13:49

@MonkeyZeus У меня нет пробела в моем вводе :) Более того, разве это не проблема, когда мы имеем дело с платежными решениями? Неважно, я решил заменить пробелы знаком +, как это было предложено rray

Kalesh Kaladharan 19.07.2019 14:30

@KaleshKaladharan Да, вы знаете, это прямо в вашем вопросе.

MonkeyZeus 19.07.2019 14:31

Использование этот ответ для анализа ответа в массив — правильное начало. Вот как получить доступ к этим значениям из массива:

$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'

Другие вопросы по теме