function httpPostJson(string $url, array $data, int $timeout = 30): array {
$ch = curl_init();
$json = json_encode($data, JSON_UNESCAPED_UNICODE);
curl_setopt_array($ch, [
CURLOPT_URL => $url,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $json,
CURLOPT_RETURNTRANSFER => true, // 直接返回響應體
CURLOPT_HTTPHEADER => [
'Content-Type: application/json; charset=utf-8',
'Content-Length: ' . strlen($json),
'Accept: application/json',
],
CURLOPT_TIMEOUT => $timeout, // 總超時
CURLOPT_CONNECTTIMEOUT => 10, // 連接超時
CURLOPT_SSL_VERIFYPEER => false, // 測試環境跳過證書驗證
CURLOPT_SSL_VERIFYHOST => false,
]);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$error = curl_error($ch);
curl_close($ch);
if ($error) {
return ['code' => 0, 'error' => $error, 'http_code' => $httpCode];
}
return ['code' => $httpCode, 'data' => json_decode($response, true), 'raw' => $response];
}
$payload = [
'ccode' => '12345o61sd4d67w',
'ddate' => '2015-12-16',
'ccuscode' => '0100001',
'cinvcode' => '100101',
'iquantity'=> '1',
'address' => '測試地址',
'cmemo' => '無',
'cmaker' => 'demo',
'cverifer' => 'demo',
'dpredate' => '2015-12-17',
'imoney' => '1',
];
$url = 'https://61.153.225.106:5678/Service.asmx/WriteSomain';
$result = httpPostJson($url, $payload);
if ($result['code'] === 200) {
echo "成功: " . json_encode($result['data'], JSON_UNESCAPED_UNICODE);
} else {
echo "失敗 HTTP {$result['code']}: " . ($result['error'] ?? $result['raw']);
}
| 選項 | 作用 | 注意 |
|---|---|---|
| CURLOPT_RETURNTRANSFER | curl_exec 返回字符串而非直接輸出 | 必須設置 true |
| CURLOPT_POSTFIELDS | 發送的 JSON 字符串 | 需先 json_encode |
| Content-Type | 告知服務端負載格式 | application/json; charset=utf-8 |
| CURLOPT_SSL_VERIFYPEER | 驗證 SSL 證書 | 生產環境必須 true 並配置 CA 憑證 |
| CURLOPT_TIMEOUT | 整個請求最大秒數 | 防止掛死 |
curl_error($ch),常見「Connection refused」「Operation timed out」「SSL certificate problem」。Content-Type 標頭正確,部分框架需 php://input 讀取原始體。json_encode($data, JSON_UNESCAPED_UNICODE) + 標頭 charset=utf-8。CURLOPT_POSTFIELDSIZE 或分塊上傳。function httpPostJsonWithRetry(string $url, array $data, int $maxRetries = 3): array {
for ($i = 0; $i < $maxRetries; $i++) {
$result = httpPostJson($url, $data);
if ($result['code'] === 200 || $result['code'] >= 400 && $result['code'] < 500) {
return $result; // 成功或客戶端錯誤不重試
}
sleep(pow(2, $i)); // 指數退避 1s, 2s, 4s
}
return ['code' => 0, 'error' => 'Max retries exceeded'];
}
關鍵三點:**json_encode 編碼**、**設置正確 HTTP Header**、**啟用 RETURNTRANSFER 獲取響應**。生產環境務必開啟 SSL 驗證並配置超時重試策略。