昨晚睡一睡突然一个念头闪过,
为什麽用那麽多try catch
昨天写的程序中,我用了大量的try catch,原因其实也就是IDE提示要加,所以就加了
在程序中到底要在哪边加try catch最适合,我也还在摸索
例外处理真的是一门大学问...
目前我在QpayHelper中全改成throws Exception的方式抛出,
因为没意外的话都会是由Controller那边呼叫,
我想在Controller再一起处理就可以了
另外,我建立了一个空的interface,
public interface QpayReq {
}
目的是要用来让我的Data Object拿去 implements
顺带一提我发现可以用@JsonPropertyOrder(alphabetic=true)
来设定转换json时是依照字母大小排序
因为发api的规则都是一致的,不同的只有发送的内容,
因此我把发api的request都写成data object ,并implements QpayReq
接着在QpayHelper,
我打算用同一个方法来call永丰的那三个支付api,来降低程序的重复度
作法就是以QpayReq
、api名称 当作参数,
这麽做可以让我们把三支api的不同内容的data object可以用同个方法传入,又不用担心范围开太大降低程序可读性
public Map<String, Object> qpayHelper(QpayReq qReq,String apiName)throws IOException, GeneralSecurityException, DecoderException{
//1.nonce
String nonce=getNonce();
//2.hashID
String hashID=getHashID();
//3.iv
String iv = getIV(nonce);
ObjectMapper mapper = new ObjectMapper();
mapper.setPropertyNamingStrategy(new QpayPropNamingStrategy());
mapper.setSerializationInclusion(Include.NON_NULL);
//4.message
String jsonContent =mapper.writeValueAsString(qReq);
String message = "";
message= encryptUtil.encrypt(jsonContent, hashID, iv);
//5.sign
Map<String, Object> map =
mapper.convertValue(qReq, new TypeReference<TreeMap<String, Object>>() {});
String sign = getSign(map,nonce,hashID);
//send to api
Map<String,String> request = new HashMap<String,String>();
request.put("Version", "1.0.0");
request.put("ShopNo",
SystemConfigUtil.systemConfMap.get("ShopNo"));
request.put("APIService", apiName);
request.put("Sign", sign);
request.put("Nonce", nonce);
request.put("Message", message);
String reqJson="";
reqJson = new ObjectMapper().writeValueAsString(request);
String res="";
res=util.post(
SystemConfigUtil.systemConfMap.get("Qpay_API_Url"), reqJson);
Map<String, String> resMap =new HashMap<String,String>();
resMap = mapper.readValue(res,
new TypeReference<HashMap<String, String>>() {});
String resSign =resMap.get("Sign");
String resNonce =resMap.get("Nonce");
String resMessage =resMap.get("Message");
String resiv= getIV(resNonce);
resMessage=encryptUtil.decrypt(resMessage, hashID, resiv);
Map<String, Object> resMessageMap =new TreeMap<String,Object>();
resMessageMap = mapper.readValue(resMessage,
new TypeReference<TreeMap<String, Object>>() {});
String signCheck = getSign(resMessageMap, resNonce, hashID);
if(signCheck.equals(resSign)){
System.out.println("Sign Check OK:"+signCheck);
}else{
throw new IllegalArgumentException("永丰回传签章验证失败");
}
return resMessageMap;
}
把try catch拿掉後 整体看起来也乾净多了
回传的值我打算直接回传api回给我们的值转成的map,
之後用Service 来call这个api方法後再各自对map做相对应的处理
>>: Day 20 中场休息,来做点酷东西(型别修正跟除点小虫)
1.变数不影响他人的方式(合作时要用) (1)把自己的计划包起来,变数执行完之後就舍弃 IIFE =...
表单标签主要功用是用来收集使用者资料 常用情况 : 注册页面... 主要由 表单域、表单元素、提示文...
上次学会了有关离散型的机率生活题 今天来说有关连续型的机率生活应用 NORMAL DISTRIBUT...
这几天写 String methods 的时候,在句法里发现(regexp)这个词,查了一下原来是 ...
透过 WordPress 区块编辑器撰写文章最常用的「区块 Block」之一,就是「标题区块 He...