appkey; $secret = $this->appSecret; $url = self::TOKEN_URL . '?' . http_build_query(compact('appid', 'secret')); $res = $this->httpPost([], $url); $data = Json::decode($res); return $data; } /** * POST请求接口方法 * @param string $method * @param array $params * @return bool|string */ public function requestPost(string $method,array $params = []) : array { $uri = self::API_URL . "?service={$method}"; $header = [ "Authorization:". "Bearer ".$this->token, "traceID:". uniqid(), "companyid:". $this->companyid, "mainAccount:". $this->mainAccount, "uid:". $this->uid ]; $postUrl = $uri; $curlPost = [ 'timestamp' => time() * 1000, 'appKey' => $this->appkey, 'version' => "V1.1.0", 'requestBody' => $this->encrypt($params), 'appSecret' => $this->appSecret ]; $curlPost['signature'] = $this->getKey($curlPost); unset($curlPost['appSecret']); // 初始化curl $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $postUrl); curl_setopt($curl, CURLOPT_HTTPHEADER, $header); curl_setopt($curl, CURLOPT_HEADER, 0); // 要求结果为字符串且输出到屏幕上 curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($curl, CURLOPT_TIMEOUT,30); // post提交方式 curl_setopt($curl, CURLOPT_POST, 1); curl_setopt($curl, CURLOPT_POSTFIELDS, $curlPost); // 运行curl $data = curl_exec($curl); curl_close($curl); $data = json_decode($data,true); // echo "
";
// echo "请求连接
";
// var_dump($uri);
// echo "响应
";
// var_dump($data);
// echo "业务参数
";
// var_dump($params);
// echo json_encode($params);
// echo "请求数据
";
// var_dump($curlPost);
// echo json_encode($curlPost);
// echo "请求头
";
// var_dump($header);
// 非0000请求失败信息提示
if (isset($data['code']) && $data['code'] != '0000') {
throw new \Exception($data['message']);
}
return $data;
}
/**
* 获取签名
* @param array $params
* @return string
*/
protected function getKey(array $params) : string
{
ksort($params, SORT_NATURAL | SORT_FLAG_CASE);//排序不区分大小写
$str = '';
foreach ($params as $k => $v) {
if ($k == 'signature' || $k == 'requestBody') continue;
$str .= $k . $v;
}
$str = 'key' . $str . 'secret';
// 对该字符串进行 SHA1 运算,得到一个十六进制的数
$encodeStr = strtoupper(sha1($str));
return $encodeStr;
}
/**
* 获取加密数据
* @param array $params
* @return string
*/
public function encrypt(array $params) : string
{
$requestBody = $params;
$key = $this->appSecret;
$body = json_encode($requestBody);
$l = strlen($key);
if ($l < 16)
$key = str_repeat($key, ceil(16 / $l));
if ($m = strlen($body) % 16)
$body .= str_repeat("\x00", 16 - $m);
return base64_encode(openssl_encrypt($body, "AES-128-CBC", $key, OPENSSL_RAW_DATA | OPENSSL_NO_PADDING, $key));
}
public function decrypt($str)
{
$key = $this->appSecret;
$l = strlen($key);
if ($l < 16)
$key = str_repeat($key, ceil(16 / $l));
return (openssl_decrypt(base64_decode($str), "AES-128-CBC", $key, OPENSSL_RAW_DATA | OPENSSL_NO_PADDING, $key));
}
private function httpPost($data,$url,$header = [])
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-type: application/json'));
curl_setopt($ch,CURLOPT_TIMEOUT,600);
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_POST,true);
curl_setopt($ch,CURLOPT_POSTFIELDS,$data);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
if ( !empty($header) ) {
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
}
if (strpos($url, 'https') !== false) {
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_SSLVERSION, 1);
}
$ret_data = trim(curl_exec($ch));
curl_close($ch);
return $ret_data;
}
}