转账定义,银行定义,签名类型增加HMAC-SHA256

This commit is contained in:
egzosn
2018-01-31 18:57:49 +08:00
parent 87ab7f1a5d
commit 42992f85cc
6 changed files with 349 additions and 5 deletions

View File

@@ -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 <T> 返回类型
* @return 返回查询回来的结果集
*/
@Override
public <T> T query(String tradeNo, String outTradeNo, Callback<T> callback) {
return callback.perform(query(tradeNo, outTradeNo));
}
/**
* 交易关闭接口
*
* @param tradeNo 支付平台订单号
* @param outTradeNo 商户单号
* @param callback 处理器
* @param <T> 返回类型
* @return 返回支付方交易关闭后的结果
*/
@Override
public <T> T close(String tradeNo, String outTradeNo, Callback<T> callback) {
return callback.perform(close(tradeNo, outTradeNo));
}
/**
* 退款
*
* @param tradeNo 支付平台订单号
* @param outTradeNo 商户单号
* @param refundAmount 退款金额
* @param totalAmount 总金额
* @param callback 处理器
* @param <T> 返回类型
*
* @return 处理过后的类型对象, 返回支付方申请退款后的结果
* @see #refund(RefundOrder, Callback)
*/
@Deprecated
@Override
public <T> T refund(String tradeNo, String outTradeNo, BigDecimal refundAmount, BigDecimal totalAmount, Callback<T> callback) {
return callback.perform(refund(new RefundOrder(tradeNo, outTradeNo, refundAmount, totalAmount)));
}
/**
* 申请退款接口
*
* @param refundOrder 退款订单信息
* @return 返回支付方申请退款后的结果
* @param callback 处理器
* @param <T> 返回类型
* @return 返回支付方申请退款后的结果
*/
@Override
public <T> T refund(RefundOrder refundOrder, Callback<T> callback) {
return callback.perform(refund(refundOrder));
}
/**
* 查询退款
*
* @param tradeNo 支付平台订单号
* @param outTradeNo 商户单号
* @param callback 处理器
* @param <T> 返回类型
*
* @return 处理过后的类型对象,返回支付方查询退款后的结果
*/
@Override
public <T> T refundquery(String tradeNo, String outTradeNo, Callback<T> callback) {
return callback.perform(refundquery(tradeNo, outTradeNo));
}
/**
* 目前只支持日账单
*
* @param billDate 账单时间:具体请查看对应支付平台
* @param billType 账单类型,具体请查看对应支付平台
* @param callback 处理器
* @param <T> 返回类型
*
* @return 返回支付方下载对账单的结果
*/
@Override
public <T> T downloadbill(Date billDate, String billType, Callback<T> callback) {
return callback.perform(downloadbill(billDate, billType));
}
/**
* @param tradeNoOrBillDate 支付平台订单号或者账单类型, 具体请 类型为{@link String }或者 {@link Date },类型须强制限制,类型不对应则抛出异常{@link PayErrorException}
* @param outTradeNoBillType 商户单号或者 账单类型
* @param transactionType 交易类型
* @param callback 处理器
* @param <T> 返回类型
* @return 返回支付方对应接口的结果
*/
@Override
public <T>T secondaryInterface(Object tradeNoOrBillDate, String outTradeNoBillType, TransactionType transactionType, Callback<T> callback){
return callback.perform(secondaryInterface(tradeNoOrBillDate, outTradeNoBillType, transactionType));
}
/**
* 转账
*
* @param order 转账订单
* @param callback 处理器
*
* @return 对应的转账结果
*/
@Override
public <T> T transfer(TransferOrder order, Callback<T> callback) {
return callback.perform(transfer(order));
}
/**
* 转账
*
* @param order 转账订单
*
* @return 对应的转账结果
*/
@Override
public Map<String, Object> transfer(TransferOrder order) {
return new HashMap<>();
}
}

View File

@@ -266,7 +266,7 @@ public interface PayService {
* @param billType 账单类型商户通过接口或商户经开放平台授权后其所属服务商通过接口可以获取以下账单类型trade、signcustomertrade指商户基于支付宝交易收单的业务账单signcustomer是指基于商户支付宝余额收入及支出等资金变动的帐务账单
* @return 返回支付方下载对账单的结果
*/
Object downloadbill(Date billDate, String billType);
Map<String, Object> downloadbill(Date billDate, String billType);
/**
* 下载对账单
@@ -279,6 +279,17 @@ public interface PayService {
*/
<T>T downloadbill(Date billDate, String billType, Callback<T> callback);
/**
*
* @param tradeNoOrBillDate 支付平台订单号或者账单类型, 具体请
* 类型为{@link String }或者 {@link Date },类型须强制限制,类型不对应则抛出异常{@link PayErrorException}
* @param outTradeNoBillType 商户单号或者 账单类型
* @param transactionType 交易类型
* @return 返回支付方对应接口的结果
*/
Map<String, Object> secondaryInterface(Object tradeNoOrBillDate, String outTradeNoBillType, TransactionType transactionType);
/**
* 通用查询接口
*
@@ -293,6 +304,21 @@ public interface PayService {
<T>T secondaryInterface(Object tradeNoOrBillDate, String outTradeNoBillType, TransactionType transactionType, Callback<T> callback);
/**
* 转账
* @param order 转账订单
* @return 对应的转账结果
*/
Map<String, Object> transfer(TransferOrder order);
/**
* 转账
* @param order 转账订单
* @param callback 处理器
* @param <T> 返回类型
* @return 对应的转账结果
*/
<T>T transfer(TransferOrder order, Callback<T> callback);
}

View File

@@ -0,0 +1,24 @@
package com.egzosn.pay.common.bean;
/**
* 银行
* @author egan
* <pre>
* email egzosn@gmail.com
* date 2018/1/31
* </pre>
*/
public interface Bank {
/**
* 获取银行的代码
* @return 银行的代码
*/
String getCode();
/**
* 获取银行的名称
* @return 银行的名称
*/
String getName();
}

View File

@@ -0,0 +1,104 @@
package com.egzosn.pay.common.bean;
import java.math.BigDecimal;
/**
* 转账订单
* @author egan
* <pre>
* email egzosn@gmail.com
* date 2018/1/31
* </pre>
*/
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;
}
}

View File

@@ -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 {