Spring Boot中实现支付宝、微信和银联支付的功能

news2024/11/17 3:55:01

Spring Boot中实现支付宝、微信和银联支付的功能

在Spring Boot中实现支付宝、微信和银联支付的功能,通常需要使用它们各自的SDK(Software Development Kit)。以下是一个简单的示例代码,演示了如何在Spring Boot项目中集成支付宝、微信和银联支付功能。请注意,这只是一个基本的示例,实际上,支付集成涉及更多的配置和安全考虑。

1. 集成支付宝支付

首先,你需要添加支付宝SDK的依赖。在pom.xml中添加以下依赖:

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

然后,创建一个Controller类,处理支付宝支付请求:

import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.request.AlipayTradePagePayRequest;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@RequestMapping("/alipay")
public class AlipayController {

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

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

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

    @RequestMapping(value = "/pay", method = RequestMethod.POST)
    @ResponseBody
    public String alipay(@RequestParam("outTradeNo") String outTradeNo,
                        @RequestParam("totalAmount") String totalAmount,
                        @RequestParam("subject") String subject) throws AlipayApiException {

        AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do", appId, privateKey, "json", "utf-8", publicKey, "RSA2");

        AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
        alipayRequest.setReturnUrl("回调地址");
        alipayRequest.setNotifyUrl("异步通知地址");

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

        return alipayClient.pageExecute(alipayRequest).getBody();
    }
}

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

alipay.appId=your_app_id
alipay.privateKey=your_private_key
alipay.publicKey=your_public_key

2. 集成微信支付

首先,你需要添加微信支付SDK的依赖。在pom.xml中添加以下依赖:

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

然后,创建一个Controller类,处理微信支付请求:

import com.github.wxpay.sdk.WXPay;
import com.github.wxpay.sdk.WXPayConfigImpl;
import com.github.wxpay.sdk.WXPayConstants;
import com.github.wxpay.sdk.WXPayUtil;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

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

@Controller
@RequestMapping("/wechat")
public class WechatController {

    @Value("${wechat.appId}")
    private String appId;

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

    @Value("${wechat.key}")
    private String key;

    @RequestMapping(value = "/pay", method = RequestMethod.POST)
    @ResponseBody
    public Map<String, String> wechatPay(@RequestParam("outTradeNo") String outTradeNo,
                                         @RequestParam("totalFee") String totalFee,
                                         @RequestParam("body") String body,
                                         @RequestParam("spbillCreateIp") String spbillCreateIp) throws Exception {

        WXPayConfigImpl config = new WXPayConfigImpl();
        config.setAppID(appId);
        config.setMchID(mchId);
        config.setKey(key);

        WXPay wxPay = new WXPay(config, WXPayConstants.SignType.MD5);

        Map<String, String> data = new HashMap<>();
        data.put("body", body);
        data.put("out_trade_no", outTradeNo);
        data.put("total_fee", totalFee);
        data.put("spbill_create_ip", spbillCreateIp);
        data.put("trade_type", "NATIVE");
        data.put("notify_url", "异步通知地址");

        Map<String, String> result = wxPay.unifiedOrder(data);

        if ("SUCCESS".equals(result.get("return_code")) && "SUCCESS".equals(result.get("result_code"))) {
            String codeUrl = result.get("code_url");
            // 返回给前端,用于生成支付二维码
            Map<String, String> response = new HashMap<>();
            response.put("codeUrl", codeUrl);
            return response;
        } else {
            // 处理支付失败的逻辑
            throw new Exception("微信支付失败:" + result.get("return_msg"));
        }
    }
}

application.properties中添加微信相关的配置:

wechat.appId=your_app_id
wechat.mchId=your_mch_id
wechat.key=your_key

3. 集成银联支付

首先,你需要添加银联支付SDK的依赖。在pom.xml中添加以下依赖:

<dependency>
    <groupId>cn.joylau.commons</groupId>
    <artifactId>unionpay-common</artifactId>
    <version>1.0.0</version>
</dependency>

然后,创建一个Controller类,处理银联支付请求:

import cn.joylau.commons.unionpay.acp.sdk.AcpService;
import cn.joylau.commons.unionpay.acp.sdk.LogUtil;
import cn.joylau.commons.unionpay.acp.sdk.SDKConfig;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

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

@Controller
@RequestMapping("/unionpay")
public class UnionpayController {

    @RequestMapping(value = "/pay", method = RequestMethod.POST)
    @ResponseBody
    public String unionpay(@RequestParam("orderId") String orderId,
                           @RequestParam("txnAmt") String txnAmt) {

        Map<String, String> requestData = new HashMap<>();
        // 银联分配的商户号
        requestData.put("merId", "your_mer_id");
        // 订单号,8-40位数字字母
        requestData.put("orderId", orderId);
        // 交易金额,单位分
        requestData.put("txnAmt", txnAmt);
        // 前台交易请求地址
        requestData.put("frontUrl", "前台回调地址");
        // 后台交易请求地址
        requestData.put("backUrl", "后台回调地址");
        // 其他参数...

        Map<String, String> responseData = AcpService.post(requestData, "https://gateway.95516.com/gateway/api/frontTransReq.do", "UTF-8");

        if (!AcpService.validate(responseData, "UTF-8")) {
            // 验证签名失败
            LogUtil.writeLog("验证签名失败");
            // 处理支付失败的逻辑
            return "验证签名失败";
        }

        String respCode = responseData.get("respCode");
        if ("00".equals(respCode)) {
            // 支付成功,处理业务逻辑
            return "支付成功";
        } else {
            // 支付失败,处理业务逻辑
            return "支付失败:" + responseData.get("respMsg");
        }
    }
}

application.properties中添加银联相关的配置:

# 银联商户号
acpsdk.merId=your_mer_id
# 银联签名私钥
acpsdk.signCert.path=/path/to/your_sign_cert.pfx
# 银联签名私钥密码
acpsdk.signCert.pwd=your_sign_cert_password
# 银联验签公钥
acpsdk.validateCert.dir=/path/to/your_validate_cert_dir
# 银联对账文件下载地址
acpsdk.fileTransUrl=https://filedownload.95516.com/

以上代码仅为示例,实际情况中需要根据具体需求进行适当调整。请确保在生产环境中采取必要的安全措施,如使用HTTPS、加密敏感信息等。

示例中完整代码,可以从下面网址获取:

https://gitee.com/jlearning/wechatdemo.git

https://github.com/icoderoad/wxdemo.git

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

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

相关文章

22. 深度学习 - 自动求导

Hi&#xff0c;你好。我是茶桁。 咱们接着上节课内容继续讲&#xff0c;我们上节课已经了解了拓朴排序的原理&#xff0c;并且简单的模拟实现了。我们这节课就来开始将其中的内容变成具体的计算过程。 linear, sigmoid和loss这三个函数的值具体该如何计算呢&#xff1f; 我们…

使用Spring Boot结合JustAuth实现支付宝、微信、微博扫码登录功能

使用Spring Boot结合JustAuth实现支付宝、微信、微博扫码登录功能 在使用Spring Boot结合JustAuth实现支付宝、微信、微博扫码登录功能之前&#xff0c;需要先确保已经配置好Spring Boot项目&#xff0c;并且添加了JustAuth的依赖。你可以在项目的pom.xml文件中添加如下依赖&a…

麦克风阵列入门

文章引注&#xff1a; http://t.csdnimg.cn/QP7uC 一、麦克风阵列的定义 所谓麦克风阵列其实就是一个声音采集的系统&#xff0c;该系统使用多个麦克风采集来自于不同空间方向的声音。麦克风按照指定要求排列后&#xff0c;加上相应的算法&#xff08;排列算法&#xff09;就可…

2 Redis的高级数据结构

1、Bitmaps 首先&#xff0c;最经典的应用场景就是用户日活的统计&#xff0c;比如说签到等。 字段串&#xff1a;“dbydc”&#xff0c;根据对应的ASCII表&#xff0c;最后可以得到对应的二进制&#xff0c;如图所示 一个字符占8位&#xff08;bit&#xff09;&#xff0c;…

【GCN】GCN学习笔记一

谱域图卷积 卷积 卷积定义离散空间的卷积 图卷积简介 卷积定理谱域图卷积实现思路如何定义图上的傅里叶变换拉普拉斯矩阵 &#xff08;Laplacian Matrix&#xff09;拉普拉斯矩阵的性质拉普拉斯矩阵的谱分解拉普拉斯矩阵与拉普拉斯算子 图傅里叶变换 图上的信号表示经典傅里叶变…

常见Web安全

一.Web安全概述 以下是百度百科对于web安全的解释&#xff1a; Web安全&#xff0c;计算机术语&#xff0c;随着Web2.0、社交网络、微博等等一系列新型的互联网产品的诞生&#xff0c;基于Web环境的互联网应用越来越广泛&#xff0c;企业信息化的过程中各种应用都架设在Web平台…

性格懦弱怎么办?如何改变懦弱的性格?

性格懦弱是一个比较常见的话题了&#xff0c;懦弱带来的苦恼和困扰&#xff0c;深深影响着我们的生活&#xff0c;人际关系&#xff0c;以及事业的发展。然后如何摆脱懦弱&#xff0c;却并非易事&#xff0c;尤其是对于成年人来说&#xff0c;这种懦弱的性格特征&#xff0c;已…

关于缓存和数据库一致性问题的深入研究

如何保证缓存和数据库一致性&#xff0c;这是一个老生常谈的话题了。 但很多人对这个问题&#xff0c;依旧有很多疑惑&#xff1a; 到底是更新缓存还是删缓存&#xff1f;到底选择先更新数据库&#xff0c;再删除缓存&#xff0c;还是先删除缓存&#xff0c;再更新数据库&…

算法设计与分析复习--贪心(一)

文章目录 上一篇贪心的性质活动安排问题贪心背包问题最优装载哈夫曼编码下一篇 上一篇 算法设计与分析复习–动态规划 贪心的性质 贪心和动态规划都要求问题具有最优子结构&#xff1b; 可用贪心方法时&#xff0c;动态规划可能不适用 可用动态规划方法时&#xff0c;贪心方法…

C/C++关于main函数参数问题

文章目录 前言不带参数的main带参数的main为什么会有带参数的main总结 前言 每次写C/C程序&#xff0c;基本上就是一个int main(){return 0;}。但是后来在linux里面涉及到很多带参数的main函数&#xff0c;我一直不太理解&#xff0c;这里就写篇博客记录一下。 不带参数的main…

10、背景分离 —— 大津算法

上一节学习了通过一些传统计算机视觉算法,比如Canny算法来完成一个图片的边缘检测,从而可以区分出图像的边缘。 今天再看一个视觉中更常见的应用,那就是把图片的前景和背景的分离。 前景和背景 先看看什么是前景什么是背景。 在图像处理和计算机视觉中,"前景"…

SpringCloudAlibaba系列之Nacos服务注册与发现

目录 说明 认识注册中心 Nacos架构图 Nacos服务注册与发现实现原理总览 SpringCloud服务注册规范 服务注册 心跳机制与健康检查 服务发现 主流服务注册中心对比 小小收获 说明 本篇文章主要目的是从头到尾比较粗粒度的分析Nacos作为注册中心的一些实现&#xff0c;很…

AcWing 3. 完全背包问题 学习笔记

有 N&#xfffd; 种物品和一个容量是 V&#xfffd; 的背包&#xff0c;每种物品都有无限件可用。 第 i&#xfffd; 种物品的体积是 vi&#xfffd;&#xfffd;&#xff0c;价值是 wi&#xfffd;&#xfffd;。 求解将哪些物品装入背包&#xff0c;可使这些物品的总体积不…

Elasticsearch中的语义检索

一、传统检索的背景痛点 和传统的基于关键词的匹配方式不同&#xff0c;语义检索&#xff0c;利用大模型&#xff0c;将文本内容映射到神经网络空间&#xff0c;最终记忆token做检索。 例如想要搜索中国首都&#xff0c;例如数据集中&#xff0c;只有一篇文章在描述北京&#x…

Zabbix实现故障自愈

一、简介 Zabbix agent 可以运行被动检查和主动检查。 在被动检查模式中 agent 应答数据请求。Zabbix server&#xff08;或 proxy&#xff09;询求数据&#xff0c;例如 CPU load&#xff0c;然后 Zabbix agent 返还结果。 主动检查处理过程将相对复杂。Agent 必须首先从 Z…

优卡特脸爱云一脸通智慧管理平台权限绕过漏洞复现(CVE-2023-6099)

0x01 产品简介 脸爱云一脸通智慧管理平台是一套功能强大&#xff0c;运行稳定&#xff0c;操作简单方便&#xff0c;用户界面美观&#xff0c;轻松统计数据的一脸通系统。无需安装&#xff0c;只需在后台配置即可在浏览器登录。 功能包括&#xff1a;系统管理中心、人员信息管理…

[qemu逃逸] XNUCA2019-vexx

前言 这题没有去符合, 题目本身不算难. 用户名: root 密码: goodluck 设备逆向 题目没有去符合, 所以其实没啥好讲了, 就列一些笔者认为关键的地方 这里的定义了两块 mmio 内存区. 然后看下设备实例结构体: 可以看到 QEMUTimer, 所以多半就是劫持 dma_timer 了. 漏洞点在…