|
|
@@ -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 {
|