Authorization签名总不成功
{"code":"INVALID_REQUEST","message":"头部信息不完整"}
<?php
// 商户号
$mch_id = '199999';
// 商户API私钥路径
$private_key_path = 'apiclient_key.pem';
// 证书序列号
$serial_no = '5780E68666666BDECEBED64D7625392';
// 请求的API地址
$url = 'https://api.mch.weixin.qq.com/v3/merchant-service/complaints-v2';
// 请求的参数
$params = [
'limit' => 50, // 每页返回的投诉单数
'offset' => 0, // 查询起始位置
'begin_date' => '2024-11-01', // 查询开始日期
'end_date' => '2024-11-30', // 查询结束日期
// 被投诉商户号(可选)
'complainted_mchid' => '19999', // 不传查询所有
];
// 生成请求签名
function generate_signature($method, $url, $params, $private_key_path, $mch_id, $serial_no) {
// 获取请求时间戳
$timestamp = time();
// 生成请求随机串
$nonce_str = bin2hex(random_bytes(16));
// 构造请求的查询字符串
$query_str = http_build_query($params);
$absolute_url = parse_url($url, PHP_URL_PATH) . '?' . $query_str;
// 构造签名串
$sign_str = "{$method}\n{$absolute_url}\n{$timestamp}\n{$nonce_str}\n\n";
// 使用私钥对签名串进行签名
openssl_sign($sign_str, $signature, file_get_contents($private_key_path), OPENSSL_ALGO_SHA256);
// Base64编码签名
$signature_base64 = base64_encode($signature);
// 构造 Authorization 头部
$auth_header = sprintf(
'WECHATPAY2-SHA256-RSA2048 mchid="%s",nonce_str="%s",signature="%s",timestamp="%d",serial_no="%s"',
$mch_id,
$nonce_str,
$signature_base64,
$timestamp,
$serial_no
);
return $auth_header;
}
// 发起GET请求
function send_get_request($url, $params, $auth_header) {
$query_str = http_build_query($params);
$url_with_params = $url . '?' . $query_str;
// 初始化cURL
$ch = curl_init($url_with_params);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"Authorization: $auth_header",
"Accept: application/json",
]);
$response = curl_exec($ch);
if(curl_errno($ch)) {
echo 'Curl error: ' . curl_error($ch);
}
curl_close($ch);
return $response;
}
// 生成签名
$auth_header = generate_signature('GET', $url, $params, $private_key_path, $mch_id, $serial_no);
// 发送请求并获取响应
$response = send_get_request($url, $params, $auth_header);
// 输出响应结果
echo $response;
?>