收藏
回答

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;
?>
回答关注问题邀请回答
收藏

1 个回答

登录 后发表内容