diff --git a/pay-java-common/pom.xml b/pay-java-common/pom.xml index f4b8082..84efcdf 100644 --- a/pay-java-common/pom.xml +++ b/pay-java-common/pom.xml @@ -5,7 +5,7 @@ pay-java-parent com.egzosn - 2.0.6-SNAPSHOT + 2.0.7-SNAPSHOT 4.0.0 jar diff --git a/pay-java-common/src/main/java/com/egzosn/pay/common/api/BasePayService.java b/pay-java-common/src/main/java/com/egzosn/pay/common/api/BasePayService.java index 5ac8dc8..c36a264 100644 --- a/pay-java-common/src/main/java/com/egzosn/pay/common/api/BasePayService.java +++ b/pay-java-common/src/main/java/com/egzosn/pay/common/api/BasePayService.java @@ -1,14 +1,17 @@ package com.egzosn.pay.common.api; +import com.egzosn.pay.common.bean.RefundOrder; +import com.egzosn.pay.common.bean.TransactionType; +import com.egzosn.pay.common.bean.TransferOrder; +import com.egzosn.pay.common.exception.PayErrorException; import com.egzosn.pay.common.http.HttpConfigStorage; import com.egzosn.pay.common.http.HttpRequestTemplate; import com.egzosn.pay.common.util.sign.SignUtils; import java.io.InputStream; import java.io.UnsupportedEncodingException; -import java.util.Iterator; -import java.util.Map; -import java.util.TreeMap; +import java.math.BigDecimal; +import java.util.*; /** * 支付基础服务 @@ -123,4 +126,136 @@ public abstract class BasePayService implements PayService { } + /** + * 交易查询接口,带处理器 + * @param tradeNo 支付平台订单号 + * @param outTradeNo 商户单号 + * @param callback 处理器 + * @param 返回类型 + * @return 返回查询回来的结果集 + */ + @Override + public T query(String tradeNo, String outTradeNo, Callback callback) { + + return callback.perform(query(tradeNo, outTradeNo)); + } + + /** + * 交易关闭接口 + * + * @param tradeNo 支付平台订单号 + * @param outTradeNo 商户单号 + * @param callback 处理器 + * @param 返回类型 + * @return 返回支付方交易关闭后的结果 + */ + @Override + public T close(String tradeNo, String outTradeNo, Callback callback) { + return callback.perform(close(tradeNo, outTradeNo)); + } + + /** + * 退款 + * + * @param tradeNo 支付平台订单号 + * @param outTradeNo 商户单号 + * @param refundAmount 退款金额 + * @param totalAmount 总金额 + * @param callback 处理器 + * @param 返回类型 + * + * @return 处理过后的类型对象, 返回支付方申请退款后的结果 + * @see #refund(RefundOrder, Callback) + */ + @Deprecated + @Override + public T refund(String tradeNo, String outTradeNo, BigDecimal refundAmount, BigDecimal totalAmount, Callback callback) { + + return callback.perform(refund(new RefundOrder(tradeNo, outTradeNo, refundAmount, totalAmount))); + } + + /** + * 申请退款接口 + * + * @param refundOrder 退款订单信息 + * @return 返回支付方申请退款后的结果 + * @param callback 处理器 + * @param 返回类型 + * @return 返回支付方申请退款后的结果 + */ + @Override + public T refund(RefundOrder refundOrder, Callback callback) { + + return callback.perform(refund(refundOrder)); + } + + + /** + * 查询退款 + * + * @param tradeNo 支付平台订单号 + * @param outTradeNo 商户单号 + * @param callback 处理器 + * @param 返回类型 + * + * @return 处理过后的类型对象,返回支付方查询退款后的结果 + */ + @Override + public T refundquery(String tradeNo, String outTradeNo, Callback callback) { + return callback.perform(refundquery(tradeNo, outTradeNo)); + } + + /** + * 目前只支持日账单 + * + * @param billDate 账单时间:具体请查看对应支付平台 + * @param billType 账单类型,具体请查看对应支付平台 + * @param callback 处理器 + * @param 返回类型 + * + * @return 返回支付方下载对账单的结果 + */ + @Override + public T downloadbill(Date billDate, String billType, Callback callback) { + return callback.perform(downloadbill(billDate, billType)); + } + + /** + * @param tradeNoOrBillDate 支付平台订单号或者账单类型, 具体请 类型为{@link String }或者 {@link Date },类型须强制限制,类型不对应则抛出异常{@link PayErrorException} + * @param outTradeNoBillType 商户单号或者 账单类型 + * @param transactionType 交易类型 + * @param callback 处理器 + * @param 返回类型 + * @return 返回支付方对应接口的结果 + */ + @Override + public T secondaryInterface(Object tradeNoOrBillDate, String outTradeNoBillType, TransactionType transactionType, Callback callback){ + return callback.perform(secondaryInterface(tradeNoOrBillDate, outTradeNoBillType, transactionType)); + } + + /** + * 转账 + * + * @param order 转账订单 + * @param callback 处理器 + * + * @return 对应的转账结果 + */ + @Override + public T transfer(TransferOrder order, Callback callback) { + return callback.perform(transfer(order)); + } + + + /** + * 转账 + * + * @param order 转账订单 + * + * @return 对应的转账结果 + */ + @Override + public Map transfer(TransferOrder order) { + return new HashMap<>(); + } } diff --git a/pay-java-common/src/main/java/com/egzosn/pay/common/api/PayService.java b/pay-java-common/src/main/java/com/egzosn/pay/common/api/PayService.java index 51f9fe4..da7b386 100644 --- a/pay-java-common/src/main/java/com/egzosn/pay/common/api/PayService.java +++ b/pay-java-common/src/main/java/com/egzosn/pay/common/api/PayService.java @@ -266,7 +266,7 @@ public interface PayService { * @param billType 账单类型,商户通过接口或商户经开放平台授权后其所属服务商通过接口可以获取以下账单类型:trade、signcustomer;trade指商户基于支付宝交易收单的业务账单;signcustomer是指基于商户支付宝余额收入及支出等资金变动的帐务账单; * @return 返回支付方下载对账单的结果 */ - Object downloadbill(Date billDate, String billType); + Map downloadbill(Date billDate, String billType); /** * 下载对账单 @@ -279,6 +279,17 @@ public interface PayService { */ T downloadbill(Date billDate, String billType, Callback callback); + + /** + * + * @param tradeNoOrBillDate 支付平台订单号或者账单类型, 具体请 + * 类型为{@link String }或者 {@link Date },类型须强制限制,类型不对应则抛出异常{@link PayErrorException} + * @param outTradeNoBillType 商户单号或者 账单类型 + * @param transactionType 交易类型 + * @return 返回支付方对应接口的结果 + */ + Map secondaryInterface(Object tradeNoOrBillDate, String outTradeNoBillType, TransactionType transactionType); + /** * 通用查询接口 * @@ -293,6 +304,21 @@ public interface PayService { T secondaryInterface(Object tradeNoOrBillDate, String outTradeNoBillType, TransactionType transactionType, Callback callback); + /** + * 转账 + * @param order 转账订单 + * @return 对应的转账结果 + */ + Map transfer(TransferOrder order); + /** + * 转账 + * @param order 转账订单 + * @param callback 处理器 + * @param 返回类型 + * @return 对应的转账结果 + */ + T transfer(TransferOrder order, Callback callback); + } diff --git a/pay-java-common/src/main/java/com/egzosn/pay/common/bean/Bank.java b/pay-java-common/src/main/java/com/egzosn/pay/common/bean/Bank.java new file mode 100644 index 0000000..72a82a4 --- /dev/null +++ b/pay-java-common/src/main/java/com/egzosn/pay/common/bean/Bank.java @@ -0,0 +1,24 @@ +package com.egzosn.pay.common.bean; + +/** + * 银行 + * @author egan + *
+ * email egzosn@gmail.com
+ * date 2018/1/31
+ * 
+ */ +public interface Bank { + + /** + * 获取银行的代码 + * @return 银行的代码 + */ + String getCode(); + + /** + * 获取银行的名称 + * @return 银行的名称 + */ + String getName(); +} diff --git a/pay-java-common/src/main/java/com/egzosn/pay/common/bean/TransferOrder.java b/pay-java-common/src/main/java/com/egzosn/pay/common/bean/TransferOrder.java new file mode 100644 index 0000000..76bbcc0 --- /dev/null +++ b/pay-java-common/src/main/java/com/egzosn/pay/common/bean/TransferOrder.java @@ -0,0 +1,104 @@ +package com.egzosn.pay.common.bean; + +import java.math.BigDecimal; + +/** + * 转账订单 + * @author egan + *
+ * email egzosn@gmail.com
+ * date 2018/1/31
+ * 
+ */ +public class TransferOrder { + + /** + * 转账订单单号 + */ + private String outNo; + + /** + * 收款方账户 + */ + private String payeeAccount ; + + /** + * 转账金额 + */ + private BigDecimal amount ; + + /** + * 付款人名称 + */ + private String payerName; + + /** + * 收款人名称 + */ + private String payeeName; + /** + * 备注 + */ + private String remark; + + /** + * 收款开户行 + */ + private Bank bank; + + public String getOutNo() { + return outNo; + } + + public void setOutNo(String outNo) { + this.outNo = outNo; + } + + public String getPayeeAccount() { + return payeeAccount; + } + + public void setPayeeAccount(String payeeAccount) { + this.payeeAccount = payeeAccount; + } + + public BigDecimal getAmount() { + return amount; + } + + public void setAmount(BigDecimal amount) { + this.amount = amount; + } + + public String getPayerName() { + return payerName; + } + + public void setPayerName(String payerName) { + this.payerName = payerName; + } + + public String getPayeeName() { + return payeeName; + } + + public void setPayeeName(String payeeName) { + this.payeeName = payeeName; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public Bank getBank() { + return bank; + } + + public void setBank(Bank bank) { + this.bank = bank; + } +} diff --git a/pay-java-common/src/main/java/com/egzosn/pay/common/util/sign/SignUtils.java b/pay-java-common/src/main/java/com/egzosn/pay/common/util/sign/SignUtils.java index 1e03f5b..37eb85e 100644 --- a/pay-java-common/src/main/java/com/egzosn/pay/common/util/sign/SignUtils.java +++ b/pay-java-common/src/main/java/com/egzosn/pay/common/util/sign/SignUtils.java @@ -1,9 +1,16 @@ package com.egzosn.pay.common.util.sign; +import com.egzosn.pay.common.bean.result.PayException; +import com.egzosn.pay.common.exception.PayErrorException; import com.egzosn.pay.common.util.str.StringUtils; import org.apache.http.message.BasicNameValuePair; +import javax.crypto.Mac; +import javax.crypto.spec.SecretKeySpec; +import java.io.UnsupportedEncodingException; +import java.security.InvalidKeyException; +import java.security.NoSuchAlgorithmException; import java.util.*; /** @@ -43,6 +50,54 @@ public enum SignUtils { public boolean verify(String text, String sign, String key, String characterEncoding) { return com.egzosn.pay.common.util.sign.encrypt.MD5.verify(text, sign, key, characterEncoding); } + },HMACSHA256{ + /** + * 签名 + * + * @param content 需要签名的内容 + * @param key 密钥 + * @param characterEncoding 字符编码 + * + * @return 签名值 + */ + @Override + public String createSign(String content, String key, String characterEncoding) { + Mac sha256_HMAC = null; + try { + sha256_HMAC = Mac.getInstance("HmacSHA256"); + SecretKeySpec secret_key = new SecretKeySpec(key.getBytes(characterEncoding), "HmacSHA256"); + sha256_HMAC.init(secret_key); + byte[] array = sha256_HMAC.doFinal(content.getBytes(characterEncoding)); + StringBuilder sb = new StringBuilder(); + for (byte item : array) { + sb.append(Integer.toHexString((item & 0xFF) | 0x100).substring(1, 3)); + } + return sb.toString().toUpperCase(); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } catch (InvalidKeyException e) { + e.printStackTrace(); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + + throw new PayErrorException(new PayException("fail", "HMACSHA256 签名异常")); + } + + /** + * 签名字符串 + * + * @param text 需要签名的字符串 + * @param sign 签名结果 + * @param key 密钥 + * @param characterEncoding 编码格式 + * + * @return 签名结果 + */ + @Override + public boolean verify(String text, String sign, String key, String characterEncoding) { + return createSign(text, key, characterEncoding).equals(sign); + } }, RSA {