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 b9685c8..06cd7b5 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 @@ -226,7 +226,7 @@ public class AliPayService extends BasePayService { bizContent.put("timeout_express", DateUtils.minutesRemaining(order.getExpirationTime()) + "m"); } orderInfo.put(BIZ_CONTENT, JSON.toJSONString(bizContent)); - orderInfo.putAll(order.getAttr()); + orderInfo.putAll(order.getAttrs()); return preOrderHandler(orderInfo, order); } 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 c955e04..d2be6c3 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 @@ -467,4 +467,20 @@ public abstract class BasePayService implements Pay return orderInfo; } + protected Map setParameters(Map parameters, String key, String value) { + if (StringUtils.isNotEmpty(value)) { + parameters.put(key, value); + } + return parameters; + } + + protected Map setParameters(Map parameters, String key, Order order) { + Object attr = order.getAttr(key); + if (null != attr && !"".equals(attr)) { + parameters.put(key, attr); + } + return parameters; + } + + } diff --git a/pay-java-common/src/main/java/com/egzosn/pay/common/bean/Order.java b/pay-java-common/src/main/java/com/egzosn/pay/common/bean/Order.java index 57046df..5f18b00 100644 --- a/pay-java-common/src/main/java/com/egzosn/pay/common/bean/Order.java +++ b/pay-java-common/src/main/java/com/egzosn/pay/common/bean/Order.java @@ -17,6 +17,12 @@ public interface Order { * 获取订单属性 这里可用做覆盖已设置的订单信息属性,订单信息在签名前进行覆盖。 * @return 属性 */ - Map getAttr(); + Map getAttrs(); + /** + * 获取订单属性 这里可用做覆盖已设置的订单信息属性,订单信息在签名前进行覆盖。 + * @param key 属性名 + * @return 属性 + */ + Object getAttr(String key); } diff --git a/pay-java-common/src/main/java/com/egzosn/pay/common/bean/PayOrder.java b/pay-java-common/src/main/java/com/egzosn/pay/common/bean/PayOrder.java index 57a6842..dd550be 100644 --- a/pay-java-common/src/main/java/com/egzosn/pay/common/bean/PayOrder.java +++ b/pay-java-common/src/main/java/com/egzosn/pay/common/bean/PayOrder.java @@ -258,20 +258,26 @@ public class PayOrder implements Order { } @Override - public Map getAttr() { + public Map getAttrs() { if (null == attr){ attr = new HashMap<>(); } return attr; } + @Override + public Object getAttr(String key) { + return getAttrs().get(key); + } + + /** * 添加订单信息 * @param key key * @param value 值 */ public void addAttr(String key, Object value) { - getAttr().put(key, value); + getAttrs().put(key, value); } 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 index 2b89117..83f05b8 100644 --- 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 @@ -1,6 +1,8 @@ package com.egzosn.pay.common.bean; import java.math.BigDecimal; +import java.util.HashMap; +import java.util.Map; /** * 转账订单 @@ -10,7 +12,7 @@ import java.math.BigDecimal; * date 2018/1/31 * */ -public class TransferOrder { +public class TransferOrder implements Order { /** * 转账批次订单单号 @@ -79,6 +81,12 @@ public class TransferOrder { */ private String ip; + + /** + * 订单附加信息,可用于预设未提供的参数,这里会覆盖以上所有的订单信息, + */ + private Map attr; + public String getBatchNo() { return batchNo; } @@ -190,4 +198,28 @@ public class TransferOrder { public void setIp(String ip) { this.ip = ip; } + @Override + public Map getAttrs() { + if (null == attr){ + attr = new HashMap<>(); + } + return attr; + } + + @Override + public Object getAttr(String key) { + return getAttrs().get(key); + } + + + /** + * 添加订单信息 + * @param key key + * @param value 值 + */ + public void addAttr(String key, Object value) { + getAttrs().put(key, value); + } + + } 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 8a3b4b0..69a28c0 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 @@ -203,7 +203,7 @@ public class FuiouPayService extends BasePayService { parameters.put("rem", ""); //版本号 parameters.put("ver", "1.0.1"); - parameters.putAll(order.getAttr()); + parameters.putAll(order.getAttrs()); return preOrderHandler(parameters, order); } diff --git a/pay-java-payoneer/src/main/java/com/egzosn/pay/payoneer/api/PayoneerPayService.java b/pay-java-payoneer/src/main/java/com/egzosn/pay/payoneer/api/PayoneerPayService.java index 29cdb28..c12e396 100644 --- a/pay-java-payoneer/src/main/java/com/egzosn/pay/payoneer/api/PayoneerPayService.java +++ b/pay-java-payoneer/src/main/java/com/egzosn/pay/payoneer/api/PayoneerPayService.java @@ -184,7 +184,7 @@ public class PayoneerPayService extends BasePayService im } params.put("currency", order.getCurType()); params.put("description", order.getSubject()); - params.putAll(order.getAttr()); + params.putAll(order.getAttrs()); return preOrderHandler(params, order); } 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 2d33850..1f4770d 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 @@ -284,7 +284,7 @@ public class UnionPayService extends BasePayService { params.put(SDKConstants.param_payTimeout, getPayTimeout(order.getExpirationTime())); params.put("orderDesc", order.getSubject()); } - params.putAll(order.getAttr()); + params.putAll(order.getAttrs()); params = preOrderHandler(params, order); return setSign(params); } 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 6fefb92..8d4e387 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 @@ -227,7 +227,7 @@ public class WxYouDianPayService extends BasePayService data = new TreeMap<>(); data.put("access_token", getAccessToken()); data.put("paymoney", Util.conversionAmount(order.getPrice()).toString()); - data.putAll(order.getAttr()); + data.putAll(order.getAttrs()); data = preOrderHandler(data, order); String apbNonce = SignUtils.randomStr(); String sign = createSign(SignUtils.parameterText(data, "") + apbNonce, payConfigStorage.getInputCharset()); diff --git a/pay-java-wx/src/main/java/com/egzosn/pay/wx/api/WxConst.java b/pay-java-wx/src/main/java/com/egzosn/pay/wx/api/WxConst.java new file mode 100644 index 0000000..08994f3 --- /dev/null +++ b/pay-java-wx/src/main/java/com/egzosn/pay/wx/api/WxConst.java @@ -0,0 +1,42 @@ +package com.egzosn.pay.wx.api; + +import com.egzosn.pay.common.bean.Order; +import com.egzosn.pay.common.bean.PayOrder; + +import java.math.BigDecimal; +import java.util.HashMap; +import java.util.Map; + +/** + * @author egan + * @date 2020/3/10 21:22 + * 郑灶生 + *
+ * email: zheng.zaosheng@iwhalecloud.com + */ +public interface WxConst { + /** + * 微信请求地址 + */ + String URI = "https://api.mch.weixin.qq.com/"; + /** + * 沙箱 + */ + String SANDBOXNEW = "sandboxnew/"; + + String SUCCESS = "SUCCESS"; + String RETURN_CODE = "return_code"; + String SIGN = "sign"; + String CIPHER_ALGORITHM = "RSA/ECB/OAEPWITHSHA-1ANDMGF1PADDING"; + String FAILURE = "failure"; + String APPID = "appid"; + String HMAC_SHA256 = "HMAC-SHA256"; + String HMACSHA256 = "HMACSHA256"; + String RETURN_MSG_CODE = "return_msg"; + String RESULT_CODE = "result_code"; + String MCH_ID = "mch_id"; + String NONCE_STR = "nonce_str"; + String OUT_TRADE_NO = "out_trade_no"; + + +} 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 f4b67de..229a2b5 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 @@ -8,7 +8,6 @@ import com.egzosn.pay.common.bean.result.PayException; import com.egzosn.pay.common.exception.PayErrorException; import com.egzosn.pay.common.http.HttpConfigStorage; import com.egzosn.pay.common.util.DateUtils; -import com.egzosn.pay.common.util.MatrixToImageWriter; import com.egzosn.pay.common.util.Util; import com.egzosn.pay.common.util.sign.SignUtils; import com.egzosn.pay.common.util.sign.encrypt.RSA2; @@ -18,13 +17,13 @@ import com.egzosn.pay.wx.bean.WxPayMessage; import com.egzosn.pay.wx.bean.WxTransactionType; import com.egzosn.pay.common.util.XML; import com.egzosn.pay.wx.bean.WxTransferType; -import java.awt.image.BufferedImage; import java.io.IOException; import java.io.InputStream; import java.math.BigDecimal; import java.net.URLEncoder; import java.util.*; +import static com.egzosn.pay.wx.api.WxConst.*; import static com.egzosn.pay.wx.bean.WxTransferType.*; /** @@ -39,27 +38,6 @@ import static com.egzosn.pay.wx.bean.WxTransferType.*; public class WxPayService extends BasePayService { - /** - * 微信请求地址 - */ - public static final String URI = "https://api.mch.weixin.qq.com/"; - /** - * 沙箱 - */ - public static final String SANDBOXNEW = "sandboxnew/"; - - public static final String SUCCESS = "SUCCESS"; - public static final String RETURN_CODE = "return_code"; - public static final String SIGN = "sign"; - public static final String CIPHER_ALGORITHM = "RSA/ECB/OAEPWITHSHA-1ANDMGF1PADDING"; - public static final String FAILURE = "failure"; - public static final String APPID = "appid"; - private static final String HMAC_SHA256 = "HMAC-SHA256"; - private static final String HMACSHA256 = "HMACSHA256"; - private static final String RETURN_MSG_CODE = "return_msg"; - private static final String RESULT_CODE = "result_code"; - private static final String MCH_ID = "mch_id"; - private static final String NONCE_STR = "nonce_str"; /** @@ -118,17 +96,21 @@ public class WxPayService extends BasePayService { public boolean verify(Map params) { if (!(SUCCESS.equals(params.get(RETURN_CODE)) && SUCCESS.equals(params.get(RESULT_CODE)))) { - LOG.debug(String.format("微信支付异常:return_code=%s,参数集=%s", params.get(RETURN_CODE), params)); + if (LOG.isErrorEnabled()){ + LOG.error(String.format("微信支付异常:return_code=%s,参数集=%s", params.get(RETURN_CODE), params)); + } return false; } if (null == params.get(SIGN)) { - LOG.debug("微信支付异常:签名为空!out_trade_no=" + params.get("out_trade_no")); + if (LOG.isDebugEnabled()){ + LOG.debug(String.format("微信支付异常:签名为空!%s=%s", 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); } @@ -203,9 +185,9 @@ public class WxPayService extends BasePayService { // 购买支付信息 parameters.put("body", order.getSubject()); // 购买支付信息 -// parameters.put("detail", order.getBody()); + setParameters(parameters, "detail", order); // 订单号 - parameters.put("out_trade_no", order.getOutTradeNo()); + 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", Util.conversionCentAmount(order.getPrice())); @@ -222,7 +204,12 @@ public class WxPayService extends BasePayService { } ((WxTransactionType) order.getTransactionType()).setAttribute(parameters, order); - parameters.putAll(order.getAttr()); + //可覆盖参数 + setParameters(parameters, "notify_url", order); + setParameters(parameters, "goods_tag", order); + setParameters(parameters, "limit_pay", order); + setParameters(parameters, "receipt", order); + setParameters(parameters, "product_id", order); parameters = preOrderHandler(parameters, order); setSign(parameters); @@ -276,7 +263,6 @@ public class WxPayService extends BasePayService { params.put("noncestr", result.get(NONCE_STR)); params.put("package", "Sign=WXPay"); } - params = preOrderHandler(params, order); String paySign = createSign(SignUtils.parameterText(params), payConfigStorage.getInputCharset()); params.put(SIGN, paySign); return params; @@ -513,12 +499,7 @@ public class WxPayService extends BasePayService { } - private Map setParameters(Map parameters, String key, String value) { - if (StringUtils.isNotEmpty(value)) { - parameters.put(key, value); - } - return parameters; - } + /** * 申请退款接口 @@ -532,7 +513,7 @@ public class WxPayService extends BasePayService { Map parameters = getPublicParameters(); setParameters(parameters, "transaction_id", refundOrder.getTradeNo()); - setParameters(parameters, "out_trade_no", refundOrder.getOutTradeNo()); + setParameters(parameters, OUT_TRADE_NO, refundOrder.getOutTradeNo()); setParameters(parameters, "out_refund_no", refundOrder.getRefundNo()); parameters.put("total_fee", Util.conversionCentAmount(refundOrder.getTotalAmount())); parameters.put("refund_fee", Util.conversionCentAmount(refundOrder.getRefundAmount())); @@ -571,7 +552,7 @@ public class WxPayService extends BasePayService { //获取公共参数 Map parameters = getPublicParameters(); setParameters(parameters, "transaction_id", refundOrder.getTradeNo()); - setParameters(parameters, "out_trade_no", refundOrder.getOutTradeNo()); + setParameters(parameters, OUT_TRADE_NO, refundOrder.getOutTradeNo()); setParameters(parameters, "out_refund_no", refundOrder.getRefundNo()); //设置签名 setSign(parameters); @@ -638,7 +619,7 @@ public class WxPayService extends BasePayService { //获取公共参数 Map parameters = getPublicParameters(); - setParameters(parameters, "out_trade_no", outTradeNoBillType); + setParameters(parameters, OUT_TRADE_NO, outTradeNoBillType); setParameters(parameters, "transaction_id", (String) transactionIdOrBillDate); //设置签名 setSign(parameters); diff --git a/pay-java-yiji/src/main/java/com/egzosn/pay/yiji/api/YiJiPayService.java b/pay-java-yiji/src/main/java/com/egzosn/pay/yiji/api/YiJiPayService.java index 1428b15..7bdfc2f 100644 --- a/pay-java-yiji/src/main/java/com/egzosn/pay/yiji/api/YiJiPayService.java +++ b/pay-java-yiji/src/main/java/com/egzosn/pay/yiji/api/YiJiPayService.java @@ -175,7 +175,7 @@ public class YiJiPayService extends BasePayService { if (null != order.getCurType()){ orderInfo.put("currency", order.getCurType()); } - orderInfo.putAll(order.getAttr()); + orderInfo.putAll(order.getAttrs()); return preOrderHandler(orderInfo, order); }