Paypal получает детали транзакции с помощью PHP cURL

Итак, после долгих поисков я наконец смог успешно получить свой токен доступа Paypal с помощью PHP cURL. Теперь я пытаюсь получить сведения о транзакции на основе идентификатора транзакции. До сих пор я думаю, что получил правильный URL-адрес вызова, однако я думаю, что форматирование данных моего поста может быть неправильным. Используемый код находится ниже:

<?php

//this function is for handling post call requests
function make_post_call($url, $postdata) {
    global $token;
    $curl = curl_init($url); 
    curl_setopt($curl, CURLOPT_POST, true);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true);
    curl_setopt($curl, CURLOPT_SSLVERSION , 6);
    curl_setopt($curl, CURLOPT_HEADER, false);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($curl, CURLOPT_HTTPHEADER, array(
                'Authorization: Bearer '.$token,
                'Accept: application/json',
                'Content-Type: application/json'
                ));

    curl_setopt($curl, CURLOPT_POSTFIELDS, $postdata); 
    $response = curl_exec( $curl );
    print_r($response); //IM NOW RECEIVING OUTPUT, however symbols are now being replaced by placeholders such as '%40', how can i prevent this?
    if (empty($response)) {
        die(curl_error($curl)); //close due to error
        curl_close($curl); 
    } else {
        $info = curl_getinfo($curl);
        echo "Time took: " . $info['total_time']*1000 . "ms\n";
        curl_close($curl); // close cURL handler
        if($info['http_code'] != 200 && $info['http_code'] != 201 ) {
            echo "Received error: " . $info['http_code']. "\n";
            echo "Raw response:".$response."\n";
            die();
        }
    }
    // Convert the result from JSON format to a PHP array 
    $jsonResponse = json_decode($response, TRUE);
    return $jsonResponse;
}

$token = get_access_token($url,$postArgs); //works and returns a valid access token

//This is the URL for the call
$url = 'https://api-3t.sandbox.paypal.com/nvp';

//This is the data to be sent in the call 
$postdata = array(
'USER' => 'peoplesroewrwwsg_api1.outlook.com', 
'PWD' => 'KR2TVKHGDSHSNDJ6E2', 
'SIGNATURE' => 'AFcWxV21C7fdFHSGGSDGD51G0BJYUWOCSyjUAKPPGs', 
'METHOD' => 'GetTransactionDetails', 
'VERSION' => '123', 
'TransactionID' => '1RE953245246192109'
);

$postdata = http_build_query($postdata); 
//$postdata = json_encode($postdata); //Is this the correct way of formatting? 

$transactionInfo = make_post_call($url, $postdata); //get transaction details NOT WORKING

print_r($transactionInfo); //does not print anything
?> 

я не получаю никаких ошибок cURL, поэтому я предполагаю, что проблема либо в данных, которые я отправляю, либо в том, как я их форматирую.

Краткое руководство по PayPal о том, как это сделать, можно найти здесь-> https://developer.paypal.com/docs/classic/express-checkout/gs_transaction/#tryit Однако он написан в cURL, а не в расширении PHP cURL, поэтому я не уверен, правильно ли отправляю данные.

Детали Paypal GetTransactionDetails здесь-> https://developer.paypal.com/docs/classic/api/merchant/GetTransactionDetails_API_Operation_NVP/

Любые рекомендации относительно форматирования данных или любые другие предложения приветствуются!

-------------------------------------------------- -------ОБНОВИТЬ!----------------------------------------- ------------------

Теперь, когда я печатаю результат, как только выполняется инструкция cURL, я получаю такую ​​информацию:

RECEIVERID=GN7SRQEGEREASDV9BQU&EMAIL=peoplesrobotiblabal%40outlook%2ecom&PAYERID=JC5RWUUKWGDFYJYY&PAYERSTATUS=verified&COUNTRYCODE=US&SHIPTONAME=Jane%20Smurf...

Как видно, некоторые символы, такие как точки, заменяются заполнителями, такими как «% 40». Можно ли определить источник этого? это потому, что я ожидаю ответа JSON?


person DiscreteTomatoes    schedule 16.05.2016    source источник
comment
В документации четко указано имя => пары значений, а не JSON. Используйте http_build_query() для создания данных публикации. А с чего вы взяли, что ответ будет в формате JSON?   -  person frz3993    schedule 17.05.2016
comment
Привет! большое спасибо за предложение (также я просто предполагаю, что ответ в формате JSON, я не уверен, что это на самом деле). Я изменил его обратно на http_build_query() и добавил оператор печати, который печатал результат cURL, как только он был получен внутри функции, и теперь я получаю правильный вывод! однако некоторые символы заменяются заполнителями, такими как «% 40»   -  person DiscreteTomatoes    schedule 17.05.2016
comment
Это декодированная строка URL, которая требуется при выполнении http-запроса. Можете ли вы закомментировать все print_r и просто выполнить var_dump($POST) после того, как сделаете запрос на завивку. Пожалуйста, обновите вопрос с результатом. Я думаю, что API сделает запрос обратной почты.   -  person frz3993    schedule 17.05.2016
comment
хорошо, var_dump($response) приводит к той же строке, что и представленная выше, а var_dump($_POST) приводит к-> array(0) { } РЕДАКТИРОВАТЬ: также извините, если я не понимаю вас полностью, например, я не уверен, что ответный почтовый запрос   -  person DiscreteTomatoes    schedule 17.05.2016
comment
Нет, это было только мое предположение, потому что ответ выглядит как строка запроса. В этом случае вы можете попробовать parse_str($response, $response_array). Где $response_array будет содержать ответ в виде элементов массива.   -  person frz3993    schedule 17.05.2016
comment
решит ли этот метод проблему с измененными символами? Я предполагаю, что мне придется использовать функцию php, такую ​​​​как preg_replace(), чтобы повторно ввести правильные символы, это правда? РЕДАКТИРОВАТЬ: Да, это работает хорошо! символы были возвращены, и все находится в хорошем ассоциативном массиве! frz3993 Я бы с радостью принял ваш ответ, если бы вы разместили его с информацией, которую вы разместили в этих комментариях!   -  person DiscreteTomatoes    schedule 17.05.2016


Ответы (2)


Чтобы построить строку запроса http из массива PHP, вы можете использовать PHP http_build_query(). Пример:

$array = ['username' => 'John', 'password' => '123456abc'];
$postdata = http_build_query($array);

Упомянутый вами символ представляет собой закодированную форму специальных символов. Запрос Http потребует, чтобы строка запроса была urlencoded. %40 — это URL-кодированная форма @. Если в будущем вам потребуется кодирование/декодирование в/из строки с urlencoded, вы можете использовать rawurldecode(), rawurlencode(), urlencode() и urldecode().

Для разбора ответа от PAYPAL NVP API. Вы можете использовать parse_str(). Пример 1:

$response = 'status=success&code=02';
parse_str($response, $response_array);
//$response_array will contain the $response as array

Пример 2:

$response = 'status=success&code=02';
parse_str($response);
//this will display success
echo $status;
//this will display 02
echo $code;
person frz3993    schedule 17.05.2016

Получение информации от cURL

$str = RECEIVERID=GN7SRQEGEREASDV9BQU&EMAIL=peoplesrobotiblabal%40outlook%2ecom&PAYERID=JC5RWUUKWGDFYJYY&PAYERSTATUS=verified&COUNTRYCODE=US&SHIPTONAME=Jane%20Smurf...

Пожалуйста, используйте parse_str("$str"); // add your value here, it will give you proper data format

Подробнее: https://www.w3schools.com/php/func_string_parse_str.asp

person umesh dabhi    schedule 09.02.2019