最近因为业务需求,公司调用支付宝接口采用公钥证书方式,由于之前使用的是普通公钥方式,所以我也抽空研究了两者不同,最终在公钥证书方式下采用HTTP方式调用接口,成功请求支付宝接口,下面跟大家分享代码,首先是公钥证书方式下转化SN码代码:
/**
* 从证书中提取公钥
* @param $cert
* @return mixed
*/
function getPublicKey($certPath)
{
$cert = file_get_contents($certPath);
$pkey = openssl_pkey_get_public($cert);
$keyData = openssl_pkey_get_details($pkey);
$public_key = str_replace('-----BEGIN PUBLIC KEY-----', '', $keyData['key']);
$public_key = trim(str_replace('-----END PUBLIC KEY-----', '', $public_key));
return $public_key;
}
/**
* 从证书中提取序列号
* @param $cert
* @return string
*/
function getCertSN($certPath)
{
$cert = file_get_contents($certPath);
$ssl = openssl_x509_parse($cert);
$SN = md5(array2string(array_reverse($ssl['issuer'])) . $ssl['serialNumber']);
return $SN;
}
/**
* 提取根证书序列号
* @param $cert 根证书
* @return string|null
*/
function getRootCertSN($certPath)
{
$cert = file_get_contents($certPath);
$array = explode("-----END CERTIFICATE-----", $cert);
$SN = null;
for ($i = 0; $i < count($array) - 1; $i++) {
$ssl[$i] = openssl_x509_parse($array[$i] . "-----END CERTIFICATE-----");
if (strpos($ssl[$i]['serialNumber'], '0x') === 0) {
$ssl[$i]['serialNumber'] = hex2dec($ssl[$i]['serialNumber']);
}
if ($ssl[$i]['signatureTypeLN'] == "sha1WithRSAEncryption" ||
$ssl[$i]['signatureTypeLN'] == "sha256WithRSAEncryption") {
if ($SN == null) {
$SN = md5(array2string(array_reverse($ssl[$i]['issuer'])) .