WIN-2308041133\Administrator 5 місяців тому
батько
коміт
7a42482bce
1 змінених файлів з 59 додано та 20 видалено
  1. 59 20
      extend/liuniu/WechatService.php

+ 59 - 20
extend/liuniu/WechatService.php

@@ -600,53 +600,92 @@ class WechatService
         $timestamp=time();
         $version = '1.0';
         // 微信支付配置参数
-        $mch_id = "1623907696"; // 替换为你的商户号
-        $key = "1wm55KpF5tgZFW1TYs6TBX9MWBpI5FmT";   // 替换为你的API密钥
+        $mch_id = "1623907696";
+        $key = "1wm55KpF5tgZFW1TYs6TBX9MWBpI5FmT";
+
+// 使用动态时间戳
+        $current_timestamp = time();
 
-// 请求参数(来自示例)
         $params = [
-//            'out_trade_no' => 'yj175029625305847308',
             'appid' => 'wx5681205d1ef4d9d3',
-            'mch_id' => $mch_id, // 添加商户号
+            'mch_id' => $mch_id,
             'plan_id' => '189172',
             'contract_code' => 'qy175029625306023753',
-            'request_serial' => time(),
+            'request_serial' => $current_timestamp, // 使用时间戳作为序列号
             'contract_display_account' => '昔拉',
-            'notify_url' =>json_encode( 'http://red.igxys.com/api/wechat/notify/12'),
-            'timestamp' => 1750296253,
+            'notify_url' => 'http://red.igxys.com/api/wechat/notify/12',
+            'timestamp' => $current_timestamp, // 动态时间戳
             'version' => '1.0',
-
         ];
 
-// 步骤1:参数按ASCII排序
+// 关键步骤1:先对需要编码的参数进行原始值存储
+        $raw_params = $params;
+
+// 关键步骤2:对需要URL编码的参数值进行编码(签名前)
+        $params['contract_display_account'] = urlencode($params['contract_display_account']);
+        $params['notify_url'] = urlencode($params['notify_url']);
+
+// 步骤3:参数按ASCII排序
         ksort($params);
 
-// 步骤2:构建待签名字符串
+// 步骤4:构建待签名字符串(使用编码后的值)
         $stringA = "";
         foreach ($params as $k => $v) {
             $stringA .= $k . '=' . $v . '&';
         }
-        $stringSignTemp = $stringA . 'key=' . $key; // 拼接API密钥
+        $stringSignTemp = $stringA . 'key=' . $key;
 
-// 步骤3:生成HMAC-SHA256签名
-        $sign = strtoupper(hash_hmac('sha256', $stringSignTemp, $key));
-        $params['sign'] = $sign; // 添加签名到请求参数
+// 关键步骤5:正确生成HMAC-SHA256签名
+        $sign = strtoupper(hash_hmac('sha256', $stringSignTemp, '')); // 注意:第三个参数为空字符串
+        $params['sign'] = $sign;
 
-// 步骤4:构建GET请求URL(对参数值进行URL编码)
+// 构建最终URL
         $queryString = "";
         foreach ($params as $k => $v) {
-            $queryString .= $k . '=' . urlencode($v) . '&';
+            // 已编码的参数不需要再次编码
+            $queryString .= $k . '=' . $v . '&';
         }
         $url = 'https://api.mch.weixin.qq.com/papay/entrustweb?' . rtrim($queryString, '&');
 
-// 步骤5:发送CURL请求
+// 记录请求URL
+        @file_put_contents("quanju3.txt", "请求URL: " . $url . "\n", FILE_APPEND);
+
+// 发送请求(禁止自动重定向)
         $ch = curl_init();
         curl_setopt($ch, CURLOPT_URL, $url);
         curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
-        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true); // 生产环境建议验证SSL
+        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
         curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
-        @file_put_contents("quanju3.txt", $url . "-访问接口\r\n", 8);
+        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false); // 关键:禁止自动重定向
+        curl_setopt($ch, CURLOPT_HEADER, true); // 获取响应头
+
         $response = curl_exec($ch);
+        $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
+
+// 记录完整响应
+        @file_put_contents("quanju3.txt", "HTTP状态码: " . $http_code . "\n响应内容: " . $response . "\n", FILE_APPEND);
+
+// 分析响应
+        if ($http_code == 302) {
+            // 解析重定向地址
+            preg_match('/Location: (.*)/i', $response, $matches);
+            $redirect_url = trim($matches[1] ?? '');
+
+            if ($redirect_url) {
+                // 成功重定向到微信签约页面
+                @file_put_contents("quanju3.txt", "签约URL: " . $redirect_url . "\n", FILE_APPEND);
+            } else {
+                @file_put_contents("quanju3.txt", "错误:未找到重定向地址\n", FILE_APPEND);
+            }
+        } else {
+            // 提取可能的错误信息
+            preg_match('/<error_description><!\[CDATA\[(.*?)\]\]><\/error_description>/', $response, $error_matches);
+            $error_msg = $error_matches[1] ?? '未知错误';
+
+            @file_put_contents("quanju3.txt", "错误信息: " . $error_msg . "\n", FILE_APPEND);
+        }
+
+        curl_close($ch);
 //        if (curl_errno($ch)) {
 //            echo 'CURL Error: ' . curl_error($ch);
 //        } else {