base-php/src/Handles/BvBeJHandle.php
2022-01-11 14:58:04 +08:00

228 lines
6.9 KiB
PHP

<?php
declare(strict_types=1);
namespace BvBeJ\Handles;
use GuzzleHttp\Client;
use GuzzleHttp\RequestOptions;
use GuzzleHttp\Exception\GuzzleException;
use Illuminate\Support\Facades\Log;
use Ramsey\Uuid\Rfc4122\UuidV4;
use Ramsey\Uuid\Uuid;
class BvBeJHandle
{
const DATE_FORMAT = 'Y-m-d H:i:s';
private static Client $client;
public function __construct()
{
self::$client = new Client();
}
/**
* Aes加密
* @param string $data
* @param string $key
* @param string $vi
* @return string|false
*/
public function AesEncrypt(string $data, string $key, string $vi): string|false
{
return base64_encode(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(base64_decode($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 = 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 "";
}
}
}