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 cd81c74..1e94971 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 @@ -46,6 +46,7 @@ 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.SignTextUtils; import com.egzosn.pay.common.util.sign.SignUtils; import com.egzosn.pay.common.util.str.StringUtils; @@ -94,7 +95,6 @@ public class AliPayService extends BasePayService { public AliPayService(AliPayConfigStorage payConfigStorage, HttpConfigStorage configStorage) { super(payConfigStorage, configStorage); - payConfigStorage.loadCertEnvironment(); } public AliPayService(AliPayConfigStorage payConfigStorage) { @@ -187,7 +187,7 @@ public class AliPayService extends BasePayService { */ protected Map setSign(Map parameters) { parameters.put("sign_type", payConfigStorage.getSignType()); - String sign = createSign(SignUtils.parameterText(parameters, "&", SIGN), payConfigStorage.getInputCharset()); + String sign = createSign(SignTextUtils.parameterText(parameters, "&", SIGN), payConfigStorage.getInputCharset()); parameters.put(SIGN, sign); return parameters; @@ -566,9 +566,7 @@ public class AliPayService extends BasePayService { * @param billType 账单类型,商户通过接口或商户经开放平台授权后其所属服务商通过接口可以获取以下账单类型:trade、signcustomer;trade指商户基于支付宝交易收单的业务账单;signcustomer是指基于商户支付宝余额收入及支出等资金变动的帐务账单; * @return 返回支付方下载对账单的结果 */ - @Deprecated - @Override - public Map downloadbill(Date billDate, String billType) { + public Map downloadBill(Date billDate, String billType) { return this.downloadBill(billDate, "trade".equals(billType) ? AliPayBillType.TRADE_DAY : AliPayBillType.SIGNCUSTOMER_DAY); } @@ -614,7 +612,7 @@ public class AliPayService extends BasePayService { if (transactionType == AliTransactionType.DOWNLOADBILL) { if (tradeNoOrBillDate instanceof Date) { - return downloadbill((Date) tradeNoOrBillDate, outTradeNoBillType); + return downloadBill((Date) tradeNoOrBillDate, outTradeNoBillType); } throw new PayErrorException(new PayException("failure", "非法类型异常:" + tradeNoOrBillDate.getClass())); } @@ -627,7 +625,7 @@ public class AliPayService extends BasePayService { //设置签名 setSign(parameters); - return requestTemplate.getForObject(getReqUrl() + "?" + UriVariables.getMapToParameters(parameters), JSONObject.class); + return requestTemplate.getForObject(getReqUrl(transactionType) + "?" + UriVariables.getMapToParameters(parameters), JSONObject.class); } /** 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 3845a11..7d0fcde 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 @@ -3,11 +3,17 @@ package com.egzosn.pay.baidu.api; import java.io.UnsupportedEncodingException; import java.math.BigDecimal; import java.net.URLEncoder; -import java.security.*; +import java.security.KeyFactory; +import java.security.NoSuchAlgorithmException; +import java.security.PublicKey; +import java.security.Signature; import java.security.spec.InvalidKeySpecException; import java.security.spec.X509EncodedKeySpec; -import java.util.*; -import com.egzosn.pay.common.util.sign.encrypt.Base64; +import java.util.Comparator; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; +import java.util.TreeMap; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; @@ -30,7 +36,9 @@ 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.SignTextUtils; import com.egzosn.pay.common.util.sign.SignUtils; +import com.egzosn.pay.common.util.sign.encrypt.Base64; import com.egzosn.pay.common.util.str.StringUtils; @@ -85,7 +93,8 @@ public class BaiduPayService extends BasePayService { try { boolean checkSign = this.checkReturnSign(params, payConfigStorage.getKeyPublic(), (String) params.get(RSA_SIGN)); return checkSign; - } catch (Exception e) { + } + catch (Exception e) { LOG.info("验签失败", e); } return false; @@ -100,7 +109,8 @@ public class BaiduPayService extends BasePayService { boolean verify = signature.verify(Base64.decode(rsaSign)); LOG.info("使用公钥进行验签: " + verify); return verify; - } catch (Exception e) { + } + catch (Exception e) { LOG.info("使用公钥进行验签出错, 返回false", e); } return false; @@ -111,9 +121,7 @@ public class BaiduPayService extends BasePayService { * 将公钥字符串进行Base64 decode之后,生成X509标准公钥 * * @param publicKey 公钥原始字符串 - * * @return X509标准公钥 - * * @throws InvalidKeySpecException * @throws NoSuchAlgorithmException */ @@ -131,9 +139,7 @@ public class BaiduPayService extends BasePayService { * 对输入参数进行key过滤排序和字符串拼接 * * @param params 待签名参数集合 - * * @return 待签名内容 - * * @throws UnsupportedEncodingException */ private String signContent(Map params) throws UnsupportedEncodingException { @@ -172,7 +178,6 @@ public class BaiduPayService extends BasePayService { * 非空、且非签名字段 * * @param key 待签名参数key值 - * * @return true | false */ private static boolean legalKey(String key) { @@ -520,9 +525,7 @@ public class BaiduPayService extends BasePayService { * @param accessToken 用户token * @return 对账单 */ - @Deprecated - @Override - public Map downloadbill(Date billDate, String accessToken) { + public Map downloadBill(Date billDate, String accessToken) { return downloadBill(billDate, new BaiduBillType(accessToken, BaiduTransactionType.DOWNLOAD_ORDER_BILL.name())); } @@ -609,7 +612,7 @@ public class BaiduPayService extends BasePayService { LOG.info("百度支付签名参数:" + JSON.toJSONString(result)); - String waitSignVal = SignUtils.parameterText(result, "&", false, ignoreKeys); + String waitSignVal = SignTextUtils.parameterText(result, "&", false, ignoreKeys); return SignUtils.RSA.createSign(waitSignVal, payConfigStorage.getKeyPrivate(), payConfigStorage.getInputCharset()); } } diff --git a/pay-java-baidu/src/main/java/com/egzosn/pay/baidu/package-info.java b/pay-java-baidu/src/main/java/com/egzosn/pay/baidu/package-info.java deleted file mode 100644 index e9370e2..0000000 --- a/pay-java-baidu/src/main/java/com/egzosn/pay/baidu/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package com.egzosn.pay.baidu; \ No newline at end of file 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 4e0a2aa..187cbed 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 @@ -11,11 +11,11 @@ import java.util.List; import java.util.Map; import java.util.TreeMap; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.alibaba.fastjson.JSON; +import com.egzosn.pay.common.bean.BillType; import com.egzosn.pay.common.bean.MethodType; import com.egzosn.pay.common.bean.Order; import com.egzosn.pay.common.bean.PayMessage; @@ -252,7 +252,7 @@ public abstract class BasePayService implements Pay */ @Override public T cancel(String tradeNo, String outTradeNo, Callback callback) { - return callback.perform(close(tradeNo, outTradeNo)); + return callback.perform(cancel(tradeNo, outTradeNo)); } /** @@ -264,7 +264,7 @@ public abstract class BasePayService implements Pay */ @Override public Map cancel(String tradeNo, String outTradeNo) { - return Collections.EMPTY_MAP; + return Collections.emptyMap(); } @@ -297,19 +297,16 @@ public abstract class BasePayService implements Pay } /** - * 目前只支持日账单 + * 下载对账单 * - * @param billDate 账单时间:具体请查看对应支付平台 - * @param billType 账单类型,具体请查看对应支付平台 - * @param callback 处理器 - * @param 返回类型 + * @param billDate 账单时间:日账单格式为yyyy-MM-dd,月账单格式为yyyy-MM。 + * @param billType 账单类型 内部自动转化 {@link BillType} * @return 返回支付方下载对账单的结果 */ @Override - public T downloadbill(Date billDate, String billType, Callback callback) { - return callback.perform(downloadbill(billDate, billType)); + public Map downloadBill(Date billDate, String billType){ + return Collections.emptyMap(); } - /** * 转账 * 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 fa8df25..bf5256f 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 @@ -276,11 +276,10 @@ public interface PayService { * 下载对账单 * * @param billDate 账单时间:日账单格式为yyyy-MM-dd,月账单格式为yyyy-MM。 - * @param billType 账单类型 + * @param billType 账单类型 内部自动转化 {@link BillType} * @return 返回支付方下载对账单的结果 */ - @Deprecated - Map downloadbill(Date billDate, String billType); + Map downloadBill(Date billDate, String billType); /** * 下载对账单 @@ -291,16 +290,6 @@ public interface PayService { */ Map downloadBill(Date billDate, BillType billType); - /** - * 下载对账单 - * - * @param billDate 账单时间:具体请查看对应支付平台 - * @param billType 账单类型,具体请查看对应支付平台 - * @param callback 处理器 - * @param 返回类型 - * @return 返回支付方下载对账单的结果 - */ - T downloadbill(Date billDate, String billType, Callback callback); /** diff --git a/pay-java-common/src/main/java/com/egzosn/pay/common/exception/PayErrorException.java b/pay-java-common/src/main/java/com/egzosn/pay/common/exception/PayErrorException.java index 3b077b4..6362978 100644 --- a/pay-java-common/src/main/java/com/egzosn/pay/common/exception/PayErrorException.java +++ b/pay-java-common/src/main/java/com/egzosn/pay/common/exception/PayErrorException.java @@ -18,6 +18,11 @@ public class PayErrorException extends RuntimeException { this.error = error; } + public PayErrorException(PayError error, Throwable throwable) { + super(error.getString(), throwable); + this.error = error; + } + public PayError getPayError() { return error; 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 0789efb..d6aa4d0 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 @@ -460,11 +460,11 @@ public class PayController { * @param order 订单的请求体 * @return 返回支付方下载对账单的结果 */ - @RequestMapping("downloadbill") - public Object downloadbill(QueryOrder order) { + @RequestMapping("downloadBill") + public Object downloadBill(QueryOrder order) { PayResponse payResponse = service.getPayResponse(order.getPayId()); - return payResponse.getService().downloadbill(order.getBillDate(), order.getBillType()); + return payResponse.getService().downloadBill(order.getBillDate(), order.getBillType()); } 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 0b9493f..5cb3135 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 @@ -8,6 +8,7 @@ import com.egzosn.pay.common.bean.MethodType; 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.common.util.sign.SignTextUtils; import com.egzosn.pay.common.util.sign.SignUtils; import com.egzosn.pay.demo.request.QueryOrder; import com.egzosn.pay.union.api.UnionPayConfigStorage; @@ -130,7 +131,7 @@ public class UnionPayController { public Map app() { Map data = new HashMap<>(); data.put("code", 0); - PayOrder order = new PayOrder("订单title", "摘要", BigDecimal.valueOf(0.01), SignUtils.randomStr()); + PayOrder order = new PayOrder("订单title", "摘要", BigDecimal.valueOf(0.01), SignTextUtils.randomStr()); //App支付 order.setTransactionType(UnionTransactionType.APP); @@ -178,7 +179,7 @@ public class UnionPayController { public Map microPay(BigDecimal price, String authCode) { //获取对应的支付账户操作工具(可根据账户id) //条码付 - PayOrder order = new PayOrder("egan order", "egan order", null == price ? BigDecimal.valueOf(0.01) : price, SignUtils.randomStr(), UnionTransactionType.CONSUME); + PayOrder order = new PayOrder("egan order", "egan order", null == price ? BigDecimal.valueOf(0.01) : price, SignTextUtils.randomStr(), UnionTransactionType.CONSUME); //设置授权码,条码等 order.setAuthCode(authCode); //支付结果 @@ -275,9 +276,9 @@ public class UnionPayController { * @param order 订单的请求体 * @return 返回支付方下载对账单的结果 */ - @RequestMapping("downloadbill") - public Object downloadbill(QueryOrder order) { - return service.downloadbill(order.getBillDate(), order.getBillType()); + @RequestMapping("downloadBill") + public Object downloadBill(QueryOrder order) { + return service.downloadBill(order.getBillDate(), order.getBillType()); } diff --git a/pay-java-demo/src/main/java/com/egzosn/pay/demo/dao/ApyAccountRepository.java b/pay-java-demo/src/main/java/com/egzosn/pay/demo/dao/ApyAccountRepository.java index b659dd7..067a180 100644 --- a/pay-java-demo/src/main/java/com/egzosn/pay/demo/dao/ApyAccountRepository.java +++ b/pay-java-demo/src/main/java/com/egzosn/pay/demo/dao/ApyAccountRepository.java @@ -47,7 +47,7 @@ public class ApyAccountRepository { ApyAccount apyAccount2 = new ApyAccount(); apyAccount2.setPayId(2); apyAccount2.setPartner("1469188802"); - apyAccount2.setAppId("wx3344f4aed352deae"); + apyAccount2.setAppId("wx3344f4aed352de09"); // TODO 2017/2/9 16:20 author: egan sign_type只有单一key时public_key与private_key相等,比如sign_type=MD5的情况 apyAccount2.setPublicKey("991ded080***************f7fc61095"); apyAccount2.setPrivateKey("991ded080***************f7fc61095"); 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 8bae0c2..bb16674 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 @@ -22,6 +22,7 @@ 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.SignTextUtils; import com.egzosn.pay.common.util.sign.SignUtils; import com.egzosn.pay.common.util.str.StringUtils; import com.egzosn.pay.fuiou.bean.FuiouRefundResult; @@ -141,7 +142,7 @@ public class FuiouPayService extends BasePayService { */ public boolean signVerify(Map params, String responseSign) { - String sign = createSign(SignUtils.parameters2Md5Str(params, "|"), payConfigStorage.getInputCharset()); + String sign = createSign(SignTextUtils.parameters2Md5Str(params, "|"), payConfigStorage.getInputCharset()); return responseSign.equals(sign); } @@ -156,7 +157,7 @@ public class FuiouPayService extends BasePayService { LinkedHashMap params = new LinkedHashMap(3); params.put("mchnt_cd", payConfigStorage.getPid()); params.put("order_id", orderId); - params.put("md5", createSign(SignUtils.parameters2Md5Str(params, "|"), payConfigStorage.getInputCharset())); + params.put("md5", createSign(SignTextUtils.parameters2Md5Str(params, "|"), payConfigStorage.getInputCharset())); JSONObject resultJson = getHttpRequestTemplate().postForObject(getReqUrl() + URL_FuiouSmpAQueryGate + "?" + UriVariables.getMapToParameters(params), null, JSONObject.class); if (null == resultJson) { return false; @@ -178,7 +179,7 @@ public class FuiouPayService extends BasePayService { } Map parameters = getOrderInfo(order); - String sign = createSign(SignUtils.parameters2Md5Str(parameters, "|"), payConfigStorage.getInputCharset()); + String sign = createSign(SignTextUtils.parameters2Md5Str(parameters, "|"), payConfigStorage.getInputCharset()); parameters.put("md5", sign); return parameters; } @@ -381,7 +382,7 @@ public class FuiouPayService extends BasePayService { LinkedHashMap params = new LinkedHashMap<>(); params.put("mchnt_cd", payConfigStorage.getPid()); params.put("order_id", outTradeNo); - params.put("md5", createSign(SignUtils.parameters2Md5Str(params, "|"), payConfigStorage.getInputCharset())); + params.put("md5", createSign(SignTextUtils.parameters2Md5Str(params, "|"), payConfigStorage.getInputCharset())); JSONObject resultJson = getHttpRequestTemplate().postForObject(getReqUrl() + URL_FuiouSmpAQueryGate + "?" + UriVariables.getMapToParameters(params), null, JSONObject.class); return resultJson; } @@ -420,7 +421,7 @@ public class FuiouPayService extends BasePayService { //备注 params.put("rem", ""); params.putAll(refundOrder.getAttrs()); - params.put("md5", createSign(SignUtils.parameters2Md5Str(params, "|"), payConfigStorage.getInputCharset())); + params.put("md5", createSign(SignTextUtils.parameters2Md5Str(params, "|"), payConfigStorage.getInputCharset())); JSONObject resultJson = getHttpRequestTemplate().postForObject(getReqUrl() + URL_FuiouSmpRefundGate, params, JSONObject.class); return FuiouRefundResult.create(resultJson); } @@ -438,19 +439,6 @@ public class FuiouPayService extends BasePayService { } - /** - * 下载对账单 - * - * @param billDate 账单时间:日账单格式为yyyy-MM-dd,月账单格式为yyyy-MM。 - * @param billType 账单类型,商户通过接口或商户经开放平台授权后其所属服务商通过接口可以获取以下账单类型:trade、signcustomer;trade指商户基于支付宝交易收单的业务账单;signcustomer是指基于商户支付宝余额收入及支出等资金变动的帐务账单; - * @return 空 - */ - @Deprecated - @Override - public Map downloadbill(Date billDate, String billType) { - 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 e706314..5561b40 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 @@ -374,18 +374,7 @@ public class PayoneerPayService extends BasePayService im return Collections.emptyMap(); } - /** - * 下载对账单 - * - * @param billDate 账单时间:日账单格式为yyyy-MM-dd,月账单格式为yyyy-MM。 - * @param billType 账单类型,商户通过接口或商户经开放平台授权后其所属服务商通过接口可以获取以下账单类型:trade、signcustomer;trade指商户基于支付宝交易收单的业务账单;signcustomer是指基于商户支付宝余额收入及支出等资金变动的帐务账单; - * @return 返回支付方下载对账单的结果 - */ - @Deprecated - @Override - public Map downloadbill(Date billDate, String billType) { - 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 ae0e236..9da31e2 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 @@ -348,11 +348,6 @@ public class PayPalPayService extends BasePayService { return resp; } - @Deprecated - @Override - public Map downloadbill(Date billDate, String billType) { - return Collections.emptyMap(); - } @Override diff --git a/pay-java-paypal/src/main/java/com/egzosn/pay/paypal/v2/api/PayPalPayService.java b/pay-java-paypal/src/main/java/com/egzosn/pay/paypal/v2/api/PayPalPayService.java index 3fd521f..898b35c 100644 --- a/pay-java-paypal/src/main/java/com/egzosn/pay/paypal/v2/api/PayPalPayService.java +++ b/pay-java-paypal/src/main/java/com/egzosn/pay/paypal/v2/api/PayPalPayService.java @@ -439,7 +439,6 @@ public class PayPalPayService extends BasePayService implem * } * * - * */ @Override public Map getCapture(String captureId) { @@ -491,13 +490,6 @@ public class PayPalPayService extends BasePayService implem return resp; } - @Deprecated - @Override - public Map downloadbill(Date billDate, String billType) { - return Collections.emptyMap(); - } - - public Map downloadBill(Date billDate, BillType billType) { return Collections.emptyMap(); } 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 6fde8a7..1c10645 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 @@ -41,6 +41,7 @@ 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.CertDescriptor; +import com.egzosn.pay.common.util.sign.SignTextUtils; import com.egzosn.pay.common.util.sign.SignUtils; import com.egzosn.pay.common.util.sign.encrypt.RSA; import com.egzosn.pay.common.util.sign.encrypt.RSA2; @@ -80,7 +81,7 @@ public class UnionPayService extends BasePayService { /** * 证书解释器 */ - private CertDescriptor certDescriptor; + private volatile CertDescriptor certDescriptor; /** * 构造函数 @@ -103,12 +104,13 @@ public class UnionPayService extends BasePayService { */ @Override public UnionPayService setPayConfigStorage(UnionPayConfigStorage payConfigStorage) { - super.setPayConfigStorage(payConfigStorage); - if (!payConfigStorage.isCertSign() || null != certDescriptor) { + this.payConfigStorage = payConfigStorage; + if (!payConfigStorage.isCertSign()) { return this; } - - certDescriptor = new CertDescriptor(); + if (null == certDescriptor) { + certDescriptor = new CertDescriptor(); + } try { certDescriptor.initPrivateSignCert(payConfigStorage.getKeyPrivateCertInputStream(), payConfigStorage.getKeyPrivateCertPwd(), "PKCS12"); certDescriptor.initPublicCert(payConfigStorage.getAcpMiddleCertInputStream()); @@ -149,6 +151,7 @@ public class UnionPayService extends BasePayService { public String getBackTransUrl() { return String.format(BACK_TRANS_URL, getReqUrl()); } + public String getAppTransUrl() { return String.format(APP_TRANS_URL, getReqUrl()); } @@ -217,7 +220,7 @@ public class UnionPayService extends BasePayService { public boolean signVerify(Map params, String sign) { SignUtils signUtils = SignUtils.valueOf(payConfigStorage.getSignType()); - String data = SignUtils.parameterText(params, "&", "signature"); + String data = SignTextUtils.parameterText(params, "&", "signature"); switch (signUtils) { case RSA: data = SignUtils.SHA1.createSign(data, "", payConfigStorage.getInputCharset()); @@ -322,20 +325,20 @@ public class UnionPayService extends BasePayService { case RSA: parameters.put(SDKConstants.param_signMethod, SDKConstants.SIGNMETHOD_RSA); parameters.put(SDKConstants.param_certId, certDescriptor.getSignCertId()); - signStr = SignUtils.SHA1.createSign(SignUtils.parameterText(parameters, "&", "signature"), "", payConfigStorage.getInputCharset()); + signStr = SignUtils.SHA1.createSign(SignTextUtils.parameterText(parameters, "&", "signature"), "", payConfigStorage.getInputCharset()); parameters.put(SDKConstants.param_signature, RSA.sign(signStr, certDescriptor.getSignCertPrivateKey(payConfigStorage.getKeyPrivateCertPwd()), payConfigStorage.getInputCharset())); break; case RSA2: parameters.put(SDKConstants.param_signMethod, SDKConstants.SIGNMETHOD_RSA); parameters.put(SDKConstants.param_certId, certDescriptor.getSignCertId()); - signStr = SignUtils.SHA256.createSign(SignUtils.parameterText(parameters, "&", "signature"), "", payConfigStorage.getInputCharset()); + signStr = SignUtils.SHA256.createSign(SignTextUtils.parameterText(parameters, "&", "signature"), "", payConfigStorage.getInputCharset()); parameters.put(SDKConstants.param_signature, RSA2.sign(signStr, certDescriptor.getSignCertPrivateKey(payConfigStorage.getKeyPrivateCertPwd()), payConfigStorage.getInputCharset())); break; case SHA1: case SHA256: case SM3: String key = payConfigStorage.getKeyPrivate(); - signStr = SignUtils.parameterText(parameters, "&", "signature"); + signStr = SignTextUtils.parameterText(parameters, "&", "signature"); key = signUtils.createSign(key, "", payConfigStorage.getInputCharset()) + "&"; parameters.put(SDKConstants.param_signature, signUtils.createSign(signStr, key, payConfigStorage.getInputCharset())); break; @@ -401,7 +404,7 @@ public class UnionPayService extends BasePayService { * @return 返回支付结果 */ - public JSONObject postOrder(PayOrder order, String url) { + public JSONObject postOrder(PayOrder order, String url) { Map params = orderInfo(order); String responseStr = getHttpRequestTemplate().postForObject(url, params, String.class); JSONObject response = UriVariables.getParametersToMap(responseStr); @@ -666,10 +669,8 @@ public class UnionPayService extends BasePayService { * @param fileType 文件类型 文件类型,一般商户填写00即可 * @return 返回fileContent 请自行将数据落地 */ - @Deprecated - @Override - public Map downloadbill(Date billDate, String fileType) { - return downloadBill(billDate, new UnionPayBillType(fileType)); + public Map downloadBill(Date billDate, String fileType) { + return downloadBill(billDate, new UnionPayBillType(fileType)); } /** diff --git a/pay-java-union/src/test/java/PayTest.java b/pay-java-union/src/test/java/PayTest.java index 659ea4c..93bda12 100644 --- a/pay-java-union/src/test/java/PayTest.java +++ b/pay-java-union/src/test/java/PayTest.java @@ -98,7 +98,7 @@ public class PayTest { /*-----------文件传输类接口:后台获取对账文件交易,只有同步应答 ------------------------------*/ - Map fileConten = service.downloadbill(new Date(), "文件类型,一般商户填写00即可"); /*-----------退货交易:后台资金类交易,有同步应答和后台通知应答------------------------------*/ + Map fileConten = service.downloadBill(new Date(), "文件类型,一般商户填写00即可"); /*-----------退货交易:后台资金类交易,有同步应答和后台通知应答------------------------------*/ /*-----------回调处理-------------------*/ diff --git a/pay-java-wx-youdian/src/main/java/com/egzosn/pay/wx/youdian/api/WxYouDianPayService.java b/pay-java-wx-youdian/src/main/java/com/egzosn/pay/wx/youdian/api/WxYouDianPayService.java index 347e657..5139f48 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 @@ -26,6 +26,7 @@ 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.Util; +import com.egzosn.pay.common.util.sign.SignTextUtils; import com.egzosn.pay.common.util.sign.SignUtils; import com.egzosn.pay.common.util.str.StringUtils; import com.egzosn.pay.wx.youdian.bean.WxYoudianPayMessage; @@ -80,7 +81,7 @@ public class WxYouDianPayService extends BasePayService builder = new TreeMap<>(); builder.put("return_code", code.toUpperCase()); builder.put("return_msg", message); - builder.put("nonce_str", SignUtils.randomStr()); + builder.put("nonce_str", SignTextUtils.randomStr()); String sgin = SignUtils.valueOf(payConfigStorage.getSignType()).sign(builder, "&key=" + payConfigStorage.getKeyPrivate(), payConfigStorage.getInputCharset()); return PayOutMessage.TEXT().content("{\"return_code\":\"" + builder.get("return_code") + "\",\"return_msg\":\"" + builder.get("return_msg") + "\",\"nonce_str\":\"" + builder.get("nonce_str") + "\",\"sign\":\"" + sgin + "\"}").build(); } @@ -386,7 +387,7 @@ public class WxYouDianPayService extends BasePayService query(String tradeNo, String outTradeNo) { - String apbNonce = SignUtils.randomStr(); + String apbNonce = SignTextUtils.randomStr(); TreeMap data = new TreeMap<>(); data.put("access_token", payConfigStorage.getAccessToken()); @@ -396,8 +397,8 @@ public class WxYouDianPayService extends BasePayService data = new TreeMap<>(); data.put("access_token", payConfigStorage.getAccessToken()); @@ -430,8 +431,8 @@ public class WxYouDianPayService extends BasePayService downloadbill(Date billDate, String billType) { - return Collections.emptyMap(); - } - - @Override public Map downloadBill(Date billDate, BillType billType) { diff --git a/pay-java-wx/README.md b/pay-java-wx/README.md index 6012fe6..2689e11 100644 --- a/pay-java-wx/README.md +++ b/pay-java-wx/README.md @@ -217,7 +217,7 @@ #### 交易关闭接口 ```java - Map result = service..close("微信单号", "我方系统单号"); + Map result = service.close("微信单号", "我方系统单号"); ``` 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 fb4c039..2042622 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 @@ -58,6 +58,7 @@ 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.XML; +import com.egzosn.pay.common.util.sign.SignTextUtils; 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; @@ -171,7 +172,7 @@ public class WxPayService extends BasePayService implements if (isTest) { keyPrivate = getKeyPrivate(); } - String content = SignUtils.parameterText(params, "&", SIGN, "appId") + "&key=" + (signUtils == SignUtils.MD5 ? "" : keyPrivate); + String content = SignTextUtils.parameterText(params, "&", SIGN, "appId") + "&key=" + (signUtils == SignUtils.MD5 ? "" : keyPrivate); return signUtils.verify(content, sign, keyPrivate, payConfigStorage.getInputCharset()); } @@ -188,7 +189,7 @@ public class WxPayService extends BasePayService implements //判断如果是服务商模式信息则加入 setParameters(parameters, "sub_mch_id", payConfigStorage.getSubMchId()); setParameters(parameters, "sub_appid", payConfigStorage.getSubAppId()); - parameters.put(NONCE_STR, SignUtils.randomStr()); + parameters.put(NONCE_STR, SignTextUtils.randomStr()); return parameters; @@ -290,7 +291,7 @@ public class WxPayService extends BasePayService implements params.put("noncestr", result.get(NONCE_STR)); params.put("package", "Sign=WXPay"); } - String paySign = createSign(SignUtils.parameterText(params), payConfigStorage.getInputCharset()); + String paySign = createSign(SignTextUtils.parameterText(params), payConfigStorage.getInputCharset()); params.put(WxTransactionType.JSAPI.equals(order.getTransactionType()) ? "paySign" : SIGN, paySign); return params; } @@ -311,7 +312,7 @@ public class WxPayService extends BasePayService implements signTypeStr = SignUtils.HMACSHA256.getName(); } parameters.put("sign_type", signTypeStr); - String sign = createSign(SignUtils.parameterText(parameters, "&", SIGN, "appId"), payConfigStorage.getInputCharset()); + String sign = createSign(SignTextUtils.parameterText(parameters, "&", SIGN, "appId"), payConfigStorage.getInputCharset()); parameters.put(SIGN, sign); return parameters; } @@ -328,9 +329,9 @@ public class WxPayService extends BasePayService implements } SortedMap parameters = new TreeMap(); parameters.put(MCH_ID, payConfigStorage.getMchId()); - parameters.put(NONCE_STR, SignUtils.randomStr()); + parameters.put(NONCE_STR, SignTextUtils.randomStr()); - String sign = createSign(SignUtils.parameterText(parameters, "&", SIGN, "appId"), payConfigStorage.getInputCharset(), false); + String sign = createSign(SignTextUtils.parameterText(parameters, "&", SIGN, "appId"), payConfigStorage.getInputCharset(), false); parameters.put(SIGN, sign); HttpStringEntity entity = new HttpStringEntity(XML.getMap2Xml(parameters), ClientHttpRequest.APPLICATION_XML_UTF_8); @@ -578,22 +579,8 @@ public class WxPayService extends BasePayService implements * RECHARGE_REFUND,返回当日充值退款订单 * @return 返回支付方下载对账单的结果 */ - @Deprecated - @Override - public Map downloadbill(Date billDate, String billType) { - Map parameters = getDownloadBillParam(billDate, billType, false); - //设置签名 - setSign(parameters); - String respStr = requestTemplate.postForObject(getReqUrl(WxTransactionType.DOWNLOADBILL), XML.getMap2Xml(parameters), String.class); - if (respStr.indexOf("<") == 0) { - return XML.toJSONObject(respStr); - } - - Map ret = new HashMap(3); - ret.put(RETURN_CODE, SUCCESS); - ret.put(RETURN_MSG_CODE, "ok"); - ret.put("data", respStr); - return ret; + public Map downloadBill(Date billDate, String billType) { + return downloadBill(billDate, WxPayBillType.valueOf(billType)); } /** @@ -784,12 +771,12 @@ public class WxPayService extends BasePayService implements * @param order 转账订单 *
      *
-     *                                        注意事项:
-     *                                        ◆ 当返回错误码为“SYSTEMERROR”时,请不要更换商户订单号,一定要使用原商户订单号重试,否则可能造成重复支付等资金风险。
-     *                                        ◆ XML具有可扩展性,因此返回参数可能会有新增,而且顺序可能不完全遵循此文档规范,如果在解析回包的时候发生错误,请商户务必不要换单重试,请商户联系客服确认付款情况。如果有新回包字段,会更新到此API文档中。
-     *                                        ◆ 因为错误代码字段err_code的值后续可能会增加,所以商户如果遇到回包返回新的错误码,请商户务必不要换单重试,请商户联系客服确认付款情况。如果有新的错误码,会更新到此API文档中。
-     *                                        ◆ 错误代码描述字段err_code_des只供人工定位问题时做参考,系统实现时请不要依赖这个字段来做自动化处理。
-     *                                        
+ * 注意事项: + * ◆ 当返回错误码为“SYSTEMERROR”时,请不要更换商户订单号,一定要使用原商户订单号重试,否则可能造成重复支付等资金风险。 + * ◆ XML具有可扩展性,因此返回参数可能会有新增,而且顺序可能不完全遵循此文档规范,如果在解析回包的时候发生错误,请商户务必不要换单重试,请商户联系客服确认付款情况。如果有新回包字段,会更新到此API文档中。 + * ◆ 因为错误代码字段err_code的值后续可能会增加,所以商户如果遇到回包返回新的错误码,请商户务必不要换单重试,请商户联系客服确认付款情况。如果有新的错误码,会更新到此API文档中。 + * ◆ 错误代码描述字段err_code_des只供人工定位问题时做参考,系统实现时请不要依赖这个字段来做自动化处理。 + * * @return 对应的转账结果 */ @Override @@ -802,7 +789,7 @@ public class WxPayService extends BasePayService implements if (!StringUtils.isEmpty(order.getRemark())) { parameters.put("desc", order.getRemark()); } - parameters.put(NONCE_STR, SignUtils.randomStr()); + parameters.put(NONCE_STR, SignTextUtils.randomStr()); if (null != order.getTransferType() && TRANSFERS == order.getTransferType()) { transfers(parameters, order); parameters.put("mchid", payConfigStorage.getPid()); @@ -812,7 +799,7 @@ public class WxPayService extends BasePayService implements order.setTransferType(WxTransferType.PAY_BANK); payBank(parameters, order); } - parameters.put(SIGN, createSign(SignUtils.parameterText(parameters, "&", SIGN), payConfigStorage.getInputCharset())); + parameters.put(SIGN, createSign(SignTextUtils.parameterText(parameters, "&", SIGN), payConfigStorage.getInputCharset())); return getHttpRequestTemplate().postForObject(getReqUrl(order.getTransferType()), XML.getMap2Xml(parameters), JSONObject.class); } @@ -875,17 +862,17 @@ public class WxPayService extends BasePayService implements Map parameters = new TreeMap(); parameters.put(MCH_ID, payConfigStorage.getPid()); parameters.put("partner_trade_no", outNo); - parameters.put(NONCE_STR, SignUtils.randomStr()); + parameters.put(NONCE_STR, SignTextUtils.randomStr()); if (StringUtils.isEmpty(wxTransferType)) { throw new PayErrorException(new WxPayError(FAILURE, "微信转账类型 #transferQuery(String outNo, String wxTransferType) 必填,详情com.egzosn.pay.wx.bean.WxTransferType")); } //如果类型为余额方式 if (TRANSFERS.getType().equals(wxTransferType) || GETTRANSFERINFO.getType().equals(wxTransferType)) { - parameters.put(APPID, payConfigStorage.getAppId()); - parameters.put(SIGN, createSign(SignUtils.parameterText(parameters, "&", SIGN), payConfigStorage.getInputCharset())); + parameters.put(APPID, payConfigStorage.getAppId()); + parameters.put(SIGN, createSign(SignTextUtils.parameterText(parameters, "&", SIGN), payConfigStorage.getInputCharset())); return getHttpRequestTemplate().postForObject(getReqUrl(GETTRANSFERINFO), XML.getMap2Xml(parameters), JSONObject.class); } - parameters.put(SIGN, createSign(SignUtils.parameterText(parameters, "&", SIGN), payConfigStorage.getInputCharset())); + parameters.put(SIGN, createSign(SignTextUtils.parameterText(parameters, "&", SIGN), payConfigStorage.getInputCharset())); //默认查询银行卡的记录 return getHttpRequestTemplate().postForObject(getReqUrl(QUERY_BANK), XML.getMap2Xml(parameters), JSONObject.class); } @@ -932,7 +919,7 @@ public class WxPayService extends BasePayService implements parameters.put("notify_way", "MINI_PROGRAM_JSAPI"); } - parameters.put(SIGN, createSign(SignUtils.parameterText(parameters, "&", SIGN), payConfigStorage.getInputCharset())); + parameters.put(SIGN, createSign(SignTextUtils.parameterText(parameters, "&", SIGN), payConfigStorage.getInputCharset())); final JSONObject resp = requestTemplate.postForObject(getReqUrl(redpackOrder.getTransferType()), XML.getMap2Xml(parameters), JSONObject.class); if (WxSendredpackType.SENDMINIPROGRAMHB != transferType || FAIL.equals(resp.getString(RESULT_CODE))) { return resp; @@ -942,7 +929,7 @@ public class WxPayService extends BasePayService implements params.put("timeStamp", System.currentTimeMillis() / 1000 + ""); params.put("nonceStr", parameters.get(NONCE_STR)); params.put("package", UriVariables.urlEncoder(resp.getString("package"))); - String paySign = createSign(SignUtils.parameterText(params), payConfigStorage.getInputCharset()); + String paySign = createSign(SignTextUtils.parameterText(params), payConfigStorage.getInputCharset()); params.put("signType", payConfigStorage.getSignType()); params.put("paySign", paySign); return params; @@ -963,7 +950,7 @@ public class WxPayService extends BasePayService implements Map parameters = this.getPublicParameters(); parameters.put("mch_billno", mchBillno); parameters.put("bill_type", "MCHT"); - parameters.put(SIGN, createSign(SignUtils.parameterText(parameters, "&", SIGN), payConfigStorage.getInputCharset())); + parameters.put(SIGN, createSign(SignTextUtils.parameterText(parameters, "&", SIGN), payConfigStorage.getInputCharset())); return requestTemplate.postForObject(getReqUrl(WxSendredpackType.GETHBINFO), XML.getMap2Xml(parameters), JSONObject.class); } @@ -974,7 +961,7 @@ public class WxPayService extends BasePayService implements * @param parameters 接收参数 */ private void redPackParam(RedpackOrder redpackOrder, Map parameters) { - parameters.put(NONCE_STR, SignUtils.randomStr()); + parameters.put(NONCE_STR, SignTextUtils.randomStr()); parameters.put(MCH_ID, payConfigStorage.getPid()); parameters.put("wxappid", payConfigStorage.getAppId()); parameters.put("send_name", redpackOrder.getSendName()); 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 ba19707..d530673 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 @@ -23,6 +23,7 @@ import com.egzosn.pay.common.bean.TransferOrder; 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.sign.SignTextUtils; import com.egzosn.pay.common.util.sign.SignUtils; import com.egzosn.pay.common.util.str.StringUtils; import com.egzosn.pay.yiji.bean.YiJiTransactionType; @@ -120,7 +121,7 @@ public class YiJiPayService extends BasePayService { */ private Map setSign(Map parameters) { parameters.put("signType", payConfigStorage.getSignType()); - String sign = createSign(SignUtils.parameterText(parameters, "&", SIGN), payConfigStorage.getInputCharset()); + String sign = createSign(SignTextUtils.parameterText(parameters, "&", SIGN), payConfigStorage.getInputCharset()); parameters.put(SIGN, sign); return parameters; @@ -363,22 +364,8 @@ public class YiJiPayService extends BasePayService { } - /** - * 目前只支持日账单 - * - * @param billDate 账单类型,商户通过接口或商户经开放平台授权后其所属服务商通过接口可以获取以下账单类型:trade、signcustomer;trade指商户基于易极付交易收单的业务账单;signcustomer是指基于商户易极付余额收入及支出等资金变动的帐务账单; - * @param billType 账单时间:日账单格式为yyyy-MM-dd,月账单格式为yyyy-MM。 - * @return 返回支付方下载对账单的结果 - */ - @Deprecated - @Override - public Map downloadbill(Date billDate, String billType) { - - return Collections.emptyMap(); - } /** - * 目前只支持日账单 * * @param billDate 账单类型,商户通过接口或商户经开放平台授权后其所属服务商通过接口可以获取以下账单类型:trade、signcustomer;trade指商户基于易极付交易收单的业务账单;signcustomer是指基于商户易极付余额收入及支出等资金变动的帐务账单; * @param billType 账单时间:日账单格式为yyyy-MM-dd,月账单格式为yyyy-MM。