- 浏览: 477081 次
- 性别:
- 来自: 珠海
文章分类
最新评论
-
zs769666156:
楼主能不能给个ER图,通过ER图来分析一下这个段代码?想好好学 ...
基于SQL 语法解释器JSqlParser实现的SQL解析工具 -
lucky1035:
我只是想长肉 写道源代码下载过来缺少三个包,jsqlparse ...
基于SQL 语法解释器JSqlParser实现的SQL解析工具 -
我只是想长肉:
源代码下载过来缺少三个包,jsqlparser 14 这个哪里 ...
基于SQL 语法解释器JSqlParser实现的SQL解析工具 -
wamdy:
多谢博主,找了许久,我看能不能做成eclipse下sql语句的 ...
基于SQL 语法解释器JSqlParser实现的SQL解析工具 -
zzl1787:
怎么下不下来啊
PDF套打模板制作(一)
最近十天时间都在做跟在线支付相关的开发工作,使用的在线支付产品很多,有易宝、快钱、支付宝、财富通等,多吧?其实,开发这些接口不难,只是有些工作量而已。总结了一下,最烦的一块就是各支付的输入输出参数不同,其他原理大体一样。
如果将有些重复又费力的功能抽出来放到一个PayUtils中,拿出来show一下哈。也许对正在做支付集成这块的朋友有所帮助呢。
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.math.BigDecimal; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; /** * 支付通用工具类(适用于支付及查询) * @author lixiangyang * */ public class PayUtils { private static Log log = LogFactory.getLog(PayUtils.class); /** * 分换算为元 */ public static final BigDecimal rate = new BigDecimal(100); /** * 验证签名字符串<br/> * <li>true 表示验证成功</li> * <li>false 表示验证失败</li> * @param genSignMsg * 商户生成的验证字符串 * @param signMsg * 在线支付平台传入的验证字符串 * @return */ public static boolean validateSingMsg(String genSignMsg, String signMsg){ if(StringUtils.isEmpty(genSignMsg) || StringUtils.isEmpty(signMsg)){ return false; }else{ if(genSignMsg.equals(signMsg)){ return true; } return false; } } /** * 获得POST 过来参数设置到新的params中 * @param requestParams * POST 过来参数Map * @return * 新的Map */ public static Map<String, String> genMapByRequestParas(Map requestParams){ Map<String, String> params = new HashMap<String, String>(); for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext();) { String name = (String) iter.next(); String[] values = (String[]) requestParams.get(name); String valueStr = ""; for (int i = 0; i < values.length; i++) { valueStr = (i == values.length - 1) ? valueStr + values[i] : valueStr + values[i] + ","; } params.put(name, valueStr); } return params; } /** * 连接字符串(增强) * @param resurnStr * 结果字符串 * @param invokeObj * 需要取值的对象 * @param fields * 需要取值的对象上的字段 * @param appendEmptyValue * 是否追加为空的内容 true - 需要增加 false - 不需要增加 */ public static void appendPara(StringBuffer resurnStr, Object invokeObj, String[] fields, boolean appendEmptyValue){ Class invokeClass = invokeObj.getClass(); for(String field : fields){ try { Method method = invokeClass.getMethod(new StringBuffer("get").append(field.substring(0, 1).toUpperCase()).append(field.substring(1)).toString(), new Class[0]); Object paraValue = method.invoke(invokeObj, new Object[0]); if(paraValue != null && !String.valueOf(paraValue).equals("")){ appendParam(resurnStr, field, String.valueOf(paraValue), false); }else{ if(appendEmptyValue){//追加为空的内容 appendParam(resurnStr, field, "", true); } } } catch (SecurityException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } } } /** * 连接字符参数 * @param returnStr * 结果字符串 * @param paramId * 参数名 * @param paramValue * 参数值 * @param appendEmptyValue * 是否追加为空的内容 true - 需要增加 false - 不需要增加 */ public static void appendParam(StringBuffer returnStr,String paramId,String paramValue, boolean appendEmptyValue){ if(returnStr.length() > 0){ log.debug(paramId+" = "+paramValue); if(StringUtils.isNotEmpty(paramValue)){ returnStr.append("&").append(paramId).append("=").append(paramValue); }else{ if(appendEmptyValue){//追加为空的内容 returnStr.append("&").append(paramId).append("=").append(""); } } }else{ returnStr.append(paramId).append("=").append(paramValue); } } /** * 将Bean中的各属性及值转换到Map中 * @param invokeObj * 需要取值的对象 * @param fields * 需要取值的对象上的字段 * @return * 参数Map */ public static Map<String, String> beanToMap(Object invokeObj, String[] fields){ Map<String, String> paramsMap = new HashMap<String, String>(); Class invokeClass = invokeObj.getClass(); for(String field : fields){ try { Method method = invokeClass.getMethod(new StringBuffer("get").append(field.substring(0, 1).toUpperCase()).append(field.substring(1)).toString(), new Class[0]); Object paraValue = method.invoke(invokeObj, new Object[0]); if(paraValue != null && !String.valueOf(paraValue).equals("")){ paramsMap.put(field, paraValue.toString()); } } catch (SecurityException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } } return paramsMap; } /** * 将Map中的各key及其value转换到Bean的属性及值中 * @param mapParams * 待转换的Map * @param invokeObj * 需要设值的对象 * @param fields * 需要设值的对象上的字段 */ public static Object mapToBean(Map<String, String> mapParams, Object invokeObj, String[] fields){ Class invokeClass = invokeObj.getClass(); for(String field : fields){ try { String paraValue = mapParams.get(field); if(paraValue != null && !paraValue.equals("")){ String methodName = new StringBuffer("set").append(field.substring(0, 1).toUpperCase()).append(field.substring(1)).toString(); //目前都为字符串类型 String.class Method method = invokeClass.getMethod(methodName, new Class[]{String.class}); method.invoke(invokeObj, new String[]{paraValue}); } } catch (SecurityException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } } return invokeObj; } /** * 将订单金额由分转化元 * @param amount * 以分为单位的订单金额 * @return * 以元为单位的金额 */ public static String genAmount(String amount){ //交易总金额(单位:分) BigDecimal orderAmount = new BigDecimal(amount).divide(rate, 2, BigDecimal.ROUND_HALF_UP); //分转为元 return String.valueOf(orderAmount); } /** * 格式化字符串 * @param text * 待处理字符串 * @return * 处里后的字符串 */ public static String formatString(String text){ if(text == null || "null".equalsIgnoreCase(text)) { return ""; } return text; } /** * 获取当前时间(yyyy-MM-dd HH:mm:ss) * * @return String */ public static String getCurrentDate() { return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()); } /** * 将日期字符串转换为日期类型 * @param dateString * 日期字符串 * @param parrten * 模式字符(如:yyyy-MM-dd) * @return * 日期 */ public static Date stringToDate(String dateString, String parrten){ Date date = null; try { SimpleDateFormat formatter = new SimpleDateFormat(parrten); date = formatter.parse(dateString); } catch (Exception e) { e.printStackTrace(); } return date; } }
- PayUtils.rar (2.3 KB)
- 描述: PayUtils源代码
- 下载次数: 38
发表评论
-
访问FreeMarker的工具类
2009-12-13 20:39 7870import java.io.File; import ja ... -
java操作json的通用类
2009-10-25 16:21 2459import java.text.ParseException ... -
利用Axis Ant Task生成Web Service客户端代码(build.xml)
2009-03-03 12:08 3546利用Axis Ant Task生成Web Serv ... -
将request中的数据转换到Map中
2009-03-02 12:01 2490以下代码段是将请求request中的数据转换到Ma ... -
基于HttpClient的HttpUtils(后台访问URL)
2009-03-02 11:53 36818最近做在线支付时遇到需要以后台方式访问URL并获取 ... -
jmap + Eclipse MAT :排查内存泄漏的好工具
2008-12-13 11:06 8220当服务器应用占用了过多内存的时候,如何快速定位 ... -
JSON的序列化和反序列化
2008-08-01 16:02 8255JsonTools是一个不错的JSON序列化和反序列化 ... -
Frontend plus 2.03
2007-11-06 21:43 6211class反编译工具,已经破解。 -
Java面试题
2007-09-16 13:35 1522有两个数组,而且都已排序好,现要求将它们合并到一个新的数组c中 ... -
《Design By Contract原则与实践》精彩片断选读
2007-08-30 16:15 2064《Design By Contract原则与实践》精彩片断选 ... -
Array和Vector,HashMap的区别 [转]
2007-08-30 16:06 2355[转]自 http://blog.hunan2 ... -
Jocky--Java混淆编译器
2007-08-15 13:50 6579以下内容摘自Jocky文档 ... -
轻量级JNDI数据源创建
2007-07-30 17:06 2318程序中手工创建JNDI数据源的代码如下: java ... -
校验码图片生成
2007-07-16 17:18 2260在B/S结构项目中,为防止别心用心的用户尝试登录通常 ... -
JFreeChart API(中文)[转载]
2007-07-16 09:14 4359[转载自: http ... -
Dozer自动给对象赋值,比BeanUtils好用多了
2007-07-03 10:04 15079在日常的项目中,经常会遇到各层对象之间相互进行值传递的 ... -
Java访问LDAP示例
2007-07-02 11:16 2822在最近一个项目中需要访问LDAP(Domino 6.5),示例 ... -
判断一个IP地址是否为内网IP
2007-07-02 10:59 11529java 代码 public static bo ...
相关推荐
网站导航条支持文字式和图片式2类,文字式采用流行的div+css开发设计,界面新颖美观,采用文字式导航条更有利于搜索引擎抓取页面信息,同时程序还支持原有的图片式菜单效果,后台可轻松切换使用,以上2类导航条菜单...
财付通是腾讯推出的一款功能强大的在线支付工具,应用户的强烈要求,现已整合。程序目前拥有7种在线支付接口,后台自由切换使用,极其方便! 九、新增商品批量添加功能! 应用户强烈要求,时尚版具有商品批量添加...
网站导航条支持文字式和图片式2类,文字式采用流行的div+css开发设计,界面新颖美观,采用文字式导航条更有利于搜索引擎抓取页面信息,同时程序还支持原有的图片式菜单效果,后台可轻松切换使用,以上2类导航条菜单...
网站导航条支持文字式和图片式2类,文字式采用流行的div+css开发设计,界面新颖美观,采用文字式导航条更有利于搜索引擎抓取页面信息,同时程序还支持原有的图片式菜单效果,后台可轻松切换使用,以上2类导航条菜单...
04.支付数据表结构的定义:我们的系统本身具有的数据表项目信息,是我们公司根据这几年以来,用户的需要和市场的需求进行设计定义好的,是可以适合于大部分用户的实际需求,当然,除了这一些通用项目之后,用户可以...
财付通是腾讯推出的一款功能强大的在线支付工具,应用户的强烈要求,现已整合。程序目前拥有7种在线支付接口,后台自由切换使用,极其方便! 十四、订单自动通知功能! 有新订单产生,程序具有自动邮件通知功能,...
一、ShopNC本地生活系统具备跨平台特性,可运行于 Linux/FreeBSD/Unix 及微软 Windows 2000/2003/XP/NT 等各种操作系统环境下。我们已在软件中针对上述操作系统做了大量的测试和实地检验,保证 ShopNC本地生活 系统...
绩效考核的指标扩展了一些内容,如信息来源,适用范畴,获取方式,目标单位,计算公式等。(感谢annemy,hrjxhu) 增加了一个数据分析模块(人力资源软件) 人力资源管理软件其他的一些优化(部门结构自动设置顺序码、...
常用编码工具类,支持base64,md5,des,crc32 也谈谈技术面试 在C#里把ArrayList转换为Array 或 把Array转换为ArrayList C# 2.0 在.NET 2.0中,让你的组件也可以绑定 .NET20 一种简单的窗口控件UI状态控制方法 翻译MSDN...
交易价格 交易价格是上市公司产业并购中买卖双方博弈的最核心环节,包含两方面的因素:一 是标的资产自身的估值水平,二是上市公司支付工具的作价水平。其中标的资产估值水 平不仅决定了上市公司和原股东付出的成本...
Android 一种基于Linux的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由Google公司和开放手机联盟领导开发 IOS 由苹果公司开发的移动操作系统 Webkit 一个开源的浏览器引擎,在手机上的...
28.多式联运适用于水路、公路、铁路和航空等运输方式,由于在国际贸易中85%左右的货物是通过海运来完成的,所以该种运输方式在国际多式联运中占主导地位。 29.运输结点主要有汽车站、港口、航空港、管道站、...
UNIX 兼容系统,完全适用于个人的 PC。它本身就是一个完整的 32 位的多用户多任务操作 系统,因此不需要先安装 DOS 或其他的操作系统(MS Windows, OS2, MINIX..)就可以进 行直接的安装。 Linux的最早起源是在1991...