Spring MVC+Spring+MyBatis实现支付宝扫码支付功能(图文详解)

Java集成支付宝支付功能的全流程教程 本文还有配套的精品资源,点击获取 简介:在Java开发中集成支付宝支付接口是实现在线支付的重要环节。本案例详细介绍了如何使用支付宝的沙箱环境进行开发和测试,注册成为开发者并创建应用以获取密钥,利用数据库脚本创建必要的数据表,理解API文档,并以SSM框架为例进行支付接口的集成。案例强调了签名机制的重要性,并涉及RSA算法的应用。通过本案例学习,开发者将能够掌握在Java项目... 阅读详情

作者 | 欧阳思海

链接 | blog.youkuaiyun.com/sihai12345

前言

本教程详细介绍了如何使用 SSM 框架实现支付宝支付功能。本文章分为两大部分,分别是「支付宝测试环境代码测试」和「将支付宝支付整合到 SSM 框架」,详细的代码和图文解释,自己实践的时候一定仔细阅读相关文档,话不多说我们开始。

支付宝测试环境代码测试

1.下载电脑网站的官方demo:

下载:https://docs.open.alipay.com/270/106291/

2.下载解压导入eclipse

readme.txt请好好看一下。

只有一个Java配置类,其余都是JSP。

3.配置AlipayConfig

(1) 注册蚂蚁金服开发者账号(免费,不像苹果会收取费用)

注册地址:https://open.alipay.com ,用你的支付宝账号扫码登录,完善个人信息,选择服务类型(我选的是自研)。

(2) 设置app_id和gatewayUrl

其中密钥需要自己生成,appID和支付宝网关是已经给好的,网关有dev字样,表明是用于开发测试。

(3) 设置密钥

点击“生成方法”,打开界面如下:

下周密钥生成工具,解压打开后,选择2048位生成密钥:

如果没有设置过,此时显示文本是"设置应用公钥",我这里是已经设置过得。

设置方法,"打开密钥文件路径":

复制应用公钥2048.txt中的内容到点击"设置应用公钥"的弹出框中,保存:

  • 商户私钥(merchant_private_key)

    复制 应用私钥2048.txt 中的内容到merchant_private_key中。

  • 支付宝公钥(alipay_public_key)

点击如上图链接,复制弹出框里面的内容到alipay_public_key。

如果这个设置不对,结果是:支付成功,但是验签失败。

如果是正式环境,需要上传到对应的应用中:

(4) 服务器异步通知页面路径(notify_url)

如果没有改名,修改IP和端口号就可以了,我自己的如下:

http://localhost:8080/alipay.trade.page.pay-JAVA-UTF-8/notify_url.jsp

(5) 页面跳转同步通知页面的路径(return_url)

http://localhost:8080/alipay.trade.page.pay-JAVA-UTF-8/return_url.jsp
4.测试运行

测试用的支付宝买家账户可以在"沙箱账"这个页面可以找到:

支付成功后,验签结果:

问题解决

由于我们使用的是沙箱测试环境,测试环境和正式上线的环境的网关是不一样的,如果配置错误,会出现,appid错误的问题。配置如下:

将支付宝支付整合到ssm框架

1、项目架构

  • 项目架构:spring+springmvc+mybatis

  • 数据库:mysql

  • 部署环境:tomcat9.0

  • 开发环境:jdk9、idea

  • 支付:支付宝、微信

整合到ssm一样,我们需要像沙箱测试环境一样,需要修改支付的配置信息

2、数据库代码

主要包括以下的数据库表:

  • user:用户表

  • order:支付产生的订单

  • flow:流水账

  • product:商品表:用于模拟购买商品。

drop table if exists user;

/*==============================================================*/
/* Table: user */
/*==============================================================*/
create table user
(
   id                   varchar(20) not null,
   username varchar(128),
   sex varchar(20),
   primary key (id)
);

alter table user comment '用户表';


CREATE TABLE `flow` (
  `id` varchar(20) NOT NULL,
  `flow_num` varchar(20) DEFAULT NULL COMMENT '流水号',
  `order_num` varchar(20) DEFAULT NULL COMMENT '订单号',
  `product_id` varchar(20) DEFAULT NULL COMMENT '产品主键ID',
  `paid_amount` varchar(11) DEFAULT NULL COMMENT '支付金额',
  `paid_method` int(11) DEFAULT NULL COMMENT '支付方式\r\n 1:支付宝\r\n 2:微信',
  `buy_counts` int(11) DEFAULT NULL COMMENT '购买个数',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='流水表';


CREATE TABLE `orders` (
  `id` varchar(20) NOT NULL,
  `order_num` varchar(20) DEFAULT NULL COMMENT '订单号',
  `order_status` varchar(20) DEFAULT NULL COMMENT '订单状态\r\n 10:待付款\r\n 20:已付款',
  `order_amount` varchar(11) DEFAULT NULL COMMENT '订单金额',
  `paid_amount` varchar(11) DEFAULT NULL COMMENT '实际支付金额',
  `product_id` varchar(20) DEFAULT NULL COMMENT '产品表外键ID',
  `buy_counts` int(11) DEFAULT NULL COMMENT '产品购买的个数',
  `create_time` datetime DEFAULT NULL COMMENT '订单创建时间',
  `paid_time` datetime DEFAULT NULL COMMENT '支付时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单表';


CREATE TABLE `product` (
  `id` varchar(20) NOT NULL,
  `name` varchar(20) DEFAULT NULL COMMENT '产品名称',
  `price` varchar(11) DEFAULT NULL COMMENT '价格',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='产品表 ';

3、dao数据接口层

这里就不介绍了,这个只包括简单的curd,可以使用`通用mapper`,或者`逆向工程`就行。以订单order为例给出:

public interface OrdersMapper {
    int countByExample(OrdersExample example);

    int deleteByExample(OrdersExample example);

    int deleteByPrimaryKey(String id);

    int insert(Orders record);

    int insertSelective(Orders record);

    List<Orders> selectByExample(OrdersExample example);

    Orders selectByPrimaryKey(String id);

    int updateByExampleSelective(@Param("record") Orders record, @Param("example") OrdersExample example);

    int updateByExample(@Param("record") Orders record, @Param("example") OrdersExample example);

    int updateByPrimaryKeySelective(Orders record);

    int updateByPrimaryKey(Orders record);
}

4、service层

同上,最后在项目源代码里可见。以订单order为例给出:

/**
 * 订单操作 service
 * @author ibm
 *
 */
public interface OrdersService {

    /**
     * 新增订单
     * @param order
     */
    public void saveOrder(Orders order);

    /**
     *
     * @Title: OrdersService.java
     * @Package com.sihai.service
     * @Description: 修改叮当状态,改为 支付成功,已付款; 同时新增支付流水
     * Copyright: Copyright (c) 2017
     * Company:FURUIBOKE.SCIENCE.AND.TECHNOLOGY
     *
     * @author sihai
     * @date 2017年8月23日 下午9:04:35
     * @version V1.0
     */
    public void updateOrderStatus(String orderId, String alpayFlowNum, String paidAmount);

    /**
     * 获取订单
     * @param orderId
     * @return
     */
    public Orders getOrderById(String orderId);

}
4、支付宝支付controller(支付流程)

支付流程图

首先,启动项目后,输入http://localhost:8080/,会进入到商品页面,如下:

下面是页面代码

商品页面(products.jsp)

代码实现:

<html>
    <body>
        <table>
            <tr>
                <td>产品编号</td>
                <td>产品名称</td>
                <td>产品价格</td>
                <td> 操作</td>
            </tr>
            <c:forEach items="${pList }" var="p">
                <tr>
                    <td>${p.id }</td>
                    <td>${p.name }</td>
                    <td>${p.price } </td>
                    <td>
                        <a href="<%=request.getContextPath() %>/alipay/goConfirm.action?productId=${p.id }">购买</a>
                    </td>
                </tr>
            </c:forEach>
        </table>
        <input type="hidden" id="hdnContextPath" name="hdnContextPath" value="<%=request.getContextPath() %>"/>
    </body>

</html>

<script type="text/javascript">

    $(document).ready(function() {
        var hdnContextPath = $("#hdnContextPath").val();
    });

</script>

点击上面的购买,进入到订单页面

填写个数,然后点击生成订单,调用如下代码

根据SID(生成id的工具)等信息生成订单,保存到数据库。

进入到选择支付页面

调用了如下代码:

然后,我们选择支付宝支付,进入到了我们支付的页面了,大功告成!

调用了如下代码:

@RequestMapping(value = "/goAlipay", produces = "text/html; charset=UTF-8")
    @ResponseBody
    public String goAlipay(String orderId, HttpServletRequest request, HttpServletRequest response) throws Exception {

        Orders order = orderService.getOrderById(orderId);

        Product product = productService.getProductById(order.getProductId());

        //获得初始化的AlipayClient
        AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl, AlipayConfig.app_id, AlipayConfig.merchant_private_key, "json", AlipayConfig.charset, AlipayConfig.alipay_public_key, AlipayConfig.sign_type);

        //设置请求参数
        AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
        alipayRequest.setReturnUrl(AlipayConfig.return_url);
        alipayRequest.setNotifyUrl(AlipayConfig.notify_url);

        //商户订单号,商户网站订单系统中唯一订单号,必填
        String out_trade_no = orderId;
        //付款金额,必填
        String total_amount = order.getOrderAmount();
        //订单名称,必填
        String subject = product.getName();
        //商品描述,可空
        String body = "用户订购商品个数:" + order.getBuyCounts();

        // 该笔订单允许的最晚付款时间,逾期将关闭交易。取值范围:1m~15d。m-分钟,h-小时,d-天,1c-当天(1c-当天的情况下,无论交易何时创建,都在0点关闭)。该参数数值不接受小数点, 如 1.5h,可转换为 90m。
        String timeout_express = "1c";

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

        //请求
        String result = alipayClient.pageExecute(alipayRequest).getBody();

        return result;
    }

这段代码都可以在阿里支付的demo里面找到的,只需要复制过来,然后改改,整合到ssm环境即可。

上面就是将阿里支付宝支付整合到ssm的全过程了。本文参考了博主「小溪_宁静而致远」的支付教程文章,欢迎搜索博主关注。

(完)

【推荐阅读】

高并发场景下限流,常见的限流算法、方案解析!

一套基础自动化部署搭建过程

一份完整的阿里云 Redis 开发规范,值得收藏!



好文!必须点赞
Java 集成支付宝扫码支付:class 文件反编译、沙箱联调与避坑指南 在支付系统开发中,扫码支付是最常见的线上收款方式之一,其背后依赖支付宝开放平台提供的当面付接口,通过预下单、异步通知与主动查询完成交易闭环。对于刚接触 Java 支付接入的后端工程师而言,理解交易状态机、密钥体系与回调验签是落地的关键。当项目以编译后的 class 文件形式交付时,借助 CFR 等反编译工具可还原业务逻辑,再结合沙箱环境完成联调,便能从二维码生成到支付结果通知全链路走通。本文从当面付接口原理出发,讲解 alipay.trade.precreate 预下单流程、RSA2 签名配置、异步通知幂等 阅读详情

相关推荐

Spring Boot校园二手交易平台源码解析与实战部署

校园二手交易平台是典型的轻量级Java Web应用,其核心在于基于Spring Boot的分层架构设计、MySQL数据一致性保障及Thymeleaf服务端渲染的工程落地。理解事务边界划分、状态机驱动的订单流程、连接池与缓存的生产级配置,是掌握电商类系统开发的关键能力。该类平台广泛应用于高校课程设计、学生创业MVP及Java后端入门实践,尤其适配JDK 11+、MySQL 8.0与CentOS 7等校园常见基础设施环境。本文以真实可部署的Spring Boot校园二手交易平台源码为载体,深入剖析从商品发布、订

weixin_30875157的博客 384

支付宝支付功能实现原理,微信公众号中实现支付宝支付功能开发流程

这篇文章使用一些简单的代码例子来解释微信接入支付宝支付功能的操作步骤,即使新手也可以轻松参透的。 第三方支付是指具备一定实力和信誉保障的独立机构,采用与各大银行签约的方式,通过与银行支付结算系统接口对接而促成交易双方进行交易的网络支付模式。 使用第三方支付,我们只要申请一个帐号平台即可以支持所以银行卡信用卡支付功能,具体支付功能由第三方支付平台来完成。本文所要介绍的是支付宝手机网站支付功能,而...

青崖梦 3万+

SSM实现支付宝支付功能

使用ssm框架实现支付宝支付功能。「支付宝测试环境代码测试」和「将支付宝支付整合到ssm框架」,详细的源代码和sql文件都有

SSM整合支付宝支付功能

本博客详细介绍了如何使用ssm框架实现支付宝支付功能。本文章分为两大部分,分别是「支付宝测试环境代码测试」和「将支付宝支付整合到ssm框架」,详细的代码和图文解释,自己实践的时候一定仔细阅读相关文档。 这篇博文主要参考Java团长的博文:https://mp.weixin.qq.com/s/J4kFOEAeTShcX3ruLoT3Tg 教程源代码:https://github.com/OUYA...

张维鹏的博客 8138

结合ssm框架支持支付宝付款.rar

结合ssm框架支持支付宝付款.rar

Spring Cloud(支付+订单)项目工程

Spring Cloud(支付+订单)项目工程 完整项目 intellij IDEA直接导入即可 依赖完整

基于jsp+mysql+Spring+SpringMVC+mybatis的校园超市网站系统

本网站主要是针对高校学生以超市购物为重点开发的网站。系统从用户上分为三种:卖家、买家和游客。系统从模块分为买家模块和卖家模块,买家模块包括用户注册登录、商品浏览、商品详情、商品加入购物车、购物车中商品删除、购物车商品数量变更、填写收货地址、生成订单、确认订单、查看我的订单、查看订单详情等;卖家模块包括管理员登录、商品的发布、商品管理、订单管理、查看订单详情等。 本系统设计是基于O2O超市的系统,主要用户针对的是高校学生,他们可以根据自己的需求浏览喜欢及所需购买的物品,但是若需购买,则必须注册,注册成为本系统

q_q1262330535的博客 284

java实现在SSM下使用支付宝扫码支付功能

主要为大家详细介绍了java实现在SSM下使用支付宝扫码支付功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

Redis+Nginx+设计模式+Spring全家桶+SQL+Dubbo技术好文精选整理

Spring Boot+Mybatis+Swagger2 环境搭建。Spring Boot + MyBatis + Druid + PageHelper 实现多数据源并分页。Spring Boot + MyBatis + Druid + PageHelper 实现多数据源并分页。Spring MVC+Spring+MyBatis实现支付宝扫码支付功能(图文详解)Spring Boot + Redis + 注解 + 拦截器来实现接口幂等性校验。Spring Boot + MyBatis 多模块项目搭建教程。

2401_84009626的博客 984

SAP财务凭证实战:如何用Coding Block快速添加客户化字段(附ABAP代码)

本文详细介绍了在SAP财务凭证中利用Coding Block技术快速添加客户化字段的完整流程,包括技术架构解析、实战配置步骤(OBC4/OB41)及ABAP增强开发。通过案例演示如何高效扩展字段(如增长曲线类型),实现全流程集成且无需修改数据表,显著提升财务凭证的灵活性和可追溯性。

weixin_29271263的博客 228

QT+QGIS跨平台编译(基于Qt,采用一套代码、一套框架,完成QGIS第三方库、核心库、应用程序的跨平台编译)

QT+QGIS跨平台编译。 基于Qt,采用一套代码、一套框架,完成QGIS第三方库、核心库、应用程序的跨平台编译。

LuckyHanMo的博客 4380

阿里P8架构师复盘2024最全实战文档:Spring家桶+Mysql+Redis+MyBatis+设计模式

关于分布式,限流+缓存+缓存,这三大技术(包含:ZooKeeper+Nginx+MongoDB+memcached+Redis+ActiveMQ+Kafka+RabbitMQ)等等。这些相关的面试也好,还有手写以及学习的笔记PDF,都是啃透分布式技术必不可少的宝藏。以上的每一个专题每一个小分类都有相关的介绍,并且小编也已经将其整理成PDF啦。

2301_82242988的博客 925

AI智能体丨使用Coze一键生成爆款书单视频,3个月内获赞131.1w!(附保姆级教程)

这篇教程详细介绍了如何使用扣子(Coze)平台的AI智能工作流批量制作爆款书单视频。通过自动化流程,只需1-2分钟即可生成45-50秒的书单视频,效率提升近百倍。工作流包含文案生成、音频合成、图片素材获取、视频剪辑等全流程,支持随机生成8本书单、自动提取金句、智能配音等功能。教程提供了完整的操作步骤,包括剪映草稿配置、特效添加等细节,并附体验链接和示例效果。最终生成的视频包含书单展示、金句字幕、背景音乐等元素,适合书单号运营者快速批量产出内容。

李同学Lino的博客 2355

wx

SSM、SpringBoot 69 个经典 Spring 面试题和答案 SpringCloud微服务框架搭建 springboot注解整理 谈谈我对Spring IOC的理解 Spring - AOP简单理解及术语解释 关于Spring 和 Spring MVC的43个问题【问题汇总】 SpringMVC工作原理 springboot的启动原理解析(让你彻底搞明白) 带...

han1396735592的博客 302

【nerfStudio】1-在windows上安装nerfStudio

安装Git。安装Visual Studio 2022。在安装CUDA之前必须完成此步骤。必须在“桌面开发与C++”工作流程(在BuildTools版本中称为“C++构建工具”)中包含所需的组件。Nerfstudio要求。我们建议使用conda来管理依赖关系。在继续之前,请确保安装了Conda。 依赖关系 PyTorch 请注意,如果安装了低于2.0.1的PyTorch版本,则应卸载先前版本的pytorch、functorch和tiny-cuda-nn。 基于CUDA 11.8的Torch 2.0.1 安装基

dlhlSC的博客 1693

解锁轻量化网络实验室:在 Containerlab 中部署 Cisco IOL 设备的详细教程

Cisco IOS On Linux(IOL)是 Cisco IOS-XE 的简化版,它是 Cisco IOS 的一种轻量级实现。IOL 并不需要完整的虚拟机(Virtual Machine, VM)环境,可以直接在 Linux 上运行,极大地减少了对系统资源的需求。IOL 节点通过更精简的方式提供了 Cisco IOS 功能,适合构建实验室、测试网络协议和验证网络设计。

网络技术联盟站 476

基于Java SSM框架的校园卡管理系统设计与实现

校园卡管理系统是高校信息化建设中的关键基础设施,通过数字化手段整合消费、认证、门禁等核心功能。采用Java SSM(Spring+SpringMVC+MyBatis)框架组合构建系统架构,Spring的IoC容器实现组件管理,MyBatis处理数据持久化,配合Vue.js前端框架形成完整解决方案。在金融级系统开发中,事务管理(@Transactional)确保数据一致性,Redis缓存提升查询性能,JWT实现安全认证。这类系统典型应用于校园一卡通、企业门禁管理等场景,本系统创新性地实现了全流程线上化管理,支

weixin_29305313的博客 215

DeepSeek Harness“一切皆插件”核心机制详解

DeepSeek Harness 的“一切皆插件”核心 = Cordis 微内核 + 服务化能力接口 + 声明式依赖注入 + 类型化事件 + 可逆副作用 + 配置层 Profile/Bundle/Patch 组合。它的工程收益是:把模型、工具、循环、存储、UI 等所有 Agent 能力都变成“可从配置替换、可干净装卸”的单元,而不是写死在框架里。

软件行业技术文化交流。 603
上一篇: 手把手带你用数据库中间件Mycat+SpringBoot完成分库分表
下一篇: 从 0 开始手写一个 Mybatis 框架,三步搞定!
Java思维导图
博客等级 码龄10年 306粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值