hello呀,今天写微信支付测试代码的时候,出现了一个异常的问题,不知道大家遇到过吗?就是获取商户私钥的时候,获取不到具体的私钥内容,获取到的是一个地址。
下面是代码:
@Configuration
@PropertySource("classpath:wxpay.properties") //读取配置文件
@ConfigurationProperties(prefix = "wxpay") //读取的节点
@Data //getter和setter 方法
public class WxPayConfig {
// 商户号
private String mchId;
// 商户API证书序列号
private String mchSerialNo;
// 商户私钥文件
private String privateKeyPath;
// APIv3密钥
private String apiV3Key;
// APPID
private String appid;
// 微信服务器地址
private String domain;
// 接收结果通知地址
private String notifyDomain;
/**
* @Decription 获取商户的私钥
* @Param fileName 私钥文件的路径
* @Return java.security.PrivateKey
* @Author lmh
* @Date 2022/5/12 0:48
*/
public PrivateKey getPrivateKey(String fileName){
try {
PrivateKey merchantPrivateKey = PemUtil.loadPrivateKey(
new FileInputStream(fileName));
return merchantPrivateKey;
} catch (FileNotFoundException e) {
//抛出异常,并把错误文件继续向上抛出
throw new RuntimeException("私钥文件不存在",e);
}
}
}
然后我用test测试了一下
@SpringBootTest
class PaymentDemoApplicationTests {
@Resource
private WxPayConfig wxPayConfig;
/**
* @Decription 测试获取商户私钥
* @Param null
* @Return void
* @Author lmh
* @Date 2022/5/12 0:55
*/
@Test
void getPrivateKey() {
//1,获取私钥文件路径
String privateKeyPath = wxPayConfig.getPrivateKeyPath();
//2,获取私钥
PrivateKey privateKey = wxPayConfig.getPrivateKey("src/main/resources/"+privateKeyPath);
//3,打印私钥
System.out.println("============privateKeyPath:"+privateKeyPath);
System.out.println(privateKey.toString());
}
}
打印之后的结果是:sun.security.rsa.RSAPrivateCrtKeyImpl@ffdd3c1b
这明显的不是私钥呀,tostring()也不行,仔细检查了代码,代码也没有错误呀。百度了好久看到一篇博客说,是jdk版本低的原因,我就抱着尝试的心态重新下载了JDK 8u333的版本,又等待下载了半个小时,最终终于获取成功了。获取之后的结果是这样的:
如果有跟我出现同样问题的同志们,也可以尝试一下这个方式,梦梦试过了,是可以解决问题的。
下载jdk的地址:
oracle官网
对了,下载完jdk之后要记得重新配置一下哦,cmd试一下 java -version配置的jdk对不对,idea中关于jdk的配置也需要改一下哦,分别是下面的几部分:
1,java 编译器的版本,就是生成class文件的jdk版本
2,更新一下SDK的版本
3,项目中实际的JDK最低版本要求以及实际的jdk版本
4,这里也改一下,与Modules中的配置一样即可。
好辽,以上就是梦梦今天遇到问题、解决问题、记录问题的一个过程辽,希望能给遇到同样问题的同志们一个帮助,哈哈哈。