我正在尝试为支付网关 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