diff --git a/pay-java-common/src/main/java/com/egzosn/pay/common/api/BasePayService.java b/pay-java-common/src/main/java/com/egzosn/pay/common/api/BasePayService.java index a8894eb..ed8e109 100644 --- a/pay-java-common/src/main/java/com/egzosn/pay/common/api/BasePayService.java +++ b/pay-java-common/src/main/java/com/egzosn/pay/common/api/BasePayService.java @@ -17,13 +17,14 @@ import java.util.*; /** * 支付基础服务 + * * @author: egan - *
+ * 
  *      email egzosn@gmail.com
  *      date 2017/3/5 20:36
  *   
*/ -public abstract class BasePayService implements PayService { +public abstract class BasePayService implements PayService { protected final Log LOG = LogFactory.getLog(getClass()); protected PC payConfigStorage; @@ -38,10 +39,12 @@ public abstract class BasePayService implements Pay /** * 支付消息拦截器 */ - protected List interceptors = new ArrayList();; + protected List interceptors = new ArrayList(); + ; /** * 设置支付配置 + * * @param payConfigStorage 支付配置 */ @Override @@ -54,6 +57,7 @@ public abstract class BasePayService implements Pay public PC getPayConfigStorage() { return payConfigStorage; } + @Override public HttpRequestTemplate getHttpRequestTemplate() { return requestTemplate; @@ -61,6 +65,7 @@ public abstract class BasePayService implements Pay /** * 设置并创建请求模版, 代理请求配置这里是否合理??, + * * @param configStorage http请求配置 * @return 支付服务 */ @@ -82,17 +87,18 @@ public abstract class BasePayService 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 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 implements Pay */ @Override public String createSign(Map 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 implements Pay * @return 获得回调的请求参数 */ @Override - public Map getParameter2Map (Map parameterMap, InputStream is) { + public Map getParameter2Map(Map parameterMap, InputStream is) { - Map params = new TreeMap(); - for (Map.Entry entry : parameterMap.entrySet()) { + Map params = new TreeMap(); + for (Map.Entry 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 implements Pay /** * 交易查询接口,带处理器 + * * @param tradeNo 支付平台订单号 * @param outTradeNo 商户单号 - * @param callback 处理器 - * @param 返回类型 - * @return 返回查询回来的结果集 + * @param callback 处理器 + * @param 返回类型 + * @return 返回查询回来的结果集 */ @Override public T query(String tradeNo, String outTradeNo, Callback callback) { @@ -186,26 +194,27 @@ public abstract class BasePayService implements Pay * * @param tradeNo 支付平台订单号 * @param outTradeNo 商户单号 - * @param callback 处理器 - * @param 返回类型 + * @param callback 处理器 + * @param 返回类型 * @return 返回支付方交易关闭后的结果 */ @Override public T close(String tradeNo, String outTradeNo, Callback callback) { - return callback.perform(close(tradeNo, outTradeNo)); + return callback.perform(close(tradeNo, outTradeNo)); } + /** * 交易撤销 * * @param tradeNo 支付平台订单号 * @param outTradeNo 商户单号 - * @param callback 处理器 - * @param 返回类型 + * @param callback 处理器 + * @param 返回类型 * @return 返回支付方交易撤销后的结果 */ @Override public T cancel(String tradeNo, String outTradeNo, Callback callback) { - return callback.perform(close(tradeNo, outTradeNo)); + return callback.perform(close(tradeNo, outTradeNo)); } /** @@ -229,7 +238,6 @@ public abstract class BasePayService implements Pay * @param totalAmount 总金额 * @param callback 处理器 * @param 返回类型 - * * @return 处理过后的类型对象, 返回支付方申请退款后的结果 * @see #refund(RefundOrder, Callback) */ @@ -243,16 +251,15 @@ public abstract class BasePayService implements Pay /** * 申请退款接口 * - * @param refundOrder 退款订单信息 - * @return 返回支付方申请退款后的结果 - * @param callback 处理器 - * @param 返回类型 + * @param refundOrder 退款订单信息 + * @param callback 处理器 + * @param 返回类型 * @return 返回支付方申请退款后的结果 */ @Override public T refund(RefundOrder refundOrder, Callback callback) { - return callback.perform(refund(refundOrder)); + return callback.perform(refund(refundOrder)); } @@ -263,7 +270,6 @@ public abstract class BasePayService implements Pay * @param outTradeNo 商户单号 * @param callback 处理器 * @param 返回类型 - * * @return 处理过后的类型对象,返回支付方查询退款后的结果 */ @Override @@ -274,13 +280,13 @@ public abstract class BasePayService implements Pay /** * 查询退款 * - * @param refundOrder 退款订单信息 - * @param callback 处理器 - * @param 返回类型 + * @param refundOrder 退款订单信息 + * @param callback 处理器 + * @param 返回类型 * @return 返回支付方查询退款后的结果 */ @Override - public T refundquery(RefundOrder refundOrder, Callback callback){ + public T refundquery(RefundOrder refundOrder, Callback callback) { return callback.perform(refundquery(refundOrder)); } @@ -291,7 +297,6 @@ public abstract class BasePayService implements Pay * @param billType 账单类型,具体请查看对应支付平台 * @param callback 处理器 * @param 返回类型 - * * @return 返回支付方下载对账单的结果 */ @Override @@ -300,15 +305,15 @@ public abstract class BasePayService implements Pay } /** - * @param tradeNoOrBillDate 支付平台订单号或者账单类型, 具体请 类型为{@link String }或者 {@link Date },类型须强制限制,类型不对应则抛出异常{@link PayErrorException} - * @param outTradeNoBillType 商户单号或者 账单类型 - * @param transactionType 交易类型 - * @param callback 处理器 - * @param 返回类型 + * @param tradeNoOrBillDate 支付平台订单号或者账单类型, 具体请 类型为{@link String }或者 {@link Date },类型须强制限制,类型不对应则抛出异常{@link PayErrorException} + * @param outTradeNoBillType 商户单号或者 账单类型 + * @param transactionType 交易类型 + * @param callback 处理器 + * @param 返回类型 * @return 返回支付方对应接口的结果 */ @Override - public T secondaryInterface(Object tradeNoOrBillDate, String outTradeNoBillType, TransactionType transactionType, Callback callback){ + public T secondaryInterface(Object tradeNoOrBillDate, String outTradeNoBillType, TransactionType transactionType, Callback callback) { return callback.perform(secondaryInterface(tradeNoOrBillDate, outTradeNoBillType, transactionType)); } @@ -317,7 +322,6 @@ public abstract class BasePayService implements Pay * * @param order 转账订单 * @param callback 处理器 - * * @return 对应的转账结果 */ @Override @@ -330,7 +334,6 @@ public abstract class BasePayService implements Pay * 转账 * * @param order 转账订单 - * * @return 对应的转账结果 */ @Override @@ -341,27 +344,26 @@ public abstract class BasePayService implements Pay /** * 转账查询 * - * @param outNo 商户转账订单号 + * @param outNo 商户转账订单号 * @param tradeNo 支付平台转账订单号 - * * @return 对应的转账订单 */ @Override - public Map transferQuery(String outNo, String tradeNo){ + public Map transferQuery(String outNo, String tradeNo) { return new HashMap<>(0); } /** * 转账查询 * - * @param outNo 商户转账订单号 - * @param tradeNo 支付平台转账订单号 + * @param outNo 商户转账订单号 + * @param tradeNo 支付平台转账订单号 * @param callback 处理器 - * @param 返回类型 + * @param 返回类型 * @return 对应的转账订单 */ @Override - public T transferQuery(String outNo, String tradeNo, Callback callback){ + public T transferQuery(String outNo, String tradeNo, Callback callback) { return callback.perform(transferQuery(outNo, tradeNo)); } @@ -382,11 +384,11 @@ public abstract class BasePayService implements Pay * 获取支付消息处理器,这里用于处理具体的支付业务 * 配合{@link PayService#payBack(Map, InputStream)}进行使用 *

- * @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 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 context = new HashMap(); - 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 message) { + return new PayMessage(message); + } } diff --git a/pay-java-common/src/main/java/com/egzosn/pay/common/api/PayMessageHandler.java b/pay-java-common/src/main/java/com/egzosn/pay/common/api/PayMessageHandler.java index 5485d84..53485a7 100644 --- a/pay-java-common/src/main/java/com/egzosn/pay/common/api/PayMessageHandler.java +++ b/pay-java-common/src/main/java/com/egzosn/pay/common/api/PayMessageHandler.java @@ -19,7 +19,7 @@ import java.util.Map; * source Daniel Qian *

*/ -public interface PayMessageHandler { +public interface PayMessageHandler { /** * 处理支付回调消息的处理器接口 @@ -29,9 +29,9 @@ public interface PayMessageHandler { * @return xml,text格式的消息,如果在异步规则里处理的话,可以返回null * @throws PayErrorException 支付错误异常 */ - PayOutMessage handle(PayMessage payMessage, + PayOutMessage handle(M payMessage, Map context, - PayService payService + S payService ) throws PayErrorException; } diff --git a/pay-java-common/src/main/java/com/egzosn/pay/common/api/PayMessageInterceptor.java b/pay-java-common/src/main/java/com/egzosn/pay/common/api/PayMessageInterceptor.java index bcec731..69b7f4d 100644 --- a/pay-java-common/src/main/java/com/egzosn/pay/common/api/PayMessageInterceptor.java +++ b/pay-java-common/src/main/java/com/egzosn/pay/common/api/PayMessageInterceptor.java @@ -18,7 +18,7 @@ import java.util.Map; * source Daniel Qian * */ -public interface PayMessageInterceptor { +public interface PayMessageInterceptor { /** * 拦截微信消息 @@ -28,9 +28,9 @@ public interface PayMessageInterceptor { * @param payService 支付服务 * @return true代表OK,false代表不OK */ - boolean intercept(PayMessage payMessage, + boolean intercept(M payMessage, Map context, - PayService payService + S payService ) throws PayErrorException; } diff --git a/pay-java-common/src/main/java/com/egzosn/pay/common/api/PayMessageRouter.java b/pay-java-common/src/main/java/com/egzosn/pay/common/api/PayMessageRouter.java index 4675b71..3a54246 100644 --- a/pay-java-common/src/main/java/com/egzosn/pay/common/api/PayMessageRouter.java +++ b/pay-java-common/src/main/java/com/egzosn/pay/common/api/PayMessageRouter.java @@ -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; /** *
  * 支付消息路由器,通过代码化的配置,把来自支付的消息交给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
  * 
- * @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 rules = new ArrayList(); - /** - * 支付服务 - */ - 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 rules = new ArrayList(); + /** + * 支付服务 + */ + 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(); + } - /** - *
-   * 设置自定义的 {@link ExecutorService}
-   * 如果不调用用该方法,默认使 Executors.newFixedThreadPool(100)
-   * 
- * @param executorService 异步线程处理器 - */ - public void setExecutorService(ExecutorService executorService) { - this.executorService = executorService; - } + /** + *
+     * 设置自定义的 {@link ExecutorService}
+     * 如果不调用用该方法,默认使 Executors.newFixedThreadPool(100)
+     * 
+ * + * @param executorService 异步线程处理器 + */ + public void setExecutorService(ExecutorService executorService) { + this.executorService = executorService; + } + /** + *
+     * 设置自定义的{@link PayErrorExceptionHandler}
+     * 如果不调用该方法,默认使用 {@link LogExceptionHandler}
+     * 
+ * + * @param exceptionHandler 异常处理器 + */ + public void setExceptionHandler(PayErrorExceptionHandler exceptionHandler) { + this.exceptionHandler = exceptionHandler; + } - /** - *
-   * 设置自定义的{@link PayErrorExceptionHandler}
-   * 如果不调用该方法,默认使用 {@link LogExceptionHandler}
-   * 
- * @param exceptionHandler 异常处理器 - */ - public void setExceptionHandler(PayErrorExceptionHandler exceptionHandler) { - this.exceptionHandler = exceptionHandler; - } + /** + * 获取所有的规则 + * + * @return 规则 + */ + List getRules() { + return this.rules; + } - /** - * 获取所有的规则 - * @return 规则 - */ - List 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 matchRules = new ArrayList(); - // 收集匹配的规则 - for (final PayMessageRouterRule rule : rules) { - if (rule.test(payMessage)) { - matchRules.add(rule); - if(!rule.isReEnter()) { - break; + /** + * 处理支付消息 + * + * @param payMessage 支付消息 + * @return 支付输出结果 + */ + public PayOutMessage route(Map 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 futures = new ArrayList(); - 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 matchRules = new ArrayList(); + // 收集匹配的规则 + 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 futures = new ArrayList(); + 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; - } } diff --git a/pay-java-common/src/main/java/com/egzosn/pay/common/api/PayService.java b/pay-java-common/src/main/java/com/egzosn/pay/common/api/PayService.java index c0eb4ef..0c7f73d 100644 --- a/pay-java-common/src/main/java/com/egzosn/pay/common/api/PayService.java +++ b/pay-java-common/src/main/java/com/egzosn/pay/common/api/PayService.java @@ -15,17 +15,17 @@ import java.util.Map; * 支付服务 * * @author egan - *
- * email egzosn@gmail.com
- * date 2016-5-18 14:09:01
- *
+ *
+ *         email egzosn@gmail.com
+ *         date 2016-5-18 14:09:01
+ *         
*/ public interface PayService { - /** * 设置支付配置 + * * @param payConfigStorage 支付配置 * @return 支付服务 */ @@ -37,6 +37,7 @@ public interface PayService { * @return 支付配置 */ PC getPayConfigStorage(); + /** * 获取http请求工具 * @@ -46,8 +47,9 @@ public interface PayService { /** * 设置 请求工具配置 设置并创建请求模版, 代理请求配置这里是否合理??, + * * @param configStorage http请求配置 - * @return 支付服务 + * @return 支付服务 */ PayService setRequestTemplateConfigStorage(HttpConfigStorage configStorage); @@ -72,6 +74,7 @@ public interface PayService { /** * 支付宝需要,微信是否也需要再次校验来源,进行订单查询 * 校验数据来源 + * * @param id 业务id, 数据的真实性. * @return true通过 */ @@ -85,14 +88,16 @@ public interface PayService { * @return 订单信息 * @see PayOrder 支付订单信息 */ - Map orderInfo(PayOrder order); + Map orderInfo(PayOrder order); /** * 页面转跳支付, 返回对应页面重定向信息 + * * @param order 订单信息 * @return 对应页面重定向信息 */ String toPay(PayOrder order); + /** * 创建签名 * @@ -123,7 +128,7 @@ public interface PayService { /** * 获取输出消息,用户返回给支付端 * - * @param code 状态 + * @param code 状态 * @param message 消息 * @return 返回输出消息 */ @@ -132,6 +137,7 @@ public interface PayService { /** * 获取成功输出消息,用户返回给支付端 * 主要用于拦截器中返回 + * * @param payMessage 支付回调消息 * @return 返回输出消息 */ @@ -148,7 +154,6 @@ public interface PayService { String buildRequest(Map orderInfo, MethodType method); - /** * 获取输出二维码,用户返回给支付端, * @@ -163,7 +168,7 @@ public interface PayService { * @param order 发起支付的订单信息 * @return 返回支付结果 */ - Map microPay(PayOrder order); + Map microPay(PayOrder order); /** * 交易查询接口 @@ -176,13 +181,14 @@ public interface PayService { /** * 交易查询接口,带处理器 + * * @param tradeNo 支付平台订单号 * @param outTradeNo 商户单号 - * @param callback 处理器 - * @param 返回类型 - * @return 返回查询回来的结果集 + * @param callback 处理器 + * @param 返回类型 + * @return 返回查询回来的结果集 */ - T query(String tradeNo, String outTradeNo, Callback callback); + T query(String tradeNo, String outTradeNo, Callback callback); /** * 交易关闭接口 @@ -199,11 +205,11 @@ public interface PayService { * * @param tradeNo 支付平台订单号 * @param outTradeNo 商户单号 - * @param callback 处理器 - * @param 返回类型 + * @param callback 处理器 + * @param 返回类型 * @return 返回支付方交易关闭后的结果 */ - T close(String tradeNo, String outTradeNo, Callback callback); + T close(String tradeNo, String outTradeNo, Callback callback); /** * 交易交易撤销 @@ -219,55 +225,59 @@ public interface PayService { * * @param tradeNo 支付平台订单号 * @param outTradeNo 商户单号 - * @param callback 处理器 - * @param 返回类型 + * @param callback 处理器 + * @param 返回类型 * @return 返回支付方交易撤销后的结果 */ - T cancel(String tradeNo, String outTradeNo, Callback callback); + T cancel(String tradeNo, String outTradeNo, Callback callback); /** * 申请退款接口 * 废弃 - * @param tradeNo 支付平台订单号 - * @param outTradeNo 商户单号 + * + * @param tradeNo 支付平台订单号 + * @param outTradeNo 商户单号 * @param refundAmount 退款金额 - * @param totalAmount 总金额 + * @param totalAmount 总金额 * @return 返回支付方申请退款后的结果 * @see #refund(RefundOrder) */ @Deprecated Map refund(String tradeNo, String outTradeNo, BigDecimal refundAmount, BigDecimal totalAmount); + /** * 申请退款接口 * 废弃 - * @param tradeNo 支付平台订单号 - * @param outTradeNo 商户单号 + * + * @param tradeNo 支付平台订单号 + * @param outTradeNo 商户单号 * @param refundAmount 退款金额 - * @param totalAmount 总金额 - * @param callback 处理器 - * @param 返回类型 + * @param totalAmount 总金额 + * @param callback 处理器 + * @param 返回类型 * @return 返回支付方申请退款后的结果 * @see #refund(RefundOrder, Callback) */ @Deprecated - T refund(String tradeNo, String outTradeNo, BigDecimal refundAmount, BigDecimal totalAmount, Callback callback); + T refund(String tradeNo, String outTradeNo, BigDecimal refundAmount, BigDecimal totalAmount, Callback callback); /** * 申请退款接口 * - * @param refundOrder 退款订单信息 + * @param refundOrder 退款订单信息 * @return 返回支付方申请退款后的结果 */ Map refund(RefundOrder refundOrder); + /** * 申请退款接口 * - * @param refundOrder 退款订单信息 - * @param callback 处理器 - * @param 返回类型 + * @param refundOrder 退款订单信息 + * @param callback 处理器 + * @param 返回类型 * @return 返回支付方申请退款后的结果 */ - T refund(RefundOrder refundOrder, Callback callback); + T refund(RefundOrder refundOrder, Callback callback); /** * 查询退款 @@ -278,33 +288,36 @@ public interface PayService { */ @Deprecated Map refundquery(String tradeNo, String outTradeNo); + /** * 查询退款 * * @param tradeNo 支付平台订单号 * @param outTradeNo 商户单号 - * @param callback 处理器 - * @param 返回类型 + * @param callback 处理器 + * @param 返回类型 * @return 返回支付方查询退款后的结果 */ @Deprecated - T refundquery(String tradeNo, String outTradeNo, Callback callback); + T refundquery(String tradeNo, String outTradeNo, Callback callback); + /** * 查询退款 * - * @param refundOrder 退款订单单号信息 + * @param refundOrder 退款订单单号信息 * @return 返回支付方查询退款后的结果 */ Map refundquery(RefundOrder refundOrder); + /** * 查询退款 * - * @param refundOrder 退款订单信息 - * @param callback 处理器 - * @param 返回类型 + * @param refundOrder 退款订单信息 + * @param callback 处理器 + * @param 返回类型 * @return 返回支付方查询退款后的结果 */ - T refundquery(RefundOrder refundOrder, Callback callback); + T refundquery(RefundOrder refundOrder, Callback callback); /** * 下载对账单 @@ -321,18 +334,19 @@ public interface PayService { * @param billDate 账单时间:具体请查看对应支付平台 * @param billType 账单类型,具体请查看对应支付平台 * @param callback 处理器 - * @param 返回类型 + * @param 返回类型 * @return 返回支付方下载对账单的结果 */ - T downloadbill(Date billDate, String billType, Callback callback); + T downloadbill(Date billDate, String billType, Callback 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 secondaryInterface(Object tradeNoOrBillDate, String outTradeNoBillType, TransactionType transactionType); @@ -340,56 +354,56 @@ public interface PayService { /** * 通用查询接口 * - * @param tradeNoOrBillDate 支付平台订单号或者账单日期, 具体请 类型为{@link String }或者 {@link Date },类型须强制限制,类型不对应则抛出异常{@link PayErrorException} - * - * @param outTradeNoBillType 商户单号或者 账单类型 - * @param transactionType 交易类型 - * @param callback 处理器 - * @param 返回类型 + * @param tradeNoOrBillDate 支付平台订单号或者账单日期, 具体请 类型为{@link String }或者 {@link Date },类型须强制限制,类型不对应则抛出异常{@link PayErrorException} + * @param outTradeNoBillType 商户单号或者 账单类型 + * @param transactionType 交易类型 + * @param callback 处理器 + * @param 返回类型 * @return 返回支付方对应接口的结果 */ - T secondaryInterface(Object tradeNoOrBillDate, String outTradeNoBillType, TransactionType transactionType, Callback callback); + T secondaryInterface(Object tradeNoOrBillDate, String outTradeNoBillType, TransactionType transactionType, Callback callback); /** * 转账 + * * @param order 转账订单 * @return 对应的转账结果 */ Map transfer(TransferOrder order); + /** * 转账 - * @param order 转账订单 + * + * @param order 转账订单 * @param callback 处理器 - * @param 返回类型 + * @param 返回类型 * @return 对应的转账结果 */ - T transfer(TransferOrder order, Callback callback); - + T transfer(TransferOrder order, Callback callback); /** * 转账查询 * - * @param outNo 商户转账订单号 + * @param outNo 商户转账订单号 * @param tradeNo 支付平台转账订单号 - * * @return 对应的转账订单 */ - Map transferQuery(String outNo, String tradeNo); + Map transferQuery(String outNo, String tradeNo); /** * 转账查询 * - * @param outNo 商户转账订单号 - * @param tradeNo 支付平台转账订单号 + * @param outNo 商户转账订单号 + * @param tradeNo 支付平台转账订单号 * @param callback 处理器 - * @param 返回类型 + * @param 返回类型 * @return 对应的转账订单 */ - T transferQuery(String outNo, String tradeNo, Callback callback); + T transferQuery(String outNo, String tradeNo, Callback callback); - /** + /** * 将请求参数或者请求流转化为 Map * * @param parameterMap 请求参数 @@ -400,29 +414,36 @@ public interface PayService { /** * 设置支付消息处理器,这里用于处理具体的支付业务 + * * @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)}进行使用 + *

+ * 默认使用{@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)}进行使用 + *

+ * 默认使用{@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 message); } diff --git a/pay-java-common/src/main/java/com/egzosn/pay/common/bean/PayMessage.java b/pay-java-common/src/main/java/com/egzosn/pay/common/bean/PayMessage.java index cff3dc2..1836758 100644 --- a/pay-java-common/src/main/java/com/egzosn/pay/common/bean/PayMessage.java +++ b/pay-java-common/src/main/java/com/egzosn/pay/common/bean/PayMessage.java @@ -24,12 +24,16 @@ public class PayMessage implements Serializable { private String fromPay; private String describe; + + public PayMessage() { + } + public PayMessage(Map payMessage) { this.payMessage = payMessage; } public PayMessage(Map 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 payMessage) { + this.payMessage = payMessage; + } + public String getMsgType() { return msgType; } diff --git a/pay-java-common/src/main/java/com/egzosn/pay/common/util/DateUtils.java b/pay-java-common/src/main/java/com/egzosn/pay/common/util/DateUtils.java index 39081ea..b101b44 100644 --- a/pay-java-common/src/main/java/com/egzosn/pay/common/util/DateUtils.java +++ b/pay-java-common/src/main/java/com/egzosn/pay/common/util/DateUtils.java @@ -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.*; * */ public final class DateUtils { + private DateUtils() { + } + private static final Log LOG = LogFactory.getLog(DateUtils.class); static final class DateFormatHolder { private static final ThreadLocal>> THREADLOCAL_FORMATS = new ThreadLocal>>(); @@ -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); }