使用場景
每個商戶信息不一樣,字段且不一樣,商戶信息統一用json格式保存至數據庫;商戶信息也可以文件內容,所以有了如下的實現。
實現步驟
文件內容轉成字符串
// 文件轉字符串
FileInputStream inputStream = new FileInputStream("E:\\dolphin\\pays\\apiclient_cert.p12");
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
int len;
while ((len = inputStream.read()) != -1) {
byteArrayOutputStream.write(len);
}
inputStream.close();
// 將內容存入數組中
byte[] fileData = byteArrayOutputStream.toByteArray();
byteArrayOutputStream.close();
// 轉成String字符串
fileStr = new String(fileData, StandardCharsets.ISO_8859_1);
作爲字段存入JSON
@Test
public void addTest() {
HttpMerchantIdentifyAddRequest request = new HttpMerchantIdentifyAddRequest();
request.setAccountNo("testMerchantIndexCodePms");
request.setPayType("weChatPay");
request.setMerchantIdentyName("測試");
request.setExtendInfo("string");
Map<String, String> data = new HashMap<>();
data.put("weChatAppId", "123");
data.put("weChatMchId", "1222");
data.put("weChatMchKey", "123354");
data.put("certFileData", fileStr);
request.setContent(JsonUtil.toJson(data));
sendPost("http://10.19.132.178:8080/pays/api/merchantIdentify/add/V1", JsonUtil.toJson(request));
}
數據庫保存
將content字段類型設置爲文本型
create table tb_merchant_identify (
id varchar(64) not null ,
merchant_identify_name varchar(48) ,
pay_type varchar(48) not null ,
account_no varchar(64) not null ,
content text ,
create_time timestamp not null ,
update_time timestamp not null ,
extend varchar(48) ,
constraint pk_tb_merchant_identify primary key (id)
);
文件取出使用
// 字符串轉文件
FileOutputStream outputStream = new FileOutputStream("E:\\dolphin\\pays\\temp.p12");
outputStream.write(fileStr.getBytes(StandardCharsets.ISO_8859_1));
outputStream.flush();
outputStream.close();
// 字符串直接轉成流,不要生成中間文件
InputStream inputStream = new ByteArrayInputStream(certFileData.getBytes(StandardCharsets.ISO_8859_1));
注意:編碼要用 StandardCharsets.ISO_8859_1 爲單字節編碼,用雙字節內容會被改變,導致文件內容不一致。