From 340989ac2f9de1775ccf906b9964fd396b153a54 Mon Sep 17 00:00:00 2001 From: hocgin Date: Sun, 17 Nov 2019 23:27:12 +0800 Subject: [PATCH 1/6] =?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 2/6] =?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 3/6] =?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 4/6] =?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 5/6] =?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 6/6] =?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; - } - -}