API对接中经常会出现的签名获取,这只是某一种,仅供给有需要的人参考
要求:
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对接中经常会出现的签名获取,这只是某一种,仅供给有需要的人参考的更多相关文章
- Web API项目中使用Area对业务进行分类管理
在之前开发的很多Web API项目中,为了方便以及快速开发,往往把整个Web API的控制器放在基目录的Controllers目录中,但随着业务越来越复杂,这样Controllers目录中的文件就增加 ...
- [译] 在Web API 2 中实现带JSON的Patch请求
原文链接:The Patch Verb in Web API 2 with JSON 我想在.NET4.6 Web API 2 项目中使用Patch更新一个大对象中的某个字断,这才意识到我以前都没有用 ...
- [Q&A] 在证书存储区中找不到清单签名证书
方案1:右击项目属性->签名->为 ClickOnce 清单签名,将勾掉的选项去掉. 方案2:在签名中创建一个新的签名. 方案3:记事本打开相应的 csproj 文件,调整节点值.< ...
- [Android Pro] Android API 23中废弃了HttpClient的解决办法
reference to : http://blog.csdn.net/hbwindy/article/details/51326019 reference to : http://blog.csdn ...
- Javacard 解释器怎样在API类库中找到源文件调用的类、方法或者静态域?
申明:本篇非本人原创,是在阅读各种论文文献之后,对论文文献的一种梳理. 主要参考文献为: ------------------------------------------------------- ...
- ASP.NET Web API 2 中的属性路由使用(转载)
转载地址:ASP.NET Web API 2 中的属性路由使用
- Web API 2中的属性路由
Web API 2中的属性路由 前言 阅读本文之前,您也可以到Asp.Net Web API 2 系列导航进行查看 http://www.cnblogs.com/aehyok/p/3446289.ht ...
- 通读cheerio API ——NodeJs中的jquery
通读cheerio API ——NodeJs中的jquery 所谓工欲善其事,必先利其器,所以通读了cheerio的API,顺便翻译了一遍,有些地方因为知道的比较少,不知道什么意思,保留了英文,希望各 ...
- ASP.NET Core Web API 集成测试中使用 Bearer Token
在 ASP.NET Core Web API 集成测试一文中, 我介绍了ASP.NET Core Web API的集成测试. 在那里我使用了测试专用的Startup类, 里面的配置和开发时有一些区别, ...
随机推荐
- bzoj 3872: [Poi2014]Ant colony【树形dp+二分】
啊我把分子分母混了WA了好几次-- 就是从食蚁兽在的边段成两棵树,然后dp下去可取的蚂蚁数量区间,也就是每次转移是l[e[i].to]=l[u](d[u]-1),r[e[i].to]=(r[u]+1) ...
- 面试那点小事,你从未见过的spring boot面试集锦(附详细答案)
一, 什么是spring boot? 多年来,随着新功能的增加,spring变得越来越复杂.只需访问页面https://spring.io/projects,我们将看到所有在应用程序中使用的不同功能的 ...
- 二分优化的lis
/*此题为一个女大佬教我的,%%%%%%%%%%%%*/ 题目描述 给出1-n的两个排列P1和P2,求它们的最长公共子序列. 输入输出格式 输入格式: 第一行是一个数n, 接下来两行,每行为n个数,为 ...
- 从输入url到浏览器显示页面的过程
总体来说有两个大的方面: 一.网络通信连接部分.二.页面渲染展示部分. 细分详细过程: (网络通信) 1.输入url. 2.DNS解析域名. 3.拿到IP地址后,浏览器向服务器建立tcp连接. 4.浏 ...
- _bzoj1029 [JSOI2007]建筑抢修【贪心 堆】
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1029 经典的贪心问题,不解释. #include <cstdio> #inclu ...
- D Tree HDU - 4812
https://vjudge.net/problem/HDU-4812 点分就没一道不卡常的? 卡常记录: 1.求逆元忘开longlong 2.把solve中分离各个子树的方法,由“一开始全部加入,处 ...
- 【转】log4j的日志
一.Log4j配置 第一步:加入log4j-1.2.8.jar到lib下. 第二步:在CLASSPATH下建立log4j.properties.内容如下: 放在src下的话就不用配置 否则得去web. ...
- C#方法拓展
作用: “扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型.” 要求: 1.拓展方法必须是在一个非嵌套.非泛型的静态类中定义.2.他至少有一个参数.3. ...
- Aappcloud 调到二级页面黑屏
PartnerHead3.html 后面多了一个点
- input标签属性
很多时候,我们都用到了很多标签实现输入功能,所以在这里梳理一下. 1.建立一个文本框 <input type="text" name="userName" ...