Java集成支付宝沙箱支付,详细教程(SpringBoot完整版)

news2024/12/23 1:10:06

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 一、开发前准备?
  • 二、使用步骤
    • 1、引入库
    • 2、配置在 application.yml 里面进行配置:
    • 3、alipay的java配置:AplipayConfig.java
    • 4、支付接口
    • 4、回调接口


一、开发前准备?

easy支付官方文档:https://opendocs.alipay.com/open/009ys9

通用版文档:https://opendocs.alipay.com/open/02np94

支付宝沙箱的配置:
注册支付宝开发者账户,进入开发者控制台

沙箱快捷入口:
https://open.alipay.com/develop/sandbox/app

在这里插入图片描述
沙箱的界面:

在这里插入图片描述

二、使用步骤

1、引入库

<dependency>
    <groupId>com.alipay.sdk</groupId>
    <artifactId>alipay-easysdk</artifactId>
    <version>2.2.2</version>
</dependency>

2、配置在 application.yml 里面进行配置:

#阿里沙箱支付配置
alipay:
  #签名算法
  signType: 
  #应用ID
  appId: 
  #应用私钥
  appPrivateKey:
  #支付宝公钥
  publicKey: 
  #回调地址
  notifyUrl: 

3、alipay的java配置:AplipayConfig.java

/**
 * @author :Mr.ZJW
 * @date :Created 2023/9/20 17:40
 * @description:alipay沙箱环境配置
 */
@Slf4j
@Data
@Component
@ConfigurationProperties(prefix = "alipay")
public class AlipayConfig {

    /**
     * appId
     */
    private String appId;

    /**
     * 私钥
     */
    private String appPrivateKey;

    /**
     * 公钥
     */
    private String publicKey;

    /**
     * 回调地址
     */
    private String notifyUrl;

    /**
     * 支付宝配置初始化,公钥模式
     */
    @PostConstruct
    public void init() {
        Config config = new Config();
        //#基础配置
        config.protocol = "https";  //协议
        config.gatewayHost = "openapi.alipaydev.com";    //支付宝网关
        config.signType = "RSA2";   //签名方式
        //#业务配置
        config.appId = this.appId;  //应用id
        config.merchantPrivateKey = this.appPrivateKey;    应用私钥
        config.alipayPublicKey = this.publicKey;    //支付宝公钥
        config.notifyUrl = this.notifyUrl;  //回调地址
        Factory.setOptions(config);
        log.info("支付宝配置初始化完成");
    }

}

4、支付接口

import com.alipay.easysdk.factory.Factory;
import com.alipay.easysdk.payment.page.models.AlipayTradePagePayResponse;
import com.google.common.collect.Maps;
import com.jowell.common.exception.base.BaseException;
import com.jowell.common.response.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletRequest;
import java.util.Map;

/**
 * @author :Mr.ZJW
 * @date :Created 2023/9/20 17:53
 * @description:支付controller
 */
@Slf4j
@RequestMapping("/alipay")
@Controller
@ResponseBody
public class TestAlipayController {

    /**
     * 支付接口
     *
     * @param subject     名称
     * @param outTradeNo  订单号
     * @param totalAmount 金额
     * @return /
     */
    @GetMapping("/pay")
    public String pay(String subject, String outTradeNo, String totalAmount) {
        AlipayTradePagePayResponse response;
        try {
            response = Factory.Payment.Page().pay(subject, outTradeNo, totalAmount, "");
        } catch (Exception e) {
            log.error("支付宝付款调用失败,原因:" + e.getMessage());
            throw new BaseException("网络异常,请刷新后重试");
        }
        return response.getBody();
    }

接口测试:
访问URL进行测试,测试的url格式:http://localhost:10000/alipay/pay?subject=支付测试&outTradeNo=D239211000000&totalAmount=1

效果:
在这里插入图片描述
进行用买家账号密码登录:
在这里插入图片描述
输入支付密码进行支付:
在这里插入图片描述

支付成功:
在这里插入图片描述

4、回调接口

回调接口要有一个外网域名,这里可以使用花生壳以及我分享过的一遍文章:
文章链接:https://blog.csdn.net/javaeEEse/article/details/117983797?spm=1001.2014.3001.5502

在这里插入图片描述
把这个域名复制到配置文件里的回调地址上。

回调完整代码:

    /**
     * 支付宝回调
     */
    @PostMapping("/notify")
    public Result<String> notify(HttpServletRequest request) {
        log.info("支付宝回调成功");
        //校验是否成功
        if ("TRADE_SUCCESS".equals(request.getParameter("trade_status"))) {
            //#解析回调数据
            Map<String, String> params = Maps.newHashMap();
            Map<String, String[]> requestParams = request.getParameterMap();
            for (String name : requestParams.keySet()) {
                params.put(name, request.getParameter(name));
            }
            //订单号
            String tradeNo = params.get("out_trade_no");
            //支付金额
            String gmtPayment = params.get("gmt_payment");
            //支付宝交易凭证号
            String alipayTradeNo = params.get("trade_no");
            //#支付宝验签,防止不法分子伪造请求
            try {
                Boolean flag = Factory.Payment.Common().verifyNotify(params);
                if (Boolean.TRUE.equals(flag)) {
                    log.info("交易名称: " + params.get("subject"));
                    log.info("交易状态: " + params.get("trade_status"));
                    log.info("支付宝交易凭证号: " + params.get("trade_no"));
                    log.info("商户订单号: " + params.get("out_trade_no"));
                    log.info("交易金额: " + params.get("total_amount"));
                    log.info("买家在支付宝唯一id: " + params.get("buyer_id"));
                    log.info("买家付款时间: " + params.get("gmt_payment"));
                    log.info("买家付款金额: " + params.get("buyer_pay_amount"));
                } else {
                    log.error("异步通知验签失败");
                    return Result.error("fail");
                }

            } catch (Exception e) {
                log.error("异步发生异常{}", e.getMessage());
                return Result.error("fail");
            }
            //#进行一些业务逻辑,如更新订单等操作
        }
        return Result.success();
    }

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

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

相关文章

不要再滥用可选链运算符(?.)啦!

可选链运算符(?.)&#xff0c;大家都很熟悉了&#xff0c;直接看个例子&#xff1a; const result obj?.a?.b?.c?.d 很简单例子&#xff0c;上面代码?前面的属性如果是空值&#xff08;null或undefined&#xff09;&#xff0c;则result值是undefined&#xff0c;反之…

企业架构LNMP学习笔记58

开始学习Tomcat&#xff1a; 学习目标和内容&#xff1a; 1&#xff09;能够描述Tomcat的使用场景&#xff1b; 2&#xff09;能够简单描述Tomcat的工作原理&#xff1b; 3&#xff09;能够实现部署安装Tomcat&#xff1b; 4&#xff09;能够实现和配置Tomcat的Server服务…

如何判断自己的服务器是不是中了勒索病毒,勒索病毒解密数据恢复

勒索病毒日益横行&#xff0c;给企业的生产经营和个人数据造成了极大的影响。但是对单一的企业和个人而言&#xff0c;遭受勒索病毒攻击毕竟是低频率事件&#xff0c;这也导致很多人中招之后&#xff0c;无法判断出具体的问题&#xff0c;进而没有及时采取应对措施&#xff0c;…

【谢希尔 计算机网络】第3章 数据链路层

数据链路层 数据链路层的地位 网络中的主机、路由器等都必须实现数据链路层局域网中的主机、交换机等都必须实现数据链路层不同链路层可能采用不同的数据链路层协议 数据链路层信道类型 点对点信道 使用一对一的点对点通信方式广播通信 必须使用专用的共享系电脑协议来协调这些…

【Java 基础篇】Java多线程实现文件上传详解

文件上传是Web应用程序中常见的功能之一&#xff0c;用户可以通过网页将文件从本地计算机上传到服务器。在处理大文件或多用户并发上传的情况下&#xff0c;为了提高性能和用户体验&#xff0c;常常使用多线程来实现文件上传功能。本文将详细介绍如何使用Java多线程实现文件上传…

【RabbitMQ实战】docker 安装RabbitMQ(bitnami)

一、搜索镜像 [rootlocalhost ~]# docker search rabbitmq NAME DESCRIPTION STARS OFFICIAL AUTOMATED rabbitmq RabbitMQ is an open source multi-pro…

携手走过四年,极智嘉(Geek+)赋能上海西门子开关智慧物流升级

日前&#xff0c;上海西门子开关有限公司迎来了工厂30周年庆典暨客户开放日活动&#xff0c;全球仓储机器人引领者极智嘉(Geek)荣幸作为优秀供应商代表受邀参会&#xff0c;见证其突破革新、数智飞跃的三十载辉煌历程。 客户开放日活动中&#xff0c;上海西门子开关有限公司开…

【SpringCloud】微服务技术栈入门2 - Nacos框架与Feign

目录 Nacos下载 Nacos 并运行配置 NacosNacos 集群Nacos 负载均衡Nacos 环境隔离Nacos 注册细节Nacos 更多配置项快速上手自动更新 Feign取代 RestTemplateFeign 自定义配置性能优化 Nacos 下载 Nacos 并运行 首先下载对应的 release 包&#xff0c;主要要选择已经打包编译好…

链表的回文判断

思路: 找中间节点–>逆置->比较 代码&#xff1a; /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/struct ListNode* middleNode(struct ListNode* head) { struct ListNode*slowhead; struct ListNode*f…

maven多模块依赖包程序包xxx不存在

背景 rpc-common 被 rpc-server、rpc-client依赖 项目地址 https://github.com/pjmike/springboot-rpc-demo mvn clean install 打包时报错 报错信息 程序包xxxx不存在 找不到符号 原因分析 原因还不清楚&#xff0c;网友们帮解答一下 解决 主pom.xml 添加 <packaging…

23个销量最高的3D扫描仪【2023】

如果你可以 3D 扫描它&#xff0c;你就可以 3D 打印它。 市场上 3D 扫描仪的种类和质量非常丰富&#xff0c;机器尺寸、功能和价格各异。 这样的选择虽然本身是一件很棒的事情&#xff0c;但也会让从无用的东西中挑选出宝石成为一件苦差事。 推荐&#xff1a;用 NSDT编辑器 快速…

如何在linux定时备份opengauss数据库(linux核心至少在GLIBC_2.34及以上)

前提环境&#xff0c;linux的核心至少在GLIBC_2.34及以上才能使用。 查看linux的glibc版本的命令如下 strings /lib64/libc.so.6 | grep GLIBC 如下图 或者用ldd --version 如下图 在官网下载对应的依赖包&#xff0c; 只需要这个lib文件即可&#xff0c;将这个包放在lin…

拓世法宝|短视频带货风潮,数字人教育书单号成销售黑马

Z世代的爸妈&#xff0c;正在搞一种很新的育儿方式。 “躺平式”带娃、“用魔法打败魔法”等新时代育儿方式频频登上热搜&#xff0c;作为与互联网共同成长起来的一代&#xff0c;Z世代父母们更热衷于通过网络攻略获得和分享知识和经验&#xff0c;更注重个性的养育方式&#…

ChatGPT所引用的参考文献根本不存在?如何正确使用AI工具?

从ChatGPT推出以来&#xff0c;一直都是一个热点话题&#xff0c;尤其是在高等教育领域&#xff0c;大家展开了非常激烈的讨论。 巴斯大学对ChatGPT进行测试时发现&#xff0c;ChatGPT生成的论文&#xff0c;其参考文献的引用格式看起来很完美&#xff0c;有作者姓名和期刊名称…

文件、预处理、位运算

10.2 数据文件概述 10.2.1 ASCII文件与二进制文件 ASCII文件就是“将需要保存到文件的信息使用ASCII字符表示&#xff0c;然后按照顺序将每个字符的ASCII码存储到文件中”。ASCII文件的优点是编码方式公开&#xff0c;可以被其它的文本编辑器打开&#xff1b;其缺点是效率比较…

第一章 计算机网络基础

目录 1.1 网络体系结构 1.1.1 OSI/RM七层参考模型 1.1.2 OSI/RM和TCP/IP模型的比较 1.1.3 五层协议的体系结构 1.1.4 计算机1向计算机2发送数据过程 1.1.5 TCP/IP体系结构的具体实现 1.2 网络设备概述 1.2.1 互联设备与OSI的对应关系 1.2.2 集线器(HUB) 1.2.3 网桥(B…

新势力在智能化路上,正抢了Tier 1的生意

作者 | Amy 编辑 | 德新 上半年的汽车行业价格内卷&#xff0c;下半年则一下资本涌入&#xff0c;风起云涌。 先是蔚来拿到了11亿美元来自中东的投资&#xff0c;紧接着7月大众以7亿美元投资小鹏汽车&#xff0c;8月哪吒完成70亿元Crossover轮投资。传闻中&#xff0c;还有大众…

GE IS220PAICH2A 336A4940CSP11 控制脉冲模块

GE IS220PAICH2A 336A4940CSP11控制脉冲模块是一种用于工业自动化和控制系统的模块&#xff0c;通常用于监测和生成脉冲信号&#xff0c;以控制各种设备和过程。以下是可能与该控制脉冲模块相关的一些产品功能&#xff1a; 脉冲生成&#xff1a;GE IS220PAICH2A 336A4940CSP11控…

JCEF中js与java交互、js与java相互调用

jcef中js与java相互调用&#xff0c;java与js相互调用&#xff0c;chrome与java相互调用&#xff0c;java与chrome相互调用、jcef与java相互调用 前提&#xff1a;https://blog.csdn.net/weixin_44480167/article/details/133170970&#xff08;java内嵌浏览器CEF-JAVA、jcef、…

天玑科技PBData信创数据库私有云平台荣获“专题展优秀成果奖”

9月15-16日&#xff0c;由湖南省人民政府、工业和信息化部联合主办的2023世界计算大会在湖南长沙盛大启幕。天玑科技作为云服务、信息技术应用创新领域优秀的解决方案提供商受邀参会参展。 大会以“计算万物 湘约未来——计算产业新变革”为主题&#xff0c;全国政协副主席、民…