Java SpringBoot 整合实现微信支付,支付宝支付,京东支付,招商聚合支付,银联聚合支付 附代码

任职的公司项目中,一直在负责项目的支付模块。微信、支付宝是最基础的。还有京东原生支付,使用京东App扫码,支持京东白条分期付款的方式。招商聚合支付、银联聚合支付的聚合方式,将微信和支付宝支付聚合起来,获得二维码后使用微信或支付宝扫码都可以支付。之前有对接过国外信用卡的支付,也类似于聚合,不过现在没有支付配置无法集成了

简单看一下项目效果,完整代码文末有 GitHub 链接

微信支付:

支付宝支付:

京东原生支付:

UMS银联商务聚合支付:

 CMB招商聚合支付:

聚合支付链接url转二维码,使用微信或支付宝扫码后:

 

在pom文件中引入 微信支付、支付宝支付、京东支付 的sdk。招商聚合 和 银联商务支付没有sdk,直接手写的逻辑

<dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

        <!-- 微信支付扩展 -->
        <dependency>
            <groupId>com.github.binarywang</groupId>
            <artifactId>weixin-java-pay</artifactId>
            <version>4.1.0</version>
        </dependency>

        <!-- 支付宝支付扩展 -->
        <dependency>
            <groupId>com.alipay.sdk</groupId>
            <artifactId>alipay-sdk-java</artifactId>
            <version>4.39.99.ALL</version>
        </dependency>

        <!-- 京东pay -->
        <dependency>
            <groupId>com.github.javen205</groupId>
            <artifactId>IJPay-JDPay</artifactId>
            <version>2.9.10</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba.fastjson2</groupId>
            <artifactId>fastjson2</artifactId>
            <version>2.0.28</version>
        </dependency>
    </dependencies>
pom.xml

创建一个 PaymentController 包含 支付入口,查询和退款接口

package com.cnblog.payment.controller;

import com.cnblog.payment.dto.Order;
import com.cnblog.payment.vo.response.Response;
import com.cnblog.payment.enums.PaymentTypeEnum;
import com.cnblog.payment.factory.PaymentFactory;
import com.cnblog.payment.service.AliPaymentService;
import com.cnblog.payment.service.PaymentService;
import com.cnblog.payment.service.WxPaymentService;
import com.github.binarywang.wxpay.bean.notify.WxPayNotifyResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;

/**
 * 支付控制器
 * author: AnYuan
 */

@RestController
@RequestMapping("/api")
public class PaymentController {
    
    @Autowired
    private PaymentFactory paymentFactory;
    
    @PostMapping("/pay")
    public Response<?> pay(@RequestBody Order order){
    
        // 校验订单参数
        paymentFactory.checkOrder(order);
        
        PaymentService paymentService = paymentFactory.getPaymentService(PaymentTypeEnum.getByName(order.getPaymentType()));
        return paymentService.pay(order);
    }
    
    @GetMapping("/query/{orderNo}/{paymentType}")
    public Response<?> query(@PathVariable("orderNo") String orderNo, @PathVariable("paymentType") String paymentType) {
        PaymentService paymentService = paymentFactory.getPaymentService(PaymentTypeEnum.getByName(paymentType));
        return paymentService.query(orderNo);
    }
    
    @PostMapping("/refund")
    public Response<?> refund(@RequestBody Order order) {
        PaymentService paymentService = paymentFactory.getPaymentService(PaymentTypeEnum.getByName(order.getPaymentType()));
        return paymentService.refund(order);
    }
}

一个支付方式枚举类:PaymentTypeEnum

package com.cnblog.payment.enums;

import lombok.Getter;

@Getter
public enum PaymentTypeEnum {
    
    ALIPAY("支付宝支付"),
    JD("京东原生支付"),
    WXPAY("微信支付"),
    UMS("银联聚合支付"),
    CMB("招商聚合支付");
    
    private String desc;
    
    PaymentTypeEnum(String desc) {
        this.desc = desc;
    }
    
    public static PaymentTypeEnum getByName(String name) {
        for (PaymentTypeEnum paymentTypeEnum : PaymentTypeEnum.values()) {
            if (paymentTypeEnum.name().equals(name)) {
                return paymentTypeEnum;
            }
        }
        return null;
    }
}

一个支付方式工厂类。不同的支付方式只需要在支付接口传不同的 paymentType 参数即可

package com.cnblog.payment.factory;

import com.cnblog.payment.dto.Order;
import com.cnblog.payment.enums.PaymentTypeEnum;
import com.cnblog.payment.service.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * @author AnYuan
 * @description 支付工厂
 */

@Service
public class PaymentFactory {
    @Autowired
    private  WxPaymentService wxPaymentService;
    @Autowired
    private AliPaymentService alipayService;
    @Autowired
    private JdPaymentService jdPaymentService;
    @Autowired
    private UmsPaymentService umsPaymentService;
    @Autowired
    private CmbPaymentService cmbPaymentService;
    
    public void checkOrder(Order order) {
        // 校验订单参数
    }
    
    public PaymentService getPaymentService(PaymentTypeEnum paymentTypeEnum) {
        if (paymentTypeEnum == null) {
            throw new IllegalArgumentException("不支持的支付类型");
        }
        switch (paymentTypeEnum) {
            case WXPAY:
                return wxPaymentService;
            case ALIPAY:
                return alipayService;
            case JD:
                return jdPaymentService;
            case UMS:
                return umsPaymentService;
            case CMB:
                return cmbPaymentService;
            default:
                throw new IllegalArgumentException("不支持的支付类型");
        }
    }
}

上面的代码简单介绍一下大概的结构和支持的支付方式,具体的实现逻辑可以访问 Github 本篇代码

 

本篇代码Github:https://github.com/Journeyerr/cnblogs/tree/master/payment

 

posted @ 2025-03-21 11:39  安逺  阅读(1113)  评论(0)    收藏  举报