引言:为什么需要集成第三方支付?

在现代互联网应用中,支付功能几乎是不可或缺的一部分。无论是电商、在线教育、还是共享经济平台,支持多种支付方式显著都能提升用户体验。微信支付和支付宝作为国内最常用的支付工具,几乎覆盖了所有场景。

本文将以一个简单的电商项目为例,详细讲解如何在 Spring Boot 项目中集成微信支付和支付宝支付。我们将从零开始,逐步完成支付功能的开发和测试,确保每个细节都清晰明了。


第一部分:准备工作

1.1 项目依赖

首先,我们需要在 pom.xml 中添加支付相关的依赖:

<dependencies>
    <!-- 支付宝支付依赖 -->
    <dependency>
        <groupId>com.alipay.sdk</groupId> 
        <artifactId>alipay-sdk-java</artifactId>
        <version>4.11.0</version>
    </dependency>
 
    <!-- 微信支付依赖 -->
    <dependency>
        <groupId>com.github.binarywang</groupId> 
        <artifactId>weixin-java-pay</artifactId>
        <version>4.2.0</version>
    </dependency>
 
    <!-- Spring Boot Web -->
    <dependency>
        <groupId>org.springframework.boot</groupId> 
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>

1.2 支付宝与微信支付的 API 配置

在 application.properties 中添加支付相关的配置:

# 支付宝配置 
alipay.app.id=your_app_id  
alipay.merchant.private.key=your_private_key  
alipay.alipay.public.key=alipay_public_key  
 
# 微信支付配置 
wxpay.mch.id=your_mch_id  
wxpay.api.secret=your_api_secret  
wxpay.notify.url=http://localhost:8080/wxpay/notify  

第二部分:支付宝支付集成

2.1 支付宝支付原理

支付宝支付分为以下几个步骤:

  1. 生成支付链接:用户提交订单后,后端生成支付宝支付链接。
  2. 跳转到支付宝页面:用户点击链接跳转到支付宝页面完成支付。
  3. 支付成功回调:支付宝支付成功后,会回调后端通知 URL。

2.2 创建支付宝支付工具类

@Component 
public class AlipayUtil {
 
    @Value("${alipay.app.id}") 
    private String appId;
 
    @Value("${alipay.merchant.private.key}") 
    private String privateKey;
 
    @Value("${alipay.alipay.public.key}") 
    private String publicKey;
 
    public String createPayUrl(Map<String, String> params) throws Exception {
        AlipayTradePagePayRequestBuilder builder = new AlipayTradePagePayRequestBuilder()
                .setSubject(params.get("subject")) 
                .setTotalAmount(params.get("totalAmount")) 
                .setOutTradeNo(params.get("outTradeNo")) 
                .setReturnUrl("http://localhost:8080/pay/success")
                .setNotifyUrl("http://localhost:8080/alipay/notify");
 
        AlipayTradeService tradeService = new AlipayTradeServiceImpl.ClientBuilder()
                .setappId(appId)
                .setPrivateKey(privateKey)
                .setAlipayPublicKey(publicKey)
                .build();
 
        return tradeService.pagePay(builder.build(),  "GET", "UTF-8");
    }
}

2.3 创建支付宝支付 Controller

@RestController 
@RequestMapping("/alipay")
public class AlipayController {
 
    @Autowired 
    private AlipayUtil alipayUtil;
 
    @PostMapping("/createOrder")
    public ResponseEntity<String> createOrder(@RequestBody Map<String, String> params) {
        try {
            String payUrl = alipayUtil.createPayUrl(params); 
            return ResponseEntity.ok(payUrl); 
        } catch (Exception e) {
            return ResponseEntity.badRequest().body(" 支付链接生成失败");
        }
    }
 
    @PostMapping("/notify")
    public ResponseEntity<String> notify(@RequestParam Map<String, String> params) {
        // 处理支付宝回调 
        return ResponseEntity.ok("success"); 
    }
}

第三部分:微信支付集成

3.1 微信支付原理

微信支付分为以下几个步骤:

  1. 生成预支付交易单:用户提交订单后,后端生成预支付交易单。
  2. 调起微信支付:前端通过 wx.chooseWXPay 调起微信支付界面。
  3. 支付成功回调:微信支付成功后,会回调后端通知 URL。

3.2 创建微信支付工具类

@Component 
public class WxPayUtil {
 
    @Value("${wxpay.mch.id}") 
    private String mchId;
 
    @Value("${wxpay.api.secret}") 
    private String apiSecret;
 
    @Value("${wxpay.notify.url}") 
    private String notifyUrl;
 
    public WxPayConfig wxPayConfig() {
        WxPayConfig config = new WxPayConfig();
        config.setMchId(mchId); 
        config.setApiSecret(apiSecret); 
        config.setNotifyUrl(notifyUrl); 
        return config;
    }
 
    public Map<String, String> createOrder(Map<String, String> params) throws Exception {
        WxPay wxPay = new WxPay(wxPayConfig());
        Map<String, String> data = new HashMap<>();
        data.put("body",  params.get("body")); 
        data.put("out_trade_no",  params.get("out_trade_no")); 
        data.put("total_fee",  params.get("total_fee")); 
        data.put("spbill_create_ip",  "127.0.0.1");
        data.put("notify_url",  notifyUrl);
        data.put("trade_type",  "NATIVE");
 
        return wxPay.pay(data); 
    }
}

3.3 创建微信支付 Controller

@RestController 
@RequestMapping("/wxpay")
public class WxPayController {
 
    @Autowired 
    private WxPayUtil wxPayUtil;
 
    @PostMapping("/createOrder")
    public ResponseEntity<Map<String, String>> createOrder(@RequestBody Map<String, String> params) {
        try {
            Map<String, String> payInfo = wxPayUtil.createOrder(params); 
            return ResponseEntity.ok(payInfo); 
        } catch (Exception e) {
            return ResponseEntity.badRequest().body(null); 
        }
    }
 
    @PostMapping("/notify")
    public ResponseEntity<String> notify(HttpServletRequest request) throws IOException {
        // 处理微信支付回调 
        return ResponseEntity.ok("success"); 
    }
}

第四部分:统一支付接口

为了方便前端调用,我们可以创建一个统一的支付接口:

@RestController 
@RequestMapping("/pay")
public class PayController {
 
    @Autowired 
    private AlipayController alipayController;
 
    @Autowired 
    private WxPayController wxPayController;
 
    @PostMapping("/{type}")
    public ResponseEntity<?> pay(@PathVariable String type, @RequestBody Map<String, String> params) {
        if ("alipay".equals(type)) {
            return alipayController.createOrder(params); 
        } else if ("wxpay".equals(type)) {
            return wxPayController.createOrder(params); 
        }
        return ResponseEntity.badRequest().body(" 支付方式不支持");
    }
}

第五部分:实际应用中的注意事项

5.1 支付安全

  • 所有敏感信息(如 API 密钥、私钥等)应加密存储。
  • 支付回调地址必须是外网可访问的 URL。

5.2 支付异步处理

  • 支付回调逻辑应尽量简单,避免阻塞。
  • 使用消息队列(如 Kafka)处理异步任务。

5.3 测试环境搭建

  • 使用支付宝和微信的沙箱环境进行测试。
  • 确保测试环境与生产环境隔离。

第六部分:总结与展望

通过本文的学习,你应该已经掌握了如何在 Spring Boot 项目中集成微信支付和支付宝支付。从配置到编码再到测试,每一步都至关重要。未来,你可以进一步扩展支付功能,例如:

  • 支持更多支付方式:如银联支付、Apple Pay 等。
  • 完善退款功能:实现订单退款和部分退款。
  • 增加支付状态监控:实时监控支付状态并进行相应的处理。

互动环节:你对支付集成还有哪些疑问?

在实际开发中,你是否遇到了支付集成的困难?或者你对本文的内容还有哪些疑问?欢迎在评论区留言交流!我会定期查看并回复大家的问题。


希望这篇文章能够帮助你在 Spring Boot 项目中顺利集成微信支付和支付宝支付!如果你觉得这篇文章对你有帮助,请记得点赞和分享给更多的小伙伴哦!😊

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐