mirror of
https://gitee.com/egzosn/pay-java-parent.git
synced 2026-05-09 12:36:16 +08:00
支付回调消息的定义与逻辑实现
This commit is contained in:
@@ -17,13 +17,14 @@ import java.util.*;
|
||||
|
||||
/**
|
||||
* 支付基础服务
|
||||
*
|
||||
* @author: egan
|
||||
* <pre>
|
||||
* <pre>
|
||||
* email egzosn@gmail.com
|
||||
* date 2017/3/5 20:36
|
||||
* </pre>
|
||||
*/
|
||||
public abstract class BasePayService<PC extends PayConfigStorage> implements PayService<PC> {
|
||||
public abstract class BasePayService<PC extends PayConfigStorage> implements PayService<PC> {
|
||||
protected final Log LOG = LogFactory.getLog(getClass());
|
||||
protected PC payConfigStorage;
|
||||
|
||||
@@ -38,10 +39,12 @@ public abstract class BasePayService<PC extends PayConfigStorage> implements Pay
|
||||
/**
|
||||
* 支付消息拦截器
|
||||
*/
|
||||
protected List<PayMessageInterceptor> interceptors = new ArrayList<PayMessageInterceptor>();;
|
||||
protected List<PayMessageInterceptor> interceptors = new ArrayList<PayMessageInterceptor>();
|
||||
;
|
||||
|
||||
/**
|
||||
* 设置支付配置
|
||||
*
|
||||
* @param payConfigStorage 支付配置
|
||||
*/
|
||||
@Override
|
||||
@@ -54,6 +57,7 @@ public abstract class BasePayService<PC extends PayConfigStorage> implements Pay
|
||||
public PC getPayConfigStorage() {
|
||||
return payConfigStorage;
|
||||
}
|
||||
|
||||
@Override
|
||||
public HttpRequestTemplate getHttpRequestTemplate() {
|
||||
return requestTemplate;
|
||||
@@ -61,6 +65,7 @@ public abstract class BasePayService<PC extends PayConfigStorage> implements Pay
|
||||
|
||||
/**
|
||||
* 设置并创建请求模版, 代理请求配置这里是否合理??,
|
||||
*
|
||||
* @param configStorage http请求配置
|
||||
* @return 支付服务
|
||||
*/
|
||||
@@ -82,17 +87,18 @@ public abstract class BasePayService<PC extends PayConfigStorage> implements Pay
|
||||
|
||||
|
||||
/**
|
||||
* Generate a Base64 encoded String from user , password
|
||||
* @param user 用户名
|
||||
* Generate a Base64 encoded String from user , password
|
||||
*
|
||||
* @param user 用户名
|
||||
* @param password 密码
|
||||
* @return authorizationString
|
||||
*/
|
||||
protected String authorizationString(String user, String password) {
|
||||
String base64ClientID = null;
|
||||
try {
|
||||
base64ClientID = com.egzosn.pay.common.util.sign.encrypt.Base64.encode(String.format("%s:%s", user , password).getBytes("UTF-8"));
|
||||
base64ClientID = com.egzosn.pay.common.util.sign.encrypt.Base64.encode(String.format("%s:%s", user, password).getBytes("UTF-8"));
|
||||
} catch (UnsupportedEncodingException e) {
|
||||
LOG.error(e);
|
||||
LOG.error(e);
|
||||
}
|
||||
|
||||
return base64ClientID;
|
||||
@@ -108,8 +114,9 @@ public abstract class BasePayService<PC extends PayConfigStorage> implements Pay
|
||||
@Override
|
||||
public String createSign(String content, String characterEncoding) {
|
||||
|
||||
return SignUtils.valueOf(payConfigStorage.getSignType()).createSign(content, payConfigStorage.getKeyPrivate(),characterEncoding);
|
||||
return SignUtils.valueOf(payConfigStorage.getSignType()).createSign(content, payConfigStorage.getKeyPrivate(), characterEncoding);
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建签名
|
||||
*
|
||||
@@ -119,7 +126,7 @@ public abstract class BasePayService<PC extends PayConfigStorage> implements Pay
|
||||
*/
|
||||
@Override
|
||||
public String createSign(Map<String, Object> content, String characterEncoding) {
|
||||
return SignUtils.valueOf(payConfigStorage.getSignType()).sign(content, payConfigStorage.getKeyPrivate(),characterEncoding);
|
||||
return SignUtils.valueOf(payConfigStorage.getSignType()).sign(content, payConfigStorage.getKeyPrivate(), characterEncoding);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -142,20 +149,20 @@ public abstract class BasePayService<PC extends PayConfigStorage> implements Pay
|
||||
* @return 获得回调的请求参数
|
||||
*/
|
||||
@Override
|
||||
public Map<String, Object> getParameter2Map (Map<String, String[]> parameterMap, InputStream is) {
|
||||
public Map<String, Object> getParameter2Map(Map<String, String[]> parameterMap, InputStream is) {
|
||||
|
||||
Map<String, Object> params = new TreeMap<String,Object>();
|
||||
for (Map.Entry<String, String[]> entry : parameterMap.entrySet()) {
|
||||
Map<String, Object> params = new TreeMap<String, Object>();
|
||||
for (Map.Entry<String, String[]> entry : parameterMap.entrySet()) {
|
||||
String name = entry.getKey();
|
||||
String[] values = entry.getValue();
|
||||
String valueStr = "";
|
||||
for (int i = 0,len = values.length; i < len; i++) {
|
||||
valueStr += (i == len - 1) ? values[i] : values[i] + ",";
|
||||
for (int i = 0, len = values.length; i < len; i++) {
|
||||
valueStr += (i == len - 1) ? values[i] : values[i] + ",";
|
||||
}
|
||||
if (StringUtils.isNotEmpty(payConfigStorage.getInputCharset()) && !valueStr.matches("\\w+")){
|
||||
if (StringUtils.isNotEmpty(payConfigStorage.getInputCharset()) && !valueStr.matches("\\w+")) {
|
||||
try {
|
||||
if(valueStr.equals(new String(valueStr.getBytes("iso8859-1"), "iso8859-1"))){
|
||||
valueStr=new String(valueStr.getBytes("iso8859-1"), payConfigStorage.getInputCharset());
|
||||
if (valueStr.equals(new String(valueStr.getBytes("iso8859-1"), "iso8859-1"))) {
|
||||
valueStr = new String(valueStr.getBytes("iso8859-1"), payConfigStorage.getInputCharset());
|
||||
}
|
||||
} catch (UnsupportedEncodingException e) {
|
||||
LOG.error(e);
|
||||
@@ -169,11 +176,12 @@ public abstract class BasePayService<PC extends PayConfigStorage> implements Pay
|
||||
|
||||
/**
|
||||
* 交易查询接口,带处理器
|
||||
*
|
||||
* @param tradeNo 支付平台订单号
|
||||
* @param outTradeNo 商户单号
|
||||
* @param callback 处理器
|
||||
* @param <T> 返回类型
|
||||
* @return 返回查询回来的结果集
|
||||
* @param callback 处理器
|
||||
* @param <T> 返回类型
|
||||
* @return 返回查询回来的结果集
|
||||
*/
|
||||
@Override
|
||||
public <T> T query(String tradeNo, String outTradeNo, Callback<T> callback) {
|
||||
@@ -186,26 +194,27 @@ public abstract class BasePayService<PC extends PayConfigStorage> implements Pay
|
||||
*
|
||||
* @param tradeNo 支付平台订单号
|
||||
* @param outTradeNo 商户单号
|
||||
* @param callback 处理器
|
||||
* @param <T> 返回类型
|
||||
* @param callback 处理器
|
||||
* @param <T> 返回类型
|
||||
* @return 返回支付方交易关闭后的结果
|
||||
*/
|
||||
@Override
|
||||
public <T> T close(String tradeNo, String outTradeNo, Callback<T> callback) {
|
||||
return callback.perform(close(tradeNo, outTradeNo));
|
||||
return callback.perform(close(tradeNo, outTradeNo));
|
||||
}
|
||||
|
||||
/**
|
||||
* 交易撤销
|
||||
*
|
||||
* @param tradeNo 支付平台订单号
|
||||
* @param outTradeNo 商户单号
|
||||
* @param callback 处理器
|
||||
* @param <T> 返回类型
|
||||
* @param callback 处理器
|
||||
* @param <T> 返回类型
|
||||
* @return 返回支付方交易撤销后的结果
|
||||
*/
|
||||
@Override
|
||||
public <T> T cancel(String tradeNo, String outTradeNo, Callback<T> callback) {
|
||||
return callback.perform(close(tradeNo, outTradeNo));
|
||||
return callback.perform(close(tradeNo, outTradeNo));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -229,7 +238,6 @@ public abstract class BasePayService<PC extends PayConfigStorage> implements Pay
|
||||
* @param totalAmount 总金额
|
||||
* @param callback 处理器
|
||||
* @param <T> 返回类型
|
||||
*
|
||||
* @return 处理过后的类型对象, 返回支付方申请退款后的结果
|
||||
* @see #refund(RefundOrder, Callback)
|
||||
*/
|
||||
@@ -243,16 +251,15 @@ public abstract class BasePayService<PC extends PayConfigStorage> implements Pay
|
||||
/**
|
||||
* 申请退款接口
|
||||
*
|
||||
* @param refundOrder 退款订单信息
|
||||
* @return 返回支付方申请退款后的结果
|
||||
* @param callback 处理器
|
||||
* @param <T> 返回类型
|
||||
* @param refundOrder 退款订单信息
|
||||
* @param callback 处理器
|
||||
* @param <T> 返回类型
|
||||
* @return 返回支付方申请退款后的结果
|
||||
*/
|
||||
@Override
|
||||
public <T> T refund(RefundOrder refundOrder, Callback<T> callback) {
|
||||
|
||||
return callback.perform(refund(refundOrder));
|
||||
return callback.perform(refund(refundOrder));
|
||||
}
|
||||
|
||||
|
||||
@@ -263,7 +270,6 @@ public abstract class BasePayService<PC extends PayConfigStorage> implements Pay
|
||||
* @param outTradeNo 商户单号
|
||||
* @param callback 处理器
|
||||
* @param <T> 返回类型
|
||||
*
|
||||
* @return 处理过后的类型对象,返回支付方查询退款后的结果
|
||||
*/
|
||||
@Override
|
||||
@@ -274,13 +280,13 @@ public abstract class BasePayService<PC extends PayConfigStorage> implements Pay
|
||||
/**
|
||||
* 查询退款
|
||||
*
|
||||
* @param refundOrder 退款订单信息
|
||||
* @param callback 处理器
|
||||
* @param <T> 返回类型
|
||||
* @param refundOrder 退款订单信息
|
||||
* @param callback 处理器
|
||||
* @param <T> 返回类型
|
||||
* @return 返回支付方查询退款后的结果
|
||||
*/
|
||||
@Override
|
||||
public <T>T refundquery(RefundOrder refundOrder, Callback<T> callback){
|
||||
public <T> T refundquery(RefundOrder refundOrder, Callback<T> callback) {
|
||||
return callback.perform(refundquery(refundOrder));
|
||||
}
|
||||
|
||||
@@ -291,7 +297,6 @@ public abstract class BasePayService<PC extends PayConfigStorage> implements Pay
|
||||
* @param billType 账单类型,具体请查看对应支付平台
|
||||
* @param callback 处理器
|
||||
* @param <T> 返回类型
|
||||
*
|
||||
* @return 返回支付方下载对账单的结果
|
||||
*/
|
||||
@Override
|
||||
@@ -300,15 +305,15 @@ public abstract class BasePayService<PC extends PayConfigStorage> implements Pay
|
||||
}
|
||||
|
||||
/**
|
||||
* @param tradeNoOrBillDate 支付平台订单号或者账单类型, 具体请 类型为{@link String }或者 {@link Date },类型须强制限制,类型不对应则抛出异常{@link PayErrorException}
|
||||
* @param outTradeNoBillType 商户单号或者 账单类型
|
||||
* @param transactionType 交易类型
|
||||
* @param callback 处理器
|
||||
* @param <T> 返回类型
|
||||
* @param tradeNoOrBillDate 支付平台订单号或者账单类型, 具体请 类型为{@link String }或者 {@link Date },类型须强制限制,类型不对应则抛出异常{@link PayErrorException}
|
||||
* @param outTradeNoBillType 商户单号或者 账单类型
|
||||
* @param transactionType 交易类型
|
||||
* @param callback 处理器
|
||||
* @param <T> 返回类型
|
||||
* @return 返回支付方对应接口的结果
|
||||
*/
|
||||
@Override
|
||||
public <T>T secondaryInterface(Object tradeNoOrBillDate, String outTradeNoBillType, TransactionType transactionType, Callback<T> callback){
|
||||
public <T> T secondaryInterface(Object tradeNoOrBillDate, String outTradeNoBillType, TransactionType transactionType, Callback<T> callback) {
|
||||
return callback.perform(secondaryInterface(tradeNoOrBillDate, outTradeNoBillType, transactionType));
|
||||
}
|
||||
|
||||
@@ -317,7 +322,6 @@ public abstract class BasePayService<PC extends PayConfigStorage> implements Pay
|
||||
*
|
||||
* @param order 转账订单
|
||||
* @param callback 处理器
|
||||
*
|
||||
* @return 对应的转账结果
|
||||
*/
|
||||
@Override
|
||||
@@ -330,7 +334,6 @@ public abstract class BasePayService<PC extends PayConfigStorage> implements Pay
|
||||
* 转账
|
||||
*
|
||||
* @param order 转账订单
|
||||
*
|
||||
* @return 对应的转账结果
|
||||
*/
|
||||
@Override
|
||||
@@ -341,27 +344,26 @@ public abstract class BasePayService<PC extends PayConfigStorage> implements Pay
|
||||
/**
|
||||
* 转账查询
|
||||
*
|
||||
* @param outNo 商户转账订单号
|
||||
* @param outNo 商户转账订单号
|
||||
* @param tradeNo 支付平台转账订单号
|
||||
*
|
||||
* @return 对应的转账订单
|
||||
*/
|
||||
@Override
|
||||
public Map<String, Object> transferQuery(String outNo, String tradeNo){
|
||||
public Map<String, Object> transferQuery(String outNo, String tradeNo) {
|
||||
return new HashMap<>(0);
|
||||
}
|
||||
|
||||
/**
|
||||
* 转账查询
|
||||
*
|
||||
* @param outNo 商户转账订单号
|
||||
* @param tradeNo 支付平台转账订单号
|
||||
* @param outNo 商户转账订单号
|
||||
* @param tradeNo 支付平台转账订单号
|
||||
* @param callback 处理器
|
||||
* @param <T> 返回类型
|
||||
* @param <T> 返回类型
|
||||
* @return 对应的转账订单
|
||||
*/
|
||||
@Override
|
||||
public <T>T transferQuery(String outNo, String tradeNo, Callback<T> callback){
|
||||
public <T> T transferQuery(String outNo, String tradeNo, Callback<T> callback) {
|
||||
return callback.perform(transferQuery(outNo, tradeNo));
|
||||
}
|
||||
|
||||
@@ -382,11 +384,11 @@ public abstract class BasePayService<PC extends PayConfigStorage> implements Pay
|
||||
* 获取支付消息处理器,这里用于处理具体的支付业务
|
||||
* 配合{@link PayService#payBack(Map, InputStream)}进行使用
|
||||
* <p>
|
||||
* @return 默认使用{@link DefaultPayMessageHandler }进行实现
|
||||
*
|
||||
* @return 默认使用{@link DefaultPayMessageHandler }进行实现
|
||||
*/
|
||||
public PayMessageHandler getPayMessageHandler() {
|
||||
if (null == handler){
|
||||
if (null == handler) {
|
||||
setPayMessageHandler(new DefaultPayMessageHandler());
|
||||
}
|
||||
return handler;
|
||||
@@ -416,16 +418,27 @@ public abstract class BasePayService<PC extends PayConfigStorage> implements Pay
|
||||
if (LOG.isDebugEnabled()) {
|
||||
LOG.debug("回调响应:" + JSON.toJSONString(data));
|
||||
}
|
||||
if (!verify(data)){
|
||||
if (!verify(data)) {
|
||||
return getPayOutMessage("fail", "失败");
|
||||
}
|
||||
PayMessage payMessage = new PayMessage(data);
|
||||
PayMessage payMessage = this.createMessage(data);
|
||||
Map<String, Object> context = new HashMap<String, Object>();
|
||||
for (PayMessageInterceptor interceptor : interceptors){
|
||||
if (!interceptor.intercept(payMessage, context, this)){
|
||||
for (PayMessageInterceptor interceptor : interceptors) {
|
||||
if (!interceptor.intercept(payMessage, context, this)) {
|
||||
return successPayOutMessage(payMessage);
|
||||
}
|
||||
}
|
||||
return getPayMessageHandler().handle(payMessage, context, this);
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建消息
|
||||
*
|
||||
* @param message 支付平台返回的消息
|
||||
* @return 支付消息对象
|
||||
*/
|
||||
@Override
|
||||
public PayMessage createMessage(Map<String, Object> message) {
|
||||
return new PayMessage(message);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -19,7 +19,7 @@ import java.util.Map;
|
||||
* source Daniel Qian
|
||||
* </pre>
|
||||
*/
|
||||
public interface PayMessageHandler {
|
||||
public interface PayMessageHandler<M extends PayMessage, S extends PayService> {
|
||||
|
||||
/**
|
||||
* 处理支付回调消息的处理器接口
|
||||
@@ -29,9 +29,9 @@ public interface PayMessageHandler {
|
||||
* @return xml,text格式的消息,如果在异步规则里处理的话,可以返回null
|
||||
* @throws PayErrorException 支付错误异常
|
||||
*/
|
||||
PayOutMessage handle(PayMessage payMessage,
|
||||
PayOutMessage handle(M payMessage,
|
||||
Map<String, Object> context,
|
||||
PayService payService
|
||||
S payService
|
||||
) throws PayErrorException;
|
||||
|
||||
}
|
||||
|
||||
@@ -18,7 +18,7 @@ import java.util.Map;
|
||||
* source Daniel Qian
|
||||
* </pre>
|
||||
*/
|
||||
public interface PayMessageInterceptor {
|
||||
public interface PayMessageInterceptor<M extends PayMessage, S extends PayService> {
|
||||
|
||||
/**
|
||||
* 拦截微信消息
|
||||
@@ -28,9 +28,9 @@ public interface PayMessageInterceptor {
|
||||
* @param payService 支付服务
|
||||
* @return true代表OK,false代表不OK
|
||||
*/
|
||||
boolean intercept(PayMessage payMessage,
|
||||
boolean intercept(M payMessage,
|
||||
Map<String, Object> context,
|
||||
PayService payService
|
||||
S payService
|
||||
) throws PayErrorException;
|
||||
|
||||
}
|
||||
|
||||
@@ -2,13 +2,13 @@ package com.egzosn.pay.common.api;
|
||||
|
||||
import com.egzosn.pay.common.bean.PayMessage;
|
||||
import com.egzosn.pay.common.bean.PayOutMessage;
|
||||
|
||||
import com.egzosn.pay.common.util.LogExceptionHandler;
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.Executors;
|
||||
@@ -17,7 +17,7 @@ import java.util.concurrent.Future;
|
||||
/**
|
||||
* <pre>
|
||||
* 支付消息路由器,通过代码化的配置,把来自支付的消息交给handler处理
|
||||
*
|
||||
*
|
||||
* 说明:
|
||||
* 1. 配置路由规则时要按照从细到粗的原则,否则可能消息可能会被提前处理
|
||||
* 2. 默认情况下消息只会被处理一次,除非使用 {@link PayMessageRouterRule#next()}
|
||||
@@ -39,147 +39,167 @@ import java.util.concurrent.Future;
|
||||
* router.route(message);
|
||||
* source chanjarster/weixin-java-tools Daniel Qian
|
||||
* </pre>
|
||||
* @author egan
|
||||
*
|
||||
* @author egan
|
||||
*/
|
||||
public class PayMessageRouter {
|
||||
|
||||
protected final Log LOG = LogFactory.getLog(PayMessageRouter.class);
|
||||
/**
|
||||
* 异步线程大小
|
||||
*/
|
||||
private static final int DEFAULT_THREAD_POOL_SIZE = 100;
|
||||
/**
|
||||
* 规则集
|
||||
*/
|
||||
private final List<PayMessageRouterRule> rules = new ArrayList<PayMessageRouterRule>();
|
||||
/**
|
||||
* 支付服务
|
||||
*/
|
||||
private final PayService payService;
|
||||
/**
|
||||
* 异步线程处理器
|
||||
*/
|
||||
private ExecutorService executorService;
|
||||
/**
|
||||
* 支付异常处理器
|
||||
*/
|
||||
private PayErrorExceptionHandler exceptionHandler;
|
||||
protected final Log LOG = LogFactory.getLog(PayMessageRouter.class);
|
||||
/**
|
||||
* 异步线程大小
|
||||
*/
|
||||
private static final int DEFAULT_THREAD_POOL_SIZE = 100;
|
||||
/**
|
||||
* 规则集
|
||||
*/
|
||||
private final List<PayMessageRouterRule> rules = new ArrayList<PayMessageRouterRule>();
|
||||
/**
|
||||
* 支付服务
|
||||
*/
|
||||
private final PayService payService;
|
||||
/**
|
||||
* 异步线程处理器
|
||||
*/
|
||||
private ExecutorService executorService;
|
||||
/**
|
||||
* 支付异常处理器
|
||||
*/
|
||||
private PayErrorExceptionHandler exceptionHandler;
|
||||
|
||||
/**
|
||||
* 根据支付服务创建路由
|
||||
* @param payService 支付服务
|
||||
*/
|
||||
public PayMessageRouter(PayService payService) {
|
||||
this.payService = payService;
|
||||
this.executorService = Executors.newFixedThreadPool(DEFAULT_THREAD_POOL_SIZE);
|
||||
this.exceptionHandler = new LogExceptionHandler();
|
||||
}
|
||||
/**
|
||||
* 根据支付服务创建路由
|
||||
*
|
||||
* @param payService 支付服务
|
||||
*/
|
||||
public PayMessageRouter(PayService payService) {
|
||||
this.payService = payService;
|
||||
this.executorService = Executors.newFixedThreadPool(DEFAULT_THREAD_POOL_SIZE);
|
||||
this.exceptionHandler = new LogExceptionHandler();
|
||||
}
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 设置自定义的 {@link ExecutorService}
|
||||
* 如果不调用用该方法,默认使 Executors.newFixedThreadPool(100)
|
||||
* </pre>
|
||||
* @param executorService 异步线程处理器
|
||||
*/
|
||||
public void setExecutorService(ExecutorService executorService) {
|
||||
this.executorService = executorService;
|
||||
}
|
||||
/**
|
||||
* <pre>
|
||||
* 设置自定义的 {@link ExecutorService}
|
||||
* 如果不调用用该方法,默认使 Executors.newFixedThreadPool(100)
|
||||
* </pre>
|
||||
*
|
||||
* @param executorService 异步线程处理器
|
||||
*/
|
||||
public void setExecutorService(ExecutorService executorService) {
|
||||
this.executorService = executorService;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 设置自定义的{@link PayErrorExceptionHandler}
|
||||
* 如果不调用该方法,默认使用 {@link LogExceptionHandler}
|
||||
* </pre>
|
||||
*
|
||||
* @param exceptionHandler 异常处理器
|
||||
*/
|
||||
public void setExceptionHandler(PayErrorExceptionHandler exceptionHandler) {
|
||||
this.exceptionHandler = exceptionHandler;
|
||||
}
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 设置自定义的{@link PayErrorExceptionHandler}
|
||||
* 如果不调用该方法,默认使用 {@link LogExceptionHandler}
|
||||
* </pre>
|
||||
* @param exceptionHandler 异常处理器
|
||||
*/
|
||||
public void setExceptionHandler(PayErrorExceptionHandler exceptionHandler) {
|
||||
this.exceptionHandler = exceptionHandler;
|
||||
}
|
||||
/**
|
||||
* 获取所有的规则
|
||||
*
|
||||
* @return 规则
|
||||
*/
|
||||
List<PayMessageRouterRule> getRules() {
|
||||
return this.rules;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取所有的规则
|
||||
* @return 规则
|
||||
*/
|
||||
List<PayMessageRouterRule> getRules() {
|
||||
return this.rules;
|
||||
}
|
||||
/**
|
||||
* 开始一个新的Route规则
|
||||
*
|
||||
* @return 新的Route规则
|
||||
*/
|
||||
public PayMessageRouterRule rule() {
|
||||
return new PayMessageRouterRule(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* 开始一个新的Route规则
|
||||
* @return 新的Route规则
|
||||
*/
|
||||
public PayMessageRouterRule rule() {
|
||||
return new PayMessageRouterRule(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* 处理支付消息
|
||||
* @param payMessage 支付消息
|
||||
* @return 支付输出结果
|
||||
*/
|
||||
public PayOutMessage route(final PayMessage payMessage) {
|
||||
|
||||
final List<PayMessageRouterRule> matchRules = new ArrayList<PayMessageRouterRule>();
|
||||
// 收集匹配的规则
|
||||
for (final PayMessageRouterRule rule : rules) {
|
||||
if (rule.test(payMessage)) {
|
||||
matchRules.add(rule);
|
||||
if(!rule.isReEnter()) {
|
||||
break;
|
||||
/**
|
||||
* 处理支付消息
|
||||
*
|
||||
* @param payMessage 支付消息
|
||||
* @return 支付输出结果
|
||||
*/
|
||||
public PayOutMessage route(Map<String, Object> payMessage, PayConfigStorage storage) {
|
||||
PayMessage message = payService.createMessage(payMessage);
|
||||
message.setPayType(storage.getPayType());
|
||||
if (null == storage.getMsgType()){
|
||||
message.setMsgType(storage.getMsgType().name());
|
||||
}
|
||||
}
|
||||
return route(message);
|
||||
}
|
||||
|
||||
if (matchRules.isEmpty()) {
|
||||
return null;
|
||||
}
|
||||
/**
|
||||
* 处理支付消息
|
||||
*
|
||||
* @param payMessage 支付消息
|
||||
* @return 支付输出结果
|
||||
*/
|
||||
public PayOutMessage route(final PayMessage payMessage) {
|
||||
|
||||
PayOutMessage res = null;
|
||||
final List<Future> futures = new ArrayList<Future>();
|
||||
for (final PayMessageRouterRule rule : matchRules) {
|
||||
// 返回最后一个非异步的rule的执行结果
|
||||
if(rule.isAsync()) {
|
||||
futures.add(
|
||||
executorService.submit(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
rule.service(payMessage, payService, exceptionHandler);
|
||||
}
|
||||
})
|
||||
);
|
||||
} else {
|
||||
res = rule.service(payMessage, payService, exceptionHandler);
|
||||
// 在同步操作结束,session访问结束
|
||||
if (LOG.isDebugEnabled()) {
|
||||
LOG.debug("End session access: async=false, fromPay=" + payMessage.getFromPay());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (futures.size() > 0) {
|
||||
executorService.submit(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
for (Future future : futures) {
|
||||
try {
|
||||
future.get();
|
||||
LOG.debug("End session access: async=true, fromPay=" + payMessage.getFromPay());
|
||||
|
||||
} catch (InterruptedException e) {
|
||||
LOG.error("Error happened when wait task finish", e);
|
||||
} catch (ExecutionException e) {
|
||||
LOG.error("Error happened when wait task finish", e);
|
||||
final List<PayMessageRouterRule> matchRules = new ArrayList<PayMessageRouterRule>();
|
||||
// 收集匹配的规则
|
||||
for (final PayMessageRouterRule rule : rules) {
|
||||
if (rule.test(payMessage)) {
|
||||
matchRules.add(rule);
|
||||
if (!rule.isReEnter()) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
if (matchRules.isEmpty()) {
|
||||
return null;
|
||||
}
|
||||
|
||||
PayOutMessage res = null;
|
||||
final List<Future> futures = new ArrayList<Future>();
|
||||
for (final PayMessageRouterRule rule : matchRules) {
|
||||
// 返回最后一个非异步的rule的执行结果
|
||||
if (rule.isAsync()) {
|
||||
futures.add(
|
||||
executorService.submit(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
rule.service(payMessage, payService, exceptionHandler);
|
||||
}
|
||||
})
|
||||
);
|
||||
} else {
|
||||
res = rule.service(payMessage, payService, exceptionHandler);
|
||||
// 在同步操作结束,session访问结束
|
||||
if (LOG.isDebugEnabled()) {
|
||||
LOG.debug("End session access: async=false, fromPay=" + payMessage.getFromPay());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (futures.size() > 0) {
|
||||
executorService.submit(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
for (Future future : futures) {
|
||||
try {
|
||||
future.get();
|
||||
LOG.debug("End session access: async=true, fromPay=" + payMessage.getFromPay());
|
||||
|
||||
} catch (InterruptedException e) {
|
||||
LOG.error("Error happened when wait task finish", e);
|
||||
} catch (ExecutionException e) {
|
||||
LOG.error("Error happened when wait task finish", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
return res;
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -15,17 +15,17 @@ import java.util.Map;
|
||||
* 支付服务
|
||||
*
|
||||
* @author egan
|
||||
* <pre>
|
||||
* email egzosn@gmail.com
|
||||
* date 2016-5-18 14:09:01
|
||||
*</pre>
|
||||
* <pre>
|
||||
* email egzosn@gmail.com
|
||||
* date 2016-5-18 14:09:01
|
||||
* </pre>
|
||||
*/
|
||||
public interface PayService<PC extends PayConfigStorage> {
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 设置支付配置
|
||||
*
|
||||
* @param payConfigStorage 支付配置
|
||||
* @return 支付服务
|
||||
*/
|
||||
@@ -37,6 +37,7 @@ public interface PayService<PC extends PayConfigStorage> {
|
||||
* @return 支付配置
|
||||
*/
|
||||
PC getPayConfigStorage();
|
||||
|
||||
/**
|
||||
* 获取http请求工具
|
||||
*
|
||||
@@ -46,8 +47,9 @@ public interface PayService<PC extends PayConfigStorage> {
|
||||
|
||||
/**
|
||||
* 设置 请求工具配置 设置并创建请求模版, 代理请求配置这里是否合理??,
|
||||
*
|
||||
* @param configStorage http请求配置
|
||||
* @return 支付服务
|
||||
* @return 支付服务
|
||||
*/
|
||||
PayService setRequestTemplateConfigStorage(HttpConfigStorage configStorage);
|
||||
|
||||
@@ -72,6 +74,7 @@ public interface PayService<PC extends PayConfigStorage> {
|
||||
/**
|
||||
* 支付宝需要,微信是否也需要再次校验来源,进行订单查询
|
||||
* 校验数据来源
|
||||
*
|
||||
* @param id 业务id, 数据的真实性.
|
||||
* @return true通过
|
||||
*/
|
||||
@@ -85,14 +88,16 @@ public interface PayService<PC extends PayConfigStorage> {
|
||||
* @return 订单信息
|
||||
* @see PayOrder 支付订单信息
|
||||
*/
|
||||
Map<String, Object> orderInfo(PayOrder order);
|
||||
Map<String, Object> orderInfo(PayOrder order);
|
||||
|
||||
/**
|
||||
* 页面转跳支付, 返回对应页面重定向信息
|
||||
*
|
||||
* @param order 订单信息
|
||||
* @return 对应页面重定向信息
|
||||
*/
|
||||
String toPay(PayOrder order);
|
||||
|
||||
/**
|
||||
* 创建签名
|
||||
*
|
||||
@@ -123,7 +128,7 @@ public interface PayService<PC extends PayConfigStorage> {
|
||||
/**
|
||||
* 获取输出消息,用户返回给支付端
|
||||
*
|
||||
* @param code 状态
|
||||
* @param code 状态
|
||||
* @param message 消息
|
||||
* @return 返回输出消息
|
||||
*/
|
||||
@@ -132,6 +137,7 @@ public interface PayService<PC extends PayConfigStorage> {
|
||||
/**
|
||||
* 获取成功输出消息,用户返回给支付端
|
||||
* 主要用于拦截器中返回
|
||||
*
|
||||
* @param payMessage 支付回调消息
|
||||
* @return 返回输出消息
|
||||
*/
|
||||
@@ -148,7 +154,6 @@ public interface PayService<PC extends PayConfigStorage> {
|
||||
String buildRequest(Map<String, Object> orderInfo, MethodType method);
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 获取输出二维码,用户返回给支付端,
|
||||
*
|
||||
@@ -163,7 +168,7 @@ public interface PayService<PC extends PayConfigStorage> {
|
||||
* @param order 发起支付的订单信息
|
||||
* @return 返回支付结果
|
||||
*/
|
||||
Map<String, Object> microPay(PayOrder order);
|
||||
Map<String, Object> microPay(PayOrder order);
|
||||
|
||||
/**
|
||||
* 交易查询接口
|
||||
@@ -176,13 +181,14 @@ public interface PayService<PC extends PayConfigStorage> {
|
||||
|
||||
/**
|
||||
* 交易查询接口,带处理器
|
||||
*
|
||||
* @param tradeNo 支付平台订单号
|
||||
* @param outTradeNo 商户单号
|
||||
* @param callback 处理器
|
||||
* @param <T> 返回类型
|
||||
* @return 返回查询回来的结果集
|
||||
* @param callback 处理器
|
||||
* @param <T> 返回类型
|
||||
* @return 返回查询回来的结果集
|
||||
*/
|
||||
<T>T query(String tradeNo, String outTradeNo, Callback<T> callback);
|
||||
<T> T query(String tradeNo, String outTradeNo, Callback<T> callback);
|
||||
|
||||
/**
|
||||
* 交易关闭接口
|
||||
@@ -199,11 +205,11 @@ public interface PayService<PC extends PayConfigStorage> {
|
||||
*
|
||||
* @param tradeNo 支付平台订单号
|
||||
* @param outTradeNo 商户单号
|
||||
* @param callback 处理器
|
||||
* @param <T> 返回类型
|
||||
* @param callback 处理器
|
||||
* @param <T> 返回类型
|
||||
* @return 返回支付方交易关闭后的结果
|
||||
*/
|
||||
<T>T close(String tradeNo, String outTradeNo, Callback<T> callback);
|
||||
<T> T close(String tradeNo, String outTradeNo, Callback<T> callback);
|
||||
|
||||
/**
|
||||
* 交易交易撤销
|
||||
@@ -219,55 +225,59 @@ public interface PayService<PC extends PayConfigStorage> {
|
||||
*
|
||||
* @param tradeNo 支付平台订单号
|
||||
* @param outTradeNo 商户单号
|
||||
* @param callback 处理器
|
||||
* @param <T> 返回类型
|
||||
* @param callback 处理器
|
||||
* @param <T> 返回类型
|
||||
* @return 返回支付方交易撤销后的结果
|
||||
*/
|
||||
<T>T cancel(String tradeNo, String outTradeNo, Callback<T> callback);
|
||||
<T> T cancel(String tradeNo, String outTradeNo, Callback<T> callback);
|
||||
|
||||
/**
|
||||
* 申请退款接口
|
||||
* 废弃
|
||||
* @param tradeNo 支付平台订单号
|
||||
* @param outTradeNo 商户单号
|
||||
*
|
||||
* @param tradeNo 支付平台订单号
|
||||
* @param outTradeNo 商户单号
|
||||
* @param refundAmount 退款金额
|
||||
* @param totalAmount 总金额
|
||||
* @param totalAmount 总金额
|
||||
* @return 返回支付方申请退款后的结果
|
||||
* @see #refund(RefundOrder)
|
||||
*/
|
||||
@Deprecated
|
||||
Map<String, Object> refund(String tradeNo, String outTradeNo, BigDecimal refundAmount, BigDecimal totalAmount);
|
||||
|
||||
/**
|
||||
* 申请退款接口
|
||||
* 废弃
|
||||
* @param tradeNo 支付平台订单号
|
||||
* @param outTradeNo 商户单号
|
||||
*
|
||||
* @param tradeNo 支付平台订单号
|
||||
* @param outTradeNo 商户单号
|
||||
* @param refundAmount 退款金额
|
||||
* @param totalAmount 总金额
|
||||
* @param callback 处理器
|
||||
* @param <T> 返回类型
|
||||
* @param totalAmount 总金额
|
||||
* @param callback 处理器
|
||||
* @param <T> 返回类型
|
||||
* @return 返回支付方申请退款后的结果
|
||||
* @see #refund(RefundOrder, Callback)
|
||||
*/
|
||||
@Deprecated
|
||||
<T>T refund(String tradeNo, String outTradeNo, BigDecimal refundAmount, BigDecimal totalAmount, Callback<T> callback);
|
||||
<T> T refund(String tradeNo, String outTradeNo, BigDecimal refundAmount, BigDecimal totalAmount, Callback<T> callback);
|
||||
|
||||
/**
|
||||
* 申请退款接口
|
||||
*
|
||||
* @param refundOrder 退款订单信息
|
||||
* @param refundOrder 退款订单信息
|
||||
* @return 返回支付方申请退款后的结果
|
||||
*/
|
||||
Map<String, Object> refund(RefundOrder refundOrder);
|
||||
|
||||
/**
|
||||
* 申请退款接口
|
||||
*
|
||||
* @param refundOrder 退款订单信息
|
||||
* @param callback 处理器
|
||||
* @param <T> 返回类型
|
||||
* @param refundOrder 退款订单信息
|
||||
* @param callback 处理器
|
||||
* @param <T> 返回类型
|
||||
* @return 返回支付方申请退款后的结果
|
||||
*/
|
||||
<T>T refund(RefundOrder refundOrder, Callback<T> callback);
|
||||
<T> T refund(RefundOrder refundOrder, Callback<T> callback);
|
||||
|
||||
/**
|
||||
* 查询退款
|
||||
@@ -278,33 +288,36 @@ public interface PayService<PC extends PayConfigStorage> {
|
||||
*/
|
||||
@Deprecated
|
||||
Map<String, Object> refundquery(String tradeNo, String outTradeNo);
|
||||
|
||||
/**
|
||||
* 查询退款
|
||||
*
|
||||
* @param tradeNo 支付平台订单号
|
||||
* @param outTradeNo 商户单号
|
||||
* @param callback 处理器
|
||||
* @param <T> 返回类型
|
||||
* @param callback 处理器
|
||||
* @param <T> 返回类型
|
||||
* @return 返回支付方查询退款后的结果
|
||||
*/
|
||||
@Deprecated
|
||||
<T>T refundquery(String tradeNo, String outTradeNo, Callback<T> callback);
|
||||
<T> T refundquery(String tradeNo, String outTradeNo, Callback<T> callback);
|
||||
|
||||
/**
|
||||
* 查询退款
|
||||
*
|
||||
* @param refundOrder 退款订单单号信息
|
||||
* @param refundOrder 退款订单单号信息
|
||||
* @return 返回支付方查询退款后的结果
|
||||
*/
|
||||
Map<String, Object> refundquery(RefundOrder refundOrder);
|
||||
|
||||
/**
|
||||
* 查询退款
|
||||
*
|
||||
* @param refundOrder 退款订单信息
|
||||
* @param callback 处理器
|
||||
* @param <T> 返回类型
|
||||
* @param refundOrder 退款订单信息
|
||||
* @param callback 处理器
|
||||
* @param <T> 返回类型
|
||||
* @return 返回支付方查询退款后的结果
|
||||
*/
|
||||
<T>T refundquery(RefundOrder refundOrder, Callback<T> callback);
|
||||
<T> T refundquery(RefundOrder refundOrder, Callback<T> callback);
|
||||
|
||||
/**
|
||||
* 下载对账单
|
||||
@@ -321,18 +334,19 @@ public interface PayService<PC extends PayConfigStorage> {
|
||||
* @param billDate 账单时间:具体请查看对应支付平台
|
||||
* @param billType 账单类型,具体请查看对应支付平台
|
||||
* @param callback 处理器
|
||||
* @param <T> 返回类型
|
||||
* @param <T> 返回类型
|
||||
* @return 返回支付方下载对账单的结果
|
||||
*/
|
||||
<T>T downloadbill(Date billDate, String billType, Callback<T> callback);
|
||||
<T> T downloadbill(Date billDate, String billType, Callback<T> callback);
|
||||
|
||||
|
||||
/**
|
||||
* 通用查询接口
|
||||
* @param tradeNoOrBillDate 支付平台订单号或者账单类型, 具体请
|
||||
* 类型为{@link String }或者 {@link Date },类型须强制限制,类型不对应则抛出异常{@link PayErrorException}
|
||||
* @param outTradeNoBillType 商户单号或者 账单类型
|
||||
* @param transactionType 交易类型
|
||||
*
|
||||
* @param tradeNoOrBillDate 支付平台订单号或者账单类型, 具体请
|
||||
* 类型为{@link String }或者 {@link Date },类型须强制限制,类型不对应则抛出异常{@link PayErrorException}
|
||||
* @param outTradeNoBillType 商户单号或者 账单类型
|
||||
* @param transactionType 交易类型
|
||||
* @return 返回支付方对应接口的结果
|
||||
*/
|
||||
Map<String, Object> secondaryInterface(Object tradeNoOrBillDate, String outTradeNoBillType, TransactionType transactionType);
|
||||
@@ -340,56 +354,56 @@ public interface PayService<PC extends PayConfigStorage> {
|
||||
/**
|
||||
* 通用查询接口
|
||||
*
|
||||
* @param tradeNoOrBillDate 支付平台订单号或者账单日期, 具体请 类型为{@link String }或者 {@link Date },类型须强制限制,类型不对应则抛出异常{@link PayErrorException}
|
||||
*
|
||||
* @param outTradeNoBillType 商户单号或者 账单类型
|
||||
* @param transactionType 交易类型
|
||||
* @param callback 处理器
|
||||
* @param <T> 返回类型
|
||||
* @param tradeNoOrBillDate 支付平台订单号或者账单日期, 具体请 类型为{@link String }或者 {@link Date },类型须强制限制,类型不对应则抛出异常{@link PayErrorException}
|
||||
* @param outTradeNoBillType 商户单号或者 账单类型
|
||||
* @param transactionType 交易类型
|
||||
* @param callback 处理器
|
||||
* @param <T> 返回类型
|
||||
* @return 返回支付方对应接口的结果
|
||||
*/
|
||||
<T>T secondaryInterface(Object tradeNoOrBillDate, String outTradeNoBillType, TransactionType transactionType, Callback<T> callback);
|
||||
<T> T secondaryInterface(Object tradeNoOrBillDate, String outTradeNoBillType, TransactionType transactionType, Callback<T> callback);
|
||||
|
||||
|
||||
/**
|
||||
* 转账
|
||||
*
|
||||
* @param order 转账订单
|
||||
* @return 对应的转账结果
|
||||
*/
|
||||
Map<String, Object> transfer(TransferOrder order);
|
||||
|
||||
/**
|
||||
* 转账
|
||||
* @param order 转账订单
|
||||
*
|
||||
* @param order 转账订单
|
||||
* @param callback 处理器
|
||||
* @param <T> 返回类型
|
||||
* @param <T> 返回类型
|
||||
* @return 对应的转账结果
|
||||
*/
|
||||
<T>T transfer(TransferOrder order, Callback<T> callback);
|
||||
|
||||
<T> T transfer(TransferOrder order, Callback<T> callback);
|
||||
|
||||
|
||||
/**
|
||||
* 转账查询
|
||||
*
|
||||
* @param outNo 商户转账订单号
|
||||
* @param outNo 商户转账订单号
|
||||
* @param tradeNo 支付平台转账订单号
|
||||
*
|
||||
* @return 对应的转账订单
|
||||
*/
|
||||
Map<String, Object> transferQuery(String outNo, String tradeNo);
|
||||
Map<String, Object> transferQuery(String outNo, String tradeNo);
|
||||
|
||||
/**
|
||||
* 转账查询
|
||||
*
|
||||
* @param outNo 商户转账订单号
|
||||
* @param tradeNo 支付平台转账订单号
|
||||
* @param outNo 商户转账订单号
|
||||
* @param tradeNo 支付平台转账订单号
|
||||
* @param callback 处理器
|
||||
* @param <T> 返回类型
|
||||
* @param <T> 返回类型
|
||||
* @return 对应的转账订单
|
||||
*/
|
||||
<T>T transferQuery(String outNo, String tradeNo, Callback<T> callback);
|
||||
<T> T transferQuery(String outNo, String tradeNo, Callback<T> callback);
|
||||
|
||||
/**
|
||||
/**
|
||||
* 将请求参数或者请求流转化为 Map
|
||||
*
|
||||
* @param parameterMap 请求参数
|
||||
@@ -400,29 +414,36 @@ public interface PayService<PC extends PayConfigStorage> {
|
||||
|
||||
/**
|
||||
* 设置支付消息处理器,这里用于处理具体的支付业务
|
||||
*
|
||||
* @param handler 消息处理器
|
||||
* 配合{@link com.egzosn.pay.common.api.PayService#payBack(java.util.Map, java.io.InputStream)}进行使用
|
||||
*
|
||||
* 默认使用{@link com.egzosn.pay.common.api.DefaultPayMessageHandler }进行实现
|
||||
*
|
||||
* 配合{@link com.egzosn.pay.common.api.PayService#payBack(java.util.Map, java.io.InputStream)}进行使用
|
||||
* <p>
|
||||
* 默认使用{@link com.egzosn.pay.common.api.DefaultPayMessageHandler }进行实现
|
||||
*/
|
||||
void setPayMessageHandler(PayMessageHandler handler);
|
||||
|
||||
/**
|
||||
* 设置支付消息处理器,这里用于处理具体的支付业务
|
||||
*
|
||||
* @param interceptor 消息拦截器
|
||||
* 配合{@link com.egzosn.pay.common.api.PayService#payBack(java.util.Map, java.io.InputStream)}进行使用
|
||||
*
|
||||
* 默认使用{@link com.egzosn.pay.common.api.DefaultPayMessageHandler }进行实现
|
||||
*
|
||||
* 配合{@link com.egzosn.pay.common.api.PayService#payBack(java.util.Map, java.io.InputStream)}进行使用
|
||||
* <p>
|
||||
* 默认使用{@link com.egzosn.pay.common.api.DefaultPayMessageHandler }进行实现
|
||||
*/
|
||||
void addPayMessageInterceptor(PayMessageInterceptor interceptor);
|
||||
|
||||
/**
|
||||
* 获取支付请求地址
|
||||
* 获取支付请求地址
|
||||
*
|
||||
* @param transactionType 交易类型
|
||||
* @return 请求地址
|
||||
*/
|
||||
String getReqUrl(TransactionType transactionType);
|
||||
String getReqUrl(TransactionType transactionType);
|
||||
|
||||
/**
|
||||
* 创建消息
|
||||
* @param message 支付平台返回的消息
|
||||
* @return 支付消息对象
|
||||
*/
|
||||
PayMessage createMessage(Map<String, Object> message);
|
||||
}
|
||||
|
||||
@@ -24,12 +24,16 @@ public class PayMessage implements Serializable {
|
||||
private String fromPay;
|
||||
private String describe;
|
||||
|
||||
|
||||
public PayMessage() {
|
||||
}
|
||||
|
||||
public PayMessage(Map<String, Object> payMessage) {
|
||||
this.payMessage = payMessage;
|
||||
}
|
||||
|
||||
public PayMessage(Map<String, Object> payMessage, String payType, String msgType) {
|
||||
this(payMessage);
|
||||
this.payMessage = payMessage;
|
||||
this.payType = payType;
|
||||
this.msgType = msgType;
|
||||
}
|
||||
@@ -42,6 +46,10 @@ public class PayMessage implements Serializable {
|
||||
this.transactionType = transactionType;
|
||||
}
|
||||
|
||||
protected void setPayMessage(Map<String, Object> payMessage) {
|
||||
this.payMessage = payMessage;
|
||||
}
|
||||
|
||||
public String getMsgType() {
|
||||
return msgType;
|
||||
}
|
||||
|
||||
@@ -1,8 +1,11 @@
|
||||
package com.egzosn.pay.common.util;
|
||||
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
import org.apache.http.util.Args;
|
||||
|
||||
import java.lang.ref.SoftReference;
|
||||
import java.text.ParseException;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.*;
|
||||
|
||||
@@ -16,7 +19,10 @@ import java.util.*;
|
||||
* </pre>
|
||||
*/
|
||||
public final class DateUtils {
|
||||
private DateUtils() {
|
||||
}
|
||||
|
||||
private static final Log LOG = LogFactory.getLog(DateUtils.class);
|
||||
static final class DateFormatHolder {
|
||||
private static final ThreadLocal<SoftReference<Map<String, SimpleDateFormat>>> THREADLOCAL_FORMATS = new ThreadLocal<SoftReference<Map<String, SimpleDateFormat>>>();
|
||||
|
||||
@@ -60,11 +66,28 @@ public final class DateUtils {
|
||||
SimpleDateFormat formatFor = DateFormatHolder.formatFor(pattern);
|
||||
return formatFor.format(date);
|
||||
}
|
||||
|
||||
public static Date parseDate(String date, String pattern) {
|
||||
Args.notNull(date, "Date");
|
||||
Args.notNull(pattern, "Pattern");
|
||||
SimpleDateFormat formatFor = DateFormatHolder.formatFor(pattern);
|
||||
try {
|
||||
return formatFor.parse(date);
|
||||
} catch (ParseException e) {
|
||||
LOG.error(e);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
public static Date parse(String date) {
|
||||
return parseDate(date, YYYY_MM_DD_HH_MM_SS);
|
||||
}
|
||||
public static final String format(Date date) {
|
||||
return formatDate(date, YYYY_MM_DD_HH_MM_SS);
|
||||
}
|
||||
|
||||
public static final Date parseDay(String date) {
|
||||
return parseDate(date, YYYY_MM_DD);
|
||||
}
|
||||
|
||||
public static final String formatDay(Date date) {
|
||||
return formatDate(date, YYYY_MM_DD);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user