基于 Spring Boot 支付宝沙箱支付(Java 版本)

这篇具有很好参考价值的文章主要介绍了基于 Spring Boot 支付宝沙箱支付(Java 版本)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

步骤

第一步:使用支付宝账户登录,打开控制台,进入沙箱环境

打开沙箱地址:https://open.alipay.com/develop/sandbox/app
基于 Spring Boot 支付宝沙箱支付(Java 版本),Java,java,spring boot,后端,支付宝沙箱
基于 Spring Boot 支付宝沙箱支付(Java 版本),Java,java,spring boot,后端,支付宝沙箱需要获取:AppId、支付宝网关地址、应用私钥、支付宝公钥

第二步:配置内网穿透账号

  1. 注册 https://natapp.cn/

  2. 购买免费隧道
    基于 Spring Boot 支付宝沙箱支付(Java 版本),Java,java,spring boot,后端,支付宝沙箱基于 Spring Boot 支付宝沙箱支付(Java 版本),Java,java,spring boot,后端,支付宝沙箱注意:需要记住这个 authtoken,配置文件用得到

  3. 配置隧道
    基于 Spring Boot 支付宝沙箱支付(Java 版本),Java,java,spring boot,后端,支付宝沙箱

  4. 文件 config 配置

#将本文件放置于natapp同级目录 程序将读取 [default] 段
#在命令行参数模式如 natapp -authtoken=xxx 等相同参数将会覆盖掉此配置
#命令行参数 -config= 可以指定任意config.ini文件
[default]
authtoken= 将隧道的authtoken填进去               #对应一条隧道的authtoken
clienttoken=                    #对应客户端的clienttoken,将会忽略authtoken,若无请留空,
log=none                        #log 日志文件,可指定本地文件, none=不做记录,stdout=直接屏幕输出 ,默认为none
loglevel=ERROR                  #日志等级 DEBUG, INFO, WARNING, ERROR 默认为 DEBUG
http_proxy=                     #代理设置 如 http://10.123.10.10:3128 非代理上网用户请务必留空
  1. 配置文件需要与 natapp 放在同级目录下
    基于 Spring Boot 支付宝沙箱支付(Java 版本),Java,java,spring boot,后端,支付宝沙箱
  2. 启动 natapp
    基于 Spring Boot 支付宝沙箱支付(Java 版本),Java,java,spring boot,后端,支付宝沙箱

为什么要使用 NATAPP?
因为要把本地的服务暴露到公网,让支付宝可以调用我们的接口给我们传递数据

第三步:引入支付宝 SDK

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

第四步: 配置 SpringBoot

alipay:
  appId: xxx
  #  应用私钥
  appPrivateKey: xxx
  # 支付宝公钥
  alipayPublicKey:xxx
  #  每次重启会变化
  notifyUrl: http://ju2jpk.natappfree.cc/api/notify
  #natapp 代 理 的 url +/alipay/notify,这个是用于启动支付宝回调函数 notify 的接口

应用私钥和支付宝公钥可以用默认的,也可以自己配置,若自己配置的话需要使用支付宝开放平台密钥工具
基于 Spring Boot 支付宝沙箱支付(Java 版本),Java,java,spring boot,后端,支付宝沙箱

第五步: AliPayConfig.java 读取配置

package com.projects.config;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
@ConfigurationProperties(prefix = "alipay") //读取配置文件中的alipay
public class AliPayConfig {

    private String appId; //支付宝APPID
    private String appPrivateKey; //应用私钥
    private String alipayPublicKey; //支付宝公钥
    private String notifyUrl; //支付宝通知本地接口完整地址

    public String getAppId() {
        return appId;
    }

    public void setAppId(String appId) {
        this.appId = appId;
    }

    public String getAppPrivateKey() {
        return appPrivateKey;
    }

    public void setAppPrivateKey(String appPrivateKey) {
        this.appPrivateKey = appPrivateKey;
    }

    public String getAlipayPublicKey() {
        return alipayPublicKey;
    }

    public void setAlipayPublicKey(String alipayPublicKey) {
        this.alipayPublicKey = alipayPublicKey;
    }

    public String getNotifyUrl() {
        return notifyUrl;
    }

    public void setNotifyUrl(String notifyUrl) {
        this.notifyUrl = notifyUrl;
    }

}

第六步: AliPayController

package com.example.controller;

import cn.hutool.json.JSONObject;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.internal.util.AlipaySignature;
import com.alipay.api.request.AlipayTradePagePayRequest;
import com.example.common.AliPayConfig;
import com.example.entity.Orders;
import com.example.service.OrdersService;
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.RestController;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.Map;

//  https://natapp.cn/
// ekihat7647@sandbox.com
@RestController
@RequestMapping("/alipay")
public class AliPayController {

    // 支付宝沙箱网关地址
    private static final String GATEWAY_URL = "https://openapi-sandbox.dl.alipaydev.com/gateway.do";
    private static final String FORMAT = "JSON";
    private static final String CHARSET = "UTF-8";
    //签名方式
    private static final String SIGN_TYPE = "RSA2";

    @Resource
    private AliPayConfig aliPayConfig;

    @Resource
    private OrdersService ordersService;

    @GetMapping("/pay")  //  /alipay/pay?orderNo=xxx
    public void pay(String orderNo, HttpServletResponse httpResponse) throws Exception {
        // 查询订单信息
        Orders orders = ordersService.selectByOrderNo(orderNo);
        if (orders == null) {
            return;
        }
        // 1. 创建Client,通用SDK提供的Client,负责调用支付宝的API
        AlipayClient alipayClient = new DefaultAlipayClient(GATEWAY_URL, aliPayConfig.getAppId(),
                aliPayConfig.getAppPrivateKey(), FORMAT, CHARSET, aliPayConfig.getAlipayPublicKey(), SIGN_TYPE);

        // 2. 创建 Request并设置Request参数
        AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();  // 发送请求的 Request类
        request.setNotifyUrl(aliPayConfig.getNotifyUrl());
        JSONObject bizContent = new JSONObject();
        bizContent.put("out_trade_no", orders.getOrderNo());  // 我们自己生成的订单编号
        bizContent.put("total_amount", orders.getTotal()); // 订单的总金额
        bizContent.put("subject", orders.getGoodsName());   // 支付的名称
        bizContent.put("product_code", "FAST_INSTANT_TRADE_PAY");  // 固定配置
        request.setBizContent(bizContent.toString());
        request.setReturnUrl("http://localhost:8080/orders"); // 支付完成后自动跳转到本地页面的路径
        // 执行请求,拿到响应的结果,返回给浏览器
        String form = "";
        try {
            form = alipayClient.pageExecute(request).getBody(); // 调用SDK生成表单
        } catch (AlipayApiException e) {
            e.printStackTrace();
        }
        httpResponse.setContentType("text/html;charset=" + CHARSET);
        httpResponse.getWriter().write(form);// 直接将完整的表单html输出到页面
        httpResponse.getWriter().flush();
        httpResponse.getWriter().close();
    }

    @PostMapping("/notify")  // 注意这里必须是POST接口
    public void payNotify(HttpServletRequest request) throws Exception {
        if (request.getParameter("trade_status").equals("TRADE_SUCCESS")) {
            System.out.println("=========支付宝异步回调========");

            Map<String, String> params = new HashMap<>();
            Map<String, String[]> requestParams = request.getParameterMap();
            for (String name : requestParams.keySet()) {
                params.put(name, request.getParameter(name));
            }

            String sign = params.get("sign");
            String content = AlipaySignature.getSignCheckContentV1(params);
            boolean checkSignature = AlipaySignature.rsa256CheckContent(content, sign, aliPayConfig.getAlipayPublicKey(), "UTF-8"); // 验证签名
            // 支付宝验签
            if (checkSignature) {
                // 验签通过
                System.out.println("交易名称: " + params.get("subject"));
                System.out.println("交易状态: " + params.get("trade_status"));
                System.out.println("支付宝交易凭证号: " + params.get("trade_no"));
                System.out.println("商户订单号: " + params.get("out_trade_no"));
                System.out.println("交易金额: " + params.get("total_amount"));
                System.out.println("买家在支付宝唯一id: " + params.get("buyer_id"));
                System.out.println("买家付款时间: " + params.get("gmt_payment"));
                System.out.println("买家付款金额: " + params.get("buyer_pay_amount"));


                String tradeNo = params.get("out_trade_no");
                String gmtPayment = params.get("gmt_payment");
                String alipayTradeNo = params.get("trade_no");
                // 更新订单状态为已支付,设置支付信息
                Orders orders = ordersService.selectByOrderNo(tradeNo);
                orders.setStatus("已支付");
                orders.setPayTime(gmtPayment);
                orders.setPayNo(alipayTradeNo);
                ordersService.updateById(orders);
            }
        }
    }

}

基于 Spring Boot 支付宝沙箱支付(Java 版本),Java,java,spring boot,后端,支付宝沙箱基于 Spring Boot 支付宝沙箱支付(Java 版本),Java,java,spring boot,后端,支付宝沙箱
基于 Spring Boot 支付宝沙箱支付(Java 版本),Java,java,spring boot,后端,支付宝沙箱
基于 Spring Boot 支付宝沙箱支付(Java 版本),Java,java,spring boot,后端,支付宝沙箱
基于 Spring Boot 支付宝沙箱支付(Java 版本),Java,java,spring boot,后端,支付宝沙箱文章来源地址https://www.toymoban.com/news/detail-818273.html

到了这里,关于基于 Spring Boot 支付宝沙箱支付(Java 版本)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java版本spring cloud + spring boot企业电子招投标系统源代码

     招投标管理系统是一个集门户管理、立项管理、采购项目管理、采购公告管理、考核管理、报表管理、评审管理、企业管理、采购管理和系统管理于一体的综合性应用平台。它适用于招标代理、政府采购、企业采购和工程交易等业务的企业,旨在提高项目管理的效率和质量

    2024年02月02日
    浏览(73)
  • java版本企业电子招标采购系统源码Spring Cloud + Spring Boot +二次开发

      java版本企业电子招标采购系统源码Spring Cloud + Spring Boot +二次开发   一、立项管理 1、招标立项申请 功能点:招标类项目立项申请入口,用户可以保存为草稿,提交。 2、非招标立项申请 功能点:非招标立项申请入口、用户可以保存为草稿、提交。 3、采购立项列表 功能点

    2024年02月06日
    浏览(38)
  • Spring Boot 3 大版本齐发,Java 8 版本马上要退出历史舞台了!

    Spring Boot 太狠了,今天一次性发布了三个主要版本,三条版本线同时更新: Spring Boot 3.1.3 Spring Boot 3.0.10 Spring Boot 2.7.15 三条线主要都是 bug 修复、性能增强、文档改进和依赖升级。 这三个版本主要有什么区别呢? Spring Boot 3.1.x 和 3.0.x 区别不大,但 2.7.x 和 3.x 对环境的影响还

    2024年02月11日
    浏览(29)
  • idea创建spring boot项目,java版本只能选择17和21

    java版本为\\\"11.0.20\\\",idea2023创建spring boot项目时(File-Project-Spring Initializr),java版本无法选择11,导致报错,如下图所示: spring2.X版本在2023年11月24日停止维护了,因此创建spring项目时不再有2.X版本的选项,只能从3.1.X版本开始选择 而Spring3.X版本不支持JDK8,JDK11,最低支持JDK1

    2024年02月05日
    浏览(47)
  • 基于Java (spring-boot)的图书管理系统

    一、项目介绍 该图书管理系统提供了一系列功能,包括图书管理、图书类型管理、读者借阅归还图书、用户管理和重置密码等。 在图书管理功能中,管理员可以方便地进行图书信息的管理。他们可以添加新的图书记录,包括书名、作者、出版社、ISBN等信息,并可以对已有的

    2024年02月04日
    浏览(35)
  • java基于Spring Boot的灾害应急救援评估调度平台

    灾害应急救援平台的目的是让使用者可以更方便的将人、设备和场景更立体的连接在一起。能让用户以更科幻的方式使用产品,体验高科技时代带给人们的方便,同时也能让用户体会到与以往常规产品不同的体验风格。(1)鉴于该系统是一款面向全体使用者的系统,管理者需

    2024年01月16日
    浏览(35)
  • 如何通过IDEA创建基于Java8的Spring Boot项目

    上次发现我的 IDEA 创建 Spring Boot 项目时只支持 11 和 17 的 JDK 版本,于是就通过Maven搭建SpringBoot项目。 究其原因,原来是Spring官方抛弃了Java8!!! 使用IDEA内置的Spring Initializr创建SpringBoot项目时,已经没有了Java8的选项,只支持 = 17的版本: 网上逛了一圈,原来是Spring Boot官

    2024年01月19日
    浏览(42)
  • java+vue基于Spring Boot的渔船出海及海货统计系统

    该渔船出海及海货统计系统采用B/S架构、前后端分离进行设计,并采用java语言以及springboot框架进行开发。该系统主要设计并完成了管理过程中的用户注册登录、个人信息修改、用户信息、渔船信息、渔船航班、海货价格、渔船海货、非法举报、渔船黑名单等功能。该系统操

    2024年01月16日
    浏览(30)
  • 基于Java+spring boot的旅游景区小程序的设计与实现

    👇其他专栏推荐👇: 计算机毕业设计100套 微信小程序项目实战 java项目实战 🥰需要源码可以滴滴我🥰 目录 摘要 1 绪论 1.1 国内外研究现状 1.2 研究意义 2 开发技术介绍 2.1 Java语言 2.2 spring boot框架 2.3 微信小程序 3 系统分析 3.1 可行性分析 3.1.1 经济可行性 3.1.2 技术可行性

    2024年02月04日
    浏览(29)
  • Spring Boot各版本与Java版本的对应兼容关系,与构建工具(Maven、Gradle)版本的对应兼容关系,对servlet 容器的支持

    by:垃圾程序员 当前文章具有时效性,在当前springboot的版本下做的整合。之后大家视情况可以直接到Spring的官网查看 Spring | Home Level up your Java code and explore what Spring can do for you. https://spring.io/ 下面是Spring Boot各个版本的支持时间 下面是Spring Boot 推荐使用的各个版面,并标注出

    2024年02月10日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包