支付系统中的常用工具

本贴最后更新于 2823 天前,其中的信息可能已经时异事殊
  • StringUtils.java

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

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

import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Map; public class StringUtils { /** * 判断字符数组是否为空 */ public static boolean areNotEmpty(String... values) { boolean result = true; if (values == null || values.length == 0) { result = false; } else { for (String value : values) { result &= !isEmpty(value); } } return result; } /** * 把数组所有元素排序,并按照"name1=value1&name2=value2..."字符拼接成字符串 * * @param params * 需要排序并参与字符拼接的参数组 * @return 拼接后字符串 */ public static String createLinkString(Map<String, String> params) { List<String> keys = new ArrayList<String>(params.keySet()); Collections.sort(keys); String prestr = ""; for (int i = 0; i < keys.size(); i++) { String key = keys.get(i); String value = params.get(key); if (i == keys.size() - 1) { prestr = prestr + key + "=" + value; } else { prestr = prestr + key + "=" + value + "&"; } } return prestr; } /** * 判断字符串是否为空 * <ul> * <li>isEmpty(null) = true</li> * <li>isEmpty("") = true</li> * <li>isEmpty(" ") = true</li> * <li>isEmpty("abc") = false</li> * </ul> * * @param value * 目标字符串 * @return true/false */ public static boolean isEmpty(String value) { int strLen; if (value == null || (strLen = value.length()) == 0) { return true; } for (int i = 0; i < strLen; i++) { if ((Character.isWhitespace(value.charAt(i)) == false)) { return false; } } return true; } }
  • 支付系统中的签名和验签 SignUtils.java
    import java.io.InputStream;
    import java.security.KeyStore;
    import java.security.PrivateKey;
    import java.security.PublicKey;
    import java.security.cert.Certificate;
    import java.security.cert.CertificateFactory;
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.Enumeration;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    import org.apache.commons.codec.binary.Base64;

    /**

    */
    public class SignUtils {

    /** */ // 缓存公钥和私钥 public static Map<String, Object> certMap = new java.util.concurrent.ConcurrentHashMap<String, Object>(); /** * * * @param sArray * @return */ public static Map<String, String> paraFilter(Map<String, String> sArray) { Map<String, String> result = new HashMap<String, String>(); if (sArray == null || sArray.size() <= 0) { return result; } for (String key : sArray.keySet()) { String value = sArray.get(key); if (value == null || StringUtils.isEmpty(value) || key.equalsIgnoreCase("sign")) { continue; } result.put(key, value); } return result; } /** * * * @param sortedParams * @return */ public static String getSignContent(Map<String, String> sortedParams) { StringBuffer content = new StringBuffer(); List<String> keys = new ArrayList<String>(sortedParams.keySet()); Collections.sort(keys); int index = 0; for (int i = 0; i < keys.size(); i++) { String key = keys.get(i); String value = sortedParams.get(key); if (StringUtils.areNotEmpty(key, value)) { content.append((index == 0 ? "" : "&") + key + "=" + value); index++; } } return content.toString(); } /** * * 签名 * @param params 业务参数 * @param charset 编码 * @param pfxCertFileInputStream 证书输入流 * @param rsaPassword 私钥pkcs12证书密码 * @param algorithmName rsa算法名 * @return * @throws Exception */ public static String rsaSign(Map<String, String> params, String charset, InputStream pfxCertFileInputStream,String rsaPassword, String algorithmName) throws Exception { String signContent = getSignContent(params); return rsaSign(signContent, charset, pfxCertFileInputStream,rsaPassword, algorithmName); } /** * * * @param content * @param charset * @param pfxCertFileInputStream * @param rsaPassword * @param algorithmName * @return * @throws Exception */ public static String rsaSign(String content, String charset, InputStream pfxCertFileInputStream,String rsaPassword, String algorithmName) throws Exception { try { PrivateKey priKey = getPrivateKeyFromPKCS12( rsaPassword, pfxCertFileInputStream); java.security.Signature signature = java.security.Signature .getInstance(algorithmName); signature.initSign(priKey); if (StringUtils.isEmpty(charset)) { signature.update(content.getBytes()); } else { signature.update(content.getBytes(charset)); } byte[] signed = signature.sign(); String sign = new String(Base64.encodeBase64(signed), charset); return sign; } catch (Exception e) { throw new Exception("RSAcontent = " + content + "; charset = " + charset, e); } } /** * * * @param publicCertFileInputStream * @param params * @param sign * @param charset * @param algorithmName * @return * @throws Exception */ public static boolean rsaCheckContent( InputStream publicCertFileInputStream, Map<String, String> params, String sign, String charset,String algorithmName) throws Exception { String content = StringUtils.createLinkString(SignUtils .paraFilter(params)); return rsaCheckContent(publicCertFileInputStream, content, sign, charset, algorithmName); } /** * * * @param publicCertFileInputStream * @param content * @param sign * @param charset * @param algorithmName * @return * @throws Exception */ public static boolean rsaCheckContent( InputStream publicCertFileInputStream, String content, String sign, String charset, String algorithmName) throws Exception { boolean bFlag = false; try { java.security.Signature signetcheck = java.security.Signature .getInstance(algorithmName); signetcheck .initVerify(getPublicKeyFromCert(publicCertFileInputStream)); signetcheck.update(content.getBytes(charset)); if (signetcheck.verify(Base64.decodeBase64(sign.getBytes(charset)))) { bFlag = true; System.out.println("签名成功!"); }else{ System.out.println("签名失败!"); } } catch (Exception e) { throw new Exception("验证签名异常"); } return bFlag; } /** * 读取公钥,x509格式. * * @param ins * @return * @throws Exception */ public static PublicKey getPublicKeyFromCert(InputStream ins) throws Exception { PublicKey pubKey = (PublicKey) certMap.get("PublicKey"); if (pubKey != null) { return pubKey; } try { CertificateFactory cf = CertificateFactory.getInstance("X.509"); Certificate cac = cf.generateCertificate(ins); pubKey = cac.getPublicKey(); certMap.put("PublicKey", pubKey); } catch (Exception e) { if (ins != null) ins.close(); throw e; } finally { if (ins != null) { ins.close(); } } return pubKey; } /** * 读取PKCS12格式的key(私钥)pfx格式. * * @param rsaPassword * @param ins * @return * @throws Exception */ public static PrivateKey getPrivateKeyFromPKCS12(String rsaPassword, InputStream ins) throws Exception { PrivateKey priKey = (PrivateKey) certMap.get("PrivateKey"); if (priKey != null) { return priKey; } KeyStore keystoreCA = KeyStore.getInstance("PKCS12"); try { // 读取CA根证书 keystoreCA.load(ins, rsaPassword.toCharArray()); Enumeration<?> aliases = keystoreCA.aliases(); String keyAlias = null; if (aliases != null) { while (aliases.hasMoreElements()) { keyAlias = (String) aliases.nextElement(); // 获取CA私钥 priKey = (PrivateKey) (keystoreCA.getKey(keyAlias, rsaPassword.toCharArray())); if (priKey != null) { certMap.put("PrivateKey", priKey); break; } } } } catch (Exception e) { if (ins != null) ins.close(); throw e; } finally { if (ins != null) { ins.close(); } } return priKey; }

    }

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • 代码片段

    代码片段分为 CSS 与 JS 两种代码,添加在 [设置 - 外观 - 代码片段] 中,这些代码会在思源笔记加载时自动执行,用于改善笔记的样式或功能。

    用户在该标签下分享代码片段时需在帖子标题前添加 [css] [js] 用于区分代码片段类型。

    131 引用 • 869 回帖
  • Quicker

    Quicker 您的指尖工具箱!操作更少,收获更多!

    36 引用 • 155 回帖 • 1 关注
  • Scala

    Scala 是一门多范式的编程语言,集成面向对象编程和函数式编程的各种特性。

    13 引用 • 11 回帖 • 159 关注
  • 学习

    “梦想从学习开始,事业从实践起步” —— 习近平

    172 引用 • 515 回帖
  • HBase

    HBase 是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的 Google 论文 “Bigtable:一个结构化数据的分布式存储系统”。就像 Bigtable 利用了 Google 文件系统所提供的分布式数据存储一样,HBase 在 Hadoop 之上提供了类似于 Bigtable 的能力。

    17 引用 • 6 回帖 • 65 关注
  • IBM

    IBM(国际商业机器公司)或万国商业机器公司,简称 IBM(International Business Machines Corporation),总公司在纽约州阿蒙克市。1911 年托马斯·沃森创立于美国,是全球最大的信息技术和业务解决方案公司,拥有全球雇员 30 多万人,业务遍及 160 多个国家和地区。

    17 引用 • 53 回帖 • 147 关注
  • Google

    Google(Google Inc.,NASDAQ:GOOG)是一家美国上市公司(公有股份公司),于 1998 年 9 月 7 日以私有股份公司的形式创立,设计并管理一个互联网搜索引擎。Google 公司的总部称作“Googleplex”,它位于加利福尼亚山景城。Google 目前被公认为是全球规模最大的搜索引擎,它提供了简单易用的免费服务。不作恶(Don't be evil)是谷歌公司的一项非正式的公司口号。

    49 引用 • 192 回帖
  • 架构

    我们平时所说的“架构”主要是指软件架构,这是有关软件整体结构与组件的抽象描述,用于指导软件系统各个方面的设计。另外还有“业务架构”、“网络架构”、“硬件架构”等细分领域。

    143 引用 • 442 回帖
  • TextBundle

    TextBundle 文件格式旨在应用程序之间交换 Markdown 或 Fountain 之类的纯文本文件时,提供更无缝的用户体验。

    1 引用 • 2 回帖 • 73 关注
  • OneNote
    1 引用 • 3 回帖
  • Node.js

    Node.js 是一个基于 Chrome JavaScript 运行时建立的平台, 用于方便地搭建响应速度快、易于扩展的网络应用。Node.js 使用事件驱动, 非阻塞 I/O 模型而得以轻量和高效。

    139 引用 • 269 回帖
  • flomo

    flomo 是新一代 「卡片笔记」 ,专注在碎片化时代,促进你的记录,帮你积累更多知识资产。

    6 引用 • 140 回帖
  • WiFiDog

    WiFiDog 是一套开源的无线热点认证管理工具,主要功能包括:位置相关的内容递送;用户认证和授权;集中式网络监控。

    1 引用 • 7 回帖 • 604 关注
  • BookxNote

    BookxNote 是一款全新的电子书学习工具,助力您的学习与思考,让您的大脑更高效的记忆。

    笔记整理交给我,一心只读圣贤书。

    1 引用 • 1 回帖
  • Love2D

    Love2D 是一个开源的, 跨平台的 2D 游戏引擎。使用纯 Lua 脚本来进行游戏开发。目前支持的平台有 Windows, Mac OS X, Linux, Android 和 iOS。

    14 引用 • 53 回帖 • 544 关注
  • Linux

    Linux 是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 POSIX 和 Unix 的多用户、多任务、支持多线程和多 CPU 的操作系统。它能运行主要的 Unix 工具软件、应用程序和网络协议,并支持 32 位和 64 位硬件。Linux 继承了 Unix 以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。

    950 引用 • 943 回帖
  • 互联网

    互联网(Internet),又称网际网络,或音译因特网、英特网。互联网始于 1969 年美国的阿帕网,是网络与网络之间所串连成的庞大网络,这些网络以一组通用的协议相连,形成逻辑上的单一巨大国际网络。

    99 引用 • 367 回帖
  • Jenkins

    Jenkins 是一套开源的持续集成工具。它提供了非常丰富的插件,让构建、部署、自动化集成项目变得简单易用。

    54 引用 • 37 回帖 • 2 关注
  • 正则表达式

    正则表达式(Regular Expression)使用单个字符串来描述、匹配一系列遵循某个句法规则的字符串。

    31 引用 • 94 回帖
  • 创业

    你比 99% 的人都优秀么?

    82 引用 • 1395 回帖 • 2 关注
  • Eclipse

    Eclipse 是一个开放源代码的、基于 Java 的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。

    76 引用 • 258 回帖 • 633 关注
  • Unity

    Unity 是由 Unity Technologies 开发的一个让开发者可以轻松创建诸如 2D、3D 多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

    25 引用 • 7 回帖 • 133 关注
  • 以太坊

    以太坊(Ethereum)并不是一个机构,而是一款能够在区块链上实现智能合约、开源的底层系统。以太坊是一个平台和一种编程语言 Solidity,使开发人员能够建立和发布下一代去中心化应用。 以太坊可以用来编程、分散、担保和交易任何事物:投票、域名、金融交易所、众筹、公司管理、合同和知识产权等等。

    34 引用 • 367 回帖
  • 安全

    安全永远都不是一个小问题。

    203 引用 • 818 回帖
  • 小薇

    小薇是一个用 Java 写的 QQ 聊天机器人 Web 服务,可以用于社群互动。

    由于 Smart QQ 从 2019 年 1 月 1 日起停止服务,所以该项目也已经停止维护了!

    34 引用 • 467 回帖 • 760 关注
  • uTools

    uTools 是一个极简、插件化、跨平台的现代桌面软件。通过自由选配丰富的插件,打造你得心应手的工具集合。

    7 引用 • 27 回帖 • 1 关注
  • HHKB

    HHKB 是富士通的 Happy Hacking 系列电容键盘。电容键盘即无接点静电电容式键盘(Capacitive Keyboard)。

    5 引用 • 74 回帖 • 495 关注