对接阿里网商银行签名验证的坑

/**
* 生成签名
* @param $data
* @return bool|string
*/
public function sign($data){
$configFilePath='application/admin/certificate/yinqizhiliantest.pfx';//证书的位置
$dataTxt='application/admin/certificate/date.txt';//将参数写入的文件
$dataSign='application/admin/certificate/sign.txt';//生成签名写入的文件
if(!file_exists($configFilePath)) {//判断证书是否存在
return false;
}
$pkcs12 = file_get_contents($configFilePath);//读取证书的类容
$res=$this->createLinkString($data);//将参数进行序列化排序
//var_dump($res);die;
if(openssl_pkcs12_read($pkcs12,$certs,'mayibank')){//将证书的私钥和证书信息读取出来
//$privateKey=$certs['pkey'];
$myfile = fopen($dataTxt, "w") or die("Unable to open file!");//将要签名的参数写入文件中
$txt =$res;
fwrite($myfile, $txt);
fclose($myfile);
//$result=$this->getParamsString($res);
if(openssl_pkcs7_sign($dataTxt, $dataSign, $certs['cert'],$certs['pkey'],null,PKCS7_NOATTR)){//生成签名
//var_dump($dataSign);die;
$signature = file_get_contents($dataSign);//获取已写入文件的签名
//var_dump(mb_substr($signature,187,mb_strlen($signature)));die;
return mb_substr($signature,187,mb_strlen($signature));返回签名,因头部被默认加了代码先做截取后期优化
}
else {
return '';
}
} else {
return '';
}
}

/**
* 把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串,拼接时,不包括最后一个&字符
* @param $params
* @return string
*/
public function createLinkString($params){
ksort($params);
$str='';
foreach ($params as $key=>$value){
if(!empty($value)){
$str.=$key."=".$value."&";
}
}
$str=mb_substr($str,0,mb_strlen($str)-1);
return $str;
}
posted @ 2019-11-26 16:09  田宝宝  阅读(564)  评论(0编辑  收藏  举报