记录下遇到的问题和几个关键的点
背景:
cloud版本Dalston.SR5
feign client的注解用的是@RequestMapping的形式
微信那边的接口是使用XML通信的, Request和response都是XML, 接口参数需签名, 部分接口需要双向认证.
遇到的问题:
1. 如何在feign里设置双向认证证书
2. 若使用Bean发送或接收参数, 会自动使用application/json的方式处理数据
3. 使用bean作为发送参数后签名失败
问题解决:
1. 如何在feign里设置双向认证证书?
自定义feign的configuration, 然后@Bean覆盖Client. 在新的构造里添加双向认证.
@Bean
public Client feignClient() {
return new Client.Default(
TrustingSSLSocketFactory.get("MMPayCert"),
new NoopHostnameVerifier());
}
TrustingSSLSocketFactory类参考自
https://github.com/OpenFeign/feign/blob/master/core/src/test/java/feign/client/TrustingSSLSocketFactory.java
因为一开始不知道微信支付的证书key是MMPayCert, 对SSLContext的构造部分代码做了改动, 使构造时载入加载p12文件的KeyStore类, 并在SSLContext成功构建后打断点查看内部属性, 找到对应的key. 改动后的类初始化代码:
private TrustingSSLSocketFactory(String s