[add] BvBeJ
This commit is contained in:
227
src/Handles/BvBeJHandle.php
Normal file
227
src/Handles/BvBeJHandle.php
Normal file
@ -0,0 +1,227 @@
|
||||
<?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 $this->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);
|
||||
$http_build_query = http_build_query($form);
|
||||
try {
|
||||
$signature = $this->AesEncrypt($http_build_query, $key, $vi);
|
||||
if ($signature === false) {
|
||||
return false;
|
||||
}
|
||||
$response = self::$client->post($url, [
|
||||
RequestOptions::FORM_PARAMS => $form,
|
||||
RequestOptions::HEADERS => [
|
||||
'Signature' => $signature,
|
||||
'Signature-Date' => 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 "";
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user