浏览代码

实现积分维护接口,推送积分数据到工行,并记录请求和响应日志

lizhen 1 天之前
父节点
当前提交
4cceec8ecf
共有 2 个文件被更改,包括 274 次插入61 次删除
  1. 185 0
      addons/exam/controller/Paper.php
  2. 89 61
      application/api/controller/Jiashicang.php

+ 185 - 0
addons/exam/controller/Paper.php

@@ -12,6 +12,7 @@ use app\admin\model\exam\CateModel;
 use app\admin\model\exam\GradeModel;
 use think\Request;
 use think\Db;
+include_once EXTEND_PATH.'icbc/DefaultIcbcClient.php';
 
 
 /**
@@ -268,6 +269,12 @@ class Paper extends Base
             if($rs === false){
                 $this->error('交卷失败');
             }
+            
+            // 如果提交成功,推送积分到工行
+            $cephone = '15388010006';
+            //$cephone = $this->auth->mobile;
+            $this->update_villager_integral($cephone, $result['score'], '10938', [$this->auth->nickname]);
+            
         }
 
         $result['nickname'] = $this->auth->nickname;
@@ -280,6 +287,184 @@ class Paper extends Base
 
     }
 
+    /**
+     * 积分维护接口 - 推送积分数据到工行
+     * @param string $mobile_phone 用户手机号
+     * @param int $integral_value 变动的积分值(整数)
+     * @param string $integral_type 积分类型
+     * @param array $remarks 备用字段数组(可选,最多7个)
+     * @return array 返回接口响应结果
+     */
+    public function update_villager_integral($mobile_phone = '', $integral_value = 0, $integral_type = '', $remarks = [])
+    {
+        // 如果没有传入手机号,尝试从登录用户获取
+        if (empty($mobile_phone) && isset($this->auth->mobile)) {
+            $mobile_phone = $this->auth->mobile;
+        }
+
+        // 生成16位唯一序列号(时间戳10位+随机数6位)
+        $fSeqNo = time() . str_pad(mt_rand(0, 999999), 6, '0', STR_PAD_LEFT);
+        
+        // 构建业务参数
+        $biz_content = [
+            'fSeqNo' => $fSeqNo,
+            'corpCode' => 'xingfulishequ',
+            'mobilePhone' => $mobile_phone,
+            'integralValue' => (string)$integral_value, // 确保是字符串类型
+            'integralType' => $integral_type,
+        ];
+
+        // 添加备用字段(如果有)
+        for ($i = 1; $i <= 7; $i++) {
+            if (isset($remarks[$i - 1]) && !empty($remarks[$i - 1])) {
+                $biz_content['remark' . $i] = $remarks[$i - 1];
+            }
+        }
+
+        // 工行RSA密钥(字符串格式)
+        $public_key = 'MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCwFgHD4kzEVPdOj03ctKM7KV+16bWZ5BMNgvEeuEQwfQYkRVwI9HFOGkwNTMn5hiJXHnlXYCX+zp5r6R52MY0O7BsTCLT7aHaxsANsvI9ABGx3OaTVlPB59M6GPbJh0uXvio0m1r/lTW3Z60RU6Q3oid/rNhP3CiNgg0W6O3AGqwIDAQAB';
+        $private_key = 'MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCR8/ZvKPAdZzsyvapySvztQm56s1N59ynKMOWpUbK4c5MNWMl+q3dvsp+UiSAx2TAeGkYfW3W6nO/3Y0hAZki99fmuzpPujEeHhs79HNwGZYQjN71Vck2JeflTq8jpL+9/up0Kz2nbwtZDMKTTEgbfNeO24gV1bmvD2kQ9j66RIyuXSDwQbVbQfl6LiqKoJm3rbtsbwX1Ytc0/Szslyor1VdPZWnHDMm3m78Hqu7X3vL6K7fAW/4FVbeKV7vWjvyiTQfETmuADqMdsqV5YeqUZWE/Dnzg+6JV/3L9nJ8f+/mPlh8k1h1oW035GrADKFKf1M2ujKKeHICnj7qKCdBeNAgMBAAECggEAHkh+U2YtHAy1Tbvox7ojbJ8iCTd4FJBiDV/D5zPaX0crtdM8S5oMOBLZ5ZnmIjGsODK/ZfY2ITg62huxfBs88J0+5zRZoV9d4BLqk74PMQyTNDN2h2omCGZUgzXbg/a8PMZdm0aZ8k0k4+AN8vWEk3+89c9Dzq/QkFyTWCqdz+Mp9NkcOjA255kj5/D1q9Zj0x9VcmKg3oTtrKL/dkspUxVaMKXcpo6J4AszC05tT3N0SNLhcq51I6B9QdbYsYCkP9whPNYIl/y4dN4QnNEivQzA5/ltr5DDQZc7Xke1+SpJN+ylBOBJ8yvNoDnuxx0xEWuNJ5bUzyri/DNjZRKNQQKBgQDKkxn5R4Q3rChI/KVIXHMecTs9fXN5pbnA8UKU6ZeTl+wHffxwRieHZJJp1nDcQ5i8YXCtqEJcJGFn3T0rEjVCJ/RVHclFO+TjYaK9HtyNJLPrvKmAzjCzV1yPfe4qmpgJddzZI7Vii2uFgklixvhkoY74hwSJtvLPTO0p0xrYdQKBgQC4cgfpCMLYlaHQGz+dAEf4IewQpwBGn7XShCpiXGFciGZZEIzvJMzXP7yo8pDMHQbB4kQsTRRG2fcdHGWI5VQGHPqG5O0tUueKGUlSg7j8Y/Pp8ZrBGSrlilAf17I/u9MC7Xe2ZRVGNgPDYAyjMEGmClI0n2+aN6b4CFVBjYmfuQKBgEKO9KDIE7QrF41rnW7aGWTuNVWty2wzvIWdf4/n9EqlRwLrLS9CjahZrhWiRLDKcPusVFZqi2s09OAoe/mT4PXcpNX2lHPwCvN+1/allje10HvrIBJXLP8v/BSVftR2uO+azzZ1GhrHzksulKgk0eZWguA7lI0fFEZycxYj65UlAoGAD9p1RZlkLfuGgf2llRgOF4zK3o+MHYXiuep0PioUkECFE4ixpGh0Vtf6nkbjHTgteYK6O1iQsppPfCgRrheQBkp9WhTZMfkbP6p2u+nof4ET2PrUQ16naj1eL655erLpKypADORZVMSVxDhAPdKLAfuHH1DI5ed8qXsF4PGKb7kCgYEAm/d+daT6YsbHDZlJ/J9Q8rRkKmiqj43NGQSHKg6Z6BEDibm8wRmj3Itu1N6XVChuaH+ekJzvUnZ/q1nyYzGvy6bOHYn3ziF9aH7wuhcRZ4qARmKDnzTBLg2QXBK1+400O3LJ+sAH/yuH/Y4hzRE6YMxBQpdYfnlJcIFVimAsT1w=';
+
+        // 构建通用请求参数
+        $data = [
+            'app_id' => '10000000000004096993',
+            'msg_id' => createUniqueNo('msg', time()),
+            'format' => 'json',
+            'charset' => 'UTF-8',
+            'encrypt_type' => 'AES',
+            'sign_type' => 'RSA2',
+        ];
+
+        // 记录请求日志(调试用)
+        \think\Log::record('积分维护接口请求参数: ' . json_encode([
+            'app_id' => $data['app_id'],
+            'msg_id' => $data['msg_id'],
+            'biz_content' => $biz_content
+        ], JSON_UNESCAPED_UNICODE), 'info');
+
+        try {
+            // 创建工行客户端
+            $client = new \DefaultIcbcClient(
+                $data['app_id'],
+                $private_key,
+                $data['sign_type'],
+                $data['charset'],
+                $data['format'],
+                $public_key,
+                '', '', '', ''
+            );
+
+            // 构建请求参数
+            $request = [
+                'serviceUrl' => 'https://gw.dccnet.com.cn:8084/api/mybank/farm/farmplatf/updateVillagerIntegral/V1',
+                'method' => 'POST',
+                'isNeedEncrypt' => false,
+                'extraParams' => null,
+                'biz_content' => $biz_content,
+            ];
+
+            // 发送请求
+            $response = $client->execute($request, $data['msg_id'], '');
+            
+            // 记录原始响应(调试用)
+            \think\Log::record('积分维护接口原始响应: ' . $response, 'info');
+            
+            // 检查响应是否为空
+            if (empty($response)) {
+                $resultData = [
+                    'return_code' => '-1',
+                    'return_msg' => '接口无响应',
+                    'raw_response' => $response
+                ];
+                $this->writeIcbcLog(false, $resultData, $biz_content);
+                return $resultData;
+            }
+            
+            // 解析响应
+            $result = json_decode($response, true);
+            
+            // 检查JSON解析是否成功
+            if (json_last_error() !== JSON_ERROR_NONE) {
+                $resultData = [
+                    'return_code' => '-2',
+                    'return_msg' => 'JSON解析失败: ' . json_last_error_msg(),
+                    'raw_response' => $response
+                ];
+                $this->writeIcbcLog(false, $resultData, $biz_content);
+                return $resultData;
+            }
+            
+            // 检查是否有response_biz_content(按API文档,响应数据在这个字段里)
+            if (isset($result['response_biz_content'])) {
+                $biz_result = json_decode($result['response_biz_content'], true);
+                if ($biz_result) {
+                    // 合并业务响应和原始响应
+                    $resultData = array_merge($biz_result, ['raw_response' => $response]);
+                    $this->writeIcbcLog($resultData['return_code'] == 0, $resultData, $biz_content);
+                    return $resultData;
+                }
+            }
+            
+            // 如果直接有return_code,直接返回
+            if (isset($result['return_code'])) {
+                $this->writeIcbcLog($result['return_code'] == 0, $result, $biz_content);
+                return $result;
+            }
+            
+            // 返回完整结果
+            $resultData = $result ? $result : [
+                'return_code' => '-3',
+                'return_msg' => '未知响应格式',
+                'raw_response' => $response
+            ];
+            $this->writeIcbcLog(false, $resultData, $biz_content);
+            return $resultData;
+            
+        } catch (\Exception $e) {
+            // 捕获异常
+            \think\Log::record('积分维护接口异常: ' . $e->getMessage(), 'error');
+            $resultData = [
+                'return_code' => '-99',
+                'return_msg' => '接口调用异常: ' . $e->getMessage(),
+                'raw_response' => ''
+            ];
+            $this->writeIcbcLog(false, $resultData, $biz_content);
+            return $resultData;
+        }
+    }
+
+    /**
+     * 写入工行接口日志
+     * @param bool $is_success 是否成功
+     * @param array $result 返回结果
+     * @param array $request_data 请求数据
+     */
+    private function writeIcbcLog($is_success, $result, $request_data)
+    {
+        // 确定日志文件路径
+        $log_dir = RUNTIME_PATH . 'icbc_log/';
+        if (!is_dir($log_dir)) {
+            mkdir($log_dir, 0755, true);
+        }
+        
+        $filename = $is_success ? 'suc.txt' : 'failicbc.txt';
+        $filepath = $log_dir . $filename;
+        
+        // 构建日志内容
+        $log_content = [
+            '时间' => date('Y-m-d H:i:s'),
+            '请求数据' => $request_data,
+            '返回数据' => $result,
+            '原始响应' => isset($result['raw_response']) ? $result['raw_response'] : '',
+            '分隔线' => str_repeat('-', 80)
+        ];
+        
+        $log_text = "\n" . json_encode($log_content, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT) . "\n";
+        
+        // 追加写入文件
+        file_put_contents($filepath, $log_text, FILE_APPEND);
+    }
+
     /*
      * 查看错题
      * Robin

+ 89 - 61
application/api/controller/Jiashicang.php

@@ -288,15 +288,14 @@ class Jiashicang extends Api
      */
     public function update_villager_integral($mobile_phone = '', $integral_value = 0, $integral_type = '', $remarks = [])
     {
-
         // 如果没有传入手机号,尝试从登录用户获取
         if (empty($mobile_phone) && isset($this->auth->mobile)) {
             $mobile_phone = $this->auth->mobile;
         }
 
-        // 生成唯一序列号
-        $fSeqNo = createUniqueNo('fseq', time());
-        $url = 'http://apip-gateway-nrouter-saas-gn-C.month.sdc.cs.icbc:8081/api/mybank/farm/farmplatf/syncCommunityData/V1';
+        // 生成16位唯一序列号(时间戳10位+随机数6位)
+        $fSeqNo = time() . str_pad(mt_rand(0, 999999), 6, '0', STR_PAD_LEFT);
+        
         // 构建业务参数
         $biz_content = [
             'fSeqNo' => $fSeqNo,
@@ -313,13 +312,9 @@ class Jiashicang extends Api
             }
         }
 
-        // 加载RSA密钥
-        $public_key = APP_PATH . '/common/certs/icbc/public_key.pem';
-        $private_key = APP_PATH . '/common/certs/icbc/private_key.pem';
-        $rsautil = new RsaUtil($public_key, $private_key);
-
-        // 生成签名
-        $sign = $rsautil->publicEncrypt(json_encode($biz_content));
+        // 工行RSA密钥(字符串格式)
+        $public_key = 'MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCwFgHD4kzEVPdOj03ctKM7KV+16bWZ5BMNgvEeuEQwfQYkRVwI9HFOGkwNTMn5hiJXHnlXYCX+zp5r6R52MY0O7BsTCLT7aHaxsANsvI9ABGx3OaTVlPB59M6GPbJh0uXvio0m1r/lTW3Z60RU6Q3oid/rNhP3CiNgg0W6O3AGqwIDAQAB';
+        $private_key = 'MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCR8/ZvKPAdZzsyvapySvztQm56s1N59ynKMOWpUbK4c5MNWMl+q3dvsp+UiSAx2TAeGkYfW3W6nO/3Y0hAZki99fmuzpPujEeHhs79HNwGZYQjN71Vck2JeflTq8jpL+9/up0Kz2nbwtZDMKTTEgbfNeO24gV1bmvD2kQ9j66RIyuXSDwQbVbQfl6LiqKoJm3rbtsbwX1Ytc0/Szslyor1VdPZWnHDMm3m78Hqu7X3vL6K7fAW/4FVbeKV7vWjvyiTQfETmuADqMdsqV5YeqUZWE/Dnzg+6JV/3L9nJ8f+/mPlh8k1h1oW035GrADKFKf1M2ujKKeHICnj7qKCdBeNAgMBAAECggEAHkh+U2YtHAy1Tbvox7ojbJ8iCTd4FJBiDV/D5zPaX0crtdM8S5oMOBLZ5ZnmIjGsODK/ZfY2ITg62huxfBs88J0+5zRZoV9d4BLqk74PMQyTNDN2h2omCGZUgzXbg/a8PMZdm0aZ8k0k4+AN8vWEk3+89c9Dzq/QkFyTWCqdz+Mp9NkcOjA255kj5/D1q9Zj0x9VcmKg3oTtrKL/dkspUxVaMKXcpo6J4AszC05tT3N0SNLhcq51I6B9QdbYsYCkP9whPNYIl/y4dN4QnNEivQzA5/ltr5DDQZc7Xke1+SpJN+ylBOBJ8yvNoDnuxx0xEWuNJ5bUzyri/DNjZRKNQQKBgQDKkxn5R4Q3rChI/KVIXHMecTs9fXN5pbnA8UKU6ZeTl+wHffxwRieHZJJp1nDcQ5i8YXCtqEJcJGFn3T0rEjVCJ/RVHclFO+TjYaK9HtyNJLPrvKmAzjCzV1yPfe4qmpgJddzZI7Vii2uFgklixvhkoY74hwSJtvLPTO0p0xrYdQKBgQC4cgfpCMLYlaHQGz+dAEf4IewQpwBGn7XShCpiXGFciGZZEIzvJMzXP7yo8pDMHQbB4kQsTRRG2fcdHGWI5VQGHPqG5O0tUueKGUlSg7j8Y/Pp8ZrBGSrlilAf17I/u9MC7Xe2ZRVGNgPDYAyjMEGmClI0n2+aN6b4CFVBjYmfuQKBgEKO9KDIE7QrF41rnW7aGWTuNVWty2wzvIWdf4/n9EqlRwLrLS9CjahZrhWiRLDKcPusVFZqi2s09OAoe/mT4PXcpNX2lHPwCvN+1/allje10HvrIBJXLP8v/BSVftR2uO+azzZ1GhrHzksulKgk0eZWguA7lI0fFEZycxYj65UlAoGAD9p1RZlkLfuGgf2llRgOF4zK3o+MHYXiuep0PioUkECFE4ixpGh0Vtf6nkbjHTgteYK6O1iQsppPfCgRrheQBkp9WhTZMfkbP6p2u+nof4ET2PrUQ16naj1eL655erLpKypADORZVMSVxDhAPdKLAfuHH1DI5ed8qXsF4PGKb7kCgYEAm/d+daT6YsbHDZlJ/J9Q8rRkKmiqj43NGQSHKg6Z6BEDibm8wRmj3Itu1N6XVChuaH+ekJzvUnZ/q1nyYzGvy6bOHYn3ziF9aH7wuhcRZ4qARmKDnzTBLg2QXBK1+400O3LJ+sAH/yuH/Y4hzRE6YMxBQpdYfnlJcIFVimAsT1w=';
 
         // 构建通用请求参数
         $data = [
@@ -327,62 +322,95 @@ class Jiashicang extends Api
             'msg_id' => createUniqueNo('msg', time()),
             'format' => 'json',
             'charset' => 'UTF-8',
-            'sign_type' => 'RSA',
-            'sign' => $sign,
-            'timestamp' => date('Y-m-d H:i:s'),
-            'biz_content' => $biz_content,
+            'encrypt_type' => 'AES',
+            'sign_type' => 'RSA2',
         ];
 
         // 记录请求日志(调试用)
-        \think\Log::record('积分维护接口请求: ' . json_encode($data, JSON_UNESCAPED_UNICODE), 'info');
+        \think\Log::record('积分维护接口请求参数: ' . json_encode([
+            'app_id' => $data['app_id'],
+            'msg_id' => $data['msg_id'],
+            'biz_content' => $biz_content
+        ], JSON_UNESCAPED_UNICODE), 'info');
+
+        try {
+            // 创建工行客户端
+            $client = new \DefaultIcbcClient(
+                $data['app_id'],
+                $private_key,
+                $data['sign_type'],
+                $data['charset'],
+                $data['format'],
+                $public_key,
+                '', '', '', ''
+            );
+
+            // 构建请求参数
+            $request = [
+                'serviceUrl' => 'https://gw.dccnet.com.cn:8084/api/mybank/farm/farmplatf/updateVillagerIntegral/V1',
+                'method' => 'POST',
+                'isNeedEncrypt' => false,
+                'extraParams' => null,
+                'biz_content' => $biz_content,
+            ];
 
-        // 发送请求
-        $response = curl_post($url, json_encode($data, JSON_UNESCAPED_UNICODE));
-        
-        // 记录原始响应(调试用)
-        \think\Log::record('积分维护接口原始响应: ' . $response, 'info');
-        
-        // 检查响应是否为空
-        if (empty($response)) {
-            return [
-                'return_code' => '-1',
-                'return_msg' => '接口无响应',
+            // 发送请求
+            $response = $client->execute($request, $data['msg_id'], '');
+            
+            // 记录原始响应(调试用)
+            \think\Log::record('积分维护接口原始响应: ' . $response, 'info');
+            
+            // 检查响应是否为空
+            if (empty($response)) {
+                return [
+                    'return_code' => '-1',
+                    'return_msg' => '接口无响应',
+                    'raw_response' => $response
+                ];
+            }
+            
+            // 解析响应
+            $result = json_decode($response, true);
+            
+            // 检查JSON解析是否成功
+            if (json_last_error() !== JSON_ERROR_NONE) {
+                return [
+                    'return_code' => '-2',
+                    'return_msg' => 'JSON解析失败: ' . json_last_error_msg(),
+                    'raw_response' => $response
+                ];
+            }
+            
+            // 检查是否有response_biz_content(按API文档,响应数据在这个字段里)
+            if (isset($result['response_biz_content'])) {
+                $biz_result = json_decode($result['response_biz_content'], true);
+                if ($biz_result) {
+                    // 合并业务响应和原始响应
+                    return array_merge($biz_result, ['raw_response' => $response]);
+                }
+            }
+            
+            // 如果直接有return_code,直接返回
+            if (isset($result['return_code'])) {
+                return $result;
+            }
+            
+            // 返回完整结果
+            return $result ? $result : [
+                'return_code' => '-3',
+                'return_msg' => '未知响应格式',
                 'raw_response' => $response
             ];
-        }
-        
-        // 解析响应
-        $result = json_decode($response, true);
-        
-        // 检查JSON解析是否成功
-        if (json_last_error() !== JSON_ERROR_NONE) {
+            
+        } catch (\Exception $e) {
+            // 捕获异常
+            \think\Log::record('积分维护接口异常: ' . $e->getMessage(), 'error');
             return [
-                'return_code' => '-2',
-                'return_msg' => 'JSON解析失败: ' . json_last_error_msg(),
-                'raw_response' => $response
+                'return_code' => '-99',
+                'return_msg' => '接口调用异常: ' . $e->getMessage(),
+                'raw_response' => ''
             ];
         }
-        
-        // 检查是否有response_biz_content(按API文档,响应数据在这个字段里)
-        if (isset($result['response_biz_content'])) {
-            $biz_result = json_decode($result['response_biz_content'], true);
-            if ($biz_result) {
-                // 合并业务响应和原始响应
-                return array_merge($biz_result, ['raw_response' => $response]);
-            }
-        }
-        
-        // 如果直接有return_code,直接返回
-        if (isset($result['return_code'])) {
-            return $result;
-        }
-        
-        // 返回完整结果
-        return $result ? $result : [
-            'return_code' => '-3',
-            'return_msg' => '未知响应格式',
-            'raw_response' => $response
-        ];
     }
 
     /**
@@ -392,14 +420,14 @@ class Jiashicang extends Api
     public function test_integral()
     {
         // 测试参数
-        $mobile_phone = '13792965609'; // 测试手机号
+        $mobile_phone = '15388010006'; // 测试手机号
         $integral_value = 10; // 增加10分
-        $integral_type = 'test'; // 积分类型
+        $integral_type = '10938'; // 积分类型
         $remarks = ['陈冲']; // 备用字段
 
         // 调用积分维护接口
         $result = $this->update_villager_integral($mobile_phone, $integral_value, $integral_type, $remarks);
-        var_dump($result);exit;
+    
         // 输出结果
         if ($result['return_code'] == 0) {
             $this->success('积分推送成功', $result);