PHP 微信支付v3签名生成

签名生成方法

// 解析url
$url_parts = parse_url($url);
$canonical_url = ($url_parts['path'] . (!empty($url_parts['query']) ? "?${url_parts['query']}" : ""));
// 获取时间戳
$timestamp = time();
// 获取随机字符串
$nonce = $this->randomString(32);
// 拼接签名字段
$message = $method . "\n" .
$canonical_url . "\n" .
$timestamp . "\n" .
$nonce . "\n" .
$data . "\n";

// 获取私钥文件
$mch_private_key = file_get_contents('path');
// 生成签名
openssl_sign($message, $raw_sign, $mch_private_key, 'sha256WithRSAEncryption');
$sign = base64_encode($raw_sign);

$token = sprintf(
'WECHATPAY2-SHA256-RSA2048 mchid="%s",nonce_str="%s",timestamp="%d",serial_no="%s",signature="%s"',
$merchantId, //商户ID
$nonce,
$timestamp,
$merchantSerialNumber, //商户证书序列号
$sign
);

// 设置响应头
curl_setopt($curl, CURLOPT_HTTPHEADER, array(
'Accept: application/json',
'Content-Type: application/json',
'User-Agent: /',
'Authorization: ' . $token,
));

生成随机字符串的方法

// 生成随机字符串
private function randomString($len = 32)
{
    $string = '';
    $char = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678';
    for ($i = 0; $i < $len; $i++) {
        $string .= $char[mt_rand(0, strlen($char) - 1)];
    }
    return $string;
}

新增

v3接口要求的RFC3339格式时间可以通过PHP的 DATE_RFC3339 常量生成

在这里插入图片描述

date(DATE_RFC3339, 'time')

你可能感兴趣的:(PHP,微信支付,php,thinkphp)