[Day 15] - 初探永丰银行线上收款API - 丰收款 - HASH ID计算(2) +IV计算

接续昨天未完成的作业

依据规格书,HASH ID 是由给定的4组hash值算出
https://ithelp.ithome.com.tw/upload/images/20210930/20128973nbZVSlW7Ja.png
我先以写死的值来测试
https://ithelp.ithome.com.tw/upload/images/20210930/20128973fKPze6JUJV.png
结果无误
https://ithelp.ithome.com.tw/upload/images/20210930/20128973xNKXqZELdh.png

接下来就建了一个QpayHelper.java
拿来放跟丰收款相关的方法

public class QpayHelper {
}

首先将取得nonce的方法移进来

private String getNonce(){
    HttpUtil util = new HttpUtil();
    String shopNo= SystemConfigUtil.systemConfMap.get("ShopNo");
    String nonceUrl= SystemConfigUtil.systemConfMap.get("Qpay_API_Url_Nonce");

    Map<String,String> map = new HashMap<String,String>();
    map.put("ShopNo", shopNo);

    String json;
    String nonce="";
    try {
        json = new ObjectMapper().writeValueAsString(map);
        nonce=util.post(nonceUrl, json);
    } catch (IOException e) {
        e.printStackTrace();
    }
    return nonce;
}

再来是取得HASH ID,一样从前面的测试直接COPY过来,参数
改成从systemConfigMap取

    private String getHashID(){
        BigInteger hashA1 = new BigInteger(
        SystemConfigUtil.systemConfMap.get("HASH_ID_A1"), 16);
        BigInteger hashA2 = new BigInteger(
        SystemConfigUtil.systemConfMap.get("HASH_ID_A2"), 16);
        BigInteger hashB1 = new BigInteger(
        SystemConfigUtil.systemConfMap.get("HASH_ID_B1"), 16);
        BigInteger hashB2 = new BigInteger(
        SystemConfigUtil.systemConfMap.get("HASH_ID_B2"), 16);
        BigInteger hashA = hashA1.xor(hashA2);
        BigInteger hashB = hashB1.xor(hashB2);
        String hashID =hashA.toString(16)+hashB.toString(16);
        return hashID.toUpperCase();
    }

依据规格书,取得Nonce之後还要将Nonce转为sha256,IV即是SHA256後的末16位
这边我直接使用apache的codec了,加到pom:

		<dependency>
    		<groupId>commons-codec</groupId>
    		<artifactId>commons-codec</artifactId>
    		<version>1.10</version>
		</dependency>

nonce传入後直接使用DigestUtils的方法转sha256,很方便

private String getIV(String nonce){
    String sha256hex = DigestUtils.sha256Hex(nonce); 
    String iv = sha256hex.substring(sha256hex.length()-16, sha256hex.length()).toUpperCase();
    return iv;
}

取得sha256的值後取後16位并转大写就完成了

可以到永丰提供的验证页面看看自己的程序算出来的值是否正确

这边不得不说,JAVA真的是资源很丰富的语言,要什麽功能都有函式库可以call,
不过很多功能的底层是如何实现的,有时间的话我觉得还是可以看看source code
才不会只知道程序跑得动、不知道自己在做什麽

不过今天也快没时间了,先用再说/images/emoticon/emoticon25.gif

明天来开始实作sign签章的部分!


<<:  第 14 天 不断尝试直到成功( leetcode 017 )

>>:  30.移转 Aras PLM大小事-结语

Day 04 - Credit Enquires 与 Short Stock Source

本篇重点 Credit Enquires Short Stock Source Pandas Dat...

Day 0x1E UVa11321 Sort! Sort!! and Sort!!!

Virtual Judge ZeroJudge 题意 真.排序题 输入数字,按照要求输出排序後的结...

【设计+切版30天实作】|Day1 - 开赛宣言

前言 在开赛前,先来做个小小的自我介绍好了!目前是火箭队的网页设计组,加入火箭队前有上过六角学院的U...

PHP array 相关函数

PHP array 相关函数 <?php /* array_reverse(array $ar...

Day13 - Google Kubernetes Engine 基础 - 使用 Service 暴露服务

前言 上一回我们使用 Pod 将应用程序部属到 Kubernetes 环境里,今天会介绍如何透过 S...