Base64UrlEncode(openssl_encrypt($data, 'AES-128-CBC', $key, OPENSSL_CIPHER_AES_128_CBC, $vi)); } /** * Aes解密 * @param string $data * @param string $key * @param string $vi * @return string|false */ public function AesDecrypt(string $data, string $key, string $vi): string|false { return openssl_decrypt($this->Base64UrlDecode($data), 'AES-128-CBC', $key, OPENSSL_CIPHER_AES_128_CBC, $vi); } /** * @param string $data * @param bool $strict * @return string */ public function Base64UrlEncode(string $data, bool $strict = false): string { if ($strict) { return rtrim(strtr(base64_encode($data), '+/', '-_'), '='); } return str_replace(['+', '/'], ['-', '_'], base64_encode($data)); } /** * @param string $data * @param bool $strict * @return string */ public function Base64UrlDecode(string $data, bool $strict = false): string { if ($strict) { return base64_decode(str_pad(strtr($data, '-_', '+/'), strlen($data) % 4, '=', STR_PAD_RIGHT)); } return base64_decode(str_replace(['-', '_'], ['+', '/'], $data)); } /** * @param string $url * @param array $params * @param array $header * @return string */ public function PostJsonRequest(string $url, array $params, array $header = []): string { try { $response = self::$client->post($url, [ RequestOptions::JSON => $params, RequestOptions::HEADERS => $header ]); return $response->getBody()->getContents(); } catch (GuzzleException $exception) { Log::error("SignatureRequestHttpPostByAes Error", [ 'msg' => $exception->getMessage() ]); return ''; } } /** * 签名调用请求 * * @param string $url * @param $productID * @param string $key * @param string $vi * @param array $params * @return string|false */ public function SignatureRequestHttpPostByAes(string $url, $productID, string $key, string $vi, array $params): string|false { $timestamp = time(); $form = array_merge($params, [ 't' => $timestamp ]); ksort($form); $sign = urldecode(http_build_query($form)); try { $signature = $this->AesEncrypt($sign, $key, $vi); if ($signature === false) { return false; } $response = self::$client->post($url, [ RequestOptions::FORM_PARAMS => $form, RequestOptions::HEADERS => [ 'Signature' => $signature, 'Signature-Datetime' => date($this::DATE_FORMAT, $timestamp), 'Product-ID' => $productID ] ]); } catch (GuzzleException $exception) { Log::error("SignatureRequestHttpPostByAes Error", [ 'msg' => $exception->getMessage() ]); return false; } return $response->getBody()->getContents(); } /** * 钉钉报警 * * @param string $accessToken * @param string $secret * @param array $params * @return bool */ public function DingTalkAlert(string $accessToken, string $secret, array $params): bool { try { $timestamp = getMicroTime(); $signData = $timestamp . "\n" . $secret; $hash_hmac = hash_hmac('sha256', $signData, $secret, true); $sign = urlencode(base64_encode($hash_hmac)); $httpQuery = http_build_query([ 'access_token' => $accessToken, 'sign' => $sign, 'timestamp' => $timestamp, ]); $response = self::$client->post('https://oapi.dingtalk.com/robot/send?' . $httpQuery, [ RequestOptions::JSON => $params, RequestOptions::HEADERS => [ 'Content-Type' => 'application/json;charset=utf-8' ] ]); $body = json_decode($response->getBody()->getContents(), true); return ($body['errcode'] ?? false) === 0; } catch (GuzzleException $exception) { Log::error("DingTalkAlert Error", [ 'msg' => $exception->getMessage() ]); return false; } } /** * 有道翻译 * * @param string $appID * @param string $secret * @param string $text * @param string $lang * @return string */ function YouDaoTextTranslator(string $appID, string $secret, string $text, string $lang): string { if ($lang === 'hk') { $lang = 'zh-CHT'; } $uuid4 = Uuid::uuid4(); $uuid = $uuid4->toString(); $timestamp = (string)now()->utc()->timestamp; $len = mb_strlen($text); if ($len > 20) { $input = mb_substr($text, 0, 10) . $len . mb_substr($text, $len - 10, $len); $signStr = $appID . $input . $uuid . $timestamp . $secret; } else { $signStr = $appID . $text . $uuid . $timestamp . $secret; } $sign = hash('sha256', $signStr); try { $response = self::$client->post("https://openapi.youdao.com/api", [ RequestOptions::FORM_PARAMS => [ 'q' => $text, 'from' => 'zh-CHS', 'to' => $lang, 'appKey' => $appID, 'salt' => $uuid, 'sign' => $sign, 'signType' => "v3", 'curtime' => $timestamp, 'strict' => "true", ], RequestOptions::HEADERS => [ 'Content-Type' => 'application/x-www-form-urlencoded;charset=utf-8' ] ]); $body = json_decode($response->getBody()->getContents(), true); if (($body['errorCode'] ?? false) === '0') { return $body['translation'][0]; } return ""; } catch (GuzzleException $e) { Log::error("YouDaoTextTranslator Error", [ 'msg' => $e->getMessage() ]); return ""; } } }