背景:
微信支付的时候,需要使用证书。但是如果做 saas 平台,要存很多的证书,会很麻烦,就想把证书内容存入数据库。
问题:
curl 发送请求的时候,需要设置:curl_setopt($ch, CURLOPT_SSLCERT,'证书路径'),该参数只支持路径,不支持字符串。所以数据库取出来的证书内容不能直接用。
解决方法:
通过建立临时文件,将证书内容写入。再将该文件路径设置在 curl 的参数里即可。
请求完之后,就可以进行删除文件了。
注意点:
1、创建永久临时文件,完成后删除即可。不要创建自己会消失的,不然执行完就消失,curl读不到。
2、存在数据库的 pem 证书文件内容正常拷贝即可,不需要去掉换行、空格啥的。
代码:创建临时文件并返回路径
//获取临时文件的路径
publicfunction getTmpPathByContent($content)
{
$myfileUri= tempnam('','cert_'); //临时文件路径
$needle= fopen($myfileUri,'r+'); //打开文件
fwrite($needle,$content); //写入内容
return$myfileUri; // 返回路径
}
代码 - 部分:将内容写入并将路径设置给 curl
//定义pem 证书的路径
$sslCertUri = $this->getTmpPathByContent($merchant['pay_ssl_cert']);
$sslKeyUri= $this->getTmpPathByContent($merchant['pay_ssl_key']);//请求
$res = curl_post_ssl($refundUri, $refundDataXml, $sslCertUri, $sslKeyUri, '',[]);//halt($res);
unlink($sslCertUri); //删除文件
unlink($sslKeyUri); //删除文件
——占位符