package test;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.annotation.Resource;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
// 定义支付方式接口,子类根据不同的付款方式实现
interface BasePayMethodService extends InitializingBean {
String pay(Order order);
void handleCallback(String callbackData);
}
class WeChatPayService implements BasePayMethodService {
@Resource
private PayMethodManager payMethodManager;
@Override
public String pay(Order order) {
//付款开发
return "订单付款100元!";
}
@Override
public void handleCallback(String callbackData) {
//回调处理开发
System.out.println("微信支付回调处理!");
}
@Override
public void afterPropertiesSet() {
payMethodManager.addPayMethod("WeChat", this);
}
}
// 获取配置文件里设置的付费方式
//todo 还需实现基于Webhook的配置文件刷新
@Configuration
@ConfigurationProperties(prefix = "pay.method")
class PayMethodConfig {
public volatile List<String> payMethodList;
public List<String> getPayMethodList() {
return payMethodList;
}
}
// 创建支付方式管理器
class PayMethodManager {
@Resource
private PayMethodConfig payMethodConfig;
private static volatile ConcurrentHashMap<String, BasePayMethodService> payMethodServiceMap = new ConcurrentHashMap<>();
public void addPayMethod(String payMethod, BasePayMethodService service) {
payMethodServiceMap.put(payMethod, service);
}
public String pay(Order order, String payMethod) {
//根据配置文件里配置的允许支付方法和支付方式管理器里注册的支付方法判断是否可以支付
if (payMethodConfig.getPayMethodList().contains(payMethod) && payMethodServiceMap.containsKey(payMethod)) {
return payMethodServiceMap.get(payMethod).pay(order);
} else {
return "不支持该付款方式!";
}
}
public void handleCallback(String payMethod, String callbackData) {
if (payMethodServiceMap.containsKey(payMethod)) {
payMethodServiceMap.get(payMethod).handleCallback(callbackData);
}
}
}
// 定义商人类
@Data
@AllArgsConstructor
@NoArgsConstructor
class Merchant {
private int id;
private String name;
private String payMethod;
}
class Order {
private int id;
private String productId;
}
// 主系统入口
public class MainSystem {
public static void main(String[] args) {
// 初始化支付方式管理器
PayMethodManager payMethodManager = new PayMethodManager();
// 添加其他支付方式插件
// 获取商人信息,存到数据库或缓存
Merchant merchant = new Merchant();
// 进行订单处理和支付
Order order = new Order();
String payMethod = merchant.getPayMethod();
String result = payMethodManager.pay(order, payMethod);
// 保存支付结果刀数据库
// 处理支付回调
String callbackData = "";
payMethodManager.handleCallback(payMethod, callbackData);
// 其他业务
}
}
多支付方式架构,实现热插拔
于 2023-11-16 19:18:05 首次发布