优化 支付配置校验方式,优化业务层异常抛出类型,优化支付应用渲染逻辑,添加删除支付商户 支付应用的校验,退款订单去除reqNo字段,支付订单去除 channelExtras 参数展示

This commit is contained in:
chen quan
2021-12-29 19:47:59 +08:00
parent 08103685f1
commit d556eae556
34 changed files with 267 additions and 300 deletions

View File

@ -1,10 +1,11 @@
package cn.iocoder.yudao.framework.pay.core.client;
import cn.hutool.json.JSONUtil;
import cn.iocoder.yudao.framework.pay.core.enums.PayChannelEnum;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException;
import javax.validation.Validator;
import java.util.Set;
/**
* 支付客户端的配置,本质是支付渠道的配置
@ -19,8 +20,22 @@ import javax.validation.Validator;
public interface PayClientConfig {
/**
* 验证配置参数是否正确
* 配置验证参数是
*
* @param validator 校验对象
* @return 配置好的验证参数
*/
Set<ConstraintViolation<PayClientConfig>> verifyParam(Validator validator);
/**
* 参数校验
*
* @param validator 校验对象
*/
void verifyParam(Validator validator);
default void validate(Validator validator) {
Set<ConstraintViolation<PayClientConfig>> violations = verifyParam(validator);
if (!violations.isEmpty()) {
throw new ConstraintViolationException(violations);
}
}
}

View File

@ -2,17 +2,12 @@ package cn.iocoder.yudao.framework.pay.core.client.impl.alipay;
import cn.iocoder.yudao.framework.pay.core.client.PayClientConfig;
import lombok.Data;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.Assert;
import javax.annotation.Resource;
import javax.validation.ConstraintViolation;
import javax.validation.Validator;
import javax.validation.constraints.AssertTrue;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.util.Set;
import java.util.stream.Collectors;
// TODO 芋艿:参数校验
@ -114,18 +109,9 @@ public class AlipayPayClientConfig implements PayClientConfig {
public interface ModeCertificate {
}
/**
* 验证配置参数是否正确
* @param validator 校验对象
*/
@Override
public void verifyParam(Validator validator) {
// 手动调用validate进行验证
Set<ConstraintViolation<AlipayPayClientConfig>> validate = validator.validate(this,
public Set<ConstraintViolation<PayClientConfig>> verifyParam(Validator validator) {
return validator.validate(this,
MODE_PUBLIC_KEY.equals(this.getMode()) ? ModePublicKey.class : ModeCertificate.class);
// 断言没有异常
Assert.isTrue(validate.isEmpty(), validate.stream().map(ConstraintViolation::getMessage)
.collect(Collectors.joining(",")));
}
}

View File

@ -3,7 +3,6 @@ package cn.iocoder.yudao.framework.pay.core.client.impl.wx;
import cn.hutool.core.io.IoUtil;
import cn.iocoder.yudao.framework.pay.core.client.PayClientConfig;
import lombok.Data;
import org.springframework.util.Assert;
import javax.validation.ConstraintViolation;
import javax.validation.Validator;
@ -11,7 +10,6 @@ import javax.validation.constraints.NotBlank;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.Set;
import java.util.stream.Collectors;
// TODO 芋艿:参数校验
@ -101,19 +99,9 @@ public class WXPayClientConfig implements PayClientConfig {
public interface V3 {
}
// TODO @aquan1已经有注释不用重复注释2方法名改成 validate比较适合 validator3断言是否有异常可以封一个 ConstraintViolationException 异常
/**
* 验证配置参数是否正确
* @param validator 校验对象
*/
@Override
public void verifyParam(Validator validator) {
// 手动调用validate进行验证
Set<ConstraintViolation<PayClientConfig>> validate = validator.validate(this,
this.getApiVersion().equals(API_VERSION_V2) ? V2.class : V3.class);
// 断言没有异常
Assert.isTrue(validate.isEmpty(), validate.stream().map(ConstraintViolation::getMessage)
.collect(Collectors.joining(",")));
public Set<ConstraintViolation<PayClientConfig>> verifyParam(Validator validator) {
return validator.validate(this, this.getApiVersion().equals(API_VERSION_V2) ? V2.class : V3.class);
}
public static void main(String[] args) throws FileNotFoundException {

View File

@ -17,18 +17,21 @@ import lombok.Getter;
@AllArgsConstructor
public enum PayChannelEnum {
WX_PUB("wx_pub", "微信 JSAPI 支付"), // 公众号的网页
WX_LITE("wx_lite","微信小程序支付"),
WX_APP("wx_app", "微信 App 支付"),
/**
* 公众号网页
*/
WX_PUB("wx_pub", "微信 JSAPI 支付", WXPayClientConfig.class),
WX_LITE("wx_lite", "微信小程序支付", WXPayClientConfig.class),
WX_APP("wx_app", "微信 App 支付", WXPayClientConfig.class),
ALIPAY_PC("alipay_pc", "支付宝 PC 网站支付"),
ALIPAY_WAP("alipay_wap", "支付宝 Wap 网站支付"),
ALIPAY_APP("alipay_app", "支付宝App 支付"),
ALIPAY_QR("alipay_qr", "支付宝扫码支付");
ALIPAY_PC("alipay_pc", "支付宝 PC 网站支付", AlipayPayClientConfig.class),
ALIPAY_WAP("alipay_wap", "支付宝 Wap 网站支付", AlipayPayClientConfig.class),
ALIPAY_APP("alipay_app", "支付宝App 支付", AlipayPayClientConfig.class),
ALIPAY_QR("alipay_qr", "支付宝扫码支付", AlipayPayClientConfig.class);
/**
* 编码
*
* <p>
* 参考 https://www.pingxx.com/api/支付渠道属性值.html
*/
private String code;
@ -37,6 +40,11 @@ public enum PayChannelEnum {
*/
private String name;
/**
* 配置类
*/
private Class<? extends PayClientConfig> configClass;
/**
* 微信支付
*/
@ -50,27 +58,6 @@ public enum PayChannelEnum {
public static PayChannelEnum getByCode(String code) {
return ArrayUtil.firstMatch(o -> o.getCode().equals(code), values());
}
// TODO @aquan加一个 configClass 字段,不用 switch 的方式哈。不然新增一个支付方式,需要改的方法有点多
/**
* 根据编码得到支付类
*
* @param code 编码
* @return 支付配置类
*/
public static Class<? extends PayClientConfig> findByCodeGetClass(String code) {
switch (PayChannelEnum.getByCode(code)){
case WX_PUB:
case WX_LITE:
case WX_APP:
return WXPayClientConfig.class;
case ALIPAY_PC:
case ALIPAY_WAP:
case ALIPAY_APP:
case ALIPAY_QR:
return AlipayPayClientConfig.class;
}
return null;
}
}