新增支付验签方式支持

This commit is contained in:
egan
2021-08-15 22:45:02 +08:00
parent 932b69fc76
commit 4bd02fa0c2
10 changed files with 154 additions and 43 deletions

View File

@@ -32,7 +32,9 @@ import com.egzosn.pay.ali.bean.OrderSettle;
import com.egzosn.pay.common.api.BasePayService;
import com.egzosn.pay.common.bean.BillType;
import com.egzosn.pay.common.bean.MethodType;
import com.egzosn.pay.common.bean.NoticeParams;
import com.egzosn.pay.common.bean.Order;
import com.egzosn.pay.common.bean.OrderParaStructure;
import com.egzosn.pay.common.bean.PayMessage;
import com.egzosn.pay.common.bean.PayOrder;
import com.egzosn.pay.common.bean.PayOutMessage;
@@ -108,18 +110,30 @@ public class AliPayService extends BasePayService<AliPayConfigStorage> {
* @param params 回调回来的参数集
* @return 签名校验 true通过
*/
@Deprecated
@Override
public boolean verify(Map<String, Object> params) {
return verify(new NoticeParams(params));
}
/**
* 回调校验
*
* @param noticeParams 回调回来的参数集
* @return 签名校验 true通过
*/
@Override
public boolean verify(NoticeParams noticeParams) {
final Map<String, Object> params = noticeParams.getBody();
if (params.get(SIGN) == null) {
LOG.debug("支付宝支付异常params" + params);
return false;
}
return signVerify(params, (String) params.get(SIGN)) && verifySource((String) params.get("notify_id"));
}
/**
* 根据反馈回来的信息,生成签名结果
*
@@ -209,12 +223,12 @@ public class AliPayService extends BasePayService<AliPayConfigStorage> {
private void setNotifyUrl(Map<String, Object> orderInfo, PayOrder order) {
orderInfo.put(NOTIFY_URL, payConfigStorage.getNotifyUrl());
setParameters(orderInfo, NOTIFY_URL, order);
OrderParaStructure.loadParameters(orderInfo, NOTIFY_URL, order);
}
private void setReturnUrl(Map<String, Object> orderInfo, PayOrder order) {
orderInfo.put(RETURN_URL, payConfigStorage.getReturnUrl());
setParameters(orderInfo, RETURN_URL, order);
OrderParaStructure.loadParameters(orderInfo, RETURN_URL, order);
}
/**
@@ -235,7 +249,7 @@ public class AliPayService extends BasePayService<AliPayConfigStorage> {
Map<String, Object> bizContent = new TreeMap<>();
bizContent.put("body", order.getBody());
setParameters(bizContent, "seller_id", payConfigStorage.getSeller());
OrderParaStructure.loadParameters(bizContent, "seller_id", payConfigStorage.getSeller());
bizContent.put("subject", order.getSubject());
bizContent.put("out_trade_no", order.getOutTradeNo());
bizContent.put("total_amount", Util.conversionAmount(order.getPrice()).toString());
@@ -319,8 +333,8 @@ public class AliPayService extends BasePayService<AliPayConfigStorage> {
protected void loadCertSn(Map<String, Object> orderInfo) {
if (payConfigStorage.isCertSign()) {
final CertEnvironment certEnvironment = payConfigStorage.getCertEnvironment();
setParameters(orderInfo, "app_cert_sn", certEnvironment.getMerchantCertSN());
setParameters(orderInfo, "alipay_root_cert_sn", certEnvironment.getRootCertSN());
OrderParaStructure.loadParameters(orderInfo, "app_cert_sn", certEnvironment.getMerchantCertSN());
OrderParaStructure.loadParameters(orderInfo, "alipay_root_cert_sn", certEnvironment.getRootCertSN());
}
}
@@ -493,7 +507,7 @@ public class AliPayService extends BasePayService<AliPayConfigStorage> {
*/
protected void setAppAuthToken(Map<String, Object> parameters, Map<String, Object> attrs) {
setAppAuthToken(parameters);
setParameters(parameters, APP_AUTH_TOKEN, (String) attrs.remove(APP_AUTH_TOKEN));
OrderParaStructure.loadParameters(parameters, APP_AUTH_TOKEN, (String) attrs.remove(APP_AUTH_TOKEN));
}
/**
@@ -502,7 +516,7 @@ public class AliPayService extends BasePayService<AliPayConfigStorage> {
* @param parameters 参数
*/
protected void setAppAuthToken(Map<String, Object> parameters) {
setParameters(parameters, APP_AUTH_TOKEN, payConfigStorage.getAppAuthToken());
OrderParaStructure.loadParameters(parameters, APP_AUTH_TOKEN, payConfigStorage.getAppAuthToken());
}
@@ -645,11 +659,11 @@ public class AliPayService extends BasePayService<AliPayConfigStorage> {
bizContent.put("out_biz_no", order.getOutNo());
bizContent.put("trans_amount", order.getAmount());
transferType.setAttr(bizContent, order);
setParameters(bizContent, "order_title", order);
setParameters(bizContent, "original_order_id", order);
OrderParaStructure.loadParameters(bizContent, "order_title", order);
OrderParaStructure.loadParameters(bizContent, "original_order_id", order);
setPayeeInfo(bizContent, order);
bizContent.put("remark", order.getRemark());
setParameters(bizContent, "business_params", order);
OrderParaStructure.loadParameters(bizContent, "business_params", order);
//设置请求参数的集合
parameters.put(BIZ_CONTENT, JSON.toJSONString(bizContent));

View File

@@ -27,6 +27,7 @@ import com.egzosn.pay.common.bean.BaseRefundResult;
import com.egzosn.pay.common.bean.BillType;
import com.egzosn.pay.common.bean.CurType;
import com.egzosn.pay.common.bean.MethodType;
import com.egzosn.pay.common.bean.NoticeParams;
import com.egzosn.pay.common.bean.PayMessage;
import com.egzosn.pay.common.bean.PayOrder;
import com.egzosn.pay.common.bean.PayOutMessage;
@@ -84,22 +85,34 @@ public class BaiduPayService extends BasePayService<BaiduPayConfigStorage> {
* @param params 回调回来的参数集
* @return 结果
*/
@Deprecated
@Override
public boolean verify(Map<String, Object> params) {
return verify(new NoticeParams(params));
}
/**
* 回调校验
*
* @param noticeParams 回调回来的参数集
* @return 签名校验 true通过
*/
@Override
public boolean verify(NoticeParams noticeParams) {
final Map<String, Object> params = noticeParams.getBody();
if (!RESPONSE_SUCCESS.equals(params.get(RESPONSE_STATUS)) && !RESPONSE_SUCCESS.toString().equals(params.get(RESPONSE_STATUS))) {
return false;
}
LOG.info("开始验证回调签名参数:" + params);
try {
boolean checkSign = this.checkReturnSign(params, payConfigStorage.getKeyPublic(), (String) params.get(RSA_SIGN));
return checkSign;
return this.checkReturnSign(params, payConfigStorage.getKeyPublic(), (String) params.get(RSA_SIGN));
}
catch (Exception e) {
LOG.info("验签失败", e);
}
return false;
}
public boolean checkReturnSign(Map<String, Object> params, String publicKey, String rsaSign) {
try {
String content = signContent(params);

View File

@@ -502,6 +502,7 @@ public abstract class BasePayService<PC extends PayConfigStorage> implements Pay
* @param order 订单对象
* @return 返回订单参数
*/
@Deprecated
protected Map<String, Object> setParameters(Map<String, Object> parameters, String key, Order order) {
return OrderParaStructure.loadParameters(parameters, key, order);
}

View File

@@ -11,6 +11,7 @@ import com.alibaba.fastjson.JSONObject;
import com.egzosn.pay.common.api.BasePayService;
import com.egzosn.pay.common.bean.BillType;
import com.egzosn.pay.common.bean.MethodType;
import com.egzosn.pay.common.bean.NoticeParams;
import com.egzosn.pay.common.bean.PayMessage;
import com.egzosn.pay.common.bean.PayOrder;
import com.egzosn.pay.common.bean.PayOutMessage;
@@ -117,8 +118,21 @@ public class FuiouPayService extends BasePayService<FuiouPayConfigStorage> {
* @param params 回调回来的参数集
* @return 返回检验结果 0000 成功 其他失败
*/
@Deprecated
@Override
public boolean verify(Map<String, Object> params) {
return verify(new NoticeParams(params));
}
/**
* 回调校验
*
* @param noticeParams 回调回来的参数集
* @return 签名校验 true通过
*/
@Override
public boolean verify(NoticeParams noticeParams) {
final Map<String, Object> params = noticeParams.getBody();
if (!"0000".equals(params.get("order_pay_code"))) {
LOG.debug(String.format("富友支付异常order_pay_code=%s,错误原因=%s,参数集=%s", params.get("order_pay_code"), params.get("order_pay_error"), params));
return false;
@@ -128,11 +142,10 @@ public class FuiouPayService extends BasePayService<FuiouPayConfigStorage> {
return (signVerify(params, (String) params.remove("md5")) && verifySource((String) params.get("order_id")));
}
catch (PayErrorException e) {
e.printStackTrace();
LOG.error("", e);
}
return false;
}
/**
* 回调签名校验
*

View File

@@ -20,6 +20,7 @@ import com.egzosn.pay.common.bean.BillType;
import com.egzosn.pay.common.bean.CurType;
import com.egzosn.pay.common.bean.DefaultCurType;
import com.egzosn.pay.common.bean.MethodType;
import com.egzosn.pay.common.bean.NoticeParams;
import com.egzosn.pay.common.bean.PayMessage;
import com.egzosn.pay.common.bean.PayOrder;
import com.egzosn.pay.common.bean.PayOutMessage;
@@ -141,8 +142,21 @@ public class PayoneerPayService extends BasePayService<PayoneerConfigStorage> im
* @param params 回调回来的参数集
* @return 签名校验 true通过
*/
@Deprecated
@Override
public boolean verify(Map<String, Object> params) {
return verify(new NoticeParams(params));
}
/**
* 回调校验
*
* @param noticeParams 回调回来的参数集
* @return 签名校验 true通过
*/
@Override
public boolean verify(NoticeParams noticeParams) {
final Map<String, Object> params = noticeParams.getBody();
if (params != null && 0 == Integer.parseInt(params.get(CODE).toString())) {
if (params.containsKey(OUT_TRADE_NO)) {
return verifySource((String) params.get(OUT_TRADE_NO));
@@ -152,7 +166,6 @@ public class PayoneerPayService extends BasePayService<PayoneerConfigStorage> im
return false;
}
/**
* 支付宝需要,微信是否也需要再次校验来源,进行订单查询
* 校验数据来源

View File

@@ -24,6 +24,7 @@ import com.egzosn.pay.common.bean.BillType;
import com.egzosn.pay.common.bean.CurType;
import com.egzosn.pay.common.bean.DefaultCurType;
import com.egzosn.pay.common.bean.MethodType;
import com.egzosn.pay.common.bean.NoticeParams;
import com.egzosn.pay.common.bean.PayMessage;
import com.egzosn.pay.common.bean.PayOrder;
import com.egzosn.pay.common.bean.PayOutMessage;
@@ -133,9 +134,17 @@ public class PayPalPayService extends BasePayService<PayPalConfigStorage> {
}
@Deprecated
@Override
public boolean verify(Map<String, Object> params) {
return verify(new NoticeParams(params));
}
@Override
public boolean verify(NoticeParams noticeParams) {
final Map<String, Object> params = noticeParams.getBody();
HttpStringEntity httpEntity = new HttpStringEntity("{\"payer_id\":\"" + (String) params.get("PayerID") + "\"}", ContentType.APPLICATION_JSON);
httpEntity.setHeaders(authHeader());
JSONObject resp = getHttpRequestTemplate().postForObject(getReqUrl(PayPalTransactionType.EXECUTE), httpEntity, JSONObject.class, (String) params.get("paymentId"));

View File

@@ -25,6 +25,7 @@ import com.egzosn.pay.common.bean.BillType;
import com.egzosn.pay.common.bean.CurType;
import com.egzosn.pay.common.bean.DefaultCurType;
import com.egzosn.pay.common.bean.MethodType;
import com.egzosn.pay.common.bean.NoticeParams;
import com.egzosn.pay.common.bean.PayMessage;
import com.egzosn.pay.common.bean.PayOrder;
import com.egzosn.pay.common.bean.PayOutMessage;
@@ -155,8 +156,16 @@ public class PayPalPayService extends BasePayService<PayPalConfigStorage> implem
* @param params 回调回来的参数集
* @return 是否成功 true成功
*/
@Deprecated
@Override
public boolean verify(Map<String, Object> params) {
return verify(new NoticeParams(params));
}
@Override
public boolean verify(NoticeParams noticeParams) {
final Map<String, Object> params = noticeParams.getBody();
Object paymentStatus = params.get("payment_status");
if (!"Completed".equals(paymentStatus)) {
LOG.warn("状态未完成:" + paymentStatus);
@@ -166,8 +175,6 @@ public class PayPalPayService extends BasePayService<PayPalConfigStorage> implem
return "VERIFIED".equals(resp);
}
/**
* 获取授权请求头
*

View File

@@ -28,6 +28,7 @@ import com.alibaba.fastjson.JSONObject;
import com.egzosn.pay.common.api.BasePayService;
import com.egzosn.pay.common.bean.BillType;
import com.egzosn.pay.common.bean.MethodType;
import com.egzosn.pay.common.bean.NoticeParams;
import com.egzosn.pay.common.bean.PayMessage;
import com.egzosn.pay.common.bean.PayOrder;
import com.egzosn.pay.common.bean.PayOutMessage;
@@ -200,16 +201,28 @@ public class UnionPayService extends BasePayService<UnionPayConfigStorage> {
* @param result 回调回来的参数集
* @return 签名校验 true通过
*/
@Deprecated
@Override
public boolean verify(Map<String, Object> result) {
return verify(new NoticeParams(result));
}
/**
* 回调校验
*
* @param noticeParams 回调回来的参数集
* @return 签名校验 true通过
*/
public boolean verify(NoticeParams noticeParams) {
final Map<String, Object> result = noticeParams.getBody();
if (null == result || result.get(SDKConstants.param_signature) == null) {
LOG.debug("银联支付验签异常params" + result);
return false;
}
return this.signVerify(result, (String) result.get(SDKConstants.param_signature));
}
/**
* 签名校验
*

View File

@@ -16,6 +16,7 @@ import com.egzosn.pay.common.bean.BaseRefundResult;
import com.egzosn.pay.common.bean.BillType;
import com.egzosn.pay.common.bean.CurType;
import com.egzosn.pay.common.bean.MethodType;
import com.egzosn.pay.common.bean.NoticeParams;
import com.egzosn.pay.common.bean.PayMessage;
import com.egzosn.pay.common.bean.PayOrder;
import com.egzosn.pay.common.bean.PayOutMessage;
@@ -132,8 +133,22 @@ public class WxYouDianPayService extends BasePayService<WxYouDianPayConfigStorag
* @param params 回调回来的参数集
* @return 签名校验 true通过
*/
@Deprecated
@Override
public boolean verify(Map<String, Object> params) {
return verify(new NoticeParams(params));
}
/**
* 回调校验
*
* @param noticeParams 回调回来的参数集
* @return 签名校验 true通过
*/
public boolean verify(NoticeParams noticeParams) {
final Map<String, Object> params = noticeParams.getBody();
if (!"SUCCESS".equals(params.get("return_code"))) {
LOG.debug(String.format("友店微信支付异常return_code=%s,参数集=%s", params.get("return_code"), params));
return false;
@@ -151,7 +166,6 @@ public class WxYouDianPayService extends BasePayService<WxYouDianPayConfigStorag
return false;
}
/**
* 根据反馈回来的信息,生成签名结果
*
@@ -495,7 +509,6 @@ public class WxYouDianPayService extends BasePayService<WxYouDianPayConfigStorag
}
@Override
public Map<String, Object> downloadBill(Date billDate, BillType billType) {
return Collections.emptyMap();

View File

@@ -40,7 +40,9 @@ import com.alibaba.fastjson.JSONObject;
import com.egzosn.pay.common.api.BasePayService;
import com.egzosn.pay.common.bean.BillType;
import com.egzosn.pay.common.bean.MethodType;
import com.egzosn.pay.common.bean.NoticeParams;
import com.egzosn.pay.common.bean.Order;
import com.egzosn.pay.common.bean.OrderParaStructure;
import com.egzosn.pay.common.bean.PayMessage;
import com.egzosn.pay.common.bean.PayOrder;
import com.egzosn.pay.common.bean.PayOutMessage;
@@ -135,9 +137,22 @@ public class WxPayService extends BasePayService<WxPayConfigStorage> implements
* @param params 回调回来的参数集
* @return 签名校验 true通过
*/
@Deprecated
@Override
public boolean verify(Map<String, Object> params) {
return verify(new NoticeParams(params));
}
/**
* 回调校验
*
* @param noticeParams 回调回来的参数集
* @return 签名校验 true通过
*/
public boolean verify(NoticeParams noticeParams) {
final Map<String, Object> params = noticeParams.getBody();
if (null == params.get(SIGN) || !(SUCCESS.equals(params.get(RETURN_CODE)) && SUCCESS.equals(params.get(RESULT_CODE)))) {
if (LOG.isErrorEnabled()) {
LOG.error(String.format("微信支付异常return_code=%s,参数集=%s", params.get(RETURN_CODE), params));
@@ -187,8 +202,8 @@ public class WxPayService extends BasePayService<WxPayConfigStorage> implements
parameters.put(APPID, payConfigStorage.getAppId());
parameters.put(MCH_ID, payConfigStorage.getMchId());
//判断如果是服务商模式信息则加入
setParameters(parameters, "sub_mch_id", payConfigStorage.getSubMchId());
setParameters(parameters, "sub_appid", payConfigStorage.getSubAppId());
OrderParaStructure.loadParameters(parameters, "sub_mch_id", payConfigStorage.getSubMchId());
OrderParaStructure.loadParameters(parameters, "sub_appid", payConfigStorage.getSubAppId());
parameters.put(NONCE_STR, SignTextUtils.randomStr());
return parameters;
@@ -209,13 +224,13 @@ public class WxPayService extends BasePayService<WxPayConfigStorage> implements
// 购买支付信息
parameters.put("body", order.getSubject());
// 购买支付信息
setParameters(parameters, "detail", order);
OrderParaStructure.loadParameters(parameters, "detail", order);
// 订单号
parameters.put(OUT_TRADE_NO, order.getOutTradeNo());
parameters.put("spbill_create_ip", StringUtils.isEmpty(order.getSpbillCreateIp()) ? "192.168.1.150" : order.getSpbillCreateIp());
// 总金额单位为分
parameters.put("total_fee", Util.conversionCentAmount(order.getPrice()));
setParameters(parameters, "attach", order.getAddition());
OrderParaStructure.loadParameters(parameters, "attach", order.getAddition());
initNotifyUrl(parameters, order);
parameters.put("trade_type", order.getTransactionType().getType());
if (null != order.getExpirationTime()) {
@@ -229,11 +244,11 @@ public class WxPayService extends BasePayService<WxPayConfigStorage> implements
((WxTransactionType) order.getTransactionType()).setAttribute(parameters, order);
//可覆盖参数
/* setParameters(parameters, "notify_url", order);
setParameters(parameters, "goods_tag", order);
setParameters(parameters, "limit_pay", order);
setParameters(parameters, "receipt", order);
setParameters(parameters, "product_id", order);*/
/* OrderParaStructure.loadParameters(parameters, "notify_url", order);
OrderParaStructure.loadParameters(parameters, "goods_tag", order);
OrderParaStructure.loadParameters(parameters, "limit_pay", order);
OrderParaStructure.loadParameters(parameters, "receipt", order);
OrderParaStructure.loadParameters(parameters, "product_id", order);*/
parameters.putAll(order.getAttrs());
parameters = preOrderHandler(parameters, order);
setSign(parameters);
@@ -514,8 +529,8 @@ public class WxPayService extends BasePayService<WxPayConfigStorage> implements
private Map<String, Object> initNotifyUrl(Map<String, Object> parameters, Order order) {
setParameters(parameters, "notify_url", payConfigStorage.getNotifyUrl());
setParameters(parameters, "notify_url", order);
OrderParaStructure.loadParameters(parameters, "notify_url", payConfigStorage.getNotifyUrl());
OrderParaStructure.loadParameters(parameters, "notify_url", order);
return parameters;
}
@@ -530,16 +545,16 @@ public class WxPayService extends BasePayService<WxPayConfigStorage> implements
//获取公共参数
Map<String, Object> parameters = getPublicParameters();
setParameters(parameters, "transaction_id", refundOrder.getTradeNo());
setParameters(parameters, OUT_TRADE_NO, refundOrder.getOutTradeNo());
setParameters(parameters, "out_refund_no", refundOrder.getRefundNo());
OrderParaStructure.loadParameters(parameters, "transaction_id", refundOrder.getTradeNo());
OrderParaStructure.loadParameters(parameters, OUT_TRADE_NO, refundOrder.getOutTradeNo());
OrderParaStructure.loadParameters(parameters, "out_refund_no", refundOrder.getRefundNo());
parameters.put("total_fee", Util.conversionCentAmount(refundOrder.getTotalAmount()));
parameters.put("refund_fee", Util.conversionCentAmount(refundOrder.getRefundAmount()));
initNotifyUrl(parameters, refundOrder);
if (null != refundOrder.getCurType()) {
parameters.put("refund_fee_type", refundOrder.getCurType().getType());
}
setParameters(parameters, "refund_desc", refundOrder.getDescription());
OrderParaStructure.loadParameters(parameters, "refund_desc", refundOrder.getDescription());
//附加参数,这里可进行覆盖前面所有参数
parameters.putAll(refundOrder.getAttrs());
//设置签名
@@ -559,9 +574,9 @@ public class WxPayService extends BasePayService<WxPayConfigStorage> implements
//获取公共参数
Map<String, Object> parameters = getPublicParameters();
setParameters(parameters, "transaction_id", refundOrder.getTradeNo());
setParameters(parameters, OUT_TRADE_NO, refundOrder.getOutTradeNo());
setParameters(parameters, "out_refund_no", refundOrder.getRefundNo());
OrderParaStructure.loadParameters(parameters, "transaction_id", refundOrder.getTradeNo());
OrderParaStructure.loadParameters(parameters, OUT_TRADE_NO, refundOrder.getOutTradeNo());
OrderParaStructure.loadParameters(parameters, "out_refund_no", refundOrder.getRefundNo());
//设置签名
setSign(parameters);
return requestTemplate.postForObject(getReqUrl(WxTransactionType.REFUNDQUERY), XML.getMap2Xml(parameters), JSONObject.class);
@@ -601,7 +616,7 @@ public class WxPayService extends BasePayService<WxPayConfigStorage> implements
//目前只支持日账单
parameters.put("bill_date", DateUtils.formatDate(billDate, DateUtils.YYYYMMDD));
String fileType = billType.getFileType();
setParameters(parameters, "tar_type", fileType);
OrderParaStructure.loadParameters(parameters, "tar_type", fileType);
//设置签名
setSign(parameters);
Map<String, Object> ret = new HashMap<String, Object>(3);
@@ -758,8 +773,8 @@ public class WxPayService extends BasePayService<WxPayConfigStorage> implements
//获取公共参数
Map<String, Object> parameters = getPublicParameters();
setParameters(parameters, OUT_TRADE_NO, outTradeNoBillType);
setParameters(parameters, "transaction_id", (String) transactionIdOrBillDate);
OrderParaStructure.loadParameters(parameters, OUT_TRADE_NO, outTradeNoBillType);
OrderParaStructure.loadParameters(parameters, "transaction_id", (String) transactionIdOrBillDate);
//设置签名
setSign(parameters);
return requestTemplate.postForObject(getReqUrl(transactionType), XML.getMap2Xml(parameters), JSONObject.class);