支付回调消息的定义与逻辑实现

This commit is contained in:
egan
2019-07-03 22:40:49 +08:00
parent 4e1d13373b
commit bf6b6d9628
7 changed files with 354 additions and 269 deletions

View File

@@ -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);
}
}

View File

@@ -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;
}

View File

@@ -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代表OKfalse代表不OK
*/
boolean intercept(PayMessage payMessage,
boolean intercept(M payMessage,
Map<String, Object> context,
PayService payService
S payService
) throws PayErrorException;
}

View File

@@ -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;
}
}

View File

@@ -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);
}

View File

@@ -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;
}

View File

@@ -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);
}