1. 支付回调接口定义

2. 定义默认的回调消息实现
3. 支付回调拦截器定义与处理
This commit is contained in:
egzosn
2018-11-07 10:33:18 +08:00
parent 2d792bd4be
commit b15edef2dd
6 changed files with 109 additions and 59 deletions

View File

@@ -5,7 +5,7 @@
<parent>
<artifactId>pay-java-parent</artifactId>
<groupId>com.egzosn</groupId>
<version>2.11.3</version>
<version>2.11.4</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<packaging>jar</packaging>

View File

@@ -270,30 +270,5 @@ public abstract class BasePayConfigStorage implements PayConfigStorage{
}
}
/**
* 设置支付消息处理器,这里用于处理具体的支付业务
*
* @param handler 消息处理器
* 配合{@link PayService#payBack(Map, InputStream)}进行使用
* <p>
* 默认使用{@link DefaultPayMessageHandler }进行实现
*/
@Override
public void setPayMessageHandler(PayMessageHandler handler) {
this.handler = handler;
}
/**
* 获取支付消息处理器,这里用于处理具体的支付业务
* 配合{@link PayService#payBack(Map, InputStream)}进行使用
* <p>
* 默认使用{@link DefaultPayMessageHandler }进行实现
*/
@Override
public PayMessageHandler getPayMessageHandler() {
if (null == handler){
setPayMessageHandler(new DefaultPayMessageHandler());
}
return handler;
}
}

View File

@@ -1,12 +1,13 @@
package com.egzosn.pay.common.api;
import com.egzosn.pay.common.bean.RefundOrder;
import com.egzosn.pay.common.bean.TransactionType;
import com.egzosn.pay.common.bean.TransferOrder;
import com.alibaba.fastjson.JSON;
import com.egzosn.pay.common.bean.*;
import com.egzosn.pay.common.exception.PayErrorException;
import com.egzosn.pay.common.http.HttpConfigStorage;
import com.egzosn.pay.common.http.HttpRequestTemplate;
import com.egzosn.pay.common.util.sign.SignUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
@@ -22,13 +23,21 @@ import java.util.*;
* </pre>
*/
public abstract class BasePayService<PC extends PayConfigStorage> implements PayService<PC> {
protected final Log LOG = LogFactory.getLog(getClass());
protected PC payConfigStorage;
protected HttpRequestTemplate requestTemplate;
protected int retrySleepMillis = 1000;
protected int maxRetryTimes = 5;
/**
* 支付消息处理器
*/
protected PayMessageHandler handler;
/**
* 支付消息拦截器
*/
protected List<PayMessageInterceptor> interceptors = new ArrayList<PayMessageInterceptor>();;
/**
* 设置支付配置
@@ -317,4 +326,66 @@ public abstract class BasePayService<PC extends PayConfigStorage> implements Pay
public <T>T transferQuery(String outNo, String tradeNo, Callback<T> callback){
return callback.perform(transferQuery(outNo, tradeNo));
}
/**
* 设置支付消息处理器,这里用于处理具体的支付业务
*
* @param handler 消息处理器
* 配合{@link PayService#payBack(Map, InputStream)}进行使用
* <p>
* 默认使用{@link DefaultPayMessageHandler }进行实现
*/
@Override
public void setPayMessageHandler(PayMessageHandler handler) {
this.handler = handler;
}
/**
* 获取支付消息处理器,这里用于处理具体的支付业务
* 配合{@link PayService#payBack(Map, InputStream)}进行使用
* <p>
* 默认使用{@link DefaultPayMessageHandler }进行实现
*/
public PayMessageHandler getPayMessageHandler() {
if (null == handler){
setPayMessageHandler(new DefaultPayMessageHandler());
}
return handler;
}
/**
* 设置支付消息拦截器
*
* @param interceptor 消息拦截器
* 配合{@link PayService#payBack(Map, InputStream)}进行使用, 做一些预前处理
* <p>
*/
@Override
public void addPayMessageInterceptor(PayMessageInterceptor interceptor) {
interceptors.add(interceptor);
}
/**
* 将请求参数或者请求流转化为 Map
*
* @param parameterMap 请求参数
* @param is 请求流
* @return 获得回调响应信息
*/
@Override
public PayOutMessage payBack(Map<String, String[]> parameterMap, InputStream is) {
Map<String, Object> data = getParameter2Map(parameterMap, is);
LOG.debug("回调响应:" + JSON.toJSONString(data));
if (!verify(data)){
return getPayOutMessage("fail", "失败");
}
PayMessage payMessage = new PayMessage(data);
Map<String, Object> context = new HashMap<String, Object>();
for (PayMessageInterceptor interceptor : interceptors){
if (!interceptor.intercept(payMessage, context, this)){
return successPayOutMessage(payMessage);
}
}
return getPayMessageHandler().handle(payMessage, context, this);
}
}

View File

@@ -154,24 +154,6 @@ import java.util.concurrent.locks.Lock;
boolean isTest();
/**
* 设置支付消息处理器,这里用于处理具体的支付业务
* @param handler 消息处理器
* 配合{@link com.egzosn.pay.common.api.PayService#payBack(java.util.Map, java.io.InputStream)}进行使用
*
* 默认使用{@link com.egzosn.pay.common.api.DefaultPayMessageHandler }进行实现
*
*/
void setPayMessageHandler(PayMessageHandler handler);
/**
* 获取支付消息处理器,这里用于处理具体的支付业务
* 配合{@link com.egzosn.pay.common.api.PayService#payBack(java.util.Map, java.io.InputStream)}进行使用
*
* 默认使用{@link com.egzosn.pay.common.api.DefaultPayMessageHandler }进行实现
*
*/
PayMessageHandler getPayMessageHandler();
}

View File

@@ -7,15 +7,16 @@ import com.egzosn.pay.common.exception.PayErrorException;
import java.util.Map;
/**
* 支付消息拦截器,可以用来做验证
* 支付消息拦截器,可以用来做验证等等,使用者想怎么用就怎么用吧,你也可以选择不用
*
* @author egan
* <pre>
* email egzosn@gmail.com
* date 2016-6-1 11:40:30
* <pre>
* email egzosn@gmail.com
* date 2016-6-1 11:40:30
*
*
* source Daniel Qian
* </pre>
* source Daniel Qian
* </pre>
*/
public interface PayMessageInterceptor {
@@ -23,13 +24,13 @@ public interface PayMessageInterceptor {
* 拦截微信消息
*
* @param payMessage 支付消息
* @param context 上下文如果handler或interceptor之间有信息要传递可以用这个
* @param context 上下文如果handler或interceptor之间有信息要传递可以用这个
* @param payService 支付服务
* @return true代表OKfalse代表不OK
*/
boolean intercept(PayMessage payMessage,
Map<String, Object> context,
PayService payService
) throws PayErrorException;
boolean intercept(PayMessage payMessage,
Map<String, Object> context,
PayService payService
) throws PayErrorException;
}

View File

@@ -9,6 +9,7 @@ import java.awt.image.BufferedImage;
import java.io.InputStream;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
@@ -370,4 +371,24 @@ public interface PayService<PC extends PayConfigStorage> {
*/
PayOutMessage payBack(Map<String, String[]> parameterMap, InputStream is);
/**
* 设置支付消息处理器,这里用于处理具体的支付业务
* @param handler 消息处理器
* 配合{@link com.egzosn.pay.common.api.PayService#payBack(java.util.Map, java.io.InputStream)}进行使用
*
* 默认使用{@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 }进行实现
*
*/
void addPayMessageInterceptor(PayMessageInterceptor interceptor);
}