瀏覽代碼

接口对接

cqpCow 1 年之前
父節點
當前提交
9062c672b1
共有 2 個文件被更改,包括 222 次插入25 次删除
  1. 59 19
      app/Service/JRFIDServerService.php
  2. 163 6
      app/Service/RsaEncryptionService.php

+ 59 - 19
app/Service/JRFIDServerService.php

@@ -28,7 +28,7 @@ class JRFIDServerService extends Service
             "rememberMe" => true
         ];
         $header = ['Content-Type:application/json'];
-        list($status, $result) = $this->post_helper($url,json_encode($post), $header);
+        list($status, $result) = $this->post_helper($url,$post, $header);
         if(! $status) return [false, $result];
 
         //登录失败
@@ -68,7 +68,7 @@ class JRFIDServerService extends Service
             'produce_no' => $data['produce_no'],
             'site' => $data['site'],
         ];
-        list($status,$result) = $this->post_helper($url,json_encode($post),$param['header']);
+        list($status,$result) = $this->post_helper($url,$post,$param['header']);
         if(! $status) return [false, $result];
 
         if(! empty($result['status']) && $result['status'] == 'error') return [false, $result['msg']];
@@ -86,7 +86,7 @@ class JRFIDServerService extends Service
             'site' => $data['site'],
         ];
 
-        list($status,$result) = $this->post_helper($url,json_encode($post),$param['header']);
+        list($status,$result) = $this->post_helper($url,$post,$param['header']);
         if(! $status) return [false, $result];
 
         if(! empty($result['status']) && $result['status'] == 'error') return [false, $result['msg']];
@@ -98,7 +98,7 @@ class JRFIDServerService extends Service
         if(empty($data['id'])) return [false, '数据ID不能为空'];
         if(empty($data['type'])) return [false, '打印数据类型不能为空'];
 
-        $size = $data['size'] ?? 10;
+        $size = $data['size'] ?? 9;
         $number = $data['number'] ?? 1;
 
         $rsaService = new RsaEncryptionService();
@@ -108,14 +108,28 @@ class JRFIDServerService extends Service
             'size' => $size,
             'number' => $number,
         ];
-        $encryptedData = $rsaService->encrypt(json_encode($dataToEncrypt));
+        $this->recKSort($dataToEncrypt);
+
+//        //加密
+//        $return = $rsaService->encrypt2($dataToEncrypt);
+//
+//        $return2 = $rsaService->decrypt2($return);
+//dd($return,$return2);
+//        $aa = $rsaService->aesDecrypt($aes);
+//        dd($aes,$aa);
+//
+        list($status, $encryptedData) = $rsaService->encrypt($dataToEncrypt);
+        if(! $status) return [false, $encryptedData];
 
         $url = config("j_rfid.get_print_data");
+
+        Log::channel('apiLog')->info('工装云POST:源数据', ["api" => $url , "param" => $dataToEncrypt]);
+
         $post = [
             'body' => $encryptedData,
         ];
 
-        list($status,$result) = $this->post_helper($url,json_encode($post),['Content-Type:application/json']);
+        list($status,$result) = $this->post_helper($url,$post,['Content-Type:application/json']);
         if(! $status) return [false, $result];
 
         if(! empty($result['status']) && $result['status'] == 'error') return [false, $result['message']];
@@ -129,6 +143,23 @@ class JRFIDServerService extends Service
         return [true, $result];
     }
 
+    // 关联数组排序,递归
+    public function recKSort(&$arr)
+    {
+        $kstring = true;
+        foreach ($arr as $k => &$v) {
+            if (!is_string($k)) {
+                $kstring = false;
+            }
+            if (is_array($v)) {
+                $this->recKSort($v);
+            }
+        }
+        if ($kstring) {
+            ksort($arr);
+        }
+    }
+
     public function getTeam($data,$param){
         if(empty($data['site'])) return [false, '站点不能为空'];
         $header = array_merge($param['header'], ['site:'. $data['site']]);
@@ -148,7 +179,7 @@ class JRFIDServerService extends Service
         $post['size'] = $data['size'] ?? 6;
         $post['number'] = ($data['number'] ?? 1) - 1;
 
-        list($status,$result) = $this->post_helper($url,json_encode($post),$header);
+        list($status,$result) = $this->post_helper($url,$post,$header);
         if(! $status) return [false, $result];
 
         if(! empty($result['status']) && $result['status'] == 'error') return [false, $result['msg']];
@@ -202,7 +233,7 @@ class JRFIDServerService extends Service
             'screenDataList' => $data['screenDataList'],
         ];
 
-        list($status,$result) = $this->post_helper($url,json_encode($post), $param['header']);
+        list($status,$result) = $this->post_helper($url,$post, $param['header']);
         if(! $status) return [false, $result];
 
         if(! isset($result['success'])) {
@@ -233,7 +264,7 @@ class JRFIDServerService extends Service
             'screenDataList' => $data['screenDataList'],
         ];
 
-        list($status,$result) = $this->post_helper($url,json_encode($post), $param['header']);
+        list($status,$result) = $this->post_helper($url,$post, $param['header']);
         if(! $status) return [false, $result];
 
         if(! isset($result['success'])) {
@@ -253,14 +284,23 @@ class JRFIDServerService extends Service
             'id' => $data['id'],
             'type' => $data['type']
         ];
-        $encryptedData = $rsaService->encrypt(json_encode($dataToEncrypt));
+        $this->recKSort($dataToEncrypt);
+
+        //加密
+//        $return = $rsaService->encrypt2($dataToEncrypt);
+
+        list($status, $encryptedData) = $rsaService->encrypt($dataToEncrypt);
+        if(! $status) return [false, $encryptedData];
 
         $url = config("j_rfid.screen_print");
+
+        Log::channel('apiLog')->info('工装云POST:源数据', ["api" => $url , "param" => $dataToEncrypt]);
+
         $post = [
             'body' => $encryptedData,
         ];
 
-        list($status,$result) = $this->post_helper($url,json_encode($post),['Content-Type:application/json']);
+        list($status,$result) = $this->post_helper($url,$post,['Content-Type:application/json']);
         if(! $status) return [false, $result];
 
         if(! empty($result['status']) && $result['status'] == 'error') return [false, $result['message']];
@@ -302,7 +342,7 @@ class JRFIDServerService extends Service
         $post['size'] = $data['size'] ?? 10;
         $post['number'] = $data['number'] ?? 1;
 
-        list($status,$result) = $this->post_helper($url,json_encode($post),$param['header']);
+        list($status,$result) = $this->post_helper($url,$post,$param['header']);
         if(! $status) return [false, $result];
 
         if(! empty($result['status']) && $result['status'] == 'error') return [false, $result['msg']];
@@ -332,7 +372,7 @@ class JRFIDServerService extends Service
         $post['size'] = $data['size'] ?? 10;
         $post['number'] = $data['number'] ?? 1;
 
-        list($status,$result) = $this->post_helper($url,json_encode($post),$param['header']);
+        list($status,$result) = $this->post_helper($url,$post,$param['header']);
         if(! $status) return [false, $result];
 
         if(! empty($result['status']) && $result['status'] == 'error') return [false, $result['msg']];
@@ -364,7 +404,7 @@ class JRFIDServerService extends Service
             'screenDataList' => $data['screenDataList'],
         ];
 
-        list($status,$result) = $this->post_helper($url,json_encode($post),$param['header']);
+        list($status,$result) = $this->post_helper($url,$post,$param['header']);
         if(! $status) return [false, $result];
 
         if(! empty($result['status']) && $result['status'] == 'error') return [false, $result['msg']];
@@ -396,7 +436,7 @@ class JRFIDServerService extends Service
             'screenDataList' => $data['screenDataList'],
         ];
 
-        list($status,$result) = $this->post_helper($url,json_encode($post),$param['header']);
+        list($status,$result) = $this->post_helper($url,$post,$param['header']);
         if(! $status) return [false, $result];
 
         if(! empty($result['status']) && $result['status'] == 'error') return [false, $result['msg']];
@@ -428,7 +468,7 @@ class JRFIDServerService extends Service
             'number' => $number,
         ];
 
-        list($status,$result) = $this->post_helper($url,json_encode($post),$param['header']);
+        list($status,$result) = $this->post_helper($url,$post,$param['header']);
         if(! $status) return [false, $result];
 
         if(! empty($result['status']) && $result['status'] == 'error') return [false, $result['msg']];
@@ -455,7 +495,7 @@ class JRFIDServerService extends Service
             'drawing_no' => $data['drawing_no'] ?? null,
         ];
 
-        list($status,$result) = $this->post_helper($url,json_encode($post),$param['header']);
+        list($status,$result) = $this->post_helper($url,$post,$param['header']);
         if(! $status) return [false, $result];
 
         if(! empty($result['status']) && $result['status'] == 'error') return [false, $result['message']];
@@ -482,7 +522,7 @@ class JRFIDServerService extends Service
             'contract_no' => $data['contract_no'] ?? ""
         ];
 
-        list($status,$result) = $this->post_helper($url,json_encode($post),$param['header']);
+        list($status,$result) = $this->post_helper($url,$post,$param['header']);
         if(! $status) return [false, $result];
 
         if(! empty($result['status']) && $result['status'] == 'error') return [false, $result['message']];
@@ -515,7 +555,7 @@ class JRFIDServerService extends Service
         curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
         curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
 
-        if(!is_null($data)) curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
+        if(!is_null($data)) curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
         $r = curl_exec($ch);
 
         if ($r === false) {

+ 163 - 6
app/Service/RsaEncryptionService.php

@@ -4,13 +4,170 @@ namespace App\Service;
 
 class RsaEncryptionService extends Service
 {
-    public function encrypt($data)
-    {
-        //公钥文件位于 storage/app/public/rsa/public.pem
+//    public function encrypt($data)
+//    {
+//        //公钥文件位于 storage/app/public/rsa/public.pem
+//        $publicKeyPath = storage_path('app/public/rsa/public.pem');
+//        $publicKey = openssl_pkey_get_public(file_get_contents($publicKeyPath));
+//
+//        openssl_public_encrypt($data, $encrypted, $publicKey);
+//        return base64_encode($encrypted);
+//    }
+
+    public function encrypt($data){
+        $data = json_encode($data, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE); // 重新序列化,确保所有key按字典序排序
+
+        // 公钥文件位于 storage/app/public/rsa/public.pem
         $publicKeyPath = storage_path('app/public/rsa/public.pem');
-        $publicKey = openssl_pkey_get_public(file_get_contents($publicKeyPath));
 
-        openssl_public_encrypt($data, $encrypted, $publicKey);
-        return base64_encode($encrypted);
+        // 确保文件存在
+        if (!file_exists($publicKeyPath)) return [false , '公钥不存在'];
+
+        // 读取公钥文件的内容
+        $publicKeyContent = file_get_contents($publicKeyPath);
+        if ($publicKeyContent === false) return [false , '公钥文件读取失败'];
+
+        // 获取公钥资源
+        $publicKey = openssl_pkey_get_public($publicKeyContent);
+        if (! $publicKey) {
+            $error = openssl_error_string();
+            if ($error !== false) {
+                return [false , '公钥文件加载失败:' . $error];
+            } else {
+                return [false , '公钥文件加载失败'];
+            }
+        }
+
+        // 假设 $publicKey 是你已经获取的公钥资源
+//        $keyDetails = openssl_pkey_get_details($publicKey);
+//        $keyBits = $keyDetails['bits'];
+
+        // PKCS#1 v1.5 填充的最大数据长度
+//        $maxDataLengthPkcs1 = floor($keyBits / 8) - 11;
+
+        // OAEP 填充的最大数据长度
+//        $maxDataLengthOaep = floor($keyBits / 8) - 42;
+
+//        echo "For PKCS#1 v1.5 padding, the maximum data length is: {$maxDataLengthPkcs1} bytes.\n";
+//        echo "For OAEP padding, the maximum data length is: {$maxDataLengthOaep} bytes.\n";
+
+
+        if (! openssl_public_encrypt($data, $encrypted, $publicKey)) {
+            $error = openssl_error_string();
+            if ($error !== false) {
+                return [false , '加密失败:' . $error];
+            } else {
+                return [false , '加密失败'];
+            }
+        }
+
+        // 返回base64编码的加密数据
+        return [true, base64_encode($encrypted)];
+    }
+
+    function encrypt2($data) {
+        // 公钥文件
+        $publicKeyString = storage_path('app/public/rsa/public.pem');
+        // 读取公钥文件内容
+        $publicKeyString = file_get_contents($publicKeyString);
+
+        //加密的数据
+        $plainText = json_encode($data);
+
+        // 生成随机AES密钥以进行对称加密
+        $aesKey = openssl_random_pseudo_bytes(16); // AES-128
+
+        // 使用AES加密明文
+        $ivlen = openssl_cipher_iv_length('aes-128-cbc');
+        $iv = openssl_random_pseudo_bytes($ivlen);
+        $encryptedBytes = openssl_encrypt($plainText, 'aes-128-cbc', $aesKey, OPENSSL_RAW_DATA, $iv);
+
+        // 使用RSA加密AES密钥
+        $resource = openssl_pkey_get_public($publicKeyString);
+        openssl_public_encrypt($aesKey, $encryptedAESKey, $resource);
+
+        // 组合AES密钥和加密的消息
+        $encryptedAESKeyStr = base64_encode($encryptedAESKey);
+        $encryptedMessageStr = base64_encode($iv . $encryptedBytes);
+
+        //AES的密钥 : 传递的参数
+        return $encryptedAESKeyStr . ":" . $encryptedMessageStr;
+    }
+
+    function decrypt2($encryptedText) {
+        // 密钥文件
+        $privateKeyString = storage_path('app/public/rsa/private.pem');
+        // 读取密钥文件内容
+        $privateKeyString = file_get_contents($privateKeyString);
+
+        // 将输入分成加密的AES密钥和加密的消息两部分
+        list($encryptedAESKeyStr, $encryptedMessageStr) = explode(":", $encryptedText, 2);
+        if (!isset($encryptedAESKeyStr) || !isset($encryptedMessageStr)) {
+            throw new \Exception("无效的输入格式");
+        }
+
+        // 使用RSA私钥解密AES密钥
+        $resource = openssl_pkey_get_private($privateKeyString);
+        $encryptedAESKey = base64_decode($encryptedAESKeyStr);
+        openssl_private_decrypt($encryptedAESKey, $decryptedAESKey, $resource);
+
+        // 使用AES解密消息
+        $ivlen = openssl_cipher_iv_length('aes-128-cbc');
+        $encryptedMessage = base64_decode($encryptedMessageStr);
+        $iv = substr($encryptedMessage, 0, $ivlen);
+        $ciphertext = substr($encryptedMessage, $ivlen);
+
+        $plaintext = openssl_decrypt($ciphertext, 'aes-128-cbc', $decryptedAESKey, OPENSSL_RAW_DATA, $iv);
+
+        return $plaintext;
+    }
+
+    // 加密函数
+    function aesEncrypt($data) {
+        $data = json_encode($data, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE); // 重新序列化,确保所有key按字典序排序
+
+        // 密钥文件
+        $key = storage_path('app/public/rsa/public.pem');
+
+        // 读取密钥文件内容
+        $key = file_get_contents($key);
+
+        // 生成一个随机的初始化向量(IV)
+        $ivSize = openssl_cipher_iv_length('aes-256-cbc');
+        $iv = openssl_random_pseudo_bytes($ivSize);
+
+        // 加密数据
+        $encrypted = openssl_encrypt($data, 'aes-256-cbc', $key, OPENSSL_RAW_DATA, $iv);
+        if ($encrypted === false) return [false, '加密失败'];
+
+        // 将 IV 和加密后的数据一起返回,以便解密时使用
+        return [true, base64_encode($iv) . ":" . base64_encode($encrypted)];
+    }
+
+    // 解密函数
+    function aesDecrypt($data) {
+        // 公钥文件位于 storage/app/public/rsa/public.pem
+        $key = storage_path('app/public/rsa/public.pem');
+
+        // 读取密钥文件内容
+        $key = file_get_contents($key);
+
+        // 分割字符串,去除冒号
+        list($ivPart, $encryptedPart) = explode(':', $data, 2);
+        $ivPart = base64_decode($ivPart);
+        $encryptedPart = base64_decode($encryptedPart);
+
+        // 获取 IV 和加密后的数据
+        $ivSize = openssl_cipher_iv_length('aes-256-cbc');
+        $iv = substr($ivPart, 0, $ivSize);
+        $encrypted = $encryptedPart;
+
+        // 解密数据
+        $decrypted = openssl_decrypt($encrypted, 'aes-256-cbc', $key, OPENSSL_RAW_DATA, $iv);
+        if ($decrypted === false) {
+            throw new \Exception('Decryption failed.');
+        }
+
+        return $decrypted;
     }
 }