签名生成方法
// 解析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')