当前位置: 首页 > 开发杂谈 >

[Day 17] - 初探永丰银行线上收款API - 丰收款 - Sign值计算(2)

来实作Sign值的计算

我的想法是把要发送到api的request写成一个Object,像这样

import lombok.Data;

@Data
public class OrderCreateReq {

    public enum PayType { A, C };
    public enum AutoBilling { Y, N };
    
    @Data
    public class ATMParam{
        private Integer ExpireDate;
    }
    @Data
    public class CardParam{
        private AutoBilling AutoBilling;
        private Integer ExpBillingDays;
        private Integer ExpMinutes;
        private String PayTypeSub;
    }
    
    private String ShopNo;
    private String OrderNo;
    private Integer Amount;
    private String CurrencyID;
    private String PrdtName;
    private String Memo;
    private String Param1;
    private String Param2;
    private String Param3;
    private String ReturnURL;
    private String BackendURL;
    private PayType PayType;
    private ATMParam ATMParam;
    private CardParam CardParam;

}

回到QpayHelper,建一个getSign方法,
到时候我会先用ObjectMapper将OrderCreateReq转为TreeMap,
因此这边先订定接收的是Map物件

因为ObjectMapper会将含有sub object的object转为LinkedHashMap,
我们可以透过指定移除value的class为LinkedHashMap的物件
以此来把多节点参数给拿掉

再来因为转为TreeMap时,透过TreeMap自动排序的特性,已经把map中的key由小到大排列了,不用再多做处理

因此getSign方法只需要:
1.将map转为key1=vale1&key2=value2...这样格式的字串
2.将字串接上nonce、Hash ID
3.最後,只要再用DigestUtils转为sha256、转大写就完成sign了。

    private String getSign(Map<String, Object> map,String nonce,String hashid){
        //remove sub object
        map.values().removeIf(entries->entries.getClass().equals(java.util.LinkedHashMap.class)
        ||entries.toString().isBlank());
        //order
        String param=map.entrySet().stream()
          .map(p -> p.getKey() + "=" + p.getValue())
          .reduce((p1, p2) -> p1 + "&" + p2)
          .orElse("");

        //convert to string
        StringBuilder content = new StringBuilder();

        content.append(param).
                append(nonce).
                append(hashid);
        String sign= DigestUtils.sha256Hex(content.toString()).toUpperCase(); 
        return sign;
    }

现在Sign也有了,剩下message
https://ithelp.ithome.com.tw/upload/images/20211002/201289739YsspIn8xe.png
依规格书所述,要以AES CBC进行加密,因此先写加密方法
我找了网路上一个简单的AES CBC加密的范例来改写,其他解密之类的之後有需要再补

建一个EncryptUtil.java,传入欲加密的内容、key、iv,回传加密後的Hex字串

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

import org.apache.commons.codec.binary.Hex;
import org.springframework.stereotype.Component;

@Component
public class EncryptUtil {
    public String encrypt(String content, String key,String iv) throws Exception {

        byte[] raw = key.getBytes("UTF-8");
        SecretKeySpec keySpec = new SecretKeySpec(raw, "AES");
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        IvParameterSpec ips = new IvParameterSpec(iv.getBytes("UTF-8"));
        cipher.init(Cipher.ENCRYPT_MODE,keySpec,ips);
        byte[] encrypted = cipher.doFinal(content.getBytes());

        return Hex.encodeHexString(encrypted);

    }
}

东西都准备得差不多,
接下来就可以开始串前面的写的东西了/images/emoticon/emoticon29.gif


相关文章:

  • Day01网页设计入门笔记-前言
  • NETGEAR WIFI EXTENDER SETUP
  • 亚马逊卖家从传统制造到跨境电商,怎么做到多年销量暴增
  • [Day5] 函式(数)介绍
  • 亚马逊政策中不能碰的6条红线
  • Day 05-选择React & Redux
  • Day23 Portal
  • ebay物流价格:物流的分类选择
  • 阻止B-1B轰炸机前进的不是敌人是一台平板
  • 独立站卖家优化店铺的六个技巧
  • 前人种树,後人乘凉之自动产生程序码片段 (上)
  • 品牌白名单的申请步骤
  • Day 29 - [Android APP] 07-MVVM中的RecyclerView与Adapter
  • 【领域展开 12 式】 安装 Soledad 主题插件,成功汇入漂亮模板到网站罗
  • Day22 Vue 认识Porps(1)
  • 免费VPS/腾讯云国际版/免费送300美金/有效期6个月
  • WordPress禁用古腾堡编辑器全屏模式
  • 如何在Hositnger主机开启Cloudflare服务,Hositnger主机Cloudflare CDN使用教程
  • WordPress建立数据库连接时出错怎么办?
  • WordPress主题怎么安装?WordPress主题模板安装失败怎么解决
  • 狗狗币怎么获得?狗狗币挖矿教程和狗狗币使用方法
  • 2021年10个全球电子商务趋势[信息图] ,所有电商人员都该了解一下
  • PHP安装环境怎么搭建(LAMP环境怎么搭建):教你搭建PHP+Mysql服务器环境
  • 一键脚本/Superspeed: 一键测试服务器到国内的速度
  • 海外营销周报:Facebook将对其广告工具进行调整,Linkedin恢复中国境内账号注册
  • 海外营销周报:谷歌在搜索中取消Q&A功能,FaceBook Marketplace用户总量达 10 亿人 – 知外贸
  • 俄取消商品知识产权限制 盗版游戏、电影等商标合法化
  • 如何使用Hostinger的邮箱服务,Hostinger免费企业邮箱设置教程
  • 美国花旗银行虚拟信用卡申请教程【国内怎么申请美国信用卡】
  • vultr.com怎么申请退款教程和方法