`
lxy19791111
  • 浏览: 481605 次
  • 性别: 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
分享到:
评论

相关推荐

    基于C# MVC开发的WEB API通用框架 附带 微信 支付宝支付集成.rar

    提供的通用框架意味着这是一个经过预设计和优化的基础结构,适用于多种类似项目。它可能包含了基础的认证、授权、日志记录、异常处理等功能,可以帮助开发者快速搭建Web服务,并减少重复的工作。 6. **项目结构**...

    基于C# MVC开发的WEB API通用框架 附带 微信 支付宝支付集成2019

    《基于C# MVC开发的WEB API通用框架及微信支付宝支付集成》 在现代Web开发中,C# MVC(Model-View-Controller)架构已经成为构建高效、可维护的Web应用程序的首选方式。C# MVC框架结合了.NET Framework的强大功能,...

    基于C# MVC开发的WEB API通用框架 附带 微信 支付宝支付集成.rar.rar

    微信支付是腾讯公司提供的在线支付服务,适用于各种类型的企业和开发者。集成微信支付到C# MVC应用中,通常包括以下步骤: 1. 注册微信商户平台账号,获取AppID和商户号。 2. 使用微信支付SDK,实现统一下单接口,...

    网关支付的源码

    - Java Version SDK (通用版):适用于Java平台,提供了一套完整的API,包括支付接口调用、签名验证、结果回调处理等,适用于各种Java应用环境,如Spring Boot、Java EE等。 这些SDK的使用,大大降低了开发难度,让...

    支付项目相关框架

    6. **第三方支付整合6**:这类框架可能专注于与第三方支付平台的无缝对接,如PayPal、Stripe等,提供统一的API调用方式,使得对接多个支付渠道变得简单。 7. **多语言支付框架7**:适应全球化需求,支持多种语言的...

    手机网页支付接口技术Demo

    1. **Java Version SDK (通用版)**:Java是一种广泛用于服务器端开发的语言,其SDK(软件开发工具包)为开发者提供了处理支付接口所需的类库和示例代码。这可能包括了创建支付请求、处理支付回调、验证支付结果等...

    银联网关支付产品技术开发包1.1.7

    它可能包含处理请求和响应的类,如创建支付订单、查询交易状态、处理回调通知等功能。 2. **PHP Version SDK**:PHP是一种广泛应用于Web开发的语言,PHP SDK则方便了PHP开发者在网站后台处理支付逻辑。同样,它会...

    千应支付接口demo

    3. **C#**: C#的DEMO通常适用于.NET开发者,他们需要使用HttpClient类来发起网络请求,同时处理JSON数据的序列化与反序列化,例如使用Newtonsoft.Json库。在企业级应用中,可能还会涉及到WCF服务或者ASP.NET Web API...

    企业网银支付产品技术开发包V1.1.6

    企业网银支付产品技术开发包V1.1.6是一个专为银联支付接口调试与开发设计的工具集,主要用于帮助企业在其业务系统中集成网银支付功能。这个开发包的版本号为V1.1.6,意味着它是经过多次迭代优化后的成熟版本,能够...

    微信退款代码

    3. **PayCommonUtil.java**: 可能是一个通用的支付工具类,封装了与微信支付相关的通用功能,如签名生成、参数加密解密、请求和响应的格式转换等。在退款过程中,正确生成和验证签名至关重要,以防止数据被篡改。 4...

    5590其他流动负债通用表格.zip

    标签 "资料" 表明这个文件是一个财务资料,可能适用于会计人员、财务分析师、企业管理人员等,帮助他们更好地理解和管理企业的财务状况。通过使用这样的通用表格,可以标准化财务数据的记录,提高数据的可比性和一致...

    欧洲清算系统介绍.doc

    《欧元体系在支付体系监督中的职责》(2000 年 6 月)对其支付系统的监督政策进行了分类:针对那些性能及运行可能影响到货币政策、系统稳定、其它市场参与者的支付系统,ECB 管理委员会负责制定通用的监督方针;...

    通用商城后台模板

    首先,我们要明确的是,“通用”意味着该模板具有广泛的适用性,无论商城的规模大小,无论是B2C、B2B还是C2C模式,都可以灵活运用。它提供了基础的订单管理、商品管理、用户管理、支付接口集成等功能模块,可以满足...

    电子商务购物网站管理系统通用版

    《电子商务购物网站管理系统通用版》是一款专为电子商务领域设计的高效、便捷的管理工具,旨在帮助商家更好地运营在线商店,提升用户体验,优化购物流程。本文将深入探讨该系统的关键功能、架构设计以及其在实际操作...

    欧洲清算系统介绍分享.pdf

    (2)在通用监督政策没有涉及的领域,有关的监督政策由 NCB 一级的管理机构制定,这些政策应适用于欧元体系制定的一般通用监督框架。在必要的情况下,ECB 管理委员会也会主动提出制定这些相关领域监督政策的动议。 ...

    【T540】大气金融类通用企业网站模板.rar

    这个模板基于流行的织梦(DedeCMS)内容管理系统,它是一款功能强大、易于使用的开源建站工具,适用于构建复杂的企业级网站。 首先,我们来详细了解一下织梦内容管理系统(DedeCMS)。DedeCMS是基于PHP+MySQL技术...

    通用zencart模板 经典款式

    这个"通用zencart模板 经典款式"显然是一款适用于各种商业类型的Zencart主题,旨在为商家提供一个美观且用户友好的界面,以吸引并方便顾客购物。 在Zencart模板中,设计通常会考虑以下几个关键方面: 1. **响应式...

    中外劳动技术服务合同样书通用版n_0.doc

    【文档描述】中并未给出具体的描述,但从文件名可以推断,这是一份适用于多种情况的模板,适用于不同国家之间的劳动和技术服务合作。 【标签】中的“合同”、“word”、“文档资料”表明这是一份以Word格式编写的...

    小程序源码(无后台)_电商通用.rar

    此压缩包中的"电商通用"可能表示这套源码适用于多种类型的电商应用,例如B2C零售、C2C市场、O2O服务等。源码可能包括了前端展示页面、用户交互逻辑、商品分类与搜索、购物车、支付接口、订单管理等核心模块。 1. **...

Global site tag (gtag.js) - Google Analytics