支付系统中的常用工具

  • StringUtils.java

  处理常用字符串:判断是否为空isEmpty(String value);

  按字典排序并拼接参数:createLinkString(Map<String,String> params);

 1 import java.util.ArrayList;
 2 import java.util.Collections;
 3 import java.util.List;
 4 import java.util.Map;
 5
 6 public class StringUtils {
 7     /**
 8      * 判断字符数组是否为空
 9      */
10     public static boolean areNotEmpty(String... values) {
11         boolean result = true;
12         if (values == null || values.length == 0) {
13             result = false;
14         } else {
15             for (String value : values) {
16                 result &= !isEmpty(value);
17             }
18         }
19         return result;
20     }
21
22     /**
23      * 把数组所有元素排序,并按照"name1=value1&name2=value2..."字符拼接成字符串
24      *
25      * @param params
26      *            需要排序并参与字符拼接的参数组
27      * @return 拼接后字符串
28      */
29     public static String createLinkString(Map<String, String> params) {
30
31         List<String> keys = new ArrayList<String>(params.keySet());
32         Collections.sort(keys);
33
34         String prestr = "";
35
36         for (int i = 0; i < keys.size(); i++) {
37             String key = keys.get(i);
38             String value = params.get(key);
39
40             if (i == keys.size() - 1) {
41                 prestr = prestr + key + "=" + value;
42             } else {
43                 prestr = prestr + key + "=" + value + "&";
44             }
45         }
46
47         return prestr;
48     }
49
50     /**
51      * 判断字符串是否为空
52      * <ul>
53      * <li>isEmpty(null) = true</li>
54      * <li>isEmpty("") = true</li>
55      * <li>isEmpty("   ") = true</li>
56      * <li>isEmpty("abc") = false</li>
57      * </ul>
58      *
59      * @param value
60      *            目标字符串
61      * @return true/false
62      */
63     public static boolean isEmpty(String value) {
64         int strLen;
65         if (value == null || (strLen = value.length()) == 0) {
66             return true;
67         }
68         for (int i = 0; i < strLen; i++) {
69             if ((Character.isWhitespace(value.charAt(i)) == false)) {
70                 return false;
71             }
72         }
73         return true;
74     }
75 }
  • 支付系统中的签名和验签SignUtils.java
  1 import java.io.InputStream;
  2 import java.security.KeyStore;
  3 import java.security.PrivateKey;
  4 import java.security.PublicKey;
  5 import java.security.cert.Certificate;
  6 import java.security.cert.CertificateFactory;
  7 import java.util.ArrayList;
  8 import java.util.Collections;
  9 import java.util.Enumeration;
 10 import java.util.HashMap;
 11 import java.util.List;
 12 import java.util.Map;
 13 import org.apache.commons.codec.binary.Base64;
 14
 15 /**
 16  *
 17  */
 18 public class SignUtils {
 19
 20     /**  */
 21     // 缓存公钥和私钥
 22     public static Map<String, Object> certMap = new java.util.concurrent.ConcurrentHashMap<String, Object>();
 23
 24     /**
 25      *
 26      *
 27      * @param sArray
 28      * @return
 29      */
 30     public static Map<String, String> paraFilter(Map<String, String> sArray) {
 31
 32         Map<String, String> result = new HashMap<String, String>();
 33
 34         if (sArray == null || sArray.size() <= 0) {
 35             return result;
 36         }
 37
 38         for (String key : sArray.keySet()) {
 39             String value = sArray.get(key);
 40             if (value == null || StringUtils.isEmpty(value)
 41                     || key.equalsIgnoreCase("sign")) {
 42                 continue;
 43             }
 44             result.put(key, value);
 45         }
 46
 47         return result;
 48     }
 49
 50
 51     /**
 52      *
 53      *
 54      * @param sortedParams
 55      * @return
 56      */
 57     public static String getSignContent(Map<String, String> sortedParams) {
 58         StringBuffer content = new StringBuffer();
 59         List<String> keys = new ArrayList<String>(sortedParams.keySet());
 60         Collections.sort(keys);
 61         int index = 0;
 62         for (int i = 0; i < keys.size(); i++) {
 63             String key = keys.get(i);
 64             String value = sortedParams.get(key);
 65             if (StringUtils.areNotEmpty(key, value)) {
 66                 content.append((index == 0 ? "" : "&") + key + "=" + value);
 67                 index++;
 68             }
 69         }
 70         return content.toString();
 71     }
 72
 73
 74     /**
 75      *
 76      * 签名
 77      * @param params 业务参数
 78      * @param charset 编码
 79      * @param pfxCertFileInputStream 证书输入流
 80      * @param rsaPassword  私钥pkcs12证书密码
 81      * @param algorithmName rsa算法名
 82      * @return
 83      * @throws Exception
 84      */
 85     public static String rsaSign(Map<String, String> params, String charset,
 86             InputStream pfxCertFileInputStream,String rsaPassword, String algorithmName) throws Exception {
 87         String signContent = getSignContent(params);
 88
 89         return rsaSign(signContent, charset, pfxCertFileInputStream,rsaPassword, algorithmName);
 90     }
 91
 92     /**
 93      *
 94      *
 95      * @param content
 96      * @param charset
 97      * @param pfxCertFileInputStream
 98      * @param rsaPassword
 99      * @param algorithmName
100      * @return
101      * @throws Exception
102      */
103     public static String rsaSign(String content, String charset,
104             InputStream pfxCertFileInputStream,String rsaPassword, String algorithmName) throws Exception {
105         try {
106             PrivateKey priKey = getPrivateKeyFromPKCS12(
107                     rsaPassword,
108                     pfxCertFileInputStream);
109
110             java.security.Signature signature = java.security.Signature
111                     .getInstance(algorithmName);
112
113             signature.initSign(priKey);
114
115             if (StringUtils.isEmpty(charset)) {
116                 signature.update(content.getBytes());
117             } else {
118                 signature.update(content.getBytes(charset));
119             }
120
121             byte[] signed = signature.sign();
122
123             String sign = new String(Base64.encodeBase64(signed), charset);
124
125
126             return sign;
127         } catch (Exception e) {
128             throw new Exception("RSAcontent = " + content + "; charset = "
129                     + charset, e);
130         }
131     }
132
133     /**
134      *
135      *
136      * @param publicCertFileInputStream
137      * @param params
138      * @param sign
139      * @param charset
140      * @param algorithmName
141      * @return
142      * @throws Exception
143      */
144     public static boolean rsaCheckContent(
145             InputStream publicCertFileInputStream, Map<String, String> params,
146             String sign, String charset,String algorithmName) throws Exception {
147         String content = StringUtils.createLinkString(SignUtils
148                 .paraFilter(params));
149
150         return rsaCheckContent(publicCertFileInputStream, content, sign,
151                 charset, algorithmName);
152     }
153
154
155     /**
156      *
157      *
158      * @param publicCertFileInputStream
159      * @param content
160      * @param sign
161      * @param charset
162      * @param algorithmName
163      * @return
164      * @throws Exception
165      */
166     public static boolean rsaCheckContent(
167             InputStream publicCertFileInputStream, String content, String sign,
168             String charset, String algorithmName) throws Exception {
169         boolean bFlag = false;
170         try {
171             java.security.Signature signetcheck = java.security.Signature
172                     .getInstance(algorithmName);
173             signetcheck
174                     .initVerify(getPublicKeyFromCert(publicCertFileInputStream));
175             signetcheck.update(content.getBytes(charset));
176             if (signetcheck.verify(Base64.decodeBase64(sign.getBytes(charset)))) {
177                 bFlag = true;
178                 System.out.println("签名成功!");
179             }else{
180                 System.out.println("签名失败!");
181             }
182         } catch (Exception e) {
183             throw new Exception("验证签名异常");
184         }
185
186         return bFlag;
187     }
188
189     /**
190      * 读取公钥,x509格式.
191      *
192      * @param ins
193      * @return
194      * @throws Exception
195      */
196     public static PublicKey getPublicKeyFromCert(InputStream ins)
197             throws Exception {
198         PublicKey pubKey = (PublicKey) certMap.get("PublicKey");
199         if (pubKey != null) {
200             return pubKey;
201         }
202
203         try {
204             CertificateFactory cf = CertificateFactory.getInstance("X.509");
205             Certificate cac = cf.generateCertificate(ins);
206             pubKey = cac.getPublicKey();
207             certMap.put("PublicKey", pubKey);
208         } catch (Exception e) {
209             if (ins != null)
210                 ins.close();
211             throw e;
212         } finally {
213             if (ins != null) {
214                 ins.close();
215             }
216         }
217
218         return pubKey;
219     }
220
221     /**
222      * 读取PKCS12格式的key(私钥)pfx格式.
223      *
224      * @param rsaPassword
225      * @param ins
226      * @return
227      * @throws Exception
228      */
229     public static PrivateKey getPrivateKeyFromPKCS12(String rsaPassword,
230             InputStream ins) throws Exception {
231         PrivateKey priKey = (PrivateKey) certMap.get("PrivateKey");
232         if (priKey != null) {
233             return priKey;
234         }
235
236         KeyStore keystoreCA = KeyStore.getInstance("PKCS12");
237         try {
238             // 读取CA根证书
239             keystoreCA.load(ins, rsaPassword.toCharArray());
240
241             Enumeration<?> aliases = keystoreCA.aliases();
242             String keyAlias = null;
243             if (aliases != null) {
244                 while (aliases.hasMoreElements()) {
245                     keyAlias = (String) aliases.nextElement();
246                     // 获取CA私钥
247                     priKey = (PrivateKey) (keystoreCA.getKey(keyAlias,
248                             rsaPassword.toCharArray()));
249                     if (priKey != null) {
250                         certMap.put("PrivateKey", priKey);
251                         break;
252                     }
253                 }
254             }
255         } catch (Exception e) {
256             if (ins != null)
257                 ins.close();
258             throw e;
259         } finally {
260             if (ins != null) {
261                 ins.close();
262             }
263         }
264
265         return priKey;
266     }
267
268 }
时间: 2024-10-07 05:29:30

支付系统中的常用工具的相关文章

25.mysql中的常用工具

25.mysql中的常用工具25.1 mysql客户端连接工具跳转至mysql安装目录下的bincd C:\Program Files\MySQL\MySQL Server 5.7\binmac下cd /usr/local/Cellar/[email protected]/5.7.22/bincd /usr/local/mysql/bin mysql [选项] [database]; --连接数据库 use [dbname]; --进入要操作的数据库选项表达方式语法: “-”+选项单词的缩写字符

CentOS系统 中yum常用命令使用

1.在centos系统中yum安装软件的简介: yum( Yellow dog Updater, Modified)是一个在Fedora和RedHat以及SUSE中的Shell前端软件包管理器. 基於RPM包管理,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软体包,无须繁琐地一次次下载.安装. yum提供了查找.安装.删除某一个.一组甚至全部软件包的命令,而且命令简洁而又好记. yum [options] [command] [package ...

find查找文件命令 - Linux系统中的常用技巧整理

"find"在Linux系统中是比较常用的文件查找命令,使用方法有很多,可以拥有查找文件.文件目录.文件更新时间.文件大小.文件权限及对比文件时间.下面是整理的"find"常用方法,方便以后需要的时候直接到此文章查看. 一.查找文件或者目录 find ./ -name file #file请改成自己要差的文件 二.查找文件更新时间 find ./ -mtime -3 #文件更新在3天内的 find ./ -mtime +3 #文件更新在3天以上的 三.查找文件大小

【spring】spirng中的常用工具类

一.概述 很多时候,很多工具类其实spring中就已经提供,常用的工具类有: 参考:https://www.cnblogs.com/langtianya/p/3875103.html 内置的resouce类型 UrlResource ClassPathResource FileSystemResource ServletContextResource InputStreamResource ByteArrayResource EncodedResource 也就是Resource加上encodi

支付系统中,账户体系的设计与记账处理

账户体系和会计的设计是整个支付系统的底层基础,是支付系统在基础支付服务的基础上,为个人用户及企业商户提供的对于资金收.付.管的服务.本文所说的账户体系定义所有的操作均以交易的形式发生,但从金融核心系统的发展来看,将由以交易驱动转变为以用户为中心的按照产品进行管理的账户体系. 一. 交易模型 前文说道,本文所说的账户体系定义所有的操作均以交易的形式发生,即账户的变动均基于交易而发生.对于账户的处理,需要依据业务,结合相应的产品体系,建立交易模型. 如下: 产品:如B2C网银.B2B网银.快捷支付.

第10篇 Java中的常用工具类

整理下这一周的最后一些内容.虽然东西不多,但以后也可以常回来看看. 个人感觉还是代码最好表达自己想要记忆的东西,不够的话再把注释加上.乱七八糟的概念百度上大同小异,只有代码是属于你自己的,是唯一的,也是你应该留下的. 包装类 我们所使用的一般数据类型,又称为值类型.这种数据类型存储在栈中,不属于对象的范畴.但Java是一门面向对象的语言,万物皆对象,自然不能把这些值类型排除在外,所以有了包装类. 所谓包装类,就是把我们所用到的值类型变量进行一个包装,使我们能通过对象的方式对其进行操作,让其有自己

windows7系统下一些常用工具的总结

1.查看计算机的基本信息:计算机--右键--属性(快捷键:Win+Pause) 2.查看计算机的详细信息:开始菜单--所有程序--附件--系统工具--系统信息(运行命令:msinfo32) 3.定制计算机任务计划:开始菜单--所有程序--附件--系统工具--任务计划程序(运行命令:taskschd.msc) 详细使用方法:http://jingyan.baidu.com/article/597035521caaed8fc0074093.html 可以通过直接在开始菜单搜索来打开程序,这种方法具有

统计翻译系统中的开源工具们

(根据 计算机世界/2007年/10月/22日/第B15版 文章改编) 开源工具对统计翻译带来的意义不必多说,想必也都能体会出来.Brown等提出IBM模型是在20世纪90年代初,而IBM模型广泛使用和研究的年份竟然是1999年以后!促成这种想象的原因竟是开源工具包的出现!开源工具的出现,降低了研究的准入门槛,使得我们可以正真意义上的站在巨人的肩膀上,来做进一步的探索!感谢那些开源工具们,记住他们,利用他们,让我们的研究更上一层楼! 一.开源工具 1. 首个开源统计机器翻译工具包Egypt (包

Mysql中的常用工具

mysql:客户端连接工具 -u, --user=name ????指定用户名 -p --password????????指定密码 -h –host=hostname 指定服务器IP或者域名 -P –port=????????????指定端口 当然也可以在配置文件中指定用户名和密码,这样就不需要连接加上参数 [client] user=root password=redhat -e, --execute=commands:commands????????执行SQL语句并退出 -E, --vert