mirror of
https://github.com/crmeb/CRMEB.git
synced 2026-10-31 06:50:51 +00:00
Merge branch 'v5.0.0dev' of https://gitee.com/ZhongBangKeJi/CRMEB into v5.0.0dev
This commit is contained in:
commit
9b77dc4890
@ -11,9 +11,11 @@
|
||||
namespace app\adminapi\controller;
|
||||
|
||||
use crmeb\services\CacheService;
|
||||
use crmeb\utils\Rsa;
|
||||
use think\facade\App;
|
||||
use crmeb\utils\Captcha;
|
||||
use app\services\system\admin\SystemAdminServices;
|
||||
use think\facade\Cache;
|
||||
|
||||
/**
|
||||
* 后台登陆
|
||||
@ -83,7 +85,7 @@ class Login extends AuthController
|
||||
* @throws \think\db\exception\DbException
|
||||
* @throws \think\db\exception\ModelNotFoundException
|
||||
*/
|
||||
public function login()
|
||||
public function login(Rsa $rsa)
|
||||
{
|
||||
[$account, $password, $key, $captchaVerification, $captchaType] = $this->request->postMore([
|
||||
'account',
|
||||
@ -93,9 +95,6 @@ class Login extends AuthController
|
||||
['captchaType', '']
|
||||
], true);
|
||||
|
||||
if (strlen(trim($password)) < 6 || strlen(trim($password)) > 32) {
|
||||
return app('json')->fail(400762);
|
||||
}
|
||||
|
||||
if ($captchaVerification != '') {
|
||||
try {
|
||||
@ -105,10 +104,25 @@ class Login extends AuthController
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
if (strlen(trim($password)) > 500) {
|
||||
return app('json')->fail(400762);
|
||||
}
|
||||
$password = $rsa->privateDecrypt($password);
|
||||
} catch (\Throwable $e) {
|
||||
return app('json')->fail($e->getMessage());
|
||||
}
|
||||
|
||||
if (strlen(trim($password)) < 6 || strlen(trim($password)) > 32) {
|
||||
return app('json')->fail(400762);
|
||||
}
|
||||
|
||||
$this->validate(['account' => $account, 'pwd' => $password], \app\adminapi\validate\setting\SystemAdminValidata::class, 'get');
|
||||
|
||||
|
||||
$result = $this->services->login($account, $password, 'admin', $key);
|
||||
if (!$result) {
|
||||
$num = CacheService::get('login_captcha',1);
|
||||
$num = CacheService::get('login_captcha', 1);
|
||||
if ($num > 1) {
|
||||
return app('json')->fail(400140, ['login_captcha' => 1]);
|
||||
}
|
||||
|
||||
@ -35,6 +35,7 @@ use crmeb\exceptions\AdminException;
|
||||
use crmeb\exceptions\ApiException;
|
||||
use crmeb\exceptions\PayException;
|
||||
use crmeb\services\CacheService;
|
||||
use crmeb\services\easywechat\orderShipping\MiniOrderService;
|
||||
use crmeb\services\FormBuilder as Form;
|
||||
use crmeb\services\printer\Printer;
|
||||
use crmeb\services\SystemConfigService;
|
||||
@ -2495,6 +2496,11 @@ HTML;
|
||||
'help_status' => 1
|
||||
];
|
||||
}
|
||||
// 判断是否开启小程序订单管理
|
||||
$orderData['order_shipping_open'] = false;
|
||||
if (sys_config('order_shipping_open', 0) && MiniOrderService::isManaged()) {
|
||||
$orderData['order_shipping_open'] = true;
|
||||
}
|
||||
return $orderData;
|
||||
}
|
||||
|
||||
|
||||
@ -23,6 +23,7 @@ use app\services\system\SystemMenusServices;
|
||||
use crmeb\services\CacheService;
|
||||
use crmeb\services\FormBuilder;
|
||||
use crmeb\services\workerman\ChannelService;
|
||||
use crmeb\utils\Rsa;
|
||||
use think\facade\Config;
|
||||
use think\facade\Event;
|
||||
use think\Model;
|
||||
@ -167,7 +168,8 @@ class SystemAdminServices extends BaseServices
|
||||
'copyright' => sys_config('nncnL_crmeb_copyright', ''),
|
||||
'version' => get_crmeb_version(),
|
||||
'key' => $key,
|
||||
'login_captcha' => 0
|
||||
'login_captcha' => 0,
|
||||
'publicKey' => app()->make(Rsa::class)->getPublicKey()
|
||||
];
|
||||
if (CacheService::get('login_captcha', 1) > 1) {
|
||||
$data['login_captcha'] = 1;
|
||||
|
||||
@ -11,6 +11,7 @@
|
||||
|
||||
namespace crmeb\services\app;
|
||||
|
||||
use app\services\order\StoreOrderTakeServices;
|
||||
use crmeb\exceptions\AdminException;
|
||||
use crmeb\services\SystemConfigService;
|
||||
use app\services\pay\PayNotifyServices;
|
||||
@ -108,7 +109,7 @@ class MiniProgramService
|
||||
'log' => [
|
||||
'level' => 'debug',
|
||||
'permission' => 0777,
|
||||
'file' => '/www/wwwroot/bz.wuht.net/crmeb/crmeb/runtime/log',
|
||||
'file' => '/www/wwwroot/bz.wuht.net/crmeb/crmeb/runtime/log/easywechat.log',
|
||||
],
|
||||
];
|
||||
$config['mini_program'] = [
|
||||
@ -880,26 +881,22 @@ class MiniProgramService
|
||||
switch ($message->MsgType) {
|
||||
case 'event':
|
||||
switch (strtolower($message->Event)) {
|
||||
case 'trade_manage_remind_access_api':
|
||||
Log::error('event1');
|
||||
case 'trade_manage_remind_access_api': // 小程序完成账期授权时 小程序产生第一笔交易时 已产生交易但从未发货的小程序,每天一次
|
||||
break;
|
||||
case 'trade_manage_remind_shipping':
|
||||
Log::error('event2');
|
||||
case 'trade_manage_remind_shipping': // 曾经发过货的小程序,订单超过48小时未发货时
|
||||
break;
|
||||
case 'trade_manage_order_settlement':
|
||||
Log::error('event3');
|
||||
case 'trade_manage_order_settlement': // 订单完成发货时 订单结算时
|
||||
if (isset($message['estimated_settlement_time'])) { //订单完成发货时
|
||||
|
||||
}
|
||||
if (isset($message['confirm_receive_method'])) { // 订单结算时
|
||||
/** @var StoreOrderTakeServices $StoreOrderTakeServices */
|
||||
$storeOrderTakeServices = app()->make(StoreOrderTakeServices::class);
|
||||
$storeOrderTakeServices->takeOrder($message['merchant_trade_no'], 0);
|
||||
}
|
||||
break;
|
||||
};
|
||||
break;
|
||||
case 'trade_manage_remind_access_api':
|
||||
Log::error('notevent1');
|
||||
break;
|
||||
case 'trade_manage_remind_shipping':
|
||||
Log::error('notevent2');
|
||||
break;
|
||||
case 'trade_manage_order_settlement':
|
||||
Log::error('notevent3');
|
||||
break;
|
||||
};
|
||||
});
|
||||
}
|
||||
|
||||
@ -19,6 +19,8 @@ class BaseOrder extends AbstractAPI
|
||||
const ORDER = 'wxa/sec/order/';
|
||||
const EXPRESS = 'cgi-bin/express/delivery/open_msg/';
|
||||
|
||||
const PATH = '/pages/goods/order_details/index';
|
||||
|
||||
|
||||
public function __construct(AccessToken $accessToken, $config)
|
||||
{
|
||||
@ -164,7 +166,7 @@ class BaseOrder extends AbstractAPI
|
||||
$params = [
|
||||
'appid' => $this->config['config']['mini_program']['app_id']
|
||||
];
|
||||
return $this->resultHandle($this->parseJSON('POST', [self::BASE_API . self::ORDER . 'notify_confirm_receive', json_encode($params)]));
|
||||
return $this->resultHandle($this->parseJSON('POST', [self::BASE_API . self::ORDER . 'is_trade_managed', json_encode($params)]));
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@ -8,7 +8,6 @@ use EasyWeChat\Core\Exceptions\HttpException;
|
||||
|
||||
class MiniOrderService
|
||||
{
|
||||
|
||||
/**
|
||||
* @var Application
|
||||
*/
|
||||
@ -25,11 +24,11 @@ class MiniOrderService
|
||||
{
|
||||
$payment = SystemConfigService::more(['routine_appId', 'routine_appsecret', 'pay_weixin_mchid', 'pay_new_weixin_open', 'pay_new_weixin_mchid']);
|
||||
return [
|
||||
'debug' => true,
|
||||
'debug' => true,
|
||||
'log' => [
|
||||
'level' => 'debug',
|
||||
'level' => 'debug',
|
||||
'permission' => 0777,
|
||||
'file' => '/www/wwwroot/bz.wuht.net/crmeb/crmeb/runtime/log',
|
||||
'file' => '/www/wwwroot/bz.wuht.net/crmeb/crmeb/runtime/log/easywechat.log',
|
||||
],
|
||||
'mini_program' => [
|
||||
'app_id' => $payment['routine_appId'] ?? '',
|
||||
|
||||
@ -103,6 +103,9 @@ class OrderClient extends BaseOrder
|
||||
'contact' => $contact
|
||||
];
|
||||
}
|
||||
|
||||
// 跳转路径
|
||||
$this->setMesJumpPath(self::PATH . '?order_id=' . $out_trade_no);
|
||||
return $this->shipping($params);
|
||||
}
|
||||
|
||||
|
||||
194
crmeb/crmeb/utils/Rsa.php
Normal file
194
crmeb/crmeb/utils/Rsa.php
Normal file
@ -0,0 +1,194 @@
|
||||
<?php
|
||||
/**
|
||||
* +----------------------------------------------------------------------
|
||||
* | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
|
||||
* +----------------------------------------------------------------------
|
||||
* | Copyright (c) 2016~2022 https://www.crmeb.com All rights reserved.
|
||||
* +----------------------------------------------------------------------
|
||||
* | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
|
||||
* +----------------------------------------------------------------------
|
||||
* | Author: CRMEB Team <admin@crmeb.com>
|
||||
* +----------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
namespace crmeb\utils;
|
||||
|
||||
/**
|
||||
* Class Rsa
|
||||
* @author 等风来
|
||||
* @email 136327134@qq.com
|
||||
* @date 2023/5/16
|
||||
* @package crmeb\utils
|
||||
*/
|
||||
class Rsa
|
||||
{
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
protected $publicKey;
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
protected $privateKey;
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
protected $basePath;
|
||||
|
||||
/**
|
||||
* 获取证书文件
|
||||
* @param $publicKey
|
||||
* @param $privateKey
|
||||
*/
|
||||
public function __construct(string $publicKey = 'cert_public_password.key', string $privateKey = 'cert_private_password.key')
|
||||
{
|
||||
$this->basePath = app()->getRootPath();
|
||||
if ($publicKey) {
|
||||
$this->publicKey = $this->basePath . $publicKey;
|
||||
}
|
||||
if ($privateKey) {
|
||||
$this->privateKey = $this->basePath . $publicKey;
|
||||
}
|
||||
if (!is_file($this->publicKey) || !is_file($this->privateKey)) {
|
||||
$this->exportOpenSSLFile();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @return false|string
|
||||
* @author 等风来
|
||||
* @email 136327134@qq.com
|
||||
* @date 2023/5/16
|
||||
*/
|
||||
public function getPublicKey()
|
||||
{
|
||||
if (!is_file($this->publicKey)) {
|
||||
$this->exportOpenSSLFile();
|
||||
}
|
||||
|
||||
return file_get_contents($this->publicKey);
|
||||
}
|
||||
|
||||
/**
|
||||
* 生成证书
|
||||
* @return bool
|
||||
*/
|
||||
public function exportOpenSSLFile($passwork = null)
|
||||
{
|
||||
|
||||
$publicKey = $privateKey = '';
|
||||
$dir = app()->getRootPath() . 'runtime/conf';
|
||||
$conf = 'openssl.cnf';
|
||||
if (!is_dir($dir)) {
|
||||
mkdir($dir, 0700);
|
||||
}
|
||||
if (!file_exists($conf)) {
|
||||
touch($dir . '/' . $conf);
|
||||
}
|
||||
|
||||
//参数设置
|
||||
$config = [
|
||||
"digest_alg" => "sha256",
|
||||
//字节数 512 1024 2048 4096 等
|
||||
"private_key_bits" => 1024,
|
||||
"config" => $dir . '/' . $conf,
|
||||
//加密类型
|
||||
"private_key_type" => OPENSSL_KEYTYPE_RSA,
|
||||
];
|
||||
|
||||
//创建私钥和公钥
|
||||
$res = openssl_pkey_new($config);
|
||||
if ($res == false) {
|
||||
//创建失败,请检查openssl.cnf文件是否存在
|
||||
return false;
|
||||
}
|
||||
|
||||
//将密钥导出为PEM编码的字符串,并输出(通过引用传递)。
|
||||
openssl_pkey_export($res, $privateKey, $passwork, $config);
|
||||
$publicKey = openssl_pkey_get_details($res);
|
||||
$publicKey = $publicKey["key"];
|
||||
|
||||
//生成证书
|
||||
$createPublicFileRet = file_put_contents($this->publicKey, $publicKey);
|
||||
$createPrivateFileRet = file_put_contents($this->privateKey, $privateKey);
|
||||
if (!($createPublicFileRet || $createPrivateFileRet)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
openssl_free_key($res);
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* 数据加密
|
||||
* @param string $data
|
||||
* @param string|null $passwork
|
||||
* @return false|string
|
||||
* @author 等风来
|
||||
* @email 136327134@qq.com
|
||||
* @date 2023/5/16
|
||||
*/
|
||||
function privateEncrypt(string $data, string $passwork = null)
|
||||
{
|
||||
$encrypted = '';
|
||||
$pi_key = openssl_pkey_get_private(file_get_contents($this->privateKey), $passwork);//这个函数可用来判断私钥是否是可用的,可用返回资源id Resource id
|
||||
//最大允许加密长度为117,得分段加密
|
||||
$plainData = str_split($data, 100);//生成密钥位数 1024 bit key
|
||||
foreach ($plainData as $chunk) {
|
||||
$partialEncrypted = '';
|
||||
$encryptionOk = openssl_private_encrypt($chunk, $partialEncrypted, $pi_key);//私钥加密
|
||||
if ($encryptionOk === false) {
|
||||
return false;
|
||||
}
|
||||
$encrypted .= $partialEncrypted;
|
||||
}
|
||||
|
||||
$encrypted = base64_encode($encrypted);//加密后的内容通常含有特殊字符,需要编码转换下,在网络间通过url传输时要注意base64编码是否是url安全的
|
||||
return $encrypted;
|
||||
}
|
||||
|
||||
/**
|
||||
* RSA公钥解密(私钥加密的内容通过公钥可以解密出来)
|
||||
* @param string $public_key 公钥
|
||||
* @param string $data 私钥加密后的字符串
|
||||
* @return string $decrypted 返回解密后的字符串
|
||||
* @author mosishu
|
||||
*/
|
||||
function publicDecrypt(string $data)
|
||||
{
|
||||
$decrypted = '';
|
||||
$pu_key = openssl_pkey_get_public(file_get_contents($this->publicKey));//这个函数可用来判断公钥是否是可用的
|
||||
$plainData = str_split(base64_decode($data), 128);//生成密钥位数 1024 bit key
|
||||
foreach ($plainData as $chunk) {
|
||||
$str = '';
|
||||
$decryptionOk = openssl_public_decrypt($chunk, $str, $pu_key);//公钥解密
|
||||
if ($decryptionOk === false) {
|
||||
return false;
|
||||
}
|
||||
$decrypted .= $str;
|
||||
}
|
||||
return $decrypted;
|
||||
}
|
||||
|
||||
/**
|
||||
* 私钥解密
|
||||
* @param string $data
|
||||
* @return mixed
|
||||
* @author 等风来
|
||||
* @email 136327134@qq.com
|
||||
* @date 2023/5/16
|
||||
*/
|
||||
public function privateDecrypt(string $data)
|
||||
{
|
||||
if (!is_file($this->privateKey)) {
|
||||
$this->exportOpenSSLFile();
|
||||
}
|
||||
|
||||
openssl_private_decrypt(base64_decode($data), $decryptedData, file_get_contents($this->privateKey));
|
||||
|
||||
return $decryptedData;
|
||||
}
|
||||
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user