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

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

 

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值