最近十天时间都在做跟在线支付相关的开发工作,使用的在线支付产品很多,有易宝、快钱、支付宝、财富通等,多吧?其实,开发这些接口不难,只是有些工作量而已。总结了一下,最烦的一块就是各支付的输入输出参数不同,其他原理大体一样。
如果将有些重复又费力的功能抽出来放到一个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;
}
}