Возникли проблемы с преобразованием инструкции CURL в php-скрипт

#php #curl

#php #curl

Вопрос:

Я пытаюсь преобразовать следующую инструкцию CURL в PHP-скрипт и у меня возникают проблемы.

 curl -s -S -i -v --cert /etc/ssl/certs/TestCertificate.p12:password --cert-type p12 --cacert /etc/ssl/certs/TLSRootCA.pem --tlsv1.1 --header "Content-Type: application/json" https://example1.com/api/paymentrequests --data '{ "payeePaymentReference" : "0123456789", "callbackUrl" : "https://example2.com/callback.php", "payerAlias" : "345689123", "payeeAlias" : "123456789", "amount" : "10", "currency" : "USD", "message" : "Testing callback server" }'
  

Вот мой php-скрипт:

     <?php
    class APIController
    {
        public static function getRoutes()
        {
            $routes = [];

            $routes[] = new Route('GET /api', function () {
                $url = "https://example1.com/api/paymentrequests";
                $ch = curl_init();

                $data =
                    [
                        'payeePaymentReference' => '0123456789',
                        'callbackUrl'           => 'https://example2.com/callback.php',
                        'payerAlias'            => '345689123',
                        'payeeAlias'            => '123456789',
                        'amount'                => '10',
                        'currency'              => 'USD',
                        'message'               => 'Testing callback server'
                    ];

                $data_string = json_encode($data);

                $options = array(
                    CURLOPT_CUSTOMREQUEST   => 'POST',
                    CURLOPT_RETURNTRANSFER  => true,
                    CURLOPT_URL             => $url ,
                    CURLOPT_VERBOSE         => true,
                    CURLOPT_CAINFO          => '/etc/ssl/certs/TLSRootCA.pem',
                    CURLOPT_SSLCERT         => '/etc/ssl/certs/TestCertificate.p12',
                    CURLOPT_SSLCERTPASSWD   => 'password',
                    CURLOPT_SSLCERTTYPE     => 'P12',
                    CURLOPT_POST            => true,
                    CURLOPT_POSTFIELDS      => $data_string,
                    CURLOPT_HTTPHEADER      => [
                    'Content-Type: application/json'
                    ]
                );

                curl_setopt_array($ch , $options);

                $output = curl_exec($ch);

                if(!$output)
                {
                    echo "Curl Error : " . curl_error($ch);
                }
                else
                {
                    echo htmlentities($output);
                }

                return false;
            });

            return $routes;

        }

    }

$testObject = new APIController();

$testObject->getRoutes();

echo htmlentities($output);

?>
  

При запуске инструкции CURL в командной строке скрипт обратного вызова вызывается успешно и отображается HTTP 201 (успешный ответ на вызов). Однако, когда я запускаю скрипт php, ничего не отображается, и скрипт обратного вызова не вызывается. Был бы признателен за любые указания относительно того, что я делаю неправильно.

Ответ №1:

Используйте curl_errno для проверки наличия ошибок в запросах curl, вместо if(!$output)

 if (curl_errno($ch)) {
    echo "Curl Error : " . curl_error($ch);
}
  

Комментарии:

1. Привет, Никлаз, спасибо за совет. Вопрос — вы знаете, как я могу добавить параметры curl «-i», «-S» или «-v» к приведенной выше версии php-скрипта?

2. @DavidLee, лучший способ — это поиск эквивалента, выяснив, что означает фактический параметр, -i — флаг небезопасности, -s — беззвучный режим, -v — подробный. В php -i для параметра curl CURLOPT_SSL_VERIFYHOST установлено значение false , -s CURLOPT_MUTE установлено значение true , а -v CURLOPT_VERBOSE установлено значение true