`
lxy19791111
  • 浏览: 477081 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
社区版块
存档分类
最新评论

支付通用工具类(适用于支付及查询)

    博客分类:
  • Java
阅读更多

      最近十天时间都在做跟在线支付相关的开发工作,使用的在线支付产品很多,有易宝、快钱、支付宝、财富通等,多吧?其实,开发这些接口不难,只是有些工作量而已。总结了一下,最烦的一块就是各支付的输入输出参数不同,其他原理大体一样。

 

      如果将有些重复又费力的功能抽出来放到一个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
分享到:
评论

相关推荐

    网趣网上购物系统时尚版 V9.0

    网站导航条支持文字式和图片式2类,文字式采用流行的div+css开发设计,界面新颖美观,采用文字式导航条更有利于搜索引擎抓取页面信息,同时程序还支持原有的图片式菜单效果,后台可轻松切换使用,以上2类导航条菜单...

    网趣网上购物系统的部分特点与精华

    财付通是腾讯推出的一款功能强大的在线支付工具,应用户的强烈要求,现已整合。程序目前拥有7种在线支付接口,后台自由切换使用,极其方便! 九、新增商品批量添加功能! 应用户强烈要求,时尚版具有商品批量添加...

    网趣网上购物系统时尚版

    网站导航条支持文字式和图片式2类,文字式采用流行的div+css开发设计,界面新颖美观,采用文字式导航条更有利于搜索引擎抓取页面信息,同时程序还支持原有的图片式菜单效果,后台可轻松切换使用,以上2类导航条菜单...

    网趣网上购物系统时尚版V13.0

    网站导航条支持文字式和图片式2类,文字式采用流行的div+css开发设计,界面新颖美观,采用文字式导航条更有利于搜索引擎抓取页面信息,同时程序还支持原有的图片式菜单效果,后台可轻松切换使用,以上2类导航条菜单...

    新源人力资源管理系统网络版人事管理系统

    04.支付数据表结构的定义:我们的系统本身具有的数据表项目信息,是我们公司根据这几年以来,用户的需要和市场的需求进行设计定义好的,是可以适合于大部分用户的实际需求,当然,除了这一些通用项目之后,用户可以...

    网趣网上购物系统HTML静态版v2012版

    财付通是腾讯推出的一款功能强大的在线支付工具,应用户的强烈要求,现已整合。程序目前拥有7种在线支付接口,后台自由切换使用,极其方便! 十四、订单自动通知功能! 有新订单产生,程序具有自动邮件通知功能,...

    O2O掌上城市(ShopNC本地生活).rar

    一、ShopNC本地生活系统具备跨平台特性,可运行于 Linux/FreeBSD/Unix 及微软 Windows 2000/2003/XP/NT 等各种操作系统环境下。我们已在软件中针对上述操作系统做了大量的测试和实地检验,保证 ShopNC本地生活 系统...

    人力资源管理软件(完全免费)

    绩效考核的指标扩展了一些内容,如信息来源,适用范畴,获取方式,目标单位,计算公式等。(感谢annemy,hrjxhu) 增加了一个数据分析模块(人力资源软件) 人力资源管理软件其他的一些优化(部门结构自动设置顺序码、...

    asp.net知识库

    常用编码工具类,支持base64,md5,des,crc32 也谈谈技术面试 在C#里把ArrayList转换为Array 或 把Array转换为ArrayList C# 2.0 在.NET 2.0中,让你的组件也可以绑定 .NET20 一种简单的窗口控件UI状态控制方法 翻译MSDN...

    并购交易方案的设计.doc

    交易价格 交易价格是上市公司产业并购中买卖双方博弈的最核心环节,包含两方面的因素:一 是标的资产自身的估值水平,二是上市公司支付工具的作价水平。其中标的资产估值水 平不仅决定了上市公司和原股东付出的成本...

    工程硕士学位论文 基于Android+HTML5的移动Web项目高效开发探究

    Android 一种基于Linux的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由Google公司和开放手机联盟领导开发 IOS 由苹果公司开发的移动操作系统 Webkit 一个开源的浏览器引擎,在手机上的...

    2009年全国物流师统考试题

    28.多式联运适用于水路、公路、铁路和航空等运输方式,由于在国际贸易中85%左右的货物是通过海运来完成的,所以该种运输方式在国际多式联运中占主导地位。 29.运输结点主要有汽车站、港口、航空港、管道站、...

    Linux操作系统基础教程

    UNIX 兼容系统,完全适用于个人的 PC。它本身就是一个完整的 32 位的多用户多任务操作 系统,因此不需要先安装 DOS 或其他的操作系统(MS Windows, OS2, MINIX..)就可以进 行直接的安装。 Linux的最早起源是在1991...

Global site tag (gtag.js) - Google Analytics