curl请求/签名

Posted nuomi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了curl请求/签名相关的知识,希望对你有一定的参考价值。

签名规则:

第一步,

◆ 参数名ASCII码从小到大排序(字典序);

◆ 验证调用返回或主动通知签名时,传送的sign参数不参与签名,将生成的签名与该sign值作校验。

 

第二步,

stringA最后拼接上app_secret得到stringSignTemp字符串,并对stringSignTemp进行MD5运算,得到sign

代码:

function make_sign($data, $Secret) {

ksort($data);
$kv_arr = array();
foreach ($data as $key => $val) {
if ($key == "sign" || $val == ‘‘) {
continue;
}
array_push($kv_arr, $key . ‘=‘ . $val);
}

$md5_string = implode(‘&‘, $kv_arr);
$key_str = $md5_string . ‘&key=‘ . $Secret;

return strtolower(md5($key_str));
}

接收json参数请求:
$req_param = json_decode(file_get_contents(‘php://input‘), true);

发送post json数据请求:
function curlJson($url, $params=array())
{

$query = json_encode($params);

$header = array(
‘Content-Type: application/json‘,
‘Content-Length: ‘ . strlen($query)
);

$bin = fetch_curl($url,array(
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $query, //注意CURL无法转换数组成为name[]=value&这种格式
CURLOPT_TIMEOUT => 60,
CURLOPT_HTTPHEADER => $header,
), $http_code);
return $bin;
}

/**
* @static
* 获取一个URL地址返回的内容
* @param string $url
* @param array $other_curl_opt 设置CURL选项
* @return mixed 成功则返回string,否则返回false
*/
function fetch_curl($url, $other_curl_opt = array(), &$http_code = 0)
{
$curl_opt = array(
CURLOPT_URL => $url,
CURLOPT_AUTOREFERER => true, //自动添加referer链接
CURLOPT_RETURNTRANSFER => true, //true: curl_exec赋值方式,false:curl_exec直接输出结果
CURLOPT_FOLLOWLOCATION => false, //自动跟踪301,302跳转
//CURLOPT_HTTPGET => TRUE, //默认为GET,无需设置
//CURLOPT_POST => TRUE,
//CURLOPT_POSTFIELDS => ‘username=abc&passwd=bcd‘,//也可以为数组array(‘username‘=>‘abc‘,‘passwd‘=>‘bcd‘)
CURLOPT_CONNECTTIMEOUT => 15, //秒
CURLOPT_USERAGENT => self::HTTP_AGENT,
//CURLOPT_COOKIE => ‘‘,
);

if($other_curl_opt)
foreach ($other_curl_opt as $key => $val)
$curl_opt[$key] = $val;

$ch = curl_init();
curl_setopt_array($ch, $curl_opt);
$contents = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

return $contents;
}

function curlPost($url, $params=array())
{

$query = http_build_query($params);
$header = array(
‘Content-Type: application/x-www-form-urlencoded‘,
‘Content-Length: ‘ . strlen($query)
);

$bin = Net::fetch($url,array(
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $query, //注意CURL无法转换数组成为name[]=value&这种格式
CURLOPT_TIMEOUT => 60,

), $http_code);
return $bin;
}

function curlhttps($url, $params=array(),$method=‘GET‘)
{
$header = array(
‘Content-Type: application/x-www-form-urlencoded;charset=utf-8‘,
);
$curl = curl_init(); // 启动一个CURL会话
curl_setopt($curl, CURLOPT_URL, $url); // 要访问的地址
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); // 对认证证书来源的检查
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); // 从证书中检查SSL加密算法是否存在
//curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER[‘HTTP_USER_AGENT‘]); // 模拟用户使用的浏览器
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); // 使用自动跳转
curl_setopt($curl, CURLOPT_AUTOREFERER, 1); // 自动设置Referer
if($method==‘POST‘){
curl_setopt($curl, CURLOPT_POST, 1); // 发送一个常规的Post请求
curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
if ($params){
$query = http_build_query($params);
curl_setopt($curl, CURLOPT_POSTFIELDS, $query); // Post提交的数据包
}
}
curl_setopt($curl, CURLOPT_TIMEOUT, 30); // 设置超时限制防止死循环
curl_setopt($curl, CURLOPT_HEADER, 0); // 显示返回的Header区域内容
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); // 获取的信息以文件流的形式返回
$tmpInfo = curl_exec($curl); // 执行操作
curl_close($curl); // 关闭CURL会话
return $tmpInfo; // 返回数据
}

function curlheaderhttps($url, $params=array(),$method=‘GET‘)
{
$header[] = ‘Content-Type: multipart/form-data;charset=utf-8‘;
foreach ($params as $k=>$val){
$header[] = "$k:$val";
}

$curl = curl_init(); // 启动一个CURL会话
curl_setopt($curl, CURLOPT_URL, $url); // 要访问的地址
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); // 对认证证书来源的检查
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); // 从证书中检查SSL加密算法是否存在
//curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER[‘HTTP_USER_AGENT‘]); // 模拟用户使用的浏览器
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); // 使用自动跳转
curl_setopt($curl, CURLOPT_AUTOREFERER, 1); // 自动设置Referer
if($method==‘POST‘){
curl_setopt($curl, CURLOPT_POST, 1); // 发送一个常规的Post请求
curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
if ($params){
$query = http_build_query($params);
curl_setopt($curl, CURLOPT_POSTFIELDS, $query); // Post提交的数据包
}
}
curl_setopt($curl, CURLOPT_TIMEOUT, 30); // 设置超时限制防止死循环
curl_setopt($curl, CURLOPT_HEADER, 0); // 显示返回的Header区域内容
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); // 获取的信息以文件流的形式返回
$tmpInfo = curl_exec($curl); // 执行操作
curl_close($curl); // 关闭CURL会话
return $tmpInfo; // 返回数据
}

function curlFilePost($url, $header=array(),$fp,$size)
{


if(!$fp)exit(‘文件为空‘);
if(!$header){
$header = array(
‘Content-Type: application/x-www-form-urlencoded‘,
‘Content-Length: ‘ . strlen($query)
);
}

$bin = Net::fetch($url,array(
CURLOPT_POST => true,
CURLOPT_TIMEOUT => 60,
CURLOPT_UPLOAD => 1,
CURLOPT_INFILE => $fp,
CURLOPT_INFILESIZE => $size,
CURLOPT_HTTPHEADER => $header,
), $http_code);
return $bin;
}


以上是关于curl请求/签名的主要内容,如果未能解决你的问题,请参考以下文章

postman 自动生成 curl 代码片段

如何将自签名证书与 XAMPP 一起用于使用 cURL 的 HTTPS 请求?

如何验证对 Binance API 的 cURL 请求?

有啥方法可以让 curl 连接并让我在输入时输入和发送身体片段?

Curl 错误 60,SSL 证书问题:证书链中的自签名证书

使用PHP中的curl发送请求