工欲善其事,必先利其器
封装一个规范、多用、满足各种场景的cURL请求方法,不仅可以提高研发效率,而且保障项目代码质量、便于维护。
<?php
/**
* cURL请求方法
*
* @param string $url 目标地址
* @param string $sData post数据
* @param string $second 最大请求时间
* @param string $aHeader Header头
* @param string $aCertfile cert file path
* @return array 返回网页内容
*/
function curl_post_ssl($url, $sData, $second = 30, $aHeader = [], $aCertfile = [])
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_TIMEOUT, $second);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
if( isset($aCertfile['cert']) ){
curl_setopt($ch, CURLOPT_SSLCERTTYPE, 'PEM');
curl_setopt($ch, CURLOPT_SSLCERT, $aCertfile['cert']);
}
if( isset($aCertfile['key']) ){
curl_setopt($ch, CURLOPT_SSLKEYTYPE, 'PEM');
curl_setopt($ch, CURLOPT_SSLKEY, $aCertfile['key']);
}
if( count($aHeader) >= 1 ){
curl_setopt($ch, CURLOPT_HTTPHEADER, $aHeader);
}
if( $sData ){
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $sData);
}
$data = curl_exec($ch);
if ($data) {
curl_close($ch);
return $data;
} else {
$error = curl_errno($ch);
curl_close($ch);
return false;
}
}
//POST 数据
$apiParams = [
//...
];
//目标地址
$sGateway = "https://openapi.alipay.com/gateway.do";
//您获取的accessToken
$accessToken = "xxxx";
//Example 1:请求accessToken认证的网关接口
$sResponse = curl_post_ssl( $sGateway, http_build_query($apiParams), 30, ["Authorization: bearer {$accessToken}"] );
//目标地址
$sGateway = "https://api.mch.weixin.qq.com/secapi/pay/refund";
$certFile = [
'cert' => "./wechat/apiclient_cert.pem",
'key' => "./wechat/apiclient_key.pem"
];
//Example 2:请求带SSL证书认证的网关接口
$sResponse = curl_post_ssl($sGateway, $apiParams, 6, [], $certFile);