Просмотр исходного кода

Merge branch 'v5.0.0dev' of https://gitee.com/ZhongBangKeJi/CRMEB into v5.0.0dev

evoxwht 2 лет назад
Родитель
Сommit
9b77dc4890

+ 19 - 5
crmeb/app/adminapi/controller/Login.php

@@ -11,9 +11,11 @@
 namespace app\adminapi\controller;
 namespace app\adminapi\controller;
 
 
 use crmeb\services\CacheService;
 use crmeb\services\CacheService;
+use crmeb\utils\Rsa;
 use think\facade\App;
 use think\facade\App;
 use crmeb\utils\Captcha;
 use crmeb\utils\Captcha;
 use app\services\system\admin\SystemAdminServices;
 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\DbException
      * @throws \think\db\exception\ModelNotFoundException
      * @throws \think\db\exception\ModelNotFoundException
      */
      */
-    public function login()
+    public function login(Rsa $rsa)
     {
     {
         [$account, $password, $key, $captchaVerification, $captchaType] = $this->request->postMore([
         [$account, $password, $key, $captchaVerification, $captchaType] = $this->request->postMore([
             'account',
             'account',
@@ -93,9 +95,6 @@ class Login extends AuthController
             ['captchaType', '']
             ['captchaType', '']
         ], true);
         ], true);
 
 
-        if (strlen(trim($password)) < 6 || strlen(trim($password)) > 32) {
-            return app('json')->fail(400762);
-        }
 
 
         if ($captchaVerification != '') {
         if ($captchaVerification != '') {
             try {
             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');
         $this->validate(['account' => $account, 'pwd' => $password], \app\adminapi\validate\setting\SystemAdminValidata::class, 'get');
+
+
         $result = $this->services->login($account, $password, 'admin', $key);
         $result = $this->services->login($account, $password, 'admin', $key);
         if (!$result) {
         if (!$result) {
-            $num = CacheService::get('login_captcha',1);
+            $num = CacheService::get('login_captcha', 1);
             if ($num > 1) {
             if ($num > 1) {
                 return app('json')->fail(400140, ['login_captcha' => 1]);
                 return app('json')->fail(400140, ['login_captcha' => 1]);
             }
             }

+ 6 - 0
crmeb/app/services/order/StoreOrderServices.php

@@ -35,6 +35,7 @@ use crmeb\exceptions\AdminException;
 use crmeb\exceptions\ApiException;
 use crmeb\exceptions\ApiException;
 use crmeb\exceptions\PayException;
 use crmeb\exceptions\PayException;
 use crmeb\services\CacheService;
 use crmeb\services\CacheService;
+use crmeb\services\easywechat\orderShipping\MiniOrderService;
 use crmeb\services\FormBuilder as Form;
 use crmeb\services\FormBuilder as Form;
 use crmeb\services\printer\Printer;
 use crmeb\services\printer\Printer;
 use crmeb\services\SystemConfigService;
 use crmeb\services\SystemConfigService;
@@ -2495,6 +2496,11 @@ HTML;
                 'help_status' => 1
                 'help_status' => 1
             ];
             ];
         }
         }
+        // 判断是否开启小程序订单管理
+        $orderData['order_shipping_open'] = false;
+        if (sys_config('order_shipping_open', 0) && MiniOrderService::isManaged()) {
+            $orderData['order_shipping_open'] = true;
+        }
         return $orderData;
         return $orderData;
     }
     }
 
 

+ 3 - 1
crmeb/app/services/system/admin/SystemAdminServices.php

@@ -23,6 +23,7 @@ use app\services\system\SystemMenusServices;
 use crmeb\services\CacheService;
 use crmeb\services\CacheService;
 use crmeb\services\FormBuilder;
 use crmeb\services\FormBuilder;
 use crmeb\services\workerman\ChannelService;
 use crmeb\services\workerman\ChannelService;
+use crmeb\utils\Rsa;
 use think\facade\Config;
 use think\facade\Config;
 use think\facade\Event;
 use think\facade\Event;
 use think\Model;
 use think\Model;
@@ -167,7 +168,8 @@ class SystemAdminServices extends BaseServices
             'copyright' => sys_config('nncnL_crmeb_copyright', ''),
             'copyright' => sys_config('nncnL_crmeb_copyright', ''),
             'version' => get_crmeb_version(),
             'version' => get_crmeb_version(),
             'key' => $key,
             'key' => $key,
-            'login_captcha' => 0
+            'login_captcha' => 0,
+            'publicKey' => app()->make(Rsa::class)->getPublicKey()
         ];
         ];
         if (CacheService::get('login_captcha', 1) > 1) {
         if (CacheService::get('login_captcha', 1) > 1) {
             $data['login_captcha'] = 1;
             $data['login_captcha'] = 1;

+ 13 - 16
crmeb/crmeb/services/app/MiniProgramService.php

@@ -11,6 +11,7 @@
 
 
 namespace crmeb\services\app;
 namespace crmeb\services\app;
 
 
+use app\services\order\StoreOrderTakeServices;
 use crmeb\exceptions\AdminException;
 use crmeb\exceptions\AdminException;
 use crmeb\services\SystemConfigService;
 use crmeb\services\SystemConfigService;
 use app\services\pay\PayNotifyServices;
 use app\services\pay\PayNotifyServices;
@@ -108,7 +109,7 @@ class MiniProgramService
             'log' => [
             'log' => [
                 'level' => 'debug',
                 'level' => 'debug',
                 'permission' => 0777,
                 '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'] = [
         $config['mini_program'] = [
@@ -880,26 +881,22 @@ class MiniProgramService
             switch ($message->MsgType) {
             switch ($message->MsgType) {
                 case 'event':
                 case 'event':
                     switch (strtolower($message->Event)) {
                     switch (strtolower($message->Event)) {
-                        case 'trade_manage_remind_access_api':
-                            Log::error('event1');
+                        case 'trade_manage_remind_access_api':  // 小程序完成账期授权时  小程序产生第一笔交易时 已产生交易但从未发货的小程序,每天一次
                             break;
                             break;
-                        case 'trade_manage_remind_shipping':
-                            Log::error('event2');
+                        case 'trade_manage_remind_shipping':   // 曾经发过货的小程序,订单超过48小时未发货时
                             break;
                             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;
                     };
                     };
                     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;
             };
             };
         });
         });
     }
     }

+ 3 - 1
crmeb/crmeb/services/easywechat/orderShipping/BaseOrder.php

@@ -19,6 +19,8 @@ class BaseOrder extends AbstractAPI
     const ORDER = 'wxa/sec/order/';
     const ORDER = 'wxa/sec/order/';
     const EXPRESS = 'cgi-bin/express/delivery/open_msg/';
     const EXPRESS = 'cgi-bin/express/delivery/open_msg/';
 
 
+    const PATH = '/pages/goods/order_details/index';
+
 
 
     public function __construct(AccessToken $accessToken, $config)
     public function __construct(AccessToken $accessToken, $config)
     {
     {
@@ -164,7 +166,7 @@ class BaseOrder extends AbstractAPI
         $params = [
         $params = [
             'appid' => $this->config['config']['mini_program']['app_id']
             '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)]));
     }
     }
 
 
     /**
     /**

+ 3 - 4
crmeb/crmeb/services/easywechat/orderShipping/MiniOrderService.php

@@ -8,7 +8,6 @@ use EasyWeChat\Core\Exceptions\HttpException;
 
 
 class MiniOrderService
 class MiniOrderService
 {
 {
-
     /**
     /**
      * @var Application
      * @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']);
         $payment = SystemConfigService::more(['routine_appId', 'routine_appsecret', 'pay_weixin_mchid', 'pay_new_weixin_open', 'pay_new_weixin_mchid']);
         return [
         return [
-            'debug'  => true,
+            'debug' => true,
             'log' => [
             'log' => [
-                'level'      => 'debug',
+                'level' => 'debug',
                 'permission' => 0777,
                 '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' => [
             'mini_program' => [
                 'app_id' => $payment['routine_appId'] ?? '',
                 'app_id' => $payment['routine_appId'] ?? '',

+ 3 - 0
crmeb/crmeb/services/easywechat/orderShipping/OrderClient.php

@@ -103,6 +103,9 @@ class OrderClient extends BaseOrder
                 'contact' => $contact
                 'contact' => $contact
             ];
             ];
         }
         }
+
+        // 跳转路径
+        $this->setMesJumpPath(self::PATH . '?order_id=' . $out_trade_no);
         return $this->shipping($params);
         return $this->shipping($params);
     }
     }
 
 

+ 194 - 0
crmeb/crmeb/utils/Rsa.php

@@ -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;
+    }
+
+}