Spring Boot 集成支付宝、微信等支付平台API

news2024/9/20 19:53:36

Spring Boot 集成支付宝、微信等支付平台API

在现代的 Web 应用程序开发中,与第三方 API 的集成是非常常见的需求。例如,支付宝、微信等支付平台的支付接口、短信验证码的发送接口、邮件发送接口等。Spring Boot 提供了许多便捷的方式来集成这些第三方 API,本文将介绍如何在 Spring Boot 中集成支付宝和微信支付接口。

在这里插入图片描述

集成支付宝支付接口

1. 准备工作

在开始之前,我们需要先注册一个支付宝开发者账号,并且创建一个应用。创建应用的过程中,我们需要获取到应用的 APP_IDAPP_PRIVATE_KEYALIPAY_PUBLIC_KEY 三个值,这些值将在后面的代码中使用。

2. 添加依赖

pom.xml 文件中添加以下依赖:

<dependency>
    <groupId>com.alipay.sdk</groupId>
    <artifactId>alipay-sdk-java</artifactId>
    <version>4.16.1046.ALL</version>
</dependency>

3.编写代码

3.1 初始化支付宝客户端

在代码中初始化支付宝客户端,代码如下:

import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;

public class AliPayUtil {
    private static final String APP_ID = "your_app_id";
    private static final String APP_PRIVATE_KEY = "your_app_private_key";
    private static final String ALIPAY_PUBLIC_KEY = "alipay_public_key";
    private static final String CHARSET = "UTF-8";
    private static final String GATEWAY_URL = "https://openapi.alipay.com/gateway.do";

    public static AlipayClient getAlipayClient() {
        return new DefaultAlipayClient(GATEWAY_URL, APP_ID, APP_PRIVATE_KEY, "json", CHARSET, ALIPAY_PUBLIC_KEY, "RSA2");
    }
}

3.2 发起支付请求

在代码中发起支付请求,代码如下:

import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.request.AlipayTradePagePayRequest;
import com.alipay.api.response.AlipayTradePagePayResponse;

public class AliPayUtil {
    // 省略上面的代码

    public static String pay(String outTradeNo, String totalAmount, String subject, String returnUrl) throws AlipayApiException {
        AlipayClient alipayClient = getAlipayClient();

        AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();
        request.setReturnUrl(returnUrl);
        request.setNotifyUrl("your_notify_url");

        request.setBizContent("{\"out_trade_no\":\"" + outTradeNo + "\","
                + "\"total_amount\":\"" + totalAmount + "\","
                + "\"subject\":\"" + subject + "\","
                + "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");

        AlipayTradePagePayResponse response = alipayClient.pageExecute(request);
        return response.getBody();
    }
}

在上面的代码中,我们首先获取了一个 AlipayClient 对象,该对象需要传入 GATEWAY_URLAPP_IDAPP_PRIVATE_KEYALIPAY_PUBLIC_KEY 等参数来初始化。然后我们构造了一个 AlipayTradePagePayRequest 对象,该对象包含了我们需要支付的订单信息,如 out_trade_no(订单号)、total_amount(订单金额)、subject(订单标题)等等。最后,我们通过 alipayClient.pageExecute(request) 方法发起了支付请求,并且返回了支付宝的响应结果。

4. 整合到 Spring Boot 项目中

我们可以将上面的代码整合到 Spring Boot 项目中,使得我们可以在 Spring Boot 应用程序中方便地使用支付宝支付接口。下面是整合到 Spring Boot 的代码:

import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.request.AlipayTradePagePayRequest;
import com.alipay.api.response.AlipayTradePagePayResponse;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component
public class AliPayUtil {
    @Value("${alipay.appId}")
    private String appId;

    @Value("${alipay.privateKey}")
    private String privateKey;

    @Value("${alipay.publicKey}")
    private String publicKey;

    @Value("${alipay.charset}")
    private String charset;

    @Value("${alipay.gatewayUrl}")
    private String gatewayUrl;

    @Value("${alipay.returnUrl}")
    private String returnUrl;

    public AlipayClient getAlipayClient() {
        return new DefaultAlipayClient(gatewayUrl, appId, privateKey, "json", charset, publicKey, "RSA2");
    }

    public String pay(String outTradeNo, String totalAmount, String subject) throws AlipayApiException {
        AlipayClient alipayClient = getAlipayClient();

        AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();
        request.setReturnUrl(returnUrl);
        request.setNotifyUrl("your_notify_url");

        request.setBizContent("{\"out_trade_no\":\"" + outTradeNo + "\","
                + "\"total_amount\":\"" + totalAmount + "\","
                + "\"subject\":\"" + subject + "\","
                + "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");

        AlipayTradePagePayResponse response = alipayClient.pageExecute(request);
        return response.getBody();
    }
}

在上面的代码中,我们使用了 Spring Boot 的 @Value 注解来从 application.properties 文件中获取配置信息,这些配置信息包括 appIdprivateKeypublicKeycharsetgatewayUrlreturnUrl 等等。然后我们将 AliPayUtil 类声明为 Spring Boot 的 @Component,这样我们就可以在其他 Spring Bean 中使用它了。

集成微信支付接口

1. 准备工作

在开始之前,我们需要先注册一个微信支付商户账号,并且创建一个应用。创建应用的过程中,我们需要获取到应用的 APP_IDMCH_IDAPI_KEY 三个值,这些值将在后面的代码中使用。

2. 添加依赖

pom.xml 文件中添加以下依赖:

<dependency>
    <groupId>com.github.wxpay</groupId>
    <artifactId>wxpay-sdk</artifactId>
    <version>3.0.10</version>
</dependency>

3. 编写代码

3.1 初始化微信支付客户端

在代码中初始化微信支付客户端,代码如下:

import com.github.wxpay.sdk.WXPay;
import com.github.wxpay.sdk.WXPayConfigImpl;

import java.io.InputStream;

public class WxPayUtil {
    private static final String APP_ID = "your_app_id";
    private static final String MCH_ID = "your_mch_id";
    private static final String API_KEY = "your_api_key";

    public static WXPay getWXPay() throws Exception {
        InputStream inputStream = WxPayUtil.class.getResourceAsStream("/cert/apiclient_cert.p12");
        WXPayConfigImpl wxPayConfig = WXPayConfigImpl.getInstance(APP_ID, MCH_ID, API_KEY, inputStream);

        return new WXPay(wxPayConfig);
    }
}

在上面的代码中,我们首先获取了一个 InputStream 对象,该对象是我们在微信支付商户平台上下载的证书文件,用于证明我们的身份。然后我们构造了一个 WXPayConfigImpl 对象,该对象需要传入 APP_IDMCH_IDAPI_KEY 等参数来初始化,同时还需要传入证书文件的 InputStream。最后,我们通过 new WXPay(wxPayConfig) 方法获取了一个 WXPay 对象。

3.2 发起支付请求

在代码中发起支付请求,代码如下:

import com.github.wxpay.sdk.WXPay;
import com.github.wxpay.sdk.WXPayUtil;

import java.util.HashMap;
import java.util.Map;

public class WxPayUtil {
    // 省略上面的代码

    public static Map<String, String> pay(String outTradeNo, String totalFee, String body, String spbillCreateIp) throws Exception {
        WXPay wxPay = getWXPay();

        Map<String, String> data = new HashMap<>();
        data.put("body", body);
        data.put("out_trade_no", outTradeNo);
        data.put("device_info", "");
        data.put("fee_type", "CNY");
        data.put("total_fee", totalFee);
        data.put("spbill_create_ip", spbillCreateIp);
        data.put("notify_url", "your_notify_url");
        data.put("trade_type", "NATIVE");

        Map<String, String> response = wxPay.unifiedOrder(data);
        if ("SUCCESS".equals(response.get("return_code")) && "SUCCESS".equals(response.get("result_code"))) {
            return response;
        } else {
            throw new Exception(response.get("return_msg"));
        }
    }
}

在上面的代码中,我们首先获取了一个 WXPay 对象,该对象需要传入 APP_IDMCH_IDAPI_KEY 等参数来初始化,同时还需要传入证书文件的 InputStream。然后我们构造了一个 data 对象,该对象包含了我们需要支付的订单信息,如 body(商品描述)、out_trade_no(订单号)、fee_type(货币类型)、total_fee(订单金额)、spbill_create_ip(终端IP)等等。最后,我们通过 wxPay.unifiedOrder(data) 方法发起了支付请求,并且返回了微信支付的响应结果。

4. 整合到 Spring Boot 项目中

我们可以将上面的代码整合到 Spring Boot 项目中,使得我们可以在 Spring Boot 应用程序中方便地使用微信支付接口。下面是整合到 Spring Boot 的代码:

import com.github.wxpay.sdk.WXPay;
import com.github.wxpay.sdk.WXPayConfigImpl;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.Resource;
import org.springframework.stereotype.Component;

import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;

@Component
public class WxPayUtil {
    @Value("${wxpay.appId}")
    private String appId;

    @Value("${wxpay.mchId}")
    private String mchId;

    @Value("${wxpay.apiKey}")
    private String apiKey;

    @Value("${wxpay.certPath}")
    private Resource certPath;

    public WXPay getWXPay() throws Exception {
        InputStream inputStream = certPath.getInputStream();
        WXPayConfigImpl wxPayConfig = WXPayConfigImpl.getInstance(appId, mchId, apiKey, inputStream);

        return new WXPay(wxPayConfig);
    }

    public Map<String, String> pay(String outTradeNo, String totalFee, String body, String spbillCreateIp) throws Exception {
        WXPay wxPay = getWXPay();

        Map<String, String> data = new HashMap<>();
        data.put("body", body);
        data.put("out_trade_no", outTradeNo);
        data.put("device_info", "");
        data.put("fee_type", "CNY");
        data.put("total_fee", totalFee);
        data.put("spbill_create_ip", spbillCreateIp);
        data.put("notify_url", "your_notify_url");
        data.put("trade_type", "NATIVE");

        Map<String, String> response = wxPay.unifiedOrder(data);
        if ("SUCCESS".equals(response.get("return_code")) && "SUCCESS".equals(response.get("result_code"))) {
            return response;
        } else {
            throw new Exception(response.get("return_msg"));
        }
    }
}

在上面的代码中,我们使用了 Spring Boot 的 @Value 注解来从 application.properties 文件中获取配置信息,这些配置信息包括 appIdmchIdapiKeycertPath 等等。然后我们将 WxPayUtil 类声明为 Spring Boot 的 @Component,这样我们就可以在其他 Spring Bean 中使用它了。

结论

在本文中,我们介绍了如何在 Spring Boot 中集成支付宝和微信支付接口。我们首先介绍了如何初始化支付宝和微信支付客户端,然后介绍了如何发起支付请求。最后,我们将这些代码整合到了 Spring Boot 项目中,使得我们可以在 Spring Boot 应用程序中方便地使用支付宝和微信支付接口。

值得一提的是,本文中的代码仅仅是支付接口调用的基础示例,实际在生产环境中,我们需要更多的安全措施,例如在支付请求中添加签名信息、验证支付结果的签名信息等等。同时,我们也需要考虑支付过程中可能出现的异常情况,例如支付超时、支付失败等等,以及如何处理这些异常情况。

总之,集成第三方 API 是一个经常出现的需求,我们需要掌握相关的技能来满足这个需求。希望本文可以帮助你更好地理解在 Spring Boot 中集成支付宝和微信支付接口的基本流程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/594556.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python实战基础17-包

1、pip的安装配置 1.1 pip命令的使用 在安装python时&#xff0c;同时还会安装pip软件&#xff0c;它是python的包管理工具&#xff0c;可以用来查找、下载、安装和卸载python的第三方资源包。 1.2 配置pip 可以直接在终端输入pip命令&#xff0c;如果出错可能会有两个原因…

接口自动化测试实战:JMeter+Ant+Jenkins+钉钉机器人群通知完美结合

目录 前言 一、本地JAVA环境安装配置&#xff0c;安装JAVA8和JAVA17 二、安装和配置Jmeter 三、安装和配置ant 四、jmeter ant配置 五、jenkins安装和配置持续构建项目 文末福利 前言 搭建jmeterantjenkins环境有些前提条件&#xff0c;那就是要先配置好java环境&#…

OS-内存管理-4种内存管理方式(连续分配,页式,段式,段页)。

一&#xff0c;内存管理四种方式。 二&#xff0c;连续分配管理方式。 连续分配方式&#xff1a;为用户分配连续的内存空间。 1.单一连续分配方式 2.固定分区分配方式 3.动态分区分配方式 4.三种连续分配方式的对比。 三&#xff0c;基于页式存储管理。 1.页式 为进一步提高…

【来不及刷题之】32、二分搜索(寻找数,寻找左右边界)

1. 基础二分搜索&#xff1a;寻找一个数 一道很基础的题目&#xff0c;主要注意一下循环条件是 left<right 即可 class Solution {public int search(int[] nums, int target) {int left0;int rightnums.length-1;while(left<right){int midleft(right-left)/2;if(nums…

第二十一章行为性模式—访问者模式

文章目录 访问者模式解决的问题结构实例存在的问题使用场景 拓展动态分派静态分派双分派 行为型模式用于描述程序在运行时复杂的流程控制&#xff0c;即描述多个类或对象之间怎样相互协作共同完成单个对象无法单独完成的任务&#xff0c;它涉及算法与对象间职责的分配。行为型模…

华为OD机试真题B卷 Java 实现【箱子之形摆放】,附详细解题思路

一、题目描述 要求将一批箱子按从上到下以‘之’字形的顺序摆放在宽度为 n 的空地上&#xff0c;输出箱子的摆放位置&#xff0c;例如&#xff1a;箱子ABCDEFG&#xff0c;空地宽为3。 摆放效果如下图&#xff1a; 则输出结果为&#xff1a; AFG BE CD 二、输入描述 一行…

智能语音交互流程

引言 用该文来讲解语音全流程涉及到的技术&#xff0c;整体语音涉及的交互流程如下图&#xff1a; Part1 唤醒 语音唤醒指的是通过预设的关键词即可将智能硬件从休眠状态唤醒&#xff0c;来执行相应操作。 1.1 交互模式 传统模式 唤醒方式&#xff1a;先唤醒设备&#xff…

重学数据结构与算法

学习数据结构与算法的目的&#xff1a; 优化时间复杂度与空间复杂度 优化时间复杂度与空间复杂度 优化时间复杂度与空间复杂度 教程总纲&#xff1a; 暴力解法(模拟)、算法优化(递归/二分/排序/DP)、时刻转换(数据结构) 1.时间复杂度的核心方法论2.增删查——选取数据结构的基…

MySQL_9 事务机制与隔离机制

目录 一、事务概述 1.定义 : 2.事务和锁 : 二、事务操作 1.MySQL控制台事务的基本操作 : 2.代码演示 : 3.注意事项 : 三、事务的“ACID”特性 : 四、隔离机制 1.介绍 : 2.分类 : 3.常用指令 : 一、事务概述 1.定义 : 事务用于保证数据的一致性&#xff0c;它由一…

python批量实现pdf转换为图片|实现pdf转为jpg/png|实现word批量转pdf|python批量实现word转换为图片

本文介绍了一种使用 Python 脚本来完成这项工作的方法&#xff0c;该脚本基于 PyMuPDF、pdf2image 和 win32com 库实现&#xff0c;可以帮助您快速地将 Word 文档转换为 PDF 文件&#xff0c;并将 PDF 文件转换为 PNG 图片。 一、安装所需的库和软件 在开始使用该脚本之前&am…

AWTK实现汽车仪表Cluster/DashBoard嵌入式GUI开发(一):概述

AWTK=Toolkit AnyWhere,一款国产免费开源工具,ZLG开发的开源GUI引擎,为嵌入式等系统提供图形界面开发IDE。 随着汽车技术的发展,汽车仪表盘也在快速发展,从最初的机械式到电气式,再到数字化。这次电动化、智能化又一次让汽车仪表出现了飞跃式的发展,再未来,仪表板上可…

04SpringCloud 消息中间件

为什么要使用消息中间件 同步通信&#xff1a;耗时长&#xff0c;受网络波动影响&#xff0c;不能保证高成功率&#xff0c;耦合性高。 同步&#xff0c;异步 并发&#xff1a;一段时间&#xff08;1S&#xff09;多个请求数 并行&#xff1a;时间节点&#xff0c;多个指令…

干接点与湿接点

&#xff08;1&#xff09;干接点的定义 无源开关&#xff1b;具有闭合和断开的2种状态&#xff1b;2个接点之间没有极性&#xff0c;可以互换。 常见的干接点信号有&#xff1a; 1&#xff09;各种开关如&#xff1a;限位开关、行程开关、脚踏开关、旋转开关、温度开关、液…

超越象限:解密 α 碎片的归属问题

文章目录 参考环境α 碎片的归属问题问题概述终边相同角圆心角终边相同角 象限角 描述象限角第一象限角任意象限角 特殊方案问解 叠加坐标系上部下部叠加坐标系 一般方案问解任意角 α分析绘图要领叠加坐标系N-N 参考 项目描述搜索引擎Google 、Bing百度百科首页佟大大还是ETT…

苹果iPhone14如何批量删除联系人?iPhone 14批量删除联系人方法

苹果iPhone 14如何批量删除联系人&#xff1f;手动一个个删实在太麻烦了&#xff01; 苹果iPhone 14手机的通讯录本身不支持批量删除联系人&#xff0c;但是如果通讯录在iCloud中开启过备份&#xff0c;就可以对联系人进行批量操作。 需要注意的是&#xff0c;iPhone 14手机端…

聊聊开源的类ChatGPT工作——ChatGLM

这是”聊聊开源的类ChatGPT工作“的第二篇&#xff0c;写第一篇[7]的时候&#xff0c;当时恰巧MOSS开源&#xff0c;就顺手写了MOSS。但要问目前中文领域的“开源”的语言模型谁更强&#xff0c;公认的还是ChatGLM-6B&#xff08;以下简称ChatGLM&#xff09;。 下面是官方对C…

【20230531】Git命令和Github相关使用

1 在Git中缓存GitHub凭据 根据系统下载对应的GitHub CLI 2.25.1 2. github主页&#xff0c;点击用户头像选择settings->Developer Settings->Personal access tokens申请密钥&#xff08;主要分为Fine-grained tokens和Tokens classic&#xff09;gh需要使用的是Tokens …

Spring Boot如何实现接口文档自动生成

Spring Boot如何实现接口文档自动生成 在开发Web应用程序时&#xff0c;接口文档是非常重要的一环&#xff0c;它可以帮助我们快速了解API的功能和使用方法&#xff0c;同时也是与其他开发人员和团队协作的重要工具。然而&#xff0c;手动编写和维护接口文档是一项繁琐的工作&…

商品上架业务

一.商品上架操作 将检索数据存入es&#xff0c;更改商品上架状态为已上架 二.业务设计 &#xff08;1&#xff09;设计检索数据 分析&#xff1a;商品上架在 es 中是存 sku 还是 spu&#xff1f; 1&#xff09;、检索的时候输入名字&#xff0c;是需要按照 sku 的 title 进行…

给大龄准备转行网络工程师的朋友一些建议

我一直认为&#xff0c;网络工程师是一个看能力而不是看年龄的工作。 大龄转行网络工程师到底有没有机会&#xff1f;很多三十多岁的朋友对于跨行业完全心里没底&#xff0c;冒然转行学习网工又不知道从何学起。今天就给大家整理几个在学习网络工程师的时候需要注意的地方&…