首先 spring boot项目默认搭的是jar,这时候jar和以前web 项目的war包部署在加载外部资源文件还是有点区别的
1.首先把需要加载的文件放在服务器某一个文件夹里:比如 /opt/config
对应的配置文件
系统里面加载的配置文件类
import com.wechat.pay.contrib.apache.httpclient.WechatPayHttpClientBuilder;
import com.wechat.pay.contrib.apache.httpclient.auth.PrivateKeySigner;
import com.wechat.pay.contrib.apache.httpclient.auth.ScheduledUpdateCertificatesVerifier;
import com.wechat.pay.contrib.apache.httpclient.auth.WechatPay2Credentials;
import com.wechat.pay.contrib.apache.httpclient.auth.WechatPay2Validator;
import com.wechat.pay.contrib.apache.httpclient.util.PemUtil;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.impl.client.CloseableHttpClient;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.io.ClassPathResource;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.UnsupportedEncodingException;
import java.nio.charset.StandardCharsets;
import java.security.PrivateKey;
@Configuration
@PropertySource("classpath:wxpay.properties") //读取配置文件
@ConfigurationProperties(prefix = "wxpay") //读取wxpay节点
@Data //使用set方法将wxpay节点中的值填充到当前类的属性中
@Slf4j
public class WxPayConfig {
// private String url =new ClassPathResource("wxxcqpay_key.pem").getPath();
// private String url = WxPayConfig.class.getResource("/apiclient_key.pem").getPath();
/**
* 阿里云 加载资源
*/
// public ClassPathResource classPathResource = new ClassPathResource("/opt/upload/apiclient_key.pem");
/**
* 本地环境 加载资源
*/
//private String filePath = WxPayConfig.class.getResource("/apiclient_key.pem").getPath();
//private String filePath = WxPayConfig.class.getResource("/opt/upload/wxxcqpay_key.pem").getPath();
// private String url = new ClassPathResource("/wxxcqpay_key.pem").getPath();
// 商户号
private String mchId;
private String secret;
// 商户API证书序列号
private String mchSerialNo;
// 商户私钥文件
public String privateKeyPath;
// APIv3密钥
private String apiV3Key;
// APPID
private String appid;
// 微信服务器地址
private String domain;
// 接收结果通知地址
private String notifyDomain;
// // APIv2密钥
private String partnerKey;
/**
* 获取商户的私钥文件
*
* @param filename
* @return getPartnerKey
*/
public PrivateKey getPrivateKey(String filename) {
log.info("filename-------->{}", filename);
log.info("url-------->{}", url);
try {
return PemUtil.loadPrivateKey(new FileInputStream(filename));
} catch (FileNotFoundException e) {
throw new RuntimeException("私钥文件不存在1", e);
}
}
/**
* 获取签名验证器
*
* @return
* @throws UnsupportedEncodingException
*/
@Bean
public ScheduledUpdateCertificatesVerifier getVerifier() throws UnsupportedEncodingException {
log.info("获取签名验证器---");
// 阿里云环境
// ApplicationHome applicationHome = new ApplicationHome(WxPayConfig.class);
// String s = applicationHome.getSource().getParentFile().toString();
// String filePath = s + "/apiclient_key.pem";
// PrivateKey privateKey = getPrivateKey(URLDecoder.decode(filePath, "utf-8"));
// PrivateKey privateKey = getPrivateKey(URLDecoder.decode(url, "utf-8"));
//获取商户私钥
PrivateKey privateKey = getPrivateKey(privateKeyPath);
log.info("获取签名验证器", privateKey);
PrivateKeySigner privateKeySigner = new PrivateKeySigner(mchSerialNo, privateKey);
WechatPay2Credentials wechatPay2Credentials = new WechatPay2Credentials(mchId, privateKeySigner);
ScheduledUpdateCertificatesVerifier verifier = new ScheduledUpdateCertificatesVerifier(
wechatPay2Credentials,
apiV3Key.getBytes(StandardCharsets.UTF_8));
return verifier;
}
/**
* 获取http请求对象
*
* @param verifier
* @return
* @throws UnsupportedEncodingException
*/
@Bean(name = "wxPayClient")
public CloseableHttpClient getWxPayClient(ScheduledUpdateCertificatesVerifier verifier) throws UnsupportedEncodingException {
log.info("获取httpClient");
// 阿里云环境
// ApplicationHome applicationHome = new ApplicationHome(WxPayConfig.class);
// String s = applicationHome.getSource().getParentFile().toString();
// String filePath = s + "/apiclient_key.pem";
//获取商户私钥
// PrivateKey privateKey = getPrivateKey(URLDecoder.decode(filePath, "utf-8"));
// PrivateKey privateKey = getPrivateKey(URLDecoder.decode(url, "utf-8"));
//获取商户私钥
PrivateKey privateKey = getPrivateKey(privateKeyPath);
WechatPayHttpClientBuilder builder = WechatPayHttpClientBuilder.create()
.withMerchant(mchId, mchSerialNo, privateKey)
.withValidator(new WechatPay2Validator(verifier));
// ... 接下来,你仍然可以通过builder设置各种参数,来配置你的HttpClient
// 通过WechatPayHttpClientBuilder构造的HttpClient,会自动的处理签名和验签,并进行证书自动更新
CloseableHttpClient httpClient = builder.build();
return httpClient;
}
/**
* 获取HttpClient,无需进行应答签名验证,跳过验签的流程
*/
@Bean(name = "wxPayNoSignClient")
public CloseableHttpClient getWxPayNoSignClient() throws UnsupportedEncodingException {
//获取商户私钥
// PrivateKey privateKey = getPrivateKey(privateKeyPath);
// 阿里云环境
// ApplicationHome applicationHome = new ApplicationHome(WxPayConfig.class);
// String s = applicationHome.getSource().getParentFile().toString();
// String filePath = s + "/apiclient_key.pem";
// PrivateKey privateKey = getPrivateKey(URLDecoder.decode(filePath, "utf-8"));
// PrivateKey privateKey = getPrivateKey(URLDecoder.decode(url, "utf-8"));
//获取商户私钥
PrivateKey privateKey = getPrivateKey(privateKeyPath);
//用于构造HttpClient
WechatPayHttpClientBuilder builder = WechatPayHttpClientBuilder.create()
//设置商户信息
.withMerchant(mchId, mchSerialNo, privateKey)
//无需进行签名验证、通过withValidator((response) -> true)实现
.withValidator((response) -> true);
// 通过WechatPayHttpClientBuilder构造的HttpClient,会自动的处理签名和验签,并进行证书自动更新
CloseableHttpClient httpClient = builder.build();
log.info("== getWxPayNoSignClient END ==");
return httpClient;
}
}
2.编写镜像文件 (最简单的)
FROM openjdk:8
ADD new-authority-system-service-0.0.1-SNAPSHOT.jar /app.jar
EXPOSE 8082
ENTRYPOINT ["java","-jar","/app.jar"]
3.将JAR包打成镜像
docker build -t system-service:0.0.1 .
注意:Dockerfile文件和jar文件在同一个目录下
4.运行镜像文件并进行目录的挂载(资源文件)
docker run --name system-service -d -p 8082:8082 -v /opt/config:/opt/configsystem-service:0.0.1
#/opt/config:/opt/config 之前在服务器上存放的资源文件路径(可以自定义,但是要和图一的路径相对应)
完成!