[Day 20] - 初探永丰银行线上收款API - 订单查询及其他(2)

昨晚睡一睡突然一个念头闪过,

为什麽用那麽多try catch

昨天写的程序中,我用了大量的try catch,原因其实也就是IDE提示要加,所以就加了
在程序中到底要在哪边加try catch最适合,我也还在摸索
例外处理真的是一门大学问...

目前我在QpayHelper中全改成throws Exception的方式抛出,
因为没意外的话都会是由Controller那边呼叫,
我想在Controller再一起处理就可以了

另外,我建立了一个空的interface,

public interface QpayReq {
    
}

目的是要用来让我的Data Object拿去 implements
https://ithelp.ithome.com.tw/upload/images/20211005/20128973BoWONOdhpm.png
顺带一提我发现可以用@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:会议

>>:  Day 20 中场休息,来做点酷东西(型别修正跟除点小虫)

Day 27 (Js)

1.变数不影响他人的方式(合作时要用) (1)把自己的计划包起来,变数执行完之後就舍弃 IIFE =...

Day 04 HTML<表单标签>

表单标签主要功用是用来收集使用者资料 常用情况 : 注册页面... 主要由 表单域、表单元素、提示文...

DAY6-EXCEL统计分析:计算连续型机率

上次学会了有关离散型的机率生活题 今天来说有关连续型的机率生活应用 NORMAL DISTRIBUT...

[Day28] 正规表达式 Regular Expression

这几天写 String methods 的时候,在句法里发现(regexp)这个词,查了一下原来是 ...

05 | WordPress 标题区块 Heading Block

透过 WordPress 区块编辑器撰写文章最常用的「区块 Block」之一,就是「标题区块 He...