Commit 538cd6e9 by xmy

Merge remote-tracking branch 'origin/ft-oem' into ft-oem

parents 9c17cbfc fd43c955
...@@ -7,155 +7,161 @@ use Swoft\App; ...@@ -7,155 +7,161 @@ use Swoft\App;
class CfgCenter class CfgCenter
{ {
const COS = 'cos'; //腾讯云存储
const CLS = 'cls'; //腾讯云日志服务
const CMQ = 'cmq'; //腾讯云cmq订阅消息
const ENCRYPT_KEY = 'encrypt_key'; //数据加密的key
const BACKEND_WEAPP = 'backend_weapp'; //蓝猫小程序配置
const FRONTEND_WEAPP = 'frontend_weapp'; //橙猫小程序配置
const ALIYUN_SMS = 'aliyun_sms'; //阿里云短信
const TENCENT_SMS = 'tencent_sms'; //腾讯云短信
const MP = 'mp'; //公众号-用于H5公众号登录和发送公众号通知
const PAY = 'pay'; //支付配置
const PAY_KUANYUAN = 'pay_kuanyuan'; //宽元的支付平台配置
const PAY_YUNMAI_ISP = 'pay_yunmai_isp'; //云脉的支付服务商配置,用于托管子商户
const PAY_ZHIMEI = 'pay_zhimei'; //致美的支付配置
const SELLER_DISTRIBUTION = 'seller_distribution'; //卖家分销配置
/** /**
* 读取指定的配置项 - 返回对象格式 * 根据用户token获取配置, 优先使用此方法读取配置
* (所有配置项,需预先添加到数据库中) * 用法:
* 方法一: * $cfgdata = CfgCenter::getByUser(CfgCenter::COS, $this->user);
* $value = CfgCenter::get('qCloud>Weapp>Region'); * var_dump($cfgdata['Region']); // 输出:ap-shanghai
* var_dump($value); // 输出:ap-shanghai * @param string $keyName
* 方法二: * @param \Hdll\Services\Common\Entity\User $user 用户token的实例对象
* $cfgdata = CfgCenter::get('qCloud');
* var_dump($cfgdata->Weapp->Region); // 输出:ap-shanghai
*
* @param string $keyStr
* @param string $default 默认返回值
* @return mixed * @return mixed
*/ */
public static function get($keyStr, $default = '', $oemId = 1) public static function getByUser($keyName, \Hdll\Services\Common\Entity\User $user)
{ {
$data = self::_get($keyStr, $oemId); if( is_numeric($user->getOemId()) ) { // oemId有可能等于0
if ($data == '') { return self::getByOemId($keyName, $user->getOemId());
return $default; } else if($user->getStoreId()) {
return self::getByStoreId($keyName, $user->getStoreId());
} else if($user->getUnionid()) {
return self::getByUnionId($keyName, $user->getUnionid());
} }
return $data;
} }
/** /**
* 读取指定的配置项 - 返回数组格式 * 根据oemId读取指定的配置项 - 返回数组格式
* (所有配置项,需预先添加到数据库中) * @param string $keyName
* 方法一: * @param int $oemId oemId==0表示是活动啦啦
* $value = CfgCenter::get('qCloud>Weapp>Region');
* var_dump($value); // 输出:ap-shanghai
* 方法二:
* $cfgdata = CfgCenter::get('qCloud');
* var_dump($cfgdata['Weapp']['Region']); // 输出:ap-shanghai
*
* @param string $keyStr
* @param string $default 默认返回值
* @param int $oemId
* @return mixed * @return mixed
*/ */
public static function getArray($keyStr, $default = '', $oemId = 1) public static function getByOemId($keyName, int $oemId)
{ {
$data = self::_get($keyStr, $oemId); return self::_get($keyName, $oemId);
if ($data == '') {
return $default;
}
if (is_object($data)) {
return json_decode(json_encode($data), true);
}
return $data;
} }
public function getByUnionId($keyStr, $unionId) /**
* 如果有oemId,尽量使用方法getByOemId()读取配置
* 根据storeId获取所属OEM平台的配置
*
* @param string $keyName
* @param string $storeId
* @return mixed
*/
public static function getByStoreId($keyName, int $storeId)
{ {
$dbConn = self::dbConnect(); $dbConn = self::dbConnect('seller');
$result = $dbConn->select("seller", ['oemId'], ['unionId' => $unionId]); $result = $dbConn->get("seller", ['oemId'], ['storeId' => $storeId]);
return self::_get($keyStr, $result['oemId']); return self::_get($keyName, (int)$result['oemId']);
} }
public function getByStoreId($keyStr, $storeId) /**
* 如果有oemId,尽量使用方法getByOemId()读取配置
* 根据sellerId获取所属OEM平台的配置
*
* @param string $keyName
* @param string $sellerId
* @return mixed
*/
public static function getBySellerId($keyName, int $sellerId)
{ {
$dbConn = self::dbConnect(); $dbConn = self::dbConnect('seller');
$result = $dbConn->select("seller", ['oemId'], ['storeId' => $storeId]); $result = $dbConn->get("seller", ['oemId'], ['sellerId' => $sellerId]);
return self::_get($keyStr, $result['oemId']); return self::_get($keyName, (int)$result['oemId']);
} }
public function getBySellerId($keyStr, $sellerId) /**
* 如果有oemId,尽量使用方法getByOemId()读取配置
* 根据unionId获取所属OEM平台的配置
*
* @param string $keyName
* @param string $unionId
* @return mixed
*/
public static function getByUnionId($keyName, string $unionId)
{ {
$dbConn = self::dbConnect(); $dbConn = self::dbConnect('seller');
$result = $dbConn->select("seller", ['oemId'], ['sellerId' => $sellerId]); $result = $dbConn->get("seller", ['oemId'], ['unionId' => $unionId]);
return self::_get($keyStr, $result['oemId']); return self::_get($keyName, (int)$result['oemId']);
} }
private static function _get($keyStr, $oemId = 1) /**
{ * 如果有oemId,尽量使用方法getCertByOemId()读取证书
$keyArr = self::parseKeyStr($keyStr); * 根据店铺id获取支付证书
$rkey = implode(":", $keyArr); *
$redis = App::getBean(Redis::class); * @param integer $storeId
$data = $redis->get("CONFIG_CENTER:$oemId:" . $rkey); * @return array
if ($data === null) { */
$res = self::dbFetch($keyStr, $oemId); public static function getCertByStoreId($keyName, $storeId) {
if ($res) { $dbConn = self::dbConnect('seller');
if (is_object($res[1])) { $result = $dbConn->get("seller", ['oemId'], ['storeId' => $storeId]);
$val = json_encode($res[1]); $oemId = (int)$result['oemId'];
} else { $dbConn = self::dbConnect();//连接配置库
$val = $res[1]; // 注意,需要返回oemId字段
} $result = $dbConn->get("config", ['oemId', 'certPem', 'keyPem'], ['oemId' => $oemId, 'name' => $keyName]);
$redis->set("CONFIG_CENTER:" . $res[0], $val, 3600); return $result;
return $res[1];
}
}
$obj = json_decode($data);
if ($obj && is_object($obj)) {
return $obj;
} }
return $data;
/**
* 根据oemId获取支付证书
*
* @param integer $oemId
* @return array
*/
public static function getCertByOemId($keyName, int $oemId) {
$dbConn = self::dbConnect();//连接配置库
// 注意,需要返回oemId字段
$result = $dbConn->get("config", ['oemId', 'certPem', 'keyPem'], ['oemId' => $oemId, 'name' => $keyName]);
return $result;
} }
protected static function dbFetch($keyStr, $oemId) /**
* 根据mchId获取对应的支付配置
*
* @param string $mchId
* @return mixed
*/
public static function getByMchId(int $mchId)
{ {
$keyArr = self::parseKeyStr($keyStr); $dbConn = self::dbConnect();//连接配置库
$name = array_shift($keyArr); $result = $dbConn->get("config", ['value'], ['mchId' => $mchId]);
$dbConn = self::dbConnect(); $resArr = json_decode($result['value'], true);
$result = $dbConn->select("config", ['name', 'value'], ['name' => $name, 'oemId' => $oemId]); return is_array($resArr) ? $resArr : $result['value'];
if (!isset($result[0]['value'])) {
return;
}
$valObj = json_decode($result[0]['value']);
if (!is_object($valObj)) {
return [$name, $result[0]['value']];
}
$keys = '';
foreach ($keyArr as $key) {
if (!isset($valObj->$key)) {
return;
}
$keys .= $key . ':';
$valObj = $valObj->$key;
}
$rkey = $name . ':' . trim($keys, ':');
return [trim($rkey, ':'), $valObj];
} }
public static function dbConnect() public static function dbConnect($database='')
{ {
if($database == '') {
$database = 'config_center';
}
if (\env('ENVIRONMENT', '') == '') { if (\env('ENVIRONMENT', '') == '') {
// 返回线上数据库连接 // 返回线上数据库连接
return new \Medoo\Medoo([ return new \Medoo\Medoo([
'database_type' => 'mysql', 'database_type' => 'mysql',
'database_name' => 'config_center', 'database_name' => $database,
'server' => '172.21.0.12', 'server' => '172.21.0.12',
'username' => 'configer', 'username' => 'configer',
'password' => 'Cfgsu#2390f*_', 'password' => 'Cfgsu#2390f*_',
'charset' => 'utf8' 'charset' => 'utf8'
]); ]);
} elseif (\env('ENVIRONMENT', '') == 'pre') {
// 返回测试数据库连接
return new \Medoo\Medoo([
'database_type' => 'mysql',
'database_name' => 'config_center',
'server' => '192.168.3.201',
'username' => 'hdller',
'password' => 'Hdlltest999',
'charset' => 'utf8'
]);
} else { } else {
// 返回测试数据库连接 // 返回测试数据库连接
return new \Medoo\Medoo([ return new \Medoo\Medoo([
'database_type' => 'mysql', 'database_type' => 'mysql',
'database_name' => 'config_center', 'database_name' => $database,
'server' => '192.168.3.202', 'server' => '192.168.3.202',
'username' => 'hdller', 'username' => 'hdller',
'password' => 'Hdlltest888', 'password' => 'Hdlltest888',
...@@ -164,21 +170,50 @@ class CfgCenter ...@@ -164,21 +170,50 @@ class CfgCenter
} }
} }
protected static function parseKeyStr($keyStr) private static function _get($keyName, int $oemId = 1)
{
$prefix = "CONFIG_CENTER:oemid_$oemId:";
$redis = App::getBean(Redis::class);
$data = $redis->get($prefix . $keyName);
if($data) {
$result = json_decode($data, true);
return is_array($result) ? $result : $data;
}
// 没有缓存则从数据库读取:
$valArr = self::_getConfigFromDb($keyName, $oemId);
if ($valArr) { //有内容时进行redis缓存
if (is_array($valArr)) {
$valArr['oemId'] = $oemId; //需要将oemId加入配置返回
$redis->set($prefix . $keyName, json_encode($valArr), 3600);
} else {
$redis->set($prefix . $keyName, $valArr, 3600);
}
}
return $valArr;
}
private static function _getConfigFromDb($keyName, $oemId)
{ {
$keyArr = explode(">", trim($keyStr, '>')); $dbConn = self::dbConnect();
foreach ($keyArr as $k => $v) { $result = $dbConn->select("config", ['value'], ['oemId' => $oemId, 'name' => $keyName]);
$v = trim($v); if (!isset($result[0]['value'])) {
if ($v == "") { if($oemId > 0) {
unset($keyArr[$k]); // 如果指定的oemId查找不到,则使用活动啦啦(oemId==0)的配置
$result = $dbConn->select("config", ['value'], ['oemId' => 0, 'name' => $keyName]);
if (!isset($result[0]['value'])) {
return;
}
} else { } else {
$keyArr[$k] = $v; return;
} }
} }
if (empty($keyArr)) { $valArr = json_decode($result[0]['value'], true);
throw new \Exception("[CfgCenter]未指定合法的Key"); if (!is_array($valArr)) {
return $result[0]['value'];
} }
return $keyArr; return $valArr;
} }
} }
...@@ -37,6 +37,11 @@ class User ...@@ -37,6 +37,11 @@ class User
return $this->getValue('id'); return $this->getValue('id');
} }
public function getOemId()
{
return $this->getValue('oemId');
}
public function setTestFlag() public function setTestFlag()
{ {
$this->setValue('testFlag', TestEnum::TEST_STORE_ID); $this->setValue('testFlag', TestEnum::TEST_STORE_ID);
......
...@@ -8,9 +8,6 @@ use Swoft\Redis\Redis; ...@@ -8,9 +8,6 @@ use Swoft\Redis\Redis;
class Xcrypt class Xcrypt
{ {
const CRYPT = 'cryptKey';
public static function encrypt(string $str, $key = '') public static function encrypt(string $str, $key = '')
{ {
$str = serialize($str); $str = serialize($str);
...@@ -42,7 +39,7 @@ class Xcrypt ...@@ -42,7 +39,7 @@ class Xcrypt
} }
private static function getKey(){ private static function getKey(){
$key = CfgCenter::get(self::CRYPT); $key = CfgCenter::getArray(CfgCenter::ENCRYPT_KEY);
if (empty($key)){ if (empty($key)){
throw new \Exception('加密密钥获取失败!'); throw new \Exception('加密密钥获取失败!');
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment