Я пытаюсь создать оболочку для API платежного шлюза. Я решил использовать GuzzleHttp
. Вот основной код, который у меня сейчас есть. Поскольку шлюз ожидает, что входные данные будут отправлены через HTTP POST в формате JSON, я попробовал два возможных способа:
- Использование опции
json
и присвоение ей массива на основе ключей. - Явная установка
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