114 lines
3.0 KiB
PHP
114 lines
3.0 KiB
PHP
<?php
|
||
declare(strict_types=1);
|
||
|
||
namespace Fastknife\Service;
|
||
|
||
|
||
use Fastknife\Domain\Factory;
|
||
use Fastknife\Exception\ParamException;
|
||
use Fastknife\Utils\AesUtils;
|
||
|
||
abstract class Service
|
||
{
|
||
/**
|
||
* @var Factory 工厂
|
||
*/
|
||
protected $factory;
|
||
|
||
protected $originData;
|
||
|
||
public function __construct($config)
|
||
{
|
||
$defaultConfig = require dirname(__DIR__) . '/config.php';
|
||
$config = array_merge($defaultConfig, $config);
|
||
$this->factory = new Factory($config);
|
||
}
|
||
|
||
abstract public function get();
|
||
|
||
|
||
abstract public function validate( $token, $pointJson, $callback = null);
|
||
|
||
/**
|
||
* 一次验证
|
||
* @param $token
|
||
* @param $pointJson
|
||
*/
|
||
public function check($token, $pointJson)
|
||
{
|
||
$this->validate($token, $pointJson, function () use ($token, $pointJson) {
|
||
$this->setEncryptCache($token, $pointJson);
|
||
});
|
||
}
|
||
|
||
private function setEncryptCache($token, $pointJson){
|
||
$cacheEntity = $this->factory->getCacheInstance();
|
||
$pointStr = AesUtils::decrypt($pointJson, $this->originData['secretKey']);
|
||
$key = AesUtils::encrypt($token. '---'. $pointStr, $this->originData['secretKey']);
|
||
$cacheEntity->set($key,
|
||
[
|
||
'token' => $token,
|
||
'point' => $pointJson
|
||
],
|
||
600
|
||
);
|
||
}
|
||
|
||
|
||
/**
|
||
* 二次验证
|
||
* @param $token
|
||
* @param $pointJson
|
||
*/
|
||
public function verification($token, $pointJson)
|
||
{
|
||
$this->validate($token, $pointJson, function () use ($token) {
|
||
$cacheEntity = $this->factory->getCacheInstance();
|
||
$cacheEntity->delete($token);
|
||
});
|
||
}
|
||
|
||
/**
|
||
* 二次验证,必须要先执行一次验证才能调用二次验证
|
||
* 兼容前端 captchaVerification 传值
|
||
* @param string $encryptCode
|
||
*/
|
||
public function verificationByEncryptCode(string $encryptCode)
|
||
{
|
||
$result = $this->factory->getCacheInstance()->get($encryptCode);
|
||
if(empty($result)){
|
||
throw new ParamException('参数错误!');
|
||
}
|
||
|
||
$this->validate($result['token'], $result['point'], function () use ($result,$encryptCode) {
|
||
$cacheEntity = $this->factory->getCacheInstance();
|
||
$cacheEntity->delete($result['token']);
|
||
$cacheEntity->delete($encryptCode);
|
||
});
|
||
|
||
}
|
||
|
||
/**
|
||
* 解码坐标点
|
||
* @param $secretKey
|
||
* @param $point
|
||
* @return array
|
||
*/
|
||
protected function encodePoint($secretKey, $point): array
|
||
{
|
||
$pointJson = AesUtils::decrypt($point, $secretKey);
|
||
if ($pointJson == false) {
|
||
throw new ParamException('aes验签失败!');
|
||
}
|
||
return json_decode($pointJson, true);
|
||
}
|
||
|
||
protected function setOriginData($token){
|
||
$cacheEntity = $this->factory->getCacheInstance();
|
||
$this->originData = $cacheEntity->get($token);
|
||
if (empty($this->originData)) {
|
||
throw new ParamException('参数校验失败:token');
|
||
}
|
||
}
|
||
}
|