From 340989ac2f9de1775ccf906b9964fd396b153a54 Mon Sep 17 00:00:00 2001 From: hocgin Date: Sun, 17 Nov 2019 23:27:12 +0800 Subject: [PATCH 01/37] =?UTF-8?q?#=20=E7=99=BE=E5=BA=A6=E6=94=AF=E4=BB=98?= =?UTF-8?q?=E5=B9=B3=E5=8F=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 4 + pay-java-baidu/pom.xml | 23 + .../pay/baidu/api/BaiduPayConfigStorage.java | 52 +++ .../egzosn/pay/baidu/api/BaiduPayService.java | 400 ++++++++++++++++++ .../egzosn/pay/baidu/bean/BaiduPayOrder.java | 71 ++++ .../pay/baidu/bean/BaiduRefundOrder.java | 65 +++ .../pay/baidu/bean/BaiduTransactionType.java | 37 ++ .../pay/baidu/bean/type/AuditStatus.java | 22 + .../com/egzosn/pay/baidu/package-info.java | 1 + .../com/egzosn/pay/baidu/util/Asserts.java | 16 + .../com/egzosn/pay/baidu/util/NoNullMap.java | 14 + pom.xml | 1 + 12 files changed, 706 insertions(+) create mode 100644 .gitignore create mode 100644 pay-java-baidu/pom.xml create mode 100644 pay-java-baidu/src/com/egzosn/pay/baidu/api/BaiduPayConfigStorage.java create mode 100644 pay-java-baidu/src/com/egzosn/pay/baidu/api/BaiduPayService.java create mode 100644 pay-java-baidu/src/com/egzosn/pay/baidu/bean/BaiduPayOrder.java create mode 100644 pay-java-baidu/src/com/egzosn/pay/baidu/bean/BaiduRefundOrder.java create mode 100644 pay-java-baidu/src/com/egzosn/pay/baidu/bean/BaiduTransactionType.java create mode 100644 pay-java-baidu/src/com/egzosn/pay/baidu/bean/type/AuditStatus.java create mode 100644 pay-java-baidu/src/com/egzosn/pay/baidu/package-info.java create mode 100644 pay-java-baidu/src/com/egzosn/pay/baidu/util/Asserts.java create mode 100644 pay-java-baidu/src/com/egzosn/pay/baidu/util/NoNullMap.java diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ec5cc02 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +# Created by .ignore support plugin (hsz.mobi) +target/ +.idea/ +*.iml \ No newline at end of file diff --git a/pay-java-baidu/pom.xml b/pay-java-baidu/pom.xml new file mode 100644 index 0000000..2aa2bda --- /dev/null +++ b/pay-java-baidu/pom.xml @@ -0,0 +1,23 @@ + + + + pay-java-parent + com.egzosn + 2.12.9-SNAPSHOT + + 4.0.0 + pay-java-baidu + + + + + com.egzosn + pay-java-common + + + + + + \ No newline at end of file diff --git a/pay-java-baidu/src/com/egzosn/pay/baidu/api/BaiduPayConfigStorage.java b/pay-java-baidu/src/com/egzosn/pay/baidu/api/BaiduPayConfigStorage.java new file mode 100644 index 0000000..df84f5e --- /dev/null +++ b/pay-java-baidu/src/com/egzosn/pay/baidu/api/BaiduPayConfigStorage.java @@ -0,0 +1,52 @@ +package com.egzosn.pay.baidu.api; + +import com.egzosn.pay.common.api.BasePayConfigStorage; + +public class BaiduPayConfigStorage extends BasePayConfigStorage { + private String appid; + private String dealId; + + @Override + public String getAppid() { + return this.appid; + } + + @Override + public String getPid() { + return getDealId(); + } + + @Override + public String getSeller() { + throw new UnsupportedOperationException("不支持"); + } + + public String getDealId() { + return dealId; + } + + public void setDealId(String dealId) { + this.dealId = dealId; + } + + public String getAppKey() { + return this.getKeyPrivate(); + } + + public void setAppKey(String appKey) { + setKeyPrivate(appKey); + } + + @Override + public String getKeyPublic() { + return super.getKeyPrivate(); + } + + public void setKeyPublic(String keyPublic) { + super.setKeyPublic(keyPublic); + } + + public void setAppid(String appid) { + this.appid = appid; + } +} diff --git a/pay-java-baidu/src/com/egzosn/pay/baidu/api/BaiduPayService.java b/pay-java-baidu/src/com/egzosn/pay/baidu/api/BaiduPayService.java new file mode 100644 index 0000000..a7a1ad8 --- /dev/null +++ b/pay-java-baidu/src/com/egzosn/pay/baidu/api/BaiduPayService.java @@ -0,0 +1,400 @@ +package com.egzosn.pay.baidu.api; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.egzosn.pay.baidu.bean.BaiduPayOrder; +import com.egzosn.pay.baidu.bean.BaiduRefundOrder; +import com.egzosn.pay.baidu.bean.BaiduTransactionType; +import com.egzosn.pay.baidu.bean.type.AuditStatus; +import com.egzosn.pay.baidu.util.Asserts; +import com.egzosn.pay.baidu.util.NoNullMap; +import com.egzosn.pay.common.api.BasePayService; +import com.egzosn.pay.common.bean.*; +import com.egzosn.pay.common.http.HttpConfigStorage; +import com.egzosn.pay.common.http.UriVariables; +import com.egzosn.pay.common.util.DateUtils; +import com.egzosn.pay.common.util.sign.SignUtils; +import com.egzosn.pay.common.util.str.StringUtils; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + + +public class BaiduPayService extends BasePayService { + public static final String APP_KEY = "appKey"; + public static final String APP_ID = "appId"; + public static final String DEAL_ID = "dealId"; + public static final String TP_ORDER_ID = "tpOrderId"; + public static final String DEAL_TITLE = "dealTitle"; + public static final String TOTAL_AMOUNT = "totalAmount"; + public static final String SIGN_FIELDS_RANGE = "signFieldsRange"; + public static final String BIZ_INFO = "bizInfo"; + public static final String RSA_SIGN = "rsaSign"; + public static final String ORDER_ID = "orderId"; + public static final String USER_ID = "userId"; + public static final String SITE_ID = "siteId"; + public static final String METHOD = "method"; + public static final String TYPE = "type"; + + public static final Integer RESPONSE_SUCCESS = 2; + public static final String RESPONSE_STATUS = "status"; + + + public BaiduPayService(BaiduPayConfigStorage payConfigStorage) { + super(payConfigStorage); + } + + public BaiduPayService(BaiduPayConfigStorage payConfigStorage, + HttpConfigStorage configStorage) { + super(payConfigStorage, configStorage); + } + + @Override + public boolean verify(Map params) { + if (!RESPONSE_SUCCESS.equals(params.get(RESPONSE_STATUS))) { + return false; + } + return signVerify(params, String.valueOf(params.get(RSA_SIGN))) && verifySource(String.valueOf(params.get(TP_ORDER_ID))); + } + + @Override + public boolean signVerify(Map params, String sign) { + String keyPrivate = payConfigStorage.getKeyPrivate(); + String rsaSign = String.valueOf(params.get(RSA_SIGN)); + String targetRsaSign = getRsaSign(params, keyPrivate, RSA_SIGN); + LOG.debug("百度返回的签名: " + rsaSign + " 本地产生的签名: " + targetRsaSign); + return StringUtils.equals(rsaSign, targetRsaSign); + } + + @Override + public boolean verifySource(String id) { + return true; + } + + @Override + public Map orderInfo(PayOrder order) { + if (!(order instanceof BaiduPayOrder)) { + throw new UnsupportedOperationException("请使用 " + BaiduPayOrder.class.getName()); + } + NoNullMap params = getUseOrderInfoParams(order); + String rsaSign = getRsaSignUserOrderInfo(params, payConfigStorage.getKeyPrivate()); + params.putIfNoNull(RSA_SIGN, rsaSign); + return params; + } + + /** + * 获取"查询支付状态"所需参数 + * + * @return + */ + public NoNullMap getUseQueryPay() { + String appKey = payConfigStorage.getAppKey(); + NoNullMap result = new NoNullMap<>(); + result.putIfNoNull(APP_KEY, appKey) + .putIfNoNull(APP_ID, payConfigStorage.getAppid()); + return result; + } + + /** + * 获取"创建订单"所需参数 + * + * @param order + * @return + */ + private NoNullMap getUseOrderInfoParams(PayOrder order) { + BaiduPayOrder payOrder = (BaiduPayOrder) order; + NoNullMap result = new NoNullMap<>(); + String appKey = payConfigStorage.getAppKey(); + String dealId = payConfigStorage.getDealId(); + result.putIfNoNull(APP_KEY, appKey) + .putIfNoNull(TP_ORDER_ID, payOrder.getTradeNo()) + .putIfNoNull(DEAL_ID, dealId) + .putIfNoNull(DEAL_TITLE, payOrder.getSubject()) + .putIfNoNull(SIGN_FIELDS_RANGE, payOrder.getSignFieldsRange()) + .putIfNoNull(BIZ_INFO, JSON.toJSONString(payOrder.getBizInfo())) + .putIfNoNull(TOTAL_AMOUNT, String.valueOf(order.getPrice())); + return result; + } + + @Override + @Deprecated + public PayOutMessage getPayOutMessage(String code, String message) { + throw new UnsupportedOperationException("请使用 " + getClass().getName() + "#getPayOutMessageUseBaidu"); + } + + /** + * 请求业务方退款审核/响应处理 + * http://smartprogram.baidu.com/docs/develop/function/tune_up_examine/ + * + * @param errno + * @param message + * @param auditStatus + * @param refundPayMoney + * @return + */ + public PayOutMessage getApplyRefundOutMessageUseBaidu(Integer errno, + String message, + AuditStatus auditStatus, + BigDecimal refundPayMoney) { + JSONObject data = new JSONObject(); + data.put("auditStatus", auditStatus.getCode()); + JSONObject calculateRes = new JSONObject(); + calculateRes.put("refundPayMoney", refundPayMoney); + data.put("calculateRes", calculateRes); + return PayOutMessage.JSON() + .content("errno", errno) + .content("message", message) + .content("data", data) + .build(); + + } + + /** + * 通知退款状态/响应处理 + * http://smartprogram.baidu.com/docs/develop/function/tune_up_drawback/ + * + * @param errno + * @param message + * @return + */ + public PayOutMessage getRefundOutMessageUseBaidu(Integer errno, + String message) { + return PayOutMessage.JSON() + .content("errno", errno) + .content("message", message) + .content("data", "{}") + .build(); + + } + + /** + * 支付通知/响应处理 + * + * @param errno + * @param message + * @param isConsumed + * @param isErrorOrder + * @return + */ + public PayOutMessage getPayOutMessageUseBaidu(Integer errno, + String message, + Integer isConsumed, + Integer isErrorOrder) { + Asserts.isNoNull(errno, "errno 是必填的"); + Asserts.isNoNull(message, "message 是必填的"); + Asserts.isNoNull(isConsumed, "isConsumed 是必填的"); + JSONObject data = new JSONObject(); + data.put("isConsumed", isConsumed); + if (isErrorOrder != null) { + data.put("isErrorOrder", isErrorOrder); + } + return PayOutMessage.JSON() + .content("errno", errno) + .content("message", message) + .content("data", data) + .build(); + } + + /** + * 支付通知/响应处理 + * http://smartprogram.baidu.com/docs/develop/function/tune_up_notice/ + * + * @param code + * @param message + * @param isConsumed + * @return + */ + public PayOutMessage getPayOutMessageUseBaidu(Integer code, + String message, + Integer isConsumed) { + return getPayOutMessageUseBaidu(code, message, isConsumed, null); + } + + /** + * 支付通知/响应处理 + * http://smartprogram.baidu.com/docs/develop/function/tune_up_notice/ + * + * @param payMessage 支付回调消息 + * @return + */ + @Override + public PayOutMessage successPayOutMessage(PayMessage payMessage) { + return getPayOutMessageUseBaidu(0, "success", 2); + } + + @Override + public String buildRequest(Map orderInfo, + MethodType method) { + throw new UnsupportedOperationException("百度不支持PC支付"); + } + + @Override + public String getQrPay(PayOrder order) { + throw new UnsupportedOperationException("百度不支持扫码付"); + } + + @Override + public Map microPay(PayOrder order) { + throw new UnsupportedOperationException("百度不支持刷卡付"); + } + + @Override + public Map query(String tradeNo, String outTradeNo) { + return secondaryInterface(tradeNo, outTradeNo, BaiduTransactionType.PAY_QUERY); + } + + @Override + public Map close(String tradeNo, String outTradeNo) { + throw new UnsupportedOperationException("不支持该操作"); + } + + @Override + @Deprecated + public Map refund(String orderId, + String userId, + BigDecimal refundAmount, + BigDecimal totalAmount) { + throw new UnsupportedOperationException("请使用 " + getClass().getName() + "#refundUseBaidu"); + } + + public Map refundUseBaidu(Long orderId, + Long userId, + Integer refundType, + String tpOrderId, + String refundReason) { + return refundUseBaidu(new BaiduRefundOrder(orderId, userId, refundType, refundReason, tpOrderId)); + } + + @Override + public Map refund(RefundOrder refundOrder) { + throw new UnsupportedOperationException("请使用 " + getClass().getName() + "#refundUseBaidu"); + } + + public Map refundUseBaidu(BaiduRefundOrder refundOrder) { + NoNullMap parameters = getUseQueryPay(); + BaiduTransactionType transactionType = BaiduTransactionType.APPLY_REFUND; + parameters.putIfNoNull(METHOD, transactionType.getMethod()) + .putIfNoNull(ORDER_ID, refundOrder.getTradeNo()) + .putIfNoNull(USER_ID, refundOrder.getUserId()) + .putIfNoNull("refundType", refundOrder.getRefundType()) + .putIfNoNull("refundReason", String.valueOf(refundOrder.getRefundReason())) + .putIfNoNull(TP_ORDER_ID, refundOrder.getTpOrderId()) + .putIfNoNull("applyRefundMoney", refundOrder.getApplyRefundMoney()) + .putIfNoNull("bizRefundBatchId", refundOrder.getBizRefundBatchId()) + .putIfNoNull(APP_KEY, payConfigStorage.getAppKey()) + .putIfNoNull(RSA_SIGN, getRsaSign(parameters, payConfigStorage.getKeyPrivate())); + return requestTemplate.getForObject(String.format("%s?%s", getReqUrl(transactionType), UriVariables.getMapToParameters(parameters)), JSONObject.class); + } + + /** + * @param orderId 百度平台订单ID + * @param userId 百度用户ID + * @return + */ + @Override + public Map refundquery(String orderId, + String userId) { + NoNullMap parameters = getUseQueryPay(); + BaiduTransactionType transactionType = BaiduTransactionType.REFUND_QUERY; + parameters.putIfNoNull(METHOD, transactionType.getMethod()) + .putIfNoNull(TYPE, 3) + .putIfNoNull(ORDER_ID, orderId) + .putIfNoNull(USER_ID, userId) + .putIfNoNull(APP_KEY, payConfigStorage.getAppKey()) + .putIfNoNull(RSA_SIGN, getRsaSign(parameters, payConfigStorage.getKeyPrivate())); + return requestTemplate.getForObject(String.format("%s?%s", getReqUrl(transactionType), UriVariables.getMapToParameters(parameters)), JSONObject.class); + } + + @Override + public Map refundquery(RefundOrder refundOrder) { + return refundquery(refundOrder.getTradeNo(), refundOrder.getOutTradeNo()); + } + + @Override + public Map downloadbill(Date billDate, String access_token) { + Map parameters = new HashMap<>(); + parameters.put("access_token", access_token); + parameters.put("billTime", DateUtils.formatDay(billDate)); + return requestTemplate.getForObject(String.format("%s?%s", getReqUrl(BaiduTransactionType.DOWNLOAD_BILL), + UriVariables.getMapToParameters(parameters)), JSONObject.class); + } + + public Map downloadOrderBill(Date billDate, String access_token) { + Map parameters = new HashMap<>(); + parameters.put("access_token", access_token); + parameters.put("billTime", DateUtils.formatDay(billDate)); + return requestTemplate.getForObject(String.format("%s?%s", getReqUrl(BaiduTransactionType.DOWNLOAD_ORDER_BILL), + UriVariables.getMapToParameters(parameters)), JSONObject.class); + } + + @Override + public Map secondaryInterface(Object orderId, + String siteId, + TransactionType transactionType) { + if (!BaiduTransactionType.PAY_QUERY.equals(transactionType)) { + throw new UnsupportedOperationException("不支持该操作"); + } + + NoNullMap parameters = getUseQueryPay(); + parameters.putIfNoNull(ORDER_ID, orderId) + .putIfNoNull(SITE_ID, siteId) + .putIfNoNull("sign", getRsaSignUsePayQuery(parameters, payConfigStorage.getKeyPrivate())); + return requestTemplate.getForObject(String.format("%s?%s", getReqUrl(transactionType), UriVariables.getMapToParameters(parameters)), JSONObject.class); + } + + @Override + public String getReqUrl(TransactionType transactionType) { + return ((BaiduTransactionType) transactionType).getUrl(); + } + + private String getRsaSignUserOrderInfo(Map params, String privateKey) { + Map signParams = new HashMap<>(); + signParams.put(APP_KEY, String.valueOf(params.get(APP_KEY))); + signParams.put(DEAL_ID, String.valueOf(params.get(DEAL_ID))); + signParams.put(TP_ORDER_ID, String.valueOf(params.get(TP_ORDER_ID))); + signParams.put(TOTAL_AMOUNT, String.valueOf(params.get(TOTAL_AMOUNT))); + if (signParams.containsValue(null)) { + throw new IllegalArgumentException("参数 " + signParams.keySet().toString() + " 均为必填"); + } + + return SignUtils.RSA.sign(params, privateKey, "UTF-8"); + } + + /** + * "支付状态查询" 使用的签名 + * + * @param params + * @param privateKey + * @return + */ + private String getRsaSignUsePayQuery(Map params, String privateKey) { + Map signParams = new HashMap<>(); + signParams.put(APP_KEY, String.valueOf(params.get(APP_KEY))); + signParams.put(APP_ID, String.valueOf(params.get(APP_ID))); + signParams.put(ORDER_ID, String.valueOf(params.get(ORDER_ID))); + signParams.put(SITE_ID, String.valueOf(params.get(SITE_ID))); + if (signParams.containsValue(null)) { + throw new IllegalArgumentException("参数 " + signParams.keySet().toString() + " 均为必填"); + } + + return SignUtils.RSA.sign(params, privateKey, "UTF-8"); + } + + private String getRsaSign(Map params, String privateKey) { + Map signParams = new HashMap<>(); + signParams.put(APP_KEY, String.valueOf(params.get(APP_KEY))); + signParams.put(USER_ID, String.valueOf(params.get(USER_ID))); + signParams.put(ORDER_ID, String.valueOf(params.get(ORDER_ID))); + if (signParams.containsValue(null)) { + throw new IllegalArgumentException("参数 " + signParams.keySet().toString() + " 均为必填"); + } + + return SignUtils.RSA.sign(params, privateKey, "UTF-8"); + } + + private String getRsaSign(Map params, String... ignoreKeys) { + return SignUtils.RSA.createSign(SignUtils.parameterText(params, "&", ignoreKeys), payConfigStorage.getKeyPrivate(), "UTF-8"); + } +} diff --git a/pay-java-baidu/src/com/egzosn/pay/baidu/bean/BaiduPayOrder.java b/pay-java-baidu/src/com/egzosn/pay/baidu/bean/BaiduPayOrder.java new file mode 100644 index 0000000..58e5417 --- /dev/null +++ b/pay-java-baidu/src/com/egzosn/pay/baidu/bean/BaiduPayOrder.java @@ -0,0 +1,71 @@ +package com.egzosn.pay.baidu.bean; + +import com.alibaba.fastjson.JSONObject; +import com.egzosn.pay.common.bean.PayOrder; +import com.egzosn.pay.common.bean.TransactionType; + +import java.math.BigDecimal; +import java.util.Collections; +import java.util.List; + +public class BaiduPayOrder extends PayOrder { + + /** + * 需要隐藏的支付方式 + */ + private List bannedChannels = Collections.emptyList(); + + /** + * 固定值 + */ + private String signFieldsRange; + + /** + * 附加信息 + */ + private JSONObject bizInfo = new JSONObject(); + + public BaiduPayOrder(String dealTitle, + BigDecimal totalAmount, + String tpOrderId, + String signFieldsRange) { + this(dealTitle, totalAmount, tpOrderId, signFieldsRange, Collections.emptyList()); + } + + public BaiduPayOrder(String dealTitle, + BigDecimal totalAmount, + String tpOrderId, + String signFieldsRange, + List bannedChannels) { + setPrice(totalAmount); + setOutTradeNo(tpOrderId); + setSubject(dealTitle); + setSignFieldsRange(signFieldsRange); + setBannedChannels(bannedChannels); + } + + public JSONObject getBizInfo() { + return bizInfo; + } + + public void setBizInfo(JSONObject bizInfo) { + this.bizInfo = bizInfo; + } + + public List getBannedChannels() { + return bannedChannels; + } + + public void setBannedChannels(List bannedChannels) { + this.bannedChannels = bannedChannels; + } + + public String getSignFieldsRange() { + return signFieldsRange; + } + + public void setSignFieldsRange(String signFieldsRange) { + this.signFieldsRange = signFieldsRange; + } + +} diff --git a/pay-java-baidu/src/com/egzosn/pay/baidu/bean/BaiduRefundOrder.java b/pay-java-baidu/src/com/egzosn/pay/baidu/bean/BaiduRefundOrder.java new file mode 100644 index 0000000..ee68440 --- /dev/null +++ b/pay-java-baidu/src/com/egzosn/pay/baidu/bean/BaiduRefundOrder.java @@ -0,0 +1,65 @@ +package com.egzosn.pay.baidu.bean; + +import com.egzosn.pay.common.bean.RefundOrder; + +import java.math.BigDecimal; + +public class BaiduRefundOrder extends RefundOrder { + private Long userId; + private Integer refundType; + private String refundReason; + private String tpOrderId; + /** + * 退款金额,单位:分,发起部分退款时必传 + */ + private BigDecimal applyRefundMoney; + /** + * 业务方退款批次id,退款业务流水唯一编号,发起部分退款时必传 + */ + private String bizRefundBatchId; + + public BaiduRefundOrder(Long orderId, + Long userId, + Integer refundType, + String refundReason, + String tpOrderId) { + super(); + setTradeNo(String.valueOf(orderId)); + this.userId = userId; + this.refundType = refundType; + this.refundReason = refundReason; + this.tpOrderId = tpOrderId; + } + + public BigDecimal getApplyRefundMoney() { + return applyRefundMoney; + } + + public void setApplyRefundMoney(BigDecimal applyRefundMoney) { + setRefundAmount(applyRefundMoney); + } + + public String getBizRefundBatchId() { + return bizRefundBatchId; + } + + public void setBizRefundBatchId(String bizRefundBatchId) { + this.bizRefundBatchId = bizRefundBatchId; + } + + public Long getUserId() { + return userId; + } + + public Integer getRefundType() { + return refundType; + } + + public String getRefundReason() { + return refundReason; + } + + public String getTpOrderId() { + return tpOrderId; + } +} diff --git a/pay-java-baidu/src/com/egzosn/pay/baidu/bean/BaiduTransactionType.java b/pay-java-baidu/src/com/egzosn/pay/baidu/bean/BaiduTransactionType.java new file mode 100644 index 0000000..3e23333 --- /dev/null +++ b/pay-java-baidu/src/com/egzosn/pay/baidu/bean/BaiduTransactionType.java @@ -0,0 +1,37 @@ +package com.egzosn.pay.baidu.bean; + +import com.egzosn.pay.common.bean.TransactionType; + +public enum BaiduTransactionType implements TransactionType { + // 查询支付状态 + PAY_QUERY("https://dianshang.baidu.com/platform/entity/openapi/queryorderdetail", "PAY_QUERY"), + // 取消核销 + REFUND_QUERY("https://nop.nuomi.com/nop/server/rest", "nuomi.cashier.syncorderstatus"), + // 下载资金账单 + DOWNLOAD_BILL("https://openapi.baidu.com/rest/2.0/smartapp/pay/paymentservice/capitaBill", "DOWNLOAD_BILL"), + // 下载订单对账单 + DOWNLOAD_ORDER_BILL("https://openapi.baidu.com/rest/2.0/smartapp/pay/paymentservice/orderBill", "DOWNLOAD_ORDER_BILL"), + // 申请退款 + APPLY_REFUND("https://nop.nuomi.com/nop/server/rest", "nuomi.cashier.applyorderrefund"); + private final String method; + private final String url; + + BaiduTransactionType( String url, String method) { + this.url = url; + this.method = method; + } + + @Override + public String getType() { + return this.name(); + } + + @Override + public String getMethod() { + return this.method; + } + + public String getUrl() { + return url; + } +} diff --git a/pay-java-baidu/src/com/egzosn/pay/baidu/bean/type/AuditStatus.java b/pay-java-baidu/src/com/egzosn/pay/baidu/bean/type/AuditStatus.java new file mode 100644 index 0000000..22960bf --- /dev/null +++ b/pay-java-baidu/src/com/egzosn/pay/baidu/bean/type/AuditStatus.java @@ -0,0 +1,22 @@ +package com.egzosn.pay.baidu.bean.type; + +public enum AuditStatus { + SUCCESS(1, "审核通过可退款"), + FAIL(2, "审核不通过,不能退款"), + UNKNOWN(3, "审核结果不确定,待重试"); + private final int code; + private final String desc; + + AuditStatus(int code, String desc) { + this.code = code; + this.desc = desc; + } + + public int getCode() { + return code; + } + + public String getDesc() { + return desc; + } +} diff --git a/pay-java-baidu/src/com/egzosn/pay/baidu/package-info.java b/pay-java-baidu/src/com/egzosn/pay/baidu/package-info.java new file mode 100644 index 0000000..e9370e2 --- /dev/null +++ b/pay-java-baidu/src/com/egzosn/pay/baidu/package-info.java @@ -0,0 +1 @@ +package com.egzosn.pay.baidu; \ No newline at end of file diff --git a/pay-java-baidu/src/com/egzosn/pay/baidu/util/Asserts.java b/pay-java-baidu/src/com/egzosn/pay/baidu/util/Asserts.java new file mode 100644 index 0000000..7c94996 --- /dev/null +++ b/pay-java-baidu/src/com/egzosn/pay/baidu/util/Asserts.java @@ -0,0 +1,16 @@ +package com.egzosn.pay.baidu.util; + +public class Asserts { + + public static void isNoNull(Object object, String message) { + if (object == null) { + throw new IllegalArgumentException(message); + } + } + + public static void isTrue(boolean bool, String message) { + if (!bool) { + throw new IllegalArgumentException(message); + } + } +} diff --git a/pay-java-baidu/src/com/egzosn/pay/baidu/util/NoNullMap.java b/pay-java-baidu/src/com/egzosn/pay/baidu/util/NoNullMap.java new file mode 100644 index 0000000..7e24a13 --- /dev/null +++ b/pay-java-baidu/src/com/egzosn/pay/baidu/util/NoNullMap.java @@ -0,0 +1,14 @@ +package com.egzosn.pay.baidu.util; + +import java.util.HashMap; + +public class NoNullMap extends HashMap { + + public NoNullMap putIfNoNull(K key, V value) { + if (value != null) { + put(key, value); + } + return this; + } + +} diff --git a/pom.xml b/pom.xml index 775e767..5ae16b1 100644 --- a/pom.xml +++ b/pom.xml @@ -52,6 +52,7 @@ pay-java-payoneer pay-java-paypal pay-java-yiji + pay-java-baidu pay-java-demo From 251646d43513e2bfd8416ba45e42886808eb0a83 Mon Sep 17 00:00:00 2001 From: hocgin Date: Sun, 24 Nov 2019 16:27:01 +0800 Subject: [PATCH 02/37] =?UTF-8?q?#=20=E7=AD=BE=E5=90=8D=E5=8F=82=E6=95=B0?= =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pay/baidu/api/BaiduPayConfigStorage.java | 1 + .../egzosn/pay/baidu/api/BaiduPayService.java | 90 +++++++------------ .../pay/common/util/sign/SignUtils.java | 20 ++++- 3 files changed, 48 insertions(+), 63 deletions(-) diff --git a/pay-java-baidu/src/com/egzosn/pay/baidu/api/BaiduPayConfigStorage.java b/pay-java-baidu/src/com/egzosn/pay/baidu/api/BaiduPayConfigStorage.java index df84f5e..f1496e7 100644 --- a/pay-java-baidu/src/com/egzosn/pay/baidu/api/BaiduPayConfigStorage.java +++ b/pay-java-baidu/src/com/egzosn/pay/baidu/api/BaiduPayConfigStorage.java @@ -42,6 +42,7 @@ public class BaiduPayConfigStorage extends BasePayConfigStorage { return super.getKeyPrivate(); } + @Override public void setKeyPublic(String keyPublic) { super.setKeyPublic(keyPublic); } diff --git a/pay-java-baidu/src/com/egzosn/pay/baidu/api/BaiduPayService.java b/pay-java-baidu/src/com/egzosn/pay/baidu/api/BaiduPayService.java index a7a1ad8..3826166 100644 --- a/pay-java-baidu/src/com/egzosn/pay/baidu/api/BaiduPayService.java +++ b/pay-java-baidu/src/com/egzosn/pay/baidu/api/BaiduPayService.java @@ -35,6 +35,7 @@ public class BaiduPayService extends BasePayService { public static final String ORDER_ID = "orderId"; public static final String USER_ID = "userId"; public static final String SITE_ID = "siteId"; + public static final String SIGN = "sign"; public static final String METHOD = "method"; public static final String TYPE = "type"; @@ -63,7 +64,7 @@ public class BaiduPayService extends BasePayService { public boolean signVerify(Map params, String sign) { String keyPrivate = payConfigStorage.getKeyPrivate(); String rsaSign = String.valueOf(params.get(RSA_SIGN)); - String targetRsaSign = getRsaSign(params, keyPrivate, RSA_SIGN); + String targetRsaSign = getRsaSign(params, RSA_SIGN); LOG.debug("百度返回的签名: " + rsaSign + " 本地产生的签名: " + targetRsaSign); return StringUtils.equals(rsaSign, targetRsaSign); } @@ -89,11 +90,11 @@ public class BaiduPayService extends BasePayService { * * @return */ - public NoNullMap getUseQueryPay() { + public Map getUseQueryPay() { String appKey = payConfigStorage.getAppKey(); - NoNullMap result = new NoNullMap<>(); - result.putIfNoNull(APP_KEY, appKey) - .putIfNoNull(APP_ID, payConfigStorage.getAppid()); + Map result = new HashMap<>(); + result.put(APP_KEY, appKey); + result.put(APP_ID, payConfigStorage.getAppid()); return result; } @@ -273,18 +274,18 @@ public class BaiduPayService extends BasePayService { } public Map refundUseBaidu(BaiduRefundOrder refundOrder) { - NoNullMap parameters = getUseQueryPay(); + Map parameters = getUseQueryPay(); BaiduTransactionType transactionType = BaiduTransactionType.APPLY_REFUND; - parameters.putIfNoNull(METHOD, transactionType.getMethod()) - .putIfNoNull(ORDER_ID, refundOrder.getTradeNo()) - .putIfNoNull(USER_ID, refundOrder.getUserId()) - .putIfNoNull("refundType", refundOrder.getRefundType()) - .putIfNoNull("refundReason", String.valueOf(refundOrder.getRefundReason())) - .putIfNoNull(TP_ORDER_ID, refundOrder.getTpOrderId()) - .putIfNoNull("applyRefundMoney", refundOrder.getApplyRefundMoney()) - .putIfNoNull("bizRefundBatchId", refundOrder.getBizRefundBatchId()) - .putIfNoNull(APP_KEY, payConfigStorage.getAppKey()) - .putIfNoNull(RSA_SIGN, getRsaSign(parameters, payConfigStorage.getKeyPrivate())); + parameters.put(METHOD, transactionType.getMethod()); + parameters.put(ORDER_ID, refundOrder.getTradeNo()); + parameters.put(USER_ID, refundOrder.getUserId()); + parameters.put("refundType", refundOrder.getRefundType()); + parameters.put("refundReason", String.valueOf(refundOrder.getRefundReason())); + parameters.put(TP_ORDER_ID, refundOrder.getTpOrderId()); + parameters.put("applyRefundMoney", refundOrder.getApplyRefundMoney()); + parameters.put("bizRefundBatchId", refundOrder.getBizRefundBatchId()); + parameters.put(APP_KEY, payConfigStorage.getAppKey()); + parameters.put(RSA_SIGN, getRsaSign(parameters, RSA_SIGN)); return requestTemplate.getForObject(String.format("%s?%s", getReqUrl(transactionType), UriVariables.getMapToParameters(parameters)), JSONObject.class); } @@ -296,14 +297,14 @@ public class BaiduPayService extends BasePayService { @Override public Map refundquery(String orderId, String userId) { - NoNullMap parameters = getUseQueryPay(); + Map parameters = getUseQueryPay(); BaiduTransactionType transactionType = BaiduTransactionType.REFUND_QUERY; - parameters.putIfNoNull(METHOD, transactionType.getMethod()) - .putIfNoNull(TYPE, 3) - .putIfNoNull(ORDER_ID, orderId) - .putIfNoNull(USER_ID, userId) - .putIfNoNull(APP_KEY, payConfigStorage.getAppKey()) - .putIfNoNull(RSA_SIGN, getRsaSign(parameters, payConfigStorage.getKeyPrivate())); + parameters.put(METHOD, transactionType.getMethod()); + parameters.put(TYPE, 3); + parameters.put(ORDER_ID, orderId); + parameters.put(USER_ID, userId); + parameters.put(APP_KEY, payConfigStorage.getAppKey()); + parameters.put(RSA_SIGN, getRsaSign(parameters, RSA_SIGN)); return requestTemplate.getForObject(String.format("%s?%s", getReqUrl(transactionType), UriVariables.getMapToParameters(parameters)), JSONObject.class); } @@ -337,10 +338,10 @@ public class BaiduPayService extends BasePayService { throw new UnsupportedOperationException("不支持该操作"); } - NoNullMap parameters = getUseQueryPay(); - parameters.putIfNoNull(ORDER_ID, orderId) - .putIfNoNull(SITE_ID, siteId) - .putIfNoNull("sign", getRsaSignUsePayQuery(parameters, payConfigStorage.getKeyPrivate())); + Map parameters = getUseQueryPay(); + parameters.put(ORDER_ID, orderId); + parameters.put(SITE_ID, siteId); + parameters.put(SIGN, getRsaSign(parameters, SIGN)); return requestTemplate.getForObject(String.format("%s?%s", getReqUrl(transactionType), UriVariables.getMapToParameters(parameters)), JSONObject.class); } @@ -362,39 +363,8 @@ public class BaiduPayService extends BasePayService { return SignUtils.RSA.sign(params, privateKey, "UTF-8"); } - /** - * "支付状态查询" 使用的签名 - * - * @param params - * @param privateKey - * @return - */ - private String getRsaSignUsePayQuery(Map params, String privateKey) { - Map signParams = new HashMap<>(); - signParams.put(APP_KEY, String.valueOf(params.get(APP_KEY))); - signParams.put(APP_ID, String.valueOf(params.get(APP_ID))); - signParams.put(ORDER_ID, String.valueOf(params.get(ORDER_ID))); - signParams.put(SITE_ID, String.valueOf(params.get(SITE_ID))); - if (signParams.containsValue(null)) { - throw new IllegalArgumentException("参数 " + signParams.keySet().toString() + " 均为必填"); - } - - return SignUtils.RSA.sign(params, privateKey, "UTF-8"); - } - - private String getRsaSign(Map params, String privateKey) { - Map signParams = new HashMap<>(); - signParams.put(APP_KEY, String.valueOf(params.get(APP_KEY))); - signParams.put(USER_ID, String.valueOf(params.get(USER_ID))); - signParams.put(ORDER_ID, String.valueOf(params.get(ORDER_ID))); - if (signParams.containsValue(null)) { - throw new IllegalArgumentException("参数 " + signParams.keySet().toString() + " 均为必填"); - } - - return SignUtils.RSA.sign(params, privateKey, "UTF-8"); - } - private String getRsaSign(Map params, String... ignoreKeys) { - return SignUtils.RSA.createSign(SignUtils.parameterText(params, "&", ignoreKeys), payConfigStorage.getKeyPrivate(), "UTF-8"); + String waitSignVal = SignUtils.parameterText(params, "&", false, ignoreKeys); + return SignUtils.RSA.createSign(waitSignVal, payConfigStorage.getKeyPrivate(), "UTF-8"); } } 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 3d13bf5..a971b05 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 @@ -178,7 +178,8 @@ public enum SignUtils { public static String parameterText(Map parameters, String separator) { return parameterText(parameters, separator, "signature", "sign", "key", "sign_type"); } - + + /** * * 把数组所有元素排序,并按照“参数=参数值”的模式用“@param separator”字符拼接成字符串 @@ -187,7 +188,20 @@ public enum SignUtils { * @param ignoreKey 需要忽略添加的key * @return 去掉空值与签名参数后的新签名,拼接后字符串 */ - public static String parameterText(Map parameters, String separator, String... ignoreKey ) { + public static String parameterText(Map parameters, String separator, String... ignoreKey) { + return parameterText(parameters, separator, true, ignoreKey); + } + + /** + * + * 把数组所有元素排序,并按照“参数=参数值”的模式用“@param separator”字符拼接成字符串 + * @param parameters 参数 + * @param separator 分隔符 + * @param ignoreNullValue 需要忽略NULL值 + * @param ignoreKey 需要忽略添加的key + * @return 去掉空值与签名参数后的新签名,拼接后字符串 + */ + public static String parameterText(Map parameters, String separator, boolean ignoreNullValue, String... ignoreKey ) { if(parameters == null){ return ""; } @@ -219,7 +233,7 @@ public enum SignUtils { for (String k : keys) { String valueStr = ""; Object o = parameters.get(k); - if (null == o) { + if (ignoreNullValue && null == o) { continue; } if (o instanceof String[]) { From cc6380635377f2667aae33061a4357c39a6bdddc Mon Sep 17 00:00:00 2001 From: hocgin Date: Sun, 24 Nov 2019 16:42:13 +0800 Subject: [PATCH 03/37] =?UTF-8?q?#=20=E7=AD=BE=E5=90=8D=E5=8F=82=E6=95=B0?= =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pay-java-baidu/pom.xml | 5 ++++ .../pay/baidu/api/BaiduPayConfigStorage.java | 0 .../egzosn/pay/baidu/api/BaiduPayService.java | 23 +++++++++++------- .../egzosn/pay/baidu/bean/BaiduPayOrder.java | 0 .../pay/baidu/bean/BaiduRefundOrder.java | 0 .../pay/baidu/bean/BaiduTransactionType.java | 0 .../pay/baidu/bean/type/AuditStatus.java | 0 .../com/egzosn/pay/baidu/package-info.java | 0 .../com/egzosn/pay/baidu/util/Asserts.java | 0 .../com/egzosn/pay/baidu/util/NoNullMap.java | 0 .../pay/baidu/api/BaiduPayServiceTest.java | 24 +++++++++++++++++++ pom.xml | 7 ++++++ 12 files changed, 50 insertions(+), 9 deletions(-) rename pay-java-baidu/src/{ => main/java}/com/egzosn/pay/baidu/api/BaiduPayConfigStorage.java (100%) rename pay-java-baidu/src/{ => main/java}/com/egzosn/pay/baidu/api/BaiduPayService.java (97%) rename pay-java-baidu/src/{ => main/java}/com/egzosn/pay/baidu/bean/BaiduPayOrder.java (100%) rename pay-java-baidu/src/{ => main/java}/com/egzosn/pay/baidu/bean/BaiduRefundOrder.java (100%) rename pay-java-baidu/src/{ => main/java}/com/egzosn/pay/baidu/bean/BaiduTransactionType.java (100%) rename pay-java-baidu/src/{ => main/java}/com/egzosn/pay/baidu/bean/type/AuditStatus.java (100%) rename pay-java-baidu/src/{ => main/java}/com/egzosn/pay/baidu/package-info.java (100%) rename pay-java-baidu/src/{ => main/java}/com/egzosn/pay/baidu/util/Asserts.java (100%) rename pay-java-baidu/src/{ => main/java}/com/egzosn/pay/baidu/util/NoNullMap.java (100%) create mode 100644 pay-java-baidu/src/test/java/com/egzosn/pay/baidu/api/BaiduPayServiceTest.java diff --git a/pay-java-baidu/pom.xml b/pay-java-baidu/pom.xml index 2aa2bda..ea4e52a 100644 --- a/pay-java-baidu/pom.xml +++ b/pay-java-baidu/pom.xml @@ -17,6 +17,11 @@ pay-java-common + + org.junit.jupiter + junit-jupiter + test + diff --git a/pay-java-baidu/src/com/egzosn/pay/baidu/api/BaiduPayConfigStorage.java b/pay-java-baidu/src/main/java/com/egzosn/pay/baidu/api/BaiduPayConfigStorage.java similarity index 100% rename from pay-java-baidu/src/com/egzosn/pay/baidu/api/BaiduPayConfigStorage.java rename to pay-java-baidu/src/main/java/com/egzosn/pay/baidu/api/BaiduPayConfigStorage.java diff --git a/pay-java-baidu/src/com/egzosn/pay/baidu/api/BaiduPayService.java b/pay-java-baidu/src/main/java/com/egzosn/pay/baidu/api/BaiduPayService.java similarity index 97% rename from pay-java-baidu/src/com/egzosn/pay/baidu/api/BaiduPayService.java rename to pay-java-baidu/src/main/java/com/egzosn/pay/baidu/api/BaiduPayService.java index 3826166..47a7c8b 100644 --- a/pay-java-baidu/src/com/egzosn/pay/baidu/api/BaiduPayService.java +++ b/pay-java-baidu/src/main/java/com/egzosn/pay/baidu/api/BaiduPayService.java @@ -2,12 +2,6 @@ package com.egzosn.pay.baidu.api; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; -import com.egzosn.pay.baidu.bean.BaiduPayOrder; -import com.egzosn.pay.baidu.bean.BaiduRefundOrder; -import com.egzosn.pay.baidu.bean.BaiduTransactionType; -import com.egzosn.pay.baidu.bean.type.AuditStatus; -import com.egzosn.pay.baidu.util.Asserts; -import com.egzosn.pay.baidu.util.NoNullMap; import com.egzosn.pay.common.api.BasePayService; import com.egzosn.pay.common.bean.*; import com.egzosn.pay.common.http.HttpConfigStorage; @@ -15,6 +9,12 @@ import com.egzosn.pay.common.http.UriVariables; import com.egzosn.pay.common.util.DateUtils; import com.egzosn.pay.common.util.sign.SignUtils; import com.egzosn.pay.common.util.str.StringUtils; +import com.egzosn.pay.baidu.bean.BaiduPayOrder; +import com.egzosn.pay.baidu.bean.BaiduRefundOrder; +import com.egzosn.pay.baidu.bean.BaiduTransactionType; +import com.egzosn.pay.baidu.bean.type.AuditStatus; +import com.egzosn.pay.baidu.util.Asserts; +import com.egzosn.pay.baidu.util.NoNullMap; import java.math.BigDecimal; import java.util.Date; @@ -22,7 +22,7 @@ import java.util.HashMap; import java.util.Map; -public class BaiduPayService extends BasePayService { +public class BaiduPayService extends BasePayService { public static final String APP_KEY = "appKey"; public static final String APP_ID = "appId"; public static final String DEAL_ID = "dealId"; @@ -43,11 +43,11 @@ public class BaiduPayService extends BasePayService { public static final String RESPONSE_STATUS = "status"; - public BaiduPayService(BaiduPayConfigStorage payConfigStorage) { + public BaiduPayService(com.egzosn.pay.baidu.api.BaiduPayConfigStorage payConfigStorage) { super(payConfigStorage); } - public BaiduPayService(BaiduPayConfigStorage payConfigStorage, + public BaiduPayService(com.egzosn.pay.baidu.api.BaiduPayConfigStorage payConfigStorage, HttpConfigStorage configStorage) { super(payConfigStorage, configStorage); } @@ -226,17 +226,20 @@ public class BaiduPayService extends BasePayService { } @Override + @Deprecated public String buildRequest(Map orderInfo, MethodType method) { throw new UnsupportedOperationException("百度不支持PC支付"); } @Override + @Deprecated public String getQrPay(PayOrder order) { throw new UnsupportedOperationException("百度不支持扫码付"); } @Override + @Deprecated public Map microPay(PayOrder order) { throw new UnsupportedOperationException("百度不支持刷卡付"); } @@ -247,6 +250,7 @@ public class BaiduPayService extends BasePayService { } @Override + @Deprecated public Map close(String tradeNo, String outTradeNo) { throw new UnsupportedOperationException("不支持该操作"); } @@ -269,6 +273,7 @@ public class BaiduPayService extends BasePayService { } @Override + @Deprecated public Map refund(RefundOrder refundOrder) { throw new UnsupportedOperationException("请使用 " + getClass().getName() + "#refundUseBaidu"); } diff --git a/pay-java-baidu/src/com/egzosn/pay/baidu/bean/BaiduPayOrder.java b/pay-java-baidu/src/main/java/com/egzosn/pay/baidu/bean/BaiduPayOrder.java similarity index 100% rename from pay-java-baidu/src/com/egzosn/pay/baidu/bean/BaiduPayOrder.java rename to pay-java-baidu/src/main/java/com/egzosn/pay/baidu/bean/BaiduPayOrder.java diff --git a/pay-java-baidu/src/com/egzosn/pay/baidu/bean/BaiduRefundOrder.java b/pay-java-baidu/src/main/java/com/egzosn/pay/baidu/bean/BaiduRefundOrder.java similarity index 100% rename from pay-java-baidu/src/com/egzosn/pay/baidu/bean/BaiduRefundOrder.java rename to pay-java-baidu/src/main/java/com/egzosn/pay/baidu/bean/BaiduRefundOrder.java diff --git a/pay-java-baidu/src/com/egzosn/pay/baidu/bean/BaiduTransactionType.java b/pay-java-baidu/src/main/java/com/egzosn/pay/baidu/bean/BaiduTransactionType.java similarity index 100% rename from pay-java-baidu/src/com/egzosn/pay/baidu/bean/BaiduTransactionType.java rename to pay-java-baidu/src/main/java/com/egzosn/pay/baidu/bean/BaiduTransactionType.java diff --git a/pay-java-baidu/src/com/egzosn/pay/baidu/bean/type/AuditStatus.java b/pay-java-baidu/src/main/java/com/egzosn/pay/baidu/bean/type/AuditStatus.java similarity index 100% rename from pay-java-baidu/src/com/egzosn/pay/baidu/bean/type/AuditStatus.java rename to pay-java-baidu/src/main/java/com/egzosn/pay/baidu/bean/type/AuditStatus.java diff --git a/pay-java-baidu/src/com/egzosn/pay/baidu/package-info.java b/pay-java-baidu/src/main/java/com/egzosn/pay/baidu/package-info.java similarity index 100% rename from pay-java-baidu/src/com/egzosn/pay/baidu/package-info.java rename to pay-java-baidu/src/main/java/com/egzosn/pay/baidu/package-info.java diff --git a/pay-java-baidu/src/com/egzosn/pay/baidu/util/Asserts.java b/pay-java-baidu/src/main/java/com/egzosn/pay/baidu/util/Asserts.java similarity index 100% rename from pay-java-baidu/src/com/egzosn/pay/baidu/util/Asserts.java rename to pay-java-baidu/src/main/java/com/egzosn/pay/baidu/util/Asserts.java diff --git a/pay-java-baidu/src/com/egzosn/pay/baidu/util/NoNullMap.java b/pay-java-baidu/src/main/java/com/egzosn/pay/baidu/util/NoNullMap.java similarity index 100% rename from pay-java-baidu/src/com/egzosn/pay/baidu/util/NoNullMap.java rename to pay-java-baidu/src/main/java/com/egzosn/pay/baidu/util/NoNullMap.java diff --git a/pay-java-baidu/src/test/java/com/egzosn/pay/baidu/api/BaiduPayServiceTest.java b/pay-java-baidu/src/test/java/com/egzosn/pay/baidu/api/BaiduPayServiceTest.java new file mode 100644 index 0000000..6f9b5c2 --- /dev/null +++ b/pay-java-baidu/src/test/java/com/egzosn/pay/baidu/api/BaiduPayServiceTest.java @@ -0,0 +1,24 @@ +package com.egzosn.pay.baidu.api; + +import org.junit.jupiter.api.Test; + +/** + * Created by hocgin on 2019/11/24. + * email: hocgin@gmail.com + * + * @author hocgin + */ +public class BaiduPayServiceTest { + + @Test + public void orderInfo() { + BaiduPayConfigStorage configStorage = new BaiduPayConfigStorage(); + configStorage.setAppid("APP ID"); + configStorage.setAppKey("APP KEY"); + configStorage.setDealId("DEAL ID"); + configStorage.setKeyPublic("KEY PUBLIC"); + + BaiduPayService payService = new BaiduPayService(configStorage); + // payService.refund() + } +} diff --git a/pom.xml b/pom.xml index 5ae16b1..76479a2 100644 --- a/pom.xml +++ b/pom.xml @@ -64,6 +64,7 @@ 1.2.17 1.2.58 3.3.1 + 5.5.1 @@ -105,6 +106,12 @@ ${zxing.version} + + org.junit.jupiter + junit-jupiter + ${junit.version} + + From f0a080fcb34605bbecc8c174b0136bfa42fb0ae3 Mon Sep 17 00:00:00 2001 From: hocgin Date: Sun, 24 Nov 2019 17:02:17 +0800 Subject: [PATCH 04/37] =?UTF-8?q?#=20=E6=B3=A8=E9=87=8A=E8=A1=A5=E5=85=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../egzosn/pay/baidu/api/BaiduPayService.java | 161 +++++++++++++++--- .../pay/baidu/bean/BaiduRefundOrder.java | 12 ++ .../pay/baidu/bean/BaiduTransactionType.java | 20 ++- 3 files changed, 167 insertions(+), 26 deletions(-) diff --git a/pay-java-baidu/src/main/java/com/egzosn/pay/baidu/api/BaiduPayService.java b/pay-java-baidu/src/main/java/com/egzosn/pay/baidu/api/BaiduPayService.java index 47a7c8b..fa05920 100644 --- a/pay-java-baidu/src/main/java/com/egzosn/pay/baidu/api/BaiduPayService.java +++ b/pay-java-baidu/src/main/java/com/egzosn/pay/baidu/api/BaiduPayService.java @@ -2,6 +2,12 @@ package com.egzosn.pay.baidu.api; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; +import com.egzosn.pay.baidu.bean.BaiduPayOrder; +import com.egzosn.pay.baidu.bean.BaiduRefundOrder; +import com.egzosn.pay.baidu.bean.BaiduTransactionType; +import com.egzosn.pay.baidu.bean.type.AuditStatus; +import com.egzosn.pay.baidu.util.Asserts; +import com.egzosn.pay.baidu.util.NoNullMap; import com.egzosn.pay.common.api.BasePayService; import com.egzosn.pay.common.bean.*; import com.egzosn.pay.common.http.HttpConfigStorage; @@ -9,12 +15,6 @@ import com.egzosn.pay.common.http.UriVariables; import com.egzosn.pay.common.util.DateUtils; import com.egzosn.pay.common.util.sign.SignUtils; import com.egzosn.pay.common.util.str.StringUtils; -import com.egzosn.pay.baidu.bean.BaiduPayOrder; -import com.egzosn.pay.baidu.bean.BaiduRefundOrder; -import com.egzosn.pay.baidu.bean.BaiduTransactionType; -import com.egzosn.pay.baidu.bean.type.AuditStatus; -import com.egzosn.pay.baidu.util.Asserts; -import com.egzosn.pay.baidu.util.NoNullMap; import java.math.BigDecimal; import java.util.Date; @@ -52,6 +52,12 @@ public class BaiduPayService extends BasePayService params) { if (!RESPONSE_SUCCESS.equals(params.get(RESPONSE_STATUS))) { @@ -60,9 +66,15 @@ public class BaiduPayService extends BasePayService params, String sign) { - String keyPrivate = payConfigStorage.getKeyPrivate(); String rsaSign = String.valueOf(params.get(RSA_SIGN)); String targetRsaSign = getRsaSign(params, RSA_SIGN); LOG.debug("百度返回的签名: " + rsaSign + " 本地产生的签名: " + targetRsaSign); @@ -74,13 +86,19 @@ public class BaiduPayService extends BasePayService orderInfo(PayOrder order) { if (!(order instanceof BaiduPayOrder)) { throw new UnsupportedOperationException("请使用 " + BaiduPayOrder.class.getName()); } NoNullMap params = getUseOrderInfoParams(order); - String rsaSign = getRsaSignUserOrderInfo(params, payConfigStorage.getKeyPrivate()); + String rsaSign = getRsaSign(params, RSA_SIGN); params.putIfNoNull(RSA_SIGN, rsaSign); return params; } @@ -119,6 +137,13 @@ public class BaiduPayService extends BasePayService orderInfo, @@ -232,29 +264,64 @@ public class BaiduPayService extends BasePayService microPay(PayOrder order) { throw new UnsupportedOperationException("百度不支持刷卡付"); } + /** + * 查询订单 + * + * @param tradeNo 支付平台订单号 + * @param outTradeNo 商户单号 + * @return + */ @Override public Map query(String tradeNo, String outTradeNo) { return secondaryInterface(tradeNo, outTradeNo, BaiduTransactionType.PAY_QUERY); } + /** + * 百度不支持该操作 + * + * @param tradeNo 支付平台订单号 + * @param outTradeNo 商户单号 + * @return + */ @Override @Deprecated public Map close(String tradeNo, String outTradeNo) { throw new UnsupportedOperationException("不支持该操作"); } + /** + * 退款, 请使用 {@link com.egzosn.pay.baidu.api.BaiduPayService#refundUseBaidu} + * + * @param orderId + * @param userId + * @param refundAmount 退款金额 + * @param totalAmount 总金额 + * @return + */ @Override @Deprecated public Map refund(String orderId, @@ -264,6 +331,16 @@ public class BaiduPayService extends BasePayService refundUseBaidu(Long orderId, Long userId, Integer refundType, @@ -272,12 +349,24 @@ public class BaiduPayService extends BasePayService refund(RefundOrder refundOrder) { throw new UnsupportedOperationException("请使用 " + getClass().getName() + "#refundUseBaidu"); } + /** + * 退款, 请使用 {@link com.egzosn.pay.baidu.api.BaiduPayService#refundUseBaidu} + * + * @param refundOrder + * @return + */ public Map refundUseBaidu(BaiduRefundOrder refundOrder) { Map parameters = getUseQueryPay(); BaiduTransactionType transactionType = BaiduTransactionType.APPLY_REFUND; @@ -295,6 +384,8 @@ public class BaiduPayService extends BasePayService refundquery(RefundOrder refundOrder) { return refundquery(refundOrder.getTradeNo(), refundOrder.getOutTradeNo()); } + /** + * 下载资金账单 + * + * @param billDate 账单时间:日账单格式为yyyy-MM-dd,月账单格式为yyyy-MM。 + * @param access_token + * @return + */ @Override public Map downloadbill(Date billDate, String access_token) { Map parameters = new HashMap<>(); @@ -327,6 +431,13 @@ public class BaiduPayService extends BasePayService downloadOrderBill(Date billDate, String access_token) { Map parameters = new HashMap<>(); parameters.put("access_token", access_token); @@ -335,6 +446,14 @@ public class BaiduPayService extends BasePayService secondaryInterface(Object orderId, String siteId, @@ -350,24 +469,24 @@ public class BaiduPayService extends BasePayService params, String privateKey) { - Map signParams = new HashMap<>(); - signParams.put(APP_KEY, String.valueOf(params.get(APP_KEY))); - signParams.put(DEAL_ID, String.valueOf(params.get(DEAL_ID))); - signParams.put(TP_ORDER_ID, String.valueOf(params.get(TP_ORDER_ID))); - signParams.put(TOTAL_AMOUNT, String.valueOf(params.get(TOTAL_AMOUNT))); - if (signParams.containsValue(null)) { - throw new IllegalArgumentException("参数 " + signParams.keySet().toString() + " 均为必填"); - } - - return SignUtils.RSA.sign(params, privateKey, "UTF-8"); - } - + /** + * 签名 + * + * @param params + * @param ignoreKeys + * @return + */ private String getRsaSign(Map params, String... ignoreKeys) { String waitSignVal = SignUtils.parameterText(params, "&", false, ignoreKeys); return SignUtils.RSA.createSign(waitSignVal, payConfigStorage.getKeyPrivate(), "UTF-8"); diff --git a/pay-java-baidu/src/main/java/com/egzosn/pay/baidu/bean/BaiduRefundOrder.java b/pay-java-baidu/src/main/java/com/egzosn/pay/baidu/bean/BaiduRefundOrder.java index ee68440..6386be8 100644 --- a/pay-java-baidu/src/main/java/com/egzosn/pay/baidu/bean/BaiduRefundOrder.java +++ b/pay-java-baidu/src/main/java/com/egzosn/pay/baidu/bean/BaiduRefundOrder.java @@ -5,9 +5,21 @@ import com.egzosn.pay.common.bean.RefundOrder; import java.math.BigDecimal; public class BaiduRefundOrder extends RefundOrder { + /** + * 平台用户ID + */ private Long userId; + /** + * 退款类型 + */ private Integer refundType; + /** + * 退款原因 + */ private String refundReason; + /** + * 平台订单ID + */ private String tpOrderId; /** * 退款金额,单位:分,发起部分退款时必传 diff --git a/pay-java-baidu/src/main/java/com/egzosn/pay/baidu/bean/BaiduTransactionType.java b/pay-java-baidu/src/main/java/com/egzosn/pay/baidu/bean/BaiduTransactionType.java index 3e23333..3c3838f 100644 --- a/pay-java-baidu/src/main/java/com/egzosn/pay/baidu/bean/BaiduTransactionType.java +++ b/pay-java-baidu/src/main/java/com/egzosn/pay/baidu/bean/BaiduTransactionType.java @@ -3,15 +3,25 @@ package com.egzosn.pay.baidu.bean; import com.egzosn.pay.common.bean.TransactionType; public enum BaiduTransactionType implements TransactionType { - // 查询支付状态 + /** + * 查询支付状态 + */ PAY_QUERY("https://dianshang.baidu.com/platform/entity/openapi/queryorderdetail", "PAY_QUERY"), - // 取消核销 + /** + * 取消核销 + */ REFUND_QUERY("https://nop.nuomi.com/nop/server/rest", "nuomi.cashier.syncorderstatus"), - // 下载资金账单 + /** + * 下载资金账单 + */ DOWNLOAD_BILL("https://openapi.baidu.com/rest/2.0/smartapp/pay/paymentservice/capitaBill", "DOWNLOAD_BILL"), - // 下载订单对账单 + /** + * 下载订单对账单 + */ DOWNLOAD_ORDER_BILL("https://openapi.baidu.com/rest/2.0/smartapp/pay/paymentservice/orderBill", "DOWNLOAD_ORDER_BILL"), - // 申请退款 + /** + * 申请退款 + */ APPLY_REFUND("https://nop.nuomi.com/nop/server/rest", "nuomi.cashier.applyorderrefund"); private final String method; private final String url; From b8298c31004c6e373e8be694b49d8efd228284c3 Mon Sep 17 00:00:00 2001 From: hocgin Date: Sun, 24 Nov 2019 17:02:50 +0800 Subject: [PATCH 05/37] =?UTF-8?q?#=20=E6=B3=A8=E9=87=8A=E8=A1=A5=E5=85=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/egzosn/pay/baidu/bean/BaiduTransactionType.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pay-java-baidu/src/main/java/com/egzosn/pay/baidu/bean/BaiduTransactionType.java b/pay-java-baidu/src/main/java/com/egzosn/pay/baidu/bean/BaiduTransactionType.java index 3c3838f..7a0cefe 100644 --- a/pay-java-baidu/src/main/java/com/egzosn/pay/baidu/bean/BaiduTransactionType.java +++ b/pay-java-baidu/src/main/java/com/egzosn/pay/baidu/bean/BaiduTransactionType.java @@ -6,7 +6,7 @@ public enum BaiduTransactionType implements TransactionType { /** * 查询支付状态 */ - PAY_QUERY("https://dianshang.baidu.com/platform/entity/openapi/queryorderdetail", "PAY_QUERY"), + PAY_QUERY("https://dianshang.baidu.com/platform/entity/openapi/queryorderdetail", null), /** * 取消核销 */ @@ -14,11 +14,11 @@ public enum BaiduTransactionType implements TransactionType { /** * 下载资金账单 */ - DOWNLOAD_BILL("https://openapi.baidu.com/rest/2.0/smartapp/pay/paymentservice/capitaBill", "DOWNLOAD_BILL"), + DOWNLOAD_BILL("https://openapi.baidu.com/rest/2.0/smartapp/pay/paymentservice/capitaBill", null), /** * 下载订单对账单 */ - DOWNLOAD_ORDER_BILL("https://openapi.baidu.com/rest/2.0/smartapp/pay/paymentservice/orderBill", "DOWNLOAD_ORDER_BILL"), + DOWNLOAD_ORDER_BILL("https://openapi.baidu.com/rest/2.0/smartapp/pay/paymentservice/orderBill", null), /** * 申请退款 */ From ecc0c5e3d3a697090b25ef4700b716586e985053 Mon Sep 17 00:00:00 2001 From: hocgin Date: Sun, 24 Nov 2019 17:12:54 +0800 Subject: [PATCH 06/37] =?UTF-8?q?#=20=E6=B3=A8=E9=87=8A=E8=A1=A5=E5=85=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../egzosn/pay/baidu/api/BaiduPayService.java | 39 +++++++++---------- .../com/egzosn/pay/baidu/util/NoNullMap.java | 14 ------- 2 files changed, 18 insertions(+), 35 deletions(-) delete mode 100644 pay-java-baidu/src/main/java/com/egzosn/pay/baidu/util/NoNullMap.java diff --git a/pay-java-baidu/src/main/java/com/egzosn/pay/baidu/api/BaiduPayService.java b/pay-java-baidu/src/main/java/com/egzosn/pay/baidu/api/BaiduPayService.java index fa05920..2d66ff7 100644 --- a/pay-java-baidu/src/main/java/com/egzosn/pay/baidu/api/BaiduPayService.java +++ b/pay-java-baidu/src/main/java/com/egzosn/pay/baidu/api/BaiduPayService.java @@ -7,7 +7,6 @@ import com.egzosn.pay.baidu.bean.BaiduRefundOrder; import com.egzosn.pay.baidu.bean.BaiduTransactionType; import com.egzosn.pay.baidu.bean.type.AuditStatus; import com.egzosn.pay.baidu.util.Asserts; -import com.egzosn.pay.baidu.util.NoNullMap; import com.egzosn.pay.common.api.BasePayService; import com.egzosn.pay.common.bean.*; import com.egzosn.pay.common.http.HttpConfigStorage; @@ -22,7 +21,7 @@ import java.util.HashMap; import java.util.Map; -public class BaiduPayService extends BasePayService { +public class BaiduPayService extends BasePayService { public static final String APP_KEY = "appKey"; public static final String APP_ID = "appId"; public static final String DEAL_ID = "dealId"; @@ -43,11 +42,11 @@ public class BaiduPayService extends BasePayService orderInfo(PayOrder order) { - if (!(order instanceof BaiduPayOrder)) { - throw new UnsupportedOperationException("请使用 " + BaiduPayOrder.class.getName()); - } - NoNullMap params = getUseOrderInfoParams(order); + public Map orderInfo(BaiduPayOrder order) { + Map params = getUseOrderInfoParams(order); String rsaSign = getRsaSign(params, RSA_SIGN); - params.putIfNoNull(RSA_SIGN, rsaSign); + params.put(RSA_SIGN, rsaSign); return params; } @@ -122,18 +118,19 @@ public class BaiduPayService extends BasePayService getUseOrderInfoParams(PayOrder order) { + private Map getUseOrderInfoParams(PayOrder order) { BaiduPayOrder payOrder = (BaiduPayOrder) order; - NoNullMap result = new NoNullMap<>(); + Map result = new HashMap<>(); String appKey = payConfigStorage.getAppKey(); String dealId = payConfigStorage.getDealId(); - result.putIfNoNull(APP_KEY, appKey) - .putIfNoNull(TP_ORDER_ID, payOrder.getTradeNo()) - .putIfNoNull(DEAL_ID, dealId) - .putIfNoNull(DEAL_TITLE, payOrder.getSubject()) - .putIfNoNull(SIGN_FIELDS_RANGE, payOrder.getSignFieldsRange()) - .putIfNoNull(BIZ_INFO, JSON.toJSONString(payOrder.getBizInfo())) - .putIfNoNull(TOTAL_AMOUNT, String.valueOf(order.getPrice())); + result.put(APP_KEY, appKey); + result.put(TP_ORDER_ID, payOrder.getTradeNo()); + result.put(DEAL_ID, dealId); + result.put(DEAL_TITLE, payOrder.getSubject()); + result.put(SIGN_FIELDS_RANGE, payOrder.getSignFieldsRange()); + result.put(BIZ_INFO, JSON.toJSONString(payOrder.getBizInfo())); + result.put(TOTAL_AMOUNT, String.valueOf(order.getPrice())); + return result; } @@ -272,7 +269,7 @@ public class BaiduPayService extends BasePayService microPay(PayOrder order) { + public Map microPay(BaiduPayOrder order) { throw new UnsupportedOperationException("百度不支持刷卡付"); } diff --git a/pay-java-baidu/src/main/java/com/egzosn/pay/baidu/util/NoNullMap.java b/pay-java-baidu/src/main/java/com/egzosn/pay/baidu/util/NoNullMap.java deleted file mode 100644 index 7e24a13..0000000 --- a/pay-java-baidu/src/main/java/com/egzosn/pay/baidu/util/NoNullMap.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.egzosn.pay.baidu.util; - -import java.util.HashMap; - -public class NoNullMap extends HashMap { - - public NoNullMap putIfNoNull(K key, V value) { - if (value != null) { - put(key, value); - } - return this; - } - -} From bf424148d76e7e8a71ba360410565f6bb464d432 Mon Sep 17 00:00:00 2001 From: egzosn Date: Thu, 9 Jan 2020 18:29:13 +0800 Subject: [PATCH 07/37] =?UTF-8?q?2.13.2-SNAPSHOT=E5=BC=80=E5=A7=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pay-java-ali/pom.xml | 2 +- pay-java-fuiou/pom.xml | 2 +- pay-java-payoneer/pom.xml | 2 +- pay-java-paypal/pom.xml | 2 +- pay-java-union/pom.xml | 2 +- pay-java-wx-youdian/pom.xml | 2 +- pay-java-wx/pom.xml | 2 +- pay-java-yiji/pom.xml | 2 +- pom.xml | 16 ++++++++++------ 9 files changed, 18 insertions(+), 14 deletions(-) diff --git a/pay-java-ali/pom.xml b/pay-java-ali/pom.xml index 229ac85..d909904 100644 --- a/pay-java-ali/pom.xml +++ b/pay-java-ali/pom.xml @@ -5,7 +5,7 @@ pay-java-parent com.egzosn - 2.13.1 + 2.13.2-SNAPSHOT 4.0.0 pay-java-ali diff --git a/pay-java-fuiou/pom.xml b/pay-java-fuiou/pom.xml index 524b783..b3c1383 100644 --- a/pay-java-fuiou/pom.xml +++ b/pay-java-fuiou/pom.xml @@ -5,7 +5,7 @@ pay-java-parent com.egzosn - 2.13.1 + 2.13.2-SNAPSHOT 4.0.0 pay-java-fuiou diff --git a/pay-java-payoneer/pom.xml b/pay-java-payoneer/pom.xml index 19f68f3..22940d6 100644 --- a/pay-java-payoneer/pom.xml +++ b/pay-java-payoneer/pom.xml @@ -5,7 +5,7 @@ pay-java-parent com.egzosn - 2.13.1 + 2.13.2-SNAPSHOT 4.0.0 pay-java-payoneer diff --git a/pay-java-paypal/pom.xml b/pay-java-paypal/pom.xml index f0d8047..7f56a2e 100644 --- a/pay-java-paypal/pom.xml +++ b/pay-java-paypal/pom.xml @@ -5,7 +5,7 @@ pay-java-parent com.egzosn - 2.13.1 + 2.13.2-SNAPSHOT 4.0.0 diff --git a/pay-java-union/pom.xml b/pay-java-union/pom.xml index d22f2fd..61cee3e 100644 --- a/pay-java-union/pom.xml +++ b/pay-java-union/pom.xml @@ -5,7 +5,7 @@ pay-java-parent com.egzosn - 2.13.1 + 2.13.2-SNAPSHOT 4.0.0 diff --git a/pay-java-wx-youdian/pom.xml b/pay-java-wx-youdian/pom.xml index 0b77a06..7ce65c9 100644 --- a/pay-java-wx-youdian/pom.xml +++ b/pay-java-wx-youdian/pom.xml @@ -5,7 +5,7 @@ pay-java-parent com.egzosn - 2.13.1 + 2.13.2-SNAPSHOT 4.0.0 pay-java-wx-youdian diff --git a/pay-java-wx/pom.xml b/pay-java-wx/pom.xml index 9e124f0..a305a8c 100644 --- a/pay-java-wx/pom.xml +++ b/pay-java-wx/pom.xml @@ -5,7 +5,7 @@ pay-java-parent com.egzosn - 2.13.1 + 2.13.2-SNAPSHOT 4.0.0 pay-java-wx diff --git a/pay-java-yiji/pom.xml b/pay-java-yiji/pom.xml index bb8b23e..44ba156 100644 --- a/pay-java-yiji/pom.xml +++ b/pay-java-yiji/pom.xml @@ -5,7 +5,7 @@ pay-java-parent com.egzosn - 2.13.1 + 2.13.2-SNAPSHOT 4.0.0 diff --git a/pom.xml b/pom.xml index b426986..4f03d79 100644 --- a/pom.xml +++ b/pom.xml @@ -7,7 +7,7 @@ com.egzosn pay-java-parent pom - 2.13.1 + 2.13.2-SNAPSHOT Pay Java - Parent Pay Java Parent @@ -34,6 +34,11 @@ zhangchenghui.dev@gmail.com https://github.com/objcoding + + hocgin + hocgin@gmail.com + https://github.com/hocgin + scm:git:https://github.com/egzosn/pay-java-parent.git @@ -59,7 +64,7 @@ - 2.13.1 + 2.13.2-SNAPSHOT 4.5.4 1.2.17 1.2.58 @@ -105,7 +110,6 @@ core ${zxing.version} - org.junit.jupiter junit-jupiter @@ -191,10 +195,10 @@ sign-artifacts - install - + none + From 0f1255fe06a846384decbb9563637aa1b552e2f1 Mon Sep 17 00:00:00 2001 From: egzosn Date: Tue, 10 Mar 2020 22:41:02 +0800 Subject: [PATCH 08/37] =?UTF-8?q?=E8=87=AA=E5=AE=9A=E4=B9=89=E5=8F=82?= =?UTF-8?q?=E6=95=B0=E4=BD=BF=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/egzosn/pay/ali/api/AliPayService.java | 2 +- .../egzosn/pay/baidu/api/BaiduPayService.java | 19 +-- .../egzosn/pay/baidu/bean/BaiduPayOrder.java | 6 + .../egzosn/pay/common/api/BasePayService.java | 16 ++ .../com/egzosn/pay/common/bean/Order.java | 8 +- .../com/egzosn/pay/common/bean/PayOrder.java | 10 +- .../egzosn/pay/common/bean/TransferOrder.java | 34 ++++- pay-java-demo/pom.xml | 34 +---- .../egzosn/pay/fuiou/api/FuiouPayService.java | 2 +- .../pay/payoneer/api/PayoneerPayService.java | 3 +- .../egzosn/pay/union/api/UnionPayService.java | 3 +- .../wx/youdian/api/WxYouDianPayService.java | 2 +- .../java/com/egzosn/pay/wx/api/WxConst.java | 42 ++++++ .../com/egzosn/pay/wx/api/WxPayService.java | 59 +++----- .../egzosn/pay/yiji/api/YiJiPayService.java | 4 +- pom.xml | 141 ++++++++++-------- 16 files changed, 228 insertions(+), 157 deletions(-) create mode 100644 pay-java-wx/src/main/java/com/egzosn/pay/wx/api/WxConst.java 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-baidu/src/main/java/com/egzosn/pay/baidu/api/BaiduPayService.java b/pay-java-baidu/src/main/java/com/egzosn/pay/baidu/api/BaiduPayService.java index 2d66ff7..d2ee285 100644 --- a/pay-java-baidu/src/main/java/com/egzosn/pay/baidu/api/BaiduPayService.java +++ b/pay-java-baidu/src/main/java/com/egzosn/pay/baidu/api/BaiduPayService.java @@ -12,6 +12,7 @@ import com.egzosn.pay.common.bean.*; import com.egzosn.pay.common.http.HttpConfigStorage; import com.egzosn.pay.common.http.UriVariables; import com.egzosn.pay.common.util.DateUtils; +import com.egzosn.pay.common.util.Util; import com.egzosn.pay.common.util.sign.SignUtils; import com.egzosn.pay.common.util.str.StringUtils; @@ -21,7 +22,7 @@ import java.util.HashMap; import java.util.Map; -public class BaiduPayService extends BasePayService { +public class BaiduPayService extends BasePayService { public static final String APP_KEY = "appKey"; public static final String APP_ID = "appId"; public static final String DEAL_ID = "dealId"; @@ -84,7 +85,7 @@ public class BaiduPayService extends BasePayService orderInfo(BaiduPayOrder order) { + public Map orderInfo(PayOrder order) { Map params = getUseOrderInfoParams(order); String rsaSign = getRsaSign(params, RSA_SIGN); params.put(RSA_SIGN, rsaSign); @@ -129,7 +130,7 @@ public class BaiduPayService extends BasePayService microPay(BaiduPayOrder order) { + public Map microPay(PayOrder order) { throw new UnsupportedOperationException("百度不支持刷卡付"); } diff --git a/pay-java-baidu/src/main/java/com/egzosn/pay/baidu/bean/BaiduPayOrder.java b/pay-java-baidu/src/main/java/com/egzosn/pay/baidu/bean/BaiduPayOrder.java index 58e5417..a0b5ffd 100644 --- a/pay-java-baidu/src/main/java/com/egzosn/pay/baidu/bean/BaiduPayOrder.java +++ b/pay-java-baidu/src/main/java/com/egzosn/pay/baidu/bean/BaiduPayOrder.java @@ -8,6 +8,9 @@ import java.math.BigDecimal; import java.util.Collections; import java.util.List; +import static com.egzosn.pay.baidu.api.BaiduPayService.BIZ_INFO; +import static com.egzosn.pay.baidu.api.BaiduPayService.SIGN_FIELDS_RANGE; + public class BaiduPayOrder extends PayOrder { /** @@ -50,6 +53,7 @@ public class BaiduPayOrder extends PayOrder { public void setBizInfo(JSONObject bizInfo) { this.bizInfo = bizInfo; + addAttr(BIZ_INFO, bizInfo); } public List getBannedChannels() { @@ -58,6 +62,7 @@ public class BaiduPayOrder extends PayOrder { public void setBannedChannels(List bannedChannels) { this.bannedChannels = bannedChannels; + addAttr("bannedChannels", bannedChannels); } public String getSignFieldsRange() { @@ -66,6 +71,7 @@ public class BaiduPayOrder extends PayOrder { public void setSignFieldsRange(String signFieldsRange) { this.signFieldsRange = signFieldsRange; + addAttr(SIGN_FIELDS_RANGE, signFieldsRange); } } 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-demo/pom.xml b/pay-java-demo/pom.xml index 896b184..e7599d0 100644 --- a/pay-java-demo/pom.xml +++ b/pay-java-demo/pom.xml @@ -90,39 +90,7 @@ - - - port8080 - - 8080 - - - true - - - - port9096 - - 9096 - - - - local - - local - - - true - - - - proc - - proc - - - pay-java-demo @@ -140,7 +108,7 @@ tomcat7-maven-plugin 2.0 - ${port} + 8080 / UTF-8 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..80360b8 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 @@ -18,7 +18,6 @@ import org.apache.http.Header; import org.apache.http.entity.ContentType; import org.apache.http.message.BasicHeader; -import java.awt.image.BufferedImage; import java.math.BigDecimal; import java.util.*; @@ -184,7 +183,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..50dbcf8 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 @@ -20,7 +20,6 @@ import com.egzosn.pay.union.bean.SDKConstants; import com.egzosn.pay.union.bean.UnionPayMessage; import com.egzosn.pay.union.bean.UnionTransactionType; -import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; @@ -284,7 +283,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..afd5d43 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 @@ -10,8 +10,6 @@ import com.egzosn.pay.common.util.Util; import com.egzosn.pay.common.util.sign.SignUtils; import com.egzosn.pay.common.util.str.StringUtils; import com.egzosn.pay.yiji.bean.YiJiTransactionType; - -import java.awt.image.BufferedImage; import java.math.BigDecimal; import java.util.Collections; import java.util.Date; @@ -175,7 +173,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); } diff --git a/pom.xml b/pom.xml index 4f03d79..f2ecd1f 100644 --- a/pom.xml +++ b/pom.xml @@ -140,68 +140,85 @@ utf-8 - - org.sonatype.plugins - nexus-staging-maven-plugin - 1.6.3 - true - - ossrh - https://oss.sonatype.org/ - false - - - - org.apache.maven.plugins - maven-release-plugin - 2.5.1 - - false - false - release - deploy - - - - org.apache.maven.plugins - maven-javadoc-plugin - 2.10.3 - - - attach-javadocs - - jar - - - - - - org.apache.maven.plugins - maven-source-plugin - 3.1.0 - - - attach-sources - - jar-no-fork - - - - - - org.apache.maven.plugins - maven-gpg-plugin - 1.6 - - - sign-artifacts - none - - - - +
+ + + + local + + true + + + + proc + + + + org.sonatype.plugins + nexus-staging-maven-plugin + 1.6.3 + true + + ossrh + https://oss.sonatype.org/ + false + + + + org.apache.maven.plugins + maven-release-plugin + 2.5.1 + + false + false + release + deploy + + + + org.apache.maven.plugins + maven-javadoc-plugin + 2.10.3 + + + attach-javadocs + + jar + + + + + + org.apache.maven.plugins + maven-source-plugin + 3.1.0 + + + attach-sources + + jar-no-fork + + + + + + org.apache.maven.plugins + maven-gpg-plugin + 1.6 + + + sign-artifacts + install + + sign + + + + + + + + \ No newline at end of file From f05f09c3ea01be8c402276414f2829c14daead42 Mon Sep 17 00:00:00 2001 From: egzosn Date: Tue, 10 Mar 2020 22:42:20 +0800 Subject: [PATCH 09/37] =?UTF-8?q?=E8=87=AA=E5=AE=9A=E4=B9=89=E5=8F=82?= =?UTF-8?q?=E6=95=B0=E4=BD=BF=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/egzosn/pay/baidu/bean/BaiduPayOrder.java | 1 - 1 file changed, 1 deletion(-) diff --git a/pay-java-baidu/src/main/java/com/egzosn/pay/baidu/bean/BaiduPayOrder.java b/pay-java-baidu/src/main/java/com/egzosn/pay/baidu/bean/BaiduPayOrder.java index a0b5ffd..2f82452 100644 --- a/pay-java-baidu/src/main/java/com/egzosn/pay/baidu/bean/BaiduPayOrder.java +++ b/pay-java-baidu/src/main/java/com/egzosn/pay/baidu/bean/BaiduPayOrder.java @@ -62,7 +62,6 @@ public class BaiduPayOrder extends PayOrder { public void setBannedChannels(List bannedChannels) { this.bannedChannels = bannedChannels; - addAttr("bannedChannels", bannedChannels); } public String getSignFieldsRange() { From 7468e29c3cb7f32eae2d47c7ca451a78fbb7acd6 Mon Sep 17 00:00:00 2001 From: egzosn Date: Tue, 10 Mar 2020 22:47:34 +0800 Subject: [PATCH 10/37] =?UTF-8?q?=E8=87=AA=E5=AE=9A=E4=B9=89=E8=AE=A2?= =?UTF-8?q?=E5=8D=95=E5=8F=82=E6=95=B0=E4=BD=BF=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pay-java-demo/src/main/webapp/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pay-java-demo/src/main/webapp/index.html b/pay-java-demo/src/main/webapp/index.html index 03b359c..6aed160 100644 --- a/pay-java-demo/src/main/webapp/index.html +++ b/pay-java-demo/src/main/webapp/index.html @@ -69,12 +69,12 @@
-
各个支付对应的交易类型可自行查看对应的官方文档,本项目已实现几种交易类型,对应各个支付类型的com.egzosn.pay.common.bean.TransactionType具体实现
新版支付宝(com.egzosn.pay.ali.bean.AliTransactionType): 即时付款=PAGE , app支付=APP , 手机网站支付=WAP , 扫码付=SWEEPPAY, 条码付=BAR_CODE, 声波付=WAVE_CODE
微信(com.egzosn.pay.wx.bean.WxTransactionType): 公众号支付=JSAPI , 移动支付=APP , 扫码付=NATIVE
银联(com.egzosn.pay.union.bean.UnionTransactionType):苹果支付=APPLE,手机控件=APP,WAP支付=WAP,网关支付=WEB,无跳转支付=NO_JUMP,B2B支付=B2B,申码(主扫场景)=APPLY_QR_CODE,消费(被扫场景)=CONSUME
友店微信(com.egzosn.pay.wx.youdian.bean.YoudianTransactionType): 扫码付=NATIVE
富友(com.egzosn.pay.fuiou.bean.FuiouTransactionType): B2B,B2C
+
详情请查看 com.egzosn.pay.common.bean.TransactionType对应的子类


From cfe4d72e50aae1392a79054f6c04348d2a3f1001 Mon Sep 17 00:00:00 2001 From: egzosn Date: Sat, 25 Apr 2020 16:08:14 +0800 Subject: [PATCH 11/37] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=94=AF=E4=BB=98?= =?UTF-8?q?=E8=AE=A2=E5=8D=95=E8=BF=87=E6=9C=9F=E6=97=B6=E9=97=B4=E4=B8=8D?= =?UTF-8?q?=E7=B2=BE=E5=87=86=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/egzosn/pay/common/util/DateUtils.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) 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 b101b44..f8141d9 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 @@ -13,7 +13,7 @@ import java.util.*; * 日期转换运算工具 * * @author egan - *
+ * 
  *         email egzosn@gmail.com
  *         date 2018-11-21 16:43:20
  *         
@@ -23,6 +23,7 @@ public final class DateUtils { } private static final Log LOG = LogFactory.getLog(DateUtils.class); + static final class DateFormatHolder { private static final ThreadLocal>> THREADLOCAL_FORMATS = new ThreadLocal>>(); @@ -37,7 +38,7 @@ public final class DateUtils { THREADLOCAL_FORMATS.set(new SoftReference(formats)); } - SimpleDateFormat format = formats.get(pattern); + SimpleDateFormat format = formats.get(pattern); if (format == null) { format = new SimpleDateFormat(pattern); @@ -66,6 +67,7 @@ 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"); @@ -77,9 +79,11 @@ public final class DateUtils { } 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); } @@ -99,7 +103,7 @@ public final class DateUtils { * @return 分钟数 */ public static final long minutesRemaining(Date date) { - return (date.getTime() - System.currentTimeMillis()) / 1000 / 60; + return (date.getTime() / 1000 / 60 - System.currentTimeMillis() / 1000 / 60); } /** From 12a6efb176af301673f473568234349530793558 Mon Sep 17 00:00:00 2001 From: egzosn Date: Sat, 25 Apr 2020 16:09:19 +0800 Subject: [PATCH 12/37] =?UTF-8?q?1.=E6=94=AF=E4=BB=98=E5=AE=9D=E5=B0=8F?= =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E6=94=AF=E4=BB=98=202.=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E4=BA=8C=E7=BB=B4=E7=A0=81=E6=94=AF=E4=BB=98=E8=BF=87=E6=9C=9F?= =?UTF-8?q?=E6=97=B6=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pay-java-ali/README.md | 12 ++++++++++++ .../java/com/egzosn/pay/ali/api/AliPayService.java | 7 ++++++- .../com/egzosn/pay/ali/bean/AliTransactionType.java | 4 ++++ .../java/com/egzosn/pay/common/bean/PayOrder.java | 1 + 4 files changed, 23 insertions(+), 1 deletion(-) diff --git a/pay-java-ali/README.md b/pay-java-ali/README.md index bebaa86..e7a2f5e 100644 --- a/pay-java-ali/README.md +++ b/pay-java-ali/README.md @@ -113,6 +113,18 @@ Map appOrderInfo = service.orderInfo(payOrder); /*-----------/APP-------------------*/ +``` +#### 小程序支付 + +```java + + /*-----------APP-------------------*/ + payOrder.setTransactionType(AliTransactionType.MINAPP); + payOrder.setOpenid("支付宝小程序授权登录成功后获取到的支付宝 user_id") + //获取小程序支付所需的信息组,直接给小程序网页端就可使用 + Map appOrderInfo = service.orderInfo(payOrder); + /*-----------/APP-------------------*/ + ``` #### 即时到帐 WAP 网页支付 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 06cd7b5..7cc5075 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 @@ -213,6 +213,11 @@ public class AliPayService extends BasePayService { bizContent.put(PASSBACK_PARAMS, order.getAddition()); bizContent.put(PRODUCT_CODE, "QUICK_MSECURITY_PAY"); break; + case MINAPP: + bizContent.put("extend_params", order.getAddition()); + bizContent.put("buyer_id", order.getOpenid()); + bizContent.put(PRODUCT_CODE, "FACE_TO_FACE_PAYMENT"); + break; case BAR_CODE: case WAVE_CODE: case SECURITY_CODE: @@ -223,7 +228,7 @@ public class AliPayService extends BasePayService { } if (null != order.getExpirationTime()) { - bizContent.put("timeout_express", DateUtils.minutesRemaining(order.getExpirationTime()) + "m"); + bizContent.put(order.getTransactionType() == AliTransactionType.SWEEPPAY ? "qr_code_timeout_express" : "timeout_express", DateUtils.minutesRemaining(order.getExpirationTime()) + "m"); } orderInfo.put(BIZ_CONTENT, JSON.toJSONString(bizContent)); orderInfo.putAll(order.getAttrs()); 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 bb722de..2073ba3 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 @@ -44,6 +44,10 @@ public enum AliTransactionType implements TransactionType { * 声波付 */ WAVE_CODE("alipay.trade.pay"), + /** + * 小程序 + */ + MINAPP("alipay.trade.create"), /** * 刷脸付 */ 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 dd550be..1982763 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 @@ -71,6 +71,7 @@ public class PayOrder implements Order { /** * 用户唯一标识 * 微信含 sub_openid 字段 + * 支付宝 buyer_id */ private String openid; /** From d8d9cd6a88a95c06a2dc9b8146ffc0d24d26819b Mon Sep 17 00:00:00 2001 From: egzosn Date: Sat, 25 Apr 2020 16:09:41 +0800 Subject: [PATCH 13/37] =?UTF-8?q?=E8=87=AA=E5=AE=9A=E4=B9=89=E8=AE=A2?= =?UTF-8?q?=E5=8D=95=E5=8F=82=E6=95=B0=E4=BD=BF=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/egzosn/pay/wx/api/WxPayService.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) 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 229a2b5..2814e1f 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 @@ -205,11 +205,12 @@ public class WxPayService extends BasePayService { ((WxTransactionType) order.getTransactionType()).setAttribute(parameters, order); //可覆盖参数 - setParameters(parameters, "notify_url", order); +/* setParameters(parameters, "notify_url", order); setParameters(parameters, "goods_tag", order); setParameters(parameters, "limit_pay", order); setParameters(parameters, "receipt", order); - setParameters(parameters, "product_id", order); + setParameters(parameters, "product_id", order);*/ + parameters.putAll(order.getAttrs()); parameters = preOrderHandler(parameters, order); setSign(parameters); From 871a9838337c783ad4431c2e4c7a959dc6f39ff7 Mon Sep 17 00:00:00 2001 From: faymanwang <1057438332@qq.com> Date: Fri, 15 May 2020 14:35:23 +0800 Subject: [PATCH 14/37] =?UTF-8?q?=E5=BE=AE=E4=BF=A1=E6=94=AF=E4=BB=98-?= =?UTF-8?q?=E5=8F=91=E7=BA=A2=E5=8C=85=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/egzosn/pay/wx/api/WxPayService.java | 60 ++++++- .../com/egzosn/pay/wx/bean/RedpackOrder.java | 152 ++++++++++++++++++ .../egzosn/pay/wx/bean/WxSendredpackType.java | 43 +++++ 3 files changed, 251 insertions(+), 4 deletions(-) create mode 100644 pay-java-wx/src/main/java/com/egzosn/pay/wx/bean/RedpackOrder.java create mode 100644 pay-java-wx/src/main/java/com/egzosn/pay/wx/bean/WxSendredpackType.java 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 2814e1f..845f1b9 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 @@ -12,11 +12,9 @@ import com.egzosn.pay.common.util.Util; import com.egzosn.pay.common.util.sign.SignUtils; import com.egzosn.pay.common.util.sign.encrypt.RSA2; import com.egzosn.pay.common.util.str.StringUtils; -import com.egzosn.pay.wx.bean.WxPayError; -import com.egzosn.pay.wx.bean.WxPayMessage; -import com.egzosn.pay.wx.bean.WxTransactionType; +import com.egzosn.pay.wx.bean.*; import com.egzosn.pay.common.util.XML; -import com.egzosn.pay.wx.bean.WxTransferType; + import java.io.IOException; import java.io.InputStream; import java.math.BigDecimal; @@ -757,4 +755,58 @@ public class WxPayService extends BasePayService { public PayMessage createMessage(Map message) { return WxPayMessage.create(message); } + + /** + * 发放裂变红包 + * 裂变红包:一次可以发放一组红包。首先领取的用户为种子用户,种子用户领取一组红包当中的一个,并可以通过社交分享将剩下的红包给其他用户。裂变红包充分利用了人际传播的优势。 + * + * @author: faymanwang 1057438332@qq.com + * @param redpackOrder 红包实体 + * @return 返回发红包实体后的结果 + */ + public Map sendgroupredpack(RedpackOrder redpackOrder) { + Map parameters = new TreeMap(); + redpackParam(redpackOrder, parameters); + parameters.put("amt_type", "ALL_RAND"); + parameters.put(SIGN, createSign(SignUtils.parameterText(parameters, "&", SIGN), payConfigStorage.getInputCharset())); + return requestTemplate.postForObject(getReqUrl( WxSendredpackType.SENDGROUPREDPACK), XML.getMap2Xml(parameters) , JSONObject.class); + } + + /** + * 查询红包记录 + * 用于商户对已发放的红包进行查询红包的具体信息,可支持普通红包和裂变包 + * 查询红包记录API只支持查询30天内的红包订单,30天之前的红包订单请登录商户平台查询。 + * + * @author: faymanwang 1057438332@qq.com + * @param mchBillno 商户发放红包的商户订单号 + * @return 返回查询结果 + */ + public Map gethbinfo (String mchBillno) { + Map parameters = this.getPublicParameters(); + parameters.put("mch_billno", mchBillno); + parameters.put("bill_type", "MCHT"); + parameters.put(SIGN, createSign(SignUtils.parameterText(parameters, "&", SIGN), payConfigStorage.getInputCharset())); + return requestTemplate.postForObject(getReqUrl( WxSendredpackType.GETHBINFO), XML.getMap2Xml(parameters) , JSONObject.class); + } + + /** + * 微信红包构造参数方法 + * @param redpackOrder 红包实体 + * @param parameters + */ + private void redpackParam(RedpackOrder redpackOrder, Map parameters) { + parameters.put(NONCE_STR, SignUtils.randomStr()); + parameters.put(MCH_ID, payConfigStorage.getPid()); + parameters.put("wxappid", payConfigStorage.getAppid()); + parameters.put("send_name", redpackOrder.getSendName()); + parameters.put("re_openid", redpackOrder.getReOpenid()); + parameters.put("mch_billno", redpackOrder.getMchBillno()); + parameters.put("total_amount", Util.conversionCentAmount(redpackOrder.getTotalAmount())); + parameters.put("total_num", redpackOrder.getTotalNum() > 0 ? redpackOrder.getTotalNum() : 1); + parameters.put("wishing", redpackOrder.getWishing()); + parameters.put("client_ip", StringUtils.isNotEmpty(redpackOrder.getIp()) ? redpackOrder.getIp() : "192.168.0.1"); + parameters.put("act_name", redpackOrder.getActName()); + parameters.put("remark", redpackOrder.getRemark()); + parameters.put("scene_id", redpackOrder.getSceneId()); + } } diff --git a/pay-java-wx/src/main/java/com/egzosn/pay/wx/bean/RedpackOrder.java b/pay-java-wx/src/main/java/com/egzosn/pay/wx/bean/RedpackOrder.java new file mode 100644 index 0000000..801f94f --- /dev/null +++ b/pay-java-wx/src/main/java/com/egzosn/pay/wx/bean/RedpackOrder.java @@ -0,0 +1,152 @@ +package com.egzosn.pay.wx.bean; + +import java.math.BigDecimal; + +/** + * @description: + * @author: 保网 faymanwang 1057438332@qq.com + * @time: 2020/5/15 12:40 + */ +public class RedpackOrder { + /** + * 商户订单号(每个订单号必须唯一。取值范围:0~9,a~z,A~Z) + * 接口根据商户订单号支持重入,如出现超时可再调用 + */ + private String mchBillno; + + /** + * 商户名称:红包发送者名称 + */ + private String sendName; + + /** + * 用户openid + */ + private String reOpenid; + + /** + * 付款金额 每个红包金额必须在默认额度内(默认大于1元,小于200元,可在产品设置中自行申请调高额度) + */ + private BigDecimal totalAmount; + + /** + * 红包发放总人数 + * 普通红包:1 + * 裂变:必须介于(包括)3到20之间 + */ + private int totalNum; + + /** + * 红包祝福语 + */ + private String wishing; + + /** + * 操作者ip,根据支付平台所需进行设置 + */ + private String ip; + + /** + * 活动名称 + */ + private String actName; + + /** + * 备注 + */ + private String remark; + + /** + * 发放红包使用场景,红包金额大于200或者小于1元时必传 + * PRODUCT_1:商品促销 + * PRODUCT_2:抽奖 + * PRODUCT_3:虚拟物品兑奖 + * PRODUCT_4:企业内部福利 + * PRODUCT_5:渠道分润 + * PRODUCT_6:保险回馈 + * PRODUCT_7:彩票派奖 + * PRODUCT_8:税务刮奖 + */ + private String sceneId; + + + public String getMchBillno() { + return mchBillno; + } + + public void setMchBillno(String mchBillno) { + this.mchBillno = mchBillno; + } + + public String getSendName() { + return sendName; + } + + public void setSendName(String sendName) { + this.sendName = sendName; + } + + public String getReOpenid() { + return reOpenid; + } + + public void setReOpenid(String reOpenid) { + this.reOpenid = reOpenid; + } + + public BigDecimal getTotalAmount() { + return totalAmount; + } + + public void setTotalAmount(BigDecimal totalAmount) { + this.totalAmount = totalAmount; + } + + public int getTotalNum() { + return totalNum; + } + + public void setTotalNum(int totalNum) { + this.totalNum = totalNum; + } + + public String getWishing() { + return wishing; + } + + public void setWishing(String wishing) { + this.wishing = wishing; + } + + public String getIp() { + return ip; + } + + public void setIp(String ip) { + this.ip = ip; + } + + public String getActName() { + return actName; + } + + public void setActName(String actName) { + this.actName = actName; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public String getSceneId() { + return sceneId; + } + + public void setSceneId(String sceneId) { + this.sceneId = sceneId; + } +} diff --git a/pay-java-wx/src/main/java/com/egzosn/pay/wx/bean/WxSendredpackType.java b/pay-java-wx/src/main/java/com/egzosn/pay/wx/bean/WxSendredpackType.java new file mode 100644 index 0000000..6e114b2 --- /dev/null +++ b/pay-java-wx/src/main/java/com/egzosn/pay/wx/bean/WxSendredpackType.java @@ -0,0 +1,43 @@ +package com.egzosn.pay.wx.bean; + +import com.egzosn.pay.common.bean.TransferType; + +/** + * @description: + * @author: faymanwang + * @time: 2020/5/14 20:11 + */ +public enum WxSendredpackType implements TransferType { + /** + * 现金红包-发放红包接口 + */ + SENDREDPACK("mmpaymkttransfers/sendredpack"), + /** + * 现金红包-发放裂变红包 + */ + SENDGROUPREDPACK("mmpaymkttransfers/sendgroupredpack"), + /** + * 现金红包-查询红包记录 + */ + GETHBINFO ("mmpaymkttransfers/gethbinfo"), + /** + * 小程序 + */ + SENDMINIPROGRAMHB ("mmpaymkttransfers/sendminiprogramhb") + + ; + + WxSendredpackType(String method) { + this.method = method; + } + private String method; + + @Override + public String getType() { + return this.name(); + } + @Override + public String getMethod() { + return this.method; + } +} From e297bbd155e6ee172e55c24950681bc7251fa09e Mon Sep 17 00:00:00 2001 From: faymanwang <1057438332@qq.com> Date: Fri, 15 May 2020 15:16:38 +0800 Subject: [PATCH 15/37] =?UTF-8?q?=E5=BE=AE=E4=BF=A1=E6=94=AF=E4=BB=98-?= =?UTF-8?q?=E5=8F=91=E7=BA=A2=E5=8C=85=E6=A8=A1=E5=9D=97-=E5=B7=B2?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E7=8E=B0=E9=87=91=E5=8F=91=E7=BA=A2=E5=8C=85?= =?UTF-8?q?=EF=BC=8C=E5=B0=8F=E7=A8=8B=E5=BA=8F=E5=8F=91=E7=BA=A2=E5=8C=85?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E8=BF=94=E5=9B=9E=E5=95=86=E6=88=B7=E7=BC=BA?= =?UTF-8?q?=E5=A4=B1=E6=9D=83=E9=99=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/egzosn/pay/wx/api/WxPayService.java | 33 +++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) 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 845f1b9..a69bff2 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 @@ -756,7 +756,20 @@ public class WxPayService extends BasePayService { return WxPayMessage.create(message); } - /** + /** + * 微信发红包 + * @author: faymanwang 1057438332@qq.com + * @param redpackOrder 红包实体 + * @return 返回发红包实体后的结果 + */ + public Map sendredpack(RedpackOrder redpackOrder) { + Map parameters = new TreeMap(); + redpackParam(redpackOrder, parameters); + parameters.put(SIGN, createSign(SignUtils.parameterText(parameters, "&", SIGN), payConfigStorage.getInputCharset())); + return requestTemplate.postForObject(getReqUrl( WxSendredpackType.SENDREDPACK), XML.getMap2Xml(parameters) , JSONObject.class); + } + + /** * 发放裂变红包 * 裂变红包:一次可以发放一组红包。首先领取的用户为种子用户,种子用户领取一组红包当中的一个,并可以通过社交分享将剩下的红包给其他用户。裂变红包充分利用了人际传播的优势。 * @@ -772,6 +785,20 @@ public class WxPayService extends BasePayService { return requestTemplate.postForObject(getReqUrl( WxSendredpackType.SENDGROUPREDPACK), XML.getMap2Xml(parameters) , JSONObject.class); } + /** + * 小程序发红包 + * @author: faymanwang 1057438332@qq.com + * @param redpackOrder 红包实体 + * @return 返回发红包实体后的结果 + */ + public Map sendminiprogramhb(RedpackOrder redpackOrder) { + Map parameters = new TreeMap(); + redpackParam(redpackOrder, parameters); + parameters.put("notify_way", "MINI_PROGRAM_JSAPI"); + parameters.put(SIGN, createSign(SignUtils.parameterText(parameters, "&", SIGN), payConfigStorage.getInputCharset())); + return requestTemplate.postForObject(getReqUrl( WxSendredpackType.SENDMINIPROGRAMHB), XML.getMap2Xml(parameters) , JSONObject.class); + } + /** * 查询红包记录 * 用于商户对已发放的红包进行查询红包的具体信息,可支持普通红包和裂变包 @@ -807,6 +834,8 @@ public class WxPayService extends BasePayService { parameters.put("client_ip", StringUtils.isNotEmpty(redpackOrder.getIp()) ? redpackOrder.getIp() : "192.168.0.1"); parameters.put("act_name", redpackOrder.getActName()); parameters.put("remark", redpackOrder.getRemark()); - parameters.put("scene_id", redpackOrder.getSceneId()); + if(StringUtils.isNotEmpty(redpackOrder.getSceneId())){ + parameters.put("scene_id", redpackOrder.getSceneId()); + } } } From c153f736249a50d78a61dd2cc055ae986abee89d Mon Sep 17 00:00:00 2001 From: egzosn Date: Sun, 17 May 2020 22:39:11 +0800 Subject: [PATCH 16/37] =?UTF-8?q?=E7=A7=BB=E9=99=A4=E8=BF=87=E6=97=B6?= =?UTF-8?q?=E7=9A=84=E9=80=80=E6=AC=BE=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/egzosn/pay/ali/api/AliPayService.java | 35 ++----------- .../egzosn/pay/baidu/api/BaiduPayService.java | 51 +++++-------------- .../egzosn/pay/common/api/BasePayService.java | 30 ----------- .../com/egzosn/pay/common/api/PayService.java | 49 ------------------ .../egzosn/pay/fuiou/api/FuiouPayService.java | 30 ----------- .../pay/payoneer/api/PayoneerPayService.java | 30 +---------- .../pay/paypal/api/PayPalPayService.java | 34 ++----------- .../egzosn/pay/union/api/UnionPayService.java | 29 ----------- .../wx/youdian/api/WxYouDianPayService.java | 16 +++--- .../egzosn/pay/yiji/api/YiJiPayService.java | 32 +----------- 10 files changed, 28 insertions(+), 308 deletions(-) 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 7cc5075..af3ceec 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 @@ -15,8 +15,10 @@ import com.egzosn.pay.common.util.DateUtils; import com.egzosn.pay.common.util.Util; import com.egzosn.pay.common.util.sign.SignUtils; import com.egzosn.pay.common.util.str.StringUtils; -import java.math.BigDecimal; -import java.util.*; +import java.util.Date; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.TreeMap; /** * 支付宝支付服务 @@ -407,24 +409,6 @@ public class AliPayService extends BasePayService { return secondaryInterface(tradeNo, outTradeNo, AliTransactionType.CANCEL); } - /** - * 申请退款接口 - * 废弃 - * - * @param tradeNo 支付平台订单号 - * @param outTradeNo 商户单号 - * @param refundAmount 退款金额 - * @param totalAmount 总金额 - * @return 返回支付方申请退款后的结果 - * @see #refund(RefundOrder, com.egzosn.pay.common.api.Callback) - * @deprecated 版本替代 {@link #refund(RefundOrder, com.egzosn.pay.common.api.Callback)} - */ - @Deprecated - @Override - public Map refund(String tradeNo, String outTradeNo, BigDecimal refundAmount, BigDecimal totalAmount) { - return refund(new RefundOrder(tradeNo, outTradeNo, refundAmount, totalAmount)); - } - /** * 申请退款接口 @@ -449,17 +433,6 @@ public class AliPayService extends BasePayService { return requestTemplate.getForObject(getReqUrl() + "?" + UriVariables.getMapToParameters(parameters), JSONObject.class); } - /** - * 查询退款 - * - * @param tradeNo 支付平台订单号 - * @param outTradeNo 商户单号 - * @return 返回支付方查询退款后的结果 - */ - @Override - public Map refundquery(String tradeNo, String outTradeNo) { - return secondaryInterface(tradeNo, outTradeNo, AliTransactionType.REFUNDQUERY); - } /** * 查询退款 diff --git a/pay-java-baidu/src/main/java/com/egzosn/pay/baidu/api/BaiduPayService.java b/pay-java-baidu/src/main/java/com/egzosn/pay/baidu/api/BaiduPayService.java index d2ee285..ef1b1cb 100644 --- a/pay-java-baidu/src/main/java/com/egzosn/pay/baidu/api/BaiduPayService.java +++ b/pay-java-baidu/src/main/java/com/egzosn/pay/baidu/api/BaiduPayService.java @@ -310,24 +310,7 @@ public class BaiduPayService extends BasePayService { public Map close(String tradeNo, String outTradeNo) { throw new UnsupportedOperationException("不支持该操作"); } - - /** - * 退款, 请使用 {@link com.egzosn.pay.baidu.api.BaiduPayService#refundUseBaidu} - * - * @param orderId - * @param userId - * @param refundAmount 退款金额 - * @param totalAmount 总金额 - * @return - */ - @Override - @Deprecated - public Map refund(String orderId, - String userId, - BigDecimal refundAmount, - BigDecimal totalAmount) { - throw new UnsupportedOperationException("请使用 " + getClass().getName() + "#refundUseBaidu"); - } + /** * 退款 @@ -381,26 +364,7 @@ public class BaiduPayService extends BasePayService { return requestTemplate.getForObject(String.format("%s?%s", getReqUrl(transactionType), UriVariables.getMapToParameters(parameters)), JSONObject.class); } - /** - * 退费查询 - * - * @param orderId 百度平台订单ID - * @param userId 百度用户ID - * @return - */ - @Override - public Map refundquery(String orderId, - String userId) { - Map parameters = getUseQueryPay(); - BaiduTransactionType transactionType = BaiduTransactionType.REFUND_QUERY; - parameters.put(METHOD, transactionType.getMethod()); - parameters.put(TYPE, 3); - parameters.put(ORDER_ID, orderId); - parameters.put(USER_ID, userId); - parameters.put(APP_KEY, payConfigStorage.getAppKey()); - parameters.put(RSA_SIGN, getRsaSign(parameters, RSA_SIGN)); - return requestTemplate.getForObject(String.format("%s?%s", getReqUrl(transactionType), UriVariables.getMapToParameters(parameters)), JSONObject.class); - } + /** * 退费查询 @@ -410,7 +374,16 @@ public class BaiduPayService extends BasePayService { */ @Override public Map refundquery(RefundOrder refundOrder) { - return refundquery(refundOrder.getTradeNo(), refundOrder.getOutTradeNo()); + + Map parameters = getUseQueryPay(); + BaiduTransactionType transactionType = BaiduTransactionType.REFUND_QUERY; + parameters.put(METHOD, transactionType.getMethod()); + parameters.put(TYPE, 3); + parameters.put(ORDER_ID, refundOrder.getTradeNo()); + parameters.put(USER_ID, refundOrder.getUserId()); + parameters.put(APP_KEY, payConfigStorage.getAppKey()); + parameters.put(RSA_SIGN, getRsaSign(parameters, RSA_SIGN)); + return requestTemplate.getForObject(String.format("%s?%s", getReqUrl(transactionType), UriVariables.getMapToParameters(parameters)), JSONObject.class); } /** 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 d2be6c3..04e6141 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 @@ -242,24 +242,7 @@ public abstract class BasePayService implements Pay return Collections.EMPTY_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 callback.perform(refund(new RefundOrder(tradeNo, outTradeNo, refundAmount, totalAmount))); - } /** * 申请退款接口 @@ -276,19 +259,6 @@ public abstract class BasePayService implements Pay } - /** - * 查询退款 - * - * @param tradeNo 支付平台订单号 - * @param outTradeNo 商户单号 - * @param callback 处理器 - * @param 返回类型 - * @return 处理过后的类型对象,返回支付方查询退款后的结果 - */ - @Override - public T refundquery(String tradeNo, String outTradeNo, Callback callback) { - return callback.perform(refundquery(tradeNo, outTradeNo)); - } /** * 查询退款 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 ce065ea..9397046 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 @@ -7,7 +7,6 @@ import com.egzosn.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; @@ -243,35 +242,7 @@ public interface PayService { */ T cancel(String tradeNo, String outTradeNo, Callback callback); - /** - * 申请退款接口 - * 废弃 - * - * @param tradeNo 支付平台订单号 - * @param outTradeNo 商户单号 - * @param refundAmount 退款金额 - * @param totalAmount 总金额 - * @return 返回支付方申请退款后的结果 - * @see #refund(RefundOrder) - */ - @Deprecated - Map refund(String tradeNo, String outTradeNo, BigDecimal refundAmount, BigDecimal totalAmount); - /** - * 申请退款接口 - * 废弃 - * - * @param tradeNo 支付平台订单号 - * @param outTradeNo 商户单号 - * @param refundAmount 退款金额 - * @param totalAmount 总金额 - * @param callback 处理器 - * @param 返回类型 - * @return 返回支付方申请退款后的结果 - * @see #refund(RefundOrder, Callback) - */ - @Deprecated - T refund(String tradeNo, String outTradeNo, BigDecimal refundAmount, BigDecimal totalAmount, Callback callback); /** * 申请退款接口 @@ -291,27 +262,7 @@ public interface PayService { */ T refund(RefundOrder refundOrder, Callback callback); - /** - * 查询退款 - * - * @param tradeNo 支付平台订单号 - * @param outTradeNo 商户单号 - * @return 返回支付方查询退款后的结果 - */ - @Deprecated - Map refundquery(String tradeNo, String outTradeNo); - /** - * 查询退款 - * - * @param tradeNo 支付平台订单号 - * @param outTradeNo 商户单号 - * @param callback 处理器 - * @param 返回类型 - * @return 返回支付方查询退款后的结果 - */ - @Deprecated - T refundquery(String tradeNo, String outTradeNo, Callback callback); /** * 查询退款 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 69a28c0..1446463 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 @@ -371,22 +371,6 @@ public class FuiouPayService extends BasePayService { - /** - * 申请退款接口 - * - * @param tradeNo 支付平台订单号 - * @param outTradeNo 商户单号 - * @param refundAmount 退款金额 - * @param totalAmount 总金额 - * @return 退款返回结果集 - */ - @Override - public Map refund (String tradeNo, String outTradeNo, BigDecimal refundAmount, BigDecimal totalAmount) { - return refund(new RefundOrder(tradeNo, outTradeNo, refundAmount, totalAmount)); - } - - - /** * 申请退款接口 @@ -413,20 +397,6 @@ public class FuiouPayService extends BasePayService { } - - /** - * 查询退款 - * @param tradeNo 支付平台订单号 - * @param outTradeNo 商户单号 - * @return 空 - * - */ - - @Override - public Map refundquery(String tradeNo, String outTradeNo) { - return Collections.emptyMap(); - } - /** * 查询退款 * 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 80360b8..8596b7b 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 @@ -18,7 +18,6 @@ import org.apache.http.Header; import org.apache.http.entity.ContentType; import org.apache.http.message.BasicHeader; -import java.math.BigDecimal; import java.util.*; /** @@ -313,22 +312,7 @@ public class PayoneerPayService extends BasePayService im return secondaryInterface(tradeNo, outTradeNo, PayoneerTransactionType.CHARGE_CANCEL); } - /** - * 申请退款接口 - * 废弃 - * - * @param tradeNo 支付平台订单号 - * @param outTradeNo 商户单号 - * @param refundAmount 退款金额 - * @param totalAmount 总金额 - * - * @return 返回支付方申请退款后的结果 - * @see #refund(RefundOrder) - */ - @Override - public Map refund(String tradeNo, String outTradeNo, BigDecimal refundAmount, BigDecimal totalAmount) { - return close(tradeNo, outTradeNo); - } + /** @@ -343,18 +327,6 @@ public class PayoneerPayService extends BasePayService im return close(refundOrder.getTradeNo(), refundOrder.getOutTradeNo()); } - /** - * 查询退款 - * - * @param tradeNo 支付平台订单号 - * @param outTradeNo 商户单号 - * - * @return 返回支付方查询退款后的结果 - */ - @Override - public Map refundquery(String tradeNo, String outTradeNo) { - return Collections.emptyMap(); - } /** * 查询退款 diff --git a/pay-java-paypal/src/main/java/com/egzosn/pay/paypal/api/PayPalPayService.java b/pay-java-paypal/src/main/java/com/egzosn/pay/paypal/api/PayPalPayService.java index e522814..ea120e7 100644 --- a/pay-java-paypal/src/main/java/com/egzosn/pay/paypal/api/PayPalPayService.java +++ b/pay-java-paypal/src/main/java/com/egzosn/pay/paypal/api/PayPalPayService.java @@ -16,7 +16,7 @@ import com.egzosn.pay.paypal.bean.order.*; import org.apache.http.Header; import org.apache.http.entity.ContentType; import org.apache.http.message.BasicHeader; -import java.awt.image.BufferedImage; + import java.io.UnsupportedEncodingException; import java.math.BigDecimal; import java.util.*; @@ -239,22 +239,7 @@ public class PayPalPayService extends BasePayService{ public Map close(String tradeNo, String outTradeNo) { return null; } - /** - * 申请退款接口 - * 废弃 - * @param tradeNo 支付平台订单号 - * @param outTradeNo 商户单号 - * @param refundAmount 退款金额 - * @param totalAmount 总金额 - * @return 返回支付方申请退款后的结果 - * @see #refund(RefundOrder) - * @deprecated {@link #refund(RefundOrder)} - */ - @Deprecated - @Override - public Map refund(String tradeNo, String outTradeNo, BigDecimal refundAmount, BigDecimal totalAmount) { - return refund(new RefundOrder( tradeNo, outTradeNo, refundAmount, totalAmount)); - } + /** @@ -284,18 +269,6 @@ public class PayPalPayService extends BasePayService{ JSONObject resp = getHttpRequestTemplate().postForObject(getReqUrl(PayPalTransactionType.REFUND), httpEntity, JSONObject.class, refundOrder.getTradeNo()); return resp; } - /** - * 查询退款 - * - * @param tradeNo 支付平台订单号 - * @param outTradeNo 商户单号 - * @return 返回支付方查询退款后的结果 - */ - @Override - public Map refundquery(String tradeNo, String outTradeNo) { - JSONObject resp = getHttpRequestTemplate().getForObject(getReqUrl(PayPalTransactionType.REFUND_QUERY), authHeader(), JSONObject.class, tradeNo); - return resp; - } /** * 查询退款 @@ -305,7 +278,8 @@ public class PayPalPayService extends BasePayService{ */ @Override public Map refundquery(RefundOrder refundOrder) { - return refundquery(refundOrder.getTradeNo(), refundOrder.getOutTradeNo()); + JSONObject resp = getHttpRequestTemplate().getForObject(getReqUrl(PayPalTransactionType.REFUND_QUERY), authHeader(), JSONObject.class, refundOrder.getTradeNo()); + return resp; } @Override 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 50dbcf8..978d180 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 @@ -9,7 +9,6 @@ import com.egzosn.pay.common.exception.PayErrorException; import com.egzosn.pay.common.http.HttpConfigStorage; import com.egzosn.pay.common.http.UriVariables; 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.CertDescriptor; import com.egzosn.pay.common.util.sign.SignUtils; @@ -609,40 +608,12 @@ public class UnionPayService extends BasePayService { return Collections.emptyMap(); } - /** - * 申请退款接口 - * - * @param tradeNo 支付平台订单号 - * @param outTradeNo 商户单号 - * @param refundAmount 退款金额 - * @param totalAmount 总金额 - * @return 返回支付方申请退款后的结果 - * @see #refund(RefundOrder) - */ - @Deprecated - @Override - public Map refund(String tradeNo, String outTradeNo, BigDecimal refundAmount, BigDecimal totalAmount) { - return refund(new RefundOrder(tradeNo, outTradeNo, refundAmount, totalAmount)); - } - @Override public Map refund(RefundOrder refundOrder) { return unionRefundOrConsumeUndo(refundOrder, UnionTransactionType.REFUND); } - /** - * 查询退款 - * - * @param tradeNo 支付平台订单号 - * @param outTradeNo 商户单号 - * @return 返回支付方查询退款后的结果 - */ - @Override - public Map refundquery(String tradeNo, String outTradeNo) { - return Collections.emptyMap(); - } - /** * 查询退款 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 8d4e387..ee1ecd9 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 @@ -385,13 +385,14 @@ public class WxYouDianPayService extends BasePayService refund(String tradeNo, String outTradeNo, BigDecimal refundAmount, BigDecimal totalAmount) { - return refund(new RefundOrder(tradeNo, outTradeNo,refundAmount, totalAmount)); - } - + /** + * 申请退款接口 + * + * @param refundOrder 退款订单信息 + * @return 返回支付方申请退款后的结果 + */ @Override public Map refund(RefundOrder refundOrder) { String apbNonce = SignUtils.randomStr(); @@ -413,11 +414,6 @@ public class WxYouDianPayService extends BasePayService refundquery(String tradeNo, String outTradeNo) { - return Collections.emptyMap(); - } - /** * 查询退款 * 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 afd5d43..232d126 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 @@ -10,7 +10,7 @@ import com.egzosn.pay.common.util.Util; import com.egzosn.pay.common.util.sign.SignUtils; import com.egzosn.pay.common.util.str.StringUtils; import com.egzosn.pay.yiji.bean.YiJiTransactionType; -import java.math.BigDecimal; + import java.util.Collections; import java.util.Date; import java.util.Map; @@ -292,24 +292,6 @@ public class YiJiPayService extends BasePayService { - /** - * 申请退款接口 - * 废弃 - * - * @param tradeNo 支付平台订单号 - * @param outTradeNo 商户单号 - * @param refundAmount 退款金额 - * @param totalAmount 总金额 - * @return 返回支付方申请退款后的结果 - * @see #refund(RefundOrder, com.egzosn.pay.common.api.Callback) - * @deprecated 版本替代 {@link #refund(RefundOrder, com.egzosn.pay.common.api.Callback)} - */ - @Deprecated - @Override - public Map refund(String tradeNo, String outTradeNo, BigDecimal refundAmount, BigDecimal totalAmount) { - return refund(new RefundOrder(tradeNo, outTradeNo, refundAmount, totalAmount)); - } - /** * 申请退款接口 @@ -329,18 +311,6 @@ public class YiJiPayService extends BasePayService { return getHttpRequestTemplate().postForObject(getReqUrl(YiJiTransactionType.tradeRefund), orderInfo, JSONObject.class); } - /** - * 查询退款 - * - * @param tradeNo 支付平台订单号 - * @param outTradeNo 商户单号 - * @return 返回支付方查询退款后的结果 - */ - @Override - public Map refundquery(String tradeNo, String outTradeNo) { - return Collections.emptyMap(); - } - /** * 查询退款 * From c84182cf4422622e7e25c784e1ebe7682bfcd740 Mon Sep 17 00:00:00 2001 From: egzosn Date: Sun, 17 May 2020 22:43:40 +0800 Subject: [PATCH 17/37] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E9=80=80=E6=AC=BE?= =?UTF-8?q?=E7=94=A8=E6=88=B7,=20=E4=BB=A3=E7=A0=81=E6=A0=BC=E5=BC=8F?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/egzosn/pay/ali/api/AliPayService.java | 1 + .../com/egzosn/pay/common/api/BasePayService.java | 1 - .../com/egzosn/pay/common/bean/RefundOrder.java | 14 +++++++++++++- .../pay/wx/youdian/api/WxYouDianPayService.java | 3 +-- 4 files changed, 15 insertions(+), 4 deletions(-) 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 af3ceec..ef9a180 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 @@ -15,6 +15,7 @@ import com.egzosn.pay.common.util.DateUtils; import com.egzosn.pay.common.util.Util; import com.egzosn.pay.common.util.sign.SignUtils; import com.egzosn.pay.common.util.str.StringUtils; + import java.util.Date; import java.util.LinkedHashMap; import java.util.Map; 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 04e6141..b7d8124 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 @@ -14,7 +14,6 @@ import org.apache.commons.logging.LogFactory; import java.awt.image.BufferedImage; import java.io.InputStream; import java.io.UnsupportedEncodingException; -import java.math.BigDecimal; import java.util.*; /** diff --git a/pay-java-common/src/main/java/com/egzosn/pay/common/bean/RefundOrder.java b/pay-java-common/src/main/java/com/egzosn/pay/common/bean/RefundOrder.java index be5061a..b8bce56 100644 --- a/pay-java-common/src/main/java/com/egzosn/pay/common/bean/RefundOrder.java +++ b/pay-java-common/src/main/java/com/egzosn/pay/common/bean/RefundOrder.java @@ -5,7 +5,7 @@ import java.util.Date; /** * 退款订单信息 - * @author: egan + * @author egan *
  *      email egzosn@gmail.com
  *      date 2018/1/15 21:40
@@ -46,6 +46,10 @@ public class RefundOrder {
      * 退款说明
      */
     private String description;
+    /**
+     * 退款用户
+     */
+    private String userId;
 
     public String getRefundNo() {
         return refundNo;
@@ -111,6 +115,14 @@ public class RefundOrder {
         this.description = description;
     }
 
+    public String getUserId() {
+        return userId;
+    }
+
+    public void setUserId(String userId) {
+        this.userId = userId;
+    }
+
     public RefundOrder() {
     }
 
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 ee1ecd9..e28cb10 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
@@ -7,14 +7,13 @@ import com.egzosn.pay.common.bean.*;
 import com.egzosn.pay.common.bean.result.PayError;
 import com.egzosn.pay.common.exception.PayErrorException;
 import com.egzosn.pay.common.http.HttpConfigStorage;
-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.str.StringUtils;
 import com.egzosn.pay.wx.youdian.bean.WxYoudianPayMessage;
 import com.egzosn.pay.wx.youdian.bean.YdPayError;
 import com.egzosn.pay.wx.youdian.bean.YoudianTransactionType;
-import java.awt.image.BufferedImage;
+
 import java.io.InputStream;
 import java.math.BigDecimal;
 import java.util.*;

From 575cf77a38805168bef135cf36065601ec2cf401 Mon Sep 17 00:00:00 2001
From: egzosn 
Date: Sun, 17 May 2020 22:47:15 +0800
Subject: [PATCH 18/37] =?UTF-8?q?1.=E4=BF=AE=E5=A4=8D=E9=81=97=E6=BC=8F?=
 =?UTF-8?q?=E7=9A=84RSA=E8=AF=81=E4=B9=A6=E5=AD=97=E7=AC=A6=E8=BD=AC?=
 =?UTF-8?q?=E6=B5=81=E5=85=B3=E9=97=AD=E5=A4=84=E7=90=86=202.=E5=BC=82?=
 =?UTF-8?q?=E5=B8=B8=E4=BF=A1=E6=81=AF=E5=85=B7=E4=BD=93=E5=8C=96?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../pay/common/util/sign/encrypt/RSA.java     | 51 ++++++++++---------
 .../pay/common/util/sign/encrypt/RSA2.java    | 10 ++--
 2 files changed, 34 insertions(+), 27 deletions(-)

diff --git a/pay-java-common/src/main/java/com/egzosn/pay/common/util/sign/encrypt/RSA.java b/pay-java-common/src/main/java/com/egzosn/pay/common/util/sign/encrypt/RSA.java
index ca29fea..3bcf772 100644
--- a/pay-java-common/src/main/java/com/egzosn/pay/common/util/sign/encrypt/RSA.java
+++ b/pay-java-common/src/main/java/com/egzosn/pay/common/util/sign/encrypt/RSA.java
@@ -3,6 +3,7 @@ package com.egzosn.pay.common.util.sign.encrypt;
 
 import javax.crypto.Cipher;
 import java.io.*;
+import java.security.GeneralSecurityException;
 import java.security.KeyFactory;
 import java.security.PrivateKey;
 import java.security.PublicKey;
@@ -34,9 +35,9 @@ public class RSA{
 	 */
 	public static String sign(String content, String privateKey, String signAlgorithms, String characterEncoding) {
 		try {
-			PKCS8EncodedKeySpec priPKCS8 = new PKCS8EncodedKeySpec( Base64.decode(privateKey));
-			KeyFactory keyf 			= KeyFactory.getInstance(ALGORITHM);
-			PrivateKey priKey 			= keyf.generatePrivate(priPKCS8);
+			PKCS8EncodedKeySpec priPKCS8 = new PKCS8EncodedKeySpec(Base64.decode(privateKey));
+			KeyFactory keyf = KeyFactory.getInstance(ALGORITHM);
+			PrivateKey priKey = keyf.generatePrivate(priPKCS8);
 
 			java.security.Signature signature = java.security.Signature.getInstance(signAlgorithms);
 
@@ -111,11 +112,11 @@ public class RSA{
 	*/
 	public static boolean verify(String content, String sign, String publicKey, String signAlgorithms, String characterEncoding){
 		try {
-	        PublicKey pubKey 		= getPublicKey(publicKey, ALGORITHM);
+	        PublicKey pubKey = getPublicKey(publicKey, ALGORITHM);
 			java.security.Signature signature = java.security.Signature.getInstance(signAlgorithms);
 			signature.initVerify(pubKey);
-			signature.update( content.getBytes(characterEncoding) );
-			return signature.verify( Base64.decode(sign) );
+			signature.update(content.getBytes(characterEncoding) );
+			return signature.verify(Base64.decode(sign) );
 		} catch (Exception e) {
 			e.printStackTrace();
 		}
@@ -135,8 +136,8 @@ public class RSA{
 		try {
 			java.security.Signature signature = java.security.Signature.getInstance(signAlgorithms);
 			signature.initVerify(publicKey);
-			signature.update( content.getBytes(characterEncoding) );
-			return signature.verify( Base64.decode(sign) );
+			signature.update(content.getBytes(characterEncoding) );
+			return signature.verify(Base64.decode(sign) );
 		} catch (Exception e) {
 			e.printStackTrace();
 		}
@@ -176,9 +177,9 @@ public class RSA{
 	* @return 解密后的字符串
 	 * @throws Exception 解密异常
 	*/
-	public static String decrypt(String content, String privateKey, String characterEncoding) throws Exception {
-        PrivateKey prikey 	= getPrivateKey(privateKey);
-        Cipher cipher 		= Cipher.getInstance(ALGORITHM);
+	public static String decrypt(String content, String privateKey, String characterEncoding) throws GeneralSecurityException, IOException {
+        PrivateKey prikey = getPrivateKey(privateKey);
+        Cipher cipher = Cipher.getInstance(ALGORITHM);
         cipher.init(Cipher.DECRYPT_MODE, prikey);
        try(InputStream ins 	= new ByteArrayInputStream(Base64.decode(content));   ByteArrayOutputStream writer = new ByteArrayOutputStream();) {
 
@@ -204,14 +205,14 @@ public class RSA{
 	   }
     }
 
-	
+
 	/**
 	* 得到私钥
 	* @param key 密钥字符串(经过base64编码)
-	 * @throws Exception 加密异常
+	 * @throws GeneralSecurityException 加密异常
 	 * @return 私钥
 	*/
-	public static PrivateKey getPrivateKey(String key) throws Exception {
+	public static PrivateKey getPrivateKey(String key) throws GeneralSecurityException {
 
 		byte[] keyBytes;
 		keyBytes = Base64.decode(key);
@@ -225,26 +226,30 @@ public class RSA{
 	* 得到公钥
 	* @param key 密钥字符串(经过base64编码)
 	* @param signAlgorithms 密钥类型
-	 * @throws Exception 加密异常
+	 * @throws GeneralSecurityException 加密异常
+	 * @throws IOException 加密异常
 	 * @return 公钥
 	*/
-	public static PublicKey getPublicKey(String key, String signAlgorithms) throws Exception {
-		return getPublicKey(new ByteArrayInputStream(key.getBytes("ISO8859-1")), signAlgorithms);
+	public static PublicKey getPublicKey(String key, String signAlgorithms) throws GeneralSecurityException, IOException {
+		try (ByteArrayInputStream is = new ByteArrayInputStream(key.getBytes("ISO8859-1"))){
+			return getPublicKey(is, signAlgorithms);
+		}
 	}
 
 
 	/**
 	* 得到公钥
 	* @param key 密钥字符串(经过base64编码)
-	 * @throws Exception 加密异常
+	 * @throws GeneralSecurityException 加密异常
+	 * @throws IOException 加密异常
 	 * @return 公钥
 	*/
-	public static PublicKey getPublicKey(String key) throws Exception {
+	public static PublicKey getPublicKey(String key) throws GeneralSecurityException, IOException {
 
 		return getPublicKey(key, ALGORITHM);
 	}
 
-	public static PublicKey getPublicKey(InputStream inputStream, String keyAlgorithm) throws Exception {
+	public static PublicKey getPublicKey(InputStream inputStream, String keyAlgorithm) throws IOException, GeneralSecurityException {
 		try (BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));) {
 			StringBuilder sb = new StringBuilder();
 			String readLine = null;
@@ -262,14 +267,14 @@ public class RSA{
 		}
 	}
 
-	public static byte[] encrypt(byte[] plainBytes, PublicKey publicKey, int keyLength, int reserveSize, String cipherAlgorithm) throws Exception {
+	public static byte[] encrypt(byte[] plainBytes, PublicKey publicKey, int keyLength, int reserveSize, String cipherAlgorithm) throws IOException, GeneralSecurityException {
 		int keyByteSize = keyLength / 8;
 		int encryptBlockSize = keyByteSize - reserveSize;
 		int nBlock = plainBytes.length / encryptBlockSize;
 		if ((plainBytes.length % encryptBlockSize) != 0) {
 			nBlock += 1;
 		}
-		try (ByteArrayOutputStream outbuf = new ByteArrayOutputStream(nBlock * keyByteSize);) {
+		try (ByteArrayOutputStream outbuf = new ByteArrayOutputStream(nBlock * keyByteSize)) {
 			Cipher cipher = Cipher.getInstance(cipherAlgorithm);
 			cipher.init(Cipher.ENCRYPT_MODE, publicKey);
 			for (int offset = 0; offset < plainBytes.length; offset += encryptBlockSize) {
@@ -284,7 +289,7 @@ public class RSA{
 			return outbuf.toByteArray();
 		}
 	}
-	public static String encrypt(String content, String publicKey, String cipherAlgorithm, String characterEncoding ) throws Exception {
+	public static String encrypt(String content, String publicKey, String cipherAlgorithm, String characterEncoding ) throws IOException, GeneralSecurityException {
 		return Base64.encode(RSA.encrypt(content.getBytes(characterEncoding), RSA.getPublicKey(publicKey),1024, 11, cipherAlgorithm));
 	}
 
diff --git a/pay-java-common/src/main/java/com/egzosn/pay/common/util/sign/encrypt/RSA2.java b/pay-java-common/src/main/java/com/egzosn/pay/common/util/sign/encrypt/RSA2.java
index 680b7b0..5aa464d 100644
--- a/pay-java-common/src/main/java/com/egzosn/pay/common/util/sign/encrypt/RSA2.java
+++ b/pay-java-common/src/main/java/com/egzosn/pay/common/util/sign/encrypt/RSA2.java
@@ -1,6 +1,8 @@
 
 package com.egzosn.pay.common.util.sign.encrypt;
 
+import java.io.IOException;
+import java.security.GeneralSecurityException;
 import java.security.PrivateKey;
 import java.security.PublicKey;
 
@@ -63,11 +65,11 @@ public class RSA2 {
 	* @return 解密后的字符串
 	 * @throws Exception 解密异常
 	*/
-	public static String decrypt(String content, String privateKey, String characterEncoding) throws Exception {
+	public static String decrypt(String content, String privateKey, String characterEncoding) throws GeneralSecurityException, IOException {
         return RSA.decrypt(content, privateKey, characterEncoding);
     }
 
-	
+
 	/**
 	* 得到私钥
 	* @param key 密钥字符串(经过base64编码)
@@ -79,7 +81,7 @@ public class RSA2 {
 	}
 
 
-	public static String encrypt(String content, String publicKey, String cipherAlgorithm, String characterEncoding ) throws Exception {
-		return Base64.encode(RSA.encrypt(content.getBytes(characterEncoding), RSA.getPublicKey(publicKey),2048, 11, cipherAlgorithm));
+	public static String encrypt(String content, String publicKey, String cipherAlgorithm, String characterEncoding ) throws GeneralSecurityException, IOException {
+		return Base64.encode(RSA.encrypt(content.getBytes(characterEncoding), RSA.getPublicKey(publicKey), 2048, 11, cipherAlgorithm));
 	}
 }

From 370f7941ec403b523760c93b306dd44bbbb444e3 Mon Sep 17 00:00:00 2001
From: egzosn 
Date: Sun, 17 May 2020 23:03:12 +0800
Subject: [PATCH 19/37] =?UTF-8?q?=E7=A7=BB=E9=99=A4=E8=BF=87=E6=97=B6?=
 =?UTF-8?q?=E7=9A=84=E9=80=80=E6=AC=BE=E6=96=B9=E6=B3=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 pay-java-demo/pom.xml                                  |  2 +-
 .../egzosn/pay/demo/controller/AliPayController.java   | 10 +++++++---
 .../com/egzosn/pay/demo/controller/PayController.java  |  8 +++++---
 .../pay/demo/controller/PayPalPayController.java       |  4 +++-
 .../egzosn/pay/demo/controller/UnionPayController.java | 10 ----------
 5 files changed, 16 insertions(+), 18 deletions(-)

diff --git a/pay-java-demo/pom.xml b/pay-java-demo/pom.xml
index e7599d0..3aed877 100644
--- a/pay-java-demo/pom.xml
+++ b/pay-java-demo/pom.xml
@@ -5,7 +5,7 @@
     
         pay-java-parent
         com.egzosn
-        2.13.1
+        2.13.2-SNAPSHOT
     
     4.0.0
     war
diff --git a/pay-java-demo/src/main/java/com/egzosn/pay/demo/controller/AliPayController.java b/pay-java-demo/src/main/java/com/egzosn/pay/demo/controller/AliPayController.java
index 64e235f..e9f5ee6 100644
--- a/pay-java-demo/src/main/java/com/egzosn/pay/demo/controller/AliPayController.java
+++ b/pay-java-demo/src/main/java/com/egzosn/pay/demo/controller/AliPayController.java
@@ -7,7 +7,10 @@ import com.egzosn.pay.ali.api.AliPayService;
 import com.egzosn.pay.ali.bean.AliTransactionType;
 import com.egzosn.pay.ali.bean.AliTransferType;
 import com.egzosn.pay.ali.bean.OrderSettle;
-import com.egzosn.pay.common.bean.*;
+import com.egzosn.pay.common.bean.PayOrder;
+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.http.HttpConfigStorage;
 import com.egzosn.pay.common.http.UriVariables;
 import com.egzosn.pay.common.util.sign.SignUtils;
@@ -17,6 +20,7 @@ import com.egzosn.pay.demo.service.interceptor.AliPayMessageInterceptor;
 import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
+
 import javax.annotation.PostConstruct;
 import javax.annotation.Resource;
 import javax.imageio.ImageIO;
@@ -287,8 +291,8 @@ public class AliPayController {
      * @return 返回支付方查询退款后的结果
      */
     @RequestMapping("refundquery")
-    public Map refundquery(QueryOrder order) {
-        return service.refundquery(order.getTradeNo(), order.getOutTradeNo());
+    public Map refundquery(RefundOrder order) {
+        return service.refundquery(order);
     }
 
     /**
diff --git a/pay-java-demo/src/main/java/com/egzosn/pay/demo/controller/PayController.java b/pay-java-demo/src/main/java/com/egzosn/pay/demo/controller/PayController.java
index 0705246..c407a58 100644
--- a/pay-java-demo/src/main/java/com/egzosn/pay/demo/controller/PayController.java
+++ b/pay-java-demo/src/main/java/com/egzosn/pay/demo/controller/PayController.java
@@ -436,9 +436,11 @@ public class PayController {
      * @return 返回支付方查询退款后的结果
      */
     @RequestMapping("refundquery")
-    public Map refundquery(QueryOrder order) {
-        PayResponse payResponse = service.getPayResponse(order.getPayId());
-        return payResponse.getService().refundquery(order.getTradeNo(), order.getOutTradeNo());
+    public Map refundquery(Integer payId, RefundOrder order) {
+        PayResponse payResponse = service.getPayResponse(payId);
+
+
+        return payResponse.getService().refundquery(order);
     }
 
     /**
diff --git a/pay-java-demo/src/main/java/com/egzosn/pay/demo/controller/PayPalPayController.java b/pay-java-demo/src/main/java/com/egzosn/pay/demo/controller/PayPalPayController.java
index c2bee1a..f9a7873 100644
--- a/pay-java-demo/src/main/java/com/egzosn/pay/demo/controller/PayPalPayController.java
+++ b/pay-java-demo/src/main/java/com/egzosn/pay/demo/controller/PayPalPayController.java
@@ -2,7 +2,9 @@ package com.egzosn.pay.demo.controller;
 
 
 import com.egzosn.pay.common.api.PayService;
-import com.egzosn.pay.common.bean.*;
+import com.egzosn.pay.common.bean.DefaultCurType;
+import com.egzosn.pay.common.bean.PayOrder;
+import com.egzosn.pay.common.bean.RefundOrder;
 import com.egzosn.pay.common.http.HttpConfigStorage;
 import com.egzosn.pay.paypal.api.PayPalConfigStorage;
 import com.egzosn.pay.paypal.api.PayPalPayService;
diff --git a/pay-java-demo/src/main/java/com/egzosn/pay/demo/controller/UnionPayController.java b/pay-java-demo/src/main/java/com/egzosn/pay/demo/controller/UnionPayController.java
index f751cbe..b7b4b61 100644
--- a/pay-java-demo/src/main/java/com/egzosn/pay/demo/controller/UnionPayController.java
+++ b/pay-java-demo/src/main/java/com/egzosn/pay/demo/controller/UnionPayController.java
@@ -270,16 +270,6 @@ public class UnionPayController {
         return service.refund(order);
     }
 
-    /**
-     * 查询退款
-     *
-     * @param order 订单的请求体
-     * @return 返回支付方查询退款后的结果
-     */
-    @RequestMapping("refundquery")
-    public Map refundquery(QueryOrder order) {
-        return service.refundquery(order.getTradeNo(), order.getOutTradeNo());
-    }
 
     /**
      * 下载对账单

From b17dd02d654defb68fab64d679ceec5c573696ee Mon Sep 17 00:00:00 2001
From: egzosn 
Date: Sun, 17 May 2020 23:34:41 +0800
Subject: [PATCH 20/37] =?UTF-8?q?=E9=80=80=E6=AC=BE=E5=AF=B9=E8=B1=A1?=
 =?UTF-8?q?=E6=96=B0=E5=A2=9E=E9=99=84=E5=8A=A0=E5=B1=9E=E6=80=A7=EF=BC=8C?=
 =?UTF-8?q?=E7=94=A8=E4=BA=8E=E5=85=BC=E5=AE=B9=E6=9B=B4=E5=A4=9A=E7=A7=8D?=
 =?UTF-8?q?=E6=94=AF=E4=BB=98=E5=B9=B3=E5=8F=B0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../com/egzosn/pay/common/bean/Order.java     |  8 +++++
 .../com/egzosn/pay/common/bean/PayOrder.java  |  1 +
 .../egzosn/pay/common/bean/RefundOrder.java   | 31 ++++++++++++++++++-
 .../egzosn/pay/common/bean/TransferOrder.java |  1 +
 pay-java-union/src/test/java/PayTest.java     |  2 +-
 5 files changed, 41 insertions(+), 2 deletions(-)

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 5f18b00..4ea0d8f 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
@@ -25,4 +25,12 @@ public interface Order {
      */
     Object getAttr(String key);
 
+
+    /**
+     * 添加订单信息
+     * @param key key
+     * @param value 值
+     */
+    void addAttr(String key, Object value);
+
 }
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 1982763..76a3451 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
@@ -277,6 +277,7 @@ public class PayOrder implements Order {
      * @param key key
      * @param value 值
      */
+    @Override
     public void addAttr(String key, Object value) {
         getAttrs().put(key, value);
     }
diff --git a/pay-java-common/src/main/java/com/egzosn/pay/common/bean/RefundOrder.java b/pay-java-common/src/main/java/com/egzosn/pay/common/bean/RefundOrder.java
index b8bce56..62b8089 100644
--- a/pay-java-common/src/main/java/com/egzosn/pay/common/bean/RefundOrder.java
+++ b/pay-java-common/src/main/java/com/egzosn/pay/common/bean/RefundOrder.java
@@ -2,6 +2,8 @@ package com.egzosn.pay.common.bean;
 
 import java.math.BigDecimal;
 import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
 
 /**
  * 退款订单信息
@@ -11,7 +13,7 @@ import java.util.Date;
  *      date 2018/1/15 21:40
  *   
*/ -public class RefundOrder { +public class RefundOrder implements Order { /** * 退款单号,每次进行退款的单号,此处唯一 */ @@ -51,6 +53,11 @@ public class RefundOrder { */ private String userId; + /** + * 订单附加信息,可用于预设未提供的参数,这里会覆盖以上所有的订单信息, + */ + private Map attr; + public String getRefundNo() { return refundNo; } @@ -147,5 +154,27 @@ public class RefundOrder { this.totalAmount = totalAmount; } + @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 值 + */ + @Override + public void addAttr(String key, Object 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 83f05b8..bd3ecbb 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 @@ -217,6 +217,7 @@ public class TransferOrder implements Order { * @param key key * @param value 值 */ + @Override public void addAttr(String key, Object value) { getAttrs().put(key, value); } diff --git a/pay-java-union/src/test/java/PayTest.java b/pay-java-union/src/test/java/PayTest.java index f64b70b..ff2f114 100644 --- a/pay-java-union/src/test/java/PayTest.java +++ b/pay-java-union/src/test/java/PayTest.java @@ -93,7 +93,7 @@ public class PayTest { /*-----------退货交易:后台资金类交易,有同步应答和后台通知应答------------------------------*/ payOrder.setTransactionType(UnionTransactionType.REFUND); - params = service.refund("原交易查询流水号", "订单号", null,new BigDecimal("退款金额" )); + params = service.refund(new RefundOrder("原交易查询流水号", "订单号", null, new BigDecimal("退款金额" ))); /*-----------退货交易:后台资金类交易,有同步应答和后台通知应答------------------------------*/ From dec64805f2a1687c9f4fae9365a18bff57499ec7 Mon Sep 17 00:00:00 2001 From: egzosn Date: Sun, 17 May 2020 23:35:20 +0800 Subject: [PATCH 21/37] =?UTF-8?q?=E9=80=80=E6=AC=BE=E5=AF=B9=E8=B1=A1?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E9=99=84=E5=8A=A0=E5=B1=9E=E6=80=A7=EF=BC=8C?= =?UTF-8?q?=E7=94=A8=E4=BA=8E=E5=85=BC=E5=AE=B9=E6=9B=B4=E5=A4=9A=E7=A7=8D?= =?UTF-8?q?=E6=94=AF=E4=BB=98=E5=B9=B3=E5=8F=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/egzosn/pay/common/bean/Order.java | 6 +++++- .../java/com/egzosn/pay/common/bean/PayOrder.java | 4 ++-- .../com/egzosn/pay/common/bean/RefundOrder.java | 10 ++++++---- .../com/egzosn/pay/common/bean/TransferOrder.java | 15 +++++++++------ 4 files changed, 22 insertions(+), 13 deletions(-) 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 4ea0d8f..fd16e1c 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 @@ -15,11 +15,14 @@ public interface Order { /** * 获取订单属性 这里可用做覆盖已设置的订单信息属性,订单信息在签名前进行覆盖。 + * * @return 属性 */ Map getAttrs(); + /** * 获取订单属性 这里可用做覆盖已设置的订单信息属性,订单信息在签名前进行覆盖。 + * * @param key 属性名 * @return 属性 */ @@ -28,7 +31,8 @@ public interface Order { /** * 添加订单信息 - * @param key key + * + * @param key key * @param value 值 */ void addAttr(String key, Object value); 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 76a3451..35987ab 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 @@ -1,12 +1,12 @@ package com.egzosn.pay.common.bean; +import com.egzosn.pay.common.util.str.StringUtils; + import java.math.BigDecimal; import java.util.Date; import java.util.HashMap; import java.util.Map; -import com.egzosn.pay.common.util.str.StringUtils; - /** * 支付订单信息 * diff --git a/pay-java-common/src/main/java/com/egzosn/pay/common/bean/RefundOrder.java b/pay-java-common/src/main/java/com/egzosn/pay/common/bean/RefundOrder.java index 62b8089..30e5959 100644 --- a/pay-java-common/src/main/java/com/egzosn/pay/common/bean/RefundOrder.java +++ b/pay-java-common/src/main/java/com/egzosn/pay/common/bean/RefundOrder.java @@ -7,8 +7,9 @@ import java.util.Map; /** * 退款订单信息 - * @author egan - *
+ *
+ * @author egan
+ * 
  *      email egzosn@gmail.com
  *      date 2018/1/15 21:40
  *   
@@ -156,7 +157,7 @@ public class RefundOrder implements Order { @Override public Map getAttrs() { - if (null == attr){ + if (null == attr) { attr = new HashMap<>(); } return attr; @@ -170,7 +171,8 @@ public class RefundOrder implements Order { /** * 添加订单信息 - * @param key key + * + * @param key key * @param value 值 */ @Override 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 bd3ecbb..73a1162 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 @@ -6,6 +6,7 @@ import java.util.Map; /** * 转账订单 + * * @author egan *
  * email egzosn@gmail.com
@@ -27,12 +28,12 @@ public class TransferOrder implements Order {
     /**
      * 收款方账户, 用户openid,卡号等等
      */
-    private String  payeeAccount ;
+    private String payeeAccount;
 
     /**
      * 转账金额
      */
-    private BigDecimal amount ;
+    private BigDecimal amount;
 
     /**
      * 付款人名称
@@ -55,11 +56,11 @@ public class TransferOrder implements Order {
 
     /**
      * 收款开户行
-      */
+     */
     private Bank bank;
 
     /**
-     *  收款开户行地址
+     * 收款开户行地址
      */
     private String payeeBankAddress;
 
@@ -198,9 +199,10 @@ public class TransferOrder implements Order {
     public void setIp(String ip) {
         this.ip = ip;
     }
+
     @Override
     public Map getAttrs() {
-        if (null == attr){
+        if (null == attr) {
             attr = new HashMap<>();
         }
         return attr;
@@ -214,7 +216,8 @@ public class TransferOrder implements Order {
 
     /**
      * 添加订单信息
-     * @param key key
+     *
+     * @param key   key
      * @param value 值
      */
     @Override

From c31f9184789d06dacf20b4991e8d09f4d6d0a57a Mon Sep 17 00:00:00 2001
From: egzosn 
Date: Sun, 17 May 2020 23:36:00 +0800
Subject: [PATCH 22/37] =?UTF-8?q?=E7=99=BE=E5=BA=A6=E6=94=AF=E4=BB=98?=
 =?UTF-8?q?=E9=80=80=E6=AC=BE=E5=85=BC=E5=AE=B9pay-java=E6=8E=A5=E5=8F=A3?=
 =?UTF-8?q?=E5=AE=9A=E4=B9=89?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../egzosn/pay/baidu/api/BaiduPayService.java | 208 ++++++++----------
 .../pay/baidu/bean/BaiduRefundOrder.java      |  86 ++++----
 2 files changed, 128 insertions(+), 166 deletions(-)

diff --git a/pay-java-baidu/src/main/java/com/egzosn/pay/baidu/api/BaiduPayService.java b/pay-java-baidu/src/main/java/com/egzosn/pay/baidu/api/BaiduPayService.java
index ef1b1cb..87e4c1c 100644
--- a/pay-java-baidu/src/main/java/com/egzosn/pay/baidu/api/BaiduPayService.java
+++ b/pay-java-baidu/src/main/java/com/egzosn/pay/baidu/api/BaiduPayService.java
@@ -38,25 +38,25 @@ public class BaiduPayService extends BasePayService {
     public static final String SIGN = "sign";
     public static final String METHOD = "method";
     public static final String TYPE = "type";
-    
+
     public static final Integer RESPONSE_SUCCESS = 2;
     public static final String RESPONSE_STATUS = "status";
-    
-    
+
+
     public BaiduPayService(BaiduPayConfigStorage payConfigStorage) {
         super(payConfigStorage);
     }
-    
+
     public BaiduPayService(BaiduPayConfigStorage payConfigStorage,
                            HttpConfigStorage configStorage) {
         super(payConfigStorage, configStorage);
     }
-    
+
     /**
      * 验证响应
      *
      * @param params 回调回来的参数集
-     * @return
+     * @return 结果
      */
     @Override
     public boolean verify(Map params) {
@@ -65,13 +65,13 @@ public class BaiduPayService extends BasePayService {
         }
         return signVerify(params, String.valueOf(params.get(RSA_SIGN))) && verifySource(String.valueOf(params.get(TP_ORDER_ID)));
     }
-    
+
     /**
      * 验证签名
      *
      * @param params 参数集
      * @param sign   签名原文
-     * @return
+     * @return 结果
      */
     @Override
     public boolean signVerify(Map params, String sign) {
@@ -80,7 +80,7 @@ public class BaiduPayService extends BasePayService {
         LOG.debug("百度返回的签名: " + rsaSign + " 本地产生的签名: " + targetRsaSign);
         return StringUtils.equals(rsaSign, targetRsaSign);
     }
-    
+
     @Override
     public boolean verifySource(String id) {
         return true;
@@ -90,7 +90,7 @@ public class BaiduPayService extends BasePayService {
      * 返回创建的订单信息
      *
      * @param order 支付订单
-     * @return
+     * @return 结果
      */
     @Override
     public Map orderInfo(PayOrder order) {
@@ -99,11 +99,11 @@ public class BaiduPayService extends BasePayService {
         params.put(RSA_SIGN, rsaSign);
         return params;
     }
-    
+
     /**
      * 获取"查询支付状态"所需参数
      *
-     * @return
+     * @return 结果
      */
     public Map getUseQueryPay() {
         String appKey = payConfigStorage.getAppKey();
@@ -112,12 +112,12 @@ public class BaiduPayService extends BasePayService {
         result.put(APP_ID, payConfigStorage.getAppid());
         return result;
     }
-    
+
     /**
      * 获取"创建订单"所需参数
      *
-     * @param order
-     * @return
+     * @param order 订单信息
+     * @return 结果
      */
     private Map getUseOrderInfoParams(PayOrder order) {
         BaiduPayOrder payOrder = (BaiduPayOrder) order;
@@ -131,32 +131,32 @@ public class BaiduPayService extends BasePayService {
         result.put(SIGN_FIELDS_RANGE, payOrder.getSignFieldsRange());
         result.put(BIZ_INFO, JSON.toJSONString(payOrder.getBizInfo()));
         result.put(TOTAL_AMOUNT, String.valueOf(Util.conversionAmount(order.getPrice())));
-        
+
         return result;
     }
-    
+
     /**
      * 获取输出消息,用户返回给支付端
      *
      * @param code    状态
      * @param message 消息
-     * @return
+     * @return 结果
      */
     @Override
     @Deprecated
     public PayOutMessage getPayOutMessage(String code, String message) {
         throw new UnsupportedOperationException("请使用 " + getClass().getName() + "#getPayOutMessageUseBaidu");
     }
-    
+
     /**
      * 请求业务方退款审核/响应处理
      * http://smartprogram.baidu.com/docs/develop/function/tune_up_examine/
      *
-     * @param errno
-     * @param message
-     * @param auditStatus
-     * @param refundPayMoney
-     * @return
+     * @param errno          错误代码
+     * @param message        消息
+     * @param auditStatus    状态
+     * @param refundPayMoney 退款金额
+     * @return 结果
      */
     public PayOutMessage getApplyRefundOutMessageUseBaidu(Integer errno,
                                                           String message,
@@ -172,16 +172,16 @@ public class BaiduPayService extends BasePayService {
                 .content("message", message)
                 .content("data", data)
                 .build();
-        
+
     }
-    
+
     /**
      * 通知退款状态/响应处理
      * http://smartprogram.baidu.com/docs/develop/function/tune_up_drawback/
      *
-     * @param errno
-     * @param message
-     * @return
+     * @param errno   错误代码
+     * @param message 消息
+     * @return 结果
      */
     public PayOutMessage getRefundOutMessageUseBaidu(Integer errno,
                                                      String message) {
@@ -190,17 +190,17 @@ public class BaiduPayService extends BasePayService {
                 .content("message", message)
                 .content("data", "{}")
                 .build();
-        
+
     }
-    
+
     /**
      * 支付通知/响应处理
      *
-     * @param errno
-     * @param message
-     * @param isConsumed
-     * @param isErrorOrder
-     * @return
+     * @param errno        错误代码
+     * @param message      消息
+     * @param isConsumed   是否消费
+     * @param isErrorOrder 错误订单
+     * @return 结果
      */
     public PayOutMessage getPayOutMessageUseBaidu(Integer errno,
                                                   String message,
@@ -220,157 +220,125 @@ public class BaiduPayService extends BasePayService {
                 .content("data", data)
                 .build();
     }
-    
+
     /**
      * 支付通知/响应处理
      * http://smartprogram.baidu.com/docs/develop/function/tune_up_notice/
      *
-     * @param code
-     * @param message
-     * @param isConsumed
-     * @return
+     * @param code       状态码
+     * @param message    消息
+     * @param isConsumed 是否消费
+     * @return 结果
      */
     public PayOutMessage getPayOutMessageUseBaidu(Integer code,
                                                   String message,
                                                   Integer isConsumed) {
         return getPayOutMessageUseBaidu(code, message, isConsumed, null);
     }
-    
+
     /**
      * 支付通知/响应处理
      * http://smartprogram.baidu.com/docs/develop/function/tune_up_notice/
      *
      * @param payMessage 支付回调消息
-     * @return
+     * @return 结果
      */
     @Override
     public PayOutMessage successPayOutMessage(PayMessage payMessage) {
         return getPayOutMessageUseBaidu(0, "success", 2);
     }
-    
+
     /**
      * 获取输出消息,用户返回给支付端, 针对于web端
      *
      * @param orderInfo 发起支付的订单信息
      * @param method    请求方式  "post" "get",
-     * @return
+     * @return 结果
      */
     @Override
-    @Deprecated
     public String buildRequest(Map orderInfo,
                                MethodType method) {
         throw new UnsupportedOperationException("百度不支持PC支付");
     }
 
 
-
     /**
      * 百度不支持扫码付
      *
      * @param order 发起支付的订单信息
-     * @return
+     * @return 结果
      */
     @Override
     public String getQrPay(PayOrder order) {
         throw new UnsupportedOperationException("百度不支持扫码付");
     }
-    
+
     /**
      * 百度不支持刷卡付
      *
      * @param order 发起支付的订单信息
-     * @return
+     * @return 结果
      */
     @Override
     public Map microPay(PayOrder order) {
         throw new UnsupportedOperationException("百度不支持刷卡付");
     }
-    
+
     /**
      * 查询订单
      *
      * @param tradeNo    支付平台订单号
      * @param outTradeNo 商户单号
-     * @return
+     * @return 结果
      */
     @Override
     public Map query(String tradeNo, String outTradeNo) {
         return secondaryInterface(tradeNo, outTradeNo, BaiduTransactionType.PAY_QUERY);
     }
-    
+
     /**
      * 百度不支持该操作
      *
      * @param tradeNo    支付平台订单号
      * @param outTradeNo 商户单号
-     * @return
+     * @return 结果
      */
     @Override
-    @Deprecated
     public Map close(String tradeNo, String outTradeNo) {
         throw new UnsupportedOperationException("不支持该操作");
     }
 
-    
+
     /**
      * 退款
      *
-     * @param orderId
-     * @param userId
-     * @param refundType
-     * @param tpOrderId
-     * @param refundReason
-     * @return
-     */
-    public Map refundUseBaidu(Long orderId,
-                                              Long userId,
-                                              Integer refundType,
-                                              String tpOrderId,
-                                              String refundReason) {
-        return refundUseBaidu(new BaiduRefundOrder(orderId, userId, refundType, refundReason, tpOrderId));
-    }
-    
-    /**
-     * 退款, 请使用 {@link com.egzosn.pay.baidu.api.BaiduPayService#refundUseBaidu}
-     *
      * @param refundOrder 退款订单信息
-     * @return
+     * @return 退款结果
      */
     @Override
-    @Deprecated
     public Map refund(RefundOrder refundOrder) {
-        throw new UnsupportedOperationException("请使用 " + getClass().getName() + "#refundUseBaidu");
-    }
-    
-    /**
-     * 退款, 请使用 {@link com.egzosn.pay.baidu.api.BaiduPayService#refundUseBaidu}
-     *
-     * @param refundOrder
-     * @return
-     */
-    public Map refundUseBaidu(BaiduRefundOrder refundOrder) {
         Map parameters = getUseQueryPay();
         BaiduTransactionType transactionType = BaiduTransactionType.APPLY_REFUND;
         parameters.put(METHOD, transactionType.getMethod());
-        parameters.put(ORDER_ID, refundOrder.getTradeNo());
+        parameters.put(ORDER_ID, refundOrder.getOutTradeNo());
         parameters.put(USER_ID, refundOrder.getUserId());
-        parameters.put("refundType", refundOrder.getRefundType());
-        parameters.put("refundReason", String.valueOf(refundOrder.getRefundReason()));
-        parameters.put(TP_ORDER_ID, refundOrder.getTpOrderId());
-        parameters.put("applyRefundMoney", refundOrder.getApplyRefundMoney());
-        parameters.put("bizRefundBatchId", refundOrder.getBizRefundBatchId());
+        setParameters(parameters, "refundType", refundOrder);
+        parameters.put("refundReason", refundOrder.getDescription());
+        parameters.put(TP_ORDER_ID, refundOrder.getTradeNo());
+        parameters.put("applyRefundMoney", refundOrder.getRefundAmount());
+        parameters.put("bizRefundBatchId", refundOrder.getRefundNo());
         parameters.put(APP_KEY, payConfigStorage.getAppKey());
         parameters.put(RSA_SIGN, getRsaSign(parameters, RSA_SIGN));
         return requestTemplate.getForObject(String.format("%s?%s", getReqUrl(transactionType), UriVariables.getMapToParameters(parameters)), JSONObject.class);
-    }
-    
 
-    
+    }
+
+
     /**
      * 退费查询
      *
      * @param refundOrder 退款订单单号信息
-     * @return
+     * @return 退款查询结果
      */
     @Override
     public Map refundquery(RefundOrder refundOrder) {
@@ -385,45 +353,45 @@ public class BaiduPayService extends BasePayService {
         parameters.put(RSA_SIGN, getRsaSign(parameters, RSA_SIGN));
         return requestTemplate.getForObject(String.format("%s?%s", getReqUrl(transactionType), UriVariables.getMapToParameters(parameters)), JSONObject.class);
     }
-    
+
     /**
      * 下载资金账单
      *
-     * @param billDate     账单时间:日账单格式为yyyy-MM-dd,月账单格式为yyyy-MM。
-     * @param access_token
-     * @return
+     * @param billDate    账单时间:日账单格式为yyyy-MM-dd
+     * @param accessToken 用户token
+     * @return 对账单
      */
     @Override
-    public Map downloadbill(Date billDate, String access_token) {
+    public Map downloadbill(Date billDate, String accessToken) {
         Map parameters = new HashMap<>();
-        parameters.put("access_token", access_token);
+        parameters.put("access_token", accessToken);
         parameters.put("billTime", DateUtils.formatDay(billDate));
         return requestTemplate.getForObject(String.format("%s?%s", getReqUrl(BaiduTransactionType.DOWNLOAD_BILL),
                 UriVariables.getMapToParameters(parameters)), JSONObject.class);
     }
-    
+
     /**
      * 下载订单对账单
      *
-     * @param billDate
-     * @param access_token
-     * @return
+     * @param billDate    账单时间:日账单格式为yyyy-MM-dd
+     * @param accessToken 用户token
+     * @return 账单结果
      */
-    public Map downloadOrderBill(Date billDate, String access_token) {
+    public Map downloadOrderBill(Date billDate, String accessToken) {
         Map parameters = new HashMap<>();
-        parameters.put("access_token", access_token);
+        parameters.put("access_token", accessToken);
         parameters.put("billTime", DateUtils.formatDay(billDate));
         return requestTemplate.getForObject(String.format("%s?%s", getReqUrl(BaiduTransactionType.DOWNLOAD_ORDER_BILL),
                 UriVariables.getMapToParameters(parameters)), JSONObject.class);
     }
-    
+
     /**
      * 通用查询接口
      *
-     * @param orderId
-     * @param siteId
+     * @param orderId         订单id
+     * @param siteId          用户id
      * @param transactionType 交易类型
-     * @return
+     * @return 结果
      */
     @Override
     public Map secondaryInterface(Object orderId,
@@ -432,34 +400,34 @@ public class BaiduPayService extends BasePayService {
         if (!BaiduTransactionType.PAY_QUERY.equals(transactionType)) {
             throw new UnsupportedOperationException("不支持该操作");
         }
-        
+
         Map parameters = getUseQueryPay();
         parameters.put(ORDER_ID, orderId);
         parameters.put(SITE_ID, siteId);
         parameters.put(SIGN, getRsaSign(parameters, SIGN));
         return requestTemplate.getForObject(String.format("%s?%s", getReqUrl(transactionType), UriVariables.getMapToParameters(parameters)), JSONObject.class);
     }
-    
+
     /**
      * 获取支付请求地址
      *
      * @param transactionType 交易类型
-     * @return
+     * @return 请求URL
      */
     @Override
     public String getReqUrl(TransactionType transactionType) {
         return ((BaiduTransactionType) transactionType).getUrl();
     }
-    
+
     /**
      * 签名
      *
-     * @param params
-     * @param ignoreKeys
-     * @return
+     * @param params     参数
+     * @param ignoreKeys 忽略字段
+     * @return 签名结果
      */
     private String getRsaSign(Map params, String... ignoreKeys) {
         String waitSignVal = SignUtils.parameterText(params, "&", false, ignoreKeys);
-        return SignUtils.RSA.createSign(waitSignVal, payConfigStorage.getKeyPrivate(), "UTF-8");
+        return SignUtils.valueOf(payConfigStorage.getSignType()).createSign(waitSignVal, payConfigStorage.getKeyPrivate(), payConfigStorage.getInputCharset());
     }
 }
diff --git a/pay-java-baidu/src/main/java/com/egzosn/pay/baidu/bean/BaiduRefundOrder.java b/pay-java-baidu/src/main/java/com/egzosn/pay/baidu/bean/BaiduRefundOrder.java
index 6386be8..91d6510 100644
--- a/pay-java-baidu/src/main/java/com/egzosn/pay/baidu/bean/BaiduRefundOrder.java
+++ b/pay-java-baidu/src/main/java/com/egzosn/pay/baidu/bean/BaiduRefundOrder.java
@@ -5,73 +5,67 @@ import com.egzosn.pay.common.bean.RefundOrder;
 import java.math.BigDecimal;
 
 public class BaiduRefundOrder extends RefundOrder {
-    /**
-     * 平台用户ID
-     */
-    private Long userId;
+
     /**
      * 退款类型
      */
     private Integer refundType;
-    /**
-     * 退款原因
-     */
-    private String refundReason;
-    /**
-     * 平台订单ID
-     */
-    private String tpOrderId;
-    /**
-     * 退款金额,单位:分,发起部分退款时必传
-     */
-    private BigDecimal applyRefundMoney;
-    /**
-     * 业务方退款批次id,退款业务流水唯一编号,发起部分退款时必传
-     */
-    private String bizRefundBatchId;
-    
+
+
     public BaiduRefundOrder(Long orderId,
-                            Long userId,
+                            String userId,
                             Integer refundType,
                             String refundReason,
                             String tpOrderId) {
         super();
-        setTradeNo(String.valueOf(orderId));
-        this.userId = userId;
-        this.refundType = refundType;
-        this.refundReason = refundReason;
-        this.tpOrderId = tpOrderId;
+        setOutTradeNo(String.valueOf(orderId));
+        setUserId(userId);
+        setRefundType(refundType);
+        setDescription(refundReason);
+        setTradeNo(tpOrderId);
     }
-    
+
+    /**
+     * 退款金额,单位:分,发起部分退款时必传
+     *
+     * @return 退款金额
+     */
     public BigDecimal getApplyRefundMoney() {
-        return applyRefundMoney;
+        return getRefundAmount();
     }
-    
+
+    /**
+     * 退款金额,单位:分,发起部分退款时必传
+     *
+     * @param applyRefundMoney 退款金额
+     */
     public void setApplyRefundMoney(BigDecimal applyRefundMoney) {
         setRefundAmount(applyRefundMoney);
     }
-    
+
+    /**
+     * 业务方退款批次id,退款业务流水唯一编号,发起部分退款时必传
+     *
+     * @return 退款业务流水
+     */
     public String getBizRefundBatchId() {
-        return bizRefundBatchId;
+        return getRefundNo();
     }
-    
+
+    /**
+     * 业务方退款批次id,退款业务流水唯一编号,发起部分退款时必传
+     */
     public void setBizRefundBatchId(String bizRefundBatchId) {
-        this.bizRefundBatchId = bizRefundBatchId;
+        setRefundNo(bizRefundBatchId);
     }
-    
-    public Long getUserId() {
-        return userId;
+
+    public void setRefundType(Integer refundType) {
+        this.refundType = refundType;
+        addAttr("refundType", refundType);
     }
-    
+
     public Integer getRefundType() {
         return refundType;
     }
-    
-    public String getRefundReason() {
-        return refundReason;
-    }
-    
-    public String getTpOrderId() {
-        return tpOrderId;
-    }
+
 }

From 7f90f489ce96de464b16133b43ed3fe613b1d06a Mon Sep 17 00:00:00 2001
From: egzosn 
Date: Sun, 17 May 2020 23:36:25 +0800
Subject: [PATCH 23/37] =?UTF-8?q?=E5=BE=AE=E4=BF=A1=E5=8F=91=E7=BA=A2?=
 =?UTF-8?q?=E5=8C=85=E6=8E=A5=E5=8F=A3=E5=AE=9E=E7=8E=B0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../pay/demo/controller/WxPayController.java  |  66 +++++--
 .../com/egzosn/pay/wx/api/WxPayService.java   | 162 ++++++-----------
 .../egzosn/pay/wx/api/WxRedPackService.java   |  33 ++++
 .../com/egzosn/pay/wx/bean/RedpackOrder.java  | 164 +++++++-----------
 .../egzosn/pay/wx/bean/WxSendredpackType.java |   2 +-
 5 files changed, 207 insertions(+), 220 deletions(-)
 create mode 100644 pay-java-wx/src/main/java/com/egzosn/pay/wx/api/WxRedPackService.java

diff --git a/pay-java-demo/src/main/java/com/egzosn/pay/demo/controller/WxPayController.java b/pay-java-demo/src/main/java/com/egzosn/pay/demo/controller/WxPayController.java
index 4f72fb3..ef58916 100644
--- a/pay-java-demo/src/main/java/com/egzosn/pay/demo/controller/WxPayController.java
+++ b/pay-java-demo/src/main/java/com/egzosn/pay/demo/controller/WxPayController.java
@@ -2,27 +2,16 @@
 package com.egzosn.pay.demo.controller;
 
 
-import com.egzosn.pay.common.api.Callback;
-import com.egzosn.pay.common.api.PayService;
 import com.egzosn.pay.common.bean.*;
 import com.egzosn.pay.common.http.HttpConfigStorage;
-import com.egzosn.pay.common.http.UriVariables;
-import com.egzosn.pay.demo.entity.PayType;
 import com.egzosn.pay.demo.request.QueryOrder;
-import com.egzosn.pay.demo.service.PayResponse;
-import com.egzosn.pay.demo.service.handler.AliPayMessageHandler;
-import com.egzosn.pay.demo.service.handler.WxPayMessageHandler;
 import com.egzosn.pay.wx.api.WxPayConfigStorage;
 import com.egzosn.pay.wx.api.WxPayService;
-import com.egzosn.pay.wx.bean.WxBank;
-import com.egzosn.pay.wx.bean.WxTransactionType;
-import com.egzosn.pay.wx.bean.WxTransferType;
-import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
+import com.egzosn.pay.wx.bean.*;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.annotation.PostConstruct;
-import javax.annotation.Resource;
 import javax.imageio.ImageIO;
 import javax.servlet.http.HttpServletRequest;
 import java.io.ByteArrayOutputStream;
@@ -43,7 +32,7 @@ import java.util.UUID;
 @RequestMapping("wx")
 public class WxPayController {
 
-    private PayService service = null;
+    private WxPayService service = null;
 
 
 
@@ -334,8 +323,8 @@ public class WxPayController {
      * @return 返回支付方查询退款后的结果
      */
     @RequestMapping("refundquery")
-    public Map refundquery(QueryOrder order) {
-        return service.refundquery(order.getTradeNo(), order.getOutTradeNo());
+    public Map refundquery(RefundOrder order) {
+        return service.refundquery(order);
     }
 
     /**
@@ -428,4 +417,51 @@ public class WxPayController {
        //默认查询银行卡的记录 com.egzosn.pay.wx.bean.WxTransferType#QUERY_BANK
         return service.transferQuery(outNo, wxTransferType);
     }
+
+    /**
+     * 微信发红包
+     * @param redpackOrder 红包订单
+     * @return 结果
+     */
+    public Map sendredpack(RedpackOrder redpackOrder) {
+        redpackOrder.setTransferType(WxSendredpackType.SENDREDPACK);
+        return service.sendredpack(redpackOrder);
+    }
+
+    /**
+     * 发放裂变红包
+     * @param redpackOrder 红包订单
+     * @return 结果
+     */
+    public Map sendgroupredpack(RedpackOrder redpackOrder) {
+        redpackOrder.setTransferType(WxSendredpackType.SENDGROUPREDPACK);
+        return service.sendredpack(redpackOrder);
+    }
+
+
+    /**
+     * 小程序发红包
+     * @param redpackOrder 红包订单
+     * @return 结果
+     */
+    public Map sendminiprogramhb(RedpackOrder redpackOrder) {
+        redpackOrder.setTransferType(WxSendredpackType.SENDMINIPROGRAMHB);
+        return service.sendredpack(redpackOrder);
+    }
+
+
+    /**
+     * 查询红包记录
+     * 用于商户对已发放的红包进行查询红包的具体信息,可支持普通红包和裂变包
+     * 查询红包记录API只支持查询30天内的红包订单,30天之前的红包订单请登录商户平台查询。
+     *
+     * @param mchBillno 商户发放红包的商户订单号
+     * @return 返回查询结果
+     */
+    public Map gethbinfo(String mchBillno) {
+        return service.gethbinfo(mchBillno);
+    }
+
+
+
 }
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 a69bff2..b882ddc 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
@@ -2,23 +2,22 @@ package com.egzosn.pay.wx.api;
 
 import com.alibaba.fastjson.JSONObject;
 import com.egzosn.pay.common.api.BasePayService;
-import com.egzosn.pay.common.api.Callback;
 import com.egzosn.pay.common.bean.*;
 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.Util;
+import com.egzosn.pay.common.util.XML;
 import com.egzosn.pay.common.util.sign.SignUtils;
 import com.egzosn.pay.common.util.sign.encrypt.RSA2;
 import com.egzosn.pay.common.util.str.StringUtils;
 import com.egzosn.pay.wx.bean.*;
-import com.egzosn.pay.common.util.XML;
 
 import java.io.IOException;
 import java.io.InputStream;
-import java.math.BigDecimal;
 import java.net.URLEncoder;
+import java.security.GeneralSecurityException;
 import java.util.*;
 
 import static com.egzosn.pay.wx.api.WxConst.*;
@@ -29,13 +28,11 @@ import static com.egzosn.pay.wx.bean.WxTransferType.*;
  *
  * @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 class WxPayService extends BasePayService { - - +public class WxPayService extends BasePayService implements WxRedPackService { /** @@ -94,15 +91,15 @@ public class WxPayService extends BasePayService { public boolean verify(Map params) { if (!(SUCCESS.equals(params.get(RETURN_CODE)) && SUCCESS.equals(params.get(RESULT_CODE)))) { - if (LOG.isErrorEnabled()){ - LOG.error(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)) { - if (LOG.isDebugEnabled()){ - LOG.debug(String.format("微信支付异常:签名为空!%s=%s", 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; } @@ -243,24 +240,24 @@ public class WxPayService extends BasePayService { if (verify(preOrderHandler(result, order))) { //如果是扫码支付或者刷卡付无需处理,直接返回 if (((WxTransactionType) order.getTransactionType()).isReturn()) { - return result; +return result; } Map params = new TreeMap(); if (WxTransactionType.JSAPI == order.getTransactionType()) { - params.put("signType", payConfigStorage.getSignType()); - params.put("appId", payConfigStorage.getAppid()); - params.put("timeStamp", System.currentTimeMillis() / 1000); - params.put("nonceStr", result.get(NONCE_STR)); - params.put("package", "prepay_id=" + result.get("prepay_id")); +params.put("signType", payConfigStorage.getSignType()); +params.put("appId", payConfigStorage.getAppid()); +params.put("timeStamp", System.currentTimeMillis() / 1000); +params.put("nonceStr", result.get(NONCE_STR)); +params.put("package", "prepay_id=" + result.get("prepay_id")); } else if (WxTransactionType.APP == order.getTransactionType()) { - params.put("partnerid", payConfigStorage.getPid()); - params.put(APPID, payConfigStorage.getAppid()); - params.put("prepayid", result.get("prepay_id")); - params.put("timestamp", System.currentTimeMillis() / 1000); - params.put("noncestr", result.get(NONCE_STR)); - params.put("package", "Sign=WXPay"); +params.put("partnerid", payConfigStorage.getPid()); +params.put(APPID, payConfigStorage.getAppid()); +params.put("prepayid", result.get("prepay_id")); +params.put("timestamp", System.currentTimeMillis() / 1000); +params.put("noncestr", result.get(NONCE_STR)); +params.put("package", "Sign=WXPay"); } String paySign = createSign(SignUtils.parameterText(params), payConfigStorage.getInputCharset()); params.put(SIGN, paySign); @@ -480,23 +477,6 @@ public class WxPayService extends BasePayService { return secondaryInterface(transactionId, outTradeNo, WxTransactionType.REVERSE); } - /** - * 退款 - * - * @param transactionId 微信订单号 - * @param outTradeNo 商户单号 - * @param refundAmount 退款金额 - * @param totalAmount 总金额 - * @return 返回支付方申请退款后的结果 - * @see #refund(RefundOrder, Callback) - */ - @Deprecated - @Override - public Map refund(String transactionId, String outTradeNo, BigDecimal refundAmount, BigDecimal totalAmount) { - - return refund(new RefundOrder(transactionId, outTradeNo, refundAmount, totalAmount)); - } - @@ -527,18 +507,6 @@ public class WxPayService extends BasePayService { } - /** - * 查询退款 - * - * @param transactionId 支付平台订单号 - * @param outTradeNo 商户单号 - * @return 返回支付方查询退款后的结果 - */ - @Override - public Map refundquery(String transactionId, String outTradeNo) { - return secondaryInterface(transactionId, outTradeNo, WxTransactionType.REFUNDQUERY); - } - /** * 查询退款 * @@ -607,7 +575,7 @@ public class WxPayService extends BasePayService { if (transactionType == WxTransactionType.DOWNLOADBILL) { if (transactionIdOrBillDate instanceof Date) { - return downloadbill((Date) transactionIdOrBillDate, outTradeNoBillType); +return downloadbill((Date) transactionIdOrBillDate, outTradeNoBillType); } throw new PayErrorException(new PayException(FAILURE, "非法类型异常:" + transactionIdOrBillDate.getClass())); } @@ -631,13 +599,12 @@ public class WxPayService extends BasePayService { * @param order 转账订单 *
      *
-     *                                        注意事项:
-     *                                        ◆ 当返回错误码为“SYSTEMERROR”时,请不要更换商户订单号,一定要使用原商户订单号重试,否则可能造成重复支付等资金风险。
-     *                                        ◆ XML具有可扩展性,因此返回参数可能会有新增,而且顺序可能不完全遵循此文档规范,如果在解析回包的时候发生错误,请商户务必不要换单重试,请商户联系客服确认付款情况。如果有新回包字段,会更新到此API文档中。
-     *                                        ◆ 因为错误代码字段err_code的值后续可能会增加,所以商户如果遇到回包返回新的错误码,请商户务必不要换单重试,请商户联系客服确认付款情况。如果有新的错误码,会更新到此API文档中。
-     *                                        ◆ 错误代码描述字段err_code_des只供人工定位问题时做参考,系统实现时请不要依赖这个字段来做自动化处理。
-     *
-     *                                        
+ *注意事项: + *◆ 当返回错误码为“SYSTEMERROR”时,请不要更换商户订单号,一定要使用原商户订单号重试,否则可能造成重复支付等资金风险。 + *◆ XML具有可扩展性,因此返回参数可能会有新增,而且顺序可能不完全遵循此文档规范,如果在解析回包的时候发生错误,请商户务必不要换单重试,请商户联系客服确认付款情况。如果有新回包字段,会更新到此API文档中。 + *◆ 因为错误代码字段err_code的值后续可能会增加,所以商户如果遇到回包返回新的错误码,请商户务必不要换单重试,请商户联系客服确认付款情况。如果有新的错误码,会更新到此API文档中。 + *◆ 错误代码描述字段err_code_des只供人工定位问题时做参考,系统实现时请不要依赖这个字段来做自动化处理。 + *
* @return 对应的转账结果 */ @Override @@ -711,11 +678,11 @@ public class WxPayService extends BasePayService { * * @param outNo 商户转账订单号 * @param wxTransferType 微信转账类型,.....这里没办法了只能这样写(┬_┬),请见谅 {@link com.egzosn.pay.wx.bean.WxTransferType} - *

- *

- * 企业付款到零钱 - * 商户企业付款到银行卡 - *

+ *

+ *

+ * 企业付款到零钱 + * 商户企业付款到银行卡 + *

* @return 对应的转账订单 */ @Override @@ -740,7 +707,7 @@ public class WxPayService extends BasePayService { public String keyPublic(String content) { try { return RSA2.encrypt(content, payConfigStorage.getKeyPublic(), CIPHER_ALGORITHM, payConfigStorage.getInputCharset()); - } catch (Exception e) { + } catch (GeneralSecurityException | IOException e) { throw new PayErrorException(new WxPayError(FAILURE, e.getLocalizedMessage())); } } @@ -758,70 +725,51 @@ public class WxPayService extends BasePayService { /** * 微信发红包 - * @author: faymanwang 1057438332@qq.com + * * @param redpackOrder 红包实体 * @return 返回发红包实体后的结果 + * @author: faymanwang 1057438332@qq.com */ + @Override public Map sendredpack(RedpackOrder redpackOrder) { Map parameters = new TreeMap(); - redpackParam(redpackOrder, parameters); + redPackParam(redpackOrder, parameters); + if (WxSendredpackType.SENDGROUPREDPACK == redpackOrder.getTransferType()) { + parameters.put("amt_type", "ALL_RAND"); + } else if (WxSendredpackType.SENDMINIPROGRAMHB == redpackOrder.getTransferType()) { + parameters.put("notify_way", "MINI_PROGRAM_JSAPI"); + } + parameters.put(SIGN, createSign(SignUtils.parameterText(parameters, "&", SIGN), payConfigStorage.getInputCharset())); - return requestTemplate.postForObject(getReqUrl( WxSendredpackType.SENDREDPACK), XML.getMap2Xml(parameters) , JSONObject.class); + return requestTemplate.postForObject(getReqUrl(redpackOrder.getTransferType()), XML.getMap2Xml(parameters), JSONObject.class); } - /** - * 发放裂变红包 - * 裂变红包:一次可以发放一组红包。首先领取的用户为种子用户,种子用户领取一组红包当中的一个,并可以通过社交分享将剩下的红包给其他用户。裂变红包充分利用了人际传播的优势。 - * - * @author: faymanwang 1057438332@qq.com - * @param redpackOrder 红包实体 - * @return 返回发红包实体后的结果 - */ - public Map sendgroupredpack(RedpackOrder redpackOrder) { - Map parameters = new TreeMap(); - redpackParam(redpackOrder, parameters); - parameters.put("amt_type", "ALL_RAND"); - parameters.put(SIGN, createSign(SignUtils.parameterText(parameters, "&", SIGN), payConfigStorage.getInputCharset())); - return requestTemplate.postForObject(getReqUrl( WxSendredpackType.SENDGROUPREDPACK), XML.getMap2Xml(parameters) , JSONObject.class); - } - - /** - * 小程序发红包 - * @author: faymanwang 1057438332@qq.com - * @param redpackOrder 红包实体 - * @return 返回发红包实体后的结果 - */ - public Map sendminiprogramhb(RedpackOrder redpackOrder) { - Map parameters = new TreeMap(); - redpackParam(redpackOrder, parameters); - parameters.put("notify_way", "MINI_PROGRAM_JSAPI"); - parameters.put(SIGN, createSign(SignUtils.parameterText(parameters, "&", SIGN), payConfigStorage.getInputCharset())); - return requestTemplate.postForObject(getReqUrl( WxSendredpackType.SENDMINIPROGRAMHB), XML.getMap2Xml(parameters) , JSONObject.class); - } /** * 查询红包记录 * 用于商户对已发放的红包进行查询红包的具体信息,可支持普通红包和裂变包 * 查询红包记录API只支持查询30天内的红包订单,30天之前的红包订单请登录商户平台查询。 * - * @author: faymanwang 1057438332@qq.com * @param mchBillno 商户发放红包的商户订单号 * @return 返回查询结果 + * @author: faymanwang 1057438332@qq.com */ - public Map gethbinfo (String mchBillno) { + @Override + public Map gethbinfo(String mchBillno) { Map parameters = this.getPublicParameters(); parameters.put("mch_billno", mchBillno); parameters.put("bill_type", "MCHT"); parameters.put(SIGN, createSign(SignUtils.parameterText(parameters, "&", SIGN), payConfigStorage.getInputCharset())); - return requestTemplate.postForObject(getReqUrl( WxSendredpackType.GETHBINFO), XML.getMap2Xml(parameters) , JSONObject.class); + return requestTemplate.postForObject(getReqUrl(WxSendredpackType.GETHBINFO), XML.getMap2Xml(parameters), JSONObject.class); } /** * 微信红包构造参数方法 + * * @param redpackOrder 红包实体 - * @param parameters + * @param parameters 接收参数 */ - private void redpackParam(RedpackOrder redpackOrder, Map parameters) { + private void redPackParam(RedpackOrder redpackOrder, Map parameters) { parameters.put(NONCE_STR, SignUtils.randomStr()); parameters.put(MCH_ID, payConfigStorage.getPid()); parameters.put("wxappid", payConfigStorage.getAppid()); @@ -829,12 +777,12 @@ public class WxPayService extends BasePayService { parameters.put("re_openid", redpackOrder.getReOpenid()); parameters.put("mch_billno", redpackOrder.getMchBillno()); parameters.put("total_amount", Util.conversionCentAmount(redpackOrder.getTotalAmount())); - parameters.put("total_num", redpackOrder.getTotalNum() > 0 ? redpackOrder.getTotalNum() : 1); + parameters.put("total_num", Math.max(redpackOrder.getTotalNum(), 1)); parameters.put("wishing", redpackOrder.getWishing()); parameters.put("client_ip", StringUtils.isNotEmpty(redpackOrder.getIp()) ? redpackOrder.getIp() : "192.168.0.1"); parameters.put("act_name", redpackOrder.getActName()); parameters.put("remark", redpackOrder.getRemark()); - if(StringUtils.isNotEmpty(redpackOrder.getSceneId())){ + if (StringUtils.isNotEmpty(redpackOrder.getSceneId())) { parameters.put("scene_id", redpackOrder.getSceneId()); } } diff --git a/pay-java-wx/src/main/java/com/egzosn/pay/wx/api/WxRedPackService.java b/pay-java-wx/src/main/java/com/egzosn/pay/wx/api/WxRedPackService.java new file mode 100644 index 0000000..341f3a8 --- /dev/null +++ b/pay-java-wx/src/main/java/com/egzosn/pay/wx/api/WxRedPackService.java @@ -0,0 +1,33 @@ +package com.egzosn.pay.wx.api; + +import com.egzosn.pay.wx.bean.RedpackOrder; + +import java.util.Map; + +/** + * 微信红包服务 + * @author egan + *
+ * email egzosn@gmail.com
+ * date 2020/5/17 22:24
+ * 
+ */ +public interface WxRedPackService { + /** + * 微信发红包 + * + * @param redpackOrder 红包实体 + * @return 返回发红包实体后的结果 + */ + Map sendredpack(RedpackOrder redpackOrder); + + /** + * 查询红包记录 + * 用于商户对已发放的红包进行查询红包的具体信息,可支持普通红包和裂变包 + * 查询红包记录API只支持查询30天内的红包订单,30天之前的红包订单请登录商户平台查询。 + * + * @param mchBillno 商户发放红包的商户订单号 + * @return 返回查询结果 + */ + Map gethbinfo(String mchBillno); +} diff --git a/pay-java-wx/src/main/java/com/egzosn/pay/wx/bean/RedpackOrder.java b/pay-java-wx/src/main/java/com/egzosn/pay/wx/bean/RedpackOrder.java index 801f94f..300c85e 100644 --- a/pay-java-wx/src/main/java/com/egzosn/pay/wx/bean/RedpackOrder.java +++ b/pay-java-wx/src/main/java/com/egzosn/pay/wx/bean/RedpackOrder.java @@ -1,61 +1,105 @@ package com.egzosn.pay.wx.bean; +import com.egzosn.pay.common.bean.TransferOrder; + import java.math.BigDecimal; /** - * @description: + * @description: 发红包订单 * @author: 保网 faymanwang 1057438332@qq.com * @time: 2020/5/15 12:40 */ -public class RedpackOrder { +public class RedpackOrder extends TransferOrder { + + /** * 商户订单号(每个订单号必须唯一。取值范围:0~9,a~z,A~Z) * 接口根据商户订单号支持重入,如出现超时可再调用 + * @return 商户订单号 */ - private String mchBillno; + public String getMchBillno() { + return getOutNo(); + } + + public void setMchBillno(String mchBillno) { + setOutNo(mchBillno); + } /** * 商户名称:红包发送者名称 + * @return 红包发送者名称 */ - private String sendName; + public String getSendName() { + return getPayerName(); + } + + public void setSendName(String sendName) { + super.setPayerName(sendName); + } /** * 用户openid + * @return 用户openid */ - private String reOpenid; + public String getReOpenid() { + return getPayeeAccount(); + } + + public void setReOpenid(String reOpenid) { + super.setPayeeAccount(reOpenid); + } /** * 付款金额 每个红包金额必须在默认额度内(默认大于1元,小于200元,可在产品设置中自行申请调高额度) + * @return 付款金额 */ - private BigDecimal totalAmount; + public BigDecimal getTotalAmount() { + return getAmount(); + } + public void setTotalAmount(BigDecimal totalAmount) { + super.setAmount(totalAmount); + } /** * 红包发放总人数 * 普通红包:1 * 裂变:必须介于(包括)3到20之间 */ - private int totalNum; + public int getTotalNum() { + Object totalNum = getAttr("total_num"); + return null == totalNum ? 1 : (Integer)totalNum; + } + public void setTotalNum(int totalNum) { + addAttr("total_num", totalNum); + } /** * 红包祝福语 */ - private String wishing; + public String getWishing() { + return (String) getAttr("wishing"); + + } + + public void setWishing(String wishing) { + addAttr("wishing", wishing); + } - /** - * 操作者ip,根据支付平台所需进行设置 - */ - private String ip; /** * 活动名称 */ - private String actName; + public String getActName() { + return (String) getAttr("act_name"); + } - /** - * 备注 - */ - private String remark; + public void setActName(String actName) { + addAttr("act_name", actName); + } + public String getSceneId() { + return (String) getAttr("scene_id"); + } /** * 发放红包使用场景,红包金额大于200或者小于1元时必传 * PRODUCT_1:商品促销 @@ -67,86 +111,12 @@ public class RedpackOrder { * PRODUCT_7:彩票派奖 * PRODUCT_8:税务刮奖 */ - private String sceneId; - - - public String getMchBillno() { - return mchBillno; - } - - public void setMchBillno(String mchBillno) { - this.mchBillno = mchBillno; - } - - public String getSendName() { - return sendName; - } - - public void setSendName(String sendName) { - this.sendName = sendName; - } - - public String getReOpenid() { - return reOpenid; - } - - public void setReOpenid(String reOpenid) { - this.reOpenid = reOpenid; - } - - public BigDecimal getTotalAmount() { - return totalAmount; - } - - public void setTotalAmount(BigDecimal totalAmount) { - this.totalAmount = totalAmount; - } - - public int getTotalNum() { - return totalNum; - } - - public void setTotalNum(int totalNum) { - this.totalNum = totalNum; - } - - public String getWishing() { - return wishing; - } - - public void setWishing(String wishing) { - this.wishing = wishing; - } - - public String getIp() { - return ip; - } - - public void setIp(String ip) { - this.ip = ip; - } - - public String getActName() { - return actName; - } - - public void setActName(String actName) { - this.actName = actName; - } - - public String getRemark() { - return remark; - } - - public void setRemark(String remark) { - this.remark = remark; - } - - public String getSceneId() { - return sceneId; - } - public void setSceneId(String sceneId) { - this.sceneId = sceneId; + addAttr("scene_id", sceneId); + } + + + public void setTransferType(WxSendredpackType transferType) { + super.setTransferType(transferType); } } diff --git a/pay-java-wx/src/main/java/com/egzosn/pay/wx/bean/WxSendredpackType.java b/pay-java-wx/src/main/java/com/egzosn/pay/wx/bean/WxSendredpackType.java index 6e114b2..623b667 100644 --- a/pay-java-wx/src/main/java/com/egzosn/pay/wx/bean/WxSendredpackType.java +++ b/pay-java-wx/src/main/java/com/egzosn/pay/wx/bean/WxSendredpackType.java @@ -3,7 +3,7 @@ package com.egzosn.pay.wx.bean; import com.egzosn.pay.common.bean.TransferType; /** - * @description: + * @description: 红包交易类型 * @author: faymanwang * @time: 2020/5/14 20:11 */ From 9ed210856f3da7eeeddf7307947a7eb761fc0370 Mon Sep 17 00:00:00 2001 From: egzosn Date: Sun, 17 May 2020 23:57:10 +0800 Subject: [PATCH 24/37] =?UTF-8?q?=E5=BE=AE=E4=BF=A1=E5=8F=91=E7=BA=A2?= =?UTF-8?q?=E5=8C=85=E6=8E=A5=E5=8F=A3=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/egzosn/pay/wx/api/WxPayService.java | 58 +++++++++---------- 1 file changed, 29 insertions(+), 29 deletions(-) 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 b882ddc..825d711 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 @@ -92,14 +92,14 @@ public class WxPayService extends BasePayService implements if (!(SUCCESS.equals(params.get(RETURN_CODE)) && SUCCESS.equals(params.get(RESULT_CODE)))) { if (LOG.isErrorEnabled()) { -LOG.error(String.format("微信支付异常:return_code=%s,参数集=%s", params.get(RETURN_CODE), params)); + LOG.error(String.format("微信支付异常:return_code=%s,参数集=%s", params.get(RETURN_CODE), params)); } return false; } if (null == params.get(SIGN)) { if (LOG.isDebugEnabled()) { -LOG.debug(String.format("微信支付异常:签名为空!%s=%s", OUT_TRADE_NO, params.get(OUT_TRADE_NO))); + LOG.debug(String.format("微信支付异常:签名为空!%s=%s", OUT_TRADE_NO, params.get(OUT_TRADE_NO))); } return false; } @@ -240,24 +240,24 @@ LOG.debug(String.format("微信支付异常:签名为空!%s=%s", OUT_TRADE_N if (verify(preOrderHandler(result, order))) { //如果是扫码支付或者刷卡付无需处理,直接返回 if (((WxTransactionType) order.getTransactionType()).isReturn()) { -return result; + return result; } Map params = new TreeMap(); if (WxTransactionType.JSAPI == order.getTransactionType()) { -params.put("signType", payConfigStorage.getSignType()); -params.put("appId", payConfigStorage.getAppid()); -params.put("timeStamp", System.currentTimeMillis() / 1000); -params.put("nonceStr", result.get(NONCE_STR)); -params.put("package", "prepay_id=" + result.get("prepay_id")); + params.put("signType", payConfigStorage.getSignType()); + params.put("appId", payConfigStorage.getAppid()); + params.put("timeStamp", System.currentTimeMillis() / 1000); + params.put("nonceStr", result.get(NONCE_STR)); + params.put("package", "prepay_id=" + result.get("prepay_id")); } else if (WxTransactionType.APP == order.getTransactionType()) { -params.put("partnerid", payConfigStorage.getPid()); -params.put(APPID, payConfigStorage.getAppid()); -params.put("prepayid", result.get("prepay_id")); -params.put("timestamp", System.currentTimeMillis() / 1000); -params.put("noncestr", result.get(NONCE_STR)); -params.put("package", "Sign=WXPay"); + params.put("partnerid", payConfigStorage.getPid()); + params.put(APPID, payConfigStorage.getAppid()); + params.put("prepayid", result.get("prepay_id")); + params.put("timestamp", System.currentTimeMillis() / 1000); + params.put("noncestr", result.get(NONCE_STR)); + params.put("package", "Sign=WXPay"); } String paySign = createSign(SignUtils.parameterText(params), payConfigStorage.getInputCharset()); params.put(SIGN, paySign); @@ -478,8 +478,6 @@ params.put("package", "Sign=WXPay"); } - - /** * 申请退款接口 * @@ -575,7 +573,7 @@ params.put("package", "Sign=WXPay"); if (transactionType == WxTransactionType.DOWNLOADBILL) { if (transactionIdOrBillDate instanceof Date) { -return downloadbill((Date) transactionIdOrBillDate, outTradeNoBillType); + return downloadbill((Date) transactionIdOrBillDate, outTradeNoBillType); } throw new PayErrorException(new PayException(FAILURE, "非法类型异常:" + transactionIdOrBillDate.getClass())); } @@ -599,12 +597,12 @@ return downloadbill((Date) transactionIdOrBillDate, outTradeNoBillType); * @param order 转账订单 *
      *
-     *注意事项:
-     *◆ 当返回错误码为“SYSTEMERROR”时,请不要更换商户订单号,一定要使用原商户订单号重试,否则可能造成重复支付等资金风险。
-     *◆ XML具有可扩展性,因此返回参数可能会有新增,而且顺序可能不完全遵循此文档规范,如果在解析回包的时候发生错误,请商户务必不要换单重试,请商户联系客服确认付款情况。如果有新回包字段,会更新到此API文档中。
-     *◆ 因为错误代码字段err_code的值后续可能会增加,所以商户如果遇到回包返回新的错误码,请商户务必不要换单重试,请商户联系客服确认付款情况。如果有新的错误码,会更新到此API文档中。
-     *◆ 错误代码描述字段err_code_des只供人工定位问题时做参考,系统实现时请不要依赖这个字段来做自动化处理。
-     *
+ * 注意事项: + * ◆ 当返回错误码为“SYSTEMERROR”时,请不要更换商户订单号,一定要使用原商户订单号重试,否则可能造成重复支付等资金风险。 + * ◆ XML具有可扩展性,因此返回参数可能会有新增,而且顺序可能不完全遵循此文档规范,如果在解析回包的时候发生错误,请商户务必不要换单重试,请商户联系客服确认付款情况。如果有新回包字段,会更新到此API文档中。 + * ◆ 因为错误代码字段err_code的值后续可能会增加,所以商户如果遇到回包返回新的错误码,请商户务必不要换单重试,请商户联系客服确认付款情况。如果有新的错误码,会更新到此API文档中。 + * ◆ 错误代码描述字段err_code_des只供人工定位问题时做参考,系统实现时请不要依赖这个字段来做自动化处理。 + *
* @return 对应的转账结果 */ @Override @@ -678,11 +676,11 @@ return downloadbill((Date) transactionIdOrBillDate, outTradeNoBillType); * * @param outNo 商户转账订单号 * @param wxTransferType 微信转账类型,.....这里没办法了只能这样写(┬_┬),请见谅 {@link com.egzosn.pay.wx.bean.WxTransferType} - *

- *

- * 企业付款到零钱 - * 商户企业付款到银行卡 - *

+ *

+ *

+ * 企业付款到零钱 + * 商户企业付款到银行卡 + *

* @return 对应的转账订单 */ @Override @@ -734,8 +732,10 @@ return downloadbill((Date) transactionIdOrBillDate, outTradeNoBillType); public Map sendredpack(RedpackOrder redpackOrder) { Map parameters = new TreeMap(); redPackParam(redpackOrder, parameters); + parameters.put("total_num", 1); if (WxSendredpackType.SENDGROUPREDPACK == redpackOrder.getTransferType()) { parameters.put("amt_type", "ALL_RAND"); + parameters.remove("total_num"); } else if (WxSendredpackType.SENDMINIPROGRAMHB == redpackOrder.getTransferType()) { parameters.put("notify_way", "MINI_PROGRAM_JSAPI"); } @@ -767,7 +767,7 @@ return downloadbill((Date) transactionIdOrBillDate, outTradeNoBillType); * 微信红包构造参数方法 * * @param redpackOrder 红包实体 - * @param parameters 接收参数 + * @param parameters 接收参数 */ private void redPackParam(RedpackOrder redpackOrder, Map parameters) { parameters.put(NONCE_STR, SignUtils.randomStr()); From 31b9210b97d3acb6bd11a681c13fad0d8063016e Mon Sep 17 00:00:00 2001 From: faymanwang <1057438332@qq.com> Date: Mon, 18 May 2020 11:14:24 +0800 Subject: [PATCH 25/37] =?UTF-8?q?=E5=BE=AE=E4=BF=A1=E6=94=AF=E4=BB=98-?= =?UTF-8?q?=E5=8F=91=E7=BA=A2=E5=8C=85=E6=A8=A1=E5=9D=97-=E5=BE=AE?= =?UTF-8?q?=E4=BF=A1=E6=94=AF=E4=BB=98-=E5=8F=91=E7=BA=A2=E5=8C=85?= =?UTF-8?q?=E6=A8=A1=E5=9D=97-=E7=8E=B0=E9=87=91=E7=BA=A2=E5=8C=85?= =?UTF-8?q?=EF=BC=8C=E5=B0=8F=E7=A8=8B=E5=BA=8F=E5=8F=AA=E8=83=BD=E4=B8=BA?= =?UTF-8?q?1=20=EF=BC=9B=E8=A3=82=E5=8F=98=E7=BA=A2=E5=8C=85=E9=BB=98?= =?UTF-8?q?=E8=AE=A4=E4=B8=8D=E5=B0=8F=E4=BA=8E3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/egzosn/pay/wx/api/WxPayService.java | 6 ++-- pay-java-wx/src/test/java/PayTest.java | 34 +++++++++++++++++-- 2 files changed, 35 insertions(+), 5 deletions(-) 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 825d711..feaff86 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 @@ -732,10 +732,10 @@ public class WxPayService extends BasePayService implements public Map sendredpack(RedpackOrder redpackOrder) { Map parameters = new TreeMap(); redPackParam(redpackOrder, parameters); - parameters.put("total_num", 1); if (WxSendredpackType.SENDGROUPREDPACK == redpackOrder.getTransferType()) { + //现金红包,小程序红包默认传1.裂变红包取传入值,且需要大于3 + parameters.put("total_num", Math.max(redpackOrder.getTotalNum(), 3)); parameters.put("amt_type", "ALL_RAND"); - parameters.remove("total_num"); } else if (WxSendredpackType.SENDMINIPROGRAMHB == redpackOrder.getTransferType()) { parameters.put("notify_way", "MINI_PROGRAM_JSAPI"); } @@ -777,7 +777,7 @@ public class WxPayService extends BasePayService implements parameters.put("re_openid", redpackOrder.getReOpenid()); parameters.put("mch_billno", redpackOrder.getMchBillno()); parameters.put("total_amount", Util.conversionCentAmount(redpackOrder.getTotalAmount())); - parameters.put("total_num", Math.max(redpackOrder.getTotalNum(), 1)); + parameters.put("total_num", 1); parameters.put("wishing", redpackOrder.getWishing()); parameters.put("client_ip", StringUtils.isNotEmpty(redpackOrder.getIp()) ? redpackOrder.getIp() : "192.168.0.1"); parameters.put("act_name", redpackOrder.getActName()); diff --git a/pay-java-wx/src/test/java/PayTest.java b/pay-java-wx/src/test/java/PayTest.java index d793613..e0a604b 100644 --- a/pay-java-wx/src/test/java/PayTest.java +++ b/pay-java-wx/src/test/java/PayTest.java @@ -1,9 +1,12 @@ -import com.egzosn.pay.common.api.PayService; +import com.egzosn.pay.common.bean.CertStoreType; import com.egzosn.pay.common.bean.MethodType; import com.egzosn.pay.common.bean.PayOrder; +import com.egzosn.pay.common.http.HttpConfigStorage; import com.egzosn.pay.wx.api.WxPayConfigStorage; import com.egzosn.pay.wx.api.WxPayService; +import com.egzosn.pay.wx.bean.RedpackOrder; +import com.egzosn.pay.wx.bean.WxSendredpackType; import com.egzosn.pay.wx.bean.WxTransactionType; import java.awt.image.BufferedImage; @@ -39,7 +42,7 @@ public class PayTest { //是否为测试账号,沙箱环境 此处暂未实现 wxPayConfigStorage.setTest(true); //支付服务 - PayService service = new WxPayService(wxPayConfigStorage); + WxPayService service = new WxPayService(wxPayConfigStorage); //支付订单基础信息 PayOrder payOrder = new PayOrder("订单title", "摘要", new BigDecimal(0.01) , UUID.randomUUID().toString().replace("-", "")); /*-----------扫码付-------------------*/ @@ -84,5 +87,32 @@ public class PayTest { /*-----------回调处理-------------------*/ + + HttpConfigStorage httpConfigStorage = new HttpConfigStorage(); + //ssl 退款证书相关 + httpConfigStorage.setKeystore("D:/work/pay/src/main/resources/certificates/1220429901_apiclient_cert.p12"); + httpConfigStorage.setStorePassword("默认商户号"); + //设置ssl证书对应的存储方式,这里默认为文件地址 + httpConfigStorage.setCertStoreType(CertStoreType.PATH); + service.setRequestTemplateConfigStorage(httpConfigStorage); + + RedpackOrder redpackOrder = new RedpackOrder(); + + redpackOrder.setSendName("测试"); + //faymanwang- opid + redpackOrder.setReOpenid("om3rxjhD1rhGrP6oLydMgLcN5n10"); + //红包流水 + redpackOrder.setMchBillno("red202005181"); + redpackOrder.setTotalAmount(new BigDecimal(1.5)); + redpackOrder.setSceneId("PRODUCT_1"); + //现金红包,小程序默认为1 裂变默认为3 + redpackOrder.setTotalNum(4); + redpackOrder.setWishing("请勿领取"); + redpackOrder.setActName("请勿领取测试红包"); + redpackOrder.setRemark("测试支付-by fayman"); + //设置发红包方式 + redpackOrder.setTransferType(WxSendredpackType.SENDGROUPREDPACK); + Map sendredpack = service.sendredpack(redpackOrder); + System.out.println(sendredpack); } } From 739f850902ed20fa792718a080fa01cc8927fc3c Mon Sep 17 00:00:00 2001 From: egzosn Date: Mon, 18 May 2020 21:55:18 +0800 Subject: [PATCH 26/37] =?UTF-8?q?APP=E6=8E=A5=E5=8F=A3=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../egzosn/pay/common/api/BasePayService.java | 11 +++- .../com/egzosn/pay/common/api/PayService.java | 16 ++--- .../pay/demo/controller/AliPayController.java | 2 +- .../pay/demo/controller/WxPayController.java | 2 +- .../egzosn/pay/union/api/UnionPayService.java | 60 +++++++++++-------- 5 files changed, 54 insertions(+), 37 deletions(-) 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 b7d8124..261c794 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 @@ -125,7 +125,6 @@ public abstract class BasePayService implements Pay * @param characterEncoding 字符编码 * @return 签名 */ - @Override public String createSign(Map content, String characterEncoding) { return SignUtils.valueOf(payConfigStorage.getSignType()).sign(content, payConfigStorage.getKeyPrivate(), characterEncoding); } @@ -141,6 +140,16 @@ public abstract class BasePayService implements Pay Map orderInfo = orderInfo(order); return buildRequest(orderInfo, MethodType.POST); } + /** + * app支付 + * @param order 订单信息 + * @param 预订单类型 + * @return 对应app所需参数信息 + */ + @Override + public Map app(O order) { + return orderInfo(order); + } /** * 生成二维码支付 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 9397046..d93bca9 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 @@ -98,6 +98,13 @@ public interface PayService { * @return 对应页面重定向信息 */ String toPay(O order); + /** + * app支付 + * @param order 订单信息 + * @param 预订单类型 + * @return 对应app所需参数信息 + */ + Map app(O order); /** * 创建签名 @@ -108,14 +115,7 @@ public interface PayService { */ String createSign(String content, String characterEncoding); - /** - * 创建签名 - * - * @param content 需要签名的内容 - * @param characterEncoding 字符编码 - * @return 签名 - */ - String createSign(Map content, String characterEncoding); + /** * 将请求参数或者请求流转化为 Map diff --git a/pay-java-demo/src/main/java/com/egzosn/pay/demo/controller/AliPayController.java b/pay-java-demo/src/main/java/com/egzosn/pay/demo/controller/AliPayController.java index e9f5ee6..93a50af 100644 --- a/pay-java-demo/src/main/java/com/egzosn/pay/demo/controller/AliPayController.java +++ b/pay-java-demo/src/main/java/com/egzosn/pay/demo/controller/AliPayController.java @@ -113,7 +113,7 @@ public class AliPayController { PayOrder order = new PayOrder("订单title", "摘要", new BigDecimal(0.01), UUID.randomUUID().toString().replace("-", "")); //App支付 order.setTransactionType(AliTransactionType.APP); - data.put("orderInfo", UriVariables.getMapToParameters(service.orderInfo(order))); + data.put("orderInfo", UriVariables.getMapToParameters(service.app(order))); return data; } diff --git a/pay-java-demo/src/main/java/com/egzosn/pay/demo/controller/WxPayController.java b/pay-java-demo/src/main/java/com/egzosn/pay/demo/controller/WxPayController.java index ef58916..0728800 100644 --- a/pay-java-demo/src/main/java/com/egzosn/pay/demo/controller/WxPayController.java +++ b/pay-java-demo/src/main/java/com/egzosn/pay/demo/controller/WxPayController.java @@ -144,7 +144,7 @@ public class WxPayController { PayOrder order = new PayOrder("订单title", "摘要", new BigDecimal(0.01), UUID.randomUUID().toString().replace("-", "")); //App支付 order.setTransactionType(WxTransactionType.APP); - data.put("orderInfo", service.orderInfo(order)); + data.put("orderInfo", service.app(order)); return data; } 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 978d180..6e97c3d 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 @@ -23,6 +23,9 @@ import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.math.BigDecimal; +import java.security.GeneralSecurityException; +import java.security.InvalidAlgorithmParameterException; +import java.security.NoSuchAlgorithmException; import java.security.cert.*; import java.sql.Timestamp; import java.text.DateFormat; @@ -359,21 +362,35 @@ public class UnionPayService extends BasePayService { CertPathBuilder builder = CertPathBuilder.getInstance("PKIX"); - @SuppressWarnings("unused") - PKIXCertPathBuilderResult result = (PKIXCertPathBuilderResult) builder.build(pkixParams); + /*PKIXCertPathBuilderResult result = (PKIXCertPathBuilderResult)*/ builder.build(pkixParams); return cert; } catch (java.security.cert.CertPathBuilderException e) { LOG.error("verify certificate chain fail.", e); } catch (CertificateExpiredException e) { LOG.error(e); - } catch (CertificateNotYetValidException e) { - LOG.error(e); - } catch (Exception e) { + } catch (GeneralSecurityException e) { LOG.error(e); } return null; } + /** + * 发送订单 + * + * @param order 发起支付的订单信息 + * @return 返回支付结果 + */ + + public JSONObject postOrder(PayOrder order) { + Map params = orderInfo(order); + String responseStr = getHttpRequestTemplate().postForObject(this.getBackTransUrl(), params, String.class); + JSONObject response = UriVariables.getParametersToMap(responseStr); + if (response.isEmpty()) { + throw new PayErrorException(new PayException("failure", "响应内容有误!", responseStr)); + } + return response; + } + @Override public String toPay(PayOrder order) { @@ -395,20 +412,15 @@ public class UnionPayService extends BasePayService { @Override public String getQrPay(PayOrder order) { order.setTransactionType(UnionTransactionType.APPLY_QR_CODE); - Map params = orderInfo(order); - String responseStr = getHttpRequestTemplate().postForObject(this.getBackTransUrl(), params, String.class); - Map response = UriVariables.getParametersToMap(responseStr); - if (response.isEmpty()) { - throw new PayErrorException(new PayException("failure", "响应内容有误!", responseStr)); - } + JSONObject response = postOrder(order); if (this.verify(response)) { if (SDKConstants.OK_RESP_CODE.equals(response.get(SDKConstants.param_respCode))) { //成功 return (String) response.get(SDKConstants.param_qrCode); } - throw new PayErrorException(new PayException((String) response.get(SDKConstants.param_respCode), (String) response.get(SDKConstants.param_respMsg), responseStr)); + throw new PayErrorException(new PayException((String) response.get(SDKConstants.param_respCode), (String) response.get(SDKConstants.param_respMsg), response.toJSONString())); } - throw new PayErrorException(new PayException("failure", "验证签名失败", responseStr)); + throw new PayErrorException(new PayException("failure", "验证签名失败", response.toJSONString())); } /** @@ -420,9 +432,8 @@ public class UnionPayService extends BasePayService { @Override public Map microPay(PayOrder order) { order.setTransactionType(UnionTransactionType.CONSUME); - Map params = orderInfo(order); - String responseStr = getHttpRequestTemplate().postForObject(this.getBackTransUrl(), params, String.class); - return UriVariables.getParametersToMap(responseStr); + JSONObject response = postOrder(order); + return response; } @@ -499,17 +510,14 @@ public class UnionPayService extends BasePayService { /** * 功能:将订单信息进行签名并提交请求 - * 业务范围:手机控件支付产品(WAP), + * 业务范围:手机支付控件(含安卓Pay) * @param order 订单信息 * @return 成功:返回支付结果 失败:返回 */ - public Map sendHttpRequest(PayOrder order){ - Map params = orderInfo(order); - String responseStr = getHttpRequestTemplate().postForObject(this.getBackTransUrl(), params, String.class); - Map response = UriVariables.getParametersToMap(responseStr); - if (response.isEmpty()) { - throw new PayErrorException(new PayException("failure", "响应内容有误!", responseStr)); - } + @Override + public Map app(PayOrder order){ + order.setTransactionType(UnionTransactionType.APP); + JSONObject response = postOrder(order); if (this.verify(response)) { if (SDKConstants.OK_RESP_CODE.equals(response.get(SDKConstants.param_respCode))) { // //成功,获取tn号 @@ -517,9 +525,9 @@ public class UnionPayService extends BasePayService { // //TODO return response; } - throw new PayErrorException(new PayException((String) response.get(SDKConstants.param_respCode), (String) response.get(SDKConstants.param_respMsg), responseStr)); + throw new PayErrorException(new PayException((String) response.get(SDKConstants.param_respCode), (String) response.get(SDKConstants.param_respMsg), response.toJSONString())); } - throw new PayErrorException(new PayException("failure", "验证签名失败", responseStr)); + throw new PayErrorException(new PayException("failure", "验证签名失败", response.toJSONString())); } /** From 780a4c52e4bd4267d2ff24c2d74a32532b0d9974 Mon Sep 17 00:00:00 2001 From: egzosn Date: Tue, 19 May 2020 23:12:26 +0800 Subject: [PATCH 27/37] =?UTF-8?q?=E6=94=AF=E4=BB=98=E5=AE=9D=E8=BD=AC?= =?UTF-8?q?=E8=B4=A6=EF=BC=8C=E5=8F=91=E7=BA=A2=E5=8C=85=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pay/ali/bean/AliTransactionType.java | 8 -- .../egzosn/pay/ali/bean/AliTransferOrder.java | 58 +++++++++++++++ .../egzosn/pay/ali/bean/AliTransferType.java | 74 +++++++++++++++++-- .../com/egzosn/pay/ali/bean/IdentityType.java | 19 +++++ 4 files changed, 144 insertions(+), 15 deletions(-) create mode 100644 pay-java-ali/src/main/java/com/egzosn/pay/ali/bean/AliTransferOrder.java create mode 100644 pay-java-ali/src/main/java/com/egzosn/pay/ali/bean/IdentityType.java 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 2073ba3..13e4f12 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 @@ -88,14 +88,6 @@ public enum AliTransactionType implements TransactionType { * 下载对账单 */ 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/bean/AliTransferOrder.java b/pay-java-ali/src/main/java/com/egzosn/pay/ali/bean/AliTransferOrder.java new file mode 100644 index 0000000..1882f84 --- /dev/null +++ b/pay-java-ali/src/main/java/com/egzosn/pay/ali/bean/AliTransferOrder.java @@ -0,0 +1,58 @@ +package com.egzosn.pay.ali.bean; + +import com.egzosn.pay.common.bean.TransferOrder; + +/** + * 支付转账(红包)订单 + * @author egan + * date 2020/5/18 21:08 + * email egzosn@gmail.com + */ +public class AliTransferOrder extends TransferOrder { + + private String orderTitle; + private String identity; + private String identityType; + private String name; + private String businessParams; + + public String getOrderTitle() { + return orderTitle; + } + + public void setOrderTitle(String orderTitle) { + this.orderTitle = orderTitle; + } + + public String getIdentity() { + return identity; + } + + public void setIdentity(String identity) { + this.identity = identity; + } + + public String getIdentityType() { + return identityType; + } + + public void setIdentityType(String identityType) { + this.identityType = identityType; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getBusinessParams() { + return businessParams; + } + + public void setBusinessParams(String businessParams) { + this.businessParams = businessParams; + } +} diff --git a/pay-java-ali/src/main/java/com/egzosn/pay/ali/bean/AliTransferType.java b/pay-java-ali/src/main/java/com/egzosn/pay/ali/bean/AliTransferType.java index 9f35aec..0d8459f 100644 --- a/pay-java-ali/src/main/java/com/egzosn/pay/ali/bean/AliTransferType.java +++ b/pay-java-ali/src/main/java/com/egzosn/pay/ali/bean/AliTransferType.java @@ -2,6 +2,9 @@ package com.egzosn.pay.ali.bean; import com.egzosn.pay.common.bean.TransferType; +import java.util.HashMap; +import java.util.Map; + /** * 收款方账户类型 * @author egan @@ -10,17 +13,59 @@ import com.egzosn.pay.common.bean.TransferType; */ public enum AliTransferType implements TransferType { /** - * 支付宝账号对应的支付宝唯一用户号。以2088开头的16位纯数字组成。 + * 单笔无密转账到支付宝账户固定为 */ - ALIPAY_USERID, + TRANS_ACCOUNT_NO_PWD("alipay.fund.trans.uni.transfer", "DIRECT_TRANSFER"), /** - * 支付宝登录号,支持邮箱和手机号格式。 + * 单笔无密转账到银行卡固定为 */ - ALIPAY_LOGONID - ; + TRANS_BANKCARD_NO_PWD("alipay.fund.trans.uni.transfer", "DIRECT_TRANSFER"), + /** + * 收发现金红包固定为 + */ + STD_RED_PACKET("alipay.fund.trans.uni.transfer", "DIRECT_TRANSFER"), + /** + * 现金红包无线支付接口 + */ + STD_RED_PACKET_APP("alipay.fund.trans.app.pay", "PERSONAL_PAY"){ + + /** + * 获取转账类型 + * + * @return 转账类型 + */ + @Override + public String getType() { + return STD_RED_PACKET.name(); + } + }, /** - * 获取转账类型 + * 转账查询 + */ + TRANS_QUERY("alipay.fund.trans.order.query") + + ; + /** + * 接口名称 + */ + private String method; + /** + * 业务场景 + */ + private String bizScene; + + AliTransferType(String method) { + this.method = method; + } + + AliTransferType(String method, String bizScene) { + this.method = method; + this.bizScene = bizScene; + } + + /** + * 获取转账类型, product_code 业务产品码 * * @return 转账类型 */ @@ -29,6 +74,10 @@ public enum AliTransferType implements TransferType { return name(); } + public String getBizScene() { + return bizScene; + } + /** * 获取接口 * @@ -36,6 +85,17 @@ public enum AliTransferType implements TransferType { */ @Override public String getMethod() { - return name(); + return method; + } + + /** + * 设置属性 + * @param attr 已有属性对象 + * @return 属性对象 + */ + public Map setAttr(Map attr){ + attr.put("product_code", getType()); + attr.put("biz_scene", getBizScene()); + return attr; } } diff --git a/pay-java-ali/src/main/java/com/egzosn/pay/ali/bean/IdentityType.java b/pay-java-ali/src/main/java/com/egzosn/pay/ali/bean/IdentityType.java new file mode 100644 index 0000000..955c8a4 --- /dev/null +++ b/pay-java-ali/src/main/java/com/egzosn/pay/ali/bean/IdentityType.java @@ -0,0 +1,19 @@ +package com.egzosn.pay.ali.bean; + +/** + * 参与方的标识类型 + * @author egan + * date 2020/5/19 21:45 + * email egzosn@gmail.com + */ +public enum IdentityType { + /** + * 支付宝的会员ID + */ + ALIPAY_USER_ID, + /** + * 支付宝登录号,支持邮箱和手机号格式 + */ + ALIPAY_LOGON_ID + +} From f37878ad683b9e10ee3b4dbe80dc2b173696310e Mon Sep 17 00:00:00 2001 From: egzosn Date: Sun, 24 May 2020 23:27:10 +0800 Subject: [PATCH 28/37] =?UTF-8?q?=E6=A0=87=E8=AE=B0=E5=8D=B3=E5=B0=86?= =?UTF-8?q?=E5=BA=9F=E5=BC=83=E7=9A=84=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/egzosn/pay/common/api/PayService.java | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) 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 d93bca9..52bbb96 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 @@ -54,10 +54,11 @@ public interface PayService { /** * 回调校验 - * + * 后面版本废弃 * @param params 回调回来的参数集 * @return 签名校验 true通过 */ + @Deprecated boolean verify(Map params); /** @@ -73,10 +74,11 @@ public interface PayService { /** * 支付宝需要,微信是否也需要再次校验来源,进行订单查询 * 校验数据来源 - * + * 后面版本废弃 * @param id 业务id, 数据的真实性. * @return true通过 */ + @Deprecated boolean verifySource(String id); @@ -305,18 +307,19 @@ public interface PayService { /** * 通用查询接口 - * + * 接下来移除此方法 * @param tradeNoOrBillDate 支付平台订单号或者账单类型, 具体请 * 类型为{@link String }或者 {@link Date },类型须强制限制,类型不对应则抛出异常{@link PayErrorException} * @param outTradeNoBillType 商户单号或者 账单类型 * @param transactionType 交易类型 * @return 返回支付方对应接口的结果 */ + @Deprecated Map secondaryInterface(Object tradeNoOrBillDate, String outTradeNoBillType, TransactionType transactionType); /** * 通用查询接口 - * + * 接下来移除此方法 * @param tradeNoOrBillDate 支付平台订单号或者账单日期, 具体请 类型为{@link String }或者 {@link Date },类型须强制限制,类型不对应则抛出异常{@link PayErrorException} * @param outTradeNoBillType 商户单号或者 账单类型 * @param transactionType 交易类型 @@ -324,6 +327,7 @@ public interface PayService { * @param 返回类型 * @return 返回支付方对应接口的结果 */ + @Deprecated T secondaryInterface(Object tradeNoOrBillDate, String outTradeNoBillType, TransactionType transactionType, Callback callback); From 84b898f4208b15e45f98f32926ad6b88fc704529 Mon Sep 17 00:00:00 2001 From: egzosn Date: Sun, 24 May 2020 23:29:18 +0800 Subject: [PATCH 29/37] =?UTF-8?q?=E8=BD=AC=E8=B4=A6=E8=AE=A2=E5=8D=95?= =?UTF-8?q?=E8=AE=BE=E7=BD=AE=E5=B1=9E=E6=80=A7=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/egzosn/pay/common/bean/TransferType.java | 12 ++++++++++-- .../java/com/egzosn/pay/wx/bean/WxTransferType.java | 9 +++++++++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/pay-java-common/src/main/java/com/egzosn/pay/common/bean/TransferType.java b/pay-java-common/src/main/java/com/egzosn/pay/common/bean/TransferType.java index 867acf9..24b34d5 100644 --- a/pay-java-common/src/main/java/com/egzosn/pay/common/bean/TransferType.java +++ b/pay-java-common/src/main/java/com/egzosn/pay/common/bean/TransferType.java @@ -1,5 +1,7 @@ package com.egzosn.pay.common.bean; +import java.util.Map; + /** * 转账类型 * @author egan @@ -7,6 +9,12 @@ package com.egzosn.pay.common.bean; * date 2018/9/28.19:45 */ public interface TransferType extends TransactionType{ - - + /** + * 设置属性 + * + * @param attr 已有属性对象 + * @param order 转账订单 + * @return 属性对象 + */ + Map setAttr(Map attr, TransferOrder order); } diff --git a/pay-java-wx/src/main/java/com/egzosn/pay/wx/bean/WxTransferType.java b/pay-java-wx/src/main/java/com/egzosn/pay/wx/bean/WxTransferType.java index e0f2760..1983c55 100644 --- a/pay-java-wx/src/main/java/com/egzosn/pay/wx/bean/WxTransferType.java +++ b/pay-java-wx/src/main/java/com/egzosn/pay/wx/bean/WxTransferType.java @@ -1,7 +1,10 @@ package com.egzosn.pay.wx.bean; +import com.egzosn.pay.common.bean.TransferOrder; import com.egzosn.pay.common.bean.TransferType; +import java.util.Map; + /** * 微信转账类型 * @author egan @@ -41,4 +44,10 @@ public enum WxTransferType implements TransferType{ public String getMethod() { return this.method; } + + + @Override + public Map setAttr(Map attr, TransferOrder order) { + return attr; + } } From 9153a3857dbe433bb0f2782bedd0e7f8d5526fb8 Mon Sep 17 00:00:00 2001 From: egzosn Date: Sun, 24 May 2020 23:32:20 +0800 Subject: [PATCH 30/37] =?UTF-8?q?=E6=A0=87=E8=AE=B0=E5=8D=B3=E5=B0=86?= =?UTF-8?q?=E5=BA=9F=E5=BC=83=E7=9A=84=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/egzosn/pay/common/api/PayService.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) 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 52bbb96..910fc7e 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 @@ -54,20 +54,20 @@ public interface PayService { /** * 回调校验 - * 后面版本废弃 + * * @param params 回调回来的参数集 * @return 签名校验 true通过 */ - @Deprecated - boolean verify(Map params); + boolean verify(Map params); /** * 签名校验 - * + * 后面版本废弃 * @param params 参数集 * @param sign 签名原文 * @return 签名校验 true通过 */ + @Deprecated boolean signVerify(Map params, String sign); From 9929598373f13c804f319358c685f9e378b72950 Mon Sep 17 00:00:00 2001 From: egzosn Date: Sun, 24 May 2020 23:33:34 +0800 Subject: [PATCH 31/37] =?UTF-8?q?=E6=94=AF=E4=BB=98=E5=AE=9D=E6=96=B0?= =?UTF-8?q?=E7=89=88=E8=BD=AC=E8=B4=A6(=E5=8F=91=E7=BA=A2=E5=8C=85)?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/egzosn/pay/ali/api/AliPayService.java | 110 ++++++++++++------ .../egzosn/pay/ali/bean/AliTransferOrder.java | 109 +++++++++++++++-- .../egzosn/pay/ali/bean/AliTransferType.java | 21 ++-- .../com/egzosn/pay/ali/bean/IdentityType.java | 19 --- .../com/egzosn/pay/ali/bean/OrderSettle.java | 31 ++++- 5 files changed, 219 insertions(+), 71 deletions(-) delete mode 100644 pay-java-ali/src/main/java/com/egzosn/pay/ali/bean/IdentityType.java 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 ef9a180..9b7aa7d 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 @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.egzosn.pay.ali.bean.AliPayMessage; import com.egzosn.pay.ali.bean.AliTransactionType; +import com.egzosn.pay.ali.bean.AliTransferType; import com.egzosn.pay.ali.bean.OrderSettle; import com.egzosn.pay.common.api.BasePayService; import com.egzosn.pay.common.bean.*; @@ -16,10 +17,7 @@ import com.egzosn.pay.common.util.Util; import com.egzosn.pay.common.util.sign.SignUtils; import com.egzosn.pay.common.util.str.StringUtils; -import java.util.Date; -import java.util.LinkedHashMap; -import java.util.Map; -import java.util.TreeMap; +import java.util.*; /** * 支付宝支付服务 @@ -39,29 +37,37 @@ public class AliPayService extends BasePayService { * 沙箱测试环境账号 */ private static final String DEV_REQ_URL = "https://openapi.alipaydev.com/gateway.do"; - - public static final String SIGN = "sign"; - - public static final String SUCCESS_CODE = "10000"; - - public static final String CODE = "code"; + + private static final String SIGN = "sign"; + + private static final String SUCCESS_CODE = "10000"; + + private static final String CODE = "code"; /** * 附加参数 */ - public static final String PASSBACK_PARAMS = "passback_params"; + private static final String PASSBACK_PARAMS = "passback_params"; /** * 产品代码 */ - public static final String PRODUCT_CODE = "product_code"; + private static final String PRODUCT_CODE = "product_code"; /** * 返回地址 */ - public static final String RETURN_URL = "return_url"; + private static final String RETURN_URL = "return_url"; /** * 请求内容 */ - public static final String BIZ_CONTENT = "biz_content"; + private static final String BIZ_CONTENT = "biz_content"; + /** + * 应用授权概述 + */ + private static final String APP_AUTH_TOKEN = "app_auth_token"; + /** + * 收款方信息 + */ + private static final String PAYEE_INFO = "payee_info"; /** * 获取对应的请求地址 @@ -193,7 +199,7 @@ public class AliPayService extends BasePayService { orderInfo.put("notify_url", payConfigStorage.getNotifyUrl()); orderInfo.put("format", "json"); - + setAppAuthToken(orderInfo, order.getAttrs()); Map bizContent = new TreeMap<>(); bizContent.put("body", order.getBody()); @@ -233,8 +239,8 @@ public class AliPayService extends BasePayService { if (null != order.getExpirationTime()) { bizContent.put(order.getTransactionType() == AliTransactionType.SWEEPPAY ? "qr_code_timeout_express" : "timeout_express", DateUtils.minutesRemaining(order.getExpirationTime()) + "m"); } + bizContent.putAll(order.getAttrs()); orderInfo.put(BIZ_CONTENT, JSON.toJSONString(bizContent)); - orderInfo.putAll(order.getAttrs()); return preOrderHandler(orderInfo, order); } @@ -363,7 +369,10 @@ public class AliPayService extends BasePayService { public Map settle(OrderSettle order){ //获取公共参数 Map parameters = getPublicParameters(AliTransactionType.SETTLE); - parameters.put(BIZ_CONTENT, JSON.toJSONString(order.toBizContent())); + setAppAuthToken(parameters, order.getAttrs()); + final Map bizContent = order.toBizContent(); + bizContent.putAll(order.getAttrs()); + parameters.put(BIZ_CONTENT, JSON.toJSONString(bizContent)); //设置签名 setSign(parameters); return getHttpRequestTemplate().postForObject(getReqUrl() + "?" + UriVariables.getMapToParameters(parameters), null, JSONObject.class); @@ -410,6 +419,16 @@ public class AliPayService extends BasePayService { return secondaryInterface(tradeNo, outTradeNo, AliTransactionType.CANCEL); } + /** + * 设置支付宝授权Token + * @param parameters 参数 + * @param attrs 订单属性 + * @return 参数 + */ + private void setAppAuthToken(Map parameters, Map attrs) { + setParameters(parameters, APP_AUTH_TOKEN, (String) attrs.remove(APP_AUTH_TOKEN)); + } + /** * 申请退款接口 @@ -421,12 +440,13 @@ public class AliPayService extends BasePayService { public Map refund(RefundOrder refundOrder) { //获取公共参数 Map parameters = getPublicParameters(AliTransactionType.REFUND); - + setAppAuthToken(parameters, refundOrder.getAttrs()); Map bizContent = getBizContent(refundOrder.getTradeNo(), refundOrder.getOutTradeNo(), null); if (!StringUtils.isEmpty(refundOrder.getRefundNo())) { bizContent.put("out_request_no", refundOrder.getRefundNo()); } bizContent.put("refund_amount", Util.conversionAmount(refundOrder.getRefundAmount())); + bizContent.putAll(refundOrder.getAttrs()); //设置请求参数的集合 parameters.put(BIZ_CONTENT, JSON.toJSONString(bizContent)); //设置签名 @@ -435,6 +455,7 @@ public class AliPayService extends BasePayService { } + /** * 查询退款 * @@ -443,17 +464,16 @@ public class AliPayService extends BasePayService { */ @Override public Map refundquery(RefundOrder refundOrder) { - //获取公共参数 Map parameters = getPublicParameters(AliTransactionType.REFUNDQUERY); - + setAppAuthToken(parameters, refundOrder.getAttrs()); Map bizContent = getBizContent(refundOrder.getTradeNo(), refundOrder.getOutTradeNo(), null); if (!StringUtils.isEmpty(refundOrder.getRefundNo())) { bizContent.put("out_request_no", refundOrder.getRefundNo()); } + bizContent.putAll(refundOrder.getAttrs()); //设置请求参数的集合 parameters.put(BIZ_CONTENT, JSON.toJSONString(bizContent)); - //设置签名 setSign(parameters); return requestTemplate.getForObject(getReqUrl() + "?" + UriVariables.getMapToParameters(parameters), JSONObject.class); @@ -484,6 +504,7 @@ public class AliPayService extends BasePayService { } + /** * @param tradeNoOrBillDate 支付平台订单号或者账单类型, 具体请 * 类型为{@link String }或者 {@link Date },类型须强制限制,类型不对应则抛出异常{@link PayErrorException} @@ -491,6 +512,7 @@ public class AliPayService extends BasePayService { * @param transactionType 交易类型 * @return 返回支付方对应接口的结果 */ + @Override public Map secondaryInterface(Object tradeNoOrBillDate, String outTradeNoBillType, TransactionType transactionType) { @@ -507,36 +529,38 @@ public class AliPayService extends BasePayService { //获取公共参数 Map parameters = getPublicParameters(transactionType); + //设置请求参数的集合 parameters.put(BIZ_CONTENT, getContentToJson((String) tradeNoOrBillDate, outTradeNoBillType)); //设置签名 setSign(parameters); + return requestTemplate.getForObject(getReqUrl() + "?" + UriVariables.getMapToParameters(parameters), JSONObject.class); } /** - * 转账 + * 新版转账转账 * * @param order 转账订单 * @return 对应的转账结果 */ @Override public Map transfer(TransferOrder order) { + final TransferType transferType = order.getTransferType(); //获取公共参数 - Map parameters = getPublicParameters(AliTransactionType.TRANS); + Map parameters = getPublicParameters(transferType); + setAppAuthToken(parameters, order.getAttrs()); - Map bizContent = new TreeMap(); + Map bizContent = new LinkedHashMap(); bizContent.put("out_biz_no", order.getOutNo()); - //默认 支付宝登录号,支持邮箱和手机号格式。 - bizContent.put("payee_type", "ALIPAY_LOGONID"); - if (null != order.getTransferType()) { - bizContent.put("payee_type", order.getTransferType().getType()); - } - bizContent.put("payee_account", order.getPayeeAccount()); - bizContent.put("amount", Util.conversionAmount(order.getAmount())); - bizContent.put("payer_show_name", order.getPayerName()); - bizContent.put("payee_real_name", order.getPayeeName()); + bizContent.put("trans_amount", order.getAmount()); + transferType.setAttr(bizContent, order); + setParameters(bizContent, "order_title", order); + setParameters(bizContent, "original_order_id", order); + setPayeeInfo(bizContent, order); bizContent.put("remark", order.getRemark()); + setParameters(bizContent, "business_params", order); + //设置请求参数的集合 parameters.put(BIZ_CONTENT, JSON.toJSONString(bizContent)); //设置签名 @@ -544,6 +568,24 @@ public class AliPayService extends BasePayService { return getHttpRequestTemplate().postForObject(getReqUrl() + "?" + UriVariables.getMapToParameters(parameters), null, JSONObject.class); } + private Map setPayeeInfo(Map bizContent, Order order){ + final Object attr = order.getAttr(PAYEE_INFO); + + if (attr instanceof String){ + bizContent.put(PAYEE_INFO, attr); + } + if (attr instanceof TreeMap){ + bizContent.put(PAYEE_INFO, attr); + } + if (attr instanceof Map){ + Map payeeInfo = new TreeMap((Map)attr); + bizContent.put(PAYEE_INFO, payeeInfo); + } + return bizContent; + } + + + /** * 转账查询 * @@ -554,7 +596,7 @@ public class AliPayService extends BasePayService { @Override public Map transferQuery(String outNo, String tradeNo) { //获取公共参数 - Map parameters = getPublicParameters(AliTransactionType.TRANS_QUERY); + Map parameters = getPublicParameters(AliTransferType.TRANS_QUERY); Map bizContent = new TreeMap(); if (StringUtils.isEmpty(outNo)) { diff --git a/pay-java-ali/src/main/java/com/egzosn/pay/ali/bean/AliTransferOrder.java b/pay-java-ali/src/main/java/com/egzosn/pay/ali/bean/AliTransferOrder.java index 1882f84..7a2b5f2 100644 --- a/pay-java-ali/src/main/java/com/egzosn/pay/ali/bean/AliTransferOrder.java +++ b/pay-java-ali/src/main/java/com/egzosn/pay/ali/bean/AliTransferOrder.java @@ -1,9 +1,13 @@ package com.egzosn.pay.ali.bean; +import com.alibaba.fastjson.JSONObject; import com.egzosn.pay.common.bean.TransferOrder; +import java.math.BigDecimal; + /** * 支付转账(红包)订单 + * * @author egan * date 2020/5/18 21:08 * email egzosn@gmail.com @@ -13,46 +17,137 @@ public class AliTransferOrder extends TransferOrder { private String orderTitle; private String identity; private String identityType; - private String name; private String businessParams; + /** + * 商户端的唯一订单号,对于同一笔转账请求,商户需保证该订单号唯一。 + * + * @return 商户端的唯一订单号 + */ + public String getOutBizNo() { + return getOutNo(); + } + + public void setOutBizNo(String outBizNo) { + setOutNo(outBizNo); + } + + /** + * 订单总金额,单位为元,精确到小数点后两位,STD_RED_PACKET产品取值范围[0.01,100000000]; + * TRANS_ACCOUNT_NO_PWD产品取值范围[0.1,100000000] + * + * @return 订单总金额 + */ + public BigDecimal getTransAmount() { + return getAmount(); + } + + public void setTransAmount(BigDecimal transAmount) { + setAmount(transAmount); + } + + /** + * 转账业务的标题,用于在支付宝用户的账单里显示 + * + * @return 转账业务的标题 + */ public String getOrderTitle() { - return orderTitle; + return (String) getAttr("order_title"); } public void setOrderTitle(String orderTitle) { - this.orderTitle = orderTitle; + addAttr("order_title", orderTitle); } + /** + * 描述特定的业务场景,可传的参数如下: + * DIRECT_TRANSFER:单笔无密转账到支付宝/银行卡, B2C现金红包; + * PERSONAL_COLLECTION:C2C现金红包-领红包 + * + * @return 描述特定的业务场景 + */ + public String getBizScene() { + return (String) getAttr("biz_scene"); + } + + public void setBizScene(String bizScene) { + addAttr("biz_scene", bizScene); + } + + /** + * 收款方信息 + * + * @return 收款方信息 + */ + public JSONObject getPayeeinfo() { + JSONObject payeeInfo = (JSONObject) getAttr("payee_info"); + if (null == payeeInfo) { + payeeInfo = new JSONObject(); + addAttr("payee_info", payeeInfo); + } + return payeeInfo; + } + + /** + * 参与方的唯一标识 + * + * @return 参与方的唯一标识 + */ public String getIdentity() { return identity; } public void setIdentity(String identity) { this.identity = identity; + getPayeeinfo().put("identity", identity); } + /** + * 参与方的标识类型,目前支持如下类型: + * 1、ALIPAY_USER_ID 支付宝的会员ID + * 2、ALIPAY_LOGON_ID:支付宝登录号,支持邮箱和手机号格式 + * + * @return + */ public String getIdentityType() { return identityType; } public void setIdentityType(String identityType) { this.identityType = identityType; + getPayeeinfo().put("identity_type", identityType); } + + /** + * 参与方真实姓名 + * + * @return 参与方真实姓名 + */ public String getName() { - return name; + return getPayeeName(); } public void setName(String name) { - this.name = name; + setPayeeName(name); + getPayeeinfo().put("name", name); } + /** + * 转账业务请求的扩展参数,支持传入的扩展参数如下: + * 1、sub_biz_scene 子业务场景,红包业务必传,取值REDPACKET,C2C现金红包、B2C现金红包均需传入; + *

+ * 2、withdraw_timeliness为转账到银行卡的预期到账时间,可选(不传入则默认为T1),取值T0表示预期T+0到账,取值T1表示预期T+1到账,因到账时效受银行机构处理影响,支付宝无法保证一定是T0或者T1到账; + * + * @return 转账业务请求的扩展参数 + */ public String getBusinessParams() { - return businessParams; + return (String) getAttr("business_params"); } public void setBusinessParams(String businessParams) { - this.businessParams = businessParams; + addAttr("business_params", businessParams); } + + } diff --git a/pay-java-ali/src/main/java/com/egzosn/pay/ali/bean/AliTransferType.java b/pay-java-ali/src/main/java/com/egzosn/pay/ali/bean/AliTransferType.java index 0d8459f..df10e73 100644 --- a/pay-java-ali/src/main/java/com/egzosn/pay/ali/bean/AliTransferType.java +++ b/pay-java-ali/src/main/java/com/egzosn/pay/ali/bean/AliTransferType.java @@ -1,15 +1,16 @@ package com.egzosn.pay.ali.bean; +import com.egzosn.pay.common.bean.TransferOrder; import com.egzosn.pay.common.bean.TransferType; -import java.util.HashMap; import java.util.Map; /** - * 收款方账户类型 + * 收款方账户类型 + * * @author egan - * email egzosn@gmail.com - * date 2018/9/28.20:32 + * email egzosn@gmail.com + * date 2018/9/28.20:32 */ public enum AliTransferType implements TransferType { /** @@ -27,8 +28,7 @@ public enum AliTransferType implements TransferType { /** * 现金红包无线支付接口 */ - STD_RED_PACKET_APP("alipay.fund.trans.app.pay", "PERSONAL_PAY"){ - + STD_RED_PACKET_APP("alipay.fund.trans.app.pay", "PERSONAL_PAY") { /** * 获取转账类型 * @@ -43,9 +43,7 @@ public enum AliTransferType implements TransferType { /** * 转账查询 */ - TRANS_QUERY("alipay.fund.trans.order.query") - - ; + TRANS_QUERY("alipay.fund.trans.order.query"); /** * 接口名称 */ @@ -90,10 +88,13 @@ public enum AliTransferType implements TransferType { /** * 设置属性 + * * @param attr 已有属性对象 + * @param order 转账订单 * @return 属性对象 */ - public Map setAttr(Map attr){ + @Override + public Map setAttr(Map attr, TransferOrder order) { attr.put("product_code", getType()); attr.put("biz_scene", getBizScene()); return attr; diff --git a/pay-java-ali/src/main/java/com/egzosn/pay/ali/bean/IdentityType.java b/pay-java-ali/src/main/java/com/egzosn/pay/ali/bean/IdentityType.java deleted file mode 100644 index 955c8a4..0000000 --- a/pay-java-ali/src/main/java/com/egzosn/pay/ali/bean/IdentityType.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.egzosn.pay.ali.bean; - -/** - * 参与方的标识类型 - * @author egan - * date 2020/5/19 21:45 - * email egzosn@gmail.com - */ -public enum IdentityType { - /** - * 支付宝的会员ID - */ - ALIPAY_USER_ID, - /** - * 支付宝登录号,支持邮箱和手机号格式 - */ - ALIPAY_LOGON_ID - -} diff --git a/pay-java-ali/src/main/java/com/egzosn/pay/ali/bean/OrderSettle.java b/pay-java-ali/src/main/java/com/egzosn/pay/ali/bean/OrderSettle.java index f4227b9..e111bc1 100644 --- a/pay-java-ali/src/main/java/com/egzosn/pay/ali/bean/OrderSettle.java +++ b/pay-java-ali/src/main/java/com/egzosn/pay/ali/bean/OrderSettle.java @@ -1,9 +1,11 @@ package com.egzosn.pay.ali.bean; +import com.egzosn.pay.common.bean.Order; import com.egzosn.pay.common.util.Util; import com.egzosn.pay.common.util.str.StringUtils; import java.math.BigDecimal; +import java.util.HashMap; import java.util.Map; import java.util.TreeMap; @@ -13,7 +15,7 @@ import java.util.TreeMap; * email egzosn@gmail.com * date 2019/4/28.20:29 */ -public class OrderSettle { +public class OrderSettle implements Order { /** * 结算请求流水号 开发者自行生成并保证唯一性 @@ -52,6 +54,11 @@ public class OrderSettle { */ private String operatorId; + /** + * 订单附加信息,可用于预设未提供的参数,这里会覆盖以上所有的订单信息, + */ + private Map attr; + public String getOutRequestNo() { return outRequestNo; } @@ -158,6 +165,28 @@ public class OrderSettle { return bizContent; } + @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 值 + */ + @Override + public void addAttr(String key, Object value) { + getAttrs().put(key, value); + } } From 00a44a8c29971ddc377ec410e4e416c35b177063 Mon Sep 17 00:00:00 2001 From: egan Date: Tue, 26 May 2020 11:06:11 +0800 Subject: [PATCH 32/37] update README.md. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c5d602a..2675b6f 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -全能第三方支付对接Java开发工具包.优雅的轻量级支付模块集成支付对接支付整合(微信,支付宝,银联,友店,富友,跨境支付paypal,payoneer(P卡派安盈)易极付)app,扫码,网页支付刷卡付条码付刷脸付转账服务商模式、支持多种支付类型多支付账户,支付与业务完全剥离,简单几行代码即可实现支付,简单快速完成支付模块的开发,可轻松嵌入到任何系统里 目前仅是一个开发工具包(即SDK),只提供简单Web实现,建议使用maven或gradle引用本项目即可使用本SDK提供的各种支付相关的功能 +全能第三方支付对接Java开发工具包.优雅的轻量级支付模块集成支付对接支付整合(微信,支付宝,银联,友店,富友,跨境支付paypal,payoneer(P卡派安盈)易极付)app,扫码,网页支付刷卡付条码付刷脸付转账红包服务商模式、支持多种支付类型多支付账户,支付与业务完全剥离,简单几行代码即可实现支付,简单快速完成支付模块的开发,可轻松嵌入到任何系统里 目前仅是一个开发工具包(即SDK),只提供简单Web实现,建议使用maven或gradle引用本项目即可使用本SDK提供的各种支付相关的功能 ### 特性 From 550099ea2911ed8a14b6e8ace0b551e4062b0562 Mon Sep 17 00:00:00 2001 From: egzosn <930928.lI1> Date: Mon, 25 May 2020 00:01:31 +0800 Subject: [PATCH 33/37] =?UTF-8?q?=E6=94=AF=E4=BB=98=E5=AE=9D=E8=BD=AC?= =?UTF-8?q?=E8=B4=A6=EF=BC=88=E7=BA=A2=E5=8C=85=EF=BC=89=E8=AE=A2=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../egzosn/pay/ali/bean/AliTransferOrder.java | 22 ++++++++++--------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/pay-java-ali/src/main/java/com/egzosn/pay/ali/bean/AliTransferOrder.java b/pay-java-ali/src/main/java/com/egzosn/pay/ali/bean/AliTransferOrder.java index 7a2b5f2..3b55b7b 100644 --- a/pay-java-ali/src/main/java/com/egzosn/pay/ali/bean/AliTransferOrder.java +++ b/pay-java-ali/src/main/java/com/egzosn/pay/ali/bean/AliTransferOrder.java @@ -1,9 +1,9 @@ package com.egzosn.pay.ali.bean; -import com.alibaba.fastjson.JSONObject; import com.egzosn.pay.common.bean.TransferOrder; import java.math.BigDecimal; +import java.util.TreeMap; /** * 支付转账(红包)订单 @@ -14,10 +14,8 @@ import java.math.BigDecimal; */ public class AliTransferOrder extends TransferOrder { - private String orderTitle; private String identity; private String identityType; - private String businessParams; /** * 商户端的唯一订单号,对于同一笔转账请求,商户需保证该订单号唯一。 @@ -79,13 +77,17 @@ public class AliTransferOrder extends TransferOrder { * * @return 收款方信息 */ - public JSONObject getPayeeinfo() { - JSONObject payeeInfo = (JSONObject) getAttr("payee_info"); - if (null == payeeInfo) { - payeeInfo = new JSONObject(); - addAttr("payee_info", payeeInfo); + private TreeMap getPayeeinfo() { + Object payeeInfo = getAttr("payee_info"); + if (null == payeeInfo ){ + TreeMap payee = new TreeMap<>(); + addAttr("payee_info", payee); + return payee; + }else if (payeeInfo instanceof TreeMap){ + return (TreeMap) payeeInfo; } - return payeeInfo; + return null; + } /** @@ -107,7 +109,7 @@ public class AliTransferOrder extends TransferOrder { * 1、ALIPAY_USER_ID 支付宝的会员ID * 2、ALIPAY_LOGON_ID:支付宝登录号,支持邮箱和手机号格式 * - * @return + * @return 参与方的标识类型 */ public String getIdentityType() { return identityType; From 674e2b81f0c495496cb70b71c6770819439e3342 Mon Sep 17 00:00:00 2001 From: egzosn <930928.lI1> Date: Mon, 25 May 2020 00:02:27 +0800 Subject: [PATCH 34/37] =?UTF-8?q?=E7=A7=BB=E9=99=A4=E8=BF=87=E6=97=B6?= =?UTF-8?q?=E7=9A=84=E9=80=80=E6=AC=BE=E6=96=B9=E6=B3=95=20app=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E6=A1=88=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/egzosn/pay/demo/controller/PayController.java | 4 ++-- .../com/egzosn/pay/demo/controller/UnionPayController.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pay-java-demo/src/main/java/com/egzosn/pay/demo/controller/PayController.java b/pay-java-demo/src/main/java/com/egzosn/pay/demo/controller/PayController.java index c407a58..c7adb42 100644 --- a/pay-java-demo/src/main/java/com/egzosn/pay/demo/controller/PayController.java +++ b/pay-java-demo/src/main/java/com/egzosn/pay/demo/controller/PayController.java @@ -167,14 +167,14 @@ public class PayController { * @param price 金额 * @return 支付预订单信息 */ - @RequestMapping("getOrderInfo") + @RequestMapping("app") public Map getOrderInfo(Integer payId, String transactionType, BigDecimal price) { //获取对应的支付账户操作工具(可根据账户id) PayResponse payResponse = service.getPayResponse(payId); Map data = new HashMap<>(); data.put("code", 0); PayOrder order = new PayOrder("订单title", "摘要", null == price ? new BigDecimal(0.01) : price, UUID.randomUUID().toString().replace("-", ""), PayType.valueOf(payResponse.getStorage().getPayType()).getTransactionType(transactionType)); - data.put("orderInfo", payResponse.getService().orderInfo(order)); + data.put("orderInfo", payResponse.getService().app(order)); return data; } diff --git a/pay-java-demo/src/main/java/com/egzosn/pay/demo/controller/UnionPayController.java b/pay-java-demo/src/main/java/com/egzosn/pay/demo/controller/UnionPayController.java index b7b4b61..8bda76f 100644 --- a/pay-java-demo/src/main/java/com/egzosn/pay/demo/controller/UnionPayController.java +++ b/pay-java-demo/src/main/java/com/egzosn/pay/demo/controller/UnionPayController.java @@ -139,7 +139,7 @@ public class UnionPayController { //APPLE支付 苹果付 // order.setTransactionType(UnionTransactionType.APPLE); - data.put("orderInfo", service.orderInfo(order)); + data.put("orderInfo", service.app(order)); return data; } From eecc98910ca8e9be893e2b3627647b7f82c65f46 Mon Sep 17 00:00:00 2001 From: egzosn <930928.lI1> Date: Mon, 25 May 2020 00:02:56 +0800 Subject: [PATCH 35/37] =?UTF-8?q?=E8=BD=AC=E8=B4=A6=EF=BC=88=E7=BA=A2?= =?UTF-8?q?=E5=8C=85=EF=BC=89=E6=8E=A5=E5=85=A5=E6=A1=88=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pay/demo/controller/AliPayController.java | 36 +++++++------------ .../pay/demo/controller/WxPayController.java | 12 ------- 2 files changed, 13 insertions(+), 35 deletions(-) diff --git a/pay-java-demo/src/main/java/com/egzosn/pay/demo/controller/AliPayController.java b/pay-java-demo/src/main/java/com/egzosn/pay/demo/controller/AliPayController.java index 93a50af..7ee3fbf 100644 --- a/pay-java-demo/src/main/java/com/egzosn/pay/demo/controller/AliPayController.java +++ b/pay-java-demo/src/main/java/com/egzosn/pay/demo/controller/AliPayController.java @@ -5,12 +5,11 @@ package com.egzosn.pay.demo.controller; import com.egzosn.pay.ali.api.AliPayConfigStorage; import com.egzosn.pay.ali.api.AliPayService; import com.egzosn.pay.ali.bean.AliTransactionType; +import com.egzosn.pay.ali.bean.AliTransferOrder; import com.egzosn.pay.ali.bean.AliTransferType; import com.egzosn.pay.ali.bean.OrderSettle; import com.egzosn.pay.common.bean.PayOrder; 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.http.HttpConfigStorage; import com.egzosn.pay.common.http.UriVariables; import com.egzosn.pay.common.util.sign.SignUtils; @@ -307,18 +306,6 @@ public class AliPayController { } - /** - * 通用查询接口,根据 AliTransactionType 类型进行实现,此接口不包括退款 - * - * @param order 订单的请求体 - * @return 返回支付方对应接口的结果 - */ - @RequestMapping("secondaryInterface") - public Map secondaryInterface(QueryOrder order) { - TransactionType type = AliTransactionType.valueOf(order.getTransactionType()); - return service.secondaryInterface(order.getTradeNoOrBillDate(), order.getOutTradeNoBillType(), type); - } - /** * 转账 * @@ -327,15 +314,18 @@ public class AliPayController { * @return 对应的转账结果 */ @RequestMapping("transfer") - public Map transfer(TransferOrder order) { -// order.setOutNo("转账单号"); -// order.setPayeeAccount("收款方账户,支付宝登录号,支持邮箱和手机号格式"); -// order.setAmount(new BigDecimal(10)); -// order.setPayerName("付款方姓名, 非必填"); -// order.setPayeeName("收款方真实姓名, 非必填"); -// order.setRemark("转账备注, 非必填"); - //收款方账户类型 ,默认值 ALIPAY_LOGONID:支付宝登录号,支持邮箱和手机号格式。 - order.setTransferType(AliTransferType.ALIPAY_LOGONID); + public Map transfer(AliTransferOrder order) { + order.setOutBizNo("转账单号"); + order.setTransAmount(new BigDecimal(10)); + order.setOrderTitle("转账业务的标题"); + order.setIdentity("参与方的唯一标识"); + order.setIdentityType("参与方的标识类型,目前支持如下类型:"); + order.setName("参与方真实姓名"); + order.setRemark("转账备注, 非必填"); + //单笔无密转账到支付宝账户 + order.setTransferType(AliTransferType.TRANS_ACCOUNT_NO_PWD); + //单笔无密转账到银行卡 +// order.setTransferType(AliTransferType.TRANS_BANKCARD_NO_PWD); return service.transfer(order); } diff --git a/pay-java-demo/src/main/java/com/egzosn/pay/demo/controller/WxPayController.java b/pay-java-demo/src/main/java/com/egzosn/pay/demo/controller/WxPayController.java index 0728800..096f609 100644 --- a/pay-java-demo/src/main/java/com/egzosn/pay/demo/controller/WxPayController.java +++ b/pay-java-demo/src/main/java/com/egzosn/pay/demo/controller/WxPayController.java @@ -339,18 +339,6 @@ public class WxPayController { } - /** - * 通用查询接口,根据 WxTransactionType 类型进行实现,此接口不包括退款 - * - * @param order 订单的请求体 - * @return 返回支付方对应接口的结果 - */ - @RequestMapping("secondaryInterface") - public Map secondaryInterface(QueryOrder order) { - TransactionType type = WxTransactionType.valueOf(order.getTransactionType()); - return service.secondaryInterface(order.getTradeNoOrBillDate(), order.getOutTradeNoBillType(), type); - } - /** From c71add18c6137bc527cf39cffe59f2c01b24b2f3 Mon Sep 17 00:00:00 2001 From: egzosn <930928.lI1> Date: Mon, 25 May 2020 00:06:21 +0800 Subject: [PATCH 36/37] =?UTF-8?q?=E6=94=AF=E4=BB=98=E5=AE=9D=E8=BD=AC?= =?UTF-8?q?=E8=B4=A6=EF=BC=88=E7=BA=A2=E5=8C=85=EF=BC=89=E8=AE=A2=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/egzosn/pay/ali/bean/AliTransferOrder.java | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/pay-java-ali/src/main/java/com/egzosn/pay/ali/bean/AliTransferOrder.java b/pay-java-ali/src/main/java/com/egzosn/pay/ali/bean/AliTransferOrder.java index 3b55b7b..31c26e3 100644 --- a/pay-java-ali/src/main/java/com/egzosn/pay/ali/bean/AliTransferOrder.java +++ b/pay-java-ali/src/main/java/com/egzosn/pay/ali/bean/AliTransferOrder.java @@ -79,14 +79,12 @@ public class AliTransferOrder extends TransferOrder { */ private TreeMap getPayeeinfo() { Object payeeInfo = getAttr("payee_info"); - if (null == payeeInfo ){ - TreeMap payee = new TreeMap<>(); - addAttr("payee_info", payee); - return payee; - }else if (payeeInfo instanceof TreeMap){ + if (null != payeeInfo && payeeInfo instanceof TreeMap){ return (TreeMap) payeeInfo; } - return null; + TreeMap payee = new TreeMap<>(); + addAttr("payee_info", payee); + return payee; } From b0d6141152dc0537f01de39c909964ea4675448a Mon Sep 17 00:00:00 2001 From: egzosn <930928.lI1> Date: Wed, 27 May 2020 09:54:27 +0800 Subject: [PATCH 37/37] =?UTF-8?q?=E5=BE=AE=E4=BF=A1=E7=BA=A2=E5=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/egzosn/pay/wx/bean/WxSendredpackType.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/pay-java-wx/src/main/java/com/egzosn/pay/wx/bean/WxSendredpackType.java b/pay-java-wx/src/main/java/com/egzosn/pay/wx/bean/WxSendredpackType.java index 623b667..248e6f4 100644 --- a/pay-java-wx/src/main/java/com/egzosn/pay/wx/bean/WxSendredpackType.java +++ b/pay-java-wx/src/main/java/com/egzosn/pay/wx/bean/WxSendredpackType.java @@ -1,10 +1,13 @@ package com.egzosn.pay.wx.bean; +import com.egzosn.pay.common.bean.TransferOrder; import com.egzosn.pay.common.bean.TransferType; +import java.util.Map; + /** * @description: 红包交易类型 - * @author: faymanwang + * @author faymanwang * @time: 2020/5/14 20:11 */ public enum WxSendredpackType implements TransferType { @@ -40,4 +43,9 @@ public enum WxSendredpackType implements TransferType { public String getMethod() { return this.method; } + + @Override + public Map setAttr(Map attr, TransferOrder order) { + return attr; + } }