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

本文介绍了一个支付工具类PayUtils的设计与实现,该工具类用于简化支付接口的开发工作,包括参数处理、签名验证等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 

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

 

特点: 1.同时提供银行卡在线支付、声讯电话支付、互联星空支付、手机短信注册、腾讯财付通、 腾讯Q币、神州行充值卡、盛大游戏点卡、支付宝、手机银行、北京宽带支付支付途径。 2.银行卡在线支付支持国内60 余种银行卡(信用卡、储蓄卡、借记卡等)在线支付。 3.全国声讯电话支付支持全国所有省份固定电话、小灵通、中国移动、中国联通手机, 开通移动、联通、电信、网通多个声讯热线号码。 4.中国电信互联星空支付支持直接用163或ADSL上网帐号、各省互联星空网站注册用户支付。 5.支持中国移动、中国联通手机用户发送短信点播赠送服务。 6.开放腾讯公司Q币和财付通支付接口。 7.支持50元、100元、300元、500元等多种面值的神州行充值卡支付。 8.各支付途径可任意选择开启或关闭。 9.真正傻瓜式支付接口,提供示例程序,只需简单设置即可使用。 10.设置商户密钥,支付信息加密传递,加强支付安全性,加密系统与其他支付平台兼容。 11.贺喜支付平台(http://www.168reg.cn)提供完善的后台管理系统,提供定单管理、定单 统计、财务管理、用户资料修改、商户密钥设置、推荐用户及技术支持等功能。 12.提交支付信息时可设置服务名称、商户订单号和两个自定义字段,支付成功后实时将支 付结果返回商户网站。 13.提供接口的测试模式,方便商户快捷地开发支付接口程序。 14.您可以登录后台管理系统查看定单以下信息:定单号、用户支付金额、商户所得金额、 自定义订单号、支付日期、结帐信息等。 15.提供宣传推广代码,推荐其他商户加盟可获得其收入的一定比例分成。 16.开放收费制商户,为商户降低支付成本。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值