微信小程序支付遇到问题:PKIX path building failed: unable to find valid certification path to requested target

news/2025/11/12 23:53:54/文章来源:https://www.cnblogs.com/yiliangmi/p/19215827

当前的环境是:

  • 操作系统:Windows
  • IDE:IntelliJ IDEA
  • Java 版本1.8.0_471(这是 Oracle JDK 8 的一个较新更新版本)

这个 Java 版本 已经包含了 Let's Encrypt 的根证书(ISRG Root X1),理论上应该能正常验证微信支付 API(api.mch.weixin.qq.com)的 HTTPS 证书。

但你仍然遇到:

PKIX path building failed: unable to find valid certification path to requested target

说明 Java 运行时使用的 cacerts 信任库中缺少必要的根证书,或者存在其他干扰因素。


✅ 针对你的情况(Windows + IDEA + JDK 8u471)的解决方案

🔧 步骤 1:确认 IDEA 使用的是你认为的 JDK

有时候 IDEA 虽然配置了 JDK 1.8.0_471,但实际运行时可能用了别的 JRE(比如内置 JRE 或系统默认 JRE)。

✅ 检查方式:

  1. 在 IDEA 中打开:File → Project Structure → Project Settings → Project
    • 确认 Project SDK1.8.0_471
  2. 在代码中加一行临时打印:
    System.out.println(System.getProperty("java.home"));
    
    运行后看输出路径是否是你安装的 JDK 路径,例如:
    C:\Program Files\Java\jdk1.8.0_471\jre
    

如果输出是 C:\Program Files\JetBrains\IntelliJ IDEA ...\jbr,说明用了 IDEA 自带的 JBR(JetBrains Runtime),它的 cacerts 可能不完整!

👉 解决办法:强制 IDEA 使用你的 JDK:

  • Run → Edit Configurations → Environment → JRE → 选择你的 1.8.0_471 JDK

🔧 步骤 2:手动将微信 API 证书导入到 JDK 的 cacerts

即使 JDK 较新,也可能因网络或证书链问题失败。我们手动导入。

1. 获取微信支付 API 的服务器证书

Windows 命令提示符(CMD)或 PowerShell 中执行(需安装 OpenSSL,或用浏览器导出):

方法 A:用浏览器导出(推荐,无需 OpenSSL)
  1. 打开 Chrome 浏览器,访问:https://api.mch.weixin.qq.com
  2. 点地址栏锁图标 → “证书” → “详细信息” → “复制到文件…”
  3. 选择 Base-64 编码的 X.509 (.CER) 格式,保存为 wechat.cer(例如保存到 C:\temp\wechat.cer

注意:虽然会显示“此网站无法访问”,但只要能点开证书就行。也可以用 api2.mch.weixin.qq.comapi.mch.weixin.qq.com/v3/certificates 尝试。

方法 B:用 PowerShell(无需安装 OpenSSL)
$webRequest = [Net.WebRequest]::Create("https://api.mch.weixin.qq.com")
try { $webRequest.GetResponse() } catch {}
$cert = $webRequest.ServicePoint.Certificate
$bytes = $cert.Export([System.Security.Cryptography.X509Certificates.X509ContentType]::Cert)
[IO.File]::WriteAllBytes("C:\temp\wechat.cer", $bytes)

2. 导入证书到 JDK 的 cacerts

这部分内容见下面更详细的操作步骤(第二步:用 keytool 导入证书到 JDK 的信任库)

3. 重启 IDEA 并重新运行程序

确保 JVM 重新加载了信任库。


🔍 补充排查:测试是否能正常连接

你可以写一个简单测试类验证 SSL 是否通:

public class SSLTest {public static void main(String[] args) throws Exception {URL url = new URL("https://api.mch.weixin.qq.com");HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();conn.setConnectTimeout(10_000);conn.connect();System.out.println("Response Code: " + conn.getResponseCode());conn.disconnect();}
}

如果这个也报同样的 PKIX 错误,说明确实是证书信任问题;如果成功,那可能是 SDK 初始化时的其他问题。


❌ 不推荐的做法(再次强调)

不要为了“快速解决”而禁用 SSL 验证(如自定义 TrustManager)。微信支付涉及资金交易,必须保证通信安全


✅ 总结操作清单

步骤 操作
1 确认 IDEA 实际使用的是 jdk1.8.0_471(通过 java.home 输出验证)
2 从浏览器导出 api.mch.weixin.qq.com 的证书(.cer 文件)
3 keytool 将证书导入到 jdk1.8.0_471\jre\lib\security\cacerts
4 重启 IDEA,重新运行程序

如果你执行完上述步骤仍报错,请提供:

  1. System.out.println(System.getProperty("java.home")); 的输出
  2. 你保存的证书文件是否包含完整的证书(可以双击查看颁发者,通常是 DigiCertLet's Encrypt
  3. 是否在公司网络/有无代理

没问题!下面我会 一步一步、手把手 教你在 Windows 系统下,如何将微信支付 API 的证书导入到你本地 JDK 的信任库(cacerts)中。全程使用图形界面 + 命令行,适合不熟悉命令操作的开发者。


🧩 前提确认

你已经知道:

  • 你的 JDK 安装路径,比如:C:\Program Files\Java\jdk1.8.0_471
  • 你使用的是 IntelliJ IDEA 开发
  • Java 版本是 1.8.0_471

✅ 第一步:从浏览器导出微信支付的证书(图形化操作)

  1. 打开 Google Chrome 浏览器(推荐),访问:

    https://api.mch.weixin.qq.com
    

    虽然页面会显示“非法请求”或空白,但没关系,我们只要它的证书。

  2. 点击地址栏左侧的 锁图标 🔒 → 点击 “连接是安全的” → 再点 “证书有效”(不同 Chrome 版本文字略有不同)。

  3. 会弹出一个证书窗口,切换到 “详细信息” 标签页。

  4. 点击底部的 “复制到文件…” 按钮 → 点 “下一步”

  5. 选择格式:✅ Base-64 编码的 X.509 (.CER) → 点“下一步”。

  6. 点“浏览”,选择保存位置,比如:

    C:\temp\wechat.cer
    

    如果没有 C:\temp 文件夹,可以新建一个,或者保存到桌面也行,比如 C:\Users\你的用户名\Desktop\wechat.cer

  7. 点“下一步” → “完成” → 提示“导出成功”,点“确定”。

✅ 现在你已经有了证书文件:C:\temp\wechat.cer(或你选的路径)


✅ 第二步:用 keytool 导入证书到 JDK 的信任库

keytool 是 JDK 自带的工具,位于 jdk安装目录\jre\bin\keytool.exe

1. 找到你的 JDK 路径

通常在:

C:\Program Files\Java\jdk1.8.0_471

你可以通过 IDEA 确认:

  • File → Project Structure → SDKs → 查看 JDK home path

2. 以管理员身份打开“命令提示符”(CMD)

实际上不需要管理员权限,但为了保险可以右键“以管理员身份运行”

  • Win + R,输入 cmd,回车

3. 执行导入命令

假设:

  • JDK 路径是:C:\Program Files\Java\jdk1.8.0_471
  • 证书路径是:C:\temp\wechat.cer

在 CMD 中输入以下命令(一行完整输入):

"C:\Program Files\Java\jdk1.8.0_471\jre\bin\keytool.exe" -import -alias wechatpay -file C:\temp\wechat.cer -keystore "C:\Program Files\Java\jdk1.8.0_471\jre\lib\security\cacerts"

💡 注意:路径中有空格(如 Program Files),所以要用英文双引号 " 包起来!

4. 输入密钥库密码

默认密码是:

changeit

(输入时不会显示字符,输完直接回车)

5. 信任该证书吗?

你会看到类似:

Trust this certificate? [no]: 

输入:

yes

然后回车。

✅ 出现 Certificate was added to keystore 表示成功!


✅ 第三步:验证是否导入成功(可选)

你可以列出所有证书,看看有没有 wechatpay

"C:\Program Files\Java\jdk1.8.0_471\jre\bin\keytool.exe" -list -keystore "C:\Program Files\Java\jdk1.8.0_471\jre\lib\security\cacerts" -alias wechatpay

输入密码 changeit,如果显示证书指纹,说明已存在。


✅ 第四步:重启 IDEA 并重新运行程序

  • 关闭 IntelliJ IDEA
  • 重新打开项目
  • 重新运行你的代码

因为 JVM 启动时加载 cacerts,所以必须重启应用(IDEA 或你的程序)


❓常见问题

Q1:提示 'keytool' 不是内部或外部命令

→ 说明你没用完整路径。请务必使用带路径的完整命令,如上面所示。

Q2:证书导入后还是报错?

→ 检查 IDEA 是否真的用了这个 JDK(打印 System.getProperty("java.home") 看路径)

Q3:我有多个 JDK 怎么办?

→ 确保你导入的是 IDEA 实际使用的那个 JDKcacerts


🎯 最终效果

导入后,Java 就能信任微信支付服务器的 HTTPS 证书,你的代码:

Config config = new RSAAutoCertificateConfig.Builder().merchantId(mchId).privateKeyFromPath(keyPath).merchantSerialNumber(mchSerialNo).apiV3Key(apiV3Key).build();

就能正常通过 HTTPS 下载平台证书,不再报 PKIX 错误!


如果你卡在任何一步(比如找不到证书、命令报错),可以截图或复制错误信息发给我,我会继续帮你!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/963861.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

11-12午夜盘思

1、大盘无忧;三市成交萎缩至2万亿以下,成交起不来,小票妖股满天飞;抱团票,确实更难做一些,尽量不要追涨买; 2、情绪方面:合富中国反包涨停,明天观察承接反馈,情绪周期强势延续;20cm方向,清水源平开下杀,观…

Day19综合案例二

<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0">…

命题逻辑连接词 ↔ C++ 逻辑/位运算 对照表(完整版)

中文名称 逻辑符号 英文名称 含义举例 逻辑真值运算说明 C++逻辑运算符(布尔逻辑) C++按位运算符(位逻辑) 说明与示例合取(且) ∧ AND p ∧ q 仅当 p 和 q 都为真时为真 && & p && q:逻辑与…

昆仑通态触摸屏物联网远程运维McgsIot

第一步:下载安装注册物联助手 电脑端进行账号注册:第二步:触摸屏物联网功能添加McgsIot驱动添加到项目中物联网信息的变量关联触摸屏物联网画面制作初始化物联网信息注意:图中四个信息必须按照上图输入,否则触摸屏…

简单二分

如果你被「左闭右开二分」、「左闭右闭二分」等刁钻问题纠结的很烦恼,不妨看一下这篇博客。希望这篇博客能让你再也不用纠结于这些刁钻问题。 引入 先来个瞎编的例题交互。有一个长为 \(N\) 的 01 字符串 \(S\),下标…

微软MS17-012安全更新详解:六大Windows漏洞修复指南

微软发布MS17-012关键安全公告,修复了Windows系统中的六个安全漏洞,包括Device Guard安全功能绕过、SMB拒绝服务、DLL加载远程代码执行等严重问题,影响从Windows Vista到Windows Server 2016等多个版本。微软安全公…

2025.11.12总结

今天写完AI儿童故事的项目,调通了三个模型分别是文本生成,语音合成,和ai作画。 其中因为ai作画免费额度低,试错次数少,在刚开始无脑用AI导致试错很多,后面看文档才修改过了错误参数 以下是文本生成,和语音合成示…

Scala基础学习day01

今天学习了Scala基础操作 1.注释和Java操作一样 2.常量和变量(重点) 其中var是变量类型,val是常量类型。在Scala中能用常量最好用常量,与Java相反 变量声明时,必须要有初始值 在声明/定义一个变量时,可以用var或…

以太坊的测试网络 - all-in

此水龙头不需要主网内有ETH,每24小时可以领取0.05Sepolia ETH:https://cloud.google.com/application/web3/faucet/ethereum/sepolia 如图所示:此次交易的哈希值:0x2689de30e418af10ac60194dcb594311feee50f6df7b5…

洛谷 P11965:[GESP202503 七级] 等价消除 ← 位运算(异或) + STL map

​【题目来源】https://www.luogu.com.cn/problem/P11965【题目描述】小 A 有一个仅包含小写英文字母的字符串 S。对于一个字符串,如果能通过每次删去其中两个相同字符的方式,将这个字符串变为空串,那么称这个字符串…

*题解:P6617 查找 Search

原题链接 解析 考虑对于每个位置 \(i\) 维护最大的位置 \(pre_i < i\) 满足 \(a_i+a_{pre_i}=w\),这样区间 \([l,r]\) 内存在编号和为 \(w\) 的充要条件就为 \(\max_{i=l}^rpre_i \ge l\),可以使用线段树来维护。…

时序数据库的基本概念与原理:从核心到应用场景解析

一、时序数据库的核心概念 时序数据库( Time Series Database, TSDB ) 是一种专门用于存储、 管理和分析时间序列数据的数据库系统。 时间序列数据是指按时间顺序记录的数据点集合,通常具有以下特点: 时间维度为主…

C 指针数组函数之间的关联

可能经常会听到:指针常量、常量指针、指针数组、数组指针、指针函数、函数指针;函数指针数组,等这些听起来感觉向绕口令似的词汇; 可见数组、指针、函数之间是有很多联系的。比如看下面一段代码: #include<std…

2025.11.12 测试

2025.11.12 测试额 今天比较简单 感觉是 csp- 第一题,用线段树模拟贪心即可 当然也可以用三次单调队列,但没必要 第二题 额,线性基(模版?) 考虑答案是前面元素构成的线性空间 用 $ 2^{num} $ 即可 大样例是 \(2^…

13. 罗马数字转化为字符串

https://leetcode.cn/problems/roman-to-integer/ 难度:简单 题目说:I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。C 可以放在 D (500) 和 M (1000) …

逻辑回归(随笔)

核心思想:从回归到分类 想象一下,我们有一个简单的二分类问题(比如,根据肿瘤大小判断它是良性[0]还是恶性[1])。线性回归的困境:如果我们直接用线性回归 y = wx + b 来拟合,我们会用一条直线来拟合这些点。对于…

解析到本地127的神奇域名

作为一名 Web 开发者,我的日常工作就是在本地进行开发,实现各种功能。过去几年,我一直使用 127.0.0.1 作为本地服务的访问地址。当需要同时开发多个项目时,我会用不同端口来区分,例如:项目A:127.0.0.1:8080 项目…

这封邮件写得真好,是你自己写的吗? 不,是AI写的

本文通过一个真实职场场景,引出了职场中邮件写作的重要性和困难点,详细介绍了专门的AI邮件写作指令,通过实际案例展示了AI生成邮件的效果,并提供了使用技巧和注意事项,帮助职场人士快速提升邮件写作能力。昨晚11点…

FFmpeg 官方汇编课程:写出快 5 倍的视频处理代码

你的视频处理程序能跑通就行了? 同一个算法,有人用汇编优化后性能提升 5 倍。这不是天赋问题,而是技术盲区。FFmpeg 团队把内部汇编培训资料开源了,手把手教你写工业级高性能代码。这个项目教什么 asm-lessons 是 …

P14364 [CSP-S 2025] 员工招聘

考虑设 \(f_{i, j}\) 为前 \(i\) 个人死了 \(j\) 个,由于不知道哪些人选了所以无法转移。原因是前面的决策会影响后面的决策,所以考虑贡献延后计算。 会发现一个事情,对于当前 \(c_x \leq j\) 的东西之后不会再决策…