diff --git a/pay-java-ali/src/main/java/in/egan/pay/ali/api/AliPayService.java b/pay-java-ali/src/main/java/in/egan/pay/ali/api/AliPayService.java index db87ad8..3a92e65 100644 --- a/pay-java-ali/src/main/java/in/egan/pay/ali/api/AliPayService.java +++ b/pay-java-ali/src/main/java/in/egan/pay/ali/api/AliPayService.java @@ -36,8 +36,8 @@ public class AliPayService extends BasePayService { protected final Log log = LogFactory.getLog(AliPayService.class); - private String httpsReqUrl = "https://openapi.alipay.com/gateway.do"; -// private String httpsReqUrl = "https://openapi.alipaydev.com/gateway.do"; +// private String httpsReqUrl = "https://openapi.alipay.com/gateway.do"; + private String httpsReqUrl = "https://openapi.alipaydev.com/gateway.do"; private String httpsReqUrlBefore = "https://mapi.alipay.com/gateway.do"; public AliPayService(PayConfigStorage payConfigStorage, HttpConfigStorage configStorage) { @@ -388,9 +388,9 @@ public class AliPayService extends BasePayService { } @Override - public Map refund(String tradeNo, String outTradeNo) { + public Map refund(String tradeNo, String outTradeNo, BigDecimal refundAmount, BigDecimal totalAmount) { - return refund(tradeNo, outTradeNo, new Callback>() { + return refund(tradeNo, outTradeNo, refundAmount, totalAmount, new Callback>() { @Override public Map perform(Map map) { return map; @@ -399,8 +399,17 @@ public class AliPayService extends BasePayService { } @Override - public T refund(String tradeNo, String outTradeNo, Callback callback) { - return secondaryInterface(tradeNo, outTradeNo, AliTransactionType.REFUND, callback); + public T refund(String tradeNo, String outTradeNo, BigDecimal refundAmount, BigDecimal totalAmount, Callback callback) { + //获取公共参数 + Map parameters = getPublicParameters(AliTransactionType.REFUND); + + Map bizContent = getBizContent(tradeNo, outTradeNo, null); + bizContent.put("refund_amount", refundAmount); + //设置请求参数的集合 + parameters.put("biz_content", JSON.toJSONString(bizContent)); + //设置签名 + setSign(parameters); + return callback.perform(requestTemplate.getForObject(httpsReqUrl + "?" + ClientHttpRequest.getMapToParameters(parameters), JSONObject.class)); } @Override @@ -473,6 +482,11 @@ public class AliPayService extends BasePayService { */ @Override public T secondaryInterface(Object tradeNoOrBillDate, String outTradeNoBillType, TransactionType transactionType, Callback callback) { + + if (transactionType == AliTransactionType.REFUND){ + throw new PayErrorException(new PayException("failure", "通用接口不支持:" + transactionType)); + } + if (transactionType == AliTransactionType.DOWNLOADBILL){ if (tradeNoOrBillDate instanceof Date){ return downloadbill((Date) tradeNoOrBillDate, outTradeNoBillType, callback); @@ -495,20 +509,34 @@ public class AliPayService extends BasePayService { } /** - * 获取biz_content。不包含下载账单 + * 获取biz_content。请求参数的集合 不包含下载账单 * @param tradeNo 支付平台订单号 * @param outTradeNo 商户单号 + * @param bizContent 请求参数的集合 * @return */ - private String getContentToJson(String tradeNo, String outTradeNo){ - Map bizContent = new TreeMap<>(); + private Map getBizContent(String tradeNo, String outTradeNo, Map bizContent){ + if (null == bizContent){ + bizContent = new TreeMap<>(); + } if (null != outTradeNo){ bizContent.put("out_trade_no", outTradeNo); } if (null != tradeNo){ bizContent.put("trade_no", tradeNo); } - return JSON.toJSONString(bizContent); + return bizContent; + } + + /** + * 获取biz_content。不包含下载账单 + * @param tradeNo 支付平台订单号 + * @param outTradeNo 商户单号 + * @return + */ + private String getContentToJson(String tradeNo, String outTradeNo){ + + return JSON.toJSONString(getBizContent(tradeNo, outTradeNo, null)); } } diff --git a/pay-java-common/src/main/java/in/egan/pay/common/api/PayService.java b/pay-java-common/src/main/java/in/egan/pay/common/api/PayService.java index 61fce52..2363819 100644 --- a/pay-java-common/src/main/java/in/egan/pay/common/api/PayService.java +++ b/pay-java-common/src/main/java/in/egan/pay/common/api/PayService.java @@ -9,6 +9,7 @@ import in.egan.pay.common.http.HttpRequestTemplate; import java.awt.image.BufferedImage; import java.io.InputStream; +import java.math.BigDecimal; import java.util.Date; import java.util.Map; @@ -179,23 +180,27 @@ public interface PayService { T close(String tradeNo, String outTradeNo, Callback callback); /** - * 交易关闭接口 + * 申请退款接口 * * @param tradeNo 支付平台订单号 * @param outTradeNo 商户单号 + * @param refundAmount 退款金额 + * @param totalAmount 总金额 * @return */ - Map refund(String tradeNo, String outTradeNo); + Map refund(String tradeNo, String outTradeNo, BigDecimal refundAmount, BigDecimal totalAmount); /** - * 交易关闭接口 + * 申请退款接口 * * @param tradeNo 支付平台订单号 * @param outTradeNo 商户单号 + * @param refundAmount 退款金额 + * @param totalAmount 总金额 * @param callback 处理器 * @param 返回类型 * @return */ - T refund(String tradeNo, String outTradeNo, Callback callback); + T refund(String tradeNo, String outTradeNo, BigDecimal refundAmount, BigDecimal totalAmount, Callback callback); /** * 查询退款 diff --git a/pay-java-demo/src/main/java/in/egan/pay/demo/entity/PayType.java b/pay-java-demo/src/main/java/in/egan/pay/demo/entity/PayType.java index 6631eb0..2dab958 100644 --- a/pay-java-demo/src/main/java/in/egan/pay/demo/entity/PayType.java +++ b/pay-java-demo/src/main/java/in/egan/pay/demo/entity/PayType.java @@ -1,8 +1,8 @@ package in.egan.pay.demo.entity; import in.egan.pay.ali.api.AliPayConfigStorage; -import in.egan.pay.ali.before.api.AliPayService; -import in.egan.pay.ali.before.bean.AliTransactionType; +import in.egan.pay.ali.api.AliPayService; +import in.egan.pay.ali.bean.AliTransactionType; import in.egan.pay.common.api.PayService; import in.egan.pay.common.bean.BasePayType; import in.egan.pay.common.bean.TransactionType; diff --git a/pay-java-wx-youdian/src/main/java/in/egan/pay/wx/youdian/api/WxYouDianPayService.java b/pay-java-wx-youdian/src/main/java/in/egan/pay/wx/youdian/api/WxYouDianPayService.java index 664cf42..ada3a3b 100644 --- a/pay-java-wx-youdian/src/main/java/in/egan/pay/wx/youdian/api/WxYouDianPayService.java +++ b/pay-java-wx-youdian/src/main/java/in/egan/pay/wx/youdian/api/WxYouDianPayService.java @@ -387,12 +387,12 @@ public class WxYouDianPayService extends BasePayService { } @Override - public Map refund(String tradeNo, String outTradeNo) { + public Map refund(String tradeNo, String outTradeNo, BigDecimal refundAmount, BigDecimal totalAmount) { return null; } @Override - public T refund(String tradeNo, String outTradeNo, Callback callback) { + public T refund(String tradeNo, String outTradeNo, BigDecimal refundAmount, BigDecimal totalAmount, Callback callback) { return null; } diff --git a/pay-java-wx/src/main/java/in/egan/pay/wx/api/WxPayService.java b/pay-java-wx/src/main/java/in/egan/pay/wx/api/WxPayService.java index 8455717..c21aed1 100644 --- a/pay-java-wx/src/main/java/in/egan/pay/wx/api/WxPayService.java +++ b/pay-java-wx/src/main/java/in/egan/pay/wx/api/WxPayService.java @@ -41,9 +41,8 @@ public class WxPayService extends BasePayService { public final static String httpsVerifyUrl = "https://gw.tenpay.com/gateway"; - public final static String uri = "https://api.mch.weixin.qq.com/"; - public final static String unifiedOrderUrl = "https://api.mch.weixin.qq.com/pay/unifiedorder"; +// public final static String unifiedOrderUrl = "https://api.mch.weixin.qq.com/pay/unifiedorder"; // public final static String orderqueryUrl = "https://api.mch.weixin.qq.com/pay/orderquery"; @@ -257,14 +256,14 @@ public class WxPayService extends BasePayService { /** * 交易查询接口 - * @param tradeNo 支付平台订单号 + * @param transactionId 支付平台订单号 * @param outTradeNo 商户单号 * @return */ @Override - public Map query(String tradeNo, String outTradeNo) { + public Map query(String transactionId, String outTradeNo) { - return query(tradeNo, outTradeNo, new Callback>() { + return query(transactionId, outTradeNo, new Callback>() { @Override public Map perform(Map map) { return map; @@ -274,23 +273,23 @@ public class WxPayService extends BasePayService { /** * - * @param tradeNo 支付平台订单号 + * @param transactionId 支付平台订单号 * @param outTradeNo 商户单号 * @param callback 处理器 * @param * @return */ @Override - public T query(String tradeNo, String outTradeNo, Callback callback) { + public T query(String transactionId, String outTradeNo, Callback callback) { - return secondaryInterface(tradeNo, outTradeNo, WxTransactionType.QUERY, callback); + return secondaryInterface(transactionId, outTradeNo, WxTransactionType.QUERY, callback); } @Override - public Map close(String tradeNo, String outTradeNo) { + public Map close(String transactionId, String outTradeNo) { - return close(tradeNo, outTradeNo, new Callback>() { + return close(transactionId, outTradeNo, new Callback>() { @Override public Map perform(Map map) { return map; @@ -299,14 +298,64 @@ public class WxPayService extends BasePayService { } @Override - public T close(String tradeNo, String outTradeNo, Callback callback) { - return secondaryInterface(tradeNo, outTradeNo, WxTransactionType.CLOSE, callback); + public T close(String transactionId, String outTradeNo, Callback callback) { + return secondaryInterface(transactionId, outTradeNo, WxTransactionType.CLOSE, callback); + } + + /** + * 退款 + * @param transactionId 微信订单号 + * @param outTradeNo 商户单号 + * @param refundAmount 退款金额 + * @param totalAmount 总金额 + * @return + */ + @Override + public Map refund(String transactionId, String outTradeNo, BigDecimal refundAmount, BigDecimal totalAmount) { + + return refund(transactionId, outTradeNo, refundAmount, totalAmount, new Callback>() { + @Override + public Map perform(Map map) { + return map; + } + }); + } + + /** + * 退款 + * + * @param transactionId 微信订单号 + * @param outTradeNo 商户单号 + * @param refundAmount 退款金额 + * @param totalAmount 总金额 + * @param callback 处理器 + * @param + * @return + */ + @Override + public T refund(String transactionId, String outTradeNo, BigDecimal refundAmount, BigDecimal totalAmount, Callback callback) { + + //获取公共参数 + Map parameters = getPublicParameters(); + if (null != transactionId) { + parameters.put("transaction_id", transactionId); + parameters.put("out_refund_no", transactionId); + } else { + parameters.put("out_trade_no", outTradeNo); + parameters.put("out_refund_no", outTradeNo); + } + parameters.put("total_fee", totalAmount); + parameters.put("refund_fee", refundAmount); + parameters.put("op_user_id", payConfigStorage.getPid()); + + //设置签名 + setSign(parameters); + return callback.perform(requestTemplate.postForObject(getUrl(WxTransactionType.REFUND), XML.getMap2Xml(parameters), JSONObject.class)); } @Override - public Map refund(String tradeNo, String outTradeNo) { - - return refund(tradeNo, outTradeNo, new Callback>() { + public Map refundquery(String transactionId, String outTradeNo) { + return refundquery(transactionId, outTradeNo, new Callback>() { @Override public Map perform(Map map) { return map; @@ -315,23 +364,8 @@ public class WxPayService extends BasePayService { } @Override - public T refund(String tradeNo, String outTradeNo, Callback callback) { - return secondaryInterface(tradeNo, outTradeNo, WxTransactionType.REFUND, callback); - } - - @Override - public Map refundquery(String tradeNo, String outTradeNo) { - return refundquery(tradeNo, outTradeNo, new Callback>() { - @Override - public Map perform(Map map) { - return map; - } - }); - } - - @Override - public T refundquery(String tradeNo, String outTradeNo, Callback callback) { - return secondaryInterface(tradeNo, outTradeNo, WxTransactionType.REFUNDQUERY, callback); + public T refundquery(String transactionId, String outTradeNo, Callback callback) { + return secondaryInterface(transactionId, outTradeNo, WxTransactionType.REFUNDQUERY, callback); } /** @@ -378,6 +412,11 @@ public class WxPayService extends BasePayService { @Override public T secondaryInterface(Object transactionIdOrBillDate, String outTradeNoBillType, TransactionType transactionType, Callback callback) { + if (transactionType == WxTransactionType.REFUND){ + throw new PayErrorException(new PayException("failure", "通用接口不支持:" + transactionType)); + } + + if (transactionType == WxTransactionType.DOWNLOADBILL){ if (transactionIdOrBillDate instanceof Date){ return downloadbill((Date) transactionIdOrBillDate, outTradeNoBillType, callback);