diff --git a/pay-java-ali/src/main/java/com/egzosn/pay/ali/api/AliPayService.java b/pay-java-ali/src/main/java/com/egzosn/pay/ali/api/AliPayService.java index dac9ed6..7cc7945 100644 --- a/pay-java-ali/src/main/java/com/egzosn/pay/ali/api/AliPayService.java +++ b/pay-java-ali/src/main/java/com/egzosn/pay/ali/api/AliPayService.java @@ -34,9 +34,13 @@ import java.util.*; public class AliPayService extends BasePayService { protected final Log log = LogFactory.getLog(AliPayService.class); - //正式测试环境 + /** + * 正式测试环境 + */ private final static String httpsReqUrl = "https://openapi.alipay.com/gateway.do"; - //沙箱测试环境账号 + /** + * 沙箱测试环境账号 + */ private final static String devReqUrl = "https://openapi.alipaydev.com/gateway.do"; @@ -291,16 +295,13 @@ public class AliPayService extends BasePayService { @Override public Map microPay(PayOrder order) { Map orderInfo = orderInfo(order); - -// Map content = new HashMap<>(1); -// content.put("biz_content", orderInfo.remove("biz_content")); //预订单 JSONObject result = getHttpRequestTemplate().postForObject(getReqUrl() + "?" + UriVariables.getMapToParameters(orderInfo), null, JSONObject.class); JSONObject response = result.getJSONObject("alipay_trade_pay_response"); - if ("10000".equals(response.getString("code"))){ - return result; + if (!"10000".equals(response.getString("code"))){ + log.info("收款失败"); } - throw new PayErrorException(new PayException(response.getString("code"), response.getString("msg"), result.toJSONString())); + return result; } /** @@ -311,29 +312,11 @@ public class AliPayService extends BasePayService { */ @Override public Map query(String tradeNo, String outTradeNo) { + return secondaryInterface(tradeNo, outTradeNo, AliTransactionType.QUERY); - return query(tradeNo, outTradeNo, new Callback>() { - @Override - public Map perform(Map map) { - return map; - } - }); } - /** - * 交易查询接口,带处理器 - * @param tradeNo 支付平台订单号 - * @param outTradeNo 商户单号 - * @param callback 处理器 - * @param 返回类型 - * @return 返回查询回来的结果集 - */ - @Override - public T query(String tradeNo, String outTradeNo, Callback callback) { - - return secondaryInterface(tradeNo, outTradeNo, AliTransactionType.QUERY, callback); - } /** * 交易关闭接口 @@ -344,27 +327,9 @@ public class AliPayService extends BasePayService { */ @Override public Map close(String tradeNo, String outTradeNo) { + return secondaryInterface(tradeNo, outTradeNo, AliTransactionType.CLOSE); + } - return close(tradeNo, outTradeNo, new Callback>() { - @Override - public Map perform(Map map) { - return map; - } - }); - } - /** - * 交易关闭接口 - * - * @param tradeNo 支付平台订单号 - * @param outTradeNo 商户单号 - * @param callback 处理器 - * @param 返回类型 - * @return 返回支付方交易关闭后的结果 - */ - @Override - public T close(String tradeNo, String outTradeNo, Callback callback) { - return secondaryInterface(tradeNo, outTradeNo, AliTransactionType.CLOSE, callback); - } /** * 申请退款接口 * 废弃 @@ -378,32 +343,9 @@ public class AliPayService extends BasePayService { @Deprecated @Override public Map refund(String tradeNo, String outTradeNo, BigDecimal refundAmount, BigDecimal totalAmount) { - - return refund(tradeNo, outTradeNo, refundAmount, totalAmount, new Callback>() { - @Override - public Map perform(Map map) { - return map; - } - }); + return refund(new RefundOrder(tradeNo, outTradeNo, refundAmount, totalAmount)); } - /** - * 申请退款接口 - * 废弃 - * @param tradeNo 支付平台订单号 - * @param outTradeNo 商户单号 - * @param refundAmount 退款金额 - * @param totalAmount 总金额 - * @param callback 处理器 - * @param 返回类型 - * @return 返回支付方申请退款后的结果 - * @see #refund(RefundOrder, Callback) - */ - @Deprecated - @Override - public T refund(String tradeNo, String outTradeNo, BigDecimal refundAmount, BigDecimal totalAmount, Callback callback) { - return refund(new RefundOrder(tradeNo, outTradeNo, refundAmount, totalAmount), callback); - } /** * 申请退款接口 @@ -413,24 +355,6 @@ public class AliPayService extends BasePayService { */ @Override public Map refund(RefundOrder refundOrder) { - return refund(refundOrder, new Callback>() { - @Override - public Map perform(Map map) { - return map; - } - }); - } - /** - * 申请退款接口 - * - * @param refundOrder 退款订单信息 - * @return 返回支付方申请退款后的结果 - * @param callback 处理器 - * @param 返回类型 - * @return 返回支付方申请退款后的结果 - */ - @Override - public T refund(RefundOrder refundOrder, Callback callback) { //获取公共参数 Map parameters = getPublicParameters(AliTransactionType.REFUND); @@ -443,8 +367,9 @@ public class AliPayService extends BasePayService { parameters.put("biz_content", JSON.toJSONString(bizContent)); //设置签名 setSign(parameters); - return callback.perform(requestTemplate.getForObject(getReqUrl() + "?" + UriVariables.getMapToParameters(parameters), JSONObject.class)); + return requestTemplate.getForObject(getReqUrl() + "?" + UriVariables.getMapToParameters(parameters), JSONObject.class); } + /** * 查询退款 * @@ -461,19 +386,7 @@ public class AliPayService extends BasePayService { } }); } - /** - * 查询退款 - * - * @param tradeNo 支付平台订单号 - * @param outTradeNo 商户单号 - * @param callback 处理器 - * @param 返回类型 - * @return 返回支付方查询退款后的结果 - */ - @Override - public T refundquery(String tradeNo, String outTradeNo, Callback callback) { - return secondaryInterface(tradeNo, outTradeNo, AliTransactionType.REFUNDQUERY, callback); - } + /** * 目前只支持日账单 @@ -483,25 +396,6 @@ public class AliPayService extends BasePayService { */ @Override public Map downloadbill(Date billDate, String billType) { - return downloadbill(billDate, billType, new Callback>() { - @Override - public Map perform(Map map) { - return map; - } - }); - } - - /** - * 目前只支持日账单 - * @param billDate 账单时间:具体请查看对应支付平台 - * @param billType 账单类型,具体请查看对应支付平台 - * @param callback 处理器 - * @param 返回类型 - * @return 返回支付方下载对账单的结果 - */ - @Override - public T downloadbill(Date billDate, String billType, Callback callback) { - //获取公共参数 Map parameters = getPublicParameters(AliTransactionType.DOWNLOADBILL); @@ -515,21 +409,21 @@ public class AliPayService extends BasePayService { parameters.put("biz_content", JSON.toJSONString(bizContent)); //设置签名 setSign(parameters); - return callback.perform(requestTemplate.getForObject(getReqUrl() + "?" + UriVariables.getMapToParameters(parameters), JSONObject.class)); + return requestTemplate.getForObject(getReqUrl() + "?" + UriVariables.getMapToParameters(parameters), JSONObject.class); } + + /** * * @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 Map secondaryInterface(Object tradeNoOrBillDate, String outTradeNoBillType, TransactionType transactionType){ if (transactionType == AliTransactionType.REFUND){ throw new PayErrorException(new PayException("failure", "通用接口不支持:" + transactionType)); @@ -537,7 +431,7 @@ public class AliPayService extends BasePayService { if (transactionType == AliTransactionType.DOWNLOADBILL){ if (tradeNoOrBillDate instanceof Date){ - return downloadbill((Date) tradeNoOrBillDate, outTradeNoBillType, callback); + return downloadbill((Date) tradeNoOrBillDate, outTradeNoBillType); } throw new PayErrorException(new PayException("failure", "非法类型异常:" + tradeNoOrBillDate.getClass())); } @@ -552,8 +446,58 @@ public class AliPayService extends BasePayService { parameters.put("biz_content", getContentToJson(tradeNoOrBillDate.toString(), outTradeNoBillType)); //设置签名 setSign(parameters); - return callback.perform(requestTemplate.getForObject(getReqUrl() + "?" + UriVariables.getMapToParameters(parameters), JSONObject.class)); + return requestTemplate.getForObject(getReqUrl() + "?" + UriVariables.getMapToParameters(parameters), JSONObject.class); + } + /** + * 转账 + * + * @param order 转账订单 + * + * @return 对应的转账结果 + */ + @Override + public Map transfer(TransferOrder order) { + //获取公共参数 + Map parameters = getPublicParameters(AliTransactionType.TRANS); + + Map bizContent = new TreeMap(); + bizContent.put("out_biz_no", order.getOutNo()); + bizContent.put("payee_type", "ALIPAY_LOGONID"); + bizContent.put("payee_account", order.getPayeeAccount()); + bizContent.put("amount", order.getAmount().setScale(2, BigDecimal.ROUND_HALF_UP)); + bizContent.put("payer_show_name", order.getPayerName()); + bizContent.put("payee_real_name", order.getPayeeName()); + bizContent.put("remark", order.getRemark()); + //设置请求参数的集合 + parameters.put("biz_content", JSON.toJSONString(bizContent)); + //设置签名 + setSign(parameters); + return getHttpRequestTemplate().postForObject(getReqUrl() + "?" + UriVariables.getMapToParameters(parameters), null, JSONObject.class); + } + + /** + * 转账 + * + * @param outNo 商户转账订单号 + * @param tradeNo 支付平台转账订单号 + * + * @return 对应的转账订单 + */ + @Override + public Map transferQuery(String outNo, String tradeNo) { + //获取公共参数 + Map parameters = getPublicParameters(AliTransactionType.TRANS_QUERY); + + Map bizContent = new TreeMap(); + if (StringUtils.isEmpty(outNo)){ + bizContent.put("order_id", tradeNo); + }else { + bizContent.put("out_biz_no", outNo); + } + //设置请求参数的集合 + parameters.put("biz_content", JSON.toJSONString(bizContent)); + return getHttpRequestTemplate().postForObject(getReqUrl() + "?" + UriVariables.getMapToParameters(parameters), null, JSONObject.class); } /** diff --git a/pay-java-ali/src/main/java/com/egzosn/pay/ali/bean/AliTransactionType.java b/pay-java-ali/src/main/java/com/egzosn/pay/ali/bean/AliTransactionType.java index 56f0899..b7b5c6b 100644 --- a/pay-java-ali/src/main/java/com/egzosn/pay/ali/bean/AliTransactionType.java +++ b/pay-java-ali/src/main/java/com/egzosn/pay/ali/bean/AliTransactionType.java @@ -64,8 +64,15 @@ public enum AliTransactionType implements TransactionType { /** * 下载对账单 */ - DOWNLOADBILL("alipay.data.dataservice.bill.downloadurl.query") - + DOWNLOADBILL("alipay.data.dataservice.bill.downloadurl.query"), + /** + * 转账到支付宝 + */ + TRANS("alipay.fund.trans.toaccount.transfer"), + /** + * 转账查询 + */ + TRANS_QUERY("alipay.fund.trans.order.query") ; diff --git a/pay-java-ali/src/main/java/com/egzosn/pay/ali/before/api/AliPayService.java b/pay-java-ali/src/main/java/com/egzosn/pay/ali/before/api/AliPayService.java index 8175433..943ee0f 100644 --- a/pay-java-ali/src/main/java/com/egzosn/pay/ali/before/api/AliPayService.java +++ b/pay-java-ali/src/main/java/com/egzosn/pay/ali/before/api/AliPayService.java @@ -321,27 +321,10 @@ public class AliPayService extends BasePayService { @Override public Map query(String tradeNo, String outTradeNo) { - return query(tradeNo, outTradeNo, new Callback>() { - @Override - public Map perform(Map map) { - return map; - } - }); + return secondaryInterface(tradeNo, outTradeNo, AliTransactionType.QUERY); } - /** - * 交易查询接口,带处理器 - * @param tradeNo 支付平台订单号 - * @param outTradeNo 商户单号 - * @param callback 处理器 - * @param 返回类型 - * @return 返回查询回来的结果集 - */ - @Override - public T query(String tradeNo, String outTradeNo, Callback callback) { - return secondaryInterface(tradeNo, outTradeNo, AliTransactionType.QUERY, callback); - } /** * 交易关闭接口 @@ -353,26 +336,9 @@ public class AliPayService extends BasePayService { @Override public Map close(String tradeNo, String outTradeNo) { - return close(tradeNo, outTradeNo, new Callback>() { - @Override - public Map perform(Map map) { - return map; - } - }); - } - /** - * 交易关闭接口 - * - * @param tradeNo 支付平台订单号 - * @param outTradeNo 商户单号 - * @param callback 处理器 - * @param 返回类型 - * @return 返回支付方交易关闭后的结果 - */ - @Override - public T close(String tradeNo, String outTradeNo, Callback callback) { - return secondaryInterface(tradeNo, outTradeNo, AliTransactionType.CLOSE, callback); + return secondaryInterface(tradeNo, outTradeNo, AliTransactionType.CLOSE); } + /** * 申请退款接口 * 废弃 @@ -387,30 +353,7 @@ public class AliPayService extends BasePayService { @Override public Map refund(String tradeNo, String outTradeNo, BigDecimal refundAmount, BigDecimal totalAmount) { - return refund(tradeNo, outTradeNo, refundAmount, totalAmount, new Callback>() { - @Override - public Map perform(Map map) { - return map; - } - }); - } - /** - * 申请退款接口 - * 废弃 - * @param tradeNo 支付平台订单号 - * @param outTradeNo 商户单号 - * @param refundAmount 退款金额 - * @param totalAmount 总金额 - * @param callback 处理器 - * @param 返回类型 - * @return 返回支付方申请退款后的结果 - * @see #refund(RefundOrder, Callback) - */ - @Deprecated - @Override - public T refund(String tradeNo, String outTradeNo, BigDecimal refundAmount, BigDecimal totalAmount, Callback callback) { - - return refund(new RefundOrder(tradeNo, outTradeNo, refundAmount, totalAmount), callback); + return refund(new RefundOrder(tradeNo, outTradeNo, refundAmount, totalAmount)); } /** @@ -421,25 +364,6 @@ public class AliPayService extends BasePayService { */ @Override public Map refund(RefundOrder refundOrder) { - return refund(refundOrder, new Callback>() { - @Override - public Map perform(Map map) { - return map; - } - }); - } - /** - * 申请退款接口 - * - * @param refundOrder 退款订单信息 - * @return 返回支付方申请退款后的结果 - * @param callback 处理器 - * @param 返回类型 - * @return 返回支付方申请退款后的结果 - */ - @Override - public T refund(RefundOrder refundOrder, Callback callback) { - //获取公共参数 Map parameters = getPublicParameters(AliTransactionType.REFUND); Map bizContent = getBizContent(refundOrder.getTradeNo(), refundOrder.getOutTradeNo(), null); @@ -451,7 +375,7 @@ public class AliPayService extends BasePayService { parameters.put("biz_content", JSON.toJSONString(bizContent)); //设置签名 setSign(parameters); - return callback.perform(requestTemplate.getForObject(QUERY_REQ_URL + "?" + UriVariables.getMapToParameters(parameters), JSONObject.class)); + return requestTemplate.getForObject(QUERY_REQ_URL + "?" + UriVariables.getMapToParameters(parameters), JSONObject.class); } /** @@ -463,27 +387,10 @@ public class AliPayService extends BasePayService { */ @Override public Map refundquery(String tradeNo, String outTradeNo) { - return refundquery(tradeNo, outTradeNo, new Callback>() { - @Override - public Map perform(Map map) { - return map; - } - }); + return secondaryInterface(tradeNo, outTradeNo, AliTransactionType.REFUNDQUERY); } - /** - * 查询退款 - * - * @param tradeNo 支付平台订单号 - * @param outTradeNo 商户单号 - * @param callback 处理器 - * @param 返回类型 - * @return 返回支付方查询退款后的结果 - */ - @Override - public T refundquery(String tradeNo, String outTradeNo, Callback callback) { - return secondaryInterface(tradeNo, outTradeNo, AliTransactionType.REFUNDQUERY, callback); - } + /** * 目前只支持日账单 @@ -493,25 +400,6 @@ public class AliPayService extends BasePayService { */ @Override public Map downloadbill(Date billDate, String billType) { - return downloadbill(billDate, billType, new Callback>() { - @Override - public Map perform(Map map) { - return map; - } - }); - } - - /** - * 目前只支持日账单 - * @param billDate 账单时间:具体请查看对应支付平台 - * @param billType 账单类型,具体请查看对应支付平台 - * @param callback 处理器 - * @param 返回类型 - * @return 返回支付方下载对账单的结果 - */ - @Override - public T downloadbill(Date billDate, String billType, Callback callback) { - //获取公共参数 Map parameters = getPublicParameters(AliTransactionType.DOWNLOADBILL); @@ -525,24 +413,23 @@ public class AliPayService extends BasePayService { parameters.put("biz_content", JSON.toJSONString(bizContent)); //设置签名 setSign(parameters); - return callback.perform(requestTemplate.getForObject(QUERY_REQ_URL + "?" + UriVariables.getMapToParameters(parameters), JSONObject.class)); + return requestTemplate.getForObject(QUERY_REQ_URL + "?" + UriVariables.getMapToParameters(parameters), JSONObject.class); } + /** * * @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 Map secondaryInterface(Object tradeNoOrBillDate, String outTradeNoBillType, TransactionType transactionType) { if (transactionType == AliTransactionType.DOWNLOADBILL){ if (tradeNoOrBillDate instanceof Date){ - return downloadbill((Date) tradeNoOrBillDate, outTradeNoBillType, callback); + return downloadbill((Date) tradeNoOrBillDate, outTradeNoBillType); } throw new PayErrorException(new PayException("failure", "非法类型异常:" + tradeNoOrBillDate.getClass())); } @@ -557,10 +444,22 @@ public class AliPayService extends BasePayService { parameters.put("biz_content", getContentToJson(tradeNoOrBillDate.toString(), outTradeNoBillType)); //设置签名 setSign(parameters); - return callback.perform(requestTemplate.getForObject(QUERY_REQ_URL + "?" + UriVariables.getMapToParameters(parameters), JSONObject.class)); + return requestTemplate.getForObject(QUERY_REQ_URL + "?" + UriVariables.getMapToParameters(parameters), JSONObject.class); } + /** + * 转账 + * + * @param order 转账订单 + * + * @return 对应的转账结果 + */ + @Override + public Map transfer(TransferOrder order) { + return null; + } + /** * 获取biz_content。请求参数的集合 不包含下载账单 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 5ac8dc8..2c1a27e 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 @@ -1,14 +1,17 @@ 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.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 java.io.InputStream; import java.io.UnsupportedEncodingException; -import java.util.Iterator; -import java.util.Map; -import java.util.TreeMap; +import java.math.BigDecimal; +import java.util.*; /** * 支付基础服务 @@ -123,4 +126,163 @@ public abstract class BasePayService implements PayService { } + /** + * 交易查询接口,带处理器 + * @param tradeNo 支付平台订单号 + * @param outTradeNo 商户单号 + * @param callback 处理器 + * @param 返回类型 + * @return 返回查询回来的结果集 + */ + @Override + public T query(String tradeNo, String outTradeNo, Callback callback) { + + return callback.perform(query(tradeNo, outTradeNo)); + } + + /** + * 交易关闭接口 + * + * @param tradeNo 支付平台订单号 + * @param outTradeNo 商户单号 + * @param callback 处理器 + * @param 返回类型 + * @return 返回支付方交易关闭后的结果 + */ + @Override + public T close(String tradeNo, String outTradeNo, Callback callback) { + return callback.perform(close(tradeNo, outTradeNo)); + } + + /** + * 退款 + * + * @param tradeNo 支付平台订单号 + * @param outTradeNo 商户单号 + * @param refundAmount 退款金额 + * @param totalAmount 总金额 + * @param callback 处理器 + * @param 返回类型 + * + * @return 处理过后的类型对象, 返回支付方申请退款后的结果 + * @see #refund(RefundOrder, Callback) + */ + @Deprecated + @Override + public T refund(String tradeNo, String outTradeNo, BigDecimal refundAmount, BigDecimal totalAmount, Callback callback) { + + return callback.perform(refund(new RefundOrder(tradeNo, outTradeNo, refundAmount, totalAmount))); + } + + /** + * 申请退款接口 + * + * @param refundOrder 退款订单信息 + * @return 返回支付方申请退款后的结果 + * @param callback 处理器 + * @param 返回类型 + * @return 返回支付方申请退款后的结果 + */ + @Override + public T refund(RefundOrder refundOrder, Callback callback) { + + return callback.perform(refund(refundOrder)); + } + + + /** + * 查询退款 + * + * @param tradeNo 支付平台订单号 + * @param outTradeNo 商户单号 + * @param callback 处理器 + * @param 返回类型 + * + * @return 处理过后的类型对象,返回支付方查询退款后的结果 + */ + @Override + public T refundquery(String tradeNo, String outTradeNo, Callback callback) { + return callback.perform(refundquery(tradeNo, outTradeNo)); + } + + /** + * 目前只支持日账单 + * + * @param billDate 账单时间:具体请查看对应支付平台 + * @param billType 账单类型,具体请查看对应支付平台 + * @param callback 处理器 + * @param 返回类型 + * + * @return 返回支付方下载对账单的结果 + */ + @Override + public T downloadbill(Date billDate, String billType, Callback callback) { + return callback.perform(downloadbill(billDate, billType)); + } + + /** + * @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){ + return callback.perform(secondaryInterface(tradeNoOrBillDate, outTradeNoBillType, transactionType)); + } + + /** + * 转账 + * + * @param order 转账订单 + * @param callback 处理器 + * + * @return 对应的转账结果 + */ + @Override + public T transfer(TransferOrder order, Callback callback) { + return callback.perform(transfer(order)); + } + + + /** + * 转账 + * + * @param order 转账订单 + * + * @return 对应的转账结果 + */ + @Override + public Map transfer(TransferOrder order) { + return new HashMap<>(0); + } + + /** + * 转账 + * + * @param outNo 商户转账订单号 + * @param tradeNo 支付平台转账订单号 + * + * @return 对应的转账订单 + */ + @Override + public Map transferQuery(String outNo, String tradeNo){ + return new HashMap<>(0); + } + + /** + * 转账 + * + * @param outNo 商户转账订单号 + * @param tradeNo 支付平台转账订单号 + * @param callback 处理器 + * @param 返回类型 + * @return 对应的转账订单 + */ + @Override + public T transferQuery(String outNo, String tradeNo, Callback callback){ + return callback.perform(transferQuery(outNo, tradeNo)); + } } 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 51f9fe4..8d8f9ad 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 @@ -266,7 +266,7 @@ public interface PayService { * @param billType 账单类型,商户通过接口或商户经开放平台授权后其所属服务商通过接口可以获取以下账单类型:trade、signcustomer;trade指商户基于支付宝交易收单的业务账单;signcustomer是指基于商户支付宝余额收入及支出等资金变动的帐务账单; * @return 返回支付方下载对账单的结果 */ - Object downloadbill(Date billDate, String billType); + Map downloadbill(Date billDate, String billType); /** * 下载对账单 @@ -279,6 +279,17 @@ public interface PayService { */ T downloadbill(Date billDate, String billType, Callback callback); + + /** + * + * @param tradeNoOrBillDate 支付平台订单号或者账单类型, 具体请 + * 类型为{@link String }或者 {@link Date },类型须强制限制,类型不对应则抛出异常{@link PayErrorException} + * @param outTradeNoBillType 商户单号或者 账单类型 + * @param transactionType 交易类型 + * @return 返回支付方对应接口的结果 + */ + Map secondaryInterface(Object tradeNoOrBillDate, String outTradeNoBillType, TransactionType transactionType); + /** * 通用查询接口 * @@ -293,6 +304,44 @@ public interface PayService { T secondaryInterface(Object tradeNoOrBillDate, String outTradeNoBillType, TransactionType transactionType, Callback callback); + /** + * 转账 + * @param order 转账订单 + * @return 对应的转账结果 + */ + Map transfer(TransferOrder order); + /** + * 转账 + * @param order 转账订单 + * @param callback 处理器 + * @param 返回类型 + * @return 对应的转账结果 + */ + T transfer(TransferOrder order, Callback callback); + + + + /** + * 转账 + * + * @param outNo 商户转账订单号 + * @param tradeNo 支付平台转账订单号 + * + * @return 对应的转账订单 + */ + Map transferQuery(String outNo, String tradeNo); + + /** + * 转账 + * + * @param outNo 商户转账订单号 + * @param tradeNo 支付平台转账订单号 + * @param callback 处理器 + * @param 返回类型 + * @return 对应的转账订单 + */ + T transferQuery(String outNo, String tradeNo, Callback callback); + } diff --git a/pay-java-common/src/main/java/com/egzosn/pay/common/bean/Bank.java b/pay-java-common/src/main/java/com/egzosn/pay/common/bean/Bank.java new file mode 100644 index 0000000..72a82a4 --- /dev/null +++ b/pay-java-common/src/main/java/com/egzosn/pay/common/bean/Bank.java @@ -0,0 +1,24 @@ +package com.egzosn.pay.common.bean; + +/** + * 银行 + * @author egan + *
+ * email egzosn@gmail.com
+ * date 2018/1/31
+ * 
+ */ +public interface Bank { + + /** + * 获取银行的代码 + * @return 银行的代码 + */ + String getCode(); + + /** + * 获取银行的名称 + * @return 银行的名称 + */ + String getName(); +} diff --git a/pay-java-common/src/main/java/com/egzosn/pay/common/bean/TransferOrder.java b/pay-java-common/src/main/java/com/egzosn/pay/common/bean/TransferOrder.java new file mode 100644 index 0000000..76bbcc0 --- /dev/null +++ b/pay-java-common/src/main/java/com/egzosn/pay/common/bean/TransferOrder.java @@ -0,0 +1,104 @@ +package com.egzosn.pay.common.bean; + +import java.math.BigDecimal; + +/** + * 转账订单 + * @author egan + *
+ * email egzosn@gmail.com
+ * date 2018/1/31
+ * 
+ */ +public class TransferOrder { + + /** + * 转账订单单号 + */ + private String outNo; + + /** + * 收款方账户 + */ + private String payeeAccount ; + + /** + * 转账金额 + */ + private BigDecimal amount ; + + /** + * 付款人名称 + */ + private String payerName; + + /** + * 收款人名称 + */ + private String payeeName; + /** + * 备注 + */ + private String remark; + + /** + * 收款开户行 + */ + private Bank bank; + + public String getOutNo() { + return outNo; + } + + public void setOutNo(String outNo) { + this.outNo = outNo; + } + + public String getPayeeAccount() { + return payeeAccount; + } + + public void setPayeeAccount(String payeeAccount) { + this.payeeAccount = payeeAccount; + } + + public BigDecimal getAmount() { + return amount; + } + + public void setAmount(BigDecimal amount) { + this.amount = amount; + } + + public String getPayerName() { + return payerName; + } + + public void setPayerName(String payerName) { + this.payerName = payerName; + } + + public String getPayeeName() { + return payeeName; + } + + public void setPayeeName(String payeeName) { + this.payeeName = payeeName; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public Bank getBank() { + return bank; + } + + public void setBank(Bank bank) { + this.bank = bank; + } +} diff --git a/pay-java-common/src/main/java/com/egzosn/pay/common/util/sign/SignUtils.java b/pay-java-common/src/main/java/com/egzosn/pay/common/util/sign/SignUtils.java index 1e03f5b..7f1ce19 100644 --- a/pay-java-common/src/main/java/com/egzosn/pay/common/util/sign/SignUtils.java +++ b/pay-java-common/src/main/java/com/egzosn/pay/common/util/sign/SignUtils.java @@ -1,9 +1,16 @@ package com.egzosn.pay.common.util.sign; +import com.egzosn.pay.common.bean.result.PayException; +import com.egzosn.pay.common.exception.PayErrorException; import com.egzosn.pay.common.util.str.StringUtils; import org.apache.http.message.BasicNameValuePair; +import javax.crypto.Mac; +import javax.crypto.spec.SecretKeySpec; +import java.io.UnsupportedEncodingException; +import java.security.InvalidKeyException; +import java.security.NoSuchAlgorithmException; import java.util.*; /** @@ -43,6 +50,54 @@ public enum SignUtils { public boolean verify(String text, String sign, String key, String characterEncoding) { return com.egzosn.pay.common.util.sign.encrypt.MD5.verify(text, sign, key, characterEncoding); } + },HMACSHA256{ + /** + * 签名 + * + * @param content 需要签名的内容 + * @param key 密钥 + * @param characterEncoding 字符编码 + * + * @return 签名值 + */ + @Override + public String createSign(String content, String key, String characterEncoding) { + Mac sha256_HMAC = null; + try { + sha256_HMAC = Mac.getInstance("HmacSHA256"); + SecretKeySpec secret_key = new SecretKeySpec(key.getBytes(characterEncoding), "HmacSHA256"); + sha256_HMAC.init(secret_key); + byte[] array = sha256_HMAC.doFinal(content.getBytes(characterEncoding)); + StringBuilder sb = new StringBuilder(); + for (byte item : array) { + sb.append(Integer.toHexString((item & 0xFF) | 0x100).substring(1, 3)); + } + return sb.toString().toUpperCase(); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } catch (InvalidKeyException e) { + e.printStackTrace(); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + + throw new PayErrorException(new PayException("fail", "HMACSHA256 签名异常")); + } + + /** + * 签名字符串 + * + * @param text 需要签名的字符串 + * @param sign 签名结果 + * @param key 密钥 + * @param characterEncoding 编码格式 + * + * @return 签名结果 + */ + @Override + public boolean verify(String text, String sign, String key, String characterEncoding) { + return createSign(text, key, characterEncoding).equals(sign); + } }, RSA { @@ -283,4 +338,5 @@ public enum SignUtils { */ public abstract boolean verify(String text, String sign, String key, String characterEncoding); + } diff --git a/pay-java-fuiou/src/main/java/com/egzosn/pay/fuiou/api/FuiouPayService.java b/pay-java-fuiou/src/main/java/com/egzosn/pay/fuiou/api/FuiouPayService.java index 5519059..c74aef5 100644 --- a/pay-java-fuiou/src/main/java/com/egzosn/pay/fuiou/api/FuiouPayService.java +++ b/pay-java-fuiou/src/main/java/com/egzosn/pay/fuiou/api/FuiouPayService.java @@ -286,14 +286,9 @@ public class FuiouPayService extends BasePayService { for (String key : param.keySet()) { Object o = param.get(key); - - formHtml.append(""); } - - //submit按钮控件请不要含有name属性 -// formHtml.append(""); formHtml.append(""); return formHtml.toString(); @@ -318,19 +313,7 @@ public class FuiouPayService extends BasePayService { return resultJson; } - /** - * 交易查询接口 - * - * @param tradeNo 支付平台订单号 - * @param outTradeNo 商户单号 - * @param callback 处理器 - * @return 空 - */ - @Override - public T query (String tradeNo, String outTradeNo, Callback callback) { - return callback.perform(query(tradeNo, outTradeNo)); - } /** * 交易关闭接口 @@ -343,18 +326,7 @@ public class FuiouPayService extends BasePayService { return null; } - /** - * 交易关闭接口 - * - * @param tradeNo 支付平台订单号 - * @param outTradeNo 商户单号 - * @param callback 处理器 - * @return 空 - */ - @Override - public T close (String tradeNo, String outTradeNo, Callback callback) { - return null; - } + /** * 申请退款接口 @@ -367,28 +339,10 @@ public class FuiouPayService extends BasePayService { */ @Override public Map refund (String tradeNo, String outTradeNo, BigDecimal refundAmount, BigDecimal totalAmount) { - return refund(tradeNo, outTradeNo, refundAmount, totalAmount, new Callback>() { - @Override - public Map perform(Map map) { - return map; - } - }); + return refund(new RefundOrder(tradeNo, outTradeNo, refundAmount, totalAmount)); } - /** - * 申请退款接口 - * - * @param tradeNo 支付平台订单号 - * @param outTradeNo 商户单号 - * @param refundAmount 退款金额 - * @param totalAmount 总金额 - * @param callback 处理器 - * @return 空 - */ - @Override - public T refund (String tradeNo, String outTradeNo, BigDecimal refundAmount, BigDecimal totalAmount, Callback callback) { - return refund(new RefundOrder(tradeNo, outTradeNo, refundAmount, totalAmount), callback); - } + /** @@ -399,23 +353,6 @@ public class FuiouPayService extends BasePayService { */ @Override public Map refund (RefundOrder refundOrder) { - return refund(refundOrder, new Callback>() { - @Override - public Map perform(Map map) { - return map; - } - }); - } - - /** - * 申请退款接口 - * - * @param refundOrder 退款订单信息 - * @param callback 处理器 - * @return 空 - */ - @Override - public T refund(RefundOrder refundOrder, Callback callback) { Map params = new HashMap<>(); params.put("mchnt_cd",payConfigStorage.getPid());//商户代码 DateFormat df = new SimpleDateFormat("yyyy-MM-dd"); @@ -426,8 +363,7 @@ public class FuiouPayService extends BasePayService { params.put("rem","");//备注 params.put("md5",createSign(SignUtils.parameters2MD5Str(params,"|"),payConfigStorage.getInputCharset())); JSONObject resultJson = getHttpRequestTemplate().postForObject(getReqUrl() + URL_FuiouSmpRefundGate,params,JSONObject.class); - //5341标识退款成功 - return callback.perform(params); + return resultJson; } @@ -445,18 +381,6 @@ public class FuiouPayService extends BasePayService { return null; } - /** - * 查询退款 - * - * @param tradeNo 支付平台订单号 - * @param outTradeNo 商户单号 - * @param callback 处理器 - * @return 空 - */ - @Override - public T refundquery (String tradeNo, String outTradeNo, Callback callback) { - return null; - } /** * 下载对账单 @@ -465,36 +389,23 @@ public class FuiouPayService extends BasePayService { * @return 空 */ @Override - public Object downloadbill(Date billDate, String billType) { + public Map downloadbill(Date billDate, String billType) { return null; } /** - * 下载对账单 - * - * @param billDate 账单时间:具体请查看对应支付平台 - * @param billType 账单类型,具体请查看对应支付平台 - * @param callback 处理器 - * @return 空 - */ - @Override - public T downloadbill (Date billDate, String billType, Callback callback) { - return null; - } - - - /** - * 通用查询接口 - * - * @param tradeNoOrBillDate 支付平台订单号或者账单日期, 具体请 类型为{@link String }或者 {@link Date },类型须强制限制,类型不对应则抛出异常{@link PayErrorException} + * @param tradeNoOrBillDate 支付平台订单号或者账单类型, 具体请 + * 类型为{@link String }或者 {@link Date },类型须强制限制,类型不对应则抛出异常{@link PayErrorException} * @param outTradeNoBillType 商户单号或者 账单类型 * @param transactionType 交易类型 - * @param callback 处理器 - * @return 空 + * + * @return 返回支付方对应接口的结果 */ @Override - public T secondaryInterface (Object tradeNoOrBillDate, String outTradeNoBillType, TransactionType transactionType, Callback callback) { + public Map secondaryInterface(Object tradeNoOrBillDate, String outTradeNoBillType, TransactionType transactionType) { return null; } + + } diff --git a/pay-java-union/src/main/java/com/egzosn/pay/union/api/UnionPayService.java b/pay-java-union/src/main/java/com/egzosn/pay/union/api/UnionPayService.java index 19124d5..dd990d2 100644 --- a/pay-java-union/src/main/java/com/egzosn/pay/union/api/UnionPayService.java +++ b/pay-java-union/src/main/java/com/egzosn/pay/union/api/UnionPayService.java @@ -637,26 +637,7 @@ public class UnionPayService extends BasePayService { * @return 返回fileContent 请自行将数据落地 */ @Override - public String downloadbill (Date billDate, String billType) { - return downloadbill(billDate, billType, new Callback() { - @Override - public String perform(Map response) { - return response.get(SDKConstants.param_fileContent).toString(); - } - }); - } - - - /** - * 下载对账单 - * - * @param billDate 账单时间:具体请查看对应支付平台 - * @param billType 账单类型,具体请查看对应支付平台 - * @param callback 处理器 - * @return 返回支付方下载对账单的结果 - */ - @Override - public T downloadbill (Date billDate, String billType, Callback callback) { + public Map downloadbill (Date billDate, String billType) { Map params = this.getCommonParam(); UnionTransactionType.FILE_TRANSFER.convertMap(params); DateFormat df = new SimpleDateFormat("MMdd"); @@ -669,26 +650,26 @@ public class UnionPayService extends BasePayService { JSONObject response = UriVariables.getParametersToMap(responseStr); if(this.verify(response)){ if(SDKConstants.OK_RESP_CODE.equals(response.get(SDKConstants.param_respCode))){ - return callback.perform(response); + return response; } - throw new PayErrorException(new PayException(response.get(SDKConstants.param_respCode).toString(), response.get(SDKConstants.param_respMsg).toString(), response.toString())); + throw new PayErrorException(new PayException(response.get(SDKConstants.param_respCode).toString(), response.get(SDKConstants.param_respMsg).toString(), response.toString())); } - throw new PayErrorException(new PayException("failure", "验证签名失败", response.toString())); + throw new PayErrorException(new PayException("failure", "验证签名失败", response.toString())); } + /** - * 通用查询接口 - * - * @param tradeNoOrBillDate 支付平台订单号或者账单日期, 具体请 类型为{@link String }或者 {@link Date },类型须强制限制,类型不对应则抛出异常{@link PayErrorException} + * @param tradeNoOrBillDate 支付平台订单号或者账单类型, 具体请 + * 类型为{@link String }或者 {@link Date },类型须强制限制,类型不对应则抛出异常{@link PayErrorException} * @param outTradeNoBillType 商户单号或者 账单类型 * @param transactionType 交易类型 - * @param callback 处理器 + * * @return 返回支付方对应接口的结果 */ @Override - public T secondaryInterface (Object tradeNoOrBillDate, String outTradeNoBillType, TransactionType transactionType, Callback callback) { + public Map secondaryInterface(Object tradeNoOrBillDate, String outTradeNoBillType, TransactionType transactionType) { return null; } diff --git a/pay-java-union/src/test/java/PayTest.java b/pay-java-union/src/test/java/PayTest.java index 731d621..8c98c1b 100644 --- a/pay-java-union/src/test/java/PayTest.java +++ b/pay-java-union/src/test/java/PayTest.java @@ -85,7 +85,7 @@ public class PayTest { /*-----------文件传输类接口:后台获取对账文件交易,只有同步应答 ------------------------------*/ - String fileConten = service.downloadbill(new Date(),"文件类型,一般商户填写00即可"); /*-----------退货交易:后台资金类交易,有同步应答和后台通知应答------------------------------*/ + Map fileConten = service.downloadbill(new Date(),"文件类型,一般商户填写00即可"); /*-----------退货交易:后台资金类交易,有同步应答和后台通知应答------------------------------*/ /*-----------回调处理-------------------*/ diff --git a/pay-java-wx-youdian/src/main/java/com/egzosn/pay/wx/youdian/api/WxYouDianPayService.java b/pay-java-wx-youdian/src/main/java/com/egzosn/pay/wx/youdian/api/WxYouDianPayService.java index 1d0b27d..aeb4dfd 100644 --- a/pay-java-wx-youdian/src/main/java/com/egzosn/pay/wx/youdian/api/WxYouDianPayService.java +++ b/pay-java-wx-youdian/src/main/java/com/egzosn/pay/wx/youdian/api/WxYouDianPayService.java @@ -387,65 +387,53 @@ public class WxYouDianPayService extends BasePayService { return null; } - @Override - public T query(String tradeNo, String outTradeNo, Callback callback) { - return null; - } @Override public Map close(String tradeNo, String outTradeNo) { return null; } - @Override - public T close(String tradeNo, String outTradeNo, Callback callback) { - return null; - } @Override public Map refund(String tradeNo, String outTradeNo, BigDecimal refundAmount, BigDecimal totalAmount) { return null; } - @Override - public T refund(String tradeNo, String outTradeNo, BigDecimal refundAmount, BigDecimal totalAmount, Callback callback) { - return null; - } + @Override public Map refund(RefundOrder refundOrder) { return null; } - @Override - public T refund(RefundOrder refundOrder, Callback callback) { - return null; - } @Override public Map refundquery(String tradeNo, String outTradeNo) { return null; } + + @Override - public T refundquery(String tradeNo, String outTradeNo, Callback callback) { + public Map downloadbill(Date billDate, String billType) { return null; } + + /** + * @param tradeNoOrBillDate 支付平台订单号或者账单类型, 具体请 + * 类型为{@link String }或者 {@link Date },类型须强制限制,类型不对应则抛出异常{@link PayErrorException} + * @param outTradeNoBillType 商户单号或者 账单类型 + * @param transactionType 交易类型 + * + * @return 返回支付方对应接口的结果 + */ @Override - public Object downloadbill(Date billDate, String billType) { + public Map secondaryInterface(Object tradeNoOrBillDate, String outTradeNoBillType, TransactionType transactionType) { return null; } - @Override - public T downloadbill(Date billDate, String billType, Callback callback) { - return null; - } - @Override - public T secondaryInterface(Object tradeNoOrBillDate, String outTradeNoBillType, TransactionType transactionType, Callback callback) { - return null; - } public WxYouDianPayService(PayConfigStorage payConfigStorage) { super(payConfigStorage); diff --git a/pay-java-wx/src/main/java/com/egzosn/pay/wx/api/WxPayConfigStorage.java b/pay-java-wx/src/main/java/com/egzosn/pay/wx/api/WxPayConfigStorage.java index 54184b5..6382744 100644 --- a/pay-java-wx/src/main/java/com/egzosn/pay/wx/api/WxPayConfigStorage.java +++ b/pay-java-wx/src/main/java/com/egzosn/pay/wx/api/WxPayConfigStorage.java @@ -48,13 +48,6 @@ public class WxPayConfigStorage extends BasePayConfigStorage { } - /** - * 合作商唯一标识 - */ - public void setPid(String mchId) { - this.mchId = mchId; - } - @Override @@ -71,7 +64,15 @@ public class WxPayConfigStorage extends BasePayConfigStorage { this.mchId = mchId; } + /** + * 为商户平台设置的密钥key + * @return 微信密钥 + */ + public String getSecretKey() { + return getKeyPrivate(); + } - - + public void setSecretKey(String secretKey) { + setKeyPrivate(secretKey); + } } diff --git a/pay-java-wx/src/main/java/com/egzosn/pay/wx/api/WxPayService.java b/pay-java-wx/src/main/java/com/egzosn/pay/wx/api/WxPayService.java index 0601d2e..7b87a75 100644 --- a/pay-java-wx/src/main/java/com/egzosn/pay/wx/api/WxPayService.java +++ b/pay-java-wx/src/main/java/com/egzosn/pay/wx/api/WxPayService.java @@ -42,8 +42,16 @@ public class WxPayService extends BasePayService { * 微信请求地址 */ 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 orderqueryUrl = "https://api.mch.weixin.qq.com/pay/orderquery"; + /** + * 沙箱 + */ + public final static String SANDBOXNEW = "sandboxnew/"; + + public final static String SUCCESS = "SUCCESS"; + public final static String RETURN_CODE = "return_code"; + public final static String SIGN = "sign"; + + /** @@ -66,11 +74,12 @@ public class WxPayService extends BasePayService { * 根据交易类型获取url * * @param transactionType 交易类型 + * * @return 请求url */ - private String getReqUrl(TransactionType transactionType) { + private String getUrl(TransactionType transactionType) { - return URI + transactionType.getMethod(); + return URI + (payConfigStorage.isTest() ? SANDBOXNEW : "") + transactionType.getMethod(); } /** @@ -81,18 +90,19 @@ public class WxPayService extends BasePayService { */ @Override public boolean verify(Map params) { - if (!"SUCCESS".equals(params.get("return_code"))){ - LOG.debug(String.format("微信支付异常:return_code=%s,参数集=%s", params.get("return_code"), params)); + + if (!SUCCESS.equals(params.get(RETURN_CODE))){ + LOG.debug(String.format("微信支付异常:return_code=%s,参数集=%s", params.get(RETURN_CODE), params)); return false; } - if(null == params.get("sign")) { + if(null == params.get(SIGN)) { LOG.debug("微信支付异常:签名为空!out_trade_no=" + params.get("out_trade_no")); return false; } try { - return signVerify(params, (String) params.get("sign")) && verifySource((String) params.get("out_trade_no")); + return signVerify(params, (String) params.get(SIGN)) && verifySource((String) params.get("out_trade_no")); } catch (PayErrorException e) { LOG.error(e); } @@ -121,7 +131,7 @@ public class WxPayService extends BasePayService { */ @Override public boolean signVerify(Map params, String sign) { - return SignUtils.valueOf(payConfigStorage.getSignType()).verify(params, sign, "&key=" + payConfigStorage.getKeyPublic(), payConfigStorage.getInputCharset()); + return SignUtils.valueOf(payConfigStorage.getSignType()).verify(params, sign, "&key=" + payConfigStorage.getKeyPrivate(), payConfigStorage.getInputCharset()); } /** @@ -155,51 +165,23 @@ public class WxPayService extends BasePayService { parameters.put("body", order.getSubject());// 购买支付信息 parameters.put("out_trade_no", order.getOutTradeNo());// 订单号 parameters.put("spbill_create_ip", StringUtils.isEmpty(order.getSpbillCreateIp()) ? "192.168.1.150" : order.getSpbillCreateIp() ); - parameters.put("total_fee", order.getPrice().multiply(new BigDecimal(100)).setScale(0, BigDecimal.ROUND_HALF_UP).intValue());// 总金额单位为分 + parameters.put("total_fee", conversion( order.getPrice()));// 总金额单位为分 parameters.put("attach", order.getBody()); parameters.put("notify_url", payConfigStorage.getNotifyUrl()); parameters.put("trade_type", order.getTransactionType().getType()); - - switch ((WxTransactionType) order.getTransactionType()) { - //刷卡付 - case MICROPAY: - parameters.put("auth_code", order.getAuthCode()); - parameters.remove("notify_url"); - parameters.remove("trade_type"); - break; - // 公众号支付 - case JSAPI: - parameters.put("openid", order.getOpenid()); - break; - //二维码 - case NATIVE: - parameters.put("product_id", order.getOutTradeNo()); - break; - case MWEB: - //H5支付专用 - LinkedHashMap value = new LinkedHashMap(); - value.put("type", "Wap"); - value.put("wap_url", order.getWapUrl());////WAP网站URL地址 - value.put("wap_name", order.getWapName());//WAP 网站名 - JSONObject sceneInfo = new JSONObject(); - sceneInfo.put("h5_info", value); - parameters.put("scene_info", sceneInfo.toJSONString()); - break; - default: - } - + ((WxTransactionType) order.getTransactionType()).setAttribute(parameters, order); String sign = createSign(SignUtils.parameterText(parameters), payConfigStorage.getInputCharset()); - parameters.put("sign", sign); + parameters.put(SIGN, sign); String requestXML = XML.getMap2Xml(parameters); LOG.debug("requestXML:" + requestXML); //调起支付的参数列表 - JSONObject result = requestTemplate.postForObject(getReqUrl(order.getTransactionType()), requestXML, JSONObject.class); + JSONObject result = requestTemplate.postForObject(getUrl(order.getTransactionType()), requestXML, JSONObject.class); - if (!"SUCCESS".equals(result.get("return_code"))) { - throw new PayErrorException(new WxPayError(result.getString("return_code"), result.getString("return_msg"), result.toJSONString())); + if (!SUCCESS.equals(result.get(RETURN_CODE))) { + throw new PayErrorException(new WxPayError(result.getString(RETURN_CODE), result.getString("return_msg"), result.toJSONString())); } return result; } @@ -241,7 +223,7 @@ public class WxPayService extends BasePayService { params.put("package", "Sign=WXPay"); } String paySign = createSign(SignUtils.parameterText(params), payConfigStorage.getInputCharset()); - params.put("sign", paySign); + params.put(SIGN, paySign); return params; @@ -255,8 +237,8 @@ public class WxPayService extends BasePayService { */ private Map setSign(Map parameters) { parameters.put("sign_type", payConfigStorage.getSignType()); - String sign = createSign(SignUtils.parameterText(parameters, "&", "sign", "appId"), payConfigStorage.getInputCharset()); - parameters.put("sign", sign); + String sign = createSign(SignUtils.parameterText(parameters, "&", SIGN, "appId"), payConfigStorage.getInputCharset()); + parameters.put(SIGN, sign); return parameters; } @@ -326,8 +308,8 @@ public class WxPayService extends BasePayService { */ @Override public String buildRequest(Map orderInfo, MethodType method) { - if (!"SUCCESS".equals(orderInfo.get("return_code"))) { - throw new PayErrorException(new WxPayError((String) orderInfo.get("return_code"), (String) orderInfo.get("return_msg"))); + if (!SUCCESS.equals(orderInfo.get(RETURN_CODE))) { + throw new PayErrorException(new WxPayError((String) orderInfo.get(RETURN_CODE), (String) orderInfo.get("return_msg"))); } if (WxTransactionType.MWEB.name().equals(orderInfo.get("trade_type"))) { return String.format("",orderInfo.get("mweb_url"), StringUtils.isEmpty(payConfigStorage.getReturnUrl()) ? "" : "&redirect_url=" + URLEncoder.encode(payConfigStorage.getReturnUrl())); @@ -346,7 +328,7 @@ public class WxPayService extends BasePayService { public BufferedImage genQrPay(PayOrder order) { Map orderInfo = orderInfo(order); //获取对应的支付账户操作工具(可根据账户id) - if (!"SUCCESS".equals(orderInfo.get("result_code"))) { + if (!SUCCESS.equals(orderInfo.get("result_code"))) { throw new PayErrorException(new WxPayError("-1", (String) orderInfo.get("err_code"))); } @@ -376,27 +358,10 @@ public class WxPayService extends BasePayService { */ @Override public Map query(String transactionId, String outTradeNo) { - - return query(transactionId, outTradeNo, new Callback>() { - @Override - public Map perform(Map map) { - return map; - } - }); + return secondaryInterface(transactionId, outTradeNo, WxTransactionType.QUERY); } - /** - * @param transactionId 支付平台订单号 - * @param outTradeNo 商户单号 - * @param callback 处理器 - * @param 返回类型 - * @return 处理过后的类型对象,返回查询回来的结果集,支付方原值返回 - */ - @Override - public T query(String transactionId, String outTradeNo, Callback callback) { - return secondaryInterface(transactionId, outTradeNo, WxTransactionType.QUERY, callback); - } /** * 交易关闭接口 @@ -408,27 +373,9 @@ public class WxPayService extends BasePayService { @Override public Map close(String transactionId, String outTradeNo) { - return close(transactionId, outTradeNo, new Callback>() { - @Override - public Map perform(Map map) { - return map; - } - }); + return secondaryInterface(transactionId, outTradeNo, WxTransactionType.CLOSE); } - /** - * 交易关闭接口 - * - * @param transactionId 支付平台订单号 - * @param outTradeNo 商户单号 - * @param callback 处理器 - * @param 返回类型 - * @return 处理过后的类型对象,返回支付方交易关闭后的结果 - */ - @Override - public T close(String transactionId, String outTradeNo, Callback callback) { - return secondaryInterface(transactionId, outTradeNo, WxTransactionType.CLOSE, callback); - } /** * 退款 @@ -444,32 +391,10 @@ public class WxPayService extends BasePayService { @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; - } - }); + return refund(new RefundOrder(transactionId, outTradeNo, refundAmount, totalAmount)); } - /** - * 退款 - * - * @param transactionId 微信订单号 - * @param outTradeNo 商户单号 - * @param refundAmount 退款金额 - * @param totalAmount 总金额 - * @param callback 处理器 - * @param 返回类型 - * @return 处理过后的类型对象, 返回支付方申请退款后的结果 - * @see #refund(RefundOrder, Callback) - */ - @Deprecated - @Override - public T refund(String transactionId, String outTradeNo, BigDecimal refundAmount, BigDecimal totalAmount, Callback callback) { - return refund(new RefundOrder(transactionId, outTradeNo, refundAmount, totalAmount), callback); - } /** * 申请退款接口 * @@ -478,25 +403,6 @@ public class WxPayService extends BasePayService { */ @Override public Map refund(RefundOrder refundOrder) { - return refund(refundOrder, new Callback>() { - @Override - public Map perform(Map map) { - return map; - } - }); - } - - /** - * 退款 - * - * @param refundOrder 退款订单信息 - * @param callback 处理器 - * @param 返回类型 - * @return 处理过后的类型对象, 返回支付方申请退款后的结果 - */ - @Override - public T refund(RefundOrder refundOrder, Callback callback) { - //获取公共参数 Map parameters = getPublicParameters(); if (null != refundOrder.getTradeNo()) { @@ -504,16 +410,18 @@ public class WxPayService extends BasePayService { } else { parameters.put("out_trade_no", refundOrder.getOutTradeNo()); } - parameters.put("out_refund_no", refundOrder.getRefundNo()); - parameters.put("total_fee", refundOrder.getTotalAmount().multiply(new BigDecimal(100)).setScale(0, BigDecimal.ROUND_HALF_UP).intValue()); - parameters.put("refund_fee", refundOrder.getRefundAmount().multiply(new BigDecimal(100)).setScale(0, BigDecimal.ROUND_HALF_UP).intValue()); + parameters.put("out_refund_no", refundOrder.getRefundNo()); + parameters.put("total_fee", conversion(refundOrder.getTotalAmount())); + parameters.put("refund_fee", conversion(refundOrder.getRefundAmount())); parameters.put("op_user_id", payConfigStorage.getPid()); //设置签名 setSign(parameters); - return callback.perform(requestTemplate.postForObject(getReqUrl(WxTransactionType.REFUND), XML.getMap2Xml(parameters), JSONObject.class)); + return requestTemplate.postForObject(getUrl(WxTransactionType.REFUND), XML.getMap2Xml(parameters), JSONObject.class); } + + /** * 查询退款 * @@ -523,27 +431,10 @@ public class WxPayService extends BasePayService { */ @Override public Map refundquery(String transactionId, String outTradeNo) { - return refundquery(transactionId, outTradeNo, new Callback>() { - @Override - public Map perform(Map map) { - return map; - } - }); + return secondaryInterface(transactionId, outTradeNo, WxTransactionType.REFUNDQUERY); } - /** - * 查询退款 - * - * @param transactionId 支付平台订单号 - * @param outTradeNo 商户单号 - * @param callback 处理器 - * @param 返回类型 - * @return 处理过后的类型对象,返回支付方查询退款后的结果 - */ - @Override - public T refundquery(String transactionId, String outTradeNo, Callback callback) { - return secondaryInterface(transactionId, outTradeNo, WxTransactionType.REFUNDQUERY, callback); - } + /** * 目前只支持日账单 @@ -554,60 +445,48 @@ public class WxPayService extends BasePayService { */ @Override public Map downloadbill(Date billDate, String billType) { - return downloadbill(billDate, billType, new Callback>() { - @Override - public Map perform(Map map) { - return map; - } - }); - } - - /** - * 目前只支持日账单 - * - * @param billDate 账单时间:具体请查看对应支付平台 - * @param billType 账单类型,具体请查看对应支付平台 - * @param callback 处理器 - * @param 返回类型 - * @return 处理过后的类型对象,返回支付方下载对账单的结果 - */ - @Override - public T downloadbill(Date billDate, String billType, Callback callback) { //获取公共参数 Map parameters = getPublicParameters(); - Map bizContent = new TreeMap<>(); - bizContent.put("bill_type", billType); + parameters.put("bill_type", billType); //目前只支持日账单 DateFormat df = new SimpleDateFormat("yyyyMMdd"); df.setTimeZone(TimeZone.getTimeZone("GMT+8")); - bizContent.put("bill_date", df.format(billDate)); + parameters.put("bill_date", df.format(billDate)); //设置签名 setSign(parameters); - return callback.perform(requestTemplate.postForObject(getReqUrl(WxTransactionType.DOWNLOADBILL), XML.getMap2Xml(parameters), JSONObject.class)); + String respStr = requestTemplate.postForObject(getUrl(WxTransactionType.DOWNLOADBILL), XML.getMap2Xml(parameters), String.class); + if (respStr.indexOf("<") == 0) { + return XML.toJSONObject(respStr); + } + + Map ret = new HashMap(); + ret.put(RETURN_CODE, SUCCESS); + ret.put("return_msg", "ok"); + ret.put("data", respStr); + return ret; } + + /** * @param transactionIdOrBillDate 支付平台订单号或者账单类型, 具体请 类型为{@link String }或者 {@link Date },类型须强制限制,类型不对应则抛出异常{@link PayErrorException} * @param outTradeNoBillType 商户单号或者 账单类型 * @param transactionType 交易类型 - * @param callback 处理器 - * @param 返回类型 * @return 返回支付方对应接口的结果 */ @Override - public T secondaryInterface(Object transactionIdOrBillDate, String outTradeNoBillType, TransactionType transactionType, Callback callback) { + public Map secondaryInterface(Object transactionIdOrBillDate, String outTradeNoBillType, TransactionType transactionType) { 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); + return downloadbill((Date) transactionIdOrBillDate, outTradeNoBillType); } throw new PayErrorException(new PayException("failure", "非法类型异常:" + transactionIdOrBillDate.getClass())); } @@ -625,8 +504,61 @@ public class WxPayService extends BasePayService { } //设置签名 setSign(parameters); - return callback.perform(requestTemplate.postForObject(getReqUrl(transactionType), XML.getMap2Xml(parameters) , JSONObject.class)); + return requestTemplate.postForObject(getUrl(transactionType), XML.getMap2Xml(parameters) , JSONObject.class); } + /** + * 转账 + * + * @param order 转账订单 + * + * @return 对应的转账结果 + */ + @Override + public Map transfer(TransferOrder order) { + Map parameters = new TreeMap(); + parameters.put("mch_id", payConfigStorage.getPid()); + parameters.put("partner_trade_no", order.getOutNo()); + parameters.put("nonce_str", SignUtils.randomStr()); + parameters.put("enc_bank_no", keyPublic(order.getPayeeAccount())); + parameters.put("enc_true_name", keyPublic(order.getPayeeName())); + parameters.put("bank_code", order.getBank().getCode()); + parameters.put("amount", conversion(order.getAmount())); + if (!StringUtils.isEmpty(order.getRemark())){ + parameters.put("desc", order.getRemark()); + } + parameters.put(SIGN, SignUtils.valueOf(payConfigStorage.getSignType()).sign(parameters, payConfigStorage.getKeyPrivate(), payConfigStorage.getInputCharset())); + return getHttpRequestTemplate().postForObject(getUrl(WxTransactionType.BANK), parameters, JSONObject.class); + } + /** + * 转账 + * + * @param outNo 商户转账订单号 + * @param tradeNo 支付平台转账订单号 + * + * @return 对应的转账订单 + */ + @Override + public Map transferQuery(String outNo, String tradeNo) { + Map parameters = new TreeMap(); + parameters.put("mch_id", payConfigStorage.getPid()); + parameters.put("partner_trade_no", StringUtils.isEmpty(outNo) ? tradeNo : outNo); + parameters.put("nonce_str", SignUtils.randomStr()); + parameters.put(SIGN, SignUtils.valueOf(payConfigStorage.getSignType()).sign(parameters, payConfigStorage.getKeyPrivate(), payConfigStorage.getInputCharset())); + return getHttpRequestTemplate().postForObject(getUrl(WxTransactionType.QUERY_BANK), parameters, JSONObject.class); + } + + /** + * 元转分 + * @param amount 元的金额 + * @return 分的金额 + */ + public int conversion(BigDecimal amount){ + return amount.multiply(new BigDecimal(100)).setScale(0, BigDecimal.ROUND_HALF_UP).intValue(); + } + + public String keyPublic(String content){ + return SignUtils.RSA.createSign(content, payConfigStorage.getKeyPublic(), payConfigStorage.getInputCharset()); + } } diff --git a/pay-java-wx/src/main/java/com/egzosn/pay/wx/bean/BankWx.java b/pay-java-wx/src/main/java/com/egzosn/pay/wx/bean/BankWx.java new file mode 100644 index 0000000..efb5fc1 --- /dev/null +++ b/pay-java-wx/src/main/java/com/egzosn/pay/wx/bean/BankWx.java @@ -0,0 +1,60 @@ +package com.egzosn.pay.wx.bean; + +import com.egzosn.pay.common.bean.Bank; + +/** + * 微信对应的银行列表 + * @author egan + *
+ * email egzosn@gmail.com
+ * date 2018/1/31
+ * 
+ */ +public enum BankWx implements Bank{ + ICBC("工商银行","1002"), + ABC("农业银行","1005"), + BOC("中国银行","1026"), + CCB("建设银行","1003"), + CMB("招商银行","1001"), + PSBC("邮储银行","1066"), + BOCOM("交通银行","1020"), + SPDB("浦发银行","1004"), + CMBC("民生银行","1006"), + CIB("兴业银行","1009"), + PINGAN("平安银行","1010"), + CCITICB("中信银行","1021"), + HXB("华夏银行","1025"), + CGBC("广发银行","1027"), + CEBB("光大银行","1022"), + BOB("北京银行","1032"), + NBCB("宁波银行","1056"); + + private String name; + + private String code; + + BankWx(String name, String code) { + this.name = name; + this.code = code; + } + + /** + * 获取银行的代码 + * + * @return 银行的代码 + */ + @Override + public String getCode() { + return code; + } + + /** + * 获取银行的名称 + * + * @return 银行的名称 + */ + @Override + public String getName() { + return name; + } +} diff --git a/pay-java-wx/src/main/java/com/egzosn/pay/wx/bean/WxTransactionType.java b/pay-java-wx/src/main/java/com/egzosn/pay/wx/bean/WxTransactionType.java index cd6ff79..8ff8252 100644 --- a/pay-java-wx/src/main/java/com/egzosn/pay/wx/bean/WxTransactionType.java +++ b/pay-java-wx/src/main/java/com/egzosn/pay/wx/bean/WxTransactionType.java @@ -1,7 +1,12 @@ package com.egzosn.pay.wx.bean; +import com.alibaba.fastjson.JSONObject; +import com.egzosn.pay.common.bean.PayOrder; import com.egzosn.pay.common.bean.TransactionType; +import java.util.LinkedHashMap; +import java.util.Map; + /** * 微信交易类型 * @author egan @@ -13,11 +18,21 @@ public enum WxTransactionType implements TransactionType { /** * 公众号支付 */ - JSAPI("pay/unifiedorder"), + JSAPI("pay/unifiedorder") { + @Override + public void setAttribute(Map parameters, PayOrder order) { + parameters.put("openid", order.getOpenid()); + } + }, /** * 扫码付 */ - NATIVE("pay/unifiedorder"), + NATIVE("pay/unifiedorder") { + @Override + public void setAttribute(Map parameters, PayOrder order) { + parameters.put("product_id", order.getOutTradeNo()); + } + }, /** * 移动支付 */ @@ -25,11 +40,32 @@ public enum WxTransactionType implements TransactionType { /** * H5支付 */ - MWEB("pay/unifiedorder"), + MWEB("pay/unifiedorder"){ + @Override + public void setAttribute(Map parameters, PayOrder order) { + //H5支付专用 + LinkedHashMap value = new LinkedHashMap(); + value.put("type", "Wap"); + //WAP网站URL地址 + value.put("wap_url", order.getWapUrl()); + //WAP 网站名 + value.put("wap_name", order.getWapName()); + JSONObject sceneInfo = new JSONObject(); + sceneInfo.put("h5_info", value); + parameters.put("scene_info", sceneInfo.toJSONString()); + } + }, /** * 刷卡付 */ - MICROPAY("pay/micropay"), + MICROPAY("pay/micropay"){ + @Override + public void setAttribute(Map parameters, PayOrder order) { + parameters.put("auth_code", order.getAuthCode()); + parameters.remove("notify_url"); + parameters.remove("trade_type"); + } + }, // TODO 2017/3/8 19:14 author: egan 交易辅助接口 /** * 查询订单 @@ -50,7 +86,15 @@ public enum WxTransactionType implements TransactionType { /** * 下载对账单 */ - DOWNLOADBILL("pay/downloadbill") + DOWNLOADBILL("pay/downloadbill"), + /** + * 银行卡转账 + */ + BANK("mmpaysptrans/pay_bank"), + /** + * 转账查询 + */ + QUERY_BANK("mmpaysptrans/query_bank") ; WxTransactionType(String method) { @@ -67,4 +111,7 @@ public enum WxTransactionType implements TransactionType { public String getMethod() { return this.method; } + public void setAttribute(Map parameters, PayOrder order){ + + } } diff --git a/pom.xml b/pom.xml index 1fb0732..1873bb7 100644 --- a/pom.xml +++ b/pom.xml @@ -43,8 +43,8 @@ pay-java-wx pay-java-wx-youdian pay-java-fuiou - pay-java-union pay-java-demo + pay-java-union pay-java-payoneer @@ -126,7 +126,7 @@ utf-8 -