Отправка JSON с помощью GuzzleHttp\Client: возврат 401 Несанкционированная ошибка

Я пытаюсь создать оболочку для API платежного шлюза. Я решил использовать GuzzleHttp. Вот основной код, который у меня сейчас есть. Поскольку шлюз ожидает, что входные данные будут отправлены через HTTP POST в формате JSON, я попробовал два возможных способа:

  1. Использование опции json и присвоение ей массива на основе ключей.
  2. Явная установка content-type на application/json и отправка строки в формате json через body.

Код:

$client = new Client([
          'base_uri' => 'https://sandbox.gateway.com',
]);

$input = [
        'merchant_id' => '12345-33445',
        'security_key' => '**********',
        'operation' => 'ping',
    ];


$clientHandler = $client->getConfig('handler');
$tapMiddleware = Middleware::tap(function ($request) {
    foreach($request->getHeaders() as $h=>$v){
        echo $h . ': ' . print_r($v) . PHP_EOL;
    }
});

try {
    $response = $client->post(
        '/pg/auth',
        [
            'timeout' => 30,
            'headers' => [
                'Content-Type' => 'application/json',
                'Cache-Control' =>  'no-cache',
            ],
            'body' => json_encode($input),
            'debug' => true,
            'handler' => $tapMiddleware($clientHandler)
        ]
    );

    print_r($response);
} catch(Exeption $e){
    print_r($e);
}

К сожалению, шлюз вернулся с ошибкой 401, хотя учетные данные верны. Я подозреваю, что способ отправки запроса имеет проблему. Я пришел к такому выводу, поскольку все заголовки, напечатанные из функции tap, представляют собой arrays (особенно content-type), а не строки. В отличие от того, что описано здесь http://guzzle.readthedocs.org/en/latest/request-options.html?highlight=request#json.

Array
(
    [0] => GuzzleHttp/6.1.1 curl/7.43.0 PHP/5.5.29
)
User-Agent: 1
Array
(
    [0] => sandbox.gateway.com
)
Host: 1
Array
(
    [0] => application/json
)
Content-Type: 1

person mishka    schedule 05.12.2015    source источник


Ответы (1)


Как насчет отправки запроса, как было предложено?

$client = new Client([
    'base_uri' => 'https://sandbox.gateway.com',
]);

$client->request('POST', '/pg/auth', [
    'timeout' => 30,
    'debug' => true,
    'json' => [
        'merchant_id' => '12345-33445',
        'security_key' => '**********',
        'operation' => 'ping',
    ],
]);

Для справки см. http://docs.guzzlephp.org/en/latest/request-options.html#json.

person localheinz    schedule 20.12.2015
comment
Пробовал и это. То же самое. Похоже, именно так отправляются заголовки, и теперь мне интересно, почему документация не распространяется на это. - person mishka; 22.12.2015