要求:

1.对所有传入参数(含系统参数和接口参数)按照字段名的 ASCII 码从小到大排序(字典序)后,使用 URL 键值对的格式。(即 key1=value1&key2=value2…)拼接成字符串string1, 注意:值为空的参数不参与签名。

2.在string1后面拼接上key=privateKey得到stringSign字符串,并对stringSign进行sha1运算,再将得到的字符串转为大写,得到sign值。如对 age=12&name=张三 key=privateKey 进行 sha1 加密后得到 xxxxx。

参考代码:

public class Encrypt {
    private static Logger logger = LoggerFactory.getLogger(Encrypt.class);
    public static final String key = "12345abc";
    
    
    public static void main(String[] args) {
        
        //创建实体类
        SubmitAssetRequest submitAssetRequest = new SubmitAssetRequest();
        submitAssetRequest.setBidType("1");
        submitAssetRequest.setBankCardNo("6217002870039791536");
        submitAssetRequest.setBankName("中国建设银行");
        submitAssetRequest.setPeriodsType(1);
        submitAssetRequest.setAmount(new BigDecimal(1000));
        submitAssetRequest.setIdCardNumber("420117199105248734");
        submitAssetRequest.setMobile("18807111634");
        submitAssetRequest.setSex(1);
        submitAssetRequest.setMarriageState(0);
        submitAssetRequest.setName("张三");
        submitAssetRequest.setPeriods(14);
        submitAssetRequest.setChannelCode("NYD");
        submitAssetRequest.setRates(new BigDecimal(23.76));
        submitAssetRequest.setOrderId("101537895995716001");
        
        //参数封装到map集合
        Map<String, String> map = getMap(submitAssetRequest);
        
        //排序
        String sign = getSign(map);
        System.out.println(sign);
        
        
        
    }
    
    /**
     * 将参数封装到map集合,不为空的参数添加进去
     * @param request
     * @return
     */
    public static Map<String, String> getMap(SubmitAssetRequest request){
        Map<String, String> map = new HashMap<>();
        map.put("channelCode",request.getChannelCode());
        map.put("orderId",request.getOrderId());
        map.put("name",request.getName());

if (!StringUtils.isEmpty(request.getInvestorList())){
            map.put("investorList",request.getInvestorList());
        }

map.put("bidType",request.getBidType());
        map.put("sex",String.valueOf(request.getSex()));
        map.put("mobile",request.getMobile());
        map.put("idCardNumber",request.getIdCardNumber());
        map.put("bankName",request.getBankName());
        map.put("bankCardNo",request.getBankCardNo());

if (!StringUtils.isEmpty(request.getLoanUse())){
            map.put("loanUse",request.getLoanUse());
        }

if (request.getIncome() != null){
            map.put("income",String.valueOf(request.getIncome()));
        }

if (!StringUtils.isEmpty(request.getAddress())){
            map.put("address",request.getAddress());
        }

if (!StringUtils.isEmpty(request.getBirthPlace())){
            map.put("birthPlace",request.getBirthPlace());
        }

if (String.valueOf(request.getMarriageState()) != null){
            map.put("marriageState",String.valueOf(request.getMarriageState()));
        }

map.put("periods",String.valueOf(request.getPeriods()));
        map.put("periodsType",String.valueOf(request.getPeriodsType()));
        map.put("amount",String.valueOf(request.getAmount()));
        map.put("rates",String.valueOf(request.getRates()));

return map;
    }
    
    public static String getSign(Map<String, String> map){
        
        if (map == null || map.size() == 0) {
            return null;
        }
        
        List<String> list = new ArrayList<>();
        for (Map.Entry<String,String> entry : map.entrySet()) {
            if(entry.getValue()==null || entry.getValue().trim().length()==0){
                continue;
            }
            list.add(entry.getKey());
        }
        Collections.sort(list);
        
        logger.info("排序后的list:"+list.toString());

StringBuilder sb = new StringBuilder();
        for (String str:list){
            try {
                sb.append(str).append("=").append(URLEncoder.encode(map.get(str).toString(),"UTF-8")).append("&");
            } catch (UnsupportedEncodingException e) {
                logger.error("编码异常",e);             
            }
        }

sb.append("key=");
        sb.append(key);
        
        String ss = sb.toString();
        if (ss == null) {
            return null;        
        }
        String result = DigestUtils.sha1Hex(ss.getBytes());
        logger.info("最终结果:"+result);
        //转为大写
        String upperCase = result.toUpperCase();
        return upperCase;
        
    }
    
    
    
}

//对应实体类

public class SubmitAssetRequest {
     //渠道号
    private String channelCode;

//订单号
    private String orderId;

//姓名
    private String name;

//投资人列表(非必传)
    private String investorList;

//标的类型    1:定向标 2:非定向标
    private String bidType;

//性别   1:表示男性    2:表示女性
    private int sex;

//手机号
    private String mobile;

//身份证号
    private String idCardNumber;

//银行名称
    private String bankName;

//银行卡号
    private String bankCardNo;

//借款用途(非必传)
    private String loanUse;

//收入(非必传)
    private String income;

//住址(非必传)
    private String address;

//户籍地址(非必传)
    private String birthPlace;

//婚姻状况(非必传)     0 未婚 1 已婚
    private int marriageState;

//借款期限   =1 时,表示天;  =2 时,表示期
    private int periods;

//期限类型     1 表示单期 ;  2 表示多期
    private int periodsType;

//借款金额
    private BigDecimal amount;

//借款利率
    private BigDecimal rates;

//签名
    private String sign;

public String getChannelCode() {
        return channelCode;
    }

public void setChannelCode(String channelCode) {
        this.channelCode = channelCode;
    }

public String getOrderId() {
        return orderId;
    }

public void setOrderId(String orderId) {
        this.orderId = orderId;
    }

public String getName() {
        return name;
    }

public void setName(String name) {
        this.name = name;
    }

public String getInvestorList() {
        return investorList;
    }

public void setInvestorList(String investorList) {
        this.investorList = investorList;
    }

public String getBidType() {
        return bidType;
    }

public void setBidType(String bidType) {
        this.bidType = bidType;
    }

public int getSex() {
        return sex;
    }

public void setSex(int sex) {
        this.sex = sex;
    }

public String getMobile() {
        return mobile;
    }

public void setMobile(String mobile) {
        this.mobile = mobile;
    }

public String getIdCardNumber() {
        return idCardNumber;
    }

public void setIdCardNumber(String idCardNumber) {
        this.idCardNumber = idCardNumber;
    }

public String getBankName() {
        return bankName;
    }

public void setBankName(String bankName) {
        this.bankName = bankName;
    }

public String getBankCardNo() {
        return bankCardNo;
    }

public void setBankCardNo(String bankCardNo) {
        this.bankCardNo = bankCardNo;
    }

public String getLoanUse() {
        return loanUse;
    }

public void setLoanUse(String loanUse) {
        this.loanUse = loanUse;
    }

public String getIncome() {
        return income;
    }

public void setIncome(String income) {
        this.income = income;
    }

public String getAddress() {
        return address;
    }

public void setAddress(String address) {
        this.address = address;
    }

public String getBirthPlace() {
        return birthPlace;
    }

public void setBirthPlace(String birthPlace) {
        this.birthPlace = birthPlace;
    }

public int getMarriageState() {
        return marriageState;
    }

public void setMarriageState(int marriageState) {
        this.marriageState = marriageState;
    }

public int getPeriods() {
        return periods;
    }

public void setPeriods(int periods) {
        this.periods = periods;
    }

public int getPeriodsType() {
        return periodsType;
    }

public void setPeriodsType(int periodsType) {
        this.periodsType = periodsType;
    }

public BigDecimal getAmount() {
        return amount;
    }

public void setAmount(BigDecimal amount) {
        this.amount = amount;
    }

public BigDecimal getRates() {
        return rates;
    }

public void setRates(BigDecimal rates) {
        this.rates = rates;
    }

public String getSign() {
        return sign;
    }

public void setSign(String sign) {
        this.sign = sign;
    }

}

API对接中经常会出现的签名获取,这只是某一种,仅供给有需要的人参考的更多相关文章

  1. Web API项目中使用Area对业务进行分类管理

    在之前开发的很多Web API项目中,为了方便以及快速开发,往往把整个Web API的控制器放在基目录的Controllers目录中,但随着业务越来越复杂,这样Controllers目录中的文件就增加 ...

  2. [译] 在Web API 2 中实现带JSON的Patch请求

    原文链接:The Patch Verb in Web API 2 with JSON 我想在.NET4.6 Web API 2 项目中使用Patch更新一个大对象中的某个字断,这才意识到我以前都没有用 ...

  3. [Q&A] 在证书存储区中找不到清单签名证书

    方案1:右击项目属性->签名->为 ClickOnce 清单签名,将勾掉的选项去掉. 方案2:在签名中创建一个新的签名. 方案3:记事本打开相应的 csproj 文件,调整节点值.< ...

  4. [Android Pro] Android API 23中废弃了HttpClient的解决办法

    reference to : http://blog.csdn.net/hbwindy/article/details/51326019 reference to : http://blog.csdn ...

  5. Javacard 解释器怎样在API类库中找到源文件调用的类、方法或者静态域?

    申明:本篇非本人原创,是在阅读各种论文文献之后,对论文文献的一种梳理. 主要参考文献为: ------------------------------------------------------- ...

  6. ASP.NET Web API 2 中的属性路由使用(转载)

    转载地址:ASP.NET Web API 2 中的属性路由使用

  7. Web API 2中的属性路由

    Web API 2中的属性路由 前言 阅读本文之前,您也可以到Asp.Net Web API 2 系列导航进行查看 http://www.cnblogs.com/aehyok/p/3446289.ht ...

  8. 通读cheerio API ——NodeJs中的jquery

    通读cheerio API ——NodeJs中的jquery 所谓工欲善其事,必先利其器,所以通读了cheerio的API,顺便翻译了一遍,有些地方因为知道的比较少,不知道什么意思,保留了英文,希望各 ...

  9. ASP.NET Core Web API 集成测试中使用 Bearer Token

    在 ASP.NET Core Web API 集成测试一文中, 我介绍了ASP.NET Core Web API的集成测试. 在那里我使用了测试专用的Startup类, 里面的配置和开发时有一些区别, ...

随机推荐

  1. lightoj 1033【区间DP/LCS】

    题意: 给你一个长度<=100的字符串. 然后你可以在任何位置插入字符,问最少插入几个构成回文. 思路: 1.长度-LCS: 2.区间DP; 我保证小的区间是一个回文,然后枚举区间,构成大区间, ...

  2. (DP)51NOD 1006 最长公共子序列&1092 回文字符串

    1006 给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的). 比如两个串为:   abcicba abdkscab   ab是两个串的子序列,abc也是,abca也是,其中abc ...

  3. 安装截图软件shutter

    直接进入软件中心安装吧 不知道软件中心安装的软件可以apt upgrade 命令更新么 应该是可以的,感觉软件中心就是个图形化的apt和新立得差不多 shutter可以放大缩小截图, ctrl + 鼠 ...

  4. HDU - 6066 RXD's date

    Bryce1010模板 http://acm.hdu.edu.cn/showproblem.php?pid=6066 #include <iostream> using namespace ...

  5. 520 Detect Capital 检测大写字母

    给定一个单词,你需要判断单词的大写使用是否正确.我们定义,在以下情况时,单词的大写用法是正确的:    全部字母都是大写,比如"USA".    单词中所有字母都不是大写,比如&q ...

  6. Spring------自动化装配Bean(三)

    上一篇是基于java手动装配bean的实现,这一篇将通过xml手动装配bean来实现. xml配置相对于java配置有点: xml配置更加快捷 但不宜扩展 一.打开application.xml 1. ...

  7. ping localhost 返回 ::1的导致不能打开http://localhost的原因及解决

    虽然可以在浏览器中正常访问http://localhost但用file,file_get_contents等函数打开http://localhost异常.用127.0.0.1也可以打开,本地hosts ...

  8. P1979 华容道 spfa题解

    题目描述 [问题描述] 小 B 最近迷上了华容道,可是他总是要花很长的时间才能完成一次.于是,他想到用编程来完成华容道:给定一种局面, 华容道是否根本就无法完成,如果能完成, 最少需要多少时间. 小 ...

  9. 洛谷2017 5月月赛R1

    我只想说面对这种难度的题目就是冲着20%的数据暴力... 分数:40+20+36.1+38+0+19 T1 签到题 III 题目背景 pj组选手zzq近日学会了求最大公约数的辗转相除法. 题目描述 类 ...

  10. ios 微信环境 axios请求 status 0

    做了一个支付页面,调用post请求但是请求status 0,出现这个的原因居然是https的网页请求http的数据. 但是这个再ios里面不会报错,安卓正常. 记录一下客户端的这个特征!